diff --git a/.bowerrc b/.bowerrc new file mode 100644 index 0000000..49c0fc0 --- /dev/null +++ b/.bowerrc @@ -0,0 +1,4 @@ +{ + "directory": "vendor", + "strict-ssl": true +} diff --git a/.gitignore b/.gitignore new file mode 100644 index 0000000..906cfa1 --- /dev/null +++ b/.gitignore @@ -0,0 +1,4 @@ +node_modules +vendor +build +dist diff --git a/Gruntfile.js b/Gruntfile.js old mode 100755 new mode 100644 index c9133f4..307368b --- a/Gruntfile.js +++ b/Gruntfile.js @@ -1,64 +1,37 @@ /* global -_ */ /* jshint node: true, camelcase: false */ -var _ = require("lodash"), -util = require("util"); -var appVersion = '2.0.5'; +var _ = require('lodash'); +var util = require('util'); +var appVersion = '3.1.7'; var apiVersion = '1'; +var dateVersion = new Date().toDateString(); var clientID = 'Angular'; var clientSecret = '00a11965ac0b47782ec7359c5af4dd79'; -var BROWSERS = ["PhantomJS", "Chrome", "Firefox", "Safari"]; +var BROWSERS = ['PhantomJS', 'Chrome', 'Firefox', 'Safari']; var API_TARGETS = { - prod: "https://dev.protonmail.ch/api", - dev: "https://test-api.protonmail.ch", - build: "/api" + blue: 'https://52.36.229.13/api', + prod: 'https://mail.protonmail.com/api', + dev: 'https://dev.protonmail.com/api', + v2: 'https://v2.protonmail.com/api', + build: '/api' }; module.exports = function(grunt) { - grunt.loadTasks("tasks"); - require("load-grunt-tasks")(grunt); - - // Extract API URL from command-line options. - // - // Each target in API_TARGETS can be enabled by passing the target name as a - // command-line option ('--staging'). - // - // '?'s in a target's hostname are replaced with the command-line option's - // value. For example, '--target=google.com' results in an API URL of - // 'google.com'. - // - // Specifying multiple target command-line options results in undefined - // behavior. + var serveStatic = require('serve-static'); + + grunt.loadTasks('tasks'); + require('load-grunt-tasks')(grunt); + function apiUrl() { - return _(API_TARGETS) - .pick(function(host, target) { - return grunt.option(target); - }) - .map(function(host, target) { - return host.replace("?", grunt.option(target)); - }) - .first() || API_TARGETS.dev; - } + var api = API_TARGETS.build; + var option = grunt.option('api'); - function rewriteIndexMiddleware(connect, options) { - // options.base is normalized to an array by grunt-contrib-connect - if (options.base.length !== 1) { - grunt.fail.fatal("must specify exactly one base"); + if(option && API_TARGETS[option]) { + api = API_TARGETS[option]; } - var base = options.base[0]; - return [ - connect.static(base), - function(req, res, next) { - // no file found; send app.html - var file = base + "/app.html"; - if (grunt.file.exists(file)) { - require("fs").createReadStream(file).pipe(res); - return; - } - res.statusCode(404); - res.end(); - } - ]; + + return api; } // Expose each supported browser as a command-line option @@ -70,10 +43,10 @@ module.exports = function(grunt) { return _.isEmpty(selected) ? [BROWSERS[0]] : selected; } - var userConfig = require("./conf.build.js"); + var userConfig = require('./conf.build.js'); var taskConfig = { - pkg: grunt.file.readJSON("package.json"), + pkg: grunt.file.readJSON('package.json'), meta: { banner: "/**\n" + " * <%= pkg.name %> - <%= pkg.version %> - <%= grunt.template.today('yyyy-mm-dd HH:MM:ss') %>\n" + @@ -87,7 +60,7 @@ module.exports = function(grunt) { options: { enabled: true, max_jshint_notifications: 5, // maximum number of notifications from jshint output - title: "ProtonMail Angular", // defaults to the name in package.json, or will use project directory's name + title: 'ProtonMail Angular', // defaults to the name in package.json, or will use project directory's name success: false, // whether successful grunt executions should be notified automatically duration: 3 // the duration of notification in seconds, for `notify-send only } @@ -105,6 +78,7 @@ module.exports = function(grunt) { apiUrl: apiUrl(), app_version: appVersion, api_version: apiVersion, + date_version: dateVersion, clientID: clientID, clientSecret: clientSecret } @@ -117,6 +91,7 @@ module.exports = function(grunt) { apiUrl: apiUrl(), app_version: appVersion, api_version: apiVersion, + date_version: dateVersion, clientID: clientID, clientSecret: clientSecret } @@ -124,166 +99,49 @@ module.exports = function(grunt) { } }, - replace: { - build: { - options: { - patterns: [ - { - json: { - "appVersion": appVersion, // replaces "@@appVersion" to the value of 'appVersion' variable - "apiVersion": apiVersion, // replaces "@@apiVersion" to the value of 'apiVersion' variable - } - } - ] - }, - files: [ - { - expand: true, - flatten: true, - src: ["<%= build_dir %>/**/*.html"], - dest: "<%= build_dir %>/" - }, - { - expand: true, - flatten: true, - src: ["<%= build_dir %>/pages/**/*.html"], - dest: "<%= build_dir %>/pages" - } - ] - }, - compile: { - options: { - patterns: [ - { - json: { - "appVersion": appVersion, // replaces "@@appVersion" to the value of 'appVersion' variable - "apiVersion": apiVersion // replaces "@@apiVersion" to the value of 'apiVersion' variable - } - } - ] - }, - files: [ - { - expand: true, - flatten: true, - src: ["<%= compile_dir %>/**/*.html"], - dest: "<%= compile_dir %>/" - }, - { - expand: true, - flatten: true, - src: ["<%= compile_dir %>/pages/**/*.html"], - dest: "<%= compile_dir %>/pages" - } - ] - }, - dist2: { - options: { - patterns: [ - { - json: { - "appVersion": appVersion, // replaces "@@appVersion" to the value of 'appVersion' variable - "apiVersion": apiVersion // replaces "@@apiVersion" to the value of 'apiVersion' variable - } - } - ] - }, - files: [ - { - expand: true, - flatten: true, - src: ["<%= build_dir %>/pages/*.html"], - dest: "<%= build_dir %>/pages/" - } - ] - } - }, - - i18nextract: { - default_options: { - src: ["<%= app_files.js %>", "<%= app_files.atpl %>", "<%= app_files.ctpl %>", "<%= app_files.html %>"], - dest: "src/assets/locales", - lang: ['fr_FR', 'en_US', 'de_DE', 'it_IT', 'es_ES'], - defaultLang: "en_US", - prefix: "", - suffix: ".json", - stringifyOptions: true // the output will be sort (case insensitive) - } - }, - clean: { build: [ "<%= build_dir %>" ], dist: [ "<%= compile_dir %>" - ], - after: [ - "<%= build_dir %>/_footer.html", - "<%= build_dir %>/_nav.html", - "<%= build_dir %>/about.html", - "<%= build_dir %>/faq.html", - "<%= build_dir %>/invite.html", - "<%= build_dir %>/join-us.html", - "<%= build_dir %>/media.html", - "<%= build_dir %>/perks.html", - "<%= build_dir %>/press.html", - "<%= build_dir %>/privacy-policy.html", - "<%= build_dir %>/security-details.html", - "<%= build_dir %>/technical-details.html", - "<%= build_dir %>/terms-and-conditions.html", - "<%= build_dir %>/why-protonmail.html", - "<%= build_dir %>/privacy-policy.html" ] }, - aglio: { - build: { - files: { - "./api/index.html": [ - "./api/specs/main.md", - "./api/specs/messages.md", - "./api/specs/contacts.md" - ], - theme: "default" - } - } - }, - - forever: { - mock_server: { - options: { - command: './node_modules/api-mock/bin/api-mock ./api/blueprint.md' + ' -p ' + (grunt.option('api-port') || '4003'), - index: '', - logDir: 'logs' - } - } - }, - connect: { options: { - hostname: "*", - middleware: rewriteIndexMiddleware, - port: 8080 + hostname: '*', + open: true, + port: 8080, + middleware: function(connect, options, middlewares) { + var base = options.base[0]; + + return [ + serveStatic(base), + function(req, res, next) { + // no file found; send app.html + var file = base + '/app.html'; + if (grunt.file.exists(file)) { + require('fs').createReadStream(file).pipe(res); + return; + } + res.statusCode(404); + res.end(); + } + ]; + } }, compile: { options: { - base: "<%= compile_dir %>" + base: '<%= compile_dir %>' } }, watch: { options: { - base: "<%= build_dir %>", - livereload: 40093 - } - }, - - api_doc: { - options: { - base: "./api", - port: 4001 + livereload: 40093, + base: '<%= build_dir %>' } } }, @@ -297,44 +155,12 @@ module.exports = function(grunt) { expand: true }] }, - build_vendor_assets: { - files: [{ - src: ["<%= vendor_files.assets %>"], - dest: "<%= build_dir %>/assets/", - cwd: ".", - expand: true, - flatten: true - }] - }, - build_fonts: { - files: [{ - src: ["**"], - dest: "<%= build_dir %>/fonts", - cwd: "./src/assets/fonts", - expand: true - }] - }, build_appjs: { files: [{ src: ["<%= app_files.js %>"], - dest: "<%= build_dir %>/", + dest: "<%= build_dir %>", cwd: ".", - expand: true - }] - }, - build_static: { - files: [{ - src: ["**"], - dest: "<%= build_dir %>/", - cwd: "./src/static", - expand: true - }] - }, - compile_static: { - files: [{ - src: ["**"], - dest: "<%= compile_dir %>/", - cwd: "./src/static", + filter: 'isFile', expand: true }] }, @@ -344,7 +170,8 @@ module.exports = function(grunt) { dest: "<%= build_dir %>/vendor", cwd: ".", expand: true, - flatten: true + flatten: true, + nonull: true }] }, compile_assets: { @@ -355,66 +182,40 @@ module.exports = function(grunt) { expand: true }] }, - compile_fonts: { - files: [{ - src: ["**"], - dest: "<%= compile_dir %>/fonts", - cwd: "./src/assets/fonts", - expand: true - }] - }, - build_editor: { + build_external: { files: [{ - src: ["application.css"], - dest: "<%= build_dir %>/assets/", - cwd: "<%= build_dir %>/assets/", - rename: function(dest, src) { - return dest + 'editor.css'; - }, - expand: true + src: ["<%= external_files.openpgp %>"], + dest: "./<%= build_dir %>/", + nonull: true }] }, - compile_editor: { + compile_external: { files: [{ - src: ["app.css"], - dest: "<%= compile_dir %>/assets/", - cwd: "<%= compile_dir %>/assets/", - rename: function(dest, src) { - return dest + 'editor.css'; - }, - expand: true + src: ["<%= external_files.openpgp %>"], + dest: "./<%= compile_dir %>/", + nonull: true }] }, - deploy: { + build_htaccess: { files: [{ src: [".htaccess"], filter: "isFile", expand: true, - dest: "./<%= compile_dir %>/", - cwd: "./src" - }] - }, - build_external: { - files: [{ - src: ["<%= external_files.openpgp %>"], - dest: "./<%= build_dir %>/" - }] - }, - compile_external: { - files: [{ - src: ["<%= external_files.openpgp %>"], - dest: "./<%= compile_dir %>/" + dest: "<%= build_dir %>", + cwd: "./src", + nonull: true }] }, - htaccess: { + compile_htaccess: { files: [{ src: [".htaccess"], filter: "isFile", expand: true, - dest: "./<%= build_dir %>/", - cwd: "./src" + dest: "<%= compile_dir %>", + cwd: "./src", + nonull: true }] - } + }, }, sass: { @@ -428,78 +229,22 @@ module.exports = function(grunt) { } }, - includes: { - files: { - src: [ "*.html" ], - dest: "<%= build_dir %>/pages", - cwd: "src/static/pages", - options: { - duplicates: false, - flatten: true, - includePath: "src/static/pages" - } - }, - app: { - src: [ "*.html" ], - dest: "<%= build_dir %>/", - cwd: "src/static", - options: { - duplicates: false, - flatten: true, - includePath: "src/static" - } - }, - static_files: { - src: [ "*.html" ], - dest: "<%= compile_dir %>/pages", - cwd: "src/static/pages", - options: { - duplicates: false, - flatten: true, - includePath: "src/static/pages" - } - }, - static_app: { - src: [ "*.html" ], - dest: "<%= compile_dir %>/", - cwd: "src/static", - options: { - duplicates: false, - flatten: true, - includePath: "src/static" - } - } - }, - concat: { build_css: { - src: [ - "<%= vendor_files.css %>", - "<%= build_dir %>/assets/application.css" - ], - dest: "<%= build_dir %>/assets/application.css" + files: { + '<%= build_dir %>/assets/vendor.css': ['<%= vendor_files.css %>'] + }, + nonull: true }, compile_js: { options: { + sourceMap: true, banner: "<%= meta.banner %>" }, files: { - "<%= compile_dir %>/assets/app.js": [ - "<%= build_dir %>/src/**/*.js", - "<%= html2js.app.dest %>", - "<%= html2js.common.dest %>", - ], - "<%= compile_dir %>/assets/vendor.js": ["<%= vendor_files.included_js %>"] - } - }, - compile_api_spec: { - files: { - "./api/blueprint.md": [ - "./api/specs/main.md", - "./api/specs/messages.md", - "./api/specs/contacts.md" - ] - } + '<%= compile_dir %>/assets/app.js': ['<%= vendor_files.js %>', '<%= build_dir %>/src/app/**/*.js'] + }, + nonull: true } }, @@ -510,56 +255,13 @@ module.exports = function(grunt) { } }, - uncss: { - dist: { - files: { - "<%= compile_dir %>/assets/app.css": "<%= compile_dir %>/assets/app.css" - } - } - }, - html2js: { app: { options: { base: "src/app" }, src: ["<%= app_files.atpl %>"], - dest: "<%= build_dir %>/templates-app.js" - }, - - common: { - options: { - base: "src/common" - }, - src: ["<%= app_files.ctpl %>"], - dest: "<%= build_dir %>/templates-common.js" - } - }, - - karma: { - options: { - configFile: "<%= build_dir %>/conf.unit.js", - }, - watch: { - autoWatch: true, - background: true, - browsers: browsers() - }, - once: { - singleRun: true, - browsers: ["PhantomJS"] - } - }, - - - testconfig: { - unit: { - src: [ - "<%= vendor_files.included_js %>", - "<%= html2js.app.dest %>", - "<%= html2js.common.dest %>", - "<%= test_files.js %>" - ] + dest: "<%= build_dir %>/src/app/templates/templates-app.js" } }, @@ -578,9 +280,7 @@ module.exports = function(grunt) { }, compile: { files: [{ - src: ["<%= app_files.js %>"], - cwd: "<%= build_dir %>", - dest: "<%= build_dir %>", + src: ['<%= build_dir %>/js/*.js'], expand: true }] } @@ -591,7 +291,15 @@ module.exports = function(grunt) { options: { curly: true, // This option requires you to always put curly braces around blocks in loops and conditionals. eqeqeq: true, // This options prohibits the use of == and != in favor of === and !==. + eqnull: true, + expr: true, + onevar: true, + noarg: true, + node: true, + trailing: true, globals: { + angular: true, + pmcrypto: true, _: true, jQuery: true } @@ -601,7 +309,9 @@ module.exports = function(grunt) { uglify: { options: { mangle: false, - sourceMap: false, + sourceMap: true, + sourceMapIncludeSources : true, + sourceMapIn : '<%= compile_dir %>/assets/app.js.map', preserveComments: false, report: 'min' }, @@ -610,8 +320,7 @@ module.exports = function(grunt) { banner: "<%= meta.banner %>" }, files: { - "<%= compile_dir %>/assets/app.js": "<%= compile_dir %>/assets/app.js", - "<%= compile_dir %>/assets/vendor.js": "<%= compile_dir %>/assets/vendor.js" + '<%= compile_dir %>/assets/app.js': '<%= compile_dir %>/assets/app.js' } } }, @@ -621,15 +330,14 @@ module.exports = function(grunt) { apiUrl: apiUrl() }, build: { - dir: "<%= build_dir %>", + dir: '<%= build_dir %>', src: [ - "<%= html2js.common.dest %>", - "<%= html2js.app.dest %>", - "<%= build_dir %>/openpgp.min.js", - "<%= build_dir %>/pmcrypto.js", - "<%= build_dir %>/src/**/*.js", - "<%= vendor_files.included_js %>", - "<%= build_dir %>/assets/application.css" + '<%= build_dir %>/openpgp.min.js', + '<%= build_dir %>/pmcrypto.js', + '<%= build_dir %>/src/**/*.js', + '<%= vendor_files.included_js %>', + '<%= build_dir %>/assets/application.css', + '<%= build_dir %>/assets/vendor.css' ], deployment: false }, @@ -637,11 +345,10 @@ module.exports = function(grunt) { compile: { dir: "<%= compile_dir %>", src: [ - "<%= compile_dir %>/assets/vendor.js", "<%= compile_dir %>/openpgp.min.js", "<%= compile_dir %>/pmcrypto.js", "<%= compile_dir %>/assets/app.js", - "<%= cssmin.compile.dest %>" + "<%= compile_dir %>/assets/app.css" ], deployment: true } @@ -650,23 +357,20 @@ module.exports = function(grunt) { cacheBust: { options: { deleteOriginals: true, - ignorePatterns: [ - 'openpgp.min.js', - 'editor.css' - ] + baseDir: '<%= compile_dir %>/' }, assets: { - files: [{ - src: ['<%= compile_dir %>/app.html'] - }] + options: { + assets: ['assets/app.css', 'assets/app.js'] + }, + src: ['<%= compile_dir %>/app.html'] } }, delta: { options: { livereload: 40093, - spawn: false, - // interrupt: !grunt.option("no-watch-interrupt") + spawn: false }, html: { @@ -678,7 +382,7 @@ module.exports = function(grunt) { files: [ "src/sass/**/*.scss" ], - tasks: ["sass:build", "concat:build_css"] + tasks: ["sass:build"] }, css: { @@ -686,7 +390,7 @@ module.exports = function(grunt) { }, tpls: { - files: ["<%= app_files.atpl %>", "<%= app_files.ctpl %>"], + files: ["<%= app_files.atpl %>"], tasks: ["html2js"] }, @@ -708,36 +412,39 @@ module.exports = function(grunt) { } }, - api_spec: { - files: ["api/specs/*"], - tasks: [ - "aglio:build", - "concat:compile_api_spec", - "forever:mock_server:restart", - "delta" - ] - } }, shell: { setup_dist: { - command: [ - "mkdir dist && cd dist", - "git init", - "git remote add origin git@github.com:ProtonMail/Angular.git", - "git fetch origin", - "git checkout -b deploy origin/deploy", - "for file in `ls assets | grep -E '.*[a-f0-9]{16}\..*'`; do git rm assets/$file; done" - ].join("&&") + command: function() { + var commands = []; + var option = 'deploy3'; + + if (grunt.option('dest')) { + option = grunt.option('dest'); + } + + commands.push('mkdir dist'); + commands.push('cd dist'); + commands.push('git init'); + commands.push('git remote add origin git@github.com:ProtonMail/Angular.git'); + commands.push('git fetch origin'); + commands.push('git checkout -b ' + option + ' origin/' + option); + commands.push('rm -rf *'); + + return commands.join('&&'); + } }, push: { command: [ "cd dist", + "git ls-files --deleted -z | xargs -0 git rm", "git add --all", "git commit -m \"New Release\"", "git push" ].join("&&") } + }, wait: { @@ -746,92 +453,75 @@ module.exports = function(grunt) { delay: 3000 } } + }, + + nggettext_extract: { + pot: { + options: { + attributes: ['placeholder-translate', 'title-translate', 'pt-tooltip-translate'] + }, + files: { + 'po/template.pot': ['<%= app_files.js %>', '<%= app_files.atpl %>', '<%= app_files.html %>'] + } + } + }, + + nggettext_compile: { + all: { + options: { + module: 'proton' + }, + files: { + 'src/app/translations.js': ['po/*.po'] + } + } } }; // Project config grunt.initConfig(grunt.util._.extend(taskConfig, userConfig)); - // Load the grunt plugins - grunt.loadNpmTasks('grunt-angular-translate'); - grunt.loadNpmTasks('grunt-notify'); - grunt.loadNpmTasks('grunt-ng-constant'); - grunt.loadNpmTasks('grunt-uncss'); - grunt.loadNpmTasks('grunt-includes'); - grunt.loadNpmTasks('grunt-replace'); - - grunt.renameTask("watch", "delta"); - grunt.registerTask("watch", [ - "notify_hooks", - "ngconstant:dev", - "build", - "jshint", - "karma:watch:start", - "connect:watch", - "connect:api_doc", - "concat:compile_api_spec", - "forever:mock_server:start", - "delta", - "delta" - ]); + grunt.renameTask('watch', 'delta'); - grunt.registerTask("extract", [ - "i18nextract" + grunt.registerTask('watch', [ + 'notify_hooks', + 'ngconstant:dev', + 'build', + 'jshint', + 'connect:watch', + 'delta' ]); - grunt.registerTask("build", [ - "clean:build", - "jshint", - "html2js", - "sass:build", - "concat:build_css", - "copy:build_app_assets", - "copy:build_vendor_assets", - "copy:build_appjs", - "copy:build_static", - "copy:build_vendorjs", - "copy:build_external", - "copy:build_fonts", - "copy:build_editor", - "index:build", - "includes:app", - "includes:files", - "replace:build", - "testconfig", - "clean:after" + grunt.registerTask('deploy', [ + 'clean:dist', // clean dist directory + 'shell:setup_dist', + 'ngconstant:prod', // set prod variables + 'build', + 'copy:compile_assets', // copy assets + 'copy:compile_htaccess', // copy htaccess file + 'cssmin', // minify CSS + 'concat:compile_js', // concat JS + 'uglify', // minify JS + 'copy:compile_external', // copy openpgp + 'index:compile', // index CSS and JS + 'cacheBust', // bust CSS and JS + 'shell:push', // push code to deploy branch + 'wait:push' ]); - grunt.registerTask("compile", [ - "ngconstant:prod", - "build", - "copy:compile_static", - "copy:compile_assets", - "includes:static_app", - "includes:static_files", - "replace:compile", - "copy:compile_fonts", - "ngAnnotate", - "cssmin", - "concat:compile_js", - "uglify", - "copy:compile_external", - "copy:compile_editor", - "index:compile", - "cacheBust", - "connect:compile" + grunt.registerTask('build', [ + 'clean:build', + 'nggettext_extract', // extract key inside JS and HTML files + 'nggettext_compile', // transform po file to translations.js + 'html2js', + 'sass:build', + 'concat:build_css', + 'copy:build_app_assets', + 'copy:build_appjs', + 'copy:build_vendorjs', + 'copy:build_external', + 'copy:build_htaccess', + 'ngAnnotate', + 'index:build' ]); - - grunt.registerTask("deploy", [ - "copy:compile_editor", - "clean:dist", - "shell:setup_dist", - "compile", - "copy:deploy", - "copy:htaccess", - "clean:after", - "shell:push", - "wait:push" - ]); - - grunt.registerTask("default", ["watch"]); }; diff --git a/Makefile b/Makefile new file mode 100644 index 0000000..4e0fb48 --- /dev/null +++ b/Makefile @@ -0,0 +1,28 @@ +.PHONY: all npm-install test start localurl versions +.PHONY: circle.dependencies circle.test +.PHONY: .FORCE + +all: start + +npm-install: .FORCE + ./bin/crun-node npm install --unsafe-perm --loglevel warn --no-bin-links + +install: npm-install + +test: npm-install + bin/crun-node npm test + +start: npm-install + DOCKER_OPTS="-p 8080:8080" bin/crun-node npm start + +localurl: + @echo "http://$$(./bin/docker-ip):8080" + +versions: + make --version + bash --version + docker version + docker info + +circle.dependencies: versions npm-install +circle.test: test diff --git a/README.md b/README.md old mode 100755 new mode 100644 index c129f20..e54dde7 --- a/README.md +++ b/README.md @@ -1,17 +1,65 @@ ProtonMail Web Client ======= -#### [https://protonmail.ch](https://protonmail.ch) +Official AngularJS web client for the [ProtonMail secure email service](https://protonmail.com). ProtonMail also makes use of [OpenPGPjs](https://github.com/openpgpjs/openpgpjs) as our message crytography is PGP compliant. -Official AngularJS web client for ProtonMail users. +### Translations + +To assist with the ProtonMail Translation Project, please visit our dedicated translation repository: [translations repository](https://github.com/ProtonMail/translations). + +### Basic Installation + +#### If you have node `0.12` installed locally + +1. `sudo npm install` (requires nodejs) +2. `sudo npm start` to start the app locally at `localhost:8080` + +#### If you have docker, and prefer to not install node (or anything else) locally + +- `make start` to start the app on a container (use `make localurl` to find the url where it's running) +- `make test` to build the app (actual tests are still to come) + +There is a very good chance you won't be able to use the app locally because of various security headers and such. But you should be able to get the code running enough to poke around and inspect it. + +We are still in Beta and will have a more refined build process, installation instructions, unit tests, and all that good stuff once we exit Beta. ### Development -We are very open to bug reports via Issues as well as Pull Requests. -## License +We are very open to bug reports via Issues as well as Pull Requests. + +### End to end testing for AngularJS + +Installation: + +``` +npm install -g protractor +webdriver-manager update +``` + +Start up a Selenium Server: + +``` +webdriver-manager start +``` + +Run tests: + +``` +protractor protractor_conf.js +``` + +Run a scenario: + +``` +protractor protractor_conf.js --suite=login +``` + +### License + +Copyright (c) 2013-2016 -Copyright (c) 2013-2015 Proton Technologies A.G. (Switzerland) + Email: contact@protonmail.ch License: https://github.com/ProtonMail/WebClient/blob/master/license.md diff --git a/src/app/templates/partials/footer.tpl.html b/api/blueprint.md old mode 100755 new mode 100644 similarity index 100% rename from src/app/templates/partials/footer.tpl.html rename to api/blueprint.md diff --git a/bin/crun b/bin/crun new file mode 100755 index 0000000..fff453d --- /dev/null +++ b/bin/crun @@ -0,0 +1,43 @@ +#!/usr/bin/env bash + +# Runs a interactive docker container linked to the current directory +# With this, there's no need for node (nor grunt, bower, etc.) to be installed locally. +# This simplifies preparation of developer machines, and continuous integration scripts. +# +# USAGE +# bin/crun [image] [command] + +set -e +set -o pipefail + +image=$1 +if [ -z "$image" ]; then + echo >&2 "Usage: crun [image] [command]" + exit 1 +fi +shift + +if ! docker inspect --format="{{.Id}}" $image > /dev/null; then + echo "Pulling $image image..." + docker pull $image +fi + +BASH_PATH=$(dirname "${BASH_SOURCE[0]}") +if hash realpath 2> /dev/null; then + REPO_ROOT=$(realpath "${BASH_PATH}/../") +else + REPO_ROOT=$(readlink -f "${BASH_PATH}/../") +fi +CONTAINER_HOME=$REPO_ROOT +STANDARD_PATH="/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin" + +SPECIAL_OPTS="--rm" +if [ "$NO_DOCKER_RM" ]; then + SPECIAL_OPTS="" +fi + +set -x +docker run -v $REPO_ROOT:$CONTAINER_HOME -v /tmp:/tmp -v /var/run/docker.sock:/var/run/docker.sock \ + -e HOME=$CONTAINER_HOME -w $CONTAINER_HOME \ + -e PATH="./node_modules/.bin/:./node_modules/grunt-cli/bin/:$STANDARD_PATH" \ + $DOCKER_OPTS $SPECIAL_OPTS -ti --sig-proxy=true "$image" "$@" diff --git a/bin/crun-node b/bin/crun-node new file mode 100755 index 0000000..06dc357 --- /dev/null +++ b/bin/crun-node @@ -0,0 +1,31 @@ +#!/bin/sh +set -e + +DEPENDENCY="node" +VERSION_FILE="./.cache/$DEPENDENCY.version" + +if [ ! -f "$VERSION_FILE" ] || [ "./package.json" -nt "$VERSION_FILE" ]; then + rm -f "$VERSION_FILE" + + echo >&2 "Resolving $DEPENDENCY version..." + if hash jq 2> /dev/null; then + SEMVER=$(jq -r '.engines.node' package.json) + VERSION=$(curl -sS "https://semver.io/node/resolve/$SEMVER") + else + VERSION=$(curl -sS https://semver.io/node/stable) + fi + + mkdir -p './.cache' + echo $VERSION > $VERSION_FILE +else + VERSION=$(cat $VERSION_FILE) +fi + +if [ -z "$VERSION" ]; then + echo >&2 "Failed to resolve $DEPENDENCY version." + cat "$VERSION_FILE" + rm -f "$VERSION_FILE" + exit 1 +fi + +./bin/crun "node:$VERSION" "$@" diff --git a/bin/docker-ip b/bin/docker-ip new file mode 100755 index 0000000..bd4626a --- /dev/null +++ b/bin/docker-ip @@ -0,0 +1,13 @@ +#!/bin/bash +set -e + +if hash docker-machine 2> /dev/null; then + echo $(docker-machine ip `docker-machine active`) +elif hash boot2docker 2> /dev/null; then + echo $(boot2docker ip) +elif hash docker 2> /dev/null; then + echo "localhost" +else + echo >&2 "Failed to get the IP of your docker host." + exit 1 +fi diff --git a/bower.json b/bower.json old mode 100755 new mode 100644 index 540aee3..71ef446 --- a/bower.json +++ b/bower.json @@ -1,68 +1,69 @@ { - "name": "protonmail-web-client", - "version": "0.0.2", - "homepage": "https://github.com/ProtonMail/Angular", + "name": "protonmail-web", + "description": "Angular frontend for protonmail.com", + "main": "", "authors": [ - "Richard Tetaz richardtetaz@protonmail.ch", - "Jason Stockman jason@protonmail.com", - "Dayne Davis daynedavis@protonmail.ch" + "ProtonMail", + "Inc." ], - "description": "Angular frontend for protonmail.com", - "license": "All Rights Reserved", - "private": true, + "license": "MIT", + "homepage": "https://github.com/ProtonMail/Angular", + "moduleType": [], "ignore": [ "**/.*", "node_modules", "bower_components", + "vendor", "test", "tests" ], "dependencies": { - "angular": "~1.4.3", - "angular-animate": "~1.4.3", - "angular-bootstrap": "~0.13.0", - "angular-cookies": "~1.4.3", - "angular-dragdrop": "~1.0.11", - "angular-loader": "~1.4.3", - "angular-markdown-directive": "~0.3.0", - "angular-mocks": "~1.4.3", - "angular-notify": "~2.5.0", - "angular-resource": "~1.4.3", - "angular-route": "~1.4.3", - "angular-sanitize": "~1.4.3", - "angular-toggle-switch": "~1.2.1", - "angular-translate": "~2.7.0", - "angular-translate-loader-static-files": "~2.7.0", - "angular-translate-storage-local": "~2.7.0", - "angular-ui-router": "~0.2.0", - "autosize-input": "https://github.com/ProtonMail/jQuery.Autosize.Input.git", - "bootstrap": "~3.3.4", - "bootstrap-sass-official": "https://github.com/ProtonMail/bootstrap-sass.git", - "bourbon": "~3.2.3", - "dompurify": "~0.6.4", - "dragdealer": "https://github.com/skidding/dragdealer.git", - "dragster": "~0.1.3", - "dropzone": "~4.0.1", - "es6-promise": "https://github.com/jakearchibald/es6-promise.git", - "jquery": "2.1.1", - "jquery-ui": "~1.10.0", - "lodash": "~2.4.1", - "mellt": "https://github.com/ProtonMail/Mellt.git", - "modernizr": "~2.8.3", - "moment": "~2.6.0", - "mousetrap": "~1.4.6", - "ng-file-upload": "https://github.com/danialfarid/ng-file-upload.git", - "ng-sortable": "~1.2.0", - "papaparse": "~4.1.1", + "angular-cookies": "~1.4.10", + "angular-ical": "~1.1.0", + "angular-loader": "~1.4.10", + "angular-messages": "~1.4.10", + "angular-notify": "https://github.com/EpokK/angular-notify.git#master", + "angular-resource": "~1.4.10", + "angular-route": "~1.4.10", + "angular-sanitize": "~1.4.10", + "angular-smooth-scrollbar": "~2.1.0", + "angular-translate-loader-static-files": "~2.11.0", + "angular-translate-storage-cookie": "~2.11.0", + "angular-translate-storage-local": "~2.11.0", + "angular-translate": "~2.11.0", + "angular-ui-router": "~0.2.15", + "angular": "~1.4.10", + "autofill-event": "~1.0.0", + "bootstrap-sass": "bootstrap-sass-official#~3.3.6", + "bootstrap": "~3.3.6", + "bourbon": "~4.2.6", + "dompurify": "dompurify#~0.7.3", + "dropzone": "~4.2.0", + "es6-promise": "~3.0.2", + "fastclick": "~1.0.6", + "html2canvas": "~0.4.1", + "ical.js": "~1.1.2", + "jquery-ui": "~1.11.4", + "jquery": "~2.2.0", + "jquery.payment": "~1.3.2", + "modernizr": "~3.3.0", + "moment": "~2.11.1", + "ng-sortable": "~1.3.2", + "open-sans-fontface": "~1.4.2", + "papaparse": "~4.1.2", "pikaday-angular": "~2.0.0", - "requirejs": "~2.1.14", - "squire-rte": "https://github.com/neilj/Squire.git", - "tagmanager": "https://github.com/ProtonMail/tagmanager.git#master", - "typeahead.js": "https://github.com/ProtonMail/typeahead.js.git#master", + "pikaday": "~1.4.0", + "requirejs": "~2.1.22", + "smooth-scrollbar": "~1.3.2", + "Squire": "https://github.com/neilj/Squire.git#master", + "svg4everybody": "~2.0.0", + "svgeezy": "^1.0.0", "underscore.string": "~2.3.3", - "vcard": "https://github.com/ProtonMail/vcard.git#master" + "underscore": "~1.8.3", + "vcard": "https://github.com/ProtonMail/vcard.git#master", + "angular-gettext": "~2.2.1" }, "resolutions": { - "angular": "1.4.3" + "angular": "1.4.10" } } diff --git a/circle.yml b/circle.yml new file mode 100644 index 0000000..217f3f4 --- /dev/null +++ b/circle.yml @@ -0,0 +1,21 @@ +machine: + pre: + - sudo curl -L -o /usr/bin/docker 'http://s3-external-1.amazonaws.com/circle-downloads/docker-1.6.x-circleci' && sudo chmod 0755 /usr/bin/docker + services: + - docker + environment: + NO_DOCKER_RM: true + ruby: #docker is all we need, but a language has to be chosen +dependencies: + pre: + - "rm -rf node_modules/" + override: + - make circle.dependencies + cache_directories: + - ".npm/" + - ".cache/bower/" + - ".node-gyp/" + - "vendor/" +test: + override: + - make circle.test diff --git a/conf.build.js b/conf.build.js old mode 100755 new mode 100644 index 81209fd..7cfafa2 --- a/conf.build.js +++ b/conf.build.js @@ -15,12 +15,11 @@ module.exports = { jsunit: ["src/**/*.spec.js"], jse2e: ["src/**/*.scenario.js"], atpl: ["src/app/**/*.tpl.html"], - ctpl: ["src/common/**/*.tpl.html"], - html: ["src/app.html", "src/admin.html", "src/static/**.html"], - sass: ["src/sass/application.scss", "src/sass/admin.scss"] + html: ["src/app.html"], + sass: ["src/sass/application.scss"] }, external_files: { - openpgp: ["openpgp.worker.min.js", "openpgp.min.js"] + openpgp: ["openpgp.worker.min.js", "openpgp.min.js", "manifest.json"] }, test_files: { js: [ @@ -31,59 +30,43 @@ module.exports = { }, vendor_files: (vendor_files = { js: [ - "vendor/es6-promise/es6-promise.js", "vendor/jquery/dist/jquery.js", - "vendor/jquery-ui/ui/jquery-ui.js", + "vendor/jquery-ui/jquery-ui.js", + "vendor/jquery.payment/lib/jquery.payment.js", + "vendor/fastclick/lib/fastclick.js", "vendor/angular/angular.js", + "vendor/autofill-event/src/autofill-event.js", "vendor/angular-cookies/angular-cookies.js", - "vendor/ng-file-upload/dist/angular-file-upload-shim.js", "vendor/angular-resource/angular-resource.js", - "vendor/angular-bootstrap/ui-bootstrap.js", - "vendor/angular-bootstrap/ui-bootstrap-tpls.js", "vendor/angular-ui-router/release/angular-ui-router.js", - "vendor/angular-animate/angular-animate.js", "vendor/angular-sanitize/angular-sanitize.js", "vendor/angular-route/angular-route.js", - "vendor/angular-toggle-switch/angular-toggle-switch.min.js", - "vendor/ng-file-upload/dist/ng-file-upload-all.js", - "vendor/lodash/dist/lodash.js", - "vendor/moment/moment.js", - "vendor/underscore.string/lib/underscore.string.js", - "vendor/openpgp/openpgp.min.js", - "vendor/dompurify/purify.js", - "vendor/papaparse/papaparse.min.js", - "vendor/showdown/compressed/showdown.js", - "vendor/angular-markdown-directive/markdown.js", - "vendor/typeahead.js/dist/typeahead.bundle.js", - "vendor/tagmanager/tagmanager.js", - "vendor/autosize-input/jquery.autosize.input.js", - "vendor/mousetrap/mousetrap.js", + "vendor/moment/min/moment-with-locales.js", + "vendor/underscore/underscore.js", + "vendor/dompurify/src/purify.js", + "vendor/papaparse/papaparse.js", "vendor/ng-sortable/dist/ng-sortable.js", - "vendor/dragdealer/src/dragdealer.js", "vendor/angular-notify/dist/angular-notify.js", "vendor/pikaday/pikaday.js", "vendor/pikaday-angular/pikaday-angular.js", - "vendor/squire-rte/build/squire.js", + "vendor/Squire/build/squire.js", "vendor/dropzone/dist/dropzone.js", - "vendor/angular-translate/angular-translate.js", - "vendor/angular-translate-loader-static-files/angular-translate-loader-static-files.js", - "vendor/angular-translate-storage-cookie/angular-translate-storage-cookie.js", - "vendor/angular-translate-storage-local/angular-translate-storage-local.js", - "vendor/angular-dragdrop/src/angular-dragdrop.js", "vendor/vcard/src/vcard.js", - "vendor/mellt/javascript/Mellt.js", - "vendor/mellt/javascript/common-passwords.js", - "vendor/dragster/lib/dragster.js" + "vendor/html2canvas/build/html2canvas.js", + "vendor/svg4everybody/dist/svg4everybody.js", + "vendor/ical.js/build/ical.js", + "vendor/angular-ical/dist/js/angular-ical.js", + "vendor/smooth-scrollbar/dist/smooth-scrollbar.js", + "vendor/angular-smooth-scrollbar/dist/angular-smooth-scrollbar.js", + "vendor/angular-messages/angular-messages.js", + "vendor/svgeezy/svgeezy.js", + "vendor/angular-gettext/dist/angular-gettext.js" ], bootstrap_components: [ "affix", "alert", - "collapse", "tooltip", - "dropdown", - "modal", - "transition", - "popover" + "transition" ], required_js: [], @@ -91,35 +74,29 @@ module.exports = { included_js: [], css: [ - "vendor/tagmanager/tagmanager.css", "vendor/ng-sortable/dist/ng-sortable.css", "vendor/angular-notify/dist/angular-notify.css", - "vendor/angular-modal/modal.css", - "vendor/angular-toggle-switch/angular-toggle-switch.css", - "vendor/angular-toggle-switch/angular-toggle-switch-bootstrap.css", "vendor/pikaday/css/pikaday.css", - "vendor/dropzone/dist/dropzone.css" + "vendor/dropzone/dist/dropzone.css", + "vendor/smooth-scrollbar/dist/smooth-scrollbar.css" ], sass_include_dirs: [ "vendor/bourbon/dist", - "vendor/font-awesome/scss", "vendor/bootstrap-sass-official/assets/stylesheets" - ], - assets: [ - "vendor/font-awesome/fonts" ] }), proton_build: { - version: "2.0", + version: "3.0", notes: "http://protonmail.dev/blog/", date: "17 Apr. 2015" } }; vendor_files.js = vendor_files.js.concat(vendor_files.bootstrap_components.map(function (cmp){ - return "vendor/bootstrap-sass-official/assets/javascripts/bootstrap/"+cmp+".js"; + // return "vendor/bootstrap-sass-official/assets/javascripts/bootstrap/"+cmp+".js"; + return "vendor/bootstrap-sass/assets/javascripts/bootstrap.js" })); vendor_files.included_js = vendor_files.js.filter(function (file) { diff --git a/conf.unit.tpl.js b/conf.unit.tpl.js old mode 100755 new mode 100644 diff --git a/license.md b/license.md old mode 100755 new mode 100644 diff --git a/manifest.json b/manifest.json new file mode 100644 index 0000000..92c65bc --- /dev/null +++ b/manifest.json @@ -0,0 +1,43 @@ +{ + "name": "ProtonMail", + "icons": [ + { + "src": "\/assets\/favicons\/android-chrome-36x36.png", + "sizes": "36x36", + "type": "image\/png", + "density": 0.75 + }, + { + "src": "\/assets\/favicons\/android-chrome-48x48.png", + "sizes": "48x48", + "type": "image\/png", + "density": 1 + }, + { + "src": "\/assets\/favicons\/android-chrome-72x72.png", + "sizes": "72x72", + "type": "image\/png", + "density": 1.5 + }, + { + "src": "\/assets\/favicons\/android-chrome-96x96.png", + "sizes": "96x96", + "type": "image\/png", + "density": 2 + }, + { + "src": "\/assets\/favicons\/android-chrome-144x144.png", + "sizes": "144x144", + "type": "image\/png", + "density": 3 + }, + { + "src": "\/assets\/favicons\/android-chrome-192x192.png", + "sizes": "192x192", + "type": "image\/png", + "density": 4 + } + ], + "start_url": "https:\/\/mail.protonmail.com", + "display": "standalone" +} diff --git a/openpgp.min.js b/openpgp.min.js old mode 100755 new mode 100644 index bcef5a6..b227f68 --- a/openpgp.min.js +++ b/openpgp.min.js @@ -1,13 +1,13 @@ -/*! OpenPGPjs.org this is LGPL licensed code, see LICENSE/our website for more information.- v0.11.0-PM - 2015-05-01 */!function(a){"object"==typeof exports?module.exports=a():"function"==typeof define&&define.amd?define(a):"undefined"!=typeof window?window.openpgp=a():"undefined"!=typeof global?global.openpgp=a():"undefined"!=typeof self&&(self.openpgp=a())}(function(){return function a(b,c,d){function e(g,h){if(!c[g]){if(!b[g]){var i="function"==typeof require&&require;if(!h&&i)return i(g,!0);if(f)return f(g,!0);throw new Error("Cannot find module '"+g+"'")}var j=c[g]={exports:{}};b[g][0].call(j.exports,function(a){var c=b[g][1][a];return e(c?c:a)},j,j.exports,a,b,c,d)}return c[g].exports}for(var f="function"==typeof require&&require,g=0;g0)){var d=c.shift();d()}},!0),function(a){c.push(a),window.postMessage("process-tick","*")}}return function(a){setTimeout(a,0)}}(),d.title="browser",d.browser=!0,d.env={},d.argv=[],d.binding=function(a){throw new Error("process.binding is not supported")},d.cwd=function(){return"/"},d.chdir=function(a){throw new Error("process.chdir is not supported")}},{}],2:[function(a,b,c){"use strict";var d=a("./promise/promise").Promise,e=a("./promise/polyfill").polyfill;c.Promise=d,c.polyfill=e},{"./promise/polyfill":6,"./promise/promise":7}],3:[function(a,b,c){"use strict";function d(a){var b=this;if(!e(a))throw new TypeError("You must pass an array to all.");return new b(function(b,c){function d(a){return function(b){e(a,b)}}function e(a,c){h[a]=c,0===--i&&b(h)}var g,h=[],i=a.length;0===i&&b([]);for(var j=0;jb;++b)e[b]=c[b];return a.buffer=e}function d(a){this.buffer=new(o?Uint16Array:Array)(2*a),this.length=0}function e(a,b){this.e=w,this.f=0,this.input=o&&a instanceof Array?new Uint8Array(a):a,this.c=0,b&&(b.lazy&&(this.f=b.lazy),"number"==typeof b.compressionType&&(this.e=b.compressionType),b.outputBuffer&&(this.b=o&&b.outputBuffer instanceof Array?new Uint8Array(b.outputBuffer):b.outputBuffer),"number"==typeof b.outputIndex&&(this.c=b.outputIndex)),this.b||(this.b=new(o?Uint8Array:Array)(32768))}function f(a,b){this.length=a,this.g=b}function g(a,b){function c(a,b){var c,d=a.g,e=[],f=0;c=z[a.length],e[f++]=65535&c,e[f++]=c>>16&255,e[f++]=c>>24;var g;switch(m){case 1===d:g=[0,d-1,0];break;case 2===d:g=[1,d-2,0];break;case 3===d:g=[2,d-3,0];break;case 4===d:g=[3,d-4,0];break;case 6>=d:g=[4,d-5,1];break;case 8>=d:g=[5,d-7,1];break;case 12>=d:g=[6,d-9,2];break;case 16>=d:g=[7,d-13,2];break;case 24>=d:g=[8,d-17,3];break;case 32>=d:g=[9,d-25,3];break;case 48>=d:g=[10,d-33,4];break;case 64>=d:g=[11,d-49,4];break;case 96>=d:g=[12,d-65,5];break;case 128>=d:g=[13,d-97,5];break;case 192>=d:g=[14,d-129,6];break;case 256>=d:g=[15,d-193,6];break;case 384>=d:g=[16,d-257,7];break;case 512>=d:g=[17,d-385,7];break;case 768>=d:g=[18,d-513,8];break;case 1024>=d:g=[19,d-769,8];break;case 1536>=d:g=[20,d-1025,9];break;case 2048>=d:g=[21,d-1537,9];break;case 3072>=d:g=[22,d-2049,10];break;case 4096>=d:g=[23,d-3073,10];break;case 6144>=d:g=[24,d-4097,11];break;case 8192>=d:g=[25,d-6145,11];break;case 12288>=d:g=[26,d-8193,12];break;case 16384>=d:g=[27,d-12289,12];break;case 24576>=d:g=[28,d-16385,13];break;case 32768>=d:g=[29,d-24577,13];break;default:throw"invalid distance"}c=g,e[f++]=c[0],e[f++]=c[1],e[f++]=c[2];var h,i;for(h=0,i=e.length;i>h;++h)r[s++]=e[h];u[e[0]]++,v[e[3]]++,t=a.length+b-1,n=null}var d,e,f,g,i,j,k,n,p,q={},r=o?new Uint16Array(2*b.length):[],s=0,t=0,u=new(o?Uint32Array:Array)(286),v=new(o?Uint32Array:Array)(30),w=a.f;if(!o){for(f=0;285>=f;)u[f++]=0;for(f=0;29>=f;)v[f++]=0}for(u[256]=1,d=0,e=b.length;e>d;++d){for(f=i=0,g=3;g>f&&d+f!==e;++f)i=i<<8|b[d+f];if(q[i]===l&&(q[i]=[]),j=q[i],!(0=e){for(n&&c(n,-1),f=0,g=e-d;g>f;++f)p=b[d+f],r[s++]=p,++u[p];break}0h;h++){if(d=c[j-h-1],g=3,k>3){for(i=k;i>3;i--)if(a[d+i-1]!==a[b+i-1])continue a;g=k}for(;258>g&&l>b+g&&a[d+g]===a[b+g];)++g;if(g>k&&(e=d,k=g),258===g)break}return new f(k,b-e)}function i(a,b){var c,e,f,g,h,i=a.length,k=new d(572),l=new(o?Uint8Array:Array)(i);if(!o)for(g=0;i>g;g++)l[g]=0;for(g=0;i>g;++g)0g;++g)c[g]=k.pop(),e[g]=c[g].value;for(f=j(e,e.length,b),g=0,h=c.length;h>g;++g)l[c[g].index]=f[g];return l}function j(a,b,c){function d(a){var c=n[a][p[a]];c===b?(d(a+1),d(a+1)):--l[c],++p[a]}var e,f,g,h,i,j=new(o?Uint16Array:Array)(c),k=new(o?Uint8Array:Array)(c),l=new(o?Uint8Array:Array)(b),m=Array(c),n=Array(c),p=Array(c),q=(1<f;++f)r>q?k[f]=0:(k[f]=1,q-=r),q<<=1,j[c-2-f]=(j[c-1-f]/2|0)+b;for(j[0]=k[0],m[0]=Array(j[0]),n[0]=Array(j[0]),f=1;c>f;++f)j[f]>2*j[f-1]+k[f]&&(j[f]=2*j[f-1]+k[f]),m[f]=Array(j[f]),n[f]=Array(j[f]);for(e=0;b>e;++e)l[e]=c;for(g=0;ge;++e)p[e]=0;for(1===k[c-1]&&(--l[0],++p[c-1]),f=c-2;f>=0;--f){for(h=e=0,i=p[f+1],g=0;ga[e]?(m[f][g]=h,n[f][g]=b,i+=2):(m[f][g]=a[e],n[f][g]=e,++e);p[f]=0,1===k[f]&&d(f)}return l}function k(a){var b,c,d,e,f=new(o?Uint16Array:Array)(a.length),g=[],h=[],i=0;for(b=0,c=a.length;c>b;b++)g[a[b]]=(0|g[a[b]])+1;for(b=1,c=16;c>=b;b++)h[b]=i,i+=0|g[b],i<<=1;for(b=0,c=a.length;c>b;b++)for(i=h[a[b]],h[a[b]]+=1,d=f[b]=0,e=a[b];e>d;d++)f[b]=f[b]<<1|1&i,i>>>=1;return f}var l=void 0,m=!0,n=this,o="undefined"!=typeof Uint8Array&&"undefined"!=typeof Uint16Array&&"undefined"!=typeof Uint32Array&&"undefined"!=typeof DataView;b.prototype.a=function(a,b,d){var e,f=this.buffer,g=this.index,h=this.d,i=f[g];if(d&&b>1&&(a=b>8?(u[255&a]<<24|u[a>>>8&255]<<16|u[a>>>16&255]<<8|u[a>>>24&255])>>32-b:u[a]>>8-b),8>b+h)i=i<e;++e)i=i<<1|a>>b-e-1&1,8===++h&&(h=0,f[g++]=u[i],i=0,g===f.length&&(f=c(this)));f[g]=i,this.buffer=f,this.d=h,this.index=g},b.prototype.finish=function(){var a,b=this.buffer,c=this.index;return 0p;++p){for(var r=p,s=r,t=7,r=r>>>1;r;r>>>=1)s<<=1,s|=1&r,--t;q[p]=(s<>>0}var u=q;d.prototype.getParent=function(a){return 2*((a-2)/4|0)},d.prototype.push=function(a,b){var c,d,e,f=this.buffer;for(c=this.length,f[this.length++]=b,f[this.length++]=a;c>0&&(d=this.getParent(c),f[c]>f[d]);)e=f[c],f[c]=f[d],f[d]=e,e=f[c+1],f[c+1]=f[d+1],f[d+1]=e,c=d;return this.length},d.prototype.pop=function(){var a,b,c,d,e,f=this.buffer;for(b=f[0],a=f[1],this.length-=2,f[0]=f[this.length],f[1]=f[this.length+1],e=0;(d=2*e+2,!(d>=this.length))&&(d+2f[d]&&(d+=2),f[d]>f[e]);)c=f[e],f[e]=f[d],f[d]=c,c=f[e+1],f[e+1]=f[d+1],f[d+1]=c,e=d;return{index:a,value:b,length:this.length}};var v,w=2,x=[];for(v=0;288>v;v++)switch(m){case 143>=v:x.push([v+48,8]);break;case 255>=v:x.push([v-144+400,9]);break;case 279>=v:x.push([v-256+0,7]);break;case 287>=v:x.push([v-280+192,8]);break;default:throw"invalid literal: "+v}e.prototype.h=function(){var a,c,d,e,f=this.input;switch(this.e){case 0:for(d=0,e=f.length;e>d;){c=o?f.subarray(d,d+65535):f.slice(d,d+65535),d+=c.length;var h=c,j=d===e,n=l,p=l,q=l,r=l,s=l,t=this.b,u=this.c;if(o){for(t=new Uint8Array(this.b.buffer);t.length<=u+h.length+5;)t=new Uint8Array(t.length<<1);t.set(this.b)}if(n=j?1:0,t[u++]=0|n,p=h.length,q=~p+65536&65535,t[u++]=255&p,t[u++]=p>>>8&255,t[u++]=255&q,t[u++]=q>>>8&255,o)t.set(h,u),u+=h.length,t=t.subarray(0,u);else{for(r=0,s=h.length;s>r;++r)t[u++]=h[r];t.length=u}this.c=u,this.b=t}break;case 1:var v=new b(o?new Uint8Array(this.b.buffer):this.b,this.c);v.a(1,1,m),v.a(1,2,m);var y,z,A,B=g(this,f);for(y=0,z=B.length;z>y;y++)if(A=B[y],b.prototype.a.apply(v,x[A]),A>256)v.a(B[++y],B[++y],m),v.a(B[++y],5),v.a(B[++y],B[++y],m);else if(256===A)break;this.b=v.finish(),this.c=this.b.length;break;case w:var C,D,E,F,G,H,I,J,K,L,M,N,O,P,Q,R=new b(o?new Uint8Array(this.b.buffer):this.b,this.c),S=[16,17,18,0,8,7,9,6,10,5,11,4,12,3,13,2,14,1,15],T=Array(19);for(C=w,R.a(1,1,m),R.a(C,2,m),D=g(this,f),H=i(this.j,15),I=k(H),J=i(this.i,7),K=k(J),E=286;E>257&&0===H[E-1];E--);for(F=30;F>1&&0===J[F-1];F--);var U,V,W,X,Y,Z,$=E,_=F,aa=new(o?Uint32Array:Array)($+_),ba=new(o?Uint32Array:Array)(316),ca=new(o?Uint8Array:Array)(19);for(U=V=0;$>U;U++)aa[V++]=H[U];for(U=0;_>U;U++)aa[V++]=J[U];if(!o)for(U=0,X=ca.length;X>U;++U)ca[U]=0;for(U=Y=0,X=aa.length;X>U;U+=V){for(V=1;X>U+V&&aa[U+V]===aa[U];++V);if(W=V,0===aa[U])if(3>W)for(;00;)Z=138>W?W:138,Z>W-3&&W>Z&&(Z=W-3),10>=Z?(ba[Y++]=17,ba[Y++]=Z-3,ca[17]++):(ba[Y++]=18,ba[Y++]=Z-11,ca[18]++),W-=Z;else if(ba[Y++]=aa[U],ca[aa[U]]++,W--,3>W)for(;00;)Z=6>W?W:6,Z>W-3&&W>Z&&(Z=W-3),ba[Y++]=16,ba[Y++]=Z-3,ca[16]++,W-=Z}for(a=o?ba.subarray(0,Y):ba.slice(0,Y),L=i(ca,7),P=0;19>P;P++)T[P]=L[S[P]];for(G=19;G>4&&0===T[G-1];G--);for(M=k(L),R.a(E-257,5,m),R.a(F-1,5,m),R.a(G-4,4,m),P=0;G>P;P++)R.a(T[P],3,m);for(P=0,Q=a.length;Q>P;P++)if(N=a[P],R.a(M[N],L[N],m),N>=16){switch(P++,N){case 16:O=2;break;case 17:O=3;break;case 18:O=7;break;default:throw"invalid code: "+N}R.a(a[P],O,m)}var da,ea,fa,ga,ha,ia,ja,ka,la=[I,H],ma=[K,J];for(ha=la[0],ia=la[1],ja=ma[0],ka=ma[1],da=0,ea=D.length;ea>da;++da)if(fa=D[da],R.a(ha[fa],ia[fa],m),fa>256)R.a(D[++da],D[++da],m),ga=D[++da],R.a(ja[ga],ka[ga],m),R.a(D[++da],D[++da],m);else if(256===fa)break;this.b=R.finish(),this.c=this.b.length;break;default:throw"invalid compression type"}return this.b};var y=function(){function a(a){switch(m){case 3===a:return[257,a-3,0];case 4===a:return[258,a-4,0];case 5===a:return[259,a-5,0];case 6===a:return[260,a-6,0];case 7===a:return[261,a-7,0];case 8===a:return[262,a-8,0];case 9===a:return[263,a-9,0];case 10===a:return[264,a-10,0];case 12>=a:return[265,a-11,1];case 14>=a:return[266,a-13,1];case 16>=a:return[267,a-15,1];case 18>=a:return[268,a-17,1];case 22>=a:return[269,a-19,2];case 26>=a:return[270,a-23,2];case 30>=a:return[271,a-27,2];case 34>=a:return[272,a-31,2];case 42>=a:return[273,a-35,3];case 50>=a:return[274,a-43,3];case 58>=a:return[275,a-51,3];case 66>=a:return[276,a-59,3];case 82>=a:return[277,a-67,4];case 98>=a:return[278,a-83,4];case 114>=a:return[279,a-99,4];case 130>=a:return[280,a-115,4];case 162>=a:return[281,a-131,5];case 194>=a:return[282,a-163,5];case 226>=a:return[283,a-195,5];case 257>=a:return[284,a-227,5];case 258===a:return[285,a-258,0];default:throw"invalid length: "+a}}var b,c,d=[];for(b=3;258>=b;b++)c=a(b),d[b]=c[2]<<24|c[1]<<16|c[0];return d}(),z=o?new Uint32Array(y):y;a("Zlib.RawDeflate",e),a("Zlib.RawDeflate.prototype.compress",e.prototype.h);var A,B,C,D,E={NONE:0,FIXED:1,DYNAMIC:w};if(Object.keys)A=Object.keys(E);else for(B in A=[],C=0,E)A[C++]=B;for(C=0,D=A.length;D>C;++C)B=A[C],a("Zlib.RawDeflate.CompressionType."+B,E[B])}).call(this)},{}],14:[function(a,b,c){(function(){"use strict";function a(a,b){var c=a.split("."),d=g;!(c[0]in d)&&d.execScript&&d.execScript("var "+c[0]);for(var e;c.length&&(e=c.shift());)c.length||void 0===b?d=d[e]?d[e]:d[e]={}:d[e]=b}function b(a){var b,c,d,e,f,g,i,j,k,l,m=a.length,n=0,o=Number.POSITIVE_INFINITY;for(j=0;m>j;++j)a[j]>n&&(n=a[j]),a[j]=d;){for(j=0;m>j;++j)if(a[j]===d){for(g=0,i=e,k=0;d>k;++k)g=g<<1|1&i,i>>=1;for(l=d<<16|j,k=g;b>k;k+=f)c[k]=l;++e}++d,e<<=1,f<<=1}return[c,n,o]}function c(a,b){switch(this.g=[],this.h=32768,this.c=this.f=this.d=this.k=0,this.input=h?new Uint8Array(a):a,this.l=!1,this.i=j,this.q=!1,(b||!(b={}))&&(b.index&&(this.d=b.index),b.bufferSize&&(this.h=b.bufferSize),b.bufferType&&(this.i=b.bufferType),b.resize&&(this.q=b.resize)),this.i){case i:this.a=32768,this.b=new(h?Uint8Array:Array)(32768+this.h+258);break;case j:this.a=0,this.b=new(h?Uint8Array:Array)(this.h),this.e=this.v,this.m=this.s,this.j=this.t;break;default:throw Error("invalid inflate mode")}}function d(a,b){for(var c,d=a.f,e=a.c,f=a.input,g=a.d,h=f.length;b>e;){if(g>=h)throw Error("input buffer is broken");d|=f[g++]<>>b,a.c=e-b,a.d=g,c}function e(a,b){for(var c,d,e=a.f,f=a.c,g=a.input,h=a.d,i=g.length,j=b[0],k=b[1];k>f&&!(h>=i);)e|=g[h++]<>>16,a.f=e>>d,a.c=f-d,a.d=h,65535&c}function f(a){function c(a,b,c){var f,g,h,i=this.p;for(h=0;a>h;)switch(f=e(this,b)){case 16:for(g=3+d(this,2);g--;)c[h++]=i;break;case 17:for(g=3+d(this,3);g--;)c[h++]=0;i=0;break;case 18:for(g=11+d(this,7);g--;)c[h++]=0;i=0;break;default:i=c[h++]=f}return this.p=i,c}var f,g,i,j,k=d(a,5)+257,l=d(a,5)+1,m=d(a,4)+4,o=new(h?Uint8Array:Array)(n.length);for(j=0;m>j;++j)o[n[j]]=d(a,3);if(!h)for(j=m,m=o.length;m>j;++j)o[n[j]]=0;f=b(o),g=new(h?Uint8Array:Array)(k),i=new(h?Uint8Array:Array)(l),a.p=0,a.j(b(c.call(a,k,f,g)),b(c.call(a,l,f,i)))}var g=this,h="undefined"!=typeof Uint8Array&&"undefined"!=typeof Uint16Array&&"undefined"!=typeof Uint32Array&&"undefined"!=typeof DataView,i=0,j=1;c.prototype.u=function(){for(;!this.l;){var a=d(this,3);switch(1&a&&(this.l=!0),a>>>=1){case 0:var b=this.input,c=this.d,e=this.b,g=this.a,k=b.length,l=void 0,m=void 0,n=e.length,o=void 0;if(this.c=this.f=0,c+1>=k)throw Error("invalid uncompressed block header: LEN");if(l=b[c++]|b[c++]<<8,c+1>=k)throw Error("invalid uncompressed block header: NLEN");if(m=b[c++]|b[c++]<<8,l===~m)throw Error("invalid uncompressed block header: length verify");if(c+l>b.length)throw Error("input buffer is broken");switch(this.i){case i:for(;g+l>e.length;){if(o=n-g,l-=o,h)e.set(b.subarray(c,c+o),g),g+=o,c+=o;else for(;o--;)e[g++]=b[c++];this.a=g,e=this.e(),g=this.a}break;case j:for(;g+l>e.length;)e=this.e({o:2});break;default:throw Error("invalid inflate mode")}if(h)e.set(b.subarray(c,c+l),g),g+=l,c+=l;else for(;l--;)e[g++]=b[c++];this.d=c,this.a=g,this.b=e;break;case 1:this.j(z,B);break;case 2:f(this);break;default:throw Error("unknown BTYPE: "+a)}}return this.m()};var k,l,m=[16,17,18,0,8,7,9,6,10,5,11,4,12,3,13,2,14,1,15],n=h?new Uint16Array(m):m,o=[3,4,5,6,7,8,9,10,11,13,15,17,19,23,27,31,35,43,51,59,67,83,99,115,131,163,195,227,258,258,258],p=h?new Uint16Array(o):o,q=[0,0,0,0,0,0,0,0,1,1,1,1,2,2,2,2,3,3,3,3,4,4,4,4,5,5,5,5,0,0,0],r=h?new Uint8Array(q):q,s=[1,2,3,4,5,7,9,13,17,25,33,49,65,97,129,193,257,385,513,769,1025,1537,2049,3073,4097,6145,8193,12289,16385,24577],t=h?new Uint16Array(s):s,u=[0,0,0,0,1,1,2,2,3,3,4,4,5,5,6,6,7,7,8,8,9,9,10,10,11,11,12,12,13,13],v=h?new Uint8Array(u):u,w=new(h?Uint8Array:Array)(288);for(k=0,l=w.length;l>k;++k)w[k]=143>=k?8:255>=k?9:279>=k?7:8;var x,y,z=b(w),A=new(h?Uint8Array:Array)(30);for(x=0,y=A.length;y>x;++x)A[x]=5;var B=b(A);c.prototype.j=function(a,b){var c=this.b,f=this.a;this.n=a;for(var g,h,i,j,k=c.length-258;256!==(g=e(this,a));)if(256>g)f>=k&&(this.a=f,c=this.e(),f=this.a),c[f++]=g;else for(h=g-257,j=p[h],0=k&&(this.a=f,c=this.e(),f=this.a);j--;)c[f]=c[f++-i];for(;8<=this.c;)this.c-=8,this.d--;this.a=f},c.prototype.t=function(a,b){var c=this.b,f=this.a;this.n=a;for(var g,h,i,j,k=c.length;256!==(g=e(this,a));)if(256>g)f>=k&&(c=this.e(),k=c.length),c[f++]=g;else for(h=g-257,j=p[h],0k&&(c=this.e(),k=c.length);j--;)c[f]=c[f++-i];for(;8<=this.c;)this.c-=8,this.d--;this.a=f},c.prototype.e=function(){var a,b,c=new(h?Uint8Array:Array)(this.a-32768),d=this.a-32768,e=this.b;if(h)c.set(e.subarray(32768,c.length));else for(a=0,b=c.length;b>a;++a)c[a]=e[a+32768];if(this.g.push(c),this.k+=c.length,h)e.set(e.subarray(d,d+32768));else for(a=0;32768>a;++a)e[a]=e[d+a];return this.a=32768,e},c.prototype.v=function(a){var b,c,d,e,f=this.input.length/this.d+1|0,g=this.input,i=this.b;return a&&("number"==typeof a.o&&(f=a.o),"number"==typeof a.r&&(f+=a.r)),2>f?(c=(g.length-this.d)/this.n[2],e=258*(c/2)|0,d=eb;++b)for(a=i[b],d=0,e=a.length;e>d;++d)j[f++]=a[d];for(b=32768,c=this.a;c>b;++b)j[f++]=g[b];return this.g=[],this.buffer=j},c.prototype.s=function(){var a,b=this.a;return h?this.q?(a=new Uint8Array(b),a.set(this.b.subarray(0,b))):a=this.b.subarray(0,b):(this.b.length>b&&(this.b.length=b),a=this.b),this.buffer=a},a("Zlib.RawInflate",c),a("Zlib.RawInflate.prototype.decompress",c.prototype.u);var C,D,E,F,G={ADAPTIVE:j,BLOCK:i};if(Object.keys)C=Object.keys(G);else for(D in C=[],E=0,G)C[E++]=D;for(E=0,F=C.length;F>E;++E)D=C[E],a("Zlib.RawInflate.BufferType."+D,G[D])}).call(this)},{}],15:[function(a,b,c){(function(){"use strict";function a(a){throw a}function b(a,b){var c=a.split("."),d=w;!(c[0]in d)&&d.execScript&&d.execScript("var "+c[0]);for(var e;c.length&&(e=c.shift());)c.length||b===u?d=d[e]?d[e]:d[e]={}:d[e]=b}function c(b,c){this.index="number"==typeof c?c:0,this.i=0,this.buffer=b instanceof(x?Uint8Array:Array)?b:new(x?Uint8Array:Array)(32768),2*this.buffer.length<=this.index&&a(Error("invalid index")),this.buffer.length<=this.index&&this.f()}function d(a){this.buffer=new(x?Uint16Array:Array)(2*a),this.length=0}function e(a){var b,c,d,e,f,g,h,i,j,k,l=a.length,m=0,n=Number.POSITIVE_INFINITY;for(i=0;l>i;++i)a[i]>m&&(m=a[i]),a[i]=d;){for(i=0;l>i;++i)if(a[i]===d){for(g=0,h=e,j=0;d>j;++j)g=g<<1|1&h,h>>=1;for(k=d<<16|i,j=g;b>j;j+=f)c[j]=k;++e}++d,e<<=1,f<<=1}return[c,m,n]}function f(a,b){this.h=F,this.w=0,this.input=x&&a instanceof Array?new Uint8Array(a):a,this.b=0,b&&(b.lazy&&(this.w=b.lazy),"number"==typeof b.compressionType&&(this.h=b.compressionType),b.outputBuffer&&(this.a=x&&b.outputBuffer instanceof Array?new Uint8Array(b.outputBuffer):b.outputBuffer),"number"==typeof b.outputIndex&&(this.b=b.outputIndex)),this.a||(this.a=new(x?Uint8Array:Array)(32768))}function g(a,b){this.length=a,this.H=b}function h(b,c){function d(b,c){var d,e=b.H,f=[],g=0;d=J[b.length],f[g++]=65535&d,f[g++]=d>>16&255,f[g++]=d>>24;var h;switch(v){case 1===e:h=[0,e-1,0];break;case 2===e:h=[1,e-2,0];break;case 3===e:h=[2,e-3,0];break;case 4===e:h=[3,e-4,0];break;case 6>=e:h=[4,e-5,1];break;case 8>=e:h=[5,e-7,1];break;case 12>=e:h=[6,e-9,2];break;case 16>=e:h=[7,e-13,2];break;case 24>=e:h=[8,e-17,3];break;case 32>=e:h=[9,e-25,3];break;case 48>=e:h=[10,e-33,4];break;case 64>=e:h=[11,e-49,4];break;case 96>=e:h=[12,e-65,5];break;case 128>=e:h=[13,e-97,5];break;case 192>=e:h=[14,e-129,6];break;case 256>=e:h=[15,e-193,6];break;case 384>=e:h=[16,e-257,7];break;case 512>=e:h=[17,e-385,7];break;case 768>=e:h=[18,e-513,8];break;case 1024>=e:h=[19,e-769,8];break;case 1536>=e:h=[20,e-1025,9];break;case 2048>=e:h=[21,e-1537,9];break;case 3072>=e:h=[22,e-2049,10];break;case 4096>=e:h=[23,e-3073,10];break;case 6144>=e:h=[24,e-4097,11];break;case 8192>=e:h=[25,e-6145,11];break;case 12288>=e:h=[26,e-8193,12];break;case 16384>=e:h=[27,e-12289,12];break;case 24576>=e:h=[28,e-16385,13];break;case 32768>=e:h=[29,e-24577,13];break;default:a("invalid distance")}d=h,f[g++]=d[0],f[g++]=d[1],f[g++]=d[2];var i,j;for(i=0,j=f.length;j>i;++i)p[q++]=f[i];s[f[0]]++,t[f[3]]++,r=b.length+c-1,m=null}var e,f,g,h,j,k,l,m,n,o={},p=x?new Uint16Array(2*c.length):[],q=0,r=0,s=new(x?Uint32Array:Array)(286),t=new(x?Uint32Array:Array)(30),w=b.w;if(!x){for(g=0;285>=g;)s[g++]=0;for(g=0;29>=g;)t[g++]=0}for(s[256]=1,e=0,f=c.length;f>e;++e){for(g=j=0,h=3;h>g&&e+g!==f;++g)j=j<<8|c[e+g];if(o[j]===u&&(o[j]=[]),k=o[j],!(0=f){for(m&&d(m,-1),g=0,h=f-e;h>g;++g)n=c[e+g],p[q++]=n,++s[n];break}0h;h++){if(d=c[j-h-1],f=3,k>3){for(i=k;i>3;i--)if(a[d+i-1]!==a[b+i-1])continue a;f=k}for(;258>f&&l>b+f&&a[d+f]===a[b+f];)++f;if(f>k&&(e=d,k=f),258===f)break}return new g(k,b-e)}function j(a,b){var c,e,f,g,h,i=a.length,j=new d(572),l=new(x?Uint8Array:Array)(i);if(!x)for(g=0;i>g;g++)l[g]=0;for(g=0;i>g;++g)0g;++g)c[g]=j.pop(),e[g]=c[g].value;for(f=k(e,e.length,b),g=0,h=c.length;h>g;++g)l[c[g].index]=f[g];return l}function k(a,b,c){function d(a){var c=n[a][o[a]];c===b?(d(a+1),d(a+1)):--l[c],++o[a]}var e,f,g,h,i,j=new(x?Uint16Array:Array)(c),k=new(x?Uint8Array:Array)(c),l=new(x?Uint8Array:Array)(b),m=Array(c),n=Array(c),o=Array(c),p=(1<f;++f)q>p?k[f]=0:(k[f]=1,p-=q),p<<=1,j[c-2-f]=(j[c-1-f]/2|0)+b;for(j[0]=k[0],m[0]=Array(j[0]),n[0]=Array(j[0]),f=1;c>f;++f)j[f]>2*j[f-1]+k[f]&&(j[f]=2*j[f-1]+k[f]),m[f]=Array(j[f]),n[f]=Array(j[f]);for(e=0;b>e;++e)l[e]=c;for(g=0;ge;++e)o[e]=0;for(1===k[c-1]&&(--l[0],++o[c-1]),f=c-2;f>=0;--f){for(h=e=0,i=o[f+1],g=0;ga[e]?(m[f][g]=h,n[f][g]=b,i+=2):(m[f][g]=a[e],n[f][g]=e,++e);o[f]=0,1===k[f]&&d(f)}return l}function l(a){var b,c,d,e,f=new(x?Uint16Array:Array)(a.length),g=[],h=[],i=0;for(b=0,c=a.length;c>b;b++)g[a[b]]=(0|g[a[b]])+1;for(b=1,c=16;c>=b;b++)h[b]=i,i+=0|g[b],i<<=1;for(b=0,c=a.length;c>b;b++)for(i=h[a[b]],h[a[b]]+=1,d=f[b]=0,e=a[b];e>d;d++)f[b]=f[b]<<1|1&i,i>>>=1;return f}function m(b,c){switch(this.l=[],this.m=32768,this.e=this.g=this.c=this.q=0,this.input=x?new Uint8Array(b):b,this.s=!1,this.n=L,this.C=!1,(c||!(c={}))&&(c.index&&(this.c=c.index),c.bufferSize&&(this.m=c.bufferSize),c.bufferType&&(this.n=c.bufferType),c.resize&&(this.C=c.resize)),this.n){case K:this.b=32768,this.a=new(x?Uint8Array:Array)(32768+this.m+258);break;case L:this.b=0,this.a=new(x?Uint8Array:Array)(this.m),this.f=this.K,this.t=this.I,this.o=this.J;break;default:a(Error("invalid inflate mode"))}}function n(b,c){for(var d,e=b.g,f=b.e,g=b.input,h=b.c,i=g.length;c>f;)h>=i&&a(Error("input buffer is broken")),e|=g[h++]<>>c,b.e=f-c,b.c=h,d}function o(a,b){for(var c,d,e=a.g,f=a.e,g=a.input,h=a.c,i=g.length,j=b[0],k=b[1];k>f&&!(h>=i);)e|=g[h++]<>>16,a.g=e>>d,a.e=f-d,a.c=h,65535&c}function p(a){function b(a,b,c){var d,e,f,g=this.z;for(f=0;a>f;)switch(d=o(this,b)){case 16:for(e=3+n(this,2);e--;)c[f++]=g;break;case 17:for(e=3+n(this,3);e--;)c[f++]=0;g=0;break;case 18:for(e=11+n(this,7);e--;)c[f++]=0;g=0;break;default:g=c[f++]=d}return this.z=g,c}var c,d,f,g,h=n(a,5)+257,i=n(a,5)+1,j=n(a,4)+4,k=new(x?Uint8Array:Array)(Q.length);for(g=0;j>g;++g)k[Q[g]]=n(a,3);if(!x)for(g=j,j=k.length;j>g;++g)k[Q[g]]=0;c=e(k),d=new(x?Uint8Array:Array)(h),f=new(x?Uint8Array:Array)(i),a.z=0,a.o(e(b.call(a,h,c,d)),e(b.call(a,i,c,f)))}function q(a){if("string"==typeof a){var b,c,d=a.split("");for(b=0,c=d.length;c>b;b++)d[b]=(255&d[b].charCodeAt(0))>>>0;a=d}for(var e,f=1,g=0,h=a.length,i=0;h>0;){e=h>1024?1024:h,h-=e;do f+=a[i++],g+=f;while(--e);f%=65521,g%=65521}return(g<<16|f)>>>0}function r(b,c){var d,e;switch(this.input=b,this.c=0,(c||!(c={}))&&(c.index&&(this.c=c.index),c.verify&&(this.N=c.verify)),d=b[this.c++],e=b[this.c++],15&d){case da:this.method=da;break;default:a(Error("unsupported compression method"))}0!==((d<<8)+e)%31&&a(Error("invalid fcheck flag:"+((d<<8)+e)%31)),32&e&&a(Error("fdict flag is not supported")),this.B=new m(b,{index:this.c,bufferSize:c.bufferSize,bufferType:c.bufferType,resize:c.resize})}function s(a,b){this.input=a,this.a=new(x?Uint8Array:Array)(32768),this.h=ea.k;var c,d={};!b&&(b={})||"number"!=typeof b.compressionType||(this.h=b.compressionType);for(c in b)d[c]=b[c];d.outputBuffer=this.a,this.A=new f(this.input,d)}function t(a,c){var d,e,f,g; +/*! OpenPGPjs.org this is LGPL licensed code, see LICENSE/our website for more information.- v1.2.0 - 2015-09-24 */!function(a){"object"==typeof exports?module.exports=a():"function"==typeof define&&define.amd?define(a):"undefined"!=typeof window?window.openpgp=a():"undefined"!=typeof global?global.openpgp=a():"undefined"!=typeof self&&(self.openpgp=a())}(function(){return function a(b,c,d){function e(g,h){if(!c[g]){if(!b[g]){var i="function"==typeof require&&require;if(!h&&i)return i(g,!0);if(f)return f(g,!0);throw new Error("Cannot find module '"+g+"'")}var j=c[g]={exports:{}};b[g][0].call(j.exports,function(a){var c=b[g][1][a];return e(c?c:a)},j,j.exports,a,b,c,d)}return c[g].exports}for(var f="function"==typeof require&&require,g=0;g0)){var d=c.shift();d()}},!0),function(a){c.push(a),window.postMessage("process-tick","*")}}return function(a){setTimeout(a,0)}}(),d.title="browser",d.browser=!0,d.env={},d.argv=[],d.binding=function(a){throw new Error("process.binding is not supported")},d.cwd=function(){return"/"},d.chdir=function(a){throw new Error("process.chdir is not supported")}},{}],2:[function(a,b,c){"use strict";var d=a("./promise/promise").Promise,e=a("./promise/polyfill").polyfill;c.Promise=d,c.polyfill=e},{"./promise/polyfill":6,"./promise/promise":7}],3:[function(a,b,c){"use strict";function d(a){var b=this;if(!e(a))throw new TypeError("You must pass an array to all.");return new b(function(b,c){function d(a){return function(b){e(a,b)}}function e(a,c){h[a]=c,0===--i&&b(h)}var g,h=[],i=a.length;0===i&&b([]);for(var j=0;jb;++b)e[b]=c[b];return a.buffer=e}function d(a){this.buffer=new(o?Uint16Array:Array)(2*a),this.length=0}function e(a,b){this.e=w,this.f=0,this.input=o&&a instanceof Array?new Uint8Array(a):a,this.c=0,b&&(b.lazy&&(this.f=b.lazy),"number"==typeof b.compressionType&&(this.e=b.compressionType),b.outputBuffer&&(this.b=o&&b.outputBuffer instanceof Array?new Uint8Array(b.outputBuffer):b.outputBuffer),"number"==typeof b.outputIndex&&(this.c=b.outputIndex)),this.b||(this.b=new(o?Uint8Array:Array)(32768))}function f(a,b){this.length=a,this.g=b}function g(a,b){function c(a,b){var c,d=a.g,e=[],f=0;c=z[a.length],e[f++]=65535&c,e[f++]=c>>16&255,e[f++]=c>>24;var g;switch(m){case 1===d:g=[0,d-1,0];break;case 2===d:g=[1,d-2,0];break;case 3===d:g=[2,d-3,0];break;case 4===d:g=[3,d-4,0];break;case 6>=d:g=[4,d-5,1];break;case 8>=d:g=[5,d-7,1];break;case 12>=d:g=[6,d-9,2];break;case 16>=d:g=[7,d-13,2];break;case 24>=d:g=[8,d-17,3];break;case 32>=d:g=[9,d-25,3];break;case 48>=d:g=[10,d-33,4];break;case 64>=d:g=[11,d-49,4];break;case 96>=d:g=[12,d-65,5];break;case 128>=d:g=[13,d-97,5];break;case 192>=d:g=[14,d-129,6];break;case 256>=d:g=[15,d-193,6];break;case 384>=d:g=[16,d-257,7];break;case 512>=d:g=[17,d-385,7];break;case 768>=d:g=[18,d-513,8];break;case 1024>=d:g=[19,d-769,8];break;case 1536>=d:g=[20,d-1025,9];break;case 2048>=d:g=[21,d-1537,9];break;case 3072>=d:g=[22,d-2049,10];break;case 4096>=d:g=[23,d-3073,10];break;case 6144>=d:g=[24,d-4097,11];break;case 8192>=d:g=[25,d-6145,11];break;case 12288>=d:g=[26,d-8193,12];break;case 16384>=d:g=[27,d-12289,12];break;case 24576>=d:g=[28,d-16385,13];break;case 32768>=d:g=[29,d-24577,13];break;default:throw"invalid distance"}c=g,e[f++]=c[0],e[f++]=c[1],e[f++]=c[2];var h,i;for(h=0,i=e.length;i>h;++h)r[s++]=e[h];u[e[0]]++,v[e[3]]++,t=a.length+b-1,n=null}var d,e,f,g,i,j,k,n,p,q={},r=o?new Uint16Array(2*b.length):[],s=0,t=0,u=new(o?Uint32Array:Array)(286),v=new(o?Uint32Array:Array)(30),w=a.f;if(!o){for(f=0;285>=f;)u[f++]=0;for(f=0;29>=f;)v[f++]=0}for(u[256]=1,d=0,e=b.length;e>d;++d){for(f=i=0,g=3;g>f&&d+f!==e;++f)i=i<<8|b[d+f];if(q[i]===l&&(q[i]=[]),j=q[i],!(0=e){for(n&&c(n,-1),f=0,g=e-d;g>f;++f)p=b[d+f],r[s++]=p,++u[p];break}0h;h++){if(d=c[j-h-1],g=3,k>3){for(i=k;i>3;i--)if(a[d+i-1]!==a[b+i-1])continue a;g=k}for(;258>g&&l>b+g&&a[d+g]===a[b+g];)++g;if(g>k&&(e=d,k=g),258===g)break}return new f(k,b-e)}function i(a,b){var c,e,f,g,h,i=a.length,k=new d(572),l=new(o?Uint8Array:Array)(i);if(!o)for(g=0;i>g;g++)l[g]=0;for(g=0;i>g;++g)0g;++g)c[g]=k.pop(),e[g]=c[g].value;for(f=j(e,e.length,b),g=0,h=c.length;h>g;++g)l[c[g].index]=f[g];return l}function j(a,b,c){function d(a){var c=n[a][p[a]];c===b?(d(a+1),d(a+1)):--l[c],++p[a]}var e,f,g,h,i,j=new(o?Uint16Array:Array)(c),k=new(o?Uint8Array:Array)(c),l=new(o?Uint8Array:Array)(b),m=Array(c),n=Array(c),p=Array(c),q=(1<f;++f)r>q?k[f]=0:(k[f]=1,q-=r),q<<=1,j[c-2-f]=(j[c-1-f]/2|0)+b;for(j[0]=k[0],m[0]=Array(j[0]),n[0]=Array(j[0]),f=1;c>f;++f)j[f]>2*j[f-1]+k[f]&&(j[f]=2*j[f-1]+k[f]),m[f]=Array(j[f]),n[f]=Array(j[f]);for(e=0;b>e;++e)l[e]=c;for(g=0;ge;++e)p[e]=0;for(1===k[c-1]&&(--l[0],++p[c-1]),f=c-2;f>=0;--f){for(h=e=0,i=p[f+1],g=0;ga[e]?(m[f][g]=h,n[f][g]=b,i+=2):(m[f][g]=a[e],n[f][g]=e,++e);p[f]=0,1===k[f]&&d(f)}return l}function k(a){var b,c,d,e,f=new(o?Uint16Array:Array)(a.length),g=[],h=[],i=0;for(b=0,c=a.length;c>b;b++)g[a[b]]=(0|g[a[b]])+1;for(b=1,c=16;c>=b;b++)h[b]=i,i+=0|g[b],i<<=1;for(b=0,c=a.length;c>b;b++)for(i=h[a[b]],h[a[b]]+=1,d=f[b]=0,e=a[b];e>d;d++)f[b]=f[b]<<1|1&i,i>>>=1;return f}var l=void 0,m=!0,n=this,o="undefined"!=typeof Uint8Array&&"undefined"!=typeof Uint16Array&&"undefined"!=typeof Uint32Array&&"undefined"!=typeof DataView;b.prototype.a=function(a,b,d){var e,f=this.buffer,g=this.index,h=this.d,i=f[g];if(d&&b>1&&(a=b>8?(u[255&a]<<24|u[a>>>8&255]<<16|u[a>>>16&255]<<8|u[a>>>24&255])>>32-b:u[a]>>8-b),8>b+h)i=i<e;++e)i=i<<1|a>>b-e-1&1,8===++h&&(h=0,f[g++]=u[i],i=0,g===f.length&&(f=c(this)));f[g]=i,this.buffer=f,this.d=h,this.index=g},b.prototype.finish=function(){var a,b=this.buffer,c=this.index;return 0p;++p){for(var r=p,s=r,t=7,r=r>>>1;r;r>>>=1)s<<=1,s|=1&r,--t;q[p]=(s<>>0}var u=q;d.prototype.getParent=function(a){return 2*((a-2)/4|0)},d.prototype.push=function(a,b){var c,d,e,f=this.buffer;for(c=this.length,f[this.length++]=b,f[this.length++]=a;c>0&&(d=this.getParent(c),f[c]>f[d]);)e=f[c],f[c]=f[d],f[d]=e,e=f[c+1],f[c+1]=f[d+1],f[d+1]=e,c=d;return this.length},d.prototype.pop=function(){var a,b,c,d,e,f=this.buffer;for(b=f[0],a=f[1],this.length-=2,f[0]=f[this.length],f[1]=f[this.length+1],e=0;(d=2*e+2,!(d>=this.length))&&(d+2f[d]&&(d+=2),f[d]>f[e]);)c=f[e],f[e]=f[d],f[d]=c,c=f[e+1],f[e+1]=f[d+1],f[d+1]=c,e=d;return{index:a,value:b,length:this.length}};var v,w=2,x=[];for(v=0;288>v;v++)switch(m){case 143>=v:x.push([v+48,8]);break;case 255>=v:x.push([v-144+400,9]);break;case 279>=v:x.push([v-256+0,7]);break;case 287>=v:x.push([v-280+192,8]);break;default:throw"invalid literal: "+v}e.prototype.h=function(){var a,c,d,e,f=this.input;switch(this.e){case 0:for(d=0,e=f.length;e>d;){c=o?f.subarray(d,d+65535):f.slice(d,d+65535),d+=c.length;var h=c,j=d===e,n=l,p=l,q=l,r=l,s=l,t=this.b,u=this.c;if(o){for(t=new Uint8Array(this.b.buffer);t.length<=u+h.length+5;)t=new Uint8Array(t.length<<1);t.set(this.b)}if(n=j?1:0,t[u++]=0|n,p=h.length,q=~p+65536&65535,t[u++]=255&p,t[u++]=p>>>8&255,t[u++]=255&q,t[u++]=q>>>8&255,o)t.set(h,u),u+=h.length,t=t.subarray(0,u);else{for(r=0,s=h.length;s>r;++r)t[u++]=h[r];t.length=u}this.c=u,this.b=t}break;case 1:var v=new b(o?new Uint8Array(this.b.buffer):this.b,this.c);v.a(1,1,m),v.a(1,2,m);var y,z,A,B=g(this,f);for(y=0,z=B.length;z>y;y++)if(A=B[y],b.prototype.a.apply(v,x[A]),A>256)v.a(B[++y],B[++y],m),v.a(B[++y],5),v.a(B[++y],B[++y],m);else if(256===A)break;this.b=v.finish(),this.c=this.b.length;break;case w:var C,D,E,F,G,H,I,J,K,L,M,N,O,P,Q,R=new b(o?new Uint8Array(this.b.buffer):this.b,this.c),S=[16,17,18,0,8,7,9,6,10,5,11,4,12,3,13,2,14,1,15],T=Array(19);for(C=w,R.a(1,1,m),R.a(C,2,m),D=g(this,f),H=i(this.j,15),I=k(H),J=i(this.i,7),K=k(J),E=286;E>257&&0===H[E-1];E--);for(F=30;F>1&&0===J[F-1];F--);var U,V,W,X,Y,Z,$=E,_=F,aa=new(o?Uint32Array:Array)($+_),ba=new(o?Uint32Array:Array)(316),ca=new(o?Uint8Array:Array)(19);for(U=V=0;$>U;U++)aa[V++]=H[U];for(U=0;_>U;U++)aa[V++]=J[U];if(!o)for(U=0,X=ca.length;X>U;++U)ca[U]=0;for(U=Y=0,X=aa.length;X>U;U+=V){for(V=1;X>U+V&&aa[U+V]===aa[U];++V);if(W=V,0===aa[U])if(3>W)for(;00;)Z=138>W?W:138,Z>W-3&&W>Z&&(Z=W-3),10>=Z?(ba[Y++]=17,ba[Y++]=Z-3,ca[17]++):(ba[Y++]=18,ba[Y++]=Z-11,ca[18]++),W-=Z;else if(ba[Y++]=aa[U],ca[aa[U]]++,W--,3>W)for(;00;)Z=6>W?W:6,Z>W-3&&W>Z&&(Z=W-3),ba[Y++]=16,ba[Y++]=Z-3,ca[16]++,W-=Z}for(a=o?ba.subarray(0,Y):ba.slice(0,Y),L=i(ca,7),P=0;19>P;P++)T[P]=L[S[P]];for(G=19;G>4&&0===T[G-1];G--);for(M=k(L),R.a(E-257,5,m),R.a(F-1,5,m),R.a(G-4,4,m),P=0;G>P;P++)R.a(T[P],3,m);for(P=0,Q=a.length;Q>P;P++)if(N=a[P],R.a(M[N],L[N],m),N>=16){switch(P++,N){case 16:O=2;break;case 17:O=3;break;case 18:O=7;break;default:throw"invalid code: "+N}R.a(a[P],O,m)}var da,ea,fa,ga,ha,ia,ja,ka,la=[I,H],ma=[K,J];for(ha=la[0],ia=la[1],ja=ma[0],ka=ma[1],da=0,ea=D.length;ea>da;++da)if(fa=D[da],R.a(ha[fa],ia[fa],m),fa>256)R.a(D[++da],D[++da],m),ga=D[++da],R.a(ja[ga],ka[ga],m),R.a(D[++da],D[++da],m);else if(256===fa)break;this.b=R.finish(),this.c=this.b.length;break;default:throw"invalid compression type"}return this.b};var y=function(){function a(a){switch(m){case 3===a:return[257,a-3,0];case 4===a:return[258,a-4,0];case 5===a:return[259,a-5,0];case 6===a:return[260,a-6,0];case 7===a:return[261,a-7,0];case 8===a:return[262,a-8,0];case 9===a:return[263,a-9,0];case 10===a:return[264,a-10,0];case 12>=a:return[265,a-11,1];case 14>=a:return[266,a-13,1];case 16>=a:return[267,a-15,1];case 18>=a:return[268,a-17,1];case 22>=a:return[269,a-19,2];case 26>=a:return[270,a-23,2];case 30>=a:return[271,a-27,2];case 34>=a:return[272,a-31,2];case 42>=a:return[273,a-35,3];case 50>=a:return[274,a-43,3];case 58>=a:return[275,a-51,3];case 66>=a:return[276,a-59,3];case 82>=a:return[277,a-67,4];case 98>=a:return[278,a-83,4];case 114>=a:return[279,a-99,4];case 130>=a:return[280,a-115,4];case 162>=a:return[281,a-131,5];case 194>=a:return[282,a-163,5];case 226>=a:return[283,a-195,5];case 257>=a:return[284,a-227,5];case 258===a:return[285,a-258,0];default:throw"invalid length: "+a}}var b,c,d=[];for(b=3;258>=b;b++)c=a(b),d[b]=c[2]<<24|c[1]<<16|c[0];return d}(),z=o?new Uint32Array(y):y;a("Zlib.RawDeflate",e),a("Zlib.RawDeflate.prototype.compress",e.prototype.h);var A,B,C,D,E={NONE:0,FIXED:1,DYNAMIC:w};if(Object.keys)A=Object.keys(E);else for(B in A=[],C=0,E)A[C++]=B;for(C=0,D=A.length;D>C;++C)B=A[C],a("Zlib.RawDeflate.CompressionType."+B,E[B])}).call(this)},{}],14:[function(a,b,c){(function(){"use strict";function a(a,b){var c=a.split("."),d=g;!(c[0]in d)&&d.execScript&&d.execScript("var "+c[0]);for(var e;c.length&&(e=c.shift());)c.length||void 0===b?d=d[e]?d[e]:d[e]={}:d[e]=b}function b(a){var b,c,d,e,f,g,i,j,k,l,m=a.length,n=0,o=Number.POSITIVE_INFINITY;for(j=0;m>j;++j)a[j]>n&&(n=a[j]),a[j]=d;){for(j=0;m>j;++j)if(a[j]===d){for(g=0,i=e,k=0;d>k;++k)g=g<<1|1&i,i>>=1;for(l=d<<16|j,k=g;b>k;k+=f)c[k]=l;++e}++d,e<<=1,f<<=1}return[c,n,o]}function c(a,b){switch(this.g=[],this.h=32768,this.c=this.f=this.d=this.k=0,this.input=h?new Uint8Array(a):a,this.l=!1,this.i=j,this.q=!1,(b||!(b={}))&&(b.index&&(this.d=b.index),b.bufferSize&&(this.h=b.bufferSize),b.bufferType&&(this.i=b.bufferType),b.resize&&(this.q=b.resize)),this.i){case i:this.a=32768,this.b=new(h?Uint8Array:Array)(32768+this.h+258);break;case j:this.a=0,this.b=new(h?Uint8Array:Array)(this.h),this.e=this.v,this.m=this.s,this.j=this.t;break;default:throw Error("invalid inflate mode")}}function d(a,b){for(var c,d=a.f,e=a.c,f=a.input,g=a.d,h=f.length;b>e;){if(g>=h)throw Error("input buffer is broken");d|=f[g++]<>>b,a.c=e-b,a.d=g,c}function e(a,b){for(var c,d,e=a.f,f=a.c,g=a.input,h=a.d,i=g.length,j=b[0],k=b[1];k>f&&!(h>=i);)e|=g[h++]<>>16,a.f=e>>d,a.c=f-d,a.d=h,65535&c}function f(a){function c(a,b,c){var f,g,h,i=this.p;for(h=0;a>h;)switch(f=e(this,b)){case 16:for(g=3+d(this,2);g--;)c[h++]=i;break;case 17:for(g=3+d(this,3);g--;)c[h++]=0;i=0;break;case 18:for(g=11+d(this,7);g--;)c[h++]=0;i=0;break;default:i=c[h++]=f}return this.p=i,c}var f,g,i,j,k=d(a,5)+257,l=d(a,5)+1,m=d(a,4)+4,o=new(h?Uint8Array:Array)(n.length);for(j=0;m>j;++j)o[n[j]]=d(a,3);if(!h)for(j=m,m=o.length;m>j;++j)o[n[j]]=0;f=b(o),g=new(h?Uint8Array:Array)(k),i=new(h?Uint8Array:Array)(l),a.p=0,a.j(b(c.call(a,k,f,g)),b(c.call(a,l,f,i)))}var g=this,h="undefined"!=typeof Uint8Array&&"undefined"!=typeof Uint16Array&&"undefined"!=typeof Uint32Array&&"undefined"!=typeof DataView,i=0,j=1;c.prototype.u=function(){for(;!this.l;){var a=d(this,3);switch(1&a&&(this.l=!0),a>>>=1){case 0:var b=this.input,c=this.d,e=this.b,g=this.a,k=b.length,l=void 0,m=void 0,n=e.length,o=void 0;if(this.c=this.f=0,c+1>=k)throw Error("invalid uncompressed block header: LEN");if(l=b[c++]|b[c++]<<8,c+1>=k)throw Error("invalid uncompressed block header: NLEN");if(m=b[c++]|b[c++]<<8,l===~m)throw Error("invalid uncompressed block header: length verify");if(c+l>b.length)throw Error("input buffer is broken");switch(this.i){case i:for(;g+l>e.length;){if(o=n-g,l-=o,h)e.set(b.subarray(c,c+o),g),g+=o,c+=o;else for(;o--;)e[g++]=b[c++];this.a=g,e=this.e(),g=this.a}break;case j:for(;g+l>e.length;)e=this.e({o:2});break;default:throw Error("invalid inflate mode")}if(h)e.set(b.subarray(c,c+l),g),g+=l,c+=l;else for(;l--;)e[g++]=b[c++];this.d=c,this.a=g,this.b=e;break;case 1:this.j(z,B);break;case 2:f(this);break;default:throw Error("unknown BTYPE: "+a)}}return this.m()};var k,l,m=[16,17,18,0,8,7,9,6,10,5,11,4,12,3,13,2,14,1,15],n=h?new Uint16Array(m):m,o=[3,4,5,6,7,8,9,10,11,13,15,17,19,23,27,31,35,43,51,59,67,83,99,115,131,163,195,227,258,258,258],p=h?new Uint16Array(o):o,q=[0,0,0,0,0,0,0,0,1,1,1,1,2,2,2,2,3,3,3,3,4,4,4,4,5,5,5,5,0,0,0],r=h?new Uint8Array(q):q,s=[1,2,3,4,5,7,9,13,17,25,33,49,65,97,129,193,257,385,513,769,1025,1537,2049,3073,4097,6145,8193,12289,16385,24577],t=h?new Uint16Array(s):s,u=[0,0,0,0,1,1,2,2,3,3,4,4,5,5,6,6,7,7,8,8,9,9,10,10,11,11,12,12,13,13],v=h?new Uint8Array(u):u,w=new(h?Uint8Array:Array)(288);for(k=0,l=w.length;l>k;++k)w[k]=143>=k?8:255>=k?9:279>=k?7:8;var x,y,z=b(w),A=new(h?Uint8Array:Array)(30);for(x=0,y=A.length;y>x;++x)A[x]=5;var B=b(A);c.prototype.j=function(a,b){var c=this.b,f=this.a;this.n=a;for(var g,h,i,j,k=c.length-258;256!==(g=e(this,a));)if(256>g)f>=k&&(this.a=f,c=this.e(),f=this.a),c[f++]=g;else for(h=g-257,j=p[h],0=k&&(this.a=f,c=this.e(),f=this.a);j--;)c[f]=c[f++-i];for(;8<=this.c;)this.c-=8,this.d--;this.a=f},c.prototype.t=function(a,b){var c=this.b,f=this.a;this.n=a;for(var g,h,i,j,k=c.length;256!==(g=e(this,a));)if(256>g)f>=k&&(c=this.e(),k=c.length),c[f++]=g;else for(h=g-257,j=p[h],0k&&(c=this.e(),k=c.length);j--;)c[f]=c[f++-i];for(;8<=this.c;)this.c-=8,this.d--;this.a=f},c.prototype.e=function(){var a,b,c=new(h?Uint8Array:Array)(this.a-32768),d=this.a-32768,e=this.b;if(h)c.set(e.subarray(32768,c.length));else for(a=0,b=c.length;b>a;++a)c[a]=e[a+32768];if(this.g.push(c),this.k+=c.length,h)e.set(e.subarray(d,d+32768));else for(a=0;32768>a;++a)e[a]=e[d+a];return this.a=32768,e},c.prototype.v=function(a){var b,c,d,e,f=this.input.length/this.d+1|0,g=this.input,i=this.b;return a&&("number"==typeof a.o&&(f=a.o),"number"==typeof a.r&&(f+=a.r)),2>f?(c=(g.length-this.d)/this.n[2],e=258*(c/2)|0,d=eb;++b)for(a=i[b],d=0,e=a.length;e>d;++d)j[f++]=a[d];for(b=32768,c=this.a;c>b;++b)j[f++]=g[b];return this.g=[],this.buffer=j},c.prototype.s=function(){var a,b=this.a;return h?this.q?(a=new Uint8Array(b),a.set(this.b.subarray(0,b))):a=this.b.subarray(0,b):(this.b.length>b&&(this.b.length=b),a=this.b),this.buffer=a},a("Zlib.RawInflate",c),a("Zlib.RawInflate.prototype.decompress",c.prototype.u);var C,D,E,F,G={ADAPTIVE:j,BLOCK:i};if(Object.keys)C=Object.keys(G);else for(D in C=[],E=0,G)C[E++]=D;for(E=0,F=C.length;F>E;++E)D=C[E],a("Zlib.RawInflate.BufferType."+D,G[D])}).call(this)},{}],15:[function(a,b,c){(function(){"use strict";function a(a){throw a}function b(a,b){var c=a.split("."),d=w;!(c[0]in d)&&d.execScript&&d.execScript("var "+c[0]);for(var e;c.length&&(e=c.shift());)c.length||b===u?d=d[e]?d[e]:d[e]={}:d[e]=b}function c(b,c){this.index="number"==typeof c?c:0,this.i=0,this.buffer=b instanceof(x?Uint8Array:Array)?b:new(x?Uint8Array:Array)(32768),2*this.buffer.length<=this.index&&a(Error("invalid index")),this.buffer.length<=this.index&&this.f()}function d(a){this.buffer=new(x?Uint16Array:Array)(2*a),this.length=0}function e(a){var b,c,d,e,f,g,h,i,j,k,l=a.length,m=0,n=Number.POSITIVE_INFINITY;for(i=0;l>i;++i)a[i]>m&&(m=a[i]),a[i]=d;){for(i=0;l>i;++i)if(a[i]===d){for(g=0,h=e,j=0;d>j;++j)g=g<<1|1&h,h>>=1;for(k=d<<16|i,j=g;b>j;j+=f)c[j]=k;++e}++d,e<<=1,f<<=1}return[c,m,n]}function f(a,b){this.h=F,this.w=0,this.input=x&&a instanceof Array?new Uint8Array(a):a,this.b=0,b&&(b.lazy&&(this.w=b.lazy),"number"==typeof b.compressionType&&(this.h=b.compressionType),b.outputBuffer&&(this.a=x&&b.outputBuffer instanceof Array?new Uint8Array(b.outputBuffer):b.outputBuffer),"number"==typeof b.outputIndex&&(this.b=b.outputIndex)),this.a||(this.a=new(x?Uint8Array:Array)(32768))}function g(a,b){this.length=a,this.H=b}function h(b,c){function d(b,c){var d,e=b.H,f=[],g=0;d=J[b.length],f[g++]=65535&d,f[g++]=d>>16&255,f[g++]=d>>24;var h;switch(v){case 1===e:h=[0,e-1,0];break;case 2===e:h=[1,e-2,0];break;case 3===e:h=[2,e-3,0];break;case 4===e:h=[3,e-4,0];break;case 6>=e:h=[4,e-5,1];break;case 8>=e:h=[5,e-7,1];break;case 12>=e:h=[6,e-9,2];break;case 16>=e:h=[7,e-13,2];break;case 24>=e:h=[8,e-17,3];break;case 32>=e:h=[9,e-25,3];break;case 48>=e:h=[10,e-33,4];break;case 64>=e:h=[11,e-49,4];break;case 96>=e:h=[12,e-65,5];break;case 128>=e:h=[13,e-97,5];break;case 192>=e:h=[14,e-129,6];break;case 256>=e:h=[15,e-193,6];break;case 384>=e:h=[16,e-257,7];break;case 512>=e:h=[17,e-385,7];break;case 768>=e:h=[18,e-513,8];break;case 1024>=e:h=[19,e-769,8];break;case 1536>=e:h=[20,e-1025,9];break;case 2048>=e:h=[21,e-1537,9];break;case 3072>=e:h=[22,e-2049,10];break;case 4096>=e:h=[23,e-3073,10];break;case 6144>=e:h=[24,e-4097,11];break;case 8192>=e:h=[25,e-6145,11];break;case 12288>=e:h=[26,e-8193,12];break;case 16384>=e:h=[27,e-12289,12];break;case 24576>=e:h=[28,e-16385,13];break;case 32768>=e:h=[29,e-24577,13];break;default:a("invalid distance")}d=h,f[g++]=d[0],f[g++]=d[1],f[g++]=d[2];var i,j;for(i=0,j=f.length;j>i;++i)p[q++]=f[i];s[f[0]]++,t[f[3]]++,r=b.length+c-1,m=null}var e,f,g,h,j,k,l,m,n,o={},p=x?new Uint16Array(2*c.length):[],q=0,r=0,s=new(x?Uint32Array:Array)(286),t=new(x?Uint32Array:Array)(30),w=b.w;if(!x){for(g=0;285>=g;)s[g++]=0;for(g=0;29>=g;)t[g++]=0}for(s[256]=1,e=0,f=c.length;f>e;++e){for(g=j=0,h=3;h>g&&e+g!==f;++g)j=j<<8|c[e+g];if(o[j]===u&&(o[j]=[]),k=o[j],!(0=f){for(m&&d(m,-1),g=0,h=f-e;h>g;++g)n=c[e+g],p[q++]=n,++s[n];break}0h;h++){if(d=c[j-h-1],f=3,k>3){for(i=k;i>3;i--)if(a[d+i-1]!==a[b+i-1])continue a;f=k}for(;258>f&&l>b+f&&a[d+f]===a[b+f];)++f;if(f>k&&(e=d,k=f),258===f)break}return new g(k,b-e)}function j(a,b){var c,e,f,g,h,i=a.length,j=new d(572),l=new(x?Uint8Array:Array)(i);if(!x)for(g=0;i>g;g++)l[g]=0;for(g=0;i>g;++g)0g;++g)c[g]=j.pop(),e[g]=c[g].value;for(f=k(e,e.length,b),g=0,h=c.length;h>g;++g)l[c[g].index]=f[g];return l}function k(a,b,c){function d(a){var c=n[a][o[a]];c===b?(d(a+1),d(a+1)):--l[c],++o[a]}var e,f,g,h,i,j=new(x?Uint16Array:Array)(c),k=new(x?Uint8Array:Array)(c),l=new(x?Uint8Array:Array)(b),m=Array(c),n=Array(c),o=Array(c),p=(1<f;++f)q>p?k[f]=0:(k[f]=1,p-=q),p<<=1,j[c-2-f]=(j[c-1-f]/2|0)+b;for(j[0]=k[0],m[0]=Array(j[0]),n[0]=Array(j[0]),f=1;c>f;++f)j[f]>2*j[f-1]+k[f]&&(j[f]=2*j[f-1]+k[f]),m[f]=Array(j[f]),n[f]=Array(j[f]);for(e=0;b>e;++e)l[e]=c;for(g=0;ge;++e)o[e]=0;for(1===k[c-1]&&(--l[0],++o[c-1]),f=c-2;f>=0;--f){for(h=e=0,i=o[f+1],g=0;ga[e]?(m[f][g]=h,n[f][g]=b,i+=2):(m[f][g]=a[e],n[f][g]=e,++e);o[f]=0,1===k[f]&&d(f)}return l}function l(a){var b,c,d,e,f=new(x?Uint16Array:Array)(a.length),g=[],h=[],i=0;for(b=0,c=a.length;c>b;b++)g[a[b]]=(0|g[a[b]])+1;for(b=1,c=16;c>=b;b++)h[b]=i,i+=0|g[b],i<<=1;for(b=0,c=a.length;c>b;b++)for(i=h[a[b]],h[a[b]]+=1,d=f[b]=0,e=a[b];e>d;d++)f[b]=f[b]<<1|1&i,i>>>=1;return f}function m(b,c){switch(this.l=[],this.m=32768,this.e=this.g=this.c=this.q=0,this.input=x?new Uint8Array(b):b,this.s=!1,this.n=L,this.C=!1,(c||!(c={}))&&(c.index&&(this.c=c.index),c.bufferSize&&(this.m=c.bufferSize),c.bufferType&&(this.n=c.bufferType),c.resize&&(this.C=c.resize)),this.n){case K:this.b=32768,this.a=new(x?Uint8Array:Array)(32768+this.m+258);break;case L:this.b=0,this.a=new(x?Uint8Array:Array)(this.m),this.f=this.K,this.t=this.I,this.o=this.J;break;default:a(Error("invalid inflate mode"))}}function n(b,c){for(var d,e=b.g,f=b.e,g=b.input,h=b.c,i=g.length;c>f;)h>=i&&a(Error("input buffer is broken")),e|=g[h++]<>>c,b.e=f-c,b.c=h,d}function o(a,b){for(var c,d,e=a.g,f=a.e,g=a.input,h=a.c,i=g.length,j=b[0],k=b[1];k>f&&!(h>=i);)e|=g[h++]<>>16,a.g=e>>d,a.e=f-d,a.c=h,65535&c}function p(a){function b(a,b,c){var d,e,f,g=this.z;for(f=0;a>f;)switch(d=o(this,b)){case 16:for(e=3+n(this,2);e--;)c[f++]=g;break;case 17:for(e=3+n(this,3);e--;)c[f++]=0;g=0;break;case 18:for(e=11+n(this,7);e--;)c[f++]=0;g=0;break;default:g=c[f++]=d}return this.z=g,c}var c,d,f,g,h=n(a,5)+257,i=n(a,5)+1,j=n(a,4)+4,k=new(x?Uint8Array:Array)(Q.length);for(g=0;j>g;++g)k[Q[g]]=n(a,3);if(!x)for(g=j,j=k.length;j>g;++g)k[Q[g]]=0;c=e(k),d=new(x?Uint8Array:Array)(h),f=new(x?Uint8Array:Array)(i),a.z=0,a.o(e(b.call(a,h,c,d)),e(b.call(a,i,c,f)))}function q(a){if("string"==typeof a){var b,c,d=a.split("");for(b=0,c=d.length;c>b;b++)d[b]=(255&d[b].charCodeAt(0))>>>0;a=d}for(var e,f=1,g=0,h=a.length,i=0;h>0;){e=h>1024?1024:h,h-=e;do f+=a[i++],g+=f;while(--e);f%=65521,g%=65521}return(g<<16|f)>>>0}function r(b,c){var d,e;switch(this.input=b,this.c=0,(c||!(c={}))&&(c.index&&(this.c=c.index),c.verify&&(this.N=c.verify)),d=b[this.c++],e=b[this.c++],15&d){case da:this.method=da;break;default:a(Error("unsupported compression method"))}0!==((d<<8)+e)%31&&a(Error("invalid fcheck flag:"+((d<<8)+e)%31)),32&e&&a(Error("fdict flag is not supported")),this.B=new m(b,{index:this.c,bufferSize:c.bufferSize,bufferType:c.bufferType,resize:c.resize})}function s(a,b){this.input=a,this.a=new(x?Uint8Array:Array)(32768),this.h=ea.k;var c,d={};!b&&(b={})||"number"!=typeof b.compressionType||(this.h=b.compressionType);for(c in b)d[c]=b[c]; -if(Object.keys)d=Object.keys(c);else for(e in d=[],f=0,c)d[f++]=e;for(f=0,g=d.length;g>f;++f)e=d[f],b(a+"."+e,c[e])}var u=void 0,v=!0,w=this,x="undefined"!=typeof Uint8Array&&"undefined"!=typeof Uint16Array&&"undefined"!=typeof Uint32Array&&"undefined"!=typeof DataView;c.prototype.f=function(){var a,b=this.buffer,c=b.length,d=new(x?Uint8Array:Array)(c<<1);if(x)d.set(b);else for(a=0;c>a;++a)d[a]=b[a];return this.buffer=d},c.prototype.d=function(a,b,c){var d,e=this.buffer,f=this.index,g=this.i,h=e[f];if(c&&b>1&&(a=b>8?(D[255&a]<<24|D[a>>>8&255]<<16|D[a>>>16&255]<<8|D[a>>>24&255])>>32-b:D[a]>>8-b),8>b+g)h=h<d;++d)h=h<<1|a>>b-d-1&1,8===++g&&(g=0,e[f++]=D[h],h=0,f===e.length&&(e=this.f()));e[f]=h,this.buffer=e,this.i=g,this.index=f},c.prototype.finish=function(){var a,b=this.buffer,c=this.index;return 0y;++y){for(var A=y,B=A,C=7,A=A>>>1;A;A>>>=1)B<<=1,B|=1&A,--C;z[y]=(B<>>0}var D=z;d.prototype.getParent=function(a){return 2*((a-2)/4|0)},d.prototype.push=function(a,b){var c,d,e,f=this.buffer;for(c=this.length,f[this.length++]=b,f[this.length++]=a;c>0&&(d=this.getParent(c),f[c]>f[d]);)e=f[c],f[c]=f[d],f[d]=e,e=f[c+1],f[c+1]=f[d+1],f[d+1]=e,c=d;return this.length},d.prototype.pop=function(){var a,b,c,d,e,f=this.buffer;for(b=f[0],a=f[1],this.length-=2,f[0]=f[this.length],f[1]=f[this.length+1],e=0;(d=2*e+2,!(d>=this.length))&&(d+2f[d]&&(d+=2),f[d]>f[e]);)c=f[e],f[e]=f[d],f[d]=c,c=f[e+1],f[e+1]=f[d+1],f[d+1]=c,e=d;return{index:a,value:b,length:this.length}};var E,F=2,G={NONE:0,r:1,k:F,O:3},H=[];for(E=0;288>E;E++)switch(v){case 143>=E:H.push([E+48,8]);break;case 255>=E:H.push([E-144+400,9]);break;case 279>=E:H.push([E-256+0,7]);break;case 287>=E:H.push([E-280+192,8]);break;default:a("invalid literal: "+E)}f.prototype.j=function(){var b,d,e,f,g=this.input;switch(this.h){case 0:for(e=0,f=g.length;f>e;){d=x?g.subarray(e,e+65535):g.slice(e,e+65535),e+=d.length;var i=d,k=e===f,m=u,n=u,o=u,p=u,q=u,r=this.a,s=this.b;if(x){for(r=new Uint8Array(this.a.buffer);r.length<=s+i.length+5;)r=new Uint8Array(r.length<<1);r.set(this.a)}if(m=k?1:0,r[s++]=0|m,n=i.length,o=~n+65536&65535,r[s++]=255&n,r[s++]=n>>>8&255,r[s++]=255&o,r[s++]=o>>>8&255,x)r.set(i,s),s+=i.length,r=r.subarray(0,s);else{for(p=0,q=i.length;q>p;++p)r[s++]=i[p];r.length=s}this.b=s,this.a=r}break;case 1:var t=new c(x?new Uint8Array(this.a.buffer):this.a,this.b);t.d(1,1,v),t.d(1,2,v);var w,y,z,A=h(this,g);for(w=0,y=A.length;y>w;w++)if(z=A[w],c.prototype.d.apply(t,H[z]),z>256)t.d(A[++w],A[++w],v),t.d(A[++w],5),t.d(A[++w],A[++w],v);else if(256===z)break;this.a=t.finish(),this.b=this.a.length;break;case F:var B,C,D,E,G,I,J,K,L,M,N,O,P,Q,R,S=new c(x?new Uint8Array(this.a.buffer):this.a,this.b),T=[16,17,18,0,8,7,9,6,10,5,11,4,12,3,13,2,14,1,15],U=Array(19);for(B=F,S.d(1,1,v),S.d(B,2,v),C=h(this,g),I=j(this.M,15),J=l(I),K=j(this.L,7),L=l(K),D=286;D>257&&0===I[D-1];D--);for(E=30;E>1&&0===K[E-1];E--);var V,W,X,Y,Z,$,_=D,aa=E,ba=new(x?Uint32Array:Array)(_+aa),ca=new(x?Uint32Array:Array)(316),da=new(x?Uint8Array:Array)(19);for(V=W=0;_>V;V++)ba[W++]=I[V];for(V=0;aa>V;V++)ba[W++]=K[V];if(!x)for(V=0,Y=da.length;Y>V;++V)da[V]=0;for(V=Z=0,Y=ba.length;Y>V;V+=W){for(W=1;Y>V+W&&ba[V+W]===ba[V];++W);if(X=W,0===ba[V])if(3>X)for(;00;)$=138>X?X:138,$>X-3&&X>$&&($=X-3),10>=$?(ca[Z++]=17,ca[Z++]=$-3,da[17]++):(ca[Z++]=18,ca[Z++]=$-11,da[18]++),X-=$;else if(ca[Z++]=ba[V],da[ba[V]]++,X--,3>X)for(;00;)$=6>X?X:6,$>X-3&&X>$&&($=X-3),ca[Z++]=16,ca[Z++]=$-3,da[16]++,X-=$}for(b=x?ca.subarray(0,Z):ca.slice(0,Z),M=j(da,7),Q=0;19>Q;Q++)U[Q]=M[T[Q]];for(G=19;G>4&&0===U[G-1];G--);for(N=l(M),S.d(D-257,5,v),S.d(E-1,5,v),S.d(G-4,4,v),Q=0;G>Q;Q++)S.d(U[Q],3,v);for(Q=0,R=b.length;R>Q;Q++)if(O=b[Q],S.d(N[O],M[O],v),O>=16){switch(Q++,O){case 16:P=2;break;case 17:P=3;break;case 18:P=7;break;default:a("invalid code: "+O)}S.d(b[Q],P,v)}var ea,fa,ga,ha,ia,ja,ka,la,ma=[J,I],na=[L,K];for(ia=ma[0],ja=ma[1],ka=na[0],la=na[1],ea=0,fa=C.length;fa>ea;++ea)if(ga=C[ea],S.d(ia[ga],ja[ga],v),ga>256)S.d(C[++ea],C[++ea],v),ha=C[++ea],S.d(ka[ha],la[ha],v),S.d(C[++ea],C[++ea],v);else if(256===ga)break;this.a=S.finish(),this.b=this.a.length;break;default:a("invalid compression type")}return this.a};var I=function(){function b(b){switch(v){case 3===b:return[257,b-3,0];case 4===b:return[258,b-4,0];case 5===b:return[259,b-5,0];case 6===b:return[260,b-6,0];case 7===b:return[261,b-7,0];case 8===b:return[262,b-8,0];case 9===b:return[263,b-9,0];case 10===b:return[264,b-10,0];case 12>=b:return[265,b-11,1];case 14>=b:return[266,b-13,1];case 16>=b:return[267,b-15,1];case 18>=b:return[268,b-17,1];case 22>=b:return[269,b-19,2];case 26>=b:return[270,b-23,2];case 30>=b:return[271,b-27,2];case 34>=b:return[272,b-31,2];case 42>=b:return[273,b-35,3];case 50>=b:return[274,b-43,3];case 58>=b:return[275,b-51,3];case 66>=b:return[276,b-59,3];case 82>=b:return[277,b-67,4];case 98>=b:return[278,b-83,4];case 114>=b:return[279,b-99,4];case 130>=b:return[280,b-115,4];case 162>=b:return[281,b-131,5];case 194>=b:return[282,b-163,5];case 226>=b:return[283,b-195,5];case 257>=b:return[284,b-227,5];case 258===b:return[285,b-258,0];default:a("invalid length: "+b)}}var c,d,e=[];for(c=3;258>=c;c++)d=b(c),e[c]=d[2]<<24|d[1]<<16|d[0];return e}(),J=x?new Uint32Array(I):I,K=0,L=1,M={F:K,D:L};m.prototype.p=function(){for(;!this.s;){var b=n(this,3);switch(1&b&&(this.s=v),b>>>=1){case 0:var c=this.input,d=this.c,e=this.a,f=this.b,g=c.length,h=u,i=u,j=e.length,k=u;switch(this.e=this.g=0,d+1>=g&&a(Error("invalid uncompressed block header: LEN")),h=c[d++]|c[d++]<<8,d+1>=g&&a(Error("invalid uncompressed block header: NLEN")),i=c[d++]|c[d++]<<8,h===~i&&a(Error("invalid uncompressed block header: length verify")),d+h>c.length&&a(Error("input buffer is broken")),this.n){case K:for(;f+h>e.length;){if(k=j-f,h-=k,x)e.set(c.subarray(d,d+k),f),f+=k,d+=k;else for(;k--;)e[f++]=c[d++];this.b=f,e=this.f(),f=this.b}break;case L:for(;f+h>e.length;)e=this.f({v:2});break;default:a(Error("invalid inflate mode"))}if(x)e.set(c.subarray(d,d+h),f),f+=h,d+=h;else for(;h--;)e[f++]=c[d++];this.c=d,this.b=f,this.a=e;break;case 1:this.o(aa,ca);break;case 2:p(this);break;default:a(Error("unknown BTYPE: "+b))}}return this.t()};var N,O,P=[16,17,18,0,8,7,9,6,10,5,11,4,12,3,13,2,14,1,15],Q=x?new Uint16Array(P):P,R=[3,4,5,6,7,8,9,10,11,13,15,17,19,23,27,31,35,43,51,59,67,83,99,115,131,163,195,227,258,258,258],S=x?new Uint16Array(R):R,T=[0,0,0,0,0,0,0,0,1,1,1,1,2,2,2,2,3,3,3,3,4,4,4,4,5,5,5,5,0,0,0],U=x?new Uint8Array(T):T,V=[1,2,3,4,5,7,9,13,17,25,33,49,65,97,129,193,257,385,513,769,1025,1537,2049,3073,4097,6145,8193,12289,16385,24577],W=x?new Uint16Array(V):V,X=[0,0,0,0,1,1,2,2,3,3,4,4,5,5,6,6,7,7,8,8,9,9,10,10,11,11,12,12,13,13],Y=x?new Uint8Array(X):X,Z=new(x?Uint8Array:Array)(288);for(N=0,O=Z.length;O>N;++N)Z[N]=143>=N?8:255>=N?9:279>=N?7:8;var $,_,aa=e(Z),ba=new(x?Uint8Array:Array)(30);for($=0,_=ba.length;_>$;++$)ba[$]=5;var ca=e(ba);m.prototype.o=function(a,b){var c=this.a,d=this.b;this.u=a;for(var e,f,g,h,i=c.length-258;256!==(e=o(this,a));)if(256>e)d>=i&&(this.b=d,c=this.f(),d=this.b),c[d++]=e;else for(f=e-257,h=S[f],0=i&&(this.b=d,c=this.f(),d=this.b);h--;)c[d]=c[d++-g];for(;8<=this.e;)this.e-=8,this.c--;this.b=d},m.prototype.J=function(a,b){var c=this.a,d=this.b;this.u=a;for(var e,f,g,h,i=c.length;256!==(e=o(this,a));)if(256>e)d>=i&&(c=this.f(),i=c.length),c[d++]=e;else for(f=e-257,h=S[f],0i&&(c=this.f(),i=c.length);h--;)c[d]=c[d++-g];for(;8<=this.e;)this.e-=8,this.c--;this.b=d},m.prototype.f=function(){var a,b,c=new(x?Uint8Array:Array)(this.b-32768),d=this.b-32768,e=this.a;if(x)c.set(e.subarray(32768,c.length));else for(a=0,b=c.length;b>a;++a)c[a]=e[a+32768];if(this.l.push(c),this.q+=c.length,x)e.set(e.subarray(d,d+32768));else for(a=0;32768>a;++a)e[a]=e[d+a];return this.b=32768,e},m.prototype.K=function(a){var b,c,d,e,f=this.input.length/this.c+1|0,g=this.input,h=this.a;return a&&("number"==typeof a.v&&(f=a.v),"number"==typeof a.G&&(f+=a.G)),2>f?(c=(g.length-this.c)/this.u[2],e=258*(c/2)|0,d=eb;++b)for(a=h[b],d=0,e=a.length;e>d;++d)i[f++]=a[d];for(b=32768,c=this.b;c>b;++b)i[f++]=g[b];return this.l=[],this.buffer=i},m.prototype.I=function(){var a,b=this.b;return x?this.C?(a=new Uint8Array(b),a.set(this.a.subarray(0,b))):a=this.a.subarray(0,b):(this.a.length>b&&(this.a.length=b),a=this.a),this.buffer=a},r.prototype.p=function(){var b,c,d=this.input;return b=this.B.p(),this.c=this.B.c,this.N&&(c=(d[this.c++]<<24|d[this.c++]<<16|d[this.c++]<<8|d[this.c++])>>>0,c!==q(b)&&a(Error("invalid adler-32 checksum"))),b};var da=8,ea=G;s.prototype.j=function(){var b,c,d,e,f,g,h,i=0;switch(h=this.a,b=da){case da:c=Math.LOG2E*Math.log(32768)-8;break;default:a(Error("invalid compression method"))}switch(d=c<<4|b,h[i++]=d,b){case da:switch(this.h){case ea.NONE:f=0;break;case ea.r:f=1;break;case ea.k:f=2;break;default:a(Error("unsupported compression type"))}break;default:a(Error("invalid compression method"))}return e=f<<6|0,h[i++]=e|31-(256*d+e)%31,g=q(this.input),this.A.b=i,h=this.A.j(),i=h.length,x&&(h=new Uint8Array(h.buffer),h.length<=i+4&&(this.a=new Uint8Array(h.length+4),this.a.set(h),h=this.a),h=h.subarray(0,i+4)),h[i++]=g>>24&255,h[i++]=g>>16&255,h[i++]=g>>8&255,h[i++]=255&g,h},b("Zlib.Inflate",r),b("Zlib.Inflate.prototype.decompress",r.prototype.p),t("Zlib.Inflate.BufferType",{ADAPTIVE:M.D,BLOCK:M.F}),b("Zlib.Deflate",s),b("Zlib.Deflate.compress",function(a,b){return new s(a,b).j()}),b("Zlib.Deflate.prototype.compress",s.prototype.j),t("Zlib.Deflate.CompressionType",{NONE:ea.NONE,FIXED:ea.r,DYNAMIC:ea.k})}).call(this)},{}],16:[function(a,b,c){var d=a("../enums.js");b.exports={prefer_hash_algorithm:d.hash.sha256,encryption_cipher:d.symmetric.aes256,compression:d.compression.zip,integrity_protect:!0,rsa_blinding:!0,useWebCrypto:!0,useNative:!1,show_version:!0,show_comment:!0,versionstring:"OpenPGP.js v0.11.0-PM",commentstring:"http://openpgpjs.org",keyserver:"keyserver.linux.it",node_store:"./openpgp.store",debug:!1}},{"../enums.js":43}],17:[function(a,b,c){b.exports=a("./config.js")},{"./config.js":16}],18:[function(a,b,c){!function(a,b){function c(){var a=Error.apply(this,arguments);this.message=a.message,this.stack=a.stack}function d(){var a=Error.apply(this,arguments);this.message=a.message,this.stack=a.stack}function e(){var a=Error.apply(this,arguments);this.message=a.message,this.stack=a.stack}function f(a){for(var b=a.length,c=new Uint8Array(b),d=0;b>d;d++){var e=a.charCodeAt(d);if(e>>>8)throw new Error("Wide characters are not allowed");c[d]=e}return c}function g(a){for(var b="",c=0;c=d)throw new Error("heap size must be a positive integer and a multiple of 4096");return c=c||new a(new ArrayBuffer(d))}function n(a,b,c,d,e){var f=a.length-b,g=e>f?f:e;return a.set(c.subarray(d,d+g),b),g}function o(a){a=a||{},this.heap=m(Uint8Array,a).subarray(L.HEAP_DATA),this.asm=a.asm||L(b,null,this.heap.buffer),this.mode=null,this.key=null,this.reset(a)}function p(a){if(void 0!==a){if(k(a)||l(a))a=new Uint8Array(a);else{if(!j(a))throw new TypeError("unexpected key type");a=f(a)}var b=a.length;if(16!==b&&24!==b&&32!==b)throw new d("illegal key size");var c=new DataView(a.buffer,a.byteOffset,a.byteLength);this.asm.set_key(b>>2,c.getUint32(0),c.getUint32(4),c.getUint32(8),c.getUint32(12),b>16?c.getUint32(16):0,b>16?c.getUint32(20):0,b>24?c.getUint32(24):0,b>24?c.getUint32(28):0),this.key=a}else if(!this.key)throw new Error("key is required")}function q(a){if(void 0!==a){if(k(a)||l(a))a=new Uint8Array(a);else{if(!j(a))throw new TypeError("unexpected iv type");a=f(a)}if(16!==a.length)throw new d("illegal iv size");var b=new DataView(a.buffer,a.byteOffset,a.byteLength);this.iv=a,this.asm.set_iv(b.getUint32(0),b.getUint32(4),b.getUint32(8),b.getUint32(12))}else this.iv=null,this.asm.set_iv(0,0,0,0)}function r(a){this.padding=void 0!==a?!!a:!0}function s(a){return a=a||{},this.result=null,this.pos=0,this.len=0,p.call(this,a.key),this.hasOwnProperty("iv")&&q.call(this,a.iv),this.hasOwnProperty("padding")&&r.call(this,a.padding),this}function t(a){if(j(a)&&(a=f(a)),k(a)&&(a=new Uint8Array(a)),!l(a))throw new TypeError("data isn't of expected type");for(var b=this.asm,c=this.heap,d=L.ENC[this.mode],e=L.HEAP_DATA,g=this.pos,h=this.len,i=0,m=a.length||0,o=0,p=h+m&-16,q=0,r=new Uint8Array(p);m>0;)q=n(c,g+h,a,i,m),h+=q,i+=q,m-=q,q=b.cipher(d,e+g,h),q&&r.set(c.subarray(g,g+q),o),o+=q,h>q?(g+=q,h-=q):(g=0,h=0);return this.result=r,this.pos=g,this.len=h,this}function u(a){var b=null,c=0;void 0!==a&&(b=t.call(this,a).result,c=b.length);var e=this.asm,f=this.heap,g=L.ENC[this.mode],h=L.HEAP_DATA,i=this.pos,j=this.len,k=16-j%16,l=j;if(this.hasOwnProperty("padding")){if(this.padding){for(var m=0;k>m;++m)f[i+j+m]=k;j+=k,l=j}else if(j%16)throw new d("data length must be a multiple of the block size")}else j+=k;var n=new Uint8Array(c+l);return c&&n.set(b),j&&e.cipher(g,h+i,j),l&&n.set(f.subarray(i,i+l),c),this.result=n,this.pos=0,this.len=0,this}function v(a){if(j(a)&&(a=f(a)),k(a)&&(a=new Uint8Array(a)),!l(a))throw new TypeError("data isn't of expected type");var b=this.asm,c=this.heap,d=L.DEC[this.mode],e=L.HEAP_DATA,g=this.pos,h=this.len,i=0,m=a.length||0,o=0,p=h+m&-16,q=0,r=0;this.hasOwnProperty("padding")&&this.padding&&(q=h+m-p||16,p-=q);for(var s=new Uint8Array(p);m>0;)r=n(c,g+h,a,i,m),h+=r,i+=r,m-=r,r=b.cipher(d,e+g,h-(m?0:q)),r&&s.set(c.subarray(g,g+r),o),o+=r,h>r?(g+=r,h-=r):(g=0,h=0);return this.result=s,this.pos=g,this.len=h,this}function w(a){var b=null,c=0;void 0!==a&&(b=v.call(this,a).result,c=b.length);var f=this.asm,g=this.heap,h=L.DEC[this.mode],i=L.HEAP_DATA,j=this.pos,k=this.len,l=k;if(k>0){if(k%16){if(this.hasOwnProperty("padding"))throw new d("data length must be a multiple of the block size");k+=16-k%16}if(f.cipher(h,i+j,k),this.hasOwnProperty("padding")&&this.padding){var m=g[j+l-1];if(1>m||m>16||m>l)throw new e("bad padding");for(var n=0,o=m;o>1;o--)n|=m^g[j+l-o];if(n)throw new e("bad padding");l-=m}}var p=new Uint8Array(c+l);return c>0&&p.set(b),l>0&&p.set(g.subarray(j,j+l),c),this.result=p,this.pos=0,this.len=0,this}function x(a){this.iv=null,o.call(this,a),this.mode="CFB"}function y(a){x.call(this,a)}function z(a){x.call(this,a)}function A(a,b,c){if(void 0===a)throw new SyntaxError("data required");if(void 0===b)throw new SyntaxError("key required");return new x({heap:P,asm:Q,key:b,iv:c}).encrypt(a).result}function B(a,b,c){if(void 0===a)throw new SyntaxError("data required");if(void 0===b)throw new SyntaxError("key required");return new x({heap:P,asm:Q,key:b,iv:c}).decrypt(a).result}function C(){return this.result=null,this.pos=0,this.len=0,this.asm.reset(),this}function D(a){if(null!==this.result)throw new c("state must be reset before processing new data");if(j(a)&&(a=f(a)),k(a)&&(a=new Uint8Array(a)),!l(a))throw new TypeError("data isn't of expected type");for(var b=this.asm,d=this.heap,e=this.pos,g=this.len,h=0,i=a.length,m=0;i>0;)m=n(d,e+g,a,h,i),g+=m,h+=m,i-=m,m=b.process(e,g),e+=m,g-=m,g||(e=0);return this.pos=e,this.len=g,this}function E(){if(null!==this.result)throw new c("state must be reset before processing new data");return this.asm.finish(this.pos,this.len,0),this.result=new Uint8Array(this.HASH_SIZE),this.result.set(this.heap.subarray(0,this.HASH_SIZE)),this.pos=0,this.len=0,this}function F(a,b,c){"use asm";function d(a,b,c,d,e,f,g,h,i,j,k,l,m,n,o,x){a|=0,b|=0,c|=0,d|=0,e|=0,f|=0,g|=0,h|=0,i|=0,j|=0,k|=0,l|=0,m|=0,n|=0,o|=0,x|=0;var y=0,z=0,A=0,B=0,C=0,D=0,E=0,F=0,G=0;y=p,z=q,A=r,B=s,C=t,D=u,E=v,F=w,G=a+F+(C>>>6^C>>>11^C>>>25^C<<26^C<<21^C<<7)+(E^C&(D^E))+1116352408|0,F=E,E=D,D=C,C=B+G|0,B=A,A=z,z=y,y=G+(z&A^B&(z^A))+(z>>>2^z>>>13^z>>>22^z<<30^z<<19^z<<10)|0,G=b+F+(C>>>6^C>>>11^C>>>25^C<<26^C<<21^C<<7)+(E^C&(D^E))+1899447441|0,F=E,E=D,D=C,C=B+G|0,B=A,A=z,z=y,y=G+(z&A^B&(z^A))+(z>>>2^z>>>13^z>>>22^z<<30^z<<19^z<<10)|0,G=c+F+(C>>>6^C>>>11^C>>>25^C<<26^C<<21^C<<7)+(E^C&(D^E))+3049323471|0,F=E,E=D,D=C,C=B+G|0,B=A,A=z,z=y,y=G+(z&A^B&(z^A))+(z>>>2^z>>>13^z>>>22^z<<30^z<<19^z<<10)|0,G=d+F+(C>>>6^C>>>11^C>>>25^C<<26^C<<21^C<<7)+(E^C&(D^E))+3921009573|0,F=E,E=D,D=C,C=B+G|0,B=A,A=z,z=y,y=G+(z&A^B&(z^A))+(z>>>2^z>>>13^z>>>22^z<<30^z<<19^z<<10)|0,G=e+F+(C>>>6^C>>>11^C>>>25^C<<26^C<<21^C<<7)+(E^C&(D^E))+961987163|0,F=E,E=D,D=C,C=B+G|0,B=A,A=z,z=y,y=G+(z&A^B&(z^A))+(z>>>2^z>>>13^z>>>22^z<<30^z<<19^z<<10)|0,G=f+F+(C>>>6^C>>>11^C>>>25^C<<26^C<<21^C<<7)+(E^C&(D^E))+1508970993|0,F=E,E=D,D=C,C=B+G|0,B=A,A=z,z=y,y=G+(z&A^B&(z^A))+(z>>>2^z>>>13^z>>>22^z<<30^z<<19^z<<10)|0,G=g+F+(C>>>6^C>>>11^C>>>25^C<<26^C<<21^C<<7)+(E^C&(D^E))+2453635748|0,F=E,E=D,D=C,C=B+G|0,B=A,A=z,z=y,y=G+(z&A^B&(z^A))+(z>>>2^z>>>13^z>>>22^z<<30^z<<19^z<<10)|0,G=h+F+(C>>>6^C>>>11^C>>>25^C<<26^C<<21^C<<7)+(E^C&(D^E))+2870763221|0,F=E,E=D,D=C,C=B+G|0,B=A,A=z,z=y,y=G+(z&A^B&(z^A))+(z>>>2^z>>>13^z>>>22^z<<30^z<<19^z<<10)|0,G=i+F+(C>>>6^C>>>11^C>>>25^C<<26^C<<21^C<<7)+(E^C&(D^E))+3624381080|0,F=E,E=D,D=C,C=B+G|0,B=A,A=z,z=y,y=G+(z&A^B&(z^A))+(z>>>2^z>>>13^z>>>22^z<<30^z<<19^z<<10)|0,G=j+F+(C>>>6^C>>>11^C>>>25^C<<26^C<<21^C<<7)+(E^C&(D^E))+310598401|0,F=E,E=D,D=C,C=B+G|0,B=A,A=z,z=y,y=G+(z&A^B&(z^A))+(z>>>2^z>>>13^z>>>22^z<<30^z<<19^z<<10)|0,G=k+F+(C>>>6^C>>>11^C>>>25^C<<26^C<<21^C<<7)+(E^C&(D^E))+607225278|0,F=E,E=D,D=C,C=B+G|0,B=A,A=z,z=y,y=G+(z&A^B&(z^A))+(z>>>2^z>>>13^z>>>22^z<<30^z<<19^z<<10)|0,G=l+F+(C>>>6^C>>>11^C>>>25^C<<26^C<<21^C<<7)+(E^C&(D^E))+1426881987|0,F=E,E=D,D=C,C=B+G|0,B=A,A=z,z=y,y=G+(z&A^B&(z^A))+(z>>>2^z>>>13^z>>>22^z<<30^z<<19^z<<10)|0,G=m+F+(C>>>6^C>>>11^C>>>25^C<<26^C<<21^C<<7)+(E^C&(D^E))+1925078388|0,F=E,E=D,D=C,C=B+G|0,B=A,A=z,z=y,y=G+(z&A^B&(z^A))+(z>>>2^z>>>13^z>>>22^z<<30^z<<19^z<<10)|0,G=n+F+(C>>>6^C>>>11^C>>>25^C<<26^C<<21^C<<7)+(E^C&(D^E))+2162078206|0,F=E,E=D,D=C,C=B+G|0,B=A,A=z,z=y,y=G+(z&A^B&(z^A))+(z>>>2^z>>>13^z>>>22^z<<30^z<<19^z<<10)|0,G=o+F+(C>>>6^C>>>11^C>>>25^C<<26^C<<21^C<<7)+(E^C&(D^E))+2614888103|0,F=E,E=D,D=C,C=B+G|0,B=A,A=z,z=y,y=G+(z&A^B&(z^A))+(z>>>2^z>>>13^z>>>22^z<<30^z<<19^z<<10)|0,G=x+F+(C>>>6^C>>>11^C>>>25^C<<26^C<<21^C<<7)+(E^C&(D^E))+3248222580|0,F=E,E=D,D=C,C=B+G|0,B=A,A=z,z=y,y=G+(z&A^B&(z^A))+(z>>>2^z>>>13^z>>>22^z<<30^z<<19^z<<10)|0,a=G=(b>>>7^b>>>18^b>>>3^b<<25^b<<14)+(o>>>17^o>>>19^o>>>10^o<<15^o<<13)+a+j|0,G=G+F+(C>>>6^C>>>11^C>>>25^C<<26^C<<21^C<<7)+(E^C&(D^E))+3835390401|0,F=E,E=D,D=C,C=B+G|0,B=A,A=z,z=y,y=G+(z&A^B&(z^A))+(z>>>2^z>>>13^z>>>22^z<<30^z<<19^z<<10)|0,b=G=(c>>>7^c>>>18^c>>>3^c<<25^c<<14)+(x>>>17^x>>>19^x>>>10^x<<15^x<<13)+b+k|0,G=G+F+(C>>>6^C>>>11^C>>>25^C<<26^C<<21^C<<7)+(E^C&(D^E))+4022224774|0,F=E,E=D,D=C,C=B+G|0,B=A,A=z,z=y,y=G+(z&A^B&(z^A))+(z>>>2^z>>>13^z>>>22^z<<30^z<<19^z<<10)|0,c=G=(d>>>7^d>>>18^d>>>3^d<<25^d<<14)+(a>>>17^a>>>19^a>>>10^a<<15^a<<13)+c+l|0,G=G+F+(C>>>6^C>>>11^C>>>25^C<<26^C<<21^C<<7)+(E^C&(D^E))+264347078|0,F=E,E=D,D=C,C=B+G|0,B=A,A=z,z=y,y=G+(z&A^B&(z^A))+(z>>>2^z>>>13^z>>>22^z<<30^z<<19^z<<10)|0,d=G=(e>>>7^e>>>18^e>>>3^e<<25^e<<14)+(b>>>17^b>>>19^b>>>10^b<<15^b<<13)+d+m|0,G=G+F+(C>>>6^C>>>11^C>>>25^C<<26^C<<21^C<<7)+(E^C&(D^E))+604807628|0,F=E,E=D,D=C,C=B+G|0,B=A,A=z,z=y,y=G+(z&A^B&(z^A))+(z>>>2^z>>>13^z>>>22^z<<30^z<<19^z<<10)|0,e=G=(f>>>7^f>>>18^f>>>3^f<<25^f<<14)+(c>>>17^c>>>19^c>>>10^c<<15^c<<13)+e+n|0,G=G+F+(C>>>6^C>>>11^C>>>25^C<<26^C<<21^C<<7)+(E^C&(D^E))+770255983|0,F=E,E=D,D=C,C=B+G|0,B=A,A=z,z=y,y=G+(z&A^B&(z^A))+(z>>>2^z>>>13^z>>>22^z<<30^z<<19^z<<10)|0,f=G=(g>>>7^g>>>18^g>>>3^g<<25^g<<14)+(d>>>17^d>>>19^d>>>10^d<<15^d<<13)+f+o|0,G=G+F+(C>>>6^C>>>11^C>>>25^C<<26^C<<21^C<<7)+(E^C&(D^E))+1249150122|0,F=E,E=D,D=C,C=B+G|0,B=A,A=z,z=y,y=G+(z&A^B&(z^A))+(z>>>2^z>>>13^z>>>22^z<<30^z<<19^z<<10)|0,g=G=(h>>>7^h>>>18^h>>>3^h<<25^h<<14)+(e>>>17^e>>>19^e>>>10^e<<15^e<<13)+g+x|0,G=G+F+(C>>>6^C>>>11^C>>>25^C<<26^C<<21^C<<7)+(E^C&(D^E))+1555081692|0,F=E,E=D,D=C,C=B+G|0,B=A,A=z,z=y,y=G+(z&A^B&(z^A))+(z>>>2^z>>>13^z>>>22^z<<30^z<<19^z<<10)|0,h=G=(i>>>7^i>>>18^i>>>3^i<<25^i<<14)+(f>>>17^f>>>19^f>>>10^f<<15^f<<13)+h+a|0,G=G+F+(C>>>6^C>>>11^C>>>25^C<<26^C<<21^C<<7)+(E^C&(D^E))+1996064986|0,F=E,E=D,D=C,C=B+G|0,B=A,A=z,z=y,y=G+(z&A^B&(z^A))+(z>>>2^z>>>13^z>>>22^z<<30^z<<19^z<<10)|0,i=G=(j>>>7^j>>>18^j>>>3^j<<25^j<<14)+(g>>>17^g>>>19^g>>>10^g<<15^g<<13)+i+b|0,G=G+F+(C>>>6^C>>>11^C>>>25^C<<26^C<<21^C<<7)+(E^C&(D^E))+2554220882|0,F=E,E=D,D=C,C=B+G|0,B=A,A=z,z=y,y=G+(z&A^B&(z^A))+(z>>>2^z>>>13^z>>>22^z<<30^z<<19^z<<10)|0,j=G=(k>>>7^k>>>18^k>>>3^k<<25^k<<14)+(h>>>17^h>>>19^h>>>10^h<<15^h<<13)+j+c|0,G=G+F+(C>>>6^C>>>11^C>>>25^C<<26^C<<21^C<<7)+(E^C&(D^E))+2821834349|0,F=E,E=D,D=C,C=B+G|0,B=A,A=z,z=y,y=G+(z&A^B&(z^A))+(z>>>2^z>>>13^z>>>22^z<<30^z<<19^z<<10)|0,k=G=(l>>>7^l>>>18^l>>>3^l<<25^l<<14)+(i>>>17^i>>>19^i>>>10^i<<15^i<<13)+k+d|0,G=G+F+(C>>>6^C>>>11^C>>>25^C<<26^C<<21^C<<7)+(E^C&(D^E))+2952996808|0,F=E,E=D,D=C,C=B+G|0,B=A,A=z,z=y,y=G+(z&A^B&(z^A))+(z>>>2^z>>>13^z>>>22^z<<30^z<<19^z<<10)|0,l=G=(m>>>7^m>>>18^m>>>3^m<<25^m<<14)+(j>>>17^j>>>19^j>>>10^j<<15^j<<13)+l+e|0,G=G+F+(C>>>6^C>>>11^C>>>25^C<<26^C<<21^C<<7)+(E^C&(D^E))+3210313671|0,F=E,E=D,D=C,C=B+G|0,B=A,A=z,z=y,y=G+(z&A^B&(z^A))+(z>>>2^z>>>13^z>>>22^z<<30^z<<19^z<<10)|0,m=G=(n>>>7^n>>>18^n>>>3^n<<25^n<<14)+(k>>>17^k>>>19^k>>>10^k<<15^k<<13)+m+f|0,G=G+F+(C>>>6^C>>>11^C>>>25^C<<26^C<<21^C<<7)+(E^C&(D^E))+3336571891|0,F=E,E=D,D=C,C=B+G|0,B=A,A=z,z=y,y=G+(z&A^B&(z^A))+(z>>>2^z>>>13^z>>>22^z<<30^z<<19^z<<10)|0,n=G=(o>>>7^o>>>18^o>>>3^o<<25^o<<14)+(l>>>17^l>>>19^l>>>10^l<<15^l<<13)+n+g|0,G=G+F+(C>>>6^C>>>11^C>>>25^C<<26^C<<21^C<<7)+(E^C&(D^E))+3584528711|0,F=E,E=D,D=C,C=B+G|0,B=A,A=z,z=y,y=G+(z&A^B&(z^A))+(z>>>2^z>>>13^z>>>22^z<<30^z<<19^z<<10)|0,o=G=(x>>>7^x>>>18^x>>>3^x<<25^x<<14)+(m>>>17^m>>>19^m>>>10^m<<15^m<<13)+o+h|0,G=G+F+(C>>>6^C>>>11^C>>>25^C<<26^C<<21^C<<7)+(E^C&(D^E))+113926993|0,F=E,E=D,D=C,C=B+G|0,B=A,A=z,z=y,y=G+(z&A^B&(z^A))+(z>>>2^z>>>13^z>>>22^z<<30^z<<19^z<<10)|0,x=G=(a>>>7^a>>>18^a>>>3^a<<25^a<<14)+(n>>>17^n>>>19^n>>>10^n<<15^n<<13)+x+i|0,G=G+F+(C>>>6^C>>>11^C>>>25^C<<26^C<<21^C<<7)+(E^C&(D^E))+338241895|0,F=E,E=D,D=C,C=B+G|0,B=A,A=z,z=y,y=G+(z&A^B&(z^A))+(z>>>2^z>>>13^z>>>22^z<<30^z<<19^z<<10)|0,a=G=(b>>>7^b>>>18^b>>>3^b<<25^b<<14)+(o>>>17^o>>>19^o>>>10^o<<15^o<<13)+a+j|0,G=G+F+(C>>>6^C>>>11^C>>>25^C<<26^C<<21^C<<7)+(E^C&(D^E))+666307205|0,F=E,E=D,D=C,C=B+G|0,B=A,A=z,z=y,y=G+(z&A^B&(z^A))+(z>>>2^z>>>13^z>>>22^z<<30^z<<19^z<<10)|0,b=G=(c>>>7^c>>>18^c>>>3^c<<25^c<<14)+(x>>>17^x>>>19^x>>>10^x<<15^x<<13)+b+k|0,G=G+F+(C>>>6^C>>>11^C>>>25^C<<26^C<<21^C<<7)+(E^C&(D^E))+773529912|0,F=E,E=D,D=C,C=B+G|0,B=A,A=z,z=y,y=G+(z&A^B&(z^A))+(z>>>2^z>>>13^z>>>22^z<<30^z<<19^z<<10)|0,c=G=(d>>>7^d>>>18^d>>>3^d<<25^d<<14)+(a>>>17^a>>>19^a>>>10^a<<15^a<<13)+c+l|0,G=G+F+(C>>>6^C>>>11^C>>>25^C<<26^C<<21^C<<7)+(E^C&(D^E))+1294757372|0,F=E,E=D,D=C,C=B+G|0,B=A,A=z,z=y,y=G+(z&A^B&(z^A))+(z>>>2^z>>>13^z>>>22^z<<30^z<<19^z<<10)|0,d=G=(e>>>7^e>>>18^e>>>3^e<<25^e<<14)+(b>>>17^b>>>19^b>>>10^b<<15^b<<13)+d+m|0,G=G+F+(C>>>6^C>>>11^C>>>25^C<<26^C<<21^C<<7)+(E^C&(D^E))+1396182291|0,F=E,E=D,D=C,C=B+G|0,B=A,A=z,z=y,y=G+(z&A^B&(z^A))+(z>>>2^z>>>13^z>>>22^z<<30^z<<19^z<<10)|0,e=G=(f>>>7^f>>>18^f>>>3^f<<25^f<<14)+(c>>>17^c>>>19^c>>>10^c<<15^c<<13)+e+n|0,G=G+F+(C>>>6^C>>>11^C>>>25^C<<26^C<<21^C<<7)+(E^C&(D^E))+1695183700|0,F=E,E=D,D=C,C=B+G|0,B=A,A=z,z=y,y=G+(z&A^B&(z^A))+(z>>>2^z>>>13^z>>>22^z<<30^z<<19^z<<10)|0,f=G=(g>>>7^g>>>18^g>>>3^g<<25^g<<14)+(d>>>17^d>>>19^d>>>10^d<<15^d<<13)+f+o|0,G=G+F+(C>>>6^C>>>11^C>>>25^C<<26^C<<21^C<<7)+(E^C&(D^E))+1986661051|0,F=E,E=D,D=C,C=B+G|0,B=A,A=z,z=y,y=G+(z&A^B&(z^A))+(z>>>2^z>>>13^z>>>22^z<<30^z<<19^z<<10)|0,g=G=(h>>>7^h>>>18^h>>>3^h<<25^h<<14)+(e>>>17^e>>>19^e>>>10^e<<15^e<<13)+g+x|0,G=G+F+(C>>>6^C>>>11^C>>>25^C<<26^C<<21^C<<7)+(E^C&(D^E))+2177026350|0,F=E,E=D,D=C,C=B+G|0,B=A,A=z,z=y,y=G+(z&A^B&(z^A))+(z>>>2^z>>>13^z>>>22^z<<30^z<<19^z<<10)|0,h=G=(i>>>7^i>>>18^i>>>3^i<<25^i<<14)+(f>>>17^f>>>19^f>>>10^f<<15^f<<13)+h+a|0,G=G+F+(C>>>6^C>>>11^C>>>25^C<<26^C<<21^C<<7)+(E^C&(D^E))+2456956037|0,F=E,E=D,D=C,C=B+G|0,B=A,A=z,z=y,y=G+(z&A^B&(z^A))+(z>>>2^z>>>13^z>>>22^z<<30^z<<19^z<<10)|0,i=G=(j>>>7^j>>>18^j>>>3^j<<25^j<<14)+(g>>>17^g>>>19^g>>>10^g<<15^g<<13)+i+b|0,G=G+F+(C>>>6^C>>>11^C>>>25^C<<26^C<<21^C<<7)+(E^C&(D^E))+2730485921|0,F=E,E=D,D=C,C=B+G|0,B=A,A=z,z=y,y=G+(z&A^B&(z^A))+(z>>>2^z>>>13^z>>>22^z<<30^z<<19^z<<10)|0,j=G=(k>>>7^k>>>18^k>>>3^k<<25^k<<14)+(h>>>17^h>>>19^h>>>10^h<<15^h<<13)+j+c|0,G=G+F+(C>>>6^C>>>11^C>>>25^C<<26^C<<21^C<<7)+(E^C&(D^E))+2820302411|0,F=E,E=D,D=C,C=B+G|0,B=A,A=z,z=y,y=G+(z&A^B&(z^A))+(z>>>2^z>>>13^z>>>22^z<<30^z<<19^z<<10)|0,k=G=(l>>>7^l>>>18^l>>>3^l<<25^l<<14)+(i>>>17^i>>>19^i>>>10^i<<15^i<<13)+k+d|0,G=G+F+(C>>>6^C>>>11^C>>>25^C<<26^C<<21^C<<7)+(E^C&(D^E))+3259730800|0,F=E,E=D,D=C,C=B+G|0,B=A,A=z,z=y,y=G+(z&A^B&(z^A))+(z>>>2^z>>>13^z>>>22^z<<30^z<<19^z<<10)|0,l=G=(m>>>7^m>>>18^m>>>3^m<<25^m<<14)+(j>>>17^j>>>19^j>>>10^j<<15^j<<13)+l+e|0,G=G+F+(C>>>6^C>>>11^C>>>25^C<<26^C<<21^C<<7)+(E^C&(D^E))+3345764771|0,F=E,E=D,D=C,C=B+G|0,B=A,A=z,z=y,y=G+(z&A^B&(z^A))+(z>>>2^z>>>13^z>>>22^z<<30^z<<19^z<<10)|0,m=G=(n>>>7^n>>>18^n>>>3^n<<25^n<<14)+(k>>>17^k>>>19^k>>>10^k<<15^k<<13)+m+f|0,G=G+F+(C>>>6^C>>>11^C>>>25^C<<26^C<<21^C<<7)+(E^C&(D^E))+3516065817|0,F=E,E=D,D=C,C=B+G|0,B=A,A=z,z=y,y=G+(z&A^B&(z^A))+(z>>>2^z>>>13^z>>>22^z<<30^z<<19^z<<10)|0,n=G=(o>>>7^o>>>18^o>>>3^o<<25^o<<14)+(l>>>17^l>>>19^l>>>10^l<<15^l<<13)+n+g|0,G=G+F+(C>>>6^C>>>11^C>>>25^C<<26^C<<21^C<<7)+(E^C&(D^E))+3600352804|0,F=E,E=D,D=C,C=B+G|0,B=A,A=z,z=y,y=G+(z&A^B&(z^A))+(z>>>2^z>>>13^z>>>22^z<<30^z<<19^z<<10)|0,o=G=(x>>>7^x>>>18^x>>>3^x<<25^x<<14)+(m>>>17^m>>>19^m>>>10^m<<15^m<<13)+o+h|0,G=G+F+(C>>>6^C>>>11^C>>>25^C<<26^C<<21^C<<7)+(E^C&(D^E))+4094571909|0,F=E,E=D,D=C,C=B+G|0,B=A,A=z,z=y,y=G+(z&A^B&(z^A))+(z>>>2^z>>>13^z>>>22^z<<30^z<<19^z<<10)|0,x=G=(a>>>7^a>>>18^a>>>3^a<<25^a<<14)+(n>>>17^n>>>19^n>>>10^n<<15^n<<13)+x+i|0,G=G+F+(C>>>6^C>>>11^C>>>25^C<<26^C<<21^C<<7)+(E^C&(D^E))+275423344|0,F=E,E=D,D=C,C=B+G|0,B=A,A=z,z=y,y=G+(z&A^B&(z^A))+(z>>>2^z>>>13^z>>>22^z<<30^z<<19^z<<10)|0,a=G=(b>>>7^b>>>18^b>>>3^b<<25^b<<14)+(o>>>17^o>>>19^o>>>10^o<<15^o<<13)+a+j|0,G=G+F+(C>>>6^C>>>11^C>>>25^C<<26^C<<21^C<<7)+(E^C&(D^E))+430227734|0,F=E,E=D,D=C,C=B+G|0,B=A,A=z,z=y,y=G+(z&A^B&(z^A))+(z>>>2^z>>>13^z>>>22^z<<30^z<<19^z<<10)|0,b=G=(c>>>7^c>>>18^c>>>3^c<<25^c<<14)+(x>>>17^x>>>19^x>>>10^x<<15^x<<13)+b+k|0,G=G+F+(C>>>6^C>>>11^C>>>25^C<<26^C<<21^C<<7)+(E^C&(D^E))+506948616|0,F=E,E=D,D=C,C=B+G|0,B=A,A=z,z=y,y=G+(z&A^B&(z^A))+(z>>>2^z>>>13^z>>>22^z<<30^z<<19^z<<10)|0,c=G=(d>>>7^d>>>18^d>>>3^d<<25^d<<14)+(a>>>17^a>>>19^a>>>10^a<<15^a<<13)+c+l|0,G=G+F+(C>>>6^C>>>11^C>>>25^C<<26^C<<21^C<<7)+(E^C&(D^E))+659060556|0,F=E,E=D,D=C,C=B+G|0,B=A,A=z,z=y,y=G+(z&A^B&(z^A))+(z>>>2^z>>>13^z>>>22^z<<30^z<<19^z<<10)|0,d=G=(e>>>7^e>>>18^e>>>3^e<<25^e<<14)+(b>>>17^b>>>19^b>>>10^b<<15^b<<13)+d+m|0,G=G+F+(C>>>6^C>>>11^C>>>25^C<<26^C<<21^C<<7)+(E^C&(D^E))+883997877|0,F=E,E=D,D=C,C=B+G|0,B=A,A=z,z=y,y=G+(z&A^B&(z^A))+(z>>>2^z>>>13^z>>>22^z<<30^z<<19^z<<10)|0,e=G=(f>>>7^f>>>18^f>>>3^f<<25^f<<14)+(c>>>17^c>>>19^c>>>10^c<<15^c<<13)+e+n|0,G=G+F+(C>>>6^C>>>11^C>>>25^C<<26^C<<21^C<<7)+(E^C&(D^E))+958139571|0,F=E,E=D,D=C,C=B+G|0,B=A,A=z,z=y,y=G+(z&A^B&(z^A))+(z>>>2^z>>>13^z>>>22^z<<30^z<<19^z<<10)|0,f=G=(g>>>7^g>>>18^g>>>3^g<<25^g<<14)+(d>>>17^d>>>19^d>>>10^d<<15^d<<13)+f+o|0,G=G+F+(C>>>6^C>>>11^C>>>25^C<<26^C<<21^C<<7)+(E^C&(D^E))+1322822218|0,F=E,E=D,D=C,C=B+G|0,B=A,A=z,z=y,y=G+(z&A^B&(z^A))+(z>>>2^z>>>13^z>>>22^z<<30^z<<19^z<<10)|0,g=G=(h>>>7^h>>>18^h>>>3^h<<25^h<<14)+(e>>>17^e>>>19^e>>>10^e<<15^e<<13)+g+x|0,G=G+F+(C>>>6^C>>>11^C>>>25^C<<26^C<<21^C<<7)+(E^C&(D^E))+1537002063|0,F=E,E=D,D=C,C=B+G|0,B=A,A=z,z=y,y=G+(z&A^B&(z^A))+(z>>>2^z>>>13^z>>>22^z<<30^z<<19^z<<10)|0,h=G=(i>>>7^i>>>18^i>>>3^i<<25^i<<14)+(f>>>17^f>>>19^f>>>10^f<<15^f<<13)+h+a|0,G=G+F+(C>>>6^C>>>11^C>>>25^C<<26^C<<21^C<<7)+(E^C&(D^E))+1747873779|0,F=E,E=D,D=C,C=B+G|0,B=A,A=z,z=y,y=G+(z&A^B&(z^A))+(z>>>2^z>>>13^z>>>22^z<<30^z<<19^z<<10)|0,i=G=(j>>>7^j>>>18^j>>>3^j<<25^j<<14)+(g>>>17^g>>>19^g>>>10^g<<15^g<<13)+i+b|0,G=G+F+(C>>>6^C>>>11^C>>>25^C<<26^C<<21^C<<7)+(E^C&(D^E))+1955562222|0,F=E,E=D,D=C,C=B+G|0,B=A,A=z,z=y,y=G+(z&A^B&(z^A))+(z>>>2^z>>>13^z>>>22^z<<30^z<<19^z<<10)|0,j=G=(k>>>7^k>>>18^k>>>3^k<<25^k<<14)+(h>>>17^h>>>19^h>>>10^h<<15^h<<13)+j+c|0,G=G+F+(C>>>6^C>>>11^C>>>25^C<<26^C<<21^C<<7)+(E^C&(D^E))+2024104815|0,F=E,E=D,D=C,C=B+G|0,B=A,A=z,z=y,y=G+(z&A^B&(z^A))+(z>>>2^z>>>13^z>>>22^z<<30^z<<19^z<<10)|0,k=G=(l>>>7^l>>>18^l>>>3^l<<25^l<<14)+(i>>>17^i>>>19^i>>>10^i<<15^i<<13)+k+d|0,G=G+F+(C>>>6^C>>>11^C>>>25^C<<26^C<<21^C<<7)+(E^C&(D^E))+2227730452|0,F=E,E=D,D=C,C=B+G|0,B=A,A=z,z=y,y=G+(z&A^B&(z^A))+(z>>>2^z>>>13^z>>>22^z<<30^z<<19^z<<10)|0,l=G=(m>>>7^m>>>18^m>>>3^m<<25^m<<14)+(j>>>17^j>>>19^j>>>10^j<<15^j<<13)+l+e|0,G=G+F+(C>>>6^C>>>11^C>>>25^C<<26^C<<21^C<<7)+(E^C&(D^E))+2361852424|0,F=E,E=D,D=C,C=B+G|0,B=A,A=z,z=y,y=G+(z&A^B&(z^A))+(z>>>2^z>>>13^z>>>22^z<<30^z<<19^z<<10)|0,m=G=(n>>>7^n>>>18^n>>>3^n<<25^n<<14)+(k>>>17^k>>>19^k>>>10^k<<15^k<<13)+m+f|0,G=G+F+(C>>>6^C>>>11^C>>>25^C<<26^C<<21^C<<7)+(E^C&(D^E))+2428436474|0,F=E,E=D,D=C,C=B+G|0,B=A,A=z,z=y,y=G+(z&A^B&(z^A))+(z>>>2^z>>>13^z>>>22^z<<30^z<<19^z<<10)|0,n=G=(o>>>7^o>>>18^o>>>3^o<<25^o<<14)+(l>>>17^l>>>19^l>>>10^l<<15^l<<13)+n+g|0,G=G+F+(C>>>6^C>>>11^C>>>25^C<<26^C<<21^C<<7)+(E^C&(D^E))+2756734187|0,F=E,E=D,D=C,C=B+G|0,B=A,A=z,z=y,y=G+(z&A^B&(z^A))+(z>>>2^z>>>13^z>>>22^z<<30^z<<19^z<<10)|0,o=G=(x>>>7^x>>>18^x>>>3^x<<25^x<<14)+(m>>>17^m>>>19^m>>>10^m<<15^m<<13)+o+h|0,G=G+F+(C>>>6^C>>>11^C>>>25^C<<26^C<<21^C<<7)+(E^C&(D^E))+3204031479|0,F=E,E=D,D=C,C=B+G|0,B=A,A=z,z=y,y=G+(z&A^B&(z^A))+(z>>>2^z>>>13^z>>>22^z<<30^z<<19^z<<10)|0,x=G=(a>>>7^a>>>18^a>>>3^a<<25^a<<14)+(n>>>17^n>>>19^n>>>10^n<<15^n<<13)+x+i|0,G=G+F+(C>>>6^C>>>11^C>>>25^C<<26^C<<21^C<<7)+(E^C&(D^E))+3329325298|0,F=E,E=D,D=C,C=B+G|0,B=A,A=z,z=y,y=G+(z&A^B&(z^A))+(z>>>2^z>>>13^z>>>22^z<<30^z<<19^z<<10)|0,p=p+y|0,q=q+z|0,r=r+A|0,s=s+B|0,t=t+C|0,u=u+D|0,v=v+E|0,w=w+F|0}function e(a){a|=0,d(O[a|0]<<24|O[a|1]<<16|O[a|2]<<8|O[a|3],O[a|4]<<24|O[a|5]<<16|O[a|6]<<8|O[a|7],O[a|8]<<24|O[a|9]<<16|O[a|10]<<8|O[a|11],O[a|12]<<24|O[a|13]<<16|O[a|14]<<8|O[a|15],O[a|16]<<24|O[a|17]<<16|O[a|18]<<8|O[a|19],O[a|20]<<24|O[a|21]<<16|O[a|22]<<8|O[a|23],O[a|24]<<24|O[a|25]<<16|O[a|26]<<8|O[a|27],O[a|28]<<24|O[a|29]<<16|O[a|30]<<8|O[a|31],O[a|32]<<24|O[a|33]<<16|O[a|34]<<8|O[a|35],O[a|36]<<24|O[a|37]<<16|O[a|38]<<8|O[a|39],O[a|40]<<24|O[a|41]<<16|O[a|42]<<8|O[a|43],O[a|44]<<24|O[a|45]<<16|O[a|46]<<8|O[a|47],O[a|48]<<24|O[a|49]<<16|O[a|50]<<8|O[a|51],O[a|52]<<24|O[a|53]<<16|O[a|54]<<8|O[a|55],O[a|56]<<24|O[a|57]<<16|O[a|58]<<8|O[a|59],O[a|60]<<24|O[a|61]<<16|O[a|62]<<8|O[a|63])}function f(a){a|=0,O[a|0]=p>>>24,O[a|1]=p>>>16&255,O[a|2]=p>>>8&255,O[a|3]=p&255,O[a|4]=q>>>24,O[a|5]=q>>>16&255,O[a|6]=q>>>8&255,O[a|7]=q&255,O[a|8]=r>>>24,O[a|9]=r>>>16&255,O[a|10]=r>>>8&255,O[a|11]=r&255,O[a|12]=s>>>24,O[a|13]=s>>>16&255,O[a|14]=s>>>8&255,O[a|15]=s&255,O[a|16]=t>>>24,O[a|17]=t>>>16&255,O[a|18]=t>>>8&255,O[a|19]=t&255,O[a|20]=u>>>24,O[a|21]=u>>>16&255,O[a|22]=u>>>8&255,O[a|23]=u&255,O[a|24]=v>>>24,O[a|25]=v>>>16&255,O[a|26]=v>>>8&255,O[a|27]=v&255,O[a|28]=w>>>24,O[a|29]=w>>>16&255,O[a|30]=w>>>8&255,O[a|31]=w&255}function g(){p=1779033703,q=3144134277,r=1013904242,s=2773480762,t=1359893119, -u=2600822924,v=528734635,w=1541459225,x=0}function h(a,b,c,d,e,f,g,h,i){a|=0,b|=0,c|=0,d|=0,e|=0,f|=0,g|=0,h|=0,i|=0,p=a,q=b,r=c,s=d,t=e,u=f,v=g,w=h,x=i}function i(a,b){a|=0,b|=0;var c=0;if(a&63)return-1;for(;(b|0)>=64;)e(a),a=a+64|0,b=b-64|0,c=c+64|0;return x=x+c|0,c|0}function j(a,b,c){a|=0,b|=0,c|=0;var d=0,g=0;if(a&63)return-1;if(~c&&c&31)return-1;if((b|0)>=64){if(d=i(a,b)|0,(d|0)==-1)return-1;a=a+d|0,b=b-d|0}if(d=d+b|0,x=x+b|0,O[a|b]=128,(b|0)>=56){for(g=b+1|0;(g|0)<64;g=g+1|0)O[a|g]=0;e(a),b=0,O[a|0]=0}for(g=b+1|0;(g|0)<59;g=g+1|0)O[a|g]=0;return O[a|59]=x>>>29,O[a|60]=x>>>21&255,O[a|61]=x>>>13&255,O[a|62]=x>>>5&255,O[a|63]=x<<3&255,e(a),~c&&f(c),d|0}function k(){p=y,q=z,r=A,s=B,t=C,u=D,v=E,w=F,x=64}function l(){p=G,q=H,r=I,s=J,t=K,u=L,v=M,w=N,x=64}function m(a,b,c,e,f,h,i,j,k,l,m,n,o,O,P,Q){a|=0,b|=0,c|=0,e|=0,f|=0,h|=0,i|=0,j|=0,k|=0,l|=0,m|=0,n|=0,o|=0,O|=0,P|=0,Q|=0,g(),d(a^1549556828,b^1549556828,c^1549556828,e^1549556828,f^1549556828,h^1549556828,i^1549556828,j^1549556828,k^1549556828,l^1549556828,m^1549556828,n^1549556828,o^1549556828,O^1549556828,P^1549556828,Q^1549556828),G=p,H=q,I=r,J=s,K=t,L=u,M=v,N=w,g(),d(a^909522486,b^909522486,c^909522486,e^909522486,f^909522486,h^909522486,i^909522486,j^909522486,k^909522486,l^909522486,m^909522486,n^909522486,o^909522486,O^909522486,P^909522486,Q^909522486),y=p,z=q,A=r,B=s,C=t,D=u,E=v,F=w,x=64}function n(a,b,c){a|=0,b|=0,c|=0;var e=0,g=0,h=0,i=0,k=0,m=0,n=0,o=0,x=0;return a&63?-1:~c&&c&31?-1:(x=j(a,b,-1)|0,e=p,g=q,h=r,i=s,k=t,m=u,n=v,o=w,l(),d(e,g,h,i,k,m,n,o,2147483648,0,0,0,0,0,0,768),~c&&f(c),x|0)}function o(a,b,c,e,g){a|=0,b|=0,c|=0,e|=0,g|=0;var h=0,i=0,j=0,m=0,o=0,x=0,y=0,z=0,A=0,B=0,C=0,D=0,E=0,F=0,G=0,H=0;if(a&63)return-1;if(~g&&g&31)return-1;for(O[a+b|0]=c>>>24,O[a+b+1|0]=c>>>16&255,O[a+b+2|0]=c>>>8&255,O[a+b+3|0]=c&255,n(a,b+4|0,-1)|0,h=A=p,i=B=q,j=C=r,m=D=s,o=E=t,x=F=u,y=G=v,z=H=w,e=e-1|0;(e|0)>0;)k(),d(A,B,C,D,E,F,G,H,2147483648,0,0,0,0,0,0,768),A=p,B=q,C=r,D=s,E=t,F=u,G=v,H=w,l(),d(A,B,C,D,E,F,G,H,2147483648,0,0,0,0,0,0,768),A=p,B=q,C=r,D=s,E=t,F=u,G=v,H=w,h^=p,i^=q,j^=r,m^=s,o^=t,x^=u,y^=v,z^=w,e=e-1|0;return p=h,q=i,r=j,s=m,t=o,u=x,v=y,w=z,~g&&f(g),0}var p=0,q=0,r=0,s=0,t=0,u=0,v=0,w=0,x=0,y=0,z=0,A=0,B=0,C=0,D=0,E=0,F=0,G=0,H=0,I=0,J=0,K=0,L=0,M=0,N=0,O=new a.Uint8Array(c);return{reset:g,init:h,process:i,finish:j,hmac_reset:k,hmac_init:m,hmac_finish:n,pbkdf2_generate_block:o}}function G(a){a=a||{},this.heap=m(Uint8Array,a),this.asm=a.asm||F(b,null,this.heap.buffer),this.BLOCK_SIZE=R,this.HASH_SIZE=S,this.reset()}function H(){return null===U&&(U=new G({heapSize:1048576})),U}function I(a){if(void 0===a)throw new SyntaxError("data required");return H().reset().process(a).finish().result}function J(a){var b=I(a);return h(b)}function K(a){var b=I(a);return i(b)}b.asmCrypto=a,c.prototype=Object.create(Error.prototype,{name:{value:"IllegalStateError"}}),d.prototype=Object.create(Error.prototype,{name:{value:"IllegalArgumentError"}}),e.prototype=Object.create(Error.prototype,{name:{value:"SecurityError"}});var L=(b.Float64Array||b.Float32Array,function(){"use strict";function a(){e=[],f=[];var a,b,c=1;for(a=0;255>a;a++)e[a]=c,b=128&c,c<<=1,c&=255,128===b&&(c^=27),c^=e[a],f[e[a]]=a;e[255]=e[0],f[0]=0,k=!0}function b(a,b){var c=e[(f[a]+f[b])%255];return(0===a||0===b)&&(c=0),c}function c(a){var b=e[255-f[a]];return 0===a&&(b=0),b}function d(){function d(a){var b,d,e;for(d=e=c(a),b=0;4>b;b++)d=255&(d<<1|d>>>7),e^=d;return e^=99}k||a(),g=[],h=[],i=[[],[],[],[]],j=[[],[],[],[]];for(var e=0;256>e;e++){var f=d(e);g[e]=f,h[f]=e,i[0][e]=b(2,f)<<24|f<<16|f<<8|b(3,f),j[0][f]=b(14,e)<<24|b(9,e)<<16|b(13,e)<<8|b(11,e);for(var l=1;4>l;l++)i[l][e]=i[l-1][e]>>>8|i[l-1][e]<<24,j[l][f]=j[l-1][f]>>>8|j[l-1][f]<<24}}var e,f,g,h,i,j,k=!1,l=!1,m=function(a,b,c){function e(a,b,c,d,e,h,i,k,l){var n=f.subarray(0,60),o=f.subarray(256,316);n.set([b,c,d,e,h,i,k,l]);for(var p=a,q=1;4*a+28>p;p++){var r=n[p-1];(p%a===0||8===a&&p%a===4)&&(r=g[r>>>24]<<24^g[r>>>16&255]<<16^g[r>>>8&255]<<8^g[255&r]),p%a===0&&(r=r<<8^r>>>24^q<<24,q=q<<1^(128&q?27:0)),n[p]=n[p-a]^r}for(var s=0;p>s;s+=4)for(var t=0;4>t;t++){var r=n[p-(4+s)+(4-t)%4];o[s+t]=4>s||s>=p-4?r:j[0][g[r>>>24]]^j[1][g[r>>>16&255]]^j[2][g[r>>>8&255]]^j[3][g[255&r]]}m.set_rounds(a+5)}l||d();var f=new Uint32Array(c);f.set(g,512),f.set(h,768);for(var k=0;4>k;k++)f.set(i[k],4096+1024*k>>2),f.set(j[k],8192+1024*k>>2);var m=function(a,b,c){"use asm";function d(a,b,c,d,e,f,g,h){a|=0,b|=0,c|=0,d|=0,e|=0,f|=0,g|=0,h|=0;var i=0,j=0,k=0,l=0,m=0,n=0,o=0,p=0;for(i=c|1024,j=c|2048,k=c|3072,e^=T[(a|0)>>2],f^=T[(a|4)>>2],g^=T[(a|8)>>2],h^=T[(a|12)>>2],p=16;(p|0)<=d<<4;p=p+16|0)l=T[(c|e>>22&1020)>>2]^T[(i|f>>14&1020)>>2]^T[(j|g>>6&1020)>>2]^T[(k|h<<2&1020)>>2]^T[(a|p|0)>>2],m=T[(c|f>>22&1020)>>2]^T[(i|g>>14&1020)>>2]^T[(j|h>>6&1020)>>2]^T[(k|e<<2&1020)>>2]^T[(a|p|4)>>2],n=T[(c|g>>22&1020)>>2]^T[(i|h>>14&1020)>>2]^T[(j|e>>6&1020)>>2]^T[(k|f<<2&1020)>>2]^T[(a|p|8)>>2],o=T[(c|h>>22&1020)>>2]^T[(i|e>>14&1020)>>2]^T[(j|f>>6&1020)>>2]^T[(k|g<<2&1020)>>2]^T[(a|p|12)>>2],e=l,f=m,g=n,h=o;y=T[(b|e>>22&1020)>>2]<<24^T[(b|f>>14&1020)>>2]<<16^T[(b|g>>6&1020)>>2]<<8^T[(b|h<<2&1020)>>2]^T[(a|p|0)>>2],z=T[(b|f>>22&1020)>>2]<<24^T[(b|g>>14&1020)>>2]<<16^T[(b|h>>6&1020)>>2]<<8^T[(b|e<<2&1020)>>2]^T[(a|p|4)>>2],A=T[(b|g>>22&1020)>>2]<<24^T[(b|h>>14&1020)>>2]<<16^T[(b|e>>6&1020)>>2]<<8^T[(b|f<<2&1020)>>2]^T[(a|p|8)>>2],B=T[(b|h>>22&1020)>>2]<<24^T[(b|e>>14&1020)>>2]<<16^T[(b|f>>6&1020)>>2]<<8^T[(b|g<<2&1020)>>2]^T[(a|p|12)>>2]}function e(a,b,c,e){a|=0,b|=0,c|=0,e|=0,d(0,2048,4096,S,a,b,c,e)}function f(a,b,c,e){a|=0,b|=0,c|=0,e|=0;var f=0;d(1024,3072,8192,S,a,e,c,b),f=z,z=B,B=f}function g(a,b,c,e){a|=0,b|=0,c|=0,e|=0,d(0,2048,4096,S,C^a,D^b,E^c,F^e),C=y,D=z,E=A,F=B}function h(a,b,c,e){a|=0,b|=0,c|=0,e|=0;var f=0;d(1024,3072,8192,S,a,e,c,b),f=z,z=B,B=f,y^=C,z^=D,A^=E,B^=F,C=a,D=b,E=c,F=e}function i(a,b,c,e){a|=0,b|=0,c|=0,e|=0,d(0,2048,4096,S,C,D,E,F),C=y^=a,D=z^=b,E=A^=c,F=B^=e}function j(a,b,c,e){a|=0,b|=0,c|=0,e|=0,d(0,2048,4096,S,C,D,E,F),y^=a,z^=b,A^=c,B^=e,C=a,D=b,E=c,F=e}function k(a,b,c,e){a|=0,b|=0,c|=0,e|=0,d(0,2048,4096,S,C,D,E,F),C=y,D=z,E=A,F=B,y^=a,z^=b,A^=c,B^=e}function l(a,b,c,e){a|=0,b|=0,c|=0,e|=0,d(0,2048,4096,S,G,H,I,J),J=~N&J|N&J+1,I=~M&I|M&I+((J|0)==0),H=~L&H|L&H+((I|0)==0),G=~K&G|K&G+((H|0)==0),y^=a,z^=b,A^=c,B^=e}function m(a,b,c,d){a|=0,b|=0,c|=0,d|=0;var e=0,f=0,g=0,h=0,i=0,j=0,k=0,l=0,m=0,n=0;for(a^=C,b^=D,c^=E,d^=F,e=O|0,f=P|0,g=Q|0,h=R|0;(m|0)<128;m=m+1|0)e>>>31&&(i^=a,j^=b,k^=c,l^=d),e=e<<1|f>>>31,f=f<<1|g>>>31,g=g<<1|h>>>31,h<<=1,n=d&1,d=d>>>1|c<<31,c=c>>>1|b<<31,b=b>>>1|a<<31,a>>>=1,n&&(a^=3774873600);C=i,D=j,E=k,F=l}function n(a){a|=0,S=a}function o(a,b,c,d){a|=0,b|=0,c|=0,d|=0,y=a,z=b,A=c,B=d}function p(a,b,c,d){a|=0,b|=0,c|=0,d|=0,C=a,D=b,E=c,F=d}function q(a,b,c,d){a|=0,b|=0,c|=0,d|=0,G=a,H=b,I=c,J=d}function r(a,b,c,d){a|=0,b|=0,c|=0,d|=0,K=a,L=b,M=c,N=d}function s(a,b,c,d){a|=0,b|=0,c|=0,d|=0,J=~N&J|N&d,I=~M&I|M&c,H=~L&H|L&b,G=~K&G|K&a}function t(a){return a|=0,a&15?-1:(U[a|0]=y>>>24,U[a|1]=y>>>16&255,U[a|2]=y>>>8&255,U[a|3]=y&255,U[a|4]=z>>>24,U[a|5]=z>>>16&255,U[a|6]=z>>>8&255,U[a|7]=z&255,U[a|8]=A>>>24,U[a|9]=A>>>16&255,U[a|10]=A>>>8&255,U[a|11]=A&255,U[a|12]=B>>>24,U[a|13]=B>>>16&255,U[a|14]=B>>>8&255,U[a|15]=B&255,16)}function u(a){return a|=0,a&15?-1:(U[a|0]=C>>>24,U[a|1]=C>>>16&255,U[a|2]=C>>>8&255,U[a|3]=C&255,U[a|4]=D>>>24,U[a|5]=D>>>16&255,U[a|6]=D>>>8&255,U[a|7]=D&255,U[a|8]=E>>>24,U[a|9]=E>>>16&255,U[a|10]=E>>>8&255,U[a|11]=E&255,U[a|12]=F>>>24,U[a|13]=F>>>16&255,U[a|14]=F>>>8&255,U[a|15]=F&255,16)}function v(){e(0,0,0,0),O=y,P=z,Q=A,R=B}function w(a,b,c){a|=0,b|=0,c|=0;var d=0;if(b&15)return-1;for(;(c|0)>=16;)V[a&7](U[b|0]<<24|U[b|1]<<16|U[b|2]<<8|U[b|3],U[b|4]<<24|U[b|5]<<16|U[b|6]<<8|U[b|7],U[b|8]<<24|U[b|9]<<16|U[b|10]<<8|U[b|11],U[b|12]<<24|U[b|13]<<16|U[b|14]<<8|U[b|15]),U[b|0]=y>>>24,U[b|1]=y>>>16&255,U[b|2]=y>>>8&255,U[b|3]=y&255,U[b|4]=z>>>24,U[b|5]=z>>>16&255,U[b|6]=z>>>8&255,U[b|7]=z&255,U[b|8]=A>>>24,U[b|9]=A>>>16&255,U[b|10]=A>>>8&255,U[b|11]=A&255,U[b|12]=B>>>24,U[b|13]=B>>>16&255,U[b|14]=B>>>8&255,U[b|15]=B&255,d=d+16|0,b=b+16|0,c=c-16|0;return d|0}function x(a,b,c){a|=0,b|=0,c|=0;var d=0;if(b&15)return-1;for(;(c|0)>=16;)W[a&1](U[b|0]<<24|U[b|1]<<16|U[b|2]<<8|U[b|3],U[b|4]<<24|U[b|5]<<16|U[b|6]<<8|U[b|7],U[b|8]<<24|U[b|9]<<16|U[b|10]<<8|U[b|11],U[b|12]<<24|U[b|13]<<16|U[b|14]<<8|U[b|15]),d=d+16|0,b=b+16|0,c=c-16|0;return d|0}var y=0,z=0,A=0,B=0,C=0,D=0,E=0,F=0,G=0,H=0,I=0,J=0,K=0,L=0,M=0,N=0,O=0,P=0,Q=0,R=0,S=0,T=new a.Uint32Array(c),U=new a.Uint8Array(c),V=[e,f,g,h,i,j,k,l],W=[g,m];return{set_rounds:n,set_state:o,set_iv:p,set_nonce:q,set_mask:r,set_counter:s,get_state:t,get_iv:u,gcm_init:v,cipher:w,mac:x}}(a,b,c);return m.set_key=e,m};return m.ENC={ECB:0,CBC:2,CFB:4,OFB:6,CTR:7},m.DEC={ECB:1,CBC:3,CFB:5,OFB:6,CTR:7},m.MAC={CBC:0,GCM:1},m.HEAP_DATA=16384,m}()),M=x.prototype;M.BLOCK_SIZE=16,M.reset=s,M.encrypt=u,M.decrypt=w;var N=y.prototype;N.BLOCK_SIZE=16,N.reset=s,N.process=t,N.finish=u;var O=z.prototype;O.BLOCK_SIZE=16,O.reset=s,O.process=v,O.finish=w;var P=new Uint8Array(1048576),Q=L(b,null,P.buffer);a.AES_CFB=x,a.AES_CFB.encrypt=A,a.AES_CFB.decrypt=B,a.AES_CFB.Encrypt=y,a.AES_CFB.Decrypt=z;var R=64,S=32;G.BLOCK_SIZE=R,G.HASH_SIZE=S;var T=G.prototype;T.reset=C,T.process=D,T.finish=E;var U=null;G.bytes=I,G.hex=J,G.base64=K,a.SHA256=G}({},function(){return this}())},{}],19:[function(a,b,c){"use strict";var d=a("./cipher");b.exports={encrypt:function(a,b,c,e,f){b=new d[b](e);var g=b.blockSize,h=new Uint8Array(g),i=new Uint8Array(g),j=new Uint8Array(a.length+2);j.set(a),j[a.length]=a[g-2],j[a.length+1]=a[g-1],a=j;var k,l,m,n=new Uint8Array(c.length+2+2*g),o=f?0:2;for(k=0;g>k;k++)h[k]=0;for(i=b.encrypt(h),k=0;g>k;k++)n[k]=i[k]^a[k];for(h.set(n.subarray(0,g)),i=b.encrypt(h),n[g]=i[0]^a[g],n[g+1]=i[1]^a[g+1],h.set(f?n.subarray(2,g+2):n.subarray(0,g)),i=b.encrypt(h),k=0;g>k;k++)n[g+2+k]=i[k+o]^c[k];for(l=g;lk;k++)n[g+m+k]=i[k]^c[l+k-o];return n=n.subarray(0,c.length+2+g)},mdc:function(a,b,c){a=new d[a](b);var e,f=a.blockSize,g=new Uint8Array(f),h=new Uint8Array(f);for(e=0;f>e;e++)g[e]=0;for(g=a.encrypt(g),e=0;f>e;e++)h[e]=c[e],g[e]^=h[e];h=a.encrypt(h);var i=new Uint8Array(g.length+2);return i.set(g),i[g.length]=h[0]^c[f],i[g.length+1]=h[1]^c[f+1],i},decrypt:function(a,b,c,e){a=new d[a](b);var f,g,h,i=a.blockSize,j=new Uint8Array(i),k=new Uint8Array(i),l=new Uint8Array(c.length-i);for(f=0;i>f;f++)j[f]=0;for(j=a.encrypt(j),f=0;i>f;f++)k[f]=c[f],j[f]^=k[f];if(k=a.encrypt(k),j[i-2]!=(k[0]^c[i])||j[i-1]!=(k[1]^c[i+1]))throw new Error("CFB decrypt: invalid key");if(g=0,e){for(f=0;i>f;f++)j[f]=c[f+2];for(h=i+2;hf&&f+hf;f++)j[f]=c[f];for(h=i;hf&&f+hm;m++)h[m]=0;else for(m=0;f>m;m++)h[m]=e[m];for(;c.length>f*i;){var l=a.encrypt(h);g=c.subarray(i*f,i*f+f);for(var m=0;mm;m++)f[m]=0;else f=e.subarray(0,g);for(;c.length>g*h;){var l=a.encrypt(f);f=c.subarray(h*g+j,h*g+g+j);for(var m=0;m>8&255}function f(a){return a>>16&255}function g(a){return a>>24&255}function h(a,b,c,d){return e(p[255&a])|e(p[b>>8&255])<<8|e(p[c>>16&255])<<16|e(p[d>>>24])<<24}function i(a){var b,c,d=a.length,e=new Array(d/4);if(a&&!(d%4)){for(b=0,c=0;d>c;c+=4)e[b++]=a[c]|a[c+1]<<8|a[c+2]<<16|a[c+3]<<24;return e}}function j(a){var b,c=0,h=a.length,i=new Array(4*h);for(b=0;h>b;b++)i[c++]=d(a[b]),i[c++]=e(a[b]),i[c++]=f(a[b]),i[c++]=g(a[b]);return i}function k(a){var b,c,h,i,j,k,l=new Array(u+1),m=a.length,p=new Array(t),q=new Array(t),r=0;if(16==m)k=10,b=4;else if(24==m)k=12,b=6;else{if(32!=m)throw new Error("Invalid key-length for AES key:"+m);k=14,b=8}for(c=0;u+1>c;c++)l[c]=new Uint32Array(4);for(c=0,h=0;m>h;h++,c+=4)p[h]=a[c]|a[c+1]<<8|a[c+2]<<16|a[c+3]<<24;for(h=b-1;h>=0;h--)q[h]=p[h];for(i=0,j=0,h=0;b>h&&k+1>i;){for(;b>h&&4>j;h++,j++)l[i][j]=q[h];4==j&&(i++,j=0)}for(;k+1>i;){var s=q[b-1];if(q[0]^=o[e(s)]|o[f(s)]<<8|o[g(s)]<<16|o[d(s)]<<24,q[0]^=n[r++],8!=b)for(h=1;b>h;h++)q[h]^=q[h-1];else{for(h=1;b/2>h;h++)q[h]^=q[h-1];for(s=q[b/2-1],q[b/2]^=o[d(s)]|o[e(s)]<<8|o[f(s)]<<16|o[g(s)]<<24,h=b/2+1;b>h;h++)q[h]^=q[h-1]}for(h=0;b>h&&k+1>i;){for(;b>h&&4>j;h++,j++)l[i][j]=q[h];4==j&&(i++,j=0)}}return{rounds:k,rk:l}}function l(a,b,c){var d,e,f;for(f=i(a),e=b.rounds,d=0;e-1>d;d++)c[0]=f[0]^b.rk[d][0],c[1]=f[1]^b.rk[d][1],c[2]=f[2]^b.rk[d][2],c[3]=f[3]^b.rk[d][3],f[0]=p[255&c[0]]^q[c[1]>>8&255]^r[c[2]>>16&255]^s[c[3]>>>24],f[1]=p[255&c[1]]^q[c[2]>>8&255]^r[c[3]>>16&255]^s[c[0]>>>24],f[2]=p[255&c[2]]^q[c[3]>>8&255]^r[c[0]>>16&255]^s[c[1]>>>24],f[3]=p[255&c[3]]^q[c[0]>>8&255]^r[c[1]>>16&255]^s[c[2]>>>24];return d=e-1,c[0]=f[0]^b.rk[d][0],c[1]=f[1]^b.rk[d][1],c[2]=f[2]^b.rk[d][2],c[3]=f[3]^b.rk[d][3],f[0]=h(c[0],c[1],c[2],c[3])^b.rk[e][0],f[1]=h(c[1],c[2],c[3],c[0])^b.rk[e][1],f[2]=h(c[2],c[3],c[0],c[1])^b.rk[e][2],f[3]=h(c[3],c[0],c[1],c[2])^b.rk[e][3],j(f)}function m(a){var b=function(a){this.key=k(a),this._temp=new Uint32Array(this.blockSize/4),this.encrypt=function(a){return l(a,this.key,this._temp)}};return b.blockSize=b.prototype.blockSize=16,b.keySize=b.prototype.keySize=a/8,b}var n=new Uint8Array([1,2,4,8,16,32,64,128,27,54,108,216,171,77,154,47,94,188,99,198,151,53,106,212,179,125,250,239,197,145]),o=new Uint8Array([99,124,119,123,242,107,111,197,48,1,103,43,254,215,171,118,202,130,201,125,250,89,71,240,173,212,162,175,156,164,114,192,183,253,147,38,54,63,247,204,52,165,229,241,113,216,49,21,4,199,35,195,24,150,5,154,7,18,128,226,235,39,178,117,9,131,44,26,27,110,90,160,82,59,214,179,41,227,47,132,83,209,0,237,32,252,177,91,106,203,190,57,74,76,88,207,208,239,170,251,67,77,51,133,69,249,2,127,80,60,159,168,81,163,64,143,146,157,56,245,188,182,218,33,16,255,243,210,205,12,19,236,95,151,68,23,196,167,126,61,100,93,25,115,96,129,79,220,34,42,144,136,70,238,184,20,222,94,11,219,224,50,58,10,73,6,36,92,194,211,172,98,145,149,228,121,231,200,55,109,141,213,78,169,108,86,244,234,101,122,174,8,186,120,37,46,28,166,180,198,232,221,116,31,75,189,139,138,112,62,181,102,72,3,246,14,97,53,87,185,134,193,29,158,225,248,152,17,105,217,142,148,155,30,135,233,206,85,40,223,140,161,137,13,191,230,66,104,65,153,45,15,176,84,187,22]),p=new Uint32Array([2774754246,2222750968,2574743534,2373680118,234025727,3177933782,2976870366,1422247313,1345335392,50397442,2842126286,2099981142,436141799,1658312629,3870010189,2591454956,1170918031,2642575903,1086966153,2273148410,368769775,3948501426,3376891790,200339707,3970805057,1742001331,4255294047,3937382213,3214711843,4154762323,2524082916,1539358875,3266819957,486407649,2928907069,1780885068,1513502316,1094664062,49805301,1338821763,1546925160,4104496465,887481809,150073849,2473685474,1943591083,1395732834,1058346282,201589768,1388824469,1696801606,1589887901,672667696,2711000631,251987210,3046808111,151455502,907153956,2608889883,1038279391,652995533,1764173646,3451040383,2675275242,453576978,2659418909,1949051992,773462580,756751158,2993581788,3998898868,4221608027,4132590244,1295727478,1641469623,3467883389,2066295122,1055122397,1898917726,2542044179,4115878822,1758581177,0,753790401,1612718144,536673507,3367088505,3982187446,3194645204,1187761037,3653156455,1262041458,3729410708,3561770136,3898103984,1255133061,1808847035,720367557,3853167183,385612781,3309519750,3612167578,1429418854,2491778321,3477423498,284817897,100794884,2172616702,4031795360,1144798328,3131023141,3819481163,4082192802,4272137053,3225436288,2324664069,2912064063,3164445985,1211644016,83228145,3753688163,3249976951,1977277103,1663115586,806359072,452984805,250868733,1842533055,1288555905,336333848,890442534,804056259,3781124030,2727843637,3427026056,957814574,1472513171,4071073621,2189328124,1195195770,2892260552,3881655738,723065138,2507371494,2690670784,2558624025,3511635870,2145180835,1713513028,2116692564,2878378043,2206763019,3393603212,703524551,3552098411,1007948840,2044649127,3797835452,487262998,1994120109,1004593371,1446130276,1312438900,503974420,3679013266,168166924,1814307912,3831258296,1573044895,1859376061,4021070915,2791465668,2828112185,2761266481,937747667,2339994098,854058965,1137232011,1496790894,3077402074,2358086913,1691735473,3528347292,3769215305,3027004632,4199962284,133494003,636152527,2942657994,2390391540,3920539207,403179536,3585784431,2289596656,1864705354,1915629148,605822008,4054230615,3350508659,1371981463,602466507,2094914977,2624877800,555687742,3712699286,3703422305,2257292045,2240449039,2423288032,1111375484,3300242801,2858837708,3628615824,84083462,32962295,302911004,2741068226,1597322602,4183250862,3501832553,2441512471,1489093017,656219450,3114180135,954327513,335083755,3013122091,856756514,3144247762,1893325225,2307821063,2811532339,3063651117,572399164,2458355477,552200649,1238290055,4283782570,2015897680,2061492133,2408352771,4171342169,2156497161,386731290,3669999461,837215959,3326231172,3093850320,3275833730,2962856233,1999449434,286199582,3417354363,4233385128,3602627437,974525996]),q=new Uint32Array([1667483301,2088564868,2004348569,2071721613,4076011277,1802229437,1869602481,3318059348,808476752,16843267,1734856361,724260477,4278118169,3621238114,2880130534,1987505306,3402272581,2189565853,3385428288,2105408135,4210749205,1499050731,1195871945,4042324747,2913812972,3570709351,2728550397,2947499498,2627478463,2762232823,1920132246,3233848155,3082253762,4261273884,2475900334,640044138,909536346,1061125697,4160222466,3435955023,875849820,2779075060,3857043764,4059166984,1903288979,3638078323,825320019,353708607,67373068,3351745874,589514341,3284376926,404238376,2526427041,84216335,2593796021,117902857,303178806,2155879323,3806519101,3958099238,656887401,2998042573,1970662047,151589403,2206408094,741103732,437924910,454768173,1852759218,1515893998,2694863867,1381147894,993752653,3604395873,3014884814,690573947,3823361342,791633521,2223248279,1397991157,3520182632,0,3991781676,538984544,4244431647,2981198280,1532737261,1785386174,3419114822,3200149465,960066123,1246401758,1280088276,1482207464,3486483786,3503340395,4025468202,2863288293,4227591446,1128498885,1296931543,859006549,2240090516,1162185423,4193904912,33686534,2139094657,1347461360,1010595908,2678007226,2829601763,1364304627,2745392638,1077969088,2408514954,2459058093,2644320700,943222856,4126535940,3166462943,3065411521,3671764853,555827811,269492272,4294960410,4092853518,3537026925,3452797260,202119188,320022069,3974939439,1600110305,2543269282,1145342156,387395129,3301217111,2812761586,2122251394,1027439175,1684326572,1566423783,421081643,1936975509,1616953504,2172721560,1330618065,3705447295,572671078,707417214,2425371563,2290617219,1179028682,4008625961,3099093971,336865340,3739133817,1583267042,185275933,3688607094,3772832571,842163286,976909390,168432670,1229558491,101059594,606357612,1549580516,3267534685,3553869166,2896970735,1650640038,2442213800,2509582756,3840201527,2038035083,3890730290,3368586051,926379609,1835915959,2374828428,3587551588,1313774802,2846444e3,1819072692,1448520954,4109693703,3941256997,1701169839,2054878350,2930657257,134746136,3132780501,2021191816,623200879,774790258,471611428,2795919345,3031724999,3334903633,3907570467,3722289532,1953818780,522141217,1263245021,3183305180,2341145990,2324303749,1886445712,1044282434,3048567236,1718013098,1212715224,50529797,4143380225,235805714,1633796771,892693087,1465364217,3115936208,2256934801,3250690392,488454695,2661164985,3789674808,4177062675,2560109491,286335539,1768542907,3654920560,2391672713,2492740519,2610638262,505297954,2273777042,3924412704,3469641545,1431677695,673730680,3755976058,2357986191,2711706104,2307459456,218962455,3216991706,3873888049,1111655622,1751699640,1094812355,2576951728,757946999,252648977,2964356043,1414834428,3149622742,370551866]),r=new Uint32Array([1673962851,2096661628,2012125559,2079755643,4076801522,1809235307,1876865391,3314635973,811618352,16909057,1741597031,727088427,4276558334,3618988759,2874009259,1995217526,3398387146,2183110018,3381215433,2113570685,4209972730,1504897881,1200539975,4042984432,2906778797,3568527316,2724199842,2940594863,2619588508,2756966308,1927583346,3231407040,3077948087,4259388669,2470293139,642542118,913070646,1065238847,4160029431,3431157708,879254580,2773611685,3855693029,4059629809,1910674289,3635114968,828527409,355090197,67636228,3348452039,591815971,3281870531,405809176,2520228246,84545285,2586817946,118360327,304363026,2149292928,3806281186,3956090603,659450151,2994720178,1978310517,152181513,2199756419,743994412,439627290,456535323,1859957358,1521806938,2690382752,1386542674,997608763,3602342358,3011366579,693271337,3822927587,794718511,2215876484,1403450707,3518589137,0,3988860141,541089824,4242743292,2977548465,1538714971,1792327274,3415033547,3194476990,963791673,1251270218,1285084236,1487988824,3481619151,3501943760,4022676207,2857362858,4226619131,1132905795,1301993293,862344499,2232521861,1166724933,4192801017,33818114,2147385727,1352724560,1014514748,2670049951,2823545768,1369633617,2740846243,1082179648,2399505039,2453646738,2636233885,946882616,4126213365,3160661948,3061301686,3668932058,557998881,270544912,4293204735,4093447923,3535760850,3447803085,202904588,321271059,3972214764,1606345055,2536874647,1149815876,388905239,3297990596,2807427751,2130477694,1031423805,1690872932,1572530013,422718233,1944491379,1623236704,2165938305,1335808335,3701702620,574907938,710180394,2419829648,2282455944,1183631942,4006029806,3094074296,338181140,3735517662,1589437022,185998603,3685578459,3772464096,845436466,980700730,169090570,1234361161,101452294,608726052,1555620956,3265224130,3552407251,2890133420,1657054818,2436475025,2503058581,3839047652,2045938553,3889509095,3364570056,929978679,1843050349,2365688973,3585172693,1318900302,2840191145,1826141292,1454176854,4109567988,3939444202,1707781989,2062847610,2923948462,135272456,3127891386,2029029496,625635109,777810478,473441308,2790781350,3027486644,3331805638,3905627112,3718347997,1961401460,524165407,1268178251,3177307325,2332919435,2316273034,1893765232,1048330814,3044132021,1724688998,1217452104,50726147,4143383030,236720654,1640145761,896163637,1471084887,3110719673,2249691526,3248052417,490350365,2653403550,3789109473,4176155640,2553000856,287453969,1775418217,3651760345,2382858638,2486413204,2603464347,507257374,2266337927,3922272489,3464972750,1437269845,676362280,3752164063,2349043596,2707028129,2299101321,219813645,3211123391,3872862694,1115997762,1758509160,1099088705,2569646233,760903469,253628687,2960903088,1420360788,3144537787,371997206]),s=new Uint32Array([3332727651,4169432188,4003034999,4136467323,4279104242,3602738027,3736170351,2438251973,1615867952,33751297,3467208551,1451043627,3877240574,3043153879,1306962859,3969545846,2403715786,530416258,2302724553,4203183485,4011195130,3001768281,2395555655,4211863792,1106029997,3009926356,1610457762,1173008303,599760028,1408738468,3835064946,2606481600,1975695287,3776773629,1034851219,1282024998,1817851446,2118205247,4110612471,2203045068,1750873140,1374987685,3509904869,4178113009,3801313649,2876496088,1649619249,708777237,135005188,2505230279,1181033251,2640233411,807933976,933336726,168756485,800430746,235472647,607523346,463175808,3745374946,3441880043,1315514151,2144187058,3936318837,303761673,496927619,1484008492,875436570,908925723,3702681198,3035519578,1543217312,2767606354,1984772923,3076642518,2110698419,1383803177,3711886307,1584475951,328696964,2801095507,3110654417,0,3240947181,1080041504,3810524412,2043195825,3069008731,3569248874,2370227147,1742323390,1917532473,2497595978,2564049996,2968016984,2236272591,3144405200,3307925487,1340451498,3977706491,2261074755,2597801293,1716859699,294946181,2328839493,3910203897,67502594,4269899647,2700103760,2017737788,632987551,1273211048,2733855057,1576969123,2160083008,92966799,1068339858,566009245,1883781176,4043634165,1675607228,2009183926,2943736538,1113792801,540020752,3843751935,4245615603,3211645650,2169294285,403966988,641012499,3274697964,3202441055,899848087,2295088196,775493399,2472002756,1441965991,4236410494,2051489085,3366741092,3135724893,841685273,3868554099,3231735904,429425025,2664517455,2743065820,1147544098,1417554474,1001099408,193169544,2362066502,3341414126,1809037496,675025940,2809781982,3168951902,371002123,2910247899,3678134496,1683370546,1951283770,337512970,2463844681,201983494,1215046692,3101973596,2673722050,3178157011,1139780780,3299238498,967348625,832869781,3543655652,4069226873,3576883175,2336475336,1851340599,3669454189,25988493,2976175573,2631028302,1239460265,3635702892,2902087254,4077384948,3475368682,3400492389,4102978170,1206496942,270010376,1876277946,4035475576,1248797989,1550986798,941890588,1475454630,1942467764,2538718918,3408128232,2709315037,3902567540,1042358047,2531085131,1641856445,226921355,260409994,3767562352,2084716094,1908716981,3433719398,2430093384,100991747,4144101110,470945294,3265487201,1784624437,2935576407,1775286713,395413126,2572730817,975641885,666476190,3644383713,3943954680,733190296,573772049,3535497577,2842745305,126455438,866620564,766942107,1008868894,361924487,3374377449,2269761230,2868860245,1350051880,2776293343,59739276,1509466529,159418761,437718285,1708834751,3610371814,2227585602,3501746280,2193834305,699439513,1517759789,504434447,2076946608,2835108948,1842789307,742004246]),t=8,u=14;b.exports={};var v=[128,192,256];for(var w in v)b.exports[v[w]]=m(v[w])},{}],21:[function(a,b,c){function d(){}function e(a){this.bf=new d,this.bf.init(a),this.encrypt=function(a){return this.bf.encrypt_block(a)}}d.prototype.BLOCKSIZE=8,d.prototype.SBOXES=[[3509652390,2564797868,805139163,3491422135,3101798381,1780907670,3128725573,4046225305,614570311,3012652279,134345442,2240740374,1667834072,1901547113,2757295779,4103290238,227898511,1921955416,1904987480,2182433518,2069144605,3260701109,2620446009,720527379,3318853667,677414384,3393288472,3101374703,2390351024,1614419982,1822297739,2954791486,3608508353,3174124327,2024746970,1432378464,3864339955,2857741204,1464375394,1676153920,1439316330,715854006,3033291828,289532110,2706671279,2087905683,3018724369,1668267050,732546397,1947742710,3462151702,2609353502,2950085171,1814351708,2050118529,680887927,999245976,1800124847,3300911131,1713906067,1641548236,4213287313,1216130144,1575780402,4018429277,3917837745,3693486850,3949271944,596196993,3549867205,258830323,2213823033,772490370,2760122372,1774776394,2652871518,566650946,4142492826,1728879713,2882767088,1783734482,3629395816,2517608232,2874225571,1861159788,326777828,3124490320,2130389656,2716951837,967770486,1724537150,2185432712,2364442137,1164943284,2105845187,998989502,3765401048,2244026483,1075463327,1455516326,1322494562,910128902,469688178,1117454909,936433444,3490320968,3675253459,1240580251,122909385,2157517691,634681816,4142456567,3825094682,3061402683,2540495037,79693498,3249098678,1084186820,1583128258,426386531,1761308591,1047286709,322548459,995290223,1845252383,2603652396,3431023940,2942221577,3202600964,3727903485,1712269319,422464435,3234572375,1170764815,3523960633,3117677531,1434042557,442511882,3600875718,1076654713,1738483198,4213154764,2393238008,3677496056,1014306527,4251020053,793779912,2902807211,842905082,4246964064,1395751752,1040244610,2656851899,3396308128,445077038,3742853595,3577915638,679411651,2892444358,2354009459,1767581616,3150600392,3791627101,3102740896,284835224,4246832056,1258075500,768725851,2589189241,3069724005,3532540348,1274779536,3789419226,2764799539,1660621633,3471099624,4011903706,913787905,3497959166,737222580,2514213453,2928710040,3937242737,1804850592,3499020752,2949064160,2386320175,2390070455,2415321851,4061277028,2290661394,2416832540,1336762016,1754252060,3520065937,3014181293,791618072,3188594551,3933548030,2332172193,3852520463,3043980520,413987798,3465142937,3030929376,4245938359,2093235073,3534596313,375366246,2157278981,2479649556,555357303,3870105701,2008414854,3344188149,4221384143,3956125452,2067696032,3594591187,2921233993,2428461,544322398,577241275,1471733935,610547355,4027169054,1432588573,1507829418,2025931657,3646575487,545086370,48609733,2200306550,1653985193,298326376,1316178497,3007786442,2064951626,458293330,2589141269,3591329599,3164325604,727753846,2179363840,146436021,1461446943,4069977195,705550613,3059967265,3887724982,4281599278,3313849956,1404054877,2845806497,146425753,1854211946],[1266315497,3048417604,3681880366,3289982499,290971e4,1235738493,2632868024,2414719590,3970600049,1771706367,1449415276,3266420449,422970021,1963543593,2690192192,3826793022,1062508698,1531092325,1804592342,2583117782,2714934279,4024971509,1294809318,4028980673,1289560198,2221992742,1669523910,35572830,157838143,1052438473,1016535060,1802137761,1753167236,1386275462,3080475397,2857371447,1040679964,2145300060,2390574316,1461121720,2956646967,4031777805,4028374788,33600511,2920084762,1018524850,629373528,3691585981,3515945977,2091462646,2486323059,586499841,988145025,935516892,3367335476,2599673255,2839830854,265290510,3972581182,2759138881,3795373465,1005194799,847297441,406762289,1314163512,1332590856,1866599683,4127851711,750260880,613907577,1450815602,3165620655,3734664991,3650291728,3012275730,3704569646,1427272223,778793252,1343938022,2676280711,2052605720,1946737175,3164576444,3914038668,3967478842,3682934266,1661551462,3294938066,4011595847,840292616,3712170807,616741398,312560963,711312465,1351876610,322626781,1910503582,271666773,2175563734,1594956187,70604529,3617834859,1007753275,1495573769,4069517037,2549218298,2663038764,504708206,2263041392,3941167025,2249088522,1514023603,1998579484,1312622330,694541497,2582060303,2151582166,1382467621,776784248,2618340202,3323268794,2497899128,2784771155,503983604,4076293799,907881277,423175695,432175456,1378068232,4145222326,3954048622,3938656102,3820766613,2793130115,2977904593,26017576,3274890735,3194772133,1700274565,1756076034,4006520079,3677328699,720338349,1533947780,354530856,688349552,3973924725,1637815568,332179504,3949051286,53804574,2852348879,3044236432,1282449977,3583942155,3416972820,4006381244,1617046695,2628476075,3002303598,1686838959,431878346,2686675385,1700445008,1080580658,1009431731,832498133,3223435511,2605976345,2271191193,2516031870,1648197032,4164389018,2548247927,300782431,375919233,238389289,3353747414,2531188641,2019080857,1475708069,455242339,2609103871,448939670,3451063019,1395535956,2413381860,1841049896,1491858159,885456874,4264095073,4001119347,1565136089,3898914787,1108368660,540939232,1173283510,2745871338,3681308437,4207628240,3343053890,4016749493,1699691293,1103962373,3625875870,2256883143,3830138730,1031889488,3479347698,1535977030,4236805024,3251091107,2132092099,1774941330,1199868427,1452454533,157007616,2904115357,342012276,595725824,1480756522,206960106,497939518,591360097,863170706,2375253569,3596610801,1814182875,2094937945,3421402208,1082520231,3463918190,2785509508,435703966,3908032597,1641649973,2842273706,3305899714,1510255612,2148256476,2655287854,3276092548,4258621189,236887753,3681803219,274041037,1734335097,3815195456,3317970021,1899903192,1026095262,4050517792,356393447,2410691914,3873677099,3682840055],[3913112168,2491498743,4132185628,2489919796,1091903735,1979897079,3170134830,3567386728,3557303409,857797738,1136121015,1342202287,507115054,2535736646,337727348,3213592640,1301675037,2528481711,1895095763,1721773893,3216771564,62756741,2142006736,835421444,2531993523,1442658625,3659876326,2882144922,676362277,1392781812,170690266,3921047035,1759253602,3611846912,1745797284,664899054,1329594018,3901205900,3045908486,2062866102,2865634940,3543621612,3464012697,1080764994,553557557,3656615353,3996768171,991055499,499776247,1265440854,648242737,3940784050,980351604,3713745714,1749149687,3396870395,4211799374,3640570775,1161844396,3125318951,1431517754,545492359,4268468663,3499529547,1437099964,2702547544,3433638243,2581715763,2787789398,1060185593,1593081372,2418618748,4260947970,69676912,2159744348,86519011,2512459080,3838209314,1220612927,3339683548,133810670,1090789135,1078426020,1569222167,845107691,3583754449,4072456591,1091646820,628848692,1613405280,3757631651,526609435,236106946,48312990,2942717905,3402727701,1797494240,859738849,992217954,4005476642,2243076622,3870952857,3732016268,765654824,3490871365,2511836413,1685915746,3888969200,1414112111,2273134842,3281911079,4080962846,172450625,2569994100,980381355,4109958455,2819808352,2716589560,2568741196,3681446669,3329971472,1835478071,660984891,3704678404,4045999559,3422617507,3040415634,1762651403,1719377915,3470491036,2693910283,3642056355,3138596744,1364962596,2073328063,1983633131,926494387,3423689081,2150032023,4096667949,1749200295,3328846651,309677260,2016342300,1779581495,3079819751,111262694,1274766160,443224088,298511866,1025883608,3806446537,1145181785,168956806,3641502830,3584813610,1689216846,3666258015,3200248200,1692713982,2646376535,4042768518,1618508792,1610833997,3523052358,4130873264,2001055236,3610705100,2202168115,4028541809,2961195399,1006657119,2006996926,3186142756,1430667929,3210227297,1314452623,4074634658,4101304120,2273951170,1399257539,3367210612,3027628629,1190975929,2062231137,2333990788,2221543033,2438960610,1181637006,548689776,2362791313,3372408396,3104550113,3145860560,296247880,1970579870,3078560182,3769228297,1714227617,3291629107,3898220290,166772364,1251581989,493813264,448347421,195405023,2709975567,677966185,3703036547,1463355134,2715995803,1338867538,1343315457,2802222074,2684532164,233230375,2599980071,2000651841,3277868038,1638401717,4028070440,3237316320,6314154,819756386,300326615,590932579,1405279636,3267499572,3150704214,2428286686,3959192993,3461946742,1862657033,1266418056,963775037,2089974820,2263052895,1917689273,448879540,3550394620,3981727096,150775221,3627908307,1303187396,508620638,2975983352,2726630617,1817252668,1876281319,1457606340,908771278,3720792119,3617206836,2455994898,1729034894,1080033504],[976866871,3556439503,2881648439,1522871579,1555064734,1336096578,3548522304,2579274686,3574697629,3205460757,3593280638,3338716283,3079412587,564236357,2993598910,1781952180,1464380207,3163844217,3332601554,1699332808,1393555694,1183702653,3581086237,1288719814,691649499,2847557200,2895455976,3193889540,2717570544,1781354906,1676643554,2592534050,3230253752,1126444790,2770207658,2633158820,2210423226,2615765581,2414155088,3127139286,673620729,2805611233,1269405062,4015350505,3341807571,4149409754,1057255273,2012875353,2162469141,2276492801,2601117357,993977747,3918593370,2654263191,753973209,36408145,2530585658,25011837,3520020182,2088578344,530523599,2918365339,1524020338,1518925132,3760827505,3759777254,1202760957,3985898139,3906192525,674977740,4174734889,2031300136,2019492241,3983892565,4153806404,3822280332,352677332,2297720250,60907813,90501309,3286998549,1016092578,2535922412,2839152426,457141659,509813237,4120667899,652014361,1966332200,2975202805,55981186,2327461051,676427537,3255491064,2882294119,3433927263,1307055953,942726286,933058658,2468411793,3933900994,4215176142,1361170020,2001714738,2830558078,3274259782,1222529897,1679025792,2729314320,3714953764,1770335741,151462246,3013232138,1682292957,1483529935,471910574,1539241949,458788160,3436315007,1807016891,3718408830,978976581,1043663428,3165965781,1927990952,4200891579,2372276910,3208408903,3533431907,1412390302,2931980059,4132332400,1947078029,3881505623,4168226417,2941484381,1077988104,1320477388,886195818,18198404,3786409e3,2509781533,112762804,3463356488,1866414978,891333506,18488651,661792760,1628790961,3885187036,3141171499,876946877,2693282273,1372485963,791857591,2686433993,3759982718,3167212022,3472953795,2716379847,445679433,3561995674,3504004811,3574258232,54117162,3331405415,2381918588,3769707343,4154350007,1140177722,4074052095,668550556,3214352940,367459370,261225585,2610173221,4209349473,3468074219,3265815641,314222801,3066103646,3808782860,282218597,3406013506,3773591054,379116347,1285071038,846784868,2669647154,3771962079,3550491691,2305946142,453669953,1268987020,3317592352,3279303384,3744833421,2610507566,3859509063,266596637,3847019092,517658769,3462560207,3443424879,370717030,4247526661,2224018117,4143653529,4112773975,2788324899,2477274417,1456262402,2901442914,1517677493,1846949527,2295493580,3734397586,2176403920,1280348187,1908823572,3871786941,846861322,1172426758,3287448474,3383383037,1655181056,3139813346,901632758,1897031941,2986607138,3066810236,3447102507,1393639104,373351379,950779232,625454576,3124240540,4148612726,2007998917,544563296,2244738638,2330496472,2058025392,1291430526,424198748,50039436,29584100,3605783033,2429876329,2791104160,1057563949,3255363231,3075367218,3463963227,1469046755,985887462]], +d.outputBuffer=this.a,this.A=new f(this.input,d)}function t(a,c){var d,e,f,g;if(Object.keys)d=Object.keys(c);else for(e in d=[],f=0,c)d[f++]=e;for(f=0,g=d.length;g>f;++f)e=d[f],b(a+"."+e,c[e])}var u=void 0,v=!0,w=this,x="undefined"!=typeof Uint8Array&&"undefined"!=typeof Uint16Array&&"undefined"!=typeof Uint32Array&&"undefined"!=typeof DataView;c.prototype.f=function(){var a,b=this.buffer,c=b.length,d=new(x?Uint8Array:Array)(c<<1);if(x)d.set(b);else for(a=0;c>a;++a)d[a]=b[a];return this.buffer=d},c.prototype.d=function(a,b,c){var d,e=this.buffer,f=this.index,g=this.i,h=e[f];if(c&&b>1&&(a=b>8?(D[255&a]<<24|D[a>>>8&255]<<16|D[a>>>16&255]<<8|D[a>>>24&255])>>32-b:D[a]>>8-b),8>b+g)h=h<d;++d)h=h<<1|a>>b-d-1&1,8===++g&&(g=0,e[f++]=D[h],h=0,f===e.length&&(e=this.f()));e[f]=h,this.buffer=e,this.i=g,this.index=f},c.prototype.finish=function(){var a,b=this.buffer,c=this.index;return 0y;++y){for(var A=y,B=A,C=7,A=A>>>1;A;A>>>=1)B<<=1,B|=1&A,--C;z[y]=(B<>>0}var D=z;d.prototype.getParent=function(a){return 2*((a-2)/4|0)},d.prototype.push=function(a,b){var c,d,e,f=this.buffer;for(c=this.length,f[this.length++]=b,f[this.length++]=a;c>0&&(d=this.getParent(c),f[c]>f[d]);)e=f[c],f[c]=f[d],f[d]=e,e=f[c+1],f[c+1]=f[d+1],f[d+1]=e,c=d;return this.length},d.prototype.pop=function(){var a,b,c,d,e,f=this.buffer;for(b=f[0],a=f[1],this.length-=2,f[0]=f[this.length],f[1]=f[this.length+1],e=0;(d=2*e+2,!(d>=this.length))&&(d+2f[d]&&(d+=2),f[d]>f[e]);)c=f[e],f[e]=f[d],f[d]=c,c=f[e+1],f[e+1]=f[d+1],f[d+1]=c,e=d;return{index:a,value:b,length:this.length}};var E,F=2,G={NONE:0,r:1,k:F,O:3},H=[];for(E=0;288>E;E++)switch(v){case 143>=E:H.push([E+48,8]);break;case 255>=E:H.push([E-144+400,9]);break;case 279>=E:H.push([E-256+0,7]);break;case 287>=E:H.push([E-280+192,8]);break;default:a("invalid literal: "+E)}f.prototype.j=function(){var b,d,e,f,g=this.input;switch(this.h){case 0:for(e=0,f=g.length;f>e;){d=x?g.subarray(e,e+65535):g.slice(e,e+65535),e+=d.length;var i=d,k=e===f,m=u,n=u,o=u,p=u,q=u,r=this.a,s=this.b;if(x){for(r=new Uint8Array(this.a.buffer);r.length<=s+i.length+5;)r=new Uint8Array(r.length<<1);r.set(this.a)}if(m=k?1:0,r[s++]=0|m,n=i.length,o=~n+65536&65535,r[s++]=255&n,r[s++]=n>>>8&255,r[s++]=255&o,r[s++]=o>>>8&255,x)r.set(i,s),s+=i.length,r=r.subarray(0,s);else{for(p=0,q=i.length;q>p;++p)r[s++]=i[p];r.length=s}this.b=s,this.a=r}break;case 1:var t=new c(x?new Uint8Array(this.a.buffer):this.a,this.b);t.d(1,1,v),t.d(1,2,v);var w,y,z,A=h(this,g);for(w=0,y=A.length;y>w;w++)if(z=A[w],c.prototype.d.apply(t,H[z]),z>256)t.d(A[++w],A[++w],v),t.d(A[++w],5),t.d(A[++w],A[++w],v);else if(256===z)break;this.a=t.finish(),this.b=this.a.length;break;case F:var B,C,D,E,G,I,J,K,L,M,N,O,P,Q,R,S=new c(x?new Uint8Array(this.a.buffer):this.a,this.b),T=[16,17,18,0,8,7,9,6,10,5,11,4,12,3,13,2,14,1,15],U=Array(19);for(B=F,S.d(1,1,v),S.d(B,2,v),C=h(this,g),I=j(this.M,15),J=l(I),K=j(this.L,7),L=l(K),D=286;D>257&&0===I[D-1];D--);for(E=30;E>1&&0===K[E-1];E--);var V,W,X,Y,Z,$,_=D,aa=E,ba=new(x?Uint32Array:Array)(_+aa),ca=new(x?Uint32Array:Array)(316),da=new(x?Uint8Array:Array)(19);for(V=W=0;_>V;V++)ba[W++]=I[V];for(V=0;aa>V;V++)ba[W++]=K[V];if(!x)for(V=0,Y=da.length;Y>V;++V)da[V]=0;for(V=Z=0,Y=ba.length;Y>V;V+=W){for(W=1;Y>V+W&&ba[V+W]===ba[V];++W);if(X=W,0===ba[V])if(3>X)for(;00;)$=138>X?X:138,$>X-3&&X>$&&($=X-3),10>=$?(ca[Z++]=17,ca[Z++]=$-3,da[17]++):(ca[Z++]=18,ca[Z++]=$-11,da[18]++),X-=$;else if(ca[Z++]=ba[V],da[ba[V]]++,X--,3>X)for(;00;)$=6>X?X:6,$>X-3&&X>$&&($=X-3),ca[Z++]=16,ca[Z++]=$-3,da[16]++,X-=$}for(b=x?ca.subarray(0,Z):ca.slice(0,Z),M=j(da,7),Q=0;19>Q;Q++)U[Q]=M[T[Q]];for(G=19;G>4&&0===U[G-1];G--);for(N=l(M),S.d(D-257,5,v),S.d(E-1,5,v),S.d(G-4,4,v),Q=0;G>Q;Q++)S.d(U[Q],3,v);for(Q=0,R=b.length;R>Q;Q++)if(O=b[Q],S.d(N[O],M[O],v),O>=16){switch(Q++,O){case 16:P=2;break;case 17:P=3;break;case 18:P=7;break;default:a("invalid code: "+O)}S.d(b[Q],P,v)}var ea,fa,ga,ha,ia,ja,ka,la,ma=[J,I],na=[L,K];for(ia=ma[0],ja=ma[1],ka=na[0],la=na[1],ea=0,fa=C.length;fa>ea;++ea)if(ga=C[ea],S.d(ia[ga],ja[ga],v),ga>256)S.d(C[++ea],C[++ea],v),ha=C[++ea],S.d(ka[ha],la[ha],v),S.d(C[++ea],C[++ea],v);else if(256===ga)break;this.a=S.finish(),this.b=this.a.length;break;default:a("invalid compression type")}return this.a};var I=function(){function b(b){switch(v){case 3===b:return[257,b-3,0];case 4===b:return[258,b-4,0];case 5===b:return[259,b-5,0];case 6===b:return[260,b-6,0];case 7===b:return[261,b-7,0];case 8===b:return[262,b-8,0];case 9===b:return[263,b-9,0];case 10===b:return[264,b-10,0];case 12>=b:return[265,b-11,1];case 14>=b:return[266,b-13,1];case 16>=b:return[267,b-15,1];case 18>=b:return[268,b-17,1];case 22>=b:return[269,b-19,2];case 26>=b:return[270,b-23,2];case 30>=b:return[271,b-27,2];case 34>=b:return[272,b-31,2];case 42>=b:return[273,b-35,3];case 50>=b:return[274,b-43,3];case 58>=b:return[275,b-51,3];case 66>=b:return[276,b-59,3];case 82>=b:return[277,b-67,4];case 98>=b:return[278,b-83,4];case 114>=b:return[279,b-99,4];case 130>=b:return[280,b-115,4];case 162>=b:return[281,b-131,5];case 194>=b:return[282,b-163,5];case 226>=b:return[283,b-195,5];case 257>=b:return[284,b-227,5];case 258===b:return[285,b-258,0];default:a("invalid length: "+b)}}var c,d,e=[];for(c=3;258>=c;c++)d=b(c),e[c]=d[2]<<24|d[1]<<16|d[0];return e}(),J=x?new Uint32Array(I):I,K=0,L=1,M={F:K,D:L};m.prototype.p=function(){for(;!this.s;){var b=n(this,3);switch(1&b&&(this.s=v),b>>>=1){case 0:var c=this.input,d=this.c,e=this.a,f=this.b,g=c.length,h=u,i=u,j=e.length,k=u;switch(this.e=this.g=0,d+1>=g&&a(Error("invalid uncompressed block header: LEN")),h=c[d++]|c[d++]<<8,d+1>=g&&a(Error("invalid uncompressed block header: NLEN")),i=c[d++]|c[d++]<<8,h===~i&&a(Error("invalid uncompressed block header: length verify")),d+h>c.length&&a(Error("input buffer is broken")),this.n){case K:for(;f+h>e.length;){if(k=j-f,h-=k,x)e.set(c.subarray(d,d+k),f),f+=k,d+=k;else for(;k--;)e[f++]=c[d++];this.b=f,e=this.f(),f=this.b}break;case L:for(;f+h>e.length;)e=this.f({v:2});break;default:a(Error("invalid inflate mode"))}if(x)e.set(c.subarray(d,d+h),f),f+=h,d+=h;else for(;h--;)e[f++]=c[d++];this.c=d,this.b=f,this.a=e;break;case 1:this.o(aa,ca);break;case 2:p(this);break;default:a(Error("unknown BTYPE: "+b))}}return this.t()};var N,O,P=[16,17,18,0,8,7,9,6,10,5,11,4,12,3,13,2,14,1,15],Q=x?new Uint16Array(P):P,R=[3,4,5,6,7,8,9,10,11,13,15,17,19,23,27,31,35,43,51,59,67,83,99,115,131,163,195,227,258,258,258],S=x?new Uint16Array(R):R,T=[0,0,0,0,0,0,0,0,1,1,1,1,2,2,2,2,3,3,3,3,4,4,4,4,5,5,5,5,0,0,0],U=x?new Uint8Array(T):T,V=[1,2,3,4,5,7,9,13,17,25,33,49,65,97,129,193,257,385,513,769,1025,1537,2049,3073,4097,6145,8193,12289,16385,24577],W=x?new Uint16Array(V):V,X=[0,0,0,0,1,1,2,2,3,3,4,4,5,5,6,6,7,7,8,8,9,9,10,10,11,11,12,12,13,13],Y=x?new Uint8Array(X):X,Z=new(x?Uint8Array:Array)(288);for(N=0,O=Z.length;O>N;++N)Z[N]=143>=N?8:255>=N?9:279>=N?7:8;var $,_,aa=e(Z),ba=new(x?Uint8Array:Array)(30);for($=0,_=ba.length;_>$;++$)ba[$]=5;var ca=e(ba);m.prototype.o=function(a,b){var c=this.a,d=this.b;this.u=a;for(var e,f,g,h,i=c.length-258;256!==(e=o(this,a));)if(256>e)d>=i&&(this.b=d,c=this.f(),d=this.b),c[d++]=e;else for(f=e-257,h=S[f],0=i&&(this.b=d,c=this.f(),d=this.b);h--;)c[d]=c[d++-g];for(;8<=this.e;)this.e-=8,this.c--;this.b=d},m.prototype.J=function(a,b){var c=this.a,d=this.b;this.u=a;for(var e,f,g,h,i=c.length;256!==(e=o(this,a));)if(256>e)d>=i&&(c=this.f(),i=c.length),c[d++]=e;else for(f=e-257,h=S[f],0i&&(c=this.f(),i=c.length);h--;)c[d]=c[d++-g];for(;8<=this.e;)this.e-=8,this.c--;this.b=d},m.prototype.f=function(){var a,b,c=new(x?Uint8Array:Array)(this.b-32768),d=this.b-32768,e=this.a;if(x)c.set(e.subarray(32768,c.length));else for(a=0,b=c.length;b>a;++a)c[a]=e[a+32768];if(this.l.push(c),this.q+=c.length,x)e.set(e.subarray(d,d+32768));else for(a=0;32768>a;++a)e[a]=e[d+a];return this.b=32768,e},m.prototype.K=function(a){var b,c,d,e,f=this.input.length/this.c+1|0,g=this.input,h=this.a;return a&&("number"==typeof a.v&&(f=a.v),"number"==typeof a.G&&(f+=a.G)),2>f?(c=(g.length-this.c)/this.u[2],e=258*(c/2)|0,d=eb;++b)for(a=h[b],d=0,e=a.length;e>d;++d)i[f++]=a[d];for(b=32768,c=this.b;c>b;++b)i[f++]=g[b];return this.l=[],this.buffer=i},m.prototype.I=function(){var a,b=this.b;return x?this.C?(a=new Uint8Array(b),a.set(this.a.subarray(0,b))):a=this.a.subarray(0,b):(this.a.length>b&&(this.a.length=b),a=this.a),this.buffer=a},r.prototype.p=function(){var b,c,d=this.input;return b=this.B.p(),this.c=this.B.c,this.N&&(c=(d[this.c++]<<24|d[this.c++]<<16|d[this.c++]<<8|d[this.c++])>>>0,c!==q(b)&&a(Error("invalid adler-32 checksum"))),b};var da=8,ea=G;s.prototype.j=function(){var b,c,d,e,f,g,h,i=0;switch(h=this.a,b=da){case da:c=Math.LOG2E*Math.log(32768)-8;break;default:a(Error("invalid compression method"))}switch(d=c<<4|b,h[i++]=d,b){case da:switch(this.h){case ea.NONE:f=0;break;case ea.r:f=1;break;case ea.k:f=2;break;default:a(Error("unsupported compression type"))}break;default:a(Error("invalid compression method"))}return e=f<<6|0,h[i++]=e|31-(256*d+e)%31,g=q(this.input),this.A.b=i,h=this.A.j(),i=h.length,x&&(h=new Uint8Array(h.buffer),h.length<=i+4&&(this.a=new Uint8Array(h.length+4),this.a.set(h),h=this.a),h=h.subarray(0,i+4)),h[i++]=g>>24&255,h[i++]=g>>16&255,h[i++]=g>>8&255,h[i++]=255&g,h},b("Zlib.Inflate",r),b("Zlib.Inflate.prototype.decompress",r.prototype.p),t("Zlib.Inflate.BufferType",{ADAPTIVE:M.D,BLOCK:M.F}),b("Zlib.Deflate",s),b("Zlib.Deflate.compress",function(a,b){return new s(a,b).j()}),b("Zlib.Deflate.prototype.compress",s.prototype.j),t("Zlib.Deflate.CompressionType",{NONE:ea.NONE,FIXED:ea.r,DYNAMIC:ea.k})}).call(this)},{}],16:[function(a,b,c){var d=a("../enums.js");b.exports={prefer_hash_algorithm:d.hash.sha256,encryption_cipher:d.symmetric.aes256,compression:d.compression.zip,integrity_protect:!0,rsa_blinding:!0,useWebCrypto:!0,useNative:!1,show_version:!0,show_comment:!0,versionstring:"OpenPGP.js v1.2.0",commentstring:"http://openpgpjs.org",keyserver:"keyserver.linux.it",node_store:"./openpgp.store",debug:!1}},{"../enums.js":43}],17:[function(a,b,c){b.exports=a("./config.js")},{"./config.js":16}],18:[function(a,b,c){!function(a,b){function c(){var a=Error.apply(this,arguments);this.message=a.message,this.stack=a.stack}function d(){var a=Error.apply(this,arguments);this.message=a.message,this.stack=a.stack}function e(){var a=Error.apply(this,arguments);this.message=a.message,this.stack=a.stack}function f(a){for(var b=a.length,c=new Uint8Array(b),d=0;b>d;d++){var e=a.charCodeAt(d);if(e>>>8)throw new Error("Wide characters are not allowed");c[d]=e}return c}function g(a){for(var b="",c=0;c=d)throw new Error("heap size must be a positive integer and a multiple of 4096");return c=c||new a(new ArrayBuffer(d))}function n(a,b,c,d,e){var f=a.length-b,g=e>f?f:e;return a.set(c.subarray(d,d+g),b),g}function o(a){a=a||{},this.heap=m(Uint8Array,a).subarray(L.HEAP_DATA),this.asm=a.asm||L(b,null,this.heap.buffer),this.mode=null,this.key=null,this.reset(a)}function p(a){if(void 0!==a){if(k(a)||l(a))a=new Uint8Array(a);else{if(!j(a))throw new TypeError("unexpected key type");a=f(a)}var b=a.length;if(16!==b&&24!==b&&32!==b)throw new d("illegal key size");var c=new DataView(a.buffer,a.byteOffset,a.byteLength);this.asm.set_key(b>>2,c.getUint32(0),c.getUint32(4),c.getUint32(8),c.getUint32(12),b>16?c.getUint32(16):0,b>16?c.getUint32(20):0,b>24?c.getUint32(24):0,b>24?c.getUint32(28):0),this.key=a}else if(!this.key)throw new Error("key is required")}function q(a){if(void 0!==a){if(k(a)||l(a))a=new Uint8Array(a);else{if(!j(a))throw new TypeError("unexpected iv type");a=f(a)}if(16!==a.length)throw new d("illegal iv size");var b=new DataView(a.buffer,a.byteOffset,a.byteLength);this.iv=a,this.asm.set_iv(b.getUint32(0),b.getUint32(4),b.getUint32(8),b.getUint32(12))}else this.iv=null,this.asm.set_iv(0,0,0,0)}function r(a){this.padding=void 0!==a?!!a:!0}function s(a){return a=a||{},this.result=null,this.pos=0,this.len=0,p.call(this,a.key),this.hasOwnProperty("iv")&&q.call(this,a.iv),this.hasOwnProperty("padding")&&r.call(this,a.padding),this}function t(a){if(j(a)&&(a=f(a)),k(a)&&(a=new Uint8Array(a)),!l(a))throw new TypeError("data isn't of expected type");for(var b=this.asm,c=this.heap,d=L.ENC[this.mode],e=L.HEAP_DATA,g=this.pos,h=this.len,i=0,m=a.length||0,o=0,p=h+m&-16,q=0,r=new Uint8Array(p);m>0;)q=n(c,g+h,a,i,m),h+=q,i+=q,m-=q,q=b.cipher(d,e+g,h),q&&r.set(c.subarray(g,g+q),o),o+=q,h>q?(g+=q,h-=q):(g=0,h=0);return this.result=r,this.pos=g,this.len=h,this}function u(a){var b=null,c=0;void 0!==a&&(b=t.call(this,a).result,c=b.length);var e=this.asm,f=this.heap,g=L.ENC[this.mode],h=L.HEAP_DATA,i=this.pos,j=this.len,k=16-j%16,l=j;if(this.hasOwnProperty("padding")){if(this.padding){for(var m=0;k>m;++m)f[i+j+m]=k;j+=k,l=j}else if(j%16)throw new d("data length must be a multiple of the block size")}else j+=k;var n=new Uint8Array(c+l);return c&&n.set(b),j&&e.cipher(g,h+i,j),l&&n.set(f.subarray(i,i+l),c),this.result=n,this.pos=0,this.len=0,this}function v(a){if(j(a)&&(a=f(a)),k(a)&&(a=new Uint8Array(a)),!l(a))throw new TypeError("data isn't of expected type");var b=this.asm,c=this.heap,d=L.DEC[this.mode],e=L.HEAP_DATA,g=this.pos,h=this.len,i=0,m=a.length||0,o=0,p=h+m&-16,q=0,r=0;this.hasOwnProperty("padding")&&this.padding&&(q=h+m-p||16,p-=q);for(var s=new Uint8Array(p);m>0;)r=n(c,g+h,a,i,m),h+=r,i+=r,m-=r,r=b.cipher(d,e+g,h-(m?0:q)),r&&s.set(c.subarray(g,g+r),o),o+=r,h>r?(g+=r,h-=r):(g=0,h=0);return this.result=s,this.pos=g,this.len=h,this}function w(a){var b=null,c=0;void 0!==a&&(b=v.call(this,a).result,c=b.length);var f=this.asm,g=this.heap,h=L.DEC[this.mode],i=L.HEAP_DATA,j=this.pos,k=this.len,l=k;if(k>0){if(k%16){if(this.hasOwnProperty("padding"))throw new d("data length must be a multiple of the block size");k+=16-k%16}if(f.cipher(h,i+j,k),this.hasOwnProperty("padding")&&this.padding){var m=g[j+l-1];if(1>m||m>16||m>l)throw new e("bad padding");for(var n=0,o=m;o>1;o--)n|=m^g[j+l-o];if(n)throw new e("bad padding");l-=m}}var p=new Uint8Array(c+l);return c>0&&p.set(b),l>0&&p.set(g.subarray(j,j+l),c),this.result=p,this.pos=0,this.len=0,this}function x(a){this.iv=null,o.call(this,a),this.mode="CFB"}function y(a){x.call(this,a)}function z(a){x.call(this,a)}function A(a,b,c){if(void 0===a)throw new SyntaxError("data required");if(void 0===b)throw new SyntaxError("key required");return new x({heap:P,asm:Q,key:b,iv:c}).encrypt(a).result}function B(a,b,c){if(void 0===a)throw new SyntaxError("data required");if(void 0===b)throw new SyntaxError("key required");return new x({heap:P,asm:Q,key:b,iv:c}).decrypt(a).result}function C(){return this.result=null,this.pos=0,this.len=0,this.asm.reset(),this}function D(a){if(null!==this.result)throw new c("state must be reset before processing new data");if(j(a)&&(a=f(a)),k(a)&&(a=new Uint8Array(a)),!l(a))throw new TypeError("data isn't of expected type");for(var b=this.asm,d=this.heap,e=this.pos,g=this.len,h=0,i=a.length,m=0;i>0;)m=n(d,e+g,a,h,i),g+=m,h+=m,i-=m,m=b.process(e,g),e+=m,g-=m,g||(e=0);return this.pos=e,this.len=g,this}function E(){if(null!==this.result)throw new c("state must be reset before processing new data");return this.asm.finish(this.pos,this.len,0),this.result=new Uint8Array(this.HASH_SIZE),this.result.set(this.heap.subarray(0,this.HASH_SIZE)),this.pos=0,this.len=0,this}function F(a,b,c){"use asm";function d(a,b,c,d,e,f,g,h,i,j,k,l,m,n,o,x){a|=0,b|=0,c|=0,d|=0,e|=0,f|=0,g|=0,h|=0,i|=0,j|=0,k|=0,l|=0,m|=0,n|=0,o|=0,x|=0;var y=0,z=0,A=0,B=0,C=0,D=0,E=0,F=0,G=0;y=p,z=q,A=r,B=s,C=t,D=u,E=v,F=w,G=a+F+(C>>>6^C>>>11^C>>>25^C<<26^C<<21^C<<7)+(E^C&(D^E))+1116352408|0,F=E,E=D,D=C,C=B+G|0,B=A,A=z,z=y,y=G+(z&A^B&(z^A))+(z>>>2^z>>>13^z>>>22^z<<30^z<<19^z<<10)|0,G=b+F+(C>>>6^C>>>11^C>>>25^C<<26^C<<21^C<<7)+(E^C&(D^E))+1899447441|0,F=E,E=D,D=C,C=B+G|0,B=A,A=z,z=y,y=G+(z&A^B&(z^A))+(z>>>2^z>>>13^z>>>22^z<<30^z<<19^z<<10)|0,G=c+F+(C>>>6^C>>>11^C>>>25^C<<26^C<<21^C<<7)+(E^C&(D^E))+3049323471|0,F=E,E=D,D=C,C=B+G|0,B=A,A=z,z=y,y=G+(z&A^B&(z^A))+(z>>>2^z>>>13^z>>>22^z<<30^z<<19^z<<10)|0,G=d+F+(C>>>6^C>>>11^C>>>25^C<<26^C<<21^C<<7)+(E^C&(D^E))+3921009573|0,F=E,E=D,D=C,C=B+G|0,B=A,A=z,z=y,y=G+(z&A^B&(z^A))+(z>>>2^z>>>13^z>>>22^z<<30^z<<19^z<<10)|0,G=e+F+(C>>>6^C>>>11^C>>>25^C<<26^C<<21^C<<7)+(E^C&(D^E))+961987163|0,F=E,E=D,D=C,C=B+G|0,B=A,A=z,z=y,y=G+(z&A^B&(z^A))+(z>>>2^z>>>13^z>>>22^z<<30^z<<19^z<<10)|0,G=f+F+(C>>>6^C>>>11^C>>>25^C<<26^C<<21^C<<7)+(E^C&(D^E))+1508970993|0,F=E,E=D,D=C,C=B+G|0,B=A,A=z,z=y,y=G+(z&A^B&(z^A))+(z>>>2^z>>>13^z>>>22^z<<30^z<<19^z<<10)|0,G=g+F+(C>>>6^C>>>11^C>>>25^C<<26^C<<21^C<<7)+(E^C&(D^E))+2453635748|0,F=E,E=D,D=C,C=B+G|0,B=A,A=z,z=y,y=G+(z&A^B&(z^A))+(z>>>2^z>>>13^z>>>22^z<<30^z<<19^z<<10)|0,G=h+F+(C>>>6^C>>>11^C>>>25^C<<26^C<<21^C<<7)+(E^C&(D^E))+2870763221|0,F=E,E=D,D=C,C=B+G|0,B=A,A=z,z=y,y=G+(z&A^B&(z^A))+(z>>>2^z>>>13^z>>>22^z<<30^z<<19^z<<10)|0,G=i+F+(C>>>6^C>>>11^C>>>25^C<<26^C<<21^C<<7)+(E^C&(D^E))+3624381080|0,F=E,E=D,D=C,C=B+G|0,B=A,A=z,z=y,y=G+(z&A^B&(z^A))+(z>>>2^z>>>13^z>>>22^z<<30^z<<19^z<<10)|0,G=j+F+(C>>>6^C>>>11^C>>>25^C<<26^C<<21^C<<7)+(E^C&(D^E))+310598401|0,F=E,E=D,D=C,C=B+G|0,B=A,A=z,z=y,y=G+(z&A^B&(z^A))+(z>>>2^z>>>13^z>>>22^z<<30^z<<19^z<<10)|0,G=k+F+(C>>>6^C>>>11^C>>>25^C<<26^C<<21^C<<7)+(E^C&(D^E))+607225278|0,F=E,E=D,D=C,C=B+G|0,B=A,A=z,z=y,y=G+(z&A^B&(z^A))+(z>>>2^z>>>13^z>>>22^z<<30^z<<19^z<<10)|0,G=l+F+(C>>>6^C>>>11^C>>>25^C<<26^C<<21^C<<7)+(E^C&(D^E))+1426881987|0,F=E,E=D,D=C,C=B+G|0,B=A,A=z,z=y,y=G+(z&A^B&(z^A))+(z>>>2^z>>>13^z>>>22^z<<30^z<<19^z<<10)|0,G=m+F+(C>>>6^C>>>11^C>>>25^C<<26^C<<21^C<<7)+(E^C&(D^E))+1925078388|0,F=E,E=D,D=C,C=B+G|0,B=A,A=z,z=y,y=G+(z&A^B&(z^A))+(z>>>2^z>>>13^z>>>22^z<<30^z<<19^z<<10)|0,G=n+F+(C>>>6^C>>>11^C>>>25^C<<26^C<<21^C<<7)+(E^C&(D^E))+2162078206|0,F=E,E=D,D=C,C=B+G|0,B=A,A=z,z=y,y=G+(z&A^B&(z^A))+(z>>>2^z>>>13^z>>>22^z<<30^z<<19^z<<10)|0,G=o+F+(C>>>6^C>>>11^C>>>25^C<<26^C<<21^C<<7)+(E^C&(D^E))+2614888103|0,F=E,E=D,D=C,C=B+G|0,B=A,A=z,z=y,y=G+(z&A^B&(z^A))+(z>>>2^z>>>13^z>>>22^z<<30^z<<19^z<<10)|0,G=x+F+(C>>>6^C>>>11^C>>>25^C<<26^C<<21^C<<7)+(E^C&(D^E))+3248222580|0,F=E,E=D,D=C,C=B+G|0,B=A,A=z,z=y,y=G+(z&A^B&(z^A))+(z>>>2^z>>>13^z>>>22^z<<30^z<<19^z<<10)|0,a=G=(b>>>7^b>>>18^b>>>3^b<<25^b<<14)+(o>>>17^o>>>19^o>>>10^o<<15^o<<13)+a+j|0,G=G+F+(C>>>6^C>>>11^C>>>25^C<<26^C<<21^C<<7)+(E^C&(D^E))+3835390401|0,F=E,E=D,D=C,C=B+G|0,B=A,A=z,z=y,y=G+(z&A^B&(z^A))+(z>>>2^z>>>13^z>>>22^z<<30^z<<19^z<<10)|0,b=G=(c>>>7^c>>>18^c>>>3^c<<25^c<<14)+(x>>>17^x>>>19^x>>>10^x<<15^x<<13)+b+k|0,G=G+F+(C>>>6^C>>>11^C>>>25^C<<26^C<<21^C<<7)+(E^C&(D^E))+4022224774|0,F=E,E=D,D=C,C=B+G|0,B=A,A=z,z=y,y=G+(z&A^B&(z^A))+(z>>>2^z>>>13^z>>>22^z<<30^z<<19^z<<10)|0,c=G=(d>>>7^d>>>18^d>>>3^d<<25^d<<14)+(a>>>17^a>>>19^a>>>10^a<<15^a<<13)+c+l|0,G=G+F+(C>>>6^C>>>11^C>>>25^C<<26^C<<21^C<<7)+(E^C&(D^E))+264347078|0,F=E,E=D,D=C,C=B+G|0,B=A,A=z,z=y,y=G+(z&A^B&(z^A))+(z>>>2^z>>>13^z>>>22^z<<30^z<<19^z<<10)|0,d=G=(e>>>7^e>>>18^e>>>3^e<<25^e<<14)+(b>>>17^b>>>19^b>>>10^b<<15^b<<13)+d+m|0,G=G+F+(C>>>6^C>>>11^C>>>25^C<<26^C<<21^C<<7)+(E^C&(D^E))+604807628|0,F=E,E=D,D=C,C=B+G|0,B=A,A=z,z=y,y=G+(z&A^B&(z^A))+(z>>>2^z>>>13^z>>>22^z<<30^z<<19^z<<10)|0,e=G=(f>>>7^f>>>18^f>>>3^f<<25^f<<14)+(c>>>17^c>>>19^c>>>10^c<<15^c<<13)+e+n|0,G=G+F+(C>>>6^C>>>11^C>>>25^C<<26^C<<21^C<<7)+(E^C&(D^E))+770255983|0,F=E,E=D,D=C,C=B+G|0,B=A,A=z,z=y,y=G+(z&A^B&(z^A))+(z>>>2^z>>>13^z>>>22^z<<30^z<<19^z<<10)|0,f=G=(g>>>7^g>>>18^g>>>3^g<<25^g<<14)+(d>>>17^d>>>19^d>>>10^d<<15^d<<13)+f+o|0,G=G+F+(C>>>6^C>>>11^C>>>25^C<<26^C<<21^C<<7)+(E^C&(D^E))+1249150122|0,F=E,E=D,D=C,C=B+G|0,B=A,A=z,z=y,y=G+(z&A^B&(z^A))+(z>>>2^z>>>13^z>>>22^z<<30^z<<19^z<<10)|0,g=G=(h>>>7^h>>>18^h>>>3^h<<25^h<<14)+(e>>>17^e>>>19^e>>>10^e<<15^e<<13)+g+x|0,G=G+F+(C>>>6^C>>>11^C>>>25^C<<26^C<<21^C<<7)+(E^C&(D^E))+1555081692|0,F=E,E=D,D=C,C=B+G|0,B=A,A=z,z=y,y=G+(z&A^B&(z^A))+(z>>>2^z>>>13^z>>>22^z<<30^z<<19^z<<10)|0,h=G=(i>>>7^i>>>18^i>>>3^i<<25^i<<14)+(f>>>17^f>>>19^f>>>10^f<<15^f<<13)+h+a|0,G=G+F+(C>>>6^C>>>11^C>>>25^C<<26^C<<21^C<<7)+(E^C&(D^E))+1996064986|0,F=E,E=D,D=C,C=B+G|0,B=A,A=z,z=y,y=G+(z&A^B&(z^A))+(z>>>2^z>>>13^z>>>22^z<<30^z<<19^z<<10)|0,i=G=(j>>>7^j>>>18^j>>>3^j<<25^j<<14)+(g>>>17^g>>>19^g>>>10^g<<15^g<<13)+i+b|0,G=G+F+(C>>>6^C>>>11^C>>>25^C<<26^C<<21^C<<7)+(E^C&(D^E))+2554220882|0,F=E,E=D,D=C,C=B+G|0,B=A,A=z,z=y,y=G+(z&A^B&(z^A))+(z>>>2^z>>>13^z>>>22^z<<30^z<<19^z<<10)|0,j=G=(k>>>7^k>>>18^k>>>3^k<<25^k<<14)+(h>>>17^h>>>19^h>>>10^h<<15^h<<13)+j+c|0,G=G+F+(C>>>6^C>>>11^C>>>25^C<<26^C<<21^C<<7)+(E^C&(D^E))+2821834349|0,F=E,E=D,D=C,C=B+G|0,B=A,A=z,z=y,y=G+(z&A^B&(z^A))+(z>>>2^z>>>13^z>>>22^z<<30^z<<19^z<<10)|0,k=G=(l>>>7^l>>>18^l>>>3^l<<25^l<<14)+(i>>>17^i>>>19^i>>>10^i<<15^i<<13)+k+d|0,G=G+F+(C>>>6^C>>>11^C>>>25^C<<26^C<<21^C<<7)+(E^C&(D^E))+2952996808|0,F=E,E=D,D=C,C=B+G|0,B=A,A=z,z=y,y=G+(z&A^B&(z^A))+(z>>>2^z>>>13^z>>>22^z<<30^z<<19^z<<10)|0,l=G=(m>>>7^m>>>18^m>>>3^m<<25^m<<14)+(j>>>17^j>>>19^j>>>10^j<<15^j<<13)+l+e|0,G=G+F+(C>>>6^C>>>11^C>>>25^C<<26^C<<21^C<<7)+(E^C&(D^E))+3210313671|0,F=E,E=D,D=C,C=B+G|0,B=A,A=z,z=y,y=G+(z&A^B&(z^A))+(z>>>2^z>>>13^z>>>22^z<<30^z<<19^z<<10)|0,m=G=(n>>>7^n>>>18^n>>>3^n<<25^n<<14)+(k>>>17^k>>>19^k>>>10^k<<15^k<<13)+m+f|0,G=G+F+(C>>>6^C>>>11^C>>>25^C<<26^C<<21^C<<7)+(E^C&(D^E))+3336571891|0,F=E,E=D,D=C,C=B+G|0,B=A,A=z,z=y,y=G+(z&A^B&(z^A))+(z>>>2^z>>>13^z>>>22^z<<30^z<<19^z<<10)|0,n=G=(o>>>7^o>>>18^o>>>3^o<<25^o<<14)+(l>>>17^l>>>19^l>>>10^l<<15^l<<13)+n+g|0,G=G+F+(C>>>6^C>>>11^C>>>25^C<<26^C<<21^C<<7)+(E^C&(D^E))+3584528711|0,F=E,E=D,D=C,C=B+G|0,B=A,A=z,z=y,y=G+(z&A^B&(z^A))+(z>>>2^z>>>13^z>>>22^z<<30^z<<19^z<<10)|0,o=G=(x>>>7^x>>>18^x>>>3^x<<25^x<<14)+(m>>>17^m>>>19^m>>>10^m<<15^m<<13)+o+h|0,G=G+F+(C>>>6^C>>>11^C>>>25^C<<26^C<<21^C<<7)+(E^C&(D^E))+113926993|0,F=E,E=D,D=C,C=B+G|0,B=A,A=z,z=y,y=G+(z&A^B&(z^A))+(z>>>2^z>>>13^z>>>22^z<<30^z<<19^z<<10)|0,x=G=(a>>>7^a>>>18^a>>>3^a<<25^a<<14)+(n>>>17^n>>>19^n>>>10^n<<15^n<<13)+x+i|0,G=G+F+(C>>>6^C>>>11^C>>>25^C<<26^C<<21^C<<7)+(E^C&(D^E))+338241895|0,F=E,E=D,D=C,C=B+G|0,B=A,A=z,z=y,y=G+(z&A^B&(z^A))+(z>>>2^z>>>13^z>>>22^z<<30^z<<19^z<<10)|0,a=G=(b>>>7^b>>>18^b>>>3^b<<25^b<<14)+(o>>>17^o>>>19^o>>>10^o<<15^o<<13)+a+j|0,G=G+F+(C>>>6^C>>>11^C>>>25^C<<26^C<<21^C<<7)+(E^C&(D^E))+666307205|0,F=E,E=D,D=C,C=B+G|0,B=A,A=z,z=y,y=G+(z&A^B&(z^A))+(z>>>2^z>>>13^z>>>22^z<<30^z<<19^z<<10)|0,b=G=(c>>>7^c>>>18^c>>>3^c<<25^c<<14)+(x>>>17^x>>>19^x>>>10^x<<15^x<<13)+b+k|0,G=G+F+(C>>>6^C>>>11^C>>>25^C<<26^C<<21^C<<7)+(E^C&(D^E))+773529912|0,F=E,E=D,D=C,C=B+G|0,B=A,A=z,z=y,y=G+(z&A^B&(z^A))+(z>>>2^z>>>13^z>>>22^z<<30^z<<19^z<<10)|0,c=G=(d>>>7^d>>>18^d>>>3^d<<25^d<<14)+(a>>>17^a>>>19^a>>>10^a<<15^a<<13)+c+l|0,G=G+F+(C>>>6^C>>>11^C>>>25^C<<26^C<<21^C<<7)+(E^C&(D^E))+1294757372|0,F=E,E=D,D=C,C=B+G|0,B=A,A=z,z=y,y=G+(z&A^B&(z^A))+(z>>>2^z>>>13^z>>>22^z<<30^z<<19^z<<10)|0,d=G=(e>>>7^e>>>18^e>>>3^e<<25^e<<14)+(b>>>17^b>>>19^b>>>10^b<<15^b<<13)+d+m|0,G=G+F+(C>>>6^C>>>11^C>>>25^C<<26^C<<21^C<<7)+(E^C&(D^E))+1396182291|0,F=E,E=D,D=C,C=B+G|0,B=A,A=z,z=y,y=G+(z&A^B&(z^A))+(z>>>2^z>>>13^z>>>22^z<<30^z<<19^z<<10)|0,e=G=(f>>>7^f>>>18^f>>>3^f<<25^f<<14)+(c>>>17^c>>>19^c>>>10^c<<15^c<<13)+e+n|0,G=G+F+(C>>>6^C>>>11^C>>>25^C<<26^C<<21^C<<7)+(E^C&(D^E))+1695183700|0,F=E,E=D,D=C,C=B+G|0,B=A,A=z,z=y,y=G+(z&A^B&(z^A))+(z>>>2^z>>>13^z>>>22^z<<30^z<<19^z<<10)|0,f=G=(g>>>7^g>>>18^g>>>3^g<<25^g<<14)+(d>>>17^d>>>19^d>>>10^d<<15^d<<13)+f+o|0,G=G+F+(C>>>6^C>>>11^C>>>25^C<<26^C<<21^C<<7)+(E^C&(D^E))+1986661051|0,F=E,E=D,D=C,C=B+G|0,B=A,A=z,z=y,y=G+(z&A^B&(z^A))+(z>>>2^z>>>13^z>>>22^z<<30^z<<19^z<<10)|0,g=G=(h>>>7^h>>>18^h>>>3^h<<25^h<<14)+(e>>>17^e>>>19^e>>>10^e<<15^e<<13)+g+x|0,G=G+F+(C>>>6^C>>>11^C>>>25^C<<26^C<<21^C<<7)+(E^C&(D^E))+2177026350|0,F=E,E=D,D=C,C=B+G|0,B=A,A=z,z=y,y=G+(z&A^B&(z^A))+(z>>>2^z>>>13^z>>>22^z<<30^z<<19^z<<10)|0,h=G=(i>>>7^i>>>18^i>>>3^i<<25^i<<14)+(f>>>17^f>>>19^f>>>10^f<<15^f<<13)+h+a|0,G=G+F+(C>>>6^C>>>11^C>>>25^C<<26^C<<21^C<<7)+(E^C&(D^E))+2456956037|0,F=E,E=D,D=C,C=B+G|0,B=A,A=z,z=y,y=G+(z&A^B&(z^A))+(z>>>2^z>>>13^z>>>22^z<<30^z<<19^z<<10)|0,i=G=(j>>>7^j>>>18^j>>>3^j<<25^j<<14)+(g>>>17^g>>>19^g>>>10^g<<15^g<<13)+i+b|0,G=G+F+(C>>>6^C>>>11^C>>>25^C<<26^C<<21^C<<7)+(E^C&(D^E))+2730485921|0,F=E,E=D,D=C,C=B+G|0,B=A,A=z,z=y,y=G+(z&A^B&(z^A))+(z>>>2^z>>>13^z>>>22^z<<30^z<<19^z<<10)|0,j=G=(k>>>7^k>>>18^k>>>3^k<<25^k<<14)+(h>>>17^h>>>19^h>>>10^h<<15^h<<13)+j+c|0,G=G+F+(C>>>6^C>>>11^C>>>25^C<<26^C<<21^C<<7)+(E^C&(D^E))+2820302411|0,F=E,E=D,D=C,C=B+G|0,B=A,A=z,z=y,y=G+(z&A^B&(z^A))+(z>>>2^z>>>13^z>>>22^z<<30^z<<19^z<<10)|0,k=G=(l>>>7^l>>>18^l>>>3^l<<25^l<<14)+(i>>>17^i>>>19^i>>>10^i<<15^i<<13)+k+d|0,G=G+F+(C>>>6^C>>>11^C>>>25^C<<26^C<<21^C<<7)+(E^C&(D^E))+3259730800|0,F=E,E=D,D=C,C=B+G|0,B=A,A=z,z=y,y=G+(z&A^B&(z^A))+(z>>>2^z>>>13^z>>>22^z<<30^z<<19^z<<10)|0,l=G=(m>>>7^m>>>18^m>>>3^m<<25^m<<14)+(j>>>17^j>>>19^j>>>10^j<<15^j<<13)+l+e|0,G=G+F+(C>>>6^C>>>11^C>>>25^C<<26^C<<21^C<<7)+(E^C&(D^E))+3345764771|0,F=E,E=D,D=C,C=B+G|0,B=A,A=z,z=y,y=G+(z&A^B&(z^A))+(z>>>2^z>>>13^z>>>22^z<<30^z<<19^z<<10)|0,m=G=(n>>>7^n>>>18^n>>>3^n<<25^n<<14)+(k>>>17^k>>>19^k>>>10^k<<15^k<<13)+m+f|0,G=G+F+(C>>>6^C>>>11^C>>>25^C<<26^C<<21^C<<7)+(E^C&(D^E))+3516065817|0,F=E,E=D,D=C,C=B+G|0,B=A,A=z,z=y,y=G+(z&A^B&(z^A))+(z>>>2^z>>>13^z>>>22^z<<30^z<<19^z<<10)|0,n=G=(o>>>7^o>>>18^o>>>3^o<<25^o<<14)+(l>>>17^l>>>19^l>>>10^l<<15^l<<13)+n+g|0,G=G+F+(C>>>6^C>>>11^C>>>25^C<<26^C<<21^C<<7)+(E^C&(D^E))+3600352804|0,F=E,E=D,D=C,C=B+G|0,B=A,A=z,z=y,y=G+(z&A^B&(z^A))+(z>>>2^z>>>13^z>>>22^z<<30^z<<19^z<<10)|0,o=G=(x>>>7^x>>>18^x>>>3^x<<25^x<<14)+(m>>>17^m>>>19^m>>>10^m<<15^m<<13)+o+h|0,G=G+F+(C>>>6^C>>>11^C>>>25^C<<26^C<<21^C<<7)+(E^C&(D^E))+4094571909|0,F=E,E=D,D=C,C=B+G|0,B=A,A=z,z=y,y=G+(z&A^B&(z^A))+(z>>>2^z>>>13^z>>>22^z<<30^z<<19^z<<10)|0,x=G=(a>>>7^a>>>18^a>>>3^a<<25^a<<14)+(n>>>17^n>>>19^n>>>10^n<<15^n<<13)+x+i|0,G=G+F+(C>>>6^C>>>11^C>>>25^C<<26^C<<21^C<<7)+(E^C&(D^E))+275423344|0,F=E,E=D,D=C,C=B+G|0,B=A,A=z,z=y,y=G+(z&A^B&(z^A))+(z>>>2^z>>>13^z>>>22^z<<30^z<<19^z<<10)|0,a=G=(b>>>7^b>>>18^b>>>3^b<<25^b<<14)+(o>>>17^o>>>19^o>>>10^o<<15^o<<13)+a+j|0,G=G+F+(C>>>6^C>>>11^C>>>25^C<<26^C<<21^C<<7)+(E^C&(D^E))+430227734|0,F=E,E=D,D=C,C=B+G|0,B=A,A=z,z=y,y=G+(z&A^B&(z^A))+(z>>>2^z>>>13^z>>>22^z<<30^z<<19^z<<10)|0,b=G=(c>>>7^c>>>18^c>>>3^c<<25^c<<14)+(x>>>17^x>>>19^x>>>10^x<<15^x<<13)+b+k|0,G=G+F+(C>>>6^C>>>11^C>>>25^C<<26^C<<21^C<<7)+(E^C&(D^E))+506948616|0,F=E,E=D,D=C,C=B+G|0,B=A,A=z,z=y,y=G+(z&A^B&(z^A))+(z>>>2^z>>>13^z>>>22^z<<30^z<<19^z<<10)|0,c=G=(d>>>7^d>>>18^d>>>3^d<<25^d<<14)+(a>>>17^a>>>19^a>>>10^a<<15^a<<13)+c+l|0,G=G+F+(C>>>6^C>>>11^C>>>25^C<<26^C<<21^C<<7)+(E^C&(D^E))+659060556|0,F=E,E=D,D=C,C=B+G|0,B=A,A=z,z=y,y=G+(z&A^B&(z^A))+(z>>>2^z>>>13^z>>>22^z<<30^z<<19^z<<10)|0,d=G=(e>>>7^e>>>18^e>>>3^e<<25^e<<14)+(b>>>17^b>>>19^b>>>10^b<<15^b<<13)+d+m|0,G=G+F+(C>>>6^C>>>11^C>>>25^C<<26^C<<21^C<<7)+(E^C&(D^E))+883997877|0,F=E,E=D,D=C,C=B+G|0,B=A,A=z,z=y,y=G+(z&A^B&(z^A))+(z>>>2^z>>>13^z>>>22^z<<30^z<<19^z<<10)|0,e=G=(f>>>7^f>>>18^f>>>3^f<<25^f<<14)+(c>>>17^c>>>19^c>>>10^c<<15^c<<13)+e+n|0,G=G+F+(C>>>6^C>>>11^C>>>25^C<<26^C<<21^C<<7)+(E^C&(D^E))+958139571|0,F=E,E=D,D=C,C=B+G|0,B=A,A=z,z=y,y=G+(z&A^B&(z^A))+(z>>>2^z>>>13^z>>>22^z<<30^z<<19^z<<10)|0,f=G=(g>>>7^g>>>18^g>>>3^g<<25^g<<14)+(d>>>17^d>>>19^d>>>10^d<<15^d<<13)+f+o|0,G=G+F+(C>>>6^C>>>11^C>>>25^C<<26^C<<21^C<<7)+(E^C&(D^E))+1322822218|0,F=E,E=D,D=C,C=B+G|0,B=A,A=z,z=y,y=G+(z&A^B&(z^A))+(z>>>2^z>>>13^z>>>22^z<<30^z<<19^z<<10)|0,g=G=(h>>>7^h>>>18^h>>>3^h<<25^h<<14)+(e>>>17^e>>>19^e>>>10^e<<15^e<<13)+g+x|0,G=G+F+(C>>>6^C>>>11^C>>>25^C<<26^C<<21^C<<7)+(E^C&(D^E))+1537002063|0,F=E,E=D,D=C,C=B+G|0,B=A,A=z,z=y,y=G+(z&A^B&(z^A))+(z>>>2^z>>>13^z>>>22^z<<30^z<<19^z<<10)|0,h=G=(i>>>7^i>>>18^i>>>3^i<<25^i<<14)+(f>>>17^f>>>19^f>>>10^f<<15^f<<13)+h+a|0,G=G+F+(C>>>6^C>>>11^C>>>25^C<<26^C<<21^C<<7)+(E^C&(D^E))+1747873779|0,F=E,E=D,D=C,C=B+G|0,B=A,A=z,z=y,y=G+(z&A^B&(z^A))+(z>>>2^z>>>13^z>>>22^z<<30^z<<19^z<<10)|0,i=G=(j>>>7^j>>>18^j>>>3^j<<25^j<<14)+(g>>>17^g>>>19^g>>>10^g<<15^g<<13)+i+b|0,G=G+F+(C>>>6^C>>>11^C>>>25^C<<26^C<<21^C<<7)+(E^C&(D^E))+1955562222|0,F=E,E=D,D=C,C=B+G|0,B=A,A=z,z=y,y=G+(z&A^B&(z^A))+(z>>>2^z>>>13^z>>>22^z<<30^z<<19^z<<10)|0,j=G=(k>>>7^k>>>18^k>>>3^k<<25^k<<14)+(h>>>17^h>>>19^h>>>10^h<<15^h<<13)+j+c|0,G=G+F+(C>>>6^C>>>11^C>>>25^C<<26^C<<21^C<<7)+(E^C&(D^E))+2024104815|0,F=E,E=D,D=C,C=B+G|0,B=A,A=z,z=y,y=G+(z&A^B&(z^A))+(z>>>2^z>>>13^z>>>22^z<<30^z<<19^z<<10)|0,k=G=(l>>>7^l>>>18^l>>>3^l<<25^l<<14)+(i>>>17^i>>>19^i>>>10^i<<15^i<<13)+k+d|0,G=G+F+(C>>>6^C>>>11^C>>>25^C<<26^C<<21^C<<7)+(E^C&(D^E))+2227730452|0,F=E,E=D,D=C,C=B+G|0,B=A,A=z,z=y,y=G+(z&A^B&(z^A))+(z>>>2^z>>>13^z>>>22^z<<30^z<<19^z<<10)|0,l=G=(m>>>7^m>>>18^m>>>3^m<<25^m<<14)+(j>>>17^j>>>19^j>>>10^j<<15^j<<13)+l+e|0,G=G+F+(C>>>6^C>>>11^C>>>25^C<<26^C<<21^C<<7)+(E^C&(D^E))+2361852424|0,F=E,E=D,D=C,C=B+G|0,B=A,A=z,z=y,y=G+(z&A^B&(z^A))+(z>>>2^z>>>13^z>>>22^z<<30^z<<19^z<<10)|0,m=G=(n>>>7^n>>>18^n>>>3^n<<25^n<<14)+(k>>>17^k>>>19^k>>>10^k<<15^k<<13)+m+f|0,G=G+F+(C>>>6^C>>>11^C>>>25^C<<26^C<<21^C<<7)+(E^C&(D^E))+2428436474|0,F=E,E=D,D=C,C=B+G|0,B=A,A=z,z=y,y=G+(z&A^B&(z^A))+(z>>>2^z>>>13^z>>>22^z<<30^z<<19^z<<10)|0,n=G=(o>>>7^o>>>18^o>>>3^o<<25^o<<14)+(l>>>17^l>>>19^l>>>10^l<<15^l<<13)+n+g|0,G=G+F+(C>>>6^C>>>11^C>>>25^C<<26^C<<21^C<<7)+(E^C&(D^E))+2756734187|0,F=E,E=D,D=C,C=B+G|0,B=A,A=z,z=y,y=G+(z&A^B&(z^A))+(z>>>2^z>>>13^z>>>22^z<<30^z<<19^z<<10)|0,o=G=(x>>>7^x>>>18^x>>>3^x<<25^x<<14)+(m>>>17^m>>>19^m>>>10^m<<15^m<<13)+o+h|0,G=G+F+(C>>>6^C>>>11^C>>>25^C<<26^C<<21^C<<7)+(E^C&(D^E))+3204031479|0,F=E,E=D,D=C,C=B+G|0,B=A,A=z,z=y,y=G+(z&A^B&(z^A))+(z>>>2^z>>>13^z>>>22^z<<30^z<<19^z<<10)|0,x=G=(a>>>7^a>>>18^a>>>3^a<<25^a<<14)+(n>>>17^n>>>19^n>>>10^n<<15^n<<13)+x+i|0,G=G+F+(C>>>6^C>>>11^C>>>25^C<<26^C<<21^C<<7)+(E^C&(D^E))+3329325298|0,F=E,E=D,D=C,C=B+G|0,B=A,A=z,z=y,y=G+(z&A^B&(z^A))+(z>>>2^z>>>13^z>>>22^z<<30^z<<19^z<<10)|0,p=p+y|0,q=q+z|0,r=r+A|0,s=s+B|0,t=t+C|0,u=u+D|0,v=v+E|0,w=w+F|0}function e(a){a|=0,d(O[a|0]<<24|O[a|1]<<16|O[a|2]<<8|O[a|3],O[a|4]<<24|O[a|5]<<16|O[a|6]<<8|O[a|7],O[a|8]<<24|O[a|9]<<16|O[a|10]<<8|O[a|11],O[a|12]<<24|O[a|13]<<16|O[a|14]<<8|O[a|15],O[a|16]<<24|O[a|17]<<16|O[a|18]<<8|O[a|19],O[a|20]<<24|O[a|21]<<16|O[a|22]<<8|O[a|23],O[a|24]<<24|O[a|25]<<16|O[a|26]<<8|O[a|27],O[a|28]<<24|O[a|29]<<16|O[a|30]<<8|O[a|31],O[a|32]<<24|O[a|33]<<16|O[a|34]<<8|O[a|35],O[a|36]<<24|O[a|37]<<16|O[a|38]<<8|O[a|39],O[a|40]<<24|O[a|41]<<16|O[a|42]<<8|O[a|43],O[a|44]<<24|O[a|45]<<16|O[a|46]<<8|O[a|47],O[a|48]<<24|O[a|49]<<16|O[a|50]<<8|O[a|51],O[a|52]<<24|O[a|53]<<16|O[a|54]<<8|O[a|55],O[a|56]<<24|O[a|57]<<16|O[a|58]<<8|O[a|59],O[a|60]<<24|O[a|61]<<16|O[a|62]<<8|O[a|63])}function f(a){a|=0,O[a|0]=p>>>24,O[a|1]=p>>>16&255,O[a|2]=p>>>8&255,O[a|3]=p&255,O[a|4]=q>>>24,O[a|5]=q>>>16&255,O[a|6]=q>>>8&255,O[a|7]=q&255,O[a|8]=r>>>24,O[a|9]=r>>>16&255,O[a|10]=r>>>8&255,O[a|11]=r&255,O[a|12]=s>>>24,O[a|13]=s>>>16&255,O[a|14]=s>>>8&255,O[a|15]=s&255,O[a|16]=t>>>24,O[a|17]=t>>>16&255,O[a|18]=t>>>8&255,O[a|19]=t&255,O[a|20]=u>>>24,O[a|21]=u>>>16&255,O[a|22]=u>>>8&255,O[a|23]=u&255,O[a|24]=v>>>24,O[a|25]=v>>>16&255,O[a|26]=v>>>8&255,O[a|27]=v&255,O[a|28]=w>>>24,O[a|29]=w>>>16&255,O[a|30]=w>>>8&255,O[a|31]=w&255}function g(){ +p=1779033703,q=3144134277,r=1013904242,s=2773480762,t=1359893119,u=2600822924,v=528734635,w=1541459225,x=0}function h(a,b,c,d,e,f,g,h,i){a|=0,b|=0,c|=0,d|=0,e|=0,f|=0,g|=0,h|=0,i|=0,p=a,q=b,r=c,s=d,t=e,u=f,v=g,w=h,x=i}function i(a,b){a|=0,b|=0;var c=0;if(a&63)return-1;for(;(b|0)>=64;)e(a),a=a+64|0,b=b-64|0,c=c+64|0;return x=x+c|0,c|0}function j(a,b,c){a|=0,b|=0,c|=0;var d=0,g=0;if(a&63)return-1;if(~c&&c&31)return-1;if((b|0)>=64){if(d=i(a,b)|0,(d|0)==-1)return-1;a=a+d|0,b=b-d|0}if(d=d+b|0,x=x+b|0,O[a|b]=128,(b|0)>=56){for(g=b+1|0;(g|0)<64;g=g+1|0)O[a|g]=0;e(a),b=0,O[a|0]=0}for(g=b+1|0;(g|0)<59;g=g+1|0)O[a|g]=0;return O[a|59]=x>>>29,O[a|60]=x>>>21&255,O[a|61]=x>>>13&255,O[a|62]=x>>>5&255,O[a|63]=x<<3&255,e(a),~c&&f(c),d|0}function k(){p=y,q=z,r=A,s=B,t=C,u=D,v=E,w=F,x=64}function l(){p=G,q=H,r=I,s=J,t=K,u=L,v=M,w=N,x=64}function m(a,b,c,e,f,h,i,j,k,l,m,n,o,O,P,Q){a|=0,b|=0,c|=0,e|=0,f|=0,h|=0,i|=0,j|=0,k|=0,l|=0,m|=0,n|=0,o|=0,O|=0,P|=0,Q|=0,g(),d(a^1549556828,b^1549556828,c^1549556828,e^1549556828,f^1549556828,h^1549556828,i^1549556828,j^1549556828,k^1549556828,l^1549556828,m^1549556828,n^1549556828,o^1549556828,O^1549556828,P^1549556828,Q^1549556828),G=p,H=q,I=r,J=s,K=t,L=u,M=v,N=w,g(),d(a^909522486,b^909522486,c^909522486,e^909522486,f^909522486,h^909522486,i^909522486,j^909522486,k^909522486,l^909522486,m^909522486,n^909522486,o^909522486,O^909522486,P^909522486,Q^909522486),y=p,z=q,A=r,B=s,C=t,D=u,E=v,F=w,x=64}function n(a,b,c){a|=0,b|=0,c|=0;var e=0,g=0,h=0,i=0,k=0,m=0,n=0,o=0,x=0;return a&63?-1:~c&&c&31?-1:(x=j(a,b,-1)|0,e=p,g=q,h=r,i=s,k=t,m=u,n=v,o=w,l(),d(e,g,h,i,k,m,n,o,2147483648,0,0,0,0,0,0,768),~c&&f(c),x|0)}function o(a,b,c,e,g){a|=0,b|=0,c|=0,e|=0,g|=0;var h=0,i=0,j=0,m=0,o=0,x=0,y=0,z=0,A=0,B=0,C=0,D=0,E=0,F=0,G=0,H=0;if(a&63)return-1;if(~g&&g&31)return-1;for(O[a+b|0]=c>>>24,O[a+b+1|0]=c>>>16&255,O[a+b+2|0]=c>>>8&255,O[a+b+3|0]=c&255,n(a,b+4|0,-1)|0,h=A=p,i=B=q,j=C=r,m=D=s,o=E=t,x=F=u,y=G=v,z=H=w,e=e-1|0;(e|0)>0;)k(),d(A,B,C,D,E,F,G,H,2147483648,0,0,0,0,0,0,768),A=p,B=q,C=r,D=s,E=t,F=u,G=v,H=w,l(),d(A,B,C,D,E,F,G,H,2147483648,0,0,0,0,0,0,768),A=p,B=q,C=r,D=s,E=t,F=u,G=v,H=w,h^=p,i^=q,j^=r,m^=s,o^=t,x^=u,y^=v,z^=w,e=e-1|0;return p=h,q=i,r=j,s=m,t=o,u=x,v=y,w=z,~g&&f(g),0}var p=0,q=0,r=0,s=0,t=0,u=0,v=0,w=0,x=0,y=0,z=0,A=0,B=0,C=0,D=0,E=0,F=0,G=0,H=0,I=0,J=0,K=0,L=0,M=0,N=0,O=new a.Uint8Array(c);return{reset:g,init:h,process:i,finish:j,hmac_reset:k,hmac_init:m,hmac_finish:n,pbkdf2_generate_block:o}}function G(a){a=a||{},this.heap=m(Uint8Array,a),this.asm=a.asm||F(b,null,this.heap.buffer),this.BLOCK_SIZE=R,this.HASH_SIZE=S,this.reset()}function H(){return null===U&&(U=new G({heapSize:1048576})),U}function I(a){if(void 0===a)throw new SyntaxError("data required");return H().reset().process(a).finish().result}function J(a){var b=I(a);return h(b)}function K(a){var b=I(a);return i(b)}b.asmCrypto=a,c.prototype=Object.create(Error.prototype,{name:{value:"IllegalStateError"}}),d.prototype=Object.create(Error.prototype,{name:{value:"IllegalArgumentError"}}),e.prototype=Object.create(Error.prototype,{name:{value:"SecurityError"}});var L=(b.Float64Array||b.Float32Array,function(){"use strict";function a(){e=[],f=[];var a,b,c=1;for(a=0;255>a;a++)e[a]=c,b=128&c,c<<=1,c&=255,128===b&&(c^=27),c^=e[a],f[e[a]]=a;e[255]=e[0],f[0]=0,k=!0}function b(a,b){var c=e[(f[a]+f[b])%255];return(0===a||0===b)&&(c=0),c}function c(a){var b=e[255-f[a]];return 0===a&&(b=0),b}function d(){function d(a){var b,d,e;for(d=e=c(a),b=0;4>b;b++)d=255&(d<<1|d>>>7),e^=d;return e^=99}k||a(),g=[],h=[],i=[[],[],[],[]],j=[[],[],[],[]];for(var e=0;256>e;e++){var f=d(e);g[e]=f,h[f]=e,i[0][e]=b(2,f)<<24|f<<16|f<<8|b(3,f),j[0][f]=b(14,e)<<24|b(9,e)<<16|b(13,e)<<8|b(11,e);for(var l=1;4>l;l++)i[l][e]=i[l-1][e]>>>8|i[l-1][e]<<24,j[l][f]=j[l-1][f]>>>8|j[l-1][f]<<24}}var e,f,g,h,i,j,k=!1,l=!1,m=function(a,b,c){function e(a,b,c,d,e,h,i,k,l){var n=f.subarray(0,60),o=f.subarray(256,316);n.set([b,c,d,e,h,i,k,l]);for(var p=a,q=1;4*a+28>p;p++){var r=n[p-1];(p%a===0||8===a&&p%a===4)&&(r=g[r>>>24]<<24^g[r>>>16&255]<<16^g[r>>>8&255]<<8^g[255&r]),p%a===0&&(r=r<<8^r>>>24^q<<24,q=q<<1^(128&q?27:0)),n[p]=n[p-a]^r}for(var s=0;p>s;s+=4)for(var t=0;4>t;t++){var r=n[p-(4+s)+(4-t)%4];o[s+t]=4>s||s>=p-4?r:j[0][g[r>>>24]]^j[1][g[r>>>16&255]]^j[2][g[r>>>8&255]]^j[3][g[255&r]]}m.set_rounds(a+5)}l||d();var f=new Uint32Array(c);f.set(g,512),f.set(h,768);for(var k=0;4>k;k++)f.set(i[k],4096+1024*k>>2),f.set(j[k],8192+1024*k>>2);var m=function(a,b,c){"use asm";function d(a,b,c,d,e,f,g,h){a|=0,b|=0,c|=0,d|=0,e|=0,f|=0,g|=0,h|=0;var i=0,j=0,k=0,l=0,m=0,n=0,o=0,p=0;for(i=c|1024,j=c|2048,k=c|3072,e^=T[(a|0)>>2],f^=T[(a|4)>>2],g^=T[(a|8)>>2],h^=T[(a|12)>>2],p=16;(p|0)<=d<<4;p=p+16|0)l=T[(c|e>>22&1020)>>2]^T[(i|f>>14&1020)>>2]^T[(j|g>>6&1020)>>2]^T[(k|h<<2&1020)>>2]^T[(a|p|0)>>2],m=T[(c|f>>22&1020)>>2]^T[(i|g>>14&1020)>>2]^T[(j|h>>6&1020)>>2]^T[(k|e<<2&1020)>>2]^T[(a|p|4)>>2],n=T[(c|g>>22&1020)>>2]^T[(i|h>>14&1020)>>2]^T[(j|e>>6&1020)>>2]^T[(k|f<<2&1020)>>2]^T[(a|p|8)>>2],o=T[(c|h>>22&1020)>>2]^T[(i|e>>14&1020)>>2]^T[(j|f>>6&1020)>>2]^T[(k|g<<2&1020)>>2]^T[(a|p|12)>>2],e=l,f=m,g=n,h=o;y=T[(b|e>>22&1020)>>2]<<24^T[(b|f>>14&1020)>>2]<<16^T[(b|g>>6&1020)>>2]<<8^T[(b|h<<2&1020)>>2]^T[(a|p|0)>>2],z=T[(b|f>>22&1020)>>2]<<24^T[(b|g>>14&1020)>>2]<<16^T[(b|h>>6&1020)>>2]<<8^T[(b|e<<2&1020)>>2]^T[(a|p|4)>>2],A=T[(b|g>>22&1020)>>2]<<24^T[(b|h>>14&1020)>>2]<<16^T[(b|e>>6&1020)>>2]<<8^T[(b|f<<2&1020)>>2]^T[(a|p|8)>>2],B=T[(b|h>>22&1020)>>2]<<24^T[(b|e>>14&1020)>>2]<<16^T[(b|f>>6&1020)>>2]<<8^T[(b|g<<2&1020)>>2]^T[(a|p|12)>>2]}function e(a,b,c,e){a|=0,b|=0,c|=0,e|=0,d(0,2048,4096,S,a,b,c,e)}function f(a,b,c,e){a|=0,b|=0,c|=0,e|=0;var f=0;d(1024,3072,8192,S,a,e,c,b),f=z,z=B,B=f}function g(a,b,c,e){a|=0,b|=0,c|=0,e|=0,d(0,2048,4096,S,C^a,D^b,E^c,F^e),C=y,D=z,E=A,F=B}function h(a,b,c,e){a|=0,b|=0,c|=0,e|=0;var f=0;d(1024,3072,8192,S,a,e,c,b),f=z,z=B,B=f,y^=C,z^=D,A^=E,B^=F,C=a,D=b,E=c,F=e}function i(a,b,c,e){a|=0,b|=0,c|=0,e|=0,d(0,2048,4096,S,C,D,E,F),C=y^=a,D=z^=b,E=A^=c,F=B^=e}function j(a,b,c,e){a|=0,b|=0,c|=0,e|=0,d(0,2048,4096,S,C,D,E,F),y^=a,z^=b,A^=c,B^=e,C=a,D=b,E=c,F=e}function k(a,b,c,e){a|=0,b|=0,c|=0,e|=0,d(0,2048,4096,S,C,D,E,F),C=y,D=z,E=A,F=B,y^=a,z^=b,A^=c,B^=e}function l(a,b,c,e){a|=0,b|=0,c|=0,e|=0,d(0,2048,4096,S,G,H,I,J),J=~N&J|N&J+1,I=~M&I|M&I+((J|0)==0),H=~L&H|L&H+((I|0)==0),G=~K&G|K&G+((H|0)==0),y^=a,z^=b,A^=c,B^=e}function m(a,b,c,d){a|=0,b|=0,c|=0,d|=0;var e=0,f=0,g=0,h=0,i=0,j=0,k=0,l=0,m=0,n=0;for(a^=C,b^=D,c^=E,d^=F,e=O|0,f=P|0,g=Q|0,h=R|0;(m|0)<128;m=m+1|0)e>>>31&&(i^=a,j^=b,k^=c,l^=d),e=e<<1|f>>>31,f=f<<1|g>>>31,g=g<<1|h>>>31,h<<=1,n=d&1,d=d>>>1|c<<31,c=c>>>1|b<<31,b=b>>>1|a<<31,a>>>=1,n&&(a^=3774873600);C=i,D=j,E=k,F=l}function n(a){a|=0,S=a}function o(a,b,c,d){a|=0,b|=0,c|=0,d|=0,y=a,z=b,A=c,B=d}function p(a,b,c,d){a|=0,b|=0,c|=0,d|=0,C=a,D=b,E=c,F=d}function q(a,b,c,d){a|=0,b|=0,c|=0,d|=0,G=a,H=b,I=c,J=d}function r(a,b,c,d){a|=0,b|=0,c|=0,d|=0,K=a,L=b,M=c,N=d}function s(a,b,c,d){a|=0,b|=0,c|=0,d|=0,J=~N&J|N&d,I=~M&I|M&c,H=~L&H|L&b,G=~K&G|K&a}function t(a){return a|=0,a&15?-1:(U[a|0]=y>>>24,U[a|1]=y>>>16&255,U[a|2]=y>>>8&255,U[a|3]=y&255,U[a|4]=z>>>24,U[a|5]=z>>>16&255,U[a|6]=z>>>8&255,U[a|7]=z&255,U[a|8]=A>>>24,U[a|9]=A>>>16&255,U[a|10]=A>>>8&255,U[a|11]=A&255,U[a|12]=B>>>24,U[a|13]=B>>>16&255,U[a|14]=B>>>8&255,U[a|15]=B&255,16)}function u(a){return a|=0,a&15?-1:(U[a|0]=C>>>24,U[a|1]=C>>>16&255,U[a|2]=C>>>8&255,U[a|3]=C&255,U[a|4]=D>>>24,U[a|5]=D>>>16&255,U[a|6]=D>>>8&255,U[a|7]=D&255,U[a|8]=E>>>24,U[a|9]=E>>>16&255,U[a|10]=E>>>8&255,U[a|11]=E&255,U[a|12]=F>>>24,U[a|13]=F>>>16&255,U[a|14]=F>>>8&255,U[a|15]=F&255,16)}function v(){e(0,0,0,0),O=y,P=z,Q=A,R=B}function w(a,b,c){a|=0,b|=0,c|=0;var d=0;if(b&15)return-1;for(;(c|0)>=16;)V[a&7](U[b|0]<<24|U[b|1]<<16|U[b|2]<<8|U[b|3],U[b|4]<<24|U[b|5]<<16|U[b|6]<<8|U[b|7],U[b|8]<<24|U[b|9]<<16|U[b|10]<<8|U[b|11],U[b|12]<<24|U[b|13]<<16|U[b|14]<<8|U[b|15]),U[b|0]=y>>>24,U[b|1]=y>>>16&255,U[b|2]=y>>>8&255,U[b|3]=y&255,U[b|4]=z>>>24,U[b|5]=z>>>16&255,U[b|6]=z>>>8&255,U[b|7]=z&255,U[b|8]=A>>>24,U[b|9]=A>>>16&255,U[b|10]=A>>>8&255,U[b|11]=A&255,U[b|12]=B>>>24,U[b|13]=B>>>16&255,U[b|14]=B>>>8&255,U[b|15]=B&255,d=d+16|0,b=b+16|0,c=c-16|0;return d|0}function x(a,b,c){a|=0,b|=0,c|=0;var d=0;if(b&15)return-1;for(;(c|0)>=16;)W[a&1](U[b|0]<<24|U[b|1]<<16|U[b|2]<<8|U[b|3],U[b|4]<<24|U[b|5]<<16|U[b|6]<<8|U[b|7],U[b|8]<<24|U[b|9]<<16|U[b|10]<<8|U[b|11],U[b|12]<<24|U[b|13]<<16|U[b|14]<<8|U[b|15]),d=d+16|0,b=b+16|0,c=c-16|0;return d|0}var y=0,z=0,A=0,B=0,C=0,D=0,E=0,F=0,G=0,H=0,I=0,J=0,K=0,L=0,M=0,N=0,O=0,P=0,Q=0,R=0,S=0,T=new a.Uint32Array(c),U=new a.Uint8Array(c),V=[e,f,g,h,i,j,k,l],W=[g,m];return{set_rounds:n,set_state:o,set_iv:p,set_nonce:q,set_mask:r,set_counter:s,get_state:t,get_iv:u,gcm_init:v,cipher:w,mac:x}}(a,b,c);return m.set_key=e,m};return m.ENC={ECB:0,CBC:2,CFB:4,OFB:6,CTR:7},m.DEC={ECB:1,CBC:3,CFB:5,OFB:6,CTR:7},m.MAC={CBC:0,GCM:1},m.HEAP_DATA=16384,m}()),M=x.prototype;M.BLOCK_SIZE=16,M.reset=s,M.encrypt=u,M.decrypt=w;var N=y.prototype;N.BLOCK_SIZE=16,N.reset=s,N.process=t,N.finish=u;var O=z.prototype;O.BLOCK_SIZE=16,O.reset=s,O.process=v,O.finish=w;var P=new Uint8Array(1048576),Q=L(b,null,P.buffer);a.AES_CFB=x,a.AES_CFB.encrypt=A,a.AES_CFB.decrypt=B,a.AES_CFB.Encrypt=y,a.AES_CFB.Decrypt=z;var R=64,S=32;G.BLOCK_SIZE=R,G.HASH_SIZE=S;var T=G.prototype;T.reset=C,T.process=D,T.finish=E;var U=null;G.bytes=I,G.hex=J,G.base64=K,a.SHA256=G}({},function(){return this}())},{}],19:[function(a,b,c){"use strict";var d=a("./cipher");b.exports={encrypt:function(a,b,c,e,f){b=new d[b](e);var g=b.blockSize,h=new Uint8Array(g),i=new Uint8Array(g),j=new Uint8Array(a.length+2);j.set(a),j[a.length]=a[g-2],j[a.length+1]=a[g-1],a=j;var k,l,m,n=new Uint8Array(c.length+2+2*g),o=f?0:2;for(k=0;g>k;k++)h[k]=0;for(i=b.encrypt(h),k=0;g>k;k++)n[k]=i[k]^a[k];for(h.set(n.subarray(0,g)),i=b.encrypt(h),n[g]=i[0]^a[g],n[g+1]=i[1]^a[g+1],h.set(f?n.subarray(2,g+2):n.subarray(0,g)),i=b.encrypt(h),k=0;g>k;k++)n[g+2+k]=i[k+o]^c[k];for(l=g;lk;k++)n[g+m+k]=i[k]^c[l+k-o];return n=n.subarray(0,c.length+2+g)},mdc:function(a,b,c){a=new d[a](b);var e,f=a.blockSize,g=new Uint8Array(f),h=new Uint8Array(f);for(e=0;f>e;e++)g[e]=0;for(g=a.encrypt(g),e=0;f>e;e++)h[e]=c[e],g[e]^=h[e];h=a.encrypt(h);var i=new Uint8Array(g.length+2);return i.set(g),i[g.length]=h[0]^c[f],i[g.length+1]=h[1]^c[f+1],i},decrypt:function(a,b,c,e){a=new d[a](b);var f,g,h,i=a.blockSize,j=new Uint8Array(i),k=new Uint8Array(i),l=new Uint8Array(c.length-i);for(f=0;i>f;f++)j[f]=0;for(j=a.encrypt(j),f=0;i>f;f++)k[f]=c[f],j[f]^=k[f];if(k=a.encrypt(k),j[i-2]!=(k[0]^c[i])||j[i-1]!=(k[1]^c[i+1]))throw new Error("CFB decrypt: invalid key");if(g=0,e){for(f=0;i>f;f++)j[f]=c[f+2];for(h=i+2;hf&&f+hf;f++)j[f]=c[f];for(h=i;hf&&f+hm;m++)h[m]=0;else for(m=0;f>m;m++)h[m]=e[m];for(;c.length>f*i;){var l=a.encrypt(h);g=c.subarray(i*f,i*f+f);for(var m=0;mm;m++)f[m]=0;else f=e.subarray(0,g);for(;c.length>g*h;){var l=a.encrypt(f);f=c.subarray(h*g+j,h*g+g+j);for(var m=0;m>8&255}function f(a){return a>>16&255}function g(a){return a>>24&255}function h(a,b,c,d){return e(p[255&a])|e(p[b>>8&255])<<8|e(p[c>>16&255])<<16|e(p[d>>>24])<<24}function i(a){var b,c,d=a.length,e=new Array(d/4);if(a&&!(d%4)){for(b=0,c=0;d>c;c+=4)e[b++]=a[c]|a[c+1]<<8|a[c+2]<<16|a[c+3]<<24;return e}}function j(a){var b,c=0,h=a.length,i=new Array(4*h);for(b=0;h>b;b++)i[c++]=d(a[b]),i[c++]=e(a[b]),i[c++]=f(a[b]),i[c++]=g(a[b]);return i}function k(a){var b,c,h,i,j,k,l=new Array(u+1),m=a.length,p=new Array(t),q=new Array(t),r=0;if(16==m)k=10,b=4;else if(24==m)k=12,b=6;else{if(32!=m)throw new Error("Invalid key-length for AES key:"+m);k=14,b=8}for(c=0;u+1>c;c++)l[c]=new Uint32Array(4);for(c=0,h=0;m>h;h++,c+=4)p[h]=a[c]|a[c+1]<<8|a[c+2]<<16|a[c+3]<<24;for(h=b-1;h>=0;h--)q[h]=p[h];for(i=0,j=0,h=0;b>h&&k+1>i;){for(;b>h&&4>j;h++,j++)l[i][j]=q[h];4==j&&(i++,j=0)}for(;k+1>i;){var s=q[b-1];if(q[0]^=o[e(s)]|o[f(s)]<<8|o[g(s)]<<16|o[d(s)]<<24,q[0]^=n[r++],8!=b)for(h=1;b>h;h++)q[h]^=q[h-1];else{for(h=1;b/2>h;h++)q[h]^=q[h-1];for(s=q[b/2-1],q[b/2]^=o[d(s)]|o[e(s)]<<8|o[f(s)]<<16|o[g(s)]<<24,h=b/2+1;b>h;h++)q[h]^=q[h-1]}for(h=0;b>h&&k+1>i;){for(;b>h&&4>j;h++,j++)l[i][j]=q[h];4==j&&(i++,j=0)}}return{rounds:k,rk:l}}function l(a,b,c){var d,e,f;for(f=i(a),e=b.rounds,d=0;e-1>d;d++)c[0]=f[0]^b.rk[d][0],c[1]=f[1]^b.rk[d][1],c[2]=f[2]^b.rk[d][2],c[3]=f[3]^b.rk[d][3],f[0]=p[255&c[0]]^q[c[1]>>8&255]^r[c[2]>>16&255]^s[c[3]>>>24],f[1]=p[255&c[1]]^q[c[2]>>8&255]^r[c[3]>>16&255]^s[c[0]>>>24],f[2]=p[255&c[2]]^q[c[3]>>8&255]^r[c[0]>>16&255]^s[c[1]>>>24],f[3]=p[255&c[3]]^q[c[0]>>8&255]^r[c[1]>>16&255]^s[c[2]>>>24];return d=e-1,c[0]=f[0]^b.rk[d][0],c[1]=f[1]^b.rk[d][1],c[2]=f[2]^b.rk[d][2],c[3]=f[3]^b.rk[d][3],f[0]=h(c[0],c[1],c[2],c[3])^b.rk[e][0],f[1]=h(c[1],c[2],c[3],c[0])^b.rk[e][1],f[2]=h(c[2],c[3],c[0],c[1])^b.rk[e][2],f[3]=h(c[3],c[0],c[1],c[2])^b.rk[e][3],j(f)}function m(a){var b=function(a){this.key=k(a),this._temp=new Uint32Array(this.blockSize/4),this.encrypt=function(a){return l(a,this.key,this._temp)}};return b.blockSize=b.prototype.blockSize=16,b.keySize=b.prototype.keySize=a/8,b}var n=new Uint8Array([1,2,4,8,16,32,64,128,27,54,108,216,171,77,154,47,94,188,99,198,151,53,106,212,179,125,250,239,197,145]),o=new Uint8Array([99,124,119,123,242,107,111,197,48,1,103,43,254,215,171,118,202,130,201,125,250,89,71,240,173,212,162,175,156,164,114,192,183,253,147,38,54,63,247,204,52,165,229,241,113,216,49,21,4,199,35,195,24,150,5,154,7,18,128,226,235,39,178,117,9,131,44,26,27,110,90,160,82,59,214,179,41,227,47,132,83,209,0,237,32,252,177,91,106,203,190,57,74,76,88,207,208,239,170,251,67,77,51,133,69,249,2,127,80,60,159,168,81,163,64,143,146,157,56,245,188,182,218,33,16,255,243,210,205,12,19,236,95,151,68,23,196,167,126,61,100,93,25,115,96,129,79,220,34,42,144,136,70,238,184,20,222,94,11,219,224,50,58,10,73,6,36,92,194,211,172,98,145,149,228,121,231,200,55,109,141,213,78,169,108,86,244,234,101,122,174,8,186,120,37,46,28,166,180,198,232,221,116,31,75,189,139,138,112,62,181,102,72,3,246,14,97,53,87,185,134,193,29,158,225,248,152,17,105,217,142,148,155,30,135,233,206,85,40,223,140,161,137,13,191,230,66,104,65,153,45,15,176,84,187,22]),p=new Uint32Array([2774754246,2222750968,2574743534,2373680118,234025727,3177933782,2976870366,1422247313,1345335392,50397442,2842126286,2099981142,436141799,1658312629,3870010189,2591454956,1170918031,2642575903,1086966153,2273148410,368769775,3948501426,3376891790,200339707,3970805057,1742001331,4255294047,3937382213,3214711843,4154762323,2524082916,1539358875,3266819957,486407649,2928907069,1780885068,1513502316,1094664062,49805301,1338821763,1546925160,4104496465,887481809,150073849,2473685474,1943591083,1395732834,1058346282,201589768,1388824469,1696801606,1589887901,672667696,2711000631,251987210,3046808111,151455502,907153956,2608889883,1038279391,652995533,1764173646,3451040383,2675275242,453576978,2659418909,1949051992,773462580,756751158,2993581788,3998898868,4221608027,4132590244,1295727478,1641469623,3467883389,2066295122,1055122397,1898917726,2542044179,4115878822,1758581177,0,753790401,1612718144,536673507,3367088505,3982187446,3194645204,1187761037,3653156455,1262041458,3729410708,3561770136,3898103984,1255133061,1808847035,720367557,3853167183,385612781,3309519750,3612167578,1429418854,2491778321,3477423498,284817897,100794884,2172616702,4031795360,1144798328,3131023141,3819481163,4082192802,4272137053,3225436288,2324664069,2912064063,3164445985,1211644016,83228145,3753688163,3249976951,1977277103,1663115586,806359072,452984805,250868733,1842533055,1288555905,336333848,890442534,804056259,3781124030,2727843637,3427026056,957814574,1472513171,4071073621,2189328124,1195195770,2892260552,3881655738,723065138,2507371494,2690670784,2558624025,3511635870,2145180835,1713513028,2116692564,2878378043,2206763019,3393603212,703524551,3552098411,1007948840,2044649127,3797835452,487262998,1994120109,1004593371,1446130276,1312438900,503974420,3679013266,168166924,1814307912,3831258296,1573044895,1859376061,4021070915,2791465668,2828112185,2761266481,937747667,2339994098,854058965,1137232011,1496790894,3077402074,2358086913,1691735473,3528347292,3769215305,3027004632,4199962284,133494003,636152527,2942657994,2390391540,3920539207,403179536,3585784431,2289596656,1864705354,1915629148,605822008,4054230615,3350508659,1371981463,602466507,2094914977,2624877800,555687742,3712699286,3703422305,2257292045,2240449039,2423288032,1111375484,3300242801,2858837708,3628615824,84083462,32962295,302911004,2741068226,1597322602,4183250862,3501832553,2441512471,1489093017,656219450,3114180135,954327513,335083755,3013122091,856756514,3144247762,1893325225,2307821063,2811532339,3063651117,572399164,2458355477,552200649,1238290055,4283782570,2015897680,2061492133,2408352771,4171342169,2156497161,386731290,3669999461,837215959,3326231172,3093850320,3275833730,2962856233,1999449434,286199582,3417354363,4233385128,3602627437,974525996]),q=new Uint32Array([1667483301,2088564868,2004348569,2071721613,4076011277,1802229437,1869602481,3318059348,808476752,16843267,1734856361,724260477,4278118169,3621238114,2880130534,1987505306,3402272581,2189565853,3385428288,2105408135,4210749205,1499050731,1195871945,4042324747,2913812972,3570709351,2728550397,2947499498,2627478463,2762232823,1920132246,3233848155,3082253762,4261273884,2475900334,640044138,909536346,1061125697,4160222466,3435955023,875849820,2779075060,3857043764,4059166984,1903288979,3638078323,825320019,353708607,67373068,3351745874,589514341,3284376926,404238376,2526427041,84216335,2593796021,117902857,303178806,2155879323,3806519101,3958099238,656887401,2998042573,1970662047,151589403,2206408094,741103732,437924910,454768173,1852759218,1515893998,2694863867,1381147894,993752653,3604395873,3014884814,690573947,3823361342,791633521,2223248279,1397991157,3520182632,0,3991781676,538984544,4244431647,2981198280,1532737261,1785386174,3419114822,3200149465,960066123,1246401758,1280088276,1482207464,3486483786,3503340395,4025468202,2863288293,4227591446,1128498885,1296931543,859006549,2240090516,1162185423,4193904912,33686534,2139094657,1347461360,1010595908,2678007226,2829601763,1364304627,2745392638,1077969088,2408514954,2459058093,2644320700,943222856,4126535940,3166462943,3065411521,3671764853,555827811,269492272,4294960410,4092853518,3537026925,3452797260,202119188,320022069,3974939439,1600110305,2543269282,1145342156,387395129,3301217111,2812761586,2122251394,1027439175,1684326572,1566423783,421081643,1936975509,1616953504,2172721560,1330618065,3705447295,572671078,707417214,2425371563,2290617219,1179028682,4008625961,3099093971,336865340,3739133817,1583267042,185275933,3688607094,3772832571,842163286,976909390,168432670,1229558491,101059594,606357612,1549580516,3267534685,3553869166,2896970735,1650640038,2442213800,2509582756,3840201527,2038035083,3890730290,3368586051,926379609,1835915959,2374828428,3587551588,1313774802,2846444e3,1819072692,1448520954,4109693703,3941256997,1701169839,2054878350,2930657257,134746136,3132780501,2021191816,623200879,774790258,471611428,2795919345,3031724999,3334903633,3907570467,3722289532,1953818780,522141217,1263245021,3183305180,2341145990,2324303749,1886445712,1044282434,3048567236,1718013098,1212715224,50529797,4143380225,235805714,1633796771,892693087,1465364217,3115936208,2256934801,3250690392,488454695,2661164985,3789674808,4177062675,2560109491,286335539,1768542907,3654920560,2391672713,2492740519,2610638262,505297954,2273777042,3924412704,3469641545,1431677695,673730680,3755976058,2357986191,2711706104,2307459456,218962455,3216991706,3873888049,1111655622,1751699640,1094812355,2576951728,757946999,252648977,2964356043,1414834428,3149622742,370551866]),r=new Uint32Array([1673962851,2096661628,2012125559,2079755643,4076801522,1809235307,1876865391,3314635973,811618352,16909057,1741597031,727088427,4276558334,3618988759,2874009259,1995217526,3398387146,2183110018,3381215433,2113570685,4209972730,1504897881,1200539975,4042984432,2906778797,3568527316,2724199842,2940594863,2619588508,2756966308,1927583346,3231407040,3077948087,4259388669,2470293139,642542118,913070646,1065238847,4160029431,3431157708,879254580,2773611685,3855693029,4059629809,1910674289,3635114968,828527409,355090197,67636228,3348452039,591815971,3281870531,405809176,2520228246,84545285,2586817946,118360327,304363026,2149292928,3806281186,3956090603,659450151,2994720178,1978310517,152181513,2199756419,743994412,439627290,456535323,1859957358,1521806938,2690382752,1386542674,997608763,3602342358,3011366579,693271337,3822927587,794718511,2215876484,1403450707,3518589137,0,3988860141,541089824,4242743292,2977548465,1538714971,1792327274,3415033547,3194476990,963791673,1251270218,1285084236,1487988824,3481619151,3501943760,4022676207,2857362858,4226619131,1132905795,1301993293,862344499,2232521861,1166724933,4192801017,33818114,2147385727,1352724560,1014514748,2670049951,2823545768,1369633617,2740846243,1082179648,2399505039,2453646738,2636233885,946882616,4126213365,3160661948,3061301686,3668932058,557998881,270544912,4293204735,4093447923,3535760850,3447803085,202904588,321271059,3972214764,1606345055,2536874647,1149815876,388905239,3297990596,2807427751,2130477694,1031423805,1690872932,1572530013,422718233,1944491379,1623236704,2165938305,1335808335,3701702620,574907938,710180394,2419829648,2282455944,1183631942,4006029806,3094074296,338181140,3735517662,1589437022,185998603,3685578459,3772464096,845436466,980700730,169090570,1234361161,101452294,608726052,1555620956,3265224130,3552407251,2890133420,1657054818,2436475025,2503058581,3839047652,2045938553,3889509095,3364570056,929978679,1843050349,2365688973,3585172693,1318900302,2840191145,1826141292,1454176854,4109567988,3939444202,1707781989,2062847610,2923948462,135272456,3127891386,2029029496,625635109,777810478,473441308,2790781350,3027486644,3331805638,3905627112,3718347997,1961401460,524165407,1268178251,3177307325,2332919435,2316273034,1893765232,1048330814,3044132021,1724688998,1217452104,50726147,4143383030,236720654,1640145761,896163637,1471084887,3110719673,2249691526,3248052417,490350365,2653403550,3789109473,4176155640,2553000856,287453969,1775418217,3651760345,2382858638,2486413204,2603464347,507257374,2266337927,3922272489,3464972750,1437269845,676362280,3752164063,2349043596,2707028129,2299101321,219813645,3211123391,3872862694,1115997762,1758509160,1099088705,2569646233,760903469,253628687,2960903088,1420360788,3144537787,371997206]),s=new Uint32Array([3332727651,4169432188,4003034999,4136467323,4279104242,3602738027,3736170351,2438251973,1615867952,33751297,3467208551,1451043627,3877240574,3043153879,1306962859,3969545846,2403715786,530416258,2302724553,4203183485,4011195130,3001768281,2395555655,4211863792,1106029997,3009926356,1610457762,1173008303,599760028,1408738468,3835064946,2606481600,1975695287,3776773629,1034851219,1282024998,1817851446,2118205247,4110612471,2203045068,1750873140,1374987685,3509904869,4178113009,3801313649,2876496088,1649619249,708777237,135005188,2505230279,1181033251,2640233411,807933976,933336726,168756485,800430746,235472647,607523346,463175808,3745374946,3441880043,1315514151,2144187058,3936318837,303761673,496927619,1484008492,875436570,908925723,3702681198,3035519578,1543217312,2767606354,1984772923,3076642518,2110698419,1383803177,3711886307,1584475951,328696964,2801095507,3110654417,0,3240947181,1080041504,3810524412,2043195825,3069008731,3569248874,2370227147,1742323390,1917532473,2497595978,2564049996,2968016984,2236272591,3144405200,3307925487,1340451498,3977706491,2261074755,2597801293,1716859699,294946181,2328839493,3910203897,67502594,4269899647,2700103760,2017737788,632987551,1273211048,2733855057,1576969123,2160083008,92966799,1068339858,566009245,1883781176,4043634165,1675607228,2009183926,2943736538,1113792801,540020752,3843751935,4245615603,3211645650,2169294285,403966988,641012499,3274697964,3202441055,899848087,2295088196,775493399,2472002756,1441965991,4236410494,2051489085,3366741092,3135724893,841685273,3868554099,3231735904,429425025,2664517455,2743065820,1147544098,1417554474,1001099408,193169544,2362066502,3341414126,1809037496,675025940,2809781982,3168951902,371002123,2910247899,3678134496,1683370546,1951283770,337512970,2463844681,201983494,1215046692,3101973596,2673722050,3178157011,1139780780,3299238498,967348625,832869781,3543655652,4069226873,3576883175,2336475336,1851340599,3669454189,25988493,2976175573,2631028302,1239460265,3635702892,2902087254,4077384948,3475368682,3400492389,4102978170,1206496942,270010376,1876277946,4035475576,1248797989,1550986798,941890588,1475454630,1942467764,2538718918,3408128232,2709315037,3902567540,1042358047,2531085131,1641856445,226921355,260409994,3767562352,2084716094,1908716981,3433719398,2430093384,100991747,4144101110,470945294,3265487201,1784624437,2935576407,1775286713,395413126,2572730817,975641885,666476190,3644383713,3943954680,733190296,573772049,3535497577,2842745305,126455438,866620564,766942107,1008868894,361924487,3374377449,2269761230,2868860245,1350051880,2776293343,59739276,1509466529,159418761,437718285,1708834751,3610371814,2227585602,3501746280,2193834305,699439513,1517759789,504434447,2076946608,2835108948,1842789307,742004246]),t=8,u=14;b.exports={};var v=[128,192,256];for(var w in v)b.exports[v[w]]=m(v[w])},{}],21:[function(a,b,c){function d(){}function e(a){this.bf=new d,this.bf.init(a),this.encrypt=function(a){return this.bf.encrypt_block(a)}}d.prototype.BLOCKSIZE=8,d.prototype.SBOXES=[[3509652390,2564797868,805139163,3491422135,3101798381,1780907670,3128725573,4046225305,614570311,3012652279,134345442,2240740374,1667834072,1901547113,2757295779,4103290238,227898511,1921955416,1904987480,2182433518,2069144605,3260701109,2620446009,720527379,3318853667,677414384,3393288472,3101374703,2390351024,1614419982,1822297739,2954791486,3608508353,3174124327,2024746970,1432378464,3864339955,2857741204,1464375394,1676153920,1439316330,715854006,3033291828,289532110,2706671279,2087905683,3018724369,1668267050,732546397,1947742710,3462151702,2609353502,2950085171,1814351708,2050118529,680887927,999245976,1800124847,3300911131,1713906067,1641548236,4213287313,1216130144,1575780402,4018429277,3917837745,3693486850,3949271944,596196993,3549867205,258830323,2213823033,772490370,2760122372,1774776394,2652871518,566650946,4142492826,1728879713,2882767088,1783734482,3629395816,2517608232,2874225571,1861159788,326777828,3124490320,2130389656,2716951837,967770486,1724537150,2185432712,2364442137,1164943284,2105845187,998989502,3765401048,2244026483,1075463327,1455516326,1322494562,910128902,469688178,1117454909,936433444,3490320968,3675253459,1240580251,122909385,2157517691,634681816,4142456567,3825094682,3061402683,2540495037,79693498,3249098678,1084186820,1583128258,426386531,1761308591,1047286709,322548459,995290223,1845252383,2603652396,3431023940,2942221577,3202600964,3727903485,1712269319,422464435,3234572375,1170764815,3523960633,3117677531,1434042557,442511882,3600875718,1076654713,1738483198,4213154764,2393238008,3677496056,1014306527,4251020053,793779912,2902807211,842905082,4246964064,1395751752,1040244610,2656851899,3396308128,445077038,3742853595,3577915638,679411651,2892444358,2354009459,1767581616,3150600392,3791627101,3102740896,284835224,4246832056,1258075500,768725851,2589189241,3069724005,3532540348,1274779536,3789419226,2764799539,1660621633,3471099624,4011903706,913787905,3497959166,737222580,2514213453,2928710040,3937242737,1804850592,3499020752,2949064160,2386320175,2390070455,2415321851,4061277028,2290661394,2416832540,1336762016,1754252060,3520065937,3014181293,791618072,3188594551,3933548030,2332172193,3852520463,3043980520,413987798,3465142937,3030929376,4245938359,2093235073,3534596313,375366246,2157278981,2479649556,555357303,3870105701,2008414854,3344188149,4221384143,3956125452,2067696032,3594591187,2921233993,2428461,544322398,577241275,1471733935,610547355,4027169054,1432588573,1507829418,2025931657,3646575487,545086370,48609733,2200306550,1653985193,298326376,1316178497,3007786442,2064951626,458293330,2589141269,3591329599,3164325604,727753846,2179363840,146436021,1461446943,4069977195,705550613,3059967265,3887724982,4281599278,3313849956,1404054877,2845806497,146425753,1854211946],[1266315497,3048417604,3681880366,3289982499,290971e4,1235738493,2632868024,2414719590,3970600049,1771706367,1449415276,3266420449,422970021,1963543593,2690192192,3826793022,1062508698,1531092325,1804592342,2583117782,2714934279,4024971509,1294809318,4028980673,1289560198,2221992742,1669523910,35572830,157838143,1052438473,1016535060,1802137761,1753167236,1386275462,3080475397,2857371447,1040679964,2145300060,2390574316,1461121720,2956646967,4031777805,4028374788,33600511,2920084762,1018524850,629373528,3691585981,3515945977,2091462646,2486323059,586499841,988145025,935516892,3367335476,2599673255,2839830854,265290510,3972581182,2759138881,3795373465,1005194799,847297441,406762289,1314163512,1332590856,1866599683,4127851711,750260880,613907577,1450815602,3165620655,3734664991,3650291728,3012275730,3704569646,1427272223,778793252,1343938022,2676280711,2052605720,1946737175,3164576444,3914038668,3967478842,3682934266,1661551462,3294938066,4011595847,840292616,3712170807,616741398,312560963,711312465,1351876610,322626781,1910503582,271666773,2175563734,1594956187,70604529,3617834859,1007753275,1495573769,4069517037,2549218298,2663038764,504708206,2263041392,3941167025,2249088522,1514023603,1998579484,1312622330,694541497,2582060303,2151582166,1382467621,776784248,2618340202,3323268794,2497899128,2784771155,503983604,4076293799,907881277,423175695,432175456,1378068232,4145222326,3954048622,3938656102,3820766613,2793130115,2977904593,26017576,3274890735,3194772133,1700274565,1756076034,4006520079,3677328699,720338349,1533947780,354530856,688349552,3973924725,1637815568,332179504,3949051286,53804574,2852348879,3044236432,1282449977,3583942155,3416972820,4006381244,1617046695,2628476075,3002303598,1686838959,431878346,2686675385,1700445008,1080580658,1009431731,832498133,3223435511,2605976345,2271191193,2516031870,1648197032,4164389018,2548247927,300782431,375919233,238389289,3353747414,2531188641,2019080857,1475708069,455242339,2609103871,448939670,3451063019,1395535956,2413381860,1841049896,1491858159,885456874,4264095073,4001119347,1565136089,3898914787,1108368660,540939232,1173283510,2745871338,3681308437,4207628240,3343053890,4016749493,1699691293,1103962373,3625875870,2256883143,3830138730,1031889488,3479347698,1535977030,4236805024,3251091107,2132092099,1774941330,1199868427,1452454533,157007616,2904115357,342012276,595725824,1480756522,206960106,497939518,591360097,863170706,2375253569,3596610801,1814182875,2094937945,3421402208,1082520231,3463918190,2785509508,435703966,3908032597,1641649973,2842273706,3305899714,1510255612,2148256476,2655287854,3276092548,4258621189,236887753,3681803219,274041037,1734335097,3815195456,3317970021,1899903192,1026095262,4050517792,356393447,2410691914,3873677099,3682840055],[3913112168,2491498743,4132185628,2489919796,1091903735,1979897079,3170134830,3567386728,3557303409,857797738,1136121015,1342202287,507115054,2535736646,337727348,3213592640,1301675037,2528481711,1895095763,1721773893,3216771564,62756741,2142006736,835421444,2531993523,1442658625,3659876326,2882144922,676362277,1392781812,170690266,3921047035,1759253602,3611846912,1745797284,664899054,1329594018,3901205900,3045908486,2062866102,2865634940,3543621612,3464012697,1080764994,553557557,3656615353,3996768171,991055499,499776247,1265440854,648242737,3940784050,980351604,3713745714,1749149687,3396870395,4211799374,3640570775,1161844396,3125318951,1431517754,545492359,4268468663,3499529547,1437099964,2702547544,3433638243,2581715763,2787789398,1060185593,1593081372,2418618748,4260947970,69676912,2159744348,86519011,2512459080,3838209314,1220612927,3339683548,133810670,1090789135,1078426020,1569222167,845107691,3583754449,4072456591,1091646820,628848692,1613405280,3757631651,526609435,236106946,48312990,2942717905,3402727701,1797494240,859738849,992217954,4005476642,2243076622,3870952857,3732016268,765654824,3490871365,2511836413,1685915746,3888969200,1414112111,2273134842,3281911079,4080962846,172450625,2569994100,980381355,4109958455,2819808352,2716589560,2568741196,3681446669,3329971472,1835478071,660984891,3704678404,4045999559,3422617507,3040415634,1762651403,1719377915,3470491036,2693910283,3642056355,3138596744,1364962596,2073328063,1983633131,926494387,3423689081,2150032023,4096667949,1749200295,3328846651,309677260,2016342300,1779581495,3079819751,111262694,1274766160,443224088,298511866,1025883608,3806446537,1145181785,168956806,3641502830,3584813610,1689216846,3666258015,3200248200,1692713982,2646376535,4042768518,1618508792,1610833997,3523052358,4130873264,2001055236,3610705100,2202168115,4028541809,2961195399,1006657119,2006996926,3186142756,1430667929,3210227297,1314452623,4074634658,4101304120,2273951170,1399257539,3367210612,3027628629,1190975929,2062231137,2333990788,2221543033,2438960610,1181637006,548689776,2362791313,3372408396,3104550113,3145860560,296247880,1970579870,3078560182,3769228297,1714227617,3291629107,3898220290,166772364,1251581989,493813264,448347421,195405023,2709975567,677966185,3703036547,1463355134,2715995803,1338867538,1343315457,2802222074,2684532164,233230375,2599980071,2000651841,3277868038,1638401717,4028070440,3237316320,6314154,819756386,300326615,590932579,1405279636,3267499572,3150704214,2428286686,3959192993,3461946742,1862657033,1266418056,963775037,2089974820,2263052895,1917689273,448879540,3550394620,3981727096,150775221,3627908307,1303187396,508620638,2975983352,2726630617,1817252668,1876281319,1457606340,908771278,3720792119,3617206836,2455994898,1729034894,1080033504],[976866871,3556439503,2881648439,1522871579,1555064734,1336096578,3548522304,2579274686,3574697629,3205460757,3593280638,3338716283,3079412587,564236357,2993598910,1781952180,1464380207,3163844217,3332601554,1699332808,1393555694,1183702653,3581086237,1288719814,691649499,2847557200,2895455976,3193889540,2717570544,1781354906,1676643554,2592534050,3230253752,1126444790,2770207658,2633158820,2210423226,2615765581,2414155088,3127139286,673620729,2805611233,1269405062,4015350505,3341807571,4149409754,1057255273,2012875353,2162469141,2276492801,2601117357,993977747,3918593370,2654263191,753973209,36408145,2530585658,25011837,3520020182,2088578344,530523599,2918365339,1524020338,1518925132,3760827505,3759777254,1202760957,3985898139,3906192525,674977740,4174734889,2031300136,2019492241,3983892565,4153806404,3822280332,352677332,2297720250,60907813,90501309,3286998549,1016092578,2535922412,2839152426,457141659,509813237,4120667899,652014361,1966332200,2975202805,55981186,2327461051,676427537,3255491064,2882294119,3433927263,1307055953,942726286,933058658,2468411793,3933900994,4215176142,1361170020,2001714738,2830558078,3274259782,1222529897,1679025792,2729314320,3714953764,1770335741,151462246,3013232138,1682292957,1483529935,471910574,1539241949,458788160,3436315007,1807016891,3718408830,978976581,1043663428,3165965781,1927990952,4200891579,2372276910,3208408903,3533431907,1412390302,2931980059,4132332400,1947078029,3881505623,4168226417,2941484381,1077988104,1320477388,886195818,18198404,3786409e3,2509781533,112762804,3463356488,1866414978,891333506,18488651,661792760,1628790961,3885187036,3141171499,876946877,2693282273,1372485963,791857591,2686433993,3759982718,3167212022,3472953795,2716379847,445679433,3561995674,3504004811,3574258232,54117162,3331405415,2381918588,3769707343,4154350007,1140177722,4074052095,668550556,3214352940,367459370,261225585,2610173221,4209349473,3468074219,3265815641,314222801,3066103646,3808782860,282218597,3406013506,3773591054,379116347,1285071038,846784868,2669647154,3771962079,3550491691,2305946142,453669953,1268987020,3317592352,3279303384,3744833421,2610507566,3859509063,266596637,3847019092,517658769,3462560207,3443424879,370717030,4247526661,2224018117,4143653529,4112773975,2788324899,2477274417,1456262402,2901442914,1517677493,1846949527,2295493580,3734397586,2176403920,1280348187,1908823572,3871786941,846861322,1172426758,3287448474,3383383037,1655181056,3139813346,901632758,1897031941,2986607138,3066810236,3447102507,1393639104,373351379,950779232,625454576,3124240540,4148612726,2007998917,544563296,2244738638,2330496472,2058025392,1291430526,424198748,50039436,29584100,3605783033,2429876329,2791104160,1057563949,3255363231,3075367218,3463963227,1469046755,985887462]], d.prototype.PARRAY=[608135816,2242054355,320440878,57701188,2752067618,698298832,137296536,3964562569,1160258022,953160567,3193202383,887688300,3232508343,3380367581,1065670069,3041331479,2450970073,2306472731],d.prototype.NN=16,d.prototype._clean=function(a){if(0>a){var b=2147483647&a;a=b+2147483648}return a},d.prototype._F=function(a){var b,c,d,e,f;return e=255&a,a>>>=8,d=255&a,a>>>=8,c=255&a,a>>>=8,b=255&a,f=this.sboxes[0][b]+this.sboxes[1][c],f^=this.sboxes[2][d],f+=this.sboxes[3][e]},d.prototype._encrypt_block=function(a){var b,c=a[0],d=a[1];for(b=0;b>>24-8*b&255,e[b+d]=c[1]>>>24-8*b&255;return e},d.prototype._decrypt_block=function(a){var b,c=a[0],d=a[1];for(b=this.NN+1;b>1;--b){c^=this.parray[b],d=this._F(c)^d;var e=c;c=d,d=e}c^=this.parray[1],d^=this.parray[0],a[0]=this._clean(d),a[1]=this._clean(c)},d.prototype.init=function(a){var b,c=0;for(this.parray=[],b=0;bd;++d)e=e<<8|255&a[c],++c>=a.length&&(c=0);this.parray[b]=this.PARRAY[b]^e}for(this.sboxes=[],b=0;4>b;++b)for(this.sboxes[b]=[],c=0;256>c;++c)this.sboxes[b][c]=this.SBOXES[b][c];var f=[0,0];for(b=0;bb;++b)for(c=0;256>c;c+=2)this._encrypt_block(f),this.sboxes[b][c+0]=f[0],this.sboxes[b][c+1]=f[1]},b.exports=e,b.exports.keySize=e.prototype.keySize=16,b.exports.blockSize=e.prototype.blockSize=16},{}],22:[function(a,b,c){function d(){function a(a,b,c){var d=b+a,e=d<>>32-c;return(f[0][e>>>24]^f[1][e>>>16&255])-f[2][e>>>8&255]+f[3][255&e]}function b(a,b,c){var d=b^a,e=d<>>32-c;return f[0][e>>>24]-f[1][e>>>16&255]+f[2][e>>>8&255]^f[3][255&e]}function c(a,b,c){var d=b-a,e=d<>>32-c;return(f[0][e>>>24]+f[1][e>>>16&255]^f[2][e>>>8&255])-f[3][255&e]}this.BlockSize=8,this.KeySize=16,this.setKey=function(a){if(this.masking=new Array(16),this.rotate=new Array(16),this.reset(),a.length!=this.KeySize)throw new Error("CAST-128: keys must be 16 bytes");return this.keySchedule(a),!0},this.reset=function(){for(var a=0;16>a;a++)this.masking[a]=0,this.rotate[a]=0},this.getBlockSize=function(){return BlockSize},this.encrypt=function(d){for(var e=new Array(d.length),f=0;f>>24&255,e[f+1]=i>>>16&255,e[f+2]=i>>>8&255,e[f+3]=255&i,e[f+4]=h>>>24&255,e[f+5]=h>>>16&255,e[f+6]=h>>>8&255,e[f+7]=255&h}return e},this.decrypt=function(d){for(var e=new Array(d.length),f=0;f>>24&255,e[f+1]=i>>>16&255,e[f+2]=i>>>8&255,e[f+3]=255&i,e[f+4]=h>>>24&255,e[f+5]=h>>16&255,e[f+6]=h>>8&255,e[f+7]=255&h}return e};var d=new Array(4);d[0]=new Array(4),d[0][0]=new Array(4,0,13,15,12,14,8),d[0][1]=new Array(5,2,16,18,17,19,10),d[0][2]=new Array(6,3,23,22,21,20,9),d[0][3]=new Array(7,1,26,25,27,24,11),d[1]=new Array(4),d[1][0]=new Array(0,6,21,23,20,22,16),d[1][1]=new Array(1,4,0,2,1,3,18),d[1][2]=new Array(2,5,7,6,5,4,17),d[1][3]=new Array(3,7,10,9,11,8,19),d[2]=new Array(4),d[2][0]=new Array(4,0,13,15,12,14,8),d[2][1]=new Array(5,2,16,18,17,19,10),d[2][2]=new Array(6,3,23,22,21,20,9),d[2][3]=new Array(7,1,26,25,27,24,11),d[3]=new Array(4),d[3][0]=new Array(0,6,21,23,20,22,16),d[3][1]=new Array(1,4,0,2,1,3,18),d[3][2]=new Array(2,5,7,6,5,4,17),d[3][3]=new Array(3,7,10,9,11,8,19);var e=new Array(4);e[0]=new Array(4),e[0][0]=new Array(24,25,23,22,18),e[0][1]=new Array(26,27,21,20,22),e[0][2]=new Array(28,29,19,18,25),e[0][3]=new Array(30,31,17,16,28),e[1]=new Array(4),e[1][0]=new Array(3,2,12,13,8),e[1][1]=new Array(1,0,14,15,13),e[1][2]=new Array(7,6,8,9,3),e[1][3]=new Array(5,4,10,11,7),e[2]=new Array(4),e[2][0]=new Array(19,18,28,29,25),e[2][1]=new Array(17,16,30,31,28),e[2][2]=new Array(23,22,24,25,18),e[2][3]=new Array(21,20,26,27,22),e[3]=new Array(4),e[3][0]=new Array(8,9,7,6,3),e[3][1]=new Array(10,11,5,4,7),e[3][2]=new Array(12,13,3,2,8),e[3][3]=new Array(14,15,1,0,13),this.keySchedule=function(a){var b,c,g=new Array(8),h=new Array(32);for(b=0;4>b;b++)c=4*b,g[b]=a[c]<<24|a[c+1]<<16|a[c+2]<<8|a[c+3];for(var i,j=[6,7,4,5],k=0,l=0;2>l;l++)for(var m=0;4>m;m++){for(c=0;4>c;c++){var n=d[m][c];i=g[n[1]],i^=f[4][g[n[2]>>>2]>>>24-8*(3&n[2])&255],i^=f[5][g[n[3]>>>2]>>>24-8*(3&n[3])&255],i^=f[6][g[n[4]>>>2]>>>24-8*(3&n[4])&255],i^=f[7][g[n[5]>>>2]>>>24-8*(3&n[5])&255],i^=f[j[c]][g[n[6]>>>2]>>>24-8*(3&n[6])&255],g[n[0]]=i}for(c=0;4>c;c++){var o=e[m][c];i=f[4][g[o[0]>>>2]>>>24-8*(3&o[0])&255],i^=f[5][g[o[1]>>>2]>>>24-8*(3&o[1])&255],i^=f[6][g[o[2]>>>2]>>>24-8*(3&o[2])&255],i^=f[7][g[o[3]>>>2]>>>24-8*(3&o[3])&255],i^=f[4+c][g[o[4]>>>2]>>>24-8*(3&o[4])&255],h[k]=i,k++}}for(b=0;16>b;b++)this.masking[b]=h[b],this.rotate[b]=31&h[16+b]};var f=new Array(8);f[0]=new Array(821772500,2678128395,1810681135,1059425402,505495343,2617265619,1610868032,3483355465,3218386727,2294005173,3791863952,2563806837,1852023008,365126098,3269944861,584384398,677919599,3229601881,4280515016,2002735330,1136869587,3744433750,2289869850,2731719981,2714362070,879511577,1639411079,575934255,717107937,2857637483,576097850,2731753936,1725645e3,2810460463,5111599,767152862,2543075244,1251459544,1383482551,3052681127,3089939183,3612463449,1878520045,1510570527,2189125840,2431448366,582008916,3163445557,1265446783,1354458274,3529918736,3202711853,3073581712,3912963487,3029263377,1275016285,4249207360,2905708351,3304509486,1442611557,3585198765,2712415662,2731849581,3248163920,2283946226,208555832,2766454743,1331405426,1447828783,3315356441,3108627284,2957404670,2981538698,3339933917,1669711173,286233437,1465092821,1782121619,3862771680,710211251,980974943,1651941557,430374111,2051154026,704238805,4128970897,3144820574,2857402727,948965521,3333752299,2227686284,718756367,2269778983,2731643755,718440111,2857816721,3616097120,1113355533,2478022182,410092745,1811985197,1944238868,2696854588,1415722873,1682284203,1060277122,1998114690,1503841958,82706478,2315155686,1068173648,845149890,2167947013,1768146376,1993038550,3566826697,3390574031,940016341,3355073782,2328040721,904371731,1205506512,4094660742,2816623006,825647681,85914773,2857843460,1249926541,1417871568,3287612,3211054559,3126306446,1975924523,1353700161,2814456437,2438597621,1800716203,722146342,2873936343,1151126914,4160483941,2877670899,458611604,2866078500,3483680063,770352098,2652916994,3367839148,3940505011,3585973912,3809620402,718646636,2504206814,2914927912,3631288169,2857486607,2860018678,575749918,2857478043,718488780,2069512688,3548183469,453416197,1106044049,3032691430,52586708,3378514636,3459808877,3211506028,1785789304,218356169,3571399134,3759170522,1194783844,1523787992,3007827094,1975193539,2555452411,1341901877,3045838698,3776907964,3217423946,2802510864,2889438986,1057244207,1636348243,3761863214,1462225785,2632663439,481089165,718503062,24497053,3332243209,3344655856,3655024856,3960371065,1195698900,2971415156,3710176158,2115785917,4027663609,3525578417,2524296189,2745972565,3564906415,1372086093,1452307862,2780501478,1476592880,3389271281,18495466,2378148571,901398090,891748256,3279637769,3157290713,2560960102,1447622437,4284372637,216884176,2086908623,1879786977,3588903153,2242455666,2938092967,3559082096,2810645491,758861177,1121993112,215018983,642190776,4169236812,1196255959,2081185372,3508738393,941322904,4124243163,2877523539,1848581667,2205260958,3180453958,2589345134,3694731276,550028657,2519456284,3789985535,2973870856,2093648313,443148163,46942275,2734146937,1117713533,1115362972,1523183689,3717140224,1551984063),f[1]=new Array(522195092,4010518363,1776537470,960447360,4267822970,4005896314,1435016340,1929119313,2913464185,1310552629,3579470798,3724818106,2579771631,1594623892,417127293,2715217907,2696228731,1508390405,3994398868,3925858569,3695444102,4019471449,3129199795,3770928635,3520741761,990456497,4187484609,2783367035,21106139,3840405339,631373633,3783325702,532942976,396095098,3548038825,4267192484,2564721535,2011709262,2039648873,620404603,3776170075,2898526339,3612357925,4159332703,1645490516,223693667,1567101217,3362177881,1029951347,3470931136,3570957959,1550265121,119497089,972513919,907948164,3840628539,1613718692,3594177948,465323573,2659255085,654439692,2575596212,2699288441,3127702412,277098644,624404830,4100943870,2717858591,546110314,2403699828,3655377447,1321679412,4236791657,1045293279,4010672264,895050893,2319792268,494945126,1914543101,2777056443,3894764339,2219737618,311263384,4275257268,3458730721,669096869,3584475730,3835122877,3319158237,3949359204,2005142349,2713102337,2228954793,3769984788,569394103,3855636576,1425027204,108000370,2736431443,3671869269,3043122623,1750473702,2211081108,762237499,3972989403,2798899386,3061857628,2943854345,867476300,964413654,1591880597,1594774276,2179821409,552026980,3026064248,3726140315,2283577634,3110545105,2152310760,582474363,1582640421,1383256631,2043843868,3322775884,1217180674,463797851,2763038571,480777679,2718707717,2289164131,3118346187,214354409,200212307,3810608407,3025414197,2674075964,3997296425,1847405948,1342460550,510035443,4080271814,815934613,833030224,1620250387,1945732119,2703661145,3966000196,1388869545,3456054182,2687178561,2092620194,562037615,1356438536,3409922145,3261847397,1688467115,2150901366,631725691,3840332284,549916902,3455104640,394546491,837744717,2114462948,751520235,2221554606,2415360136,3999097078,2063029875,803036379,2702586305,821456707,3019566164,360699898,4018502092,3511869016,3677355358,2402471449,812317050,49299192,2570164949,3259169295,2816732080,3331213574,3101303564,2156015656,3705598920,3546263921,143268808,3200304480,1638124008,3165189453,3341807610,578956953,2193977524,3638120073,2333881532,807278310,658237817,2969561766,1641658566,11683945,3086995007,148645947,1138423386,4158756760,1981396783,2401016740,3699783584,380097457,2680394679,2803068651,3334260286,441530178,4016580796,1375954390,761952171,891809099,2183123478,157052462,3683840763,1592404427,341349109,2438483839,1417898363,644327628,2233032776,2353769706,2201510100,220455161,1815641738,182899273,2995019788,3627381533,3702638151,2890684138,1052606899,588164016,1681439879,4038439418,2405343923,4229449282,167996282,1336969661,1688053129,2739224926,1543734051,1046297529,1138201970,2121126012,115334942,1819067631,1902159161,1941945968,2206692869,1159982321),f[2]=new Array(2381300288,637164959,3952098751,3893414151,1197506559,916448331,2350892612,2932787856,3199334847,4009478890,3905886544,1373570990,2450425862,4037870920,3778841987,2456817877,286293407,124026297,3001279700,1028597854,3115296800,4208886496,2691114635,2188540206,1430237888,1218109995,3572471700,308166588,570424558,2187009021,2455094765,307733056,1310360322,3135275007,1384269543,2388071438,863238079,2359263624,2801553128,3380786597,2831162807,1470087780,1728663345,4072488799,1090516929,532123132,2389430977,1132193179,2578464191,3051079243,1670234342,1434557849,2711078940,1241591150,3314043432,3435360113,3091448339,1812415473,2198440252,267246943,796911696,3619716990,38830015,1526438404,2806502096,374413614,2943401790,1489179520,1603809326,1920779204,168801282,260042626,2358705581,1563175598,2397674057,1356499128,2217211040,514611088,2037363785,2186468373,4022173083,2792511869,2913485016,1173701892,4200428547,3896427269,1334932762,2455136706,602925377,2835607854,1613172210,41346230,2499634548,2457437618,2188827595,41386358,4172255629,1313404830,2405527007,3801973774,2217704835,873260488,2528884354,2478092616,4012915883,2555359016,2006953883,2463913485,575479328,2218240648,2099895446,660001756,2341502190,3038761536,3888151779,3848713377,3286851934,1022894237,1620365795,3449594689,1551255054,15374395,3570825345,4249311020,4151111129,3181912732,310226346,1133119310,530038928,136043402,2476768958,3107506709,2544909567,1036173560,2367337196,1681395281,1758231547,3641649032,306774401,1575354324,3716085866,1990386196,3114533736,2455606671,1262092282,3124342505,2768229131,4210529083,1833535011,423410938,660763973,2187129978,1639812e3,3508421329,3467445492,310289298,272797111,2188552562,2456863912,310240523,677093832,1013118031,901835429,3892695601,1116285435,3036471170,1337354835,243122523,520626091,277223598,4244441197,4194248841,1766575121,594173102,316590669,742362309,3536858622,4176435350,3838792410,2501204839,1229605004,3115755532,1552908988,2312334149,979407927,3959474601,1148277331,176638793,3614686272,2083809052,40992502,1340822838,2731552767,3535757508,3560899520,1354035053,122129617,7215240,2732932949,3118912700,2718203926,2539075635,3609230695,3725561661,1928887091,2882293555,1988674909,2063640240,2491088897,1459647954,4189817080,2302804382,1113892351,2237858528,1927010603,4002880361,1856122846,1594404395,2944033133,3855189863,3474975698,1643104450,4054590833,3431086530,1730235576,2984608721,3084664418,2131803598,4178205752,267404349,1617849798,1616132681,1462223176,736725533,2327058232,551665188,2945899023,1749386277,2575514597,1611482493,674206544,2201269090,3642560800,728599968,1680547377,2620414464,1388111496,453204106,4156223445,1094905244,2754698257,2201108165,3757000246,2704524545,3922940700,3996465027),f[3]=new Array(2645754912,532081118,2814278639,3530793624,1246723035,1689095255,2236679235,4194438865,2116582143,3859789411,157234593,2045505824,4245003587,1687664561,4083425123,605965023,672431967,1336064205,3376611392,214114848,4258466608,3232053071,489488601,605322005,3998028058,264917351,1912574028,756637694,436560991,202637054,135989450,85393697,2152923392,3896401662,2895836408,2145855233,3535335007,115294817,3147733898,1922296357,3464822751,4117858305,1037454084,2725193275,2127856640,1417604070,1148013728,1827919605,642362335,2929772533,909348033,1346338451,3547799649,297154785,1917849091,4161712827,2883604526,3968694238,1469521537,3780077382,3375584256,1763717519,136166297,4290970789,1295325189,2134727907,2798151366,1566297257,3672928234,2677174161,2672173615,965822077,2780786062,289653839,1133871874,3491843819,35685304,1068898316,418943774,672553190,642281022,2346158704,1954014401,3037126780,4079815205,2030668546,3840588673,672283427,1776201016,359975446,3750173538,555499703,2769985273,1324923,69110472,152125443,3176785106,3822147285,1340634837,798073664,1434183902,15393959,216384236,1303690150,3881221631,3711134124,3960975413,106373927,2578434224,1455997841,1801814300,1578393881,1854262133,3188178946,3258078583,2302670060,1539295533,3505142565,3078625975,2372746020,549938159,3278284284,2620926080,181285381,2865321098,3970029511,68876850,488006234,1728155692,2608167508,836007927,2435231793,919367643,3339422534,3655756360,1457871481,40520939,1380155135,797931188,234455205,2255801827,3990488299,397000196,739833055,3077865373,2871719860,4022553888,772369276,390177364,3853951029,557662966,740064294,1640166671,1699928825,3535942136,622006121,3625353122,68743880,1742502,219489963,1664179233,1577743084,1236991741,410585305,2366487942,823226535,1050371084,3426619607,3586839478,212779912,4147118561,1819446015,1911218849,530248558,3486241071,3252585495,2886188651,3410272728,2342195030,20547779,2982490058,3032363469,3631753222,312714466,1870521650,1493008054,3491686656,615382978,4103671749,2534517445,1932181,2196105170,278426614,6369430,3274544417,2913018367,697336853,2143000447,2946413531,701099306,1558357093,2805003052,3500818408,2321334417,3567135975,216290473,3591032198,23009561,1996984579,3735042806,2024298078,3739440863,569400510,2339758983,3016033873,3097871343,3639523026,3844324983,3256173865,795471839,2951117563,4101031090,4091603803,3603732598,971261452,534414648,428311343,3389027175,2844869880,694888862,1227866773,2456207019,3043454569,2614353370,3749578031,3676663836,459166190,4132644070,1794958188,51825668,2252611902,3084671440,2036672799,3436641603,1099053433,2469121526,3059204941,1323291266,2061838604,1018778475,2233344254,2553501054,334295216,3556750194,1065731521,183467730),f[4]=new Array(2127105028,745436345,2601412319,2788391185,3093987327,500390133,1155374404,389092991,150729210,3891597772,3523549952,1935325696,716645080,946045387,2901812282,1774124410,3869435775,4039581901,3293136918,3438657920,948246080,363898952,3867875531,1286266623,1598556673,68334250,630723836,1104211938,1312863373,613332731,2377784574,1101634306,441780740,3129959883,1917973735,2510624549,3238456535,2544211978,3308894634,1299840618,4076074851,1756332096,3977027158,297047435,3790297736,2265573040,3621810518,1311375015,1667687725,47300608,3299642885,2474112369,201668394,1468347890,576830978,3594690761,3742605952,1958042578,1747032512,3558991340,1408974056,3366841779,682131401,1033214337,1545599232,4265137049,206503691,103024618,2855227313,1337551222,2428998917,2963842932,4015366655,3852247746,2796956967,3865723491,3747938335,247794022,3755824572,702416469,2434691994,397379957,851939612,2314769512,218229120,1380406772,62274761,214451378,3170103466,2276210409,3845813286,28563499,446592073,1693330814,3453727194,29968656,3093872512,220656637,2470637031,77972100,1667708854,1358280214,4064765667,2395616961,325977563,4277240721,4220025399,3605526484,3355147721,811859167,3069544926,3962126810,652502677,3075892249,4132761541,3498924215,1217549313,3250244479,3858715919,3053989961,1538642152,2279026266,2875879137,574252750,3324769229,2651358713,1758150215,141295887,2719868960,3515574750,4093007735,4194485238,1082055363,3417560400,395511885,2966884026,179534037,3646028556,3738688086,1092926436,2496269142,257381841,3772900718,1636087230,1477059743,2499234752,3811018894,2675660129,3285975680,90732309,1684827095,1150307763,1723134115,3237045386,1769919919,1240018934,815675215,750138730,2239792499,1234303040,1995484674,138143821,675421338,1145607174,1936608440,3238603024,2345230278,2105974004,323969391,779555213,3004902369,2861610098,1017501463,2098600890,2628620304,2940611490,2682542546,1171473753,3656571411,3687208071,4091869518,393037935,159126506,1662887367,1147106178,391545844,3452332695,1891500680,3016609650,1851642611,546529401,1167818917,3194020571,2848076033,3953471836,575554290,475796850,4134673196,450035699,2351251534,844027695,1080539133,86184846,1554234488,3692025454,1972511363,2018339607,1491841390,1141460869,1061690759,4244549243,2008416118,2351104703,2868147542,1598468138,722020353,1027143159,212344630,1387219594,1725294528,3745187956,2500153616,458938280,4129215917,1828119673,544571780,3503225445,2297937496,1241802790,267843827,2694610800,1397140384,1558801448,3782667683,1806446719,929573330,2234912681,400817706,616011623,4121520928,3603768725,1761550015,1968522284,4053731006,4192232858,4005120285,872482584,3140537016,3894607381,2287405443,1963876937,3663887957,1584857e3,2975024454,1833426440,4025083860),f[5]=new Array(4143615901,749497569,1285769319,3795025788,2514159847,23610292,3974978748,844452780,3214870880,3751928557,2213566365,1676510905,448177848,3730751033,4086298418,2307502392,871450977,3222878141,4110862042,3831651966,2735270553,1310974780,2043402188,1218528103,2736035353,4274605013,2702448458,3936360550,2693061421,162023535,2827510090,687910808,23484817,3784910947,3371371616,779677500,3503626546,3473927188,4157212626,3500679282,4248902014,2466621104,3899384794,1958663117,925738300,1283408968,3669349440,1840910019,137959847,2679828185,1239142320,1315376211,1547541505,1690155329,739140458,3128809933,3933172616,3876308834,905091803,1548541325,4040461708,3095483362,144808038,451078856,676114313,2861728291,2469707347,993665471,373509091,2599041286,4025009006,4170239449,2149739950,3275793571,3749616649,2794760199,1534877388,572371878,2590613551,1753320020,3467782511,1405125690,4270405205,633333386,3026356924,3475123903,632057672,2846462855,1404951397,3882875879,3915906424,195638627,2385783745,3902872553,1233155085,3355999740,2380578713,2702246304,2144565621,3663341248,3894384975,2502479241,4248018925,3094885567,1594115437,572884632,3385116731,767645374,1331858858,1475698373,3793881790,3532746431,1321687957,619889600,1121017241,3440213920,2070816767,2833025776,1933951238,4095615791,890643334,3874130214,859025556,360630002,925594799,1764062180,3920222280,4078305929,979562269,2810700344,4087740022,1949714515,546639971,1165388173,3069891591,1495988560,922170659,1291546247,2107952832,1813327274,3406010024,3306028637,4241950635,153207855,2313154747,1608695416,1150242611,1967526857,721801357,1220138373,3691287617,3356069787,2112743302,3281662835,1111556101,1778980689,250857638,2298507990,673216130,2846488510,3207751581,3562756981,3008625920,3417367384,2198807050,529510932,3547516680,3426503187,2364944742,102533054,2294910856,1617093527,1204784762,3066581635,1019391227,1069574518,1317995090,1691889997,3661132003,510022745,3238594800,1362108837,1817929911,2184153760,805817662,1953603311,3699844737,120799444,2118332377,207536705,2282301548,4120041617,145305846,2508124933,3086745533,3261524335,1877257368,2977164480,3160454186,2503252186,4221677074,759945014,254147243,2767453419,3801518371,629083197,2471014217,907280572,3900796746,940896768,2751021123,2625262786,3161476951,3661752313,3260732218,1425318020,2977912069,1496677566,3988592072,2140652971,3126511541,3069632175,977771578,1392695845,1698528874,1411812681,1369733098,1343739227,3620887944,1142123638,67414216,3102056737,3088749194,1626167401,2546293654,3941374235,697522451,33404913,143560186,2595682037,994885535,1247667115,3859094837,2699155541,3547024625,4114935275,2968073508,3199963069,2732024527,1237921620,951448369,1898488916,1211705605,2790989240,2233243581,3598044975),f[6]=new Array(2246066201,858518887,1714274303,3485882003,713916271,2879113490,3730835617,539548191,36158695,1298409750,419087104,1358007170,749914897,2989680476,1261868530,2995193822,2690628854,3443622377,3780124940,3796824509,2976433025,4259637129,1551479e3,512490819,1296650241,951993153,2436689437,2460458047,144139966,3136204276,310820559,3068840729,643875328,1969602020,1680088954,2185813161,3283332454,672358534,198762408,896343282,276269502,3014846926,84060815,197145886,376173866,3943890818,3813173521,3545068822,1316698879,1598252827,2633424951,1233235075,859989710,2358460855,3503838400,3409603720,1203513385,1193654839,2792018475,2060853022,207403770,1144516871,3068631394,1121114134,177607304,3785736302,326409831,1929119770,2983279095,4183308101,3474579288,3200513878,3228482096,119610148,1170376745,3378393471,3163473169,951863017,3337026068,3135789130,2907618374,1183797387,2015970143,4045674555,2182986399,2952138740,3928772205,384012900,2454997643,10178499,2879818989,2596892536,111523738,2995089006,451689641,3196290696,235406569,1441906262,3890558523,3013735005,4158569349,1644036924,376726067,1006849064,3664579700,2041234796,1021632941,1374734338,2566452058,371631263,4007144233,490221539,206551450,3140638584,1053219195,1853335209,3412429660,3562156231,735133835,1623211703,3104214392,2738312436,4096837757,3366392578,3110964274,3956598718,3196820781,2038037254,3877786376,2339753847,300912036,3766732888,2372630639,1516443558,4200396704,1574567987,4069441456,4122592016,2699739776,146372218,2748961456,2043888151,35287437,2596680554,655490400,1132482787,110692520,1031794116,2188192751,1324057718,1217253157,919197030,686247489,3261139658,1028237775,3135486431,3059715558,2460921700,986174950,2661811465,4062904701,2752986992,3709736643,367056889,1353824391,731860949,1650113154,1778481506,784341916,357075625,3608602432,1074092588,2480052770,3811426202,92751289,877911070,3600361838,1231880047,480201094,3756190983,3094495953,434011822,87971354,363687820,1717726236,1901380172,3926403882,2481662265,400339184,1490350766,2661455099,1389319756,2558787174,784598401,1983468483,30828846,3550527752,2716276238,3841122214,1765724805,1955612312,1277890269,1333098070,1564029816,2704417615,1026694237,3287671188,1260819201,3349086767,1016692350,1582273796,1073413053,1995943182,694588404,1025494639,3323872702,3551898420,4146854327,453260480,1316140391,1435673405,3038941953,3486689407,1622062951,403978347,817677117,950059133,4246079218,3278066075,1486738320,1417279718,481875527,2549965225,3933690356,760697757,1452955855,3897451437,1177426808,1702951038,4085348628,2447005172,1084371187,3516436277,3068336338,1073369276,1027665953,3284188590,1230553676,1368340146,2226246512,267243139,2274220762,4070734279,2497715176,2423353163,2504755875),f[7]=new Array(3793104909,3151888380,2817252029,895778965,2005530807,3871412763,237245952,86829237,296341424,3851759377,3974600970,2475086196,709006108,1994621201,2972577594,937287164,3734691505,168608556,3189338153,2225080640,3139713551,3033610191,3025041904,77524477,185966941,1208824168,2344345178,1721625922,3354191921,1066374631,1927223579,1971335949,2483503697,1551748602,2881383779,2856329572,3003241482,48746954,1398218158,2050065058,313056748,4255789917,393167848,1912293076,940740642,3465845460,3091687853,2522601570,2197016661,1727764327,364383054,492521376,1291706479,3264136376,1474851438,1685747964,2575719748,1619776915,1814040067,970743798,1561002147,2925768690,2123093554,1880132620,3151188041,697884420,2550985770,2607674513,2659114323,110200136,1489731079,997519150,1378877361,3527870668,478029773,2766872923,1022481122,431258168,1112503832,897933369,2635587303,669726182,3383752315,918222264,163866573,3246985393,3776823163,114105080,1903216136,761148244,3571337562,1690750982,3166750252,1037045171,1888456500,2010454850,642736655,616092351,365016990,1185228132,4174898510,1043824992,2023083429,2241598885,3863320456,3279669087,3674716684,108438443,2132974366,830746235,606445527,4173263986,2204105912,1844756978,2532684181,4245352700,2969441100,3796921661,1335562986,4061524517,2720232303,2679424040,634407289,885462008,3294724487,3933892248,2094100220,339117932,4048830727,3202280980,1458155303,2689246273,1022871705,2464987878,3714515309,353796843,2822958815,4256850100,4052777845,551748367,618185374,3778635579,4020649912,1904685140,3069366075,2670879810,3407193292,2954511620,4058283405,2219449317,3135758300,1120655984,3447565834,1474845562,3577699062,550456716,3466908712,2043752612,881257467,869518812,2005220179,938474677,3305539448,3850417126,1315485940,3318264702,226533026,965733244,321539988,1136104718,804158748,573969341,3708209826,937399083,3290727049,2901666755,1461057207,4013193437,4066861423,3242773476,2421326174,1581322155,3028952165,786071460,3900391652,3918438532,1485433313,4023619836,3708277595,3678951060,953673138,1467089153,1930354364,1533292819,2492563023,1346121658,1685000834,1965281866,3765933717,4190206607,2052792609,3515332758,690371149,3125873887,2180283551,2903598061,3933952357,436236910,289419410,14314871,1242357089,2904507907,1616633776,2666382180,585885352,3471299210,2699507360,1432659641,277164553,3354103607,770115018,2303809295,3741942315,3177781868,2853364978,2269453327,3774259834,987383833,1290892879,225909803,1741533526,890078084,1496906255,1111072499,916028167,243534141,1252605537,2204162171,531204876,290011180,3916834213,102027703,237315147,209093447,1486785922,220223953,2758195998,4175039106,82940208,3127791296,2569425252,518464269,1353887104,3941492737,2377294467,3935040926)}function e(a){this.cast5=new d,this.cast5.setKey(a),this.encrypt=function(a){return this.cast5.encrypt(a)}}b.exports=e,b.exports.blockSize=e.prototype.blockSize=8,b.exports.keySize=e.prototype.keySize=16},{}],23:[function(a,b,c){function d(a,b,c,d,e,h){var i,j,k,l,m,n,o,p,q,r,s,t,u,v,w=new Array(16843776,0,65536,16843780,16842756,66564,4,65536,1024,16843776,16843780,1024,16778244,16842756,16777216,4,1028,16778240,16778240,66560,66560,16842752,16842752,16778244,65540,16777220,16777220,65540,0,1028,66564,16777216,65536,16843780,4,16842752,16843776,16777216,16777216,1024,16842756,65536,66560,16777220,1024,4,16778244,66564,16843780,65540,16842752,16778244,16777220,1028,66564,16843776,1028,16778240,16778240,0,65540,66560,0,16842756),x=new Array(-2146402272,-2147450880,32768,1081376,1048576,32,-2146435040,-2147450848,-2147483616,-2146402272,-2146402304,-2147483648,-2147450880,1048576,32,-2146435040,1081344,1048608,-2147450848,0,-2147483648,32768,1081376,-2146435072,1048608,-2147483616,0,1081344,32800,-2146402304,-2146435072,32800,0,1081376,-2146435040,1048576,-2147450848,-2146435072,-2146402304,32768,-2146435072,-2147450880,32,-2146402272,1081376,32,32768,-2147483648,32800,-2146402304,1048576,-2147483616,1048608,-2147450848,-2147483616,1048608,1081344,0,-2147450880,32800,-2147483648,-2146435040,-2146402272,1081344),y=new Array(520,134349312,0,134348808,134218240,0,131592,134218240,131080,134217736,134217736,131072,134349320,131080,134348800,520,134217728,8,134349312,512,131584,134348800,134348808,131592,134218248,131584,131072,134218248,8,134349320,512,134217728,134349312,134217728,131080,520,131072,134349312,134218240,0,512,131080,134349320,134218240,134217736,512,0,134348808,134218248,131072,134217728,134349320,8,131592,131584,134217736,134348800,134218248,520,134348800,131592,8,134348808,131584),z=new Array(8396801,8321,8321,128,8396928,8388737,8388609,8193,0,8396800,8396800,8396929,129,0,8388736,8388609,1,8192,8388608,8396801,128,8388608,8193,8320,8388737,1,8320,8388736,8192,8396928,8396929,129,8388736,8388609,8396800,8396929,129,0,0,8396800,8320,8388736,8388737,1,8396801,8321,8321,128,8396929,129,1,8192,8388609,8193,8396928,8388737,8193,8320,8388608,8396801,128,8388608,8192,8396928),A=new Array(256,34078976,34078720,1107296512,524288,256,1073741824,34078720,1074266368,524288,33554688,1074266368,1107296512,1107820544,524544,1073741824,33554432,1074266112,1074266112,0,1073742080,1107820800,1107820800,33554688,1107820544,1073742080,0,1107296256,34078976,33554432,1107296256,524544,524288,1107296512,256,33554432,1073741824,34078720,1107296512,1074266368,33554688,1073741824,1107820544,34078976,1074266368,256,33554432,1107820544,1107820800,524544,1107296256,1107820800,34078720,0,1074266112,1107296256,524544,33554688,1073742080,524288,0,1074266112,34078976,1073742080),B=new Array(536870928,541065216,16384,541081616,541065216,16,541081616,4194304,536887296,4210704,4194304,536870928,4194320,536887296,536870912,16400,0,4194320,536887312,16384,4210688,536887312,16,541065232,541065232,0,4210704,541081600,16400,4210688,541081600,536870912,536887296,16,541065232,4210688,541081616,4194304,16400,536870928,4194304,536887296,536870912,16400,536870928,541081616,4210688,541065216,4210704,541081600,0,541065232,16,16384,541065216,4210704,16384,4194320,536887312,0,541081600,536870912,4194320,536887312),C=new Array(2097152,69206018,67110914,0,2048,67110914,2099202,69208064,69208066,2097152,0,67108866,2,67108864,69206018,2050,67110912,2099202,2097154,67110912,67108866,69206016,69208064,2097154,69206016,2048,2050,69208066,2099200,2,67108864,2099200,67108864,2099200,2097152,67110914,67110914,69206018,69206018,2,2097154,67108864,67110912,2097152,69208064,2050,2099202,69208064,2050,67108866,69208066,69206016,2099200,0,2,69208066,0,2099202,69206016,2048,67108866,67110912,2048,2097154),D=new Array(268439616,4096,262144,268701760,268435456,268439616,64,268435456,262208,268697600,268701760,266240,268701696,266304,4096,64,268697600,268435520,268439552,4160,266240,262208,268697664,268701696,4160,0,0,268697664,268435520,268439552,266304,262144,266304,262144,268701696,4096,64,268697664,4096,266304,268439552,64,268435520,268697600,268697664,268435456,262144,268439616,0,268701760,262208,268435520,268697600,268439552,268439616,0,268701760,266240,266240,4160,4160,262208,268435456,268701696),E=0,F=b.length,G=32==a.length?3:9; p=3==G?c?new Array(0,32,2):new Array(30,-2,-2):c?new Array(0,32,2,62,30,-2,64,96,2):new Array(94,62,-2,32,64,2,30,-2,-2),c&&(b=f(b,h),F=b.length);var H=new Uint8Array(F),I=0;for(1==d&&(q=e[E++]<<24|e[E++]<<16|e[E++]<<8|e[E++],s=e[E++]<<24|e[E++]<<16|e[E++]<<8|e[E++],E=0);F>E;){for(n=b[E++]<<24|b[E++]<<16|b[E++]<<8|b[E++],o=b[E++]<<24|b[E++]<<16|b[E++]<<8|b[E++],1==d&&(c?(n^=q,o^=s):(r=q,t=s,q=n,s=o)),k=252645135&(n>>>4^o),o^=k,n^=k<<4,k=65535&(n>>>16^o),o^=k,n^=k<<16,k=858993459&(o>>>2^n),n^=k,o^=k<<2,k=16711935&(o>>>8^n),n^=k,o^=k<<8,k=1431655765&(n>>>1^o),o^=k,n^=k<<1,n=n<<1|n>>>31,o=o<<1|o>>>31,j=0;G>j;j+=3){for(u=p[j+1],v=p[j+2],i=p[j];i!=u;i+=v)l=o^a[i],m=(o>>>4|o<<28)^a[i+1],k=n,n=o,o=k^(x[l>>>24&63]|z[l>>>16&63]|B[l>>>8&63]|D[63&l]|w[m>>>24&63]|y[m>>>16&63]|A[m>>>8&63]|C[63&m]);k=n,n=o,o=k}n=n>>>1|n<<31,o=o>>>1|o<<31,k=1431655765&(n>>>1^o),o^=k,n^=k<<1,k=16711935&(o>>>8^n),n^=k,o^=k<<8,k=858993459&(o>>>2^n),n^=k,o^=k<<2,k=65535&(n>>>16^o),o^=k,n^=k<<16,k=252645135&(n>>>4^o),o^=k,n^=k<<4,1==d&&(c?(q=n,s=o):(n^=r,o^=t)),H[I++]=n>>>24,H[I++]=n>>>16&255,H[I++]=n>>>8&255,H[I++]=255&n,H[I++]=o>>>24,H[I++]=o>>>16&255,H[I++]=o>>>8&255,H[I++]=255&o}return c||(H=g(H,h)),H}function e(a){pc2bytes0=new Array(0,4,536870912,536870916,65536,65540,536936448,536936452,512,516,536871424,536871428,66048,66052,536936960,536936964),pc2bytes1=new Array(0,1,1048576,1048577,67108864,67108865,68157440,68157441,256,257,1048832,1048833,67109120,67109121,68157696,68157697),pc2bytes2=new Array(0,8,2048,2056,16777216,16777224,16779264,16779272,0,8,2048,2056,16777216,16777224,16779264,16779272),pc2bytes3=new Array(0,2097152,134217728,136314880,8192,2105344,134225920,136323072,131072,2228224,134348800,136445952,139264,2236416,134356992,136454144),pc2bytes4=new Array(0,262144,16,262160,0,262144,16,262160,4096,266240,4112,266256,4096,266240,4112,266256),pc2bytes5=new Array(0,1024,32,1056,0,1024,32,1056,33554432,33555456,33554464,33555488,33554432,33555456,33554464,33555488),pc2bytes6=new Array(0,268435456,524288,268959744,2,268435458,524290,268959746,0,268435456,524288,268959744,2,268435458,524290,268959746),pc2bytes7=new Array(0,65536,2048,67584,536870912,536936448,536872960,536938496,131072,196608,133120,198656,537001984,537067520,537004032,537069568),pc2bytes8=new Array(0,262144,0,262144,2,262146,2,262146,33554432,33816576,33554432,33816576,33554434,33816578,33554434,33816578),pc2bytes9=new Array(0,268435456,8,268435464,0,268435456,8,268435464,1024,268436480,1032,268436488,1024,268436480,1032,268436488),pc2bytes10=new Array(0,32,0,32,1048576,1048608,1048576,1048608,8192,8224,8192,8224,1056768,1056800,1056768,1056800),pc2bytes11=new Array(0,16777216,512,16777728,2097152,18874368,2097664,18874880,67108864,83886080,67109376,83886592,69206016,85983232,69206528,85983744),pc2bytes12=new Array(0,4096,134217728,134221824,524288,528384,134742016,134746112,16,4112,134217744,134221840,524304,528400,134742032,134746128),pc2bytes13=new Array(0,4,256,260,0,4,256,260,1,5,257,261,1,5,257,261);for(var b,c,d,e=a.length>8?3:1,f=new Array(32*e),g=new Array(0,0,1,1,1,1,1,1,0,1,1,1,1,1,1,0),h=0,j=0,k=0;e>k;k++)for(left=a[h++]<<24|a[h++]<<16|a[h++]<<8|a[h++],right=a[h++]<<24|a[h++]<<16|a[h++]<<8|a[h++],d=252645135&(left>>>4^right),right^=d,left^=d<<4,d=65535&(right>>>-16^left),left^=d,right^=d<<-16,d=858993459&(left>>>2^right),right^=d,left^=d<<2,d=65535&(right>>>-16^left),left^=d,right^=d<<-16,d=1431655765&(left>>>1^right),right^=d,left^=d<<1,d=16711935&(right>>>8^left),left^=d,right^=d<<8,d=1431655765&(left>>>1^right),right^=d,left^=d<<1,d=left<<8|right>>>20&240,left=right<<24|right<<8&16711680|right>>>8&65280|right>>>24&240,right=d,i=0;i>>26,right=right<<2|right>>>26):(left=left<<1|left>>>27,right=right<<1|right>>>27),left&=-15,right&=-15,b=pc2bytes0[left>>>28]|pc2bytes1[left>>>24&15]|pc2bytes2[left>>>20&15]|pc2bytes3[left>>>16&15]|pc2bytes4[left>>>12&15]|pc2bytes5[left>>>8&15]|pc2bytes6[left>>>4&15],c=pc2bytes7[right>>>28]|pc2bytes8[right>>>24&15]|pc2bytes9[right>>>20&15]|pc2bytes10[right>>>16&15]|pc2bytes11[right>>>12&15]|pc2bytes12[right>>>8&15]|pc2bytes13[right>>>4&15],d=65535&(c>>>16^b),f[j++]=b^d,f[j++]=c^d<<16;return f}function f(a,b){var c,d=8-a.length%8;if(2==b&&8>d)c=" ".charCodeAt(0);else if(1==b)c=d;else{if(b||!(8>d)){if(8==d)return a;throw new Error("des: invalid padding")}c=0}for(var e=new Uint8Array(a.length+d),f=0;fg;g++)e[a.length+g]=c;return e}function g(a,b){var c,d=null;if(2==b)c=" ".charCodeAt(0);else if(1==b)d=a[a.length-1];else{if(b)throw new Error("des: invalid padding");c=0}if(!d){for(d=1;a[a.length-d]===c;)d++;d--}return a.subarray(0,a.length-d)}function h(a){this.key=[];for(var b=0;3>b;b++)this.key.push(new Uint8Array(a.subarray(8*b,8*b+8)));this.encrypt=function(a){return d(e(this.key[2]),d(e(this.key[1]),d(e(this.key[0]),a,!0,0,null,null),!1,0,null,null),!0,0,null,null)}}function j(a){this.key=a,this.encrypt=function(a,b){var c=e(this.key);return d(c,a,!0,0,null,b)},this.decrypt=function(a,b){var c=e(this.key);return d(c,a,!1,0,null,b)}}a("../../util.js");h.keySize=h.prototype.keySize=24,h.blockSize=h.prototype.blockSize=8,b.exports={des:h,originalDes:j}},{"../../util.js":74}],24:[function(a,b,c){var d=a("./des.js");b.exports={des:d.originalDes,tripledes:d.des,cast5:a("./cast5.js"),twofish:a("./twofish.js"),blowfish:a("./blowfish.js"),idea:function(){throw new Error("IDEA symmetric-key algorithm not implemented")}};var e=a("./aes.js");for(var f in e)b.exports["aes"+f]=e[f]},{"./aes.js":20,"./blowfish.js":21,"./cast5.js":22,"./des.js":23,"./twofish.js":25}],25:[function(a,b,c){function d(a,b){return(a<>>32-b)&k}function e(a,b){return a[b]|a[b+1]<<8|a[b+2]<<16|a[b+3]<<24}function f(a,b,c){a.splice(b,4,255&c,c>>>8&255,c>>>16&255,c>>>24&255)}function g(a,b){return a>>>8*b&255}function h(){function a(a){function b(a){return a^a>>2^[0,90,180,238][3&a]}function c(a){return a^a>>1^a>>2^[0,238,180,90][3&a]}function f(a,b){var c,d,e;for(c=0;8>c;c++)d=b>>>24,b=b<<8&k|a>>>24,a=a<<8&k,e=d<<1,128&d&&(e^=333),b^=d^e<<16,e^=d>>>1,1&d&&(e^=166),b^=e<<24|e<<8;return b}function h(a,b){var c,d,e,f;return c=b>>4,d=15&b,e=A[a][c^d],f=B[a][E[d]^F[c]],D[a][E[f]^F[e]]<<4|C[a][e^f]}function i(a,b){var c=g(a,0),d=g(a,1),e=g(a,2),f=g(a,3);switch(q){case 4:c=G[1][c]^g(b[3],0),d=G[0][d]^g(b[3],1),e=G[0][e]^g(b[3],2),f=G[1][f]^g(b[3],3);case 3:c=G[1][c]^g(b[2],0),d=G[1][d]^g(b[2],1),e=G[0][e]^g(b[2],2),f=G[0][f]^g(b[2],3);case 2:c=G[0][G[0][c]^g(b[1],0)]^g(b[0],0),d=G[0][G[1][d]^g(b[1],1)]^g(b[0],1),e=G[1][G[0][e]^g(b[1],2)]^g(b[0],2),f=G[1][G[1][f]^g(b[1],3)]^g(b[0],3)}return H[0][c]^H[1][d]^H[2][e]^H[3][f]}o=a;var j,l,m,n,p,q,r,u,v,w=[],x=[],y=[],z=[],A=[[8,1,7,13,6,15,3,2,0,11,5,9,14,12,10,4],[2,8,11,13,15,7,6,14,3,1,9,4,0,10,12,5]],B=[[14,12,11,8,1,2,3,5,15,4,10,6,7,0,9,13],[1,14,2,11,4,12,3,7,6,13,10,5,15,9,0,8]],C=[[11,10,5,14,6,13,9,0,12,8,15,3,2,4,7,1],[4,12,7,5,1,6,9,10,0,14,13,8,2,11,3,15]],D=[[13,7,15,4,1,2,6,14,9,11,3,0,8,5,12,10],[11,9,5,1,12,3,13,14,6,4,7,15,2,0,8,10]],E=[0,8,1,9,2,10,3,11,4,12,5,13,6,14,7,15],F=[0,9,2,11,4,13,6,15,8,1,10,3,12,5,14,7],G=[[],[]],H=[[],[],[],[]];for(o=o.slice(0,32),j=o.length;16!=j&&24!=j&&32!=j;)o[j++]=0;for(j=0;j>2]=e(o,j);for(j=0;256>j;j++)G[0][j]=h(0,j),G[1][j]=h(1,j);for(j=0;256>j;j++)r=G[1][j],u=b(r),v=c(r),H[0][j]=r+(u<<8)+(v<<16)+(v<<24),H[2][j]=u+(v<<8)+(r<<16)+(v<<24),r=G[0][j],u=b(r),v=c(r),H[1][j]=v+(v<<8)+(u<<16)+(r<<24),H[3][j]=u+(r<<8)+(v<<16)+(u<<24);for(q=y.length/2,j=0;q>j;j++)l=y[j+j],w[j]=l,m=y[j+j+1],x[j]=m,z[q-j-1]=f(l,m);for(j=0;40>j;j+=2)l=16843009*j,m=l+16843009,l=i(l,w),m=d(i(m,x),8),s[j]=l+m&k,s[j+1]=d(l+2*m,9);for(j=0;256>j;j++)switch(l=m=n=p=j,q){case 4:l=G[1][l]^g(z[3],0),m=G[0][m]^g(z[3],1),n=G[0][n]^g(z[3],2),p=G[1][p]^g(z[3],3);case 3:l=G[1][l]^g(z[2],0),m=G[1][m]^g(z[2],1),n=G[0][n]^g(z[2],2),p=G[0][p]^g(z[2],3);case 2:t[0][j]=H[0][G[0][G[0][l]^g(z[1],0)]^g(z[0],0)],t[1][j]=H[1][G[0][G[1][m]^g(z[1],1)]^g(z[0],1)],t[2][j]=H[2][G[1][G[0][n]^g(z[1],2)]^g(z[0],2)],t[3][j]=H[3][G[1][G[1][p]^g(z[1],3)]^g(z[0],3)]}}function b(a){return t[0][g(a,0)]^t[1][g(a,1)]^t[2][g(a,2)]^t[3][g(a,3)]}function c(a){return t[0][g(a,3)]^t[1][g(a,0)]^t[2][g(a,1)]^t[3][g(a,2)]}function h(a,e){var f=b(e[0]),g=c(e[1]);e[2]=d(e[2]^f+g+s[4*a+8]&k,31),e[3]=d(e[3],1)^f+2*g+s[4*a+9]&k,f=b(e[2]),g=c(e[3]),e[0]=d(e[0]^f+g+s[4*a+10]&k,31),e[1]=d(e[1],1)^f+2*g+s[4*a+11]&k}function i(a,e){var f=b(e[0]),g=c(e[1]);e[2]=d(e[2],1)^f+g+s[4*a+10]&k,e[3]=d(e[3]^f+2*g+s[4*a+11]&k,31),f=b(e[2]),g=c(e[3]),e[0]=d(e[0],1)^f+g+s[4*a+8]&k,e[1]=d(e[1]^f+2*g+s[4*a+9]&k,31)}function j(){s=[],t=[[],[],[],[]]}function l(a,b){p=a,q=b;for(var c=[e(p,q)^s[0],e(p,q+4)^s[1],e(p,q+8)^s[2],e(p,q+12)^s[3]],d=0;8>d;d++)h(d,c);return f(p,q,c[2]^s[4]),f(p,q+4,c[3]^s[5]),f(p,q+8,c[0]^s[6]),f(p,q+12,c[1]^s[7]),q+=16,p}function m(a,b){p=a,q=b;for(var c=[e(p,q)^s[4],e(p,q+4)^s[5],e(p,q+8)^s[6],e(p,q+12)^s[7]],d=7;d>=0;d--)i(d,c);f(p,q,c[2]^s[0]),f(p,q+4,c[3]^s[1]),f(p,q+8,c[0]^s[2]),f(p,q+12,c[1]^s[3]),q+=16}function n(){return p}var o=null,p=null,q=-1,r=null;r="twofish";var s=[],t=[[],[],[],[]];return{name:"twofish",blocksize:16,open:a,close:j,encrypt:l,decrypt:m,finalize:n}}function i(a){this.tf=h(),this.tf.open(j(a),0),this.encrypt=function(a){return this.tf.encrypt(j(a),0)}}function j(a){for(var b=[],c=0;c>>32-e,c)}function f(a,b,c,d,f,g,h){return e(b&c|~b&d,a,b,f,g,h)}function g(a,b,c,d,f,g,h){return e(b&d|c&~d,a,b,f,g,h)}function h(a,b,c,d,f,g,h){return e(b^c^d,a,b,f,g,h)}function i(a,b,c,d,f,g,h){return e(c^(b|~d),a,b,f,g,h)}function j(a){txt="";var b,c=a.length,e=[1732584193,-271733879,-1732584194,271733878];for(b=64;b<=a.length;b+=64)d(e,k(a.substring(b-64,b)));a=a.substring(b-64);var f=[0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0];for(b=0;b>2]|=a.charCodeAt(b)<<(b%4<<3);if(f[b>>2]|=128<<(b%4<<3),b>55)for(d(e,f),b=0;16>b;b++)f[b]=0;return f[14]=8*c,d(e,f),e}function k(a){var b,c=[];for(b=0;64>b;b+=4)c[b>>2]=a.charCodeAt(b)+(a.charCodeAt(b+1)<<8)+(a.charCodeAt(b+2)<<16)+(a.charCodeAt(b+3)<<24);return c}function l(a){for(var b="",c=0;4>c;c++)b+=q[a>>8*c+4&15]+q[a>>8*c&15];return b}function m(a){for(var b=0;b>16)+(b>>16)+(c>>16);return d<<16|65535&c}var p=a("../../util.js");b.exports=function(a){var b=n(p.Uint8Array2str(a)),c=p.str2Uint8Array(p.hex2bin(b));return c};var q="0123456789abcdef".split("");"5d41402abc4b2a76b9719d911017c592"!=n("hello")},{"../../util.js":74}],29:[function(a,b,c){function d(a,b){return new Number(a<>>32-b)}function e(a,b,c){return new Number(a^b^c)}function f(a,b,c){return new Number(a&b|~a&c)}function g(a,b,c){return new Number((a|~b)^c)}function h(a,b,c){return new Number(a&c|b&~c)}function i(a,b,c){return new Number(a^(b|~c))}function j(a,b,c,j,k,l,m,n){switch(n){case 0:a+=e(b,c,j)+l+0;break;case 1:a+=f(b,c,j)+l+1518500249;break;case 2:a+=g(b,c,j)+l+1859775393;break;case 3:a+=h(b,c,j)+l+2400959708;break;case 4:a+=i(b,c,j)+l+2840853838;break;case 5:a+=i(b,c,j)+l+1352829926;break;case 6:a+=h(b,c,j)+l+1548603684;break;case 7:a+=g(b,c,j)+l+1836072691;break;case 8:a+=f(b,c,j)+l+2053994217;break;case 9:a+=e(b,c,j)+l+0;break;default:throw new Error("Bogus round number")}a=d(a,m)+k,c=d(c,10),a&=4294967295,b&=4294967295,c&=4294967295,j&=4294967295,k&=4294967295;var o=[];return o[0]=a,o[1]=b,o[2]=c,o[3]=j,o[4]=k,o[5]=l,o[6]=m,o}function k(a){a[0]=1732584193,a[1]=4023233417,a[2]=2562383102,a[3]=271733878,a[4]=3285377520}function l(a,b){blockA=[],blockB=[];var c,d,e;for(d=0;5>d;d++)blockA[d]=new Number(a[d]),blockB[d]=new Number(a[d]);var f=0;for(e=0;5>e;e++)for(d=0;16>d;d++)c=j(blockA[(f+0)%5],blockA[(f+1)%5],blockA[(f+2)%5],blockA[(f+3)%5],blockA[(f+4)%5],b[u[e][d]],t[e][d],e),blockA[(f+0)%5]=c[0],blockA[(f+1)%5]=c[1],blockA[(f+2)%5]=c[2],blockA[(f+3)%5]=c[3],blockA[(f+4)%5]=c[4],f+=4;for(f=0,e=5;10>e;e++)for(d=0;16>d;d++)c=j(blockB[(f+0)%5],blockB[(f+1)%5],blockB[(f+2)%5],blockB[(f+3)%5],blockB[(f+4)%5],b[u[e][d]],t[e][d],e),blockB[(f+0)%5]=c[0],blockB[(f+1)%5]=c[1],blockB[(f+2)%5]=c[2],blockB[(f+3)%5]=c[3],blockB[(f+4)%5]=c[4],f+=4;blockB[3]+=blockA[2]+a[1],a[1]=a[2]+blockA[3]+blockB[4],a[2]=a[3]+blockA[4]+blockB[0],a[3]=a[4]+blockA[0]+blockB[1],a[4]=a[0]+blockA[1]+blockB[2],a[0]=blockB[3]}function m(a){for(var b=0;16>b;b++)a[b]=0}function n(a,b,c,d){var e=new Array(16);m(e);for(var f=0,g=0;(63&c)>g;g++)e[g>>>2]^=(255&b.charCodeAt(f++))<<8*(3&g);e[c>>>2&15]^=1<<8*(3&c)+7,(63&c)>55&&(l(a,e),e=new Array(16),m(e)),e[14]=c<<3,e[15]=c>>>29|d<<3,l(a,e)}function o(a){var b=(255&a.charCodeAt(3))<<24;return b|=(255&a.charCodeAt(2))<<16,b|=(255&a.charCodeAt(1))<<8,b|=255&a.charCodeAt(0)}function p(a){var b,c,d=new Array(s/32),e=new Array(s/8);k(d),b=a.length;var f=new Array(16);m(f);var g,h=0;for(c=b;c>63;c-=64){for(g=0;16>g;g++)f[g]=o(a.substr(h,4)),h+=4;l(d,f)}for(n(d,a.substr(h),b,0),g=0;s/8>g;g+=4)e[g]=255&d[g>>>2],e[g+1]=d[g>>>2]>>>8&255,e[g+2]=d[g>>>2]>>>16&255,e[g+3]=d[g>>>2]>>>24&255;return e}function q(a){for(var b=p(r.Uint8Array2str(a)),c="",d=0;s/8>d;d++)c+=String.fromCharCode(b[d]);return r.str2Uint8Array(c)}var r=a("../../util.js"),s=160,t=[[11,14,15,12,5,8,7,9,11,13,14,15,6,7,9,8],[7,6,8,13,11,9,7,15,7,12,15,9,11,7,13,12],[11,13,6,7,14,9,13,15,14,8,13,6,5,12,7,5],[11,12,14,15,14,15,9,8,9,14,5,6,8,6,5,12],[9,15,5,11,6,8,13,12,5,12,13,14,11,8,5,6],[8,9,9,11,13,15,15,5,7,7,8,11,14,14,12,6],[9,13,15,7,12,8,9,11,7,7,12,7,6,15,13,11],[9,7,15,11,8,6,6,14,12,13,5,14,13,13,7,5],[15,5,8,11,14,14,6,14,6,9,12,9,12,5,15,8],[8,5,12,9,12,5,14,6,8,13,6,5,15,13,11,11]],u=[[0,1,2,3,4,5,6,7,8,9,10,11,12,13,14,15],[7,4,13,1,10,6,15,3,12,0,9,5,2,14,11,8],[3,10,14,4,9,15,8,1,2,7,0,6,13,11,5,12],[1,9,11,10,0,8,12,4,13,3,7,15,14,5,6,2],[4,0,5,9,7,12,2,10,14,1,3,8,11,6,15,13],[5,14,7,0,9,2,11,4,13,6,15,8,1,10,3,12],[6,11,3,7,0,13,5,10,14,15,8,12,4,9,1,2],[15,5,1,3,7,14,6,9,11,8,12,2,10,0,4,13],[8,6,4,1,3,11,15,0,5,12,2,13,9,7,10,14],[12,15,10,4,1,5,8,7,6,2,13,14,0,3,9,11]];b.exports=q},{"../../util.js":74}],30:[function(a,b,c){var d="undefined"!=typeof self?self:"undefined"!=typeof window?window:{};!function(){function a(b){"use strict";var d={fill:0},e=function(a){for(a+=9;a%64>0;a+=1);return a},f=function(a,b){for(var c=b>>2;c>2]|=128<<24-(b%4<<3),a[((b>>2)+2&-16)+14]=c>>29,a[((b>>2)+2&-16)+15]=c<<3},h=function(a,b,c,d,e){var f,g=this,h=e%4,i=d%4,j=d-i;if(j>0)switch(h){case 0:a[e+3|0]=g.charCodeAt(c);case 1:a[e+2|0]=g.charCodeAt(c+1);case 2:a[e+1|0]=g.charCodeAt(c+2);case 3:a[0|e]=g.charCodeAt(c+3)}for(f=h;j>f;f=f+4|0)b[e+f>>2]=g.charCodeAt(c+f)<<24|g.charCodeAt(c+f+1)<<16|g.charCodeAt(c+f+2)<<8|g.charCodeAt(c+f+3);switch(i){case 3:a[e+j+1|0]=g.charCodeAt(c+j+2);case 2:a[e+j+2|0]=g.charCodeAt(c+j+1);case 1:a[e+j+3|0]=g.charCodeAt(c+j)}},i=function(a,b,c,d,e){var f,g=this,h=e%4,i=d%4,j=d-i;if(j>0)switch(h){case 0:a[e+3|0]=g[c];case 1:a[e+2|0]=g[c+1];case 2:a[e+1|0]=g[c+2];case 3:a[0|e]=g[c+3]}for(f=4-h;j>f;f=f+=4)b[e+f>>2]=g[c+f]<<24|g[c+f+1]<<16|g[c+f+2]<<8|g[c+f+3];switch(i){case 3:a[e+j+1|0]=g[c+j+2];case 2:a[e+j+2|0]=g[c+j+1];case 1:a[e+j+3|0]=g[c+j]}},j=function(a,b,c,d,e){var f,g=this,h=e%4,i=d%4,j=d-i,k=new Uint8Array(reader.readAsArrayBuffer(g.slice(c,c+d)));if(j>0)switch(h){case 0:a[e+3|0]=k[0];case 1:a[e+2|0]=k[1];case 2:a[e+1|0]=k[2];case 3:a[0|e]=k[3]}for(f=4-h;j>f;f=f+=4)b[e+f>>2]=k[f]<<24|k[f+1]<<16|k[f+2]<<8|k[f+3];switch(i){case 3:a[e+j+1|0]=k[j+2];case 2:a[e+j+2|0]=k[j+1];case 1:a[e+j+3|0]=k[j]}},k=function(a){switch(c.getDataType(a)){case"string":return h.bind(a);case"array":return i.bind(a);case"buffer":return i.bind(a);case"arraybuffer":return i.bind(new Uint8Array(a));case"view":return i.bind(new Uint8Array(a.buffer,a.byteOffset,a.byteLength));case"blob":return j.bind(a)}},l=function(a){var b,c,d="0123456789abcdef",e=[],f=new Uint8Array(a);for(b=0;b>4&15)+d.charAt(c>>0&15);return e.join("")},m=function(a){var b;if(65536>=a)return 65536;if(16777216>a)for(b=1;a>b;b<<=1);else for(b=16777216;a>b;b+=16777216);return b},n=function(b){if(b%64>0)throw new Error("Chunk size must be a multiple of 128 bit");d.maxChunkLen=b,d.padMaxChunkLen=e(b),d.heap=new ArrayBuffer(m(d.padMaxChunkLen+320+20)),d.h32=new Int32Array(d.heap),d.h8=new Int8Array(d.heap),d.core=new a._core({Int32Array:Int32Array,DataView:DataView},{},d.heap),d.buffer=null};n(b||65536);var o=function(a,b){var c=new Int32Array(a,b+320,5);c[0]=1732584193,c[1]=-271733879,c[2]=-1732584194,c[3]=271733878,c[4]=-1009589776},p=function(a,b){var c=e(a),h=new Int32Array(d.heap,0,c>>2);return f(h,a),g(h,a,b),c},q=function(a,b,c){k(a)(d.h8,d.h32,b,c,0)},r=function(a,b,c,e,f){var g=c;f&&(g=p(c,e)),q(a,b,c),d.core.hash(g,d.padMaxChunkLen)},s=function(a,b){var c=new Int32Array(a,b+320,5),d=new Int32Array(5),e=new DataView(d.buffer);return e.setInt32(0,c[0],!1),e.setInt32(4,c[1],!1),e.setInt32(8,c[2],!1),e.setInt32(12,c[3],!1),e.setInt32(16,c[4],!1),d},t=this.rawDigest=function(a){var b=a.byteLength||a.length||a.size||0;o(d.heap,d.padMaxChunkLen);var c=0,e=d.maxChunkLen;for(c=0;b>c+e;c+=e)r(a,c,e,b,!1);return r(a,c,b-c,b,!0),s(d.heap,d.padMaxChunkLen)};this.digest=this.digestFromString=this.digestFromBuffer=this.digestFromArrayBuffer=function(a){return l(t(a).buffer)}}b.exports=a;var c={getDataType:function(a){if("string"==typeof a)return"string";if(a instanceof Array)return"array";if("undefined"!=typeof d&&d.Buffer&&d.Buffer.isBuffer(a))return"buffer";if(a instanceof ArrayBuffer)return"arraybuffer";if(a.buffer instanceof ArrayBuffer)return"view";if(a instanceof Blob)return"blob";throw new Error("Unsupported data type.")}};a._core=function(a,b,c){"use asm";function d(a,b){a|=0,b|=0;var c=0,d=0,f=0,g=0,h=0,i=0,j=0,k=0,l=0,m=0,n=0,o=0,p=0,q=0;for(f=e[b+320>>2]|0,h=e[b+324>>2]|0,j=e[b+328>>2]|0,l=e[b+332>>2]|0,n=e[b+336>>2]|0,c=0;(c|0)<(a|0);c=c+64|0){for(g=f,i=h,k=j,m=l,o=n,d=0;(d|0)<64;d=d+4|0)q=e[c+d>>2]|0,p=((f<<5|f>>>27)+(h&j|~h&l)|0)+((q+n|0)+1518500249|0)|0,n=l,l=j,j=h<<30|h>>>2,h=f,f=p,e[a+d>>2]=q;for(d=a+64|0;(d|0)<(a+80|0);d=d+4|0)q=(e[d-12>>2]^e[d-32>>2]^e[d-56>>2]^e[d-64>>2])<<1|(e[d-12>>2]^e[d-32>>2]^e[d-56>>2]^e[d-64>>2])>>>31,p=((f<<5|f>>>27)+(h&j|~h&l)|0)+((q+n|0)+1518500249|0)|0,n=l,l=j,j=h<<30|h>>>2,h=f,f=p,e[d>>2]=q;for(d=a+80|0;(d|0)<(a+160|0);d=d+4|0)q=(e[d-12>>2]^e[d-32>>2]^e[d-56>>2]^e[d-64>>2])<<1|(e[d-12>>2]^e[d-32>>2]^e[d-56>>2]^e[d-64>>2])>>>31,p=((f<<5|f>>>27)+(h^j^l)|0)+((q+n|0)+1859775393|0)|0,n=l,l=j,j=h<<30|h>>>2,h=f,f=p,e[d>>2]=q;for(d=a+160|0;(d|0)<(a+240|0);d=d+4|0)q=(e[d-12>>2]^e[d-32>>2]^e[d-56>>2]^e[d-64>>2])<<1|(e[d-12>>2]^e[d-32>>2]^e[d-56>>2]^e[d-64>>2])>>>31,p=((f<<5|f>>>27)+(h&j|h&l|j&l)|0)+((q+n|0)-1894007588|0)|0,n=l,l=j,j=h<<30|h>>>2,h=f,f=p,e[d>>2]=q;for(d=a+240|0;(d|0)<(a+320|0);d=d+4|0)q=(e[d-12>>2]^e[d-32>>2]^e[d-56>>2]^e[d-64>>2])<<1|(e[d-12>>2]^e[d-32>>2]^e[d-56>>2]^e[d-64>>2])>>>31,p=((f<<5|f>>>27)+(h^j^l)|0)+((q+n|0)-899497514|0)|0,n=l,l=j,j=h<<30|h>>>2,h=f,f=p,e[d>>2]=q;f=f+g|0,h=h+i|0,j=j+k|0,l=l+m|0,n=n+o|0}e[b+320>>2]=f,e[b+324>>2]=h,e[b+328>>2]=j,e[b+332>>2]=l,e[b+336>>2]=n}var e=new a.Int32Array(c);return{hash:d}}}()},{}],31:[function(a,b,c){var d=(a("../../util.js"),7);!function(a){"use strict";function c(a,b){this.highOrder=a,this.lowOrder=b}function e(a,b){var c,d,e,f,g=[],h=[],i=0;if("UTF8"===b)for(d=0;dc?h.push(c):2048>c?(h.push(192|c>>>6),h.push(128|63&c)):55296>c||c>=57344?h.push(224|c>>>12,128|c>>>6&63,128|63&c):(d+=1,c=65536+((1023&c)<<10|1023&a.charCodeAt(d)),h.push(240|c>>>18,128|c>>>12&63,128|c>>>6&63,128|63&c)),e=0;e>>2;g.length<=f;)g.push(0);g[f]|=h[e]<<24-8*(i%4),i+=1}else if("UTF16BE"===b||"UTF16LE"===b)for(d=0;d>8),f=i>>>2;g.length<=f;)g.push(0);g[f]|=c<<16-8*(i%4),i+=2}return{value:g,binLen:8*i}}function f(a){var b,c,d,e=[],f=a.length;if(0!==f%2)throw"String of HEX type must be in byte increments";for(b=0;f>b;b+=2){if(c=parseInt(a.substr(b,2),16),isNaN(c))throw"String of HEX type contains invalid characters";for(d=b>>>3;e.length<=d;)e.push(0);e[b>>>3]|=c<<24-4*(b%8)}return{value:e,binLen:4*f}}function g(a){var b,c,d,e=[];for(c=0;c>>2,e.length<=d&&e.push(0),e[d]|=b<<24-8*(c%4);return{value:e,binLen:8*a.length}}function h(a){var b,c,d,e=[];for(c=0;c>>2,e.length<=d&&e.push(0),e[d]|=b<<24-8*(c%4);return{value:e,binLen:8*a.length}}function i(a){var b,c,d,e,f,g,h,i=[],j=0,k="ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/";if(-1===a.search(/^[a-zA-Z0-9=+\/]+$/))throw"Invalid character in base-64 string";if(g=a.indexOf("="),a=a.replace(/\=/g,""),-1!==g&&gd;d++)c=a[d],0===h?(e+=f.charAt(c>>2&63),b=(3&c)<<4):1==h?(e+=f.charAt(b|c>>4&15),b=(15&c)<<2):2==h&&(e+=f.charAt(b|c>>6&3),g+=1,g%60===0&&(e+="\n"),e+=f.charAt(63&c)),g+=1,g%60===0&&(e+="\n"),h+=1,3==h&&(h=0);return h>0&&(e+=f.charAt(b),g+=1,g%60===0&&(e+="\n"),e+="=",g+=1),1==h&&(g%60===0&&(e+="\n"),e+="="),e}function e(a){var b,c,d=[],e=0,g=0,h=a.length;for(c=0;h>c;c++)b=f.indexOf(a.charAt(c)),b>=0&&(e&&d.push(g|b>>6-e&255),e=e+2&7,g=b<>c,d.count++})}var e={prio:0,algo:q.encryption_cipher};for(var f in b)try{f!==o.symmetric.plaintext&&f!==o.symmetric.idea&&o.read(o.symmetric,f)&&b[f].count===a.length&&b[f].prio>e.prio&&(e=b[f])}catch(g){}return e.algo}var n=a("./packet"),o=a("./enums.js"),p=a("./encoding/armor.js"),q=a("./config"),r=a("./util");d.prototype.packetlist2structure=function(a){for(var b,c,d,e=0;ethis.primaryKey.created.getTime()+24*this.primaryKey.expirationTimeV3*3600*1e3)return o.keyStatus.expired;for(var a=!1,b=0;bthis.primaryKey.created.getTime()+1e3*c.selfCertificate.keyExpirationTime?o.keyStatus.expired:o.keyStatus.valid:o.keyStatus.invalid},d.prototype.getExpirationTime=function(){if(3==this.primaryKey.version)return g(this.primaryKey);if(4==this.primaryKey.version){var a=this.getPrimaryUser();return a?g(this.primaryKey,a.selfCertificate):null}},d.prototype.getPrimaryUser=function(){for(var a=[],b=0;bb.selfCertificate.isPrimaryUserID?-1:a.selfCertificate.isPrimaryUserIDb.selfCertificate.created?-1:a.selfCertificate.createdb?-1:b>a?1:0}),c=0;cthis.subKey.created.getTime()+24*this.subKey.expirationTimeV3*3600*1e3?o.keyStatus.expired:this.bindingSignature?this.bindingSignature.isExpired()?o.keyStatus.expired:this.bindingSignature.verified||this.bindingSignature.verify(a,{key:a,bind:this.subKey})?4==this.subKey.version&&this.bindingSignature.keyNeverExpires===!1&&Date.now()>this.subKey.created.getTime()+1e3*this.bindingSignature.keyExpirationTime?o.keyStatus.expired:o.keyStatus.valid:o.keyStatus.invalid:o.keyStatus.invalid},j.prototype.getExpirationTime=function(){return g(this.subKey,this.bindingSignature)},j.prototype.update=function(a,b){if(a.verify(b)!==o.keyStatus.invalid){if(this.subKey.getFingerprint()!==a.subKey.getFingerprint())throw new Error("SubKey update method: fingerprints of subkeys not equal");this.subKey.tag===o.packet.publicSubkey&&a.subKey.tag===o.packet.secretSubkey&&(this.subKey=a.subKey),!this.bindingSignature&&a.bindingSignature&&(a.bindingSignature.verified||a.bindingSignature.verify(b,{key:b,bind:this.subKey}))&&(this.bindingSignature=a.bindingSignature),this.revocationSignature||!a.revocationSignature||a.revocationSignature.isExpired()||!a.revocationSignature.verified&&!a.revocationSignature.verify(b,{key:b,bind:this.subKey})||(this.revocationSignature=a.revocationSignature)}},c.Key=d,c.readArmored=k,c.generate=l,c.getPreferredSymAlgo=m},{"./config":17,"./encoding/armor.js":41,"./enums.js":43,"./packet":53,"./util":74}],46:[function(a,b,c){b.exports=a("./keyring.js"),b.exports.localstore=a("./localstore.js")},{"./keyring.js":47,"./localstore.js":48}],47:[function(a,b,c){function d(b){this.storeHandler=b||new(a("./localstore.js")),this.publicKeys=new e(this.storeHandler.loadPublic()),this.privateKeys=new e(this.storeHandler.loadPrivate())}function e(a){this.keys=a}function f(a,b){for(var c=new RegExp("<"+a.toLowerCase()+">"),d=b.getUserIds(),e=0;e>>9<<4)+15,M=16,N=1,X=Number,O=G,P=H,Q=I,R=C,S=E,T=y,U=A,W=w,V=u,p="SHA-224"===e?da:ea;else{if("SHA-384"!==e&&"SHA-512"!==e||!(4&d))throw"Unexpected error in SHA-2 implementation";q=80,r=(b+128>>>10<<5)+31,M=32,N=2,X=c,O=J,P=K,Q=L,R=D,S=F,T=z,U=B,W=x,V=v,ca=[new X(ca[0],3609767458),new X(ca[1],602891725),new X(ca[2],3964484399),new X(ca[3],2173295548),new X(ca[4],4081628472),new X(ca[5],3053834265),new X(ca[6],2937671579),new X(ca[7],3664609560),new X(ca[8],2734883394),new X(ca[9],1164996542),new X(ca[10],1323610764),new X(ca[11],3590304994),new X(ca[12],4068182383),new X(ca[13],991336113),new X(ca[14],633803317),new X(ca[15],3479774868),new X(ca[16],2666613458),new X(ca[17],944711139),new X(ca[18],2341262773),new X(ca[19],2007800933),new X(ca[20],1495990901),new X(ca[21],1856431235),new X(ca[22],3175218132),new X(ca[23],2198950837),new X(ca[24],3999719339),new X(ca[25],766784016),new X(ca[26],2566594879),new X(ca[27],3203337956),new X(ca[28],1034457026),new X(ca[29],2466948901),new X(ca[30],3758326383),new X(ca[31],168717936),new X(ca[32],1188179964),new X(ca[33],1546045734),new X(ca[34],1522805485),new X(ca[35],2643833823),new X(ca[36],2343527390),new X(ca[37],1014477480),new X(ca[38],1206759142),new X(ca[39],344077627),new X(ca[40],1290863460),new X(ca[41],3158454273),new X(ca[42],3505952657),new X(ca[43],106217008),new X(ca[44],3606008344),new X(ca[45],1432725776),new X(ca[46],1467031594),new X(ca[47],851169720),new X(ca[48],3100823752),new X(ca[49],1363258195),new X(ca[50],3750685593),new X(ca[51],3785050280),new X(ca[52],3318307427),new X(ca[53],3812723403),new X(ca[54],2003034995),new X(ca[55],3602036899),new X(ca[56],1575990012),new X(ca[57],1125592928),new X(ca[58],2716904306),new X(ca[59],442776044),new X(ca[60],593698344),new X(ca[61],3733110249),new X(ca[62],2999351573),new X(ca[63],3815920427),new X(3391569614,3928383900),new X(3515267271,566280711),new X(3940187606,3454069534),new X(4118630271,4000239992),new X(116418474,1914138554),new X(174292421,2731055270),new X(289380356,3203993006),new X(460393269,320620315),new X(685471733,587496836),new X(852142971,1086792851),new X(1017036298,365543100),new X(1126000580,2618297676),new X(1288033470,3409855158),new X(1501505948,4234509866),new X(1607167915,987167468),new X(1816402316,1246189591)],p="SHA-384"===e?[new X(3418070365,da[0]),new X(1654270250,da[1]),new X(2438529370,da[2]),new X(355462360,da[3]),new X(1731405415,da[4]),new X(41048885895,da[5]),new X(3675008525,da[6]),new X(1203062813,da[7])]:[new X(ea[0],4089235720),new X(ea[1],2227873595),new X(ea[2],4271175723),new X(ea[3],1595750129),new X(ea[4],2917565137),new X(ea[5],725511199),new X(ea[6],4215389547),new X(ea[7],327033209)]}for(;a.length<=r;)a.push(0);for(a[b>>>5]|=128<<24-b%32,a[r]=b,_=a.length,s=0;_>s;s+=M){for(f=p[0],g=p[1],h=p[2],i=p[3],j=p[4],k=p[5],l=p[6],m=p[7],t=0;q>t;t+=1)16>t?($=t*N+s,Y=a.length<=$?0:a[$],Z=a.length<=$+1?0:a[$+1],ba[t]=new X(Y,Z)):ba[t]=P(S(ba[t-2]),ba[t-7],R(ba[t-15]),ba[t-16]),n=Q(m,U(j),V(j,k,l),ca[t],ba[t]),o=O(T(f),W(f,g,h)),m=l,l=k,k=j,j=O(i,n),i=h,h=g,g=f,f=O(n,o);p[0]=O(f,p[0]),p[1]=O(g,p[1]),p[2]=O(h,p[2]),p[3]=O(i,p[3]),p[4]=O(j,p[4]),p[5]=O(k,p[5]),p[6]=O(l,p[6]),p[7]=O(m,p[7])}if("SHA-224"===e&&2&d)aa=[p[0],p[1],p[2],p[3],p[4],p[5],p[6]];else if("SHA-256"===e&&2&d)aa=p;else if("SHA-384"===e&&4&d)aa=[p[0].highOrder,p[0].lowOrder,p[1].highOrder,p[1].lowOrder,p[2].highOrder,p[2].lowOrder,p[3].highOrder,p[3].lowOrder,p[4].highOrder,p[4].lowOrder,p[5].highOrder,p[5].lowOrder];else{if(!("SHA-512"===e&&4&d))throw"Unexpected error in SHA-2 implementation";aa=[p[0].highOrder,p[0].lowOrder,p[1].highOrder,p[1].lowOrder,p[2].highOrder,p[2].lowOrder,p[3].highOrder,p[3].lowOrder,p[4].highOrder,p[4].lowOrder,p[5].highOrder,p[5].lowOrder,p[6].highOrder,p[6].lowOrder,p[7].highOrder,p[7].lowOrder]}return aa}var O=function(a,b,c){var o=0,p=[0],q="",r=null;if(q=c||"UTF8","UTF8"!==q&&"UTF16BE"!==q&&"UTF16LE"!==q)throw"encoding must be UTF8, UTF16BE, or UTF16LE";if("HEX"===b){if(0!==a.length%2)throw"srcString of HEX type must be in byte increments";r=f(a),o=r.binLen,p=r.value}else if("TEXT"===b||"ASCII"===b)r=e(a,q),o=r.binLen,p=r.value;else if("B64"===b)r=i(a),o=r.binLen,p=r.value;else if("BYTES"===b)r=g(a),o=r.binLen,p=r.value;else{if("TYPED"!==b)throw"inputFormat must be HEX, TEXT, ASCII, B64, BYTES, or TYPED";r=h(a),o=r.binLen,p=r.value}this.getHash=function(a,b,c,e){var f,g=null,h=p.slice(),i=o;if(3===arguments.length?"number"!=typeof c&&(e=c,c=1):2===arguments.length&&(c=1),c!==parseInt(c,10)||1>c)throw"numRounds must a integer >= 1";switch(b){case"HEX":g=j;break;case"B64":g=k;break;case"BYTES":g=l;break;case"TYPED":g=m;break;default:throw"format must be HEX, B64, or BYTES"}if("SHA-1"===a&&1&d)for(f=0;c>f;f+=1)h=M(h,i),i=160;else if("SHA-224"===a&&2&d)for(f=0;c>f;f+=1)h=N(h,i,a),i=224;else if("SHA-256"===a&&2&d)for(f=0;c>f;f+=1)h=N(h,i,a),i=256;else if("SHA-384"===a&&4&d)for(f=0;c>f;f+=1)h=N(h,i,a),i=384;else{if(!("SHA-512"===a&&4&d))throw"Chosen SHA variant is not supported";for(f=0;c>f;f+=1)h=N(h,i,a),i=512}return g(h,n(e))},this.getHMAC=function(a,b,c,h,m){var r,s,t,u,v,w,x,y,z,A=[],B=[],C=null;switch(h){case"HEX":r=j;break;case"B64":r=k;break;case"BYTES":r=l;break;default:throw"outputFormat must be HEX, B64, or BYTES"}if("SHA-1"===c&&1&d)t=64,z=160;else if("SHA-224"===c&&2&d)t=64,z=224;else if("SHA-256"===c&&2&d)t=64,z=256;else if("SHA-384"===c&&4&d)t=128,z=384;else{if(!("SHA-512"===c&&4&d))throw"Chosen SHA variant is not supported";t=128,z=512}if("HEX"===b)C=f(a),y=C.binLen,s=C.value;else if("TEXT"===b||"ASCII"===b)C=e(a,q),y=C.binLen,s=C.value;else if("B64"===b)C=i(a),y=C.binLen,s=C.value;else{if("BYTES"!==b)throw"inputFormat must be HEX, TEXT, ASCII, B64, or BYTES";C=g(a),y=C.binLen,s=C.value}if(u=8*t,x=t/4-1,y/8>t){if("SHA-1"===c&&1&d)s=M(s,y);else{if(!(6&d))throw"Unexpected error in HMAC implementation";s=N(s,y,c)}for(;s.length<=x;)s.push(0);s[x]&=4294967040}else if(t>y/8){for(;s.length<=x;)s.push(0);s[x]&=4294967040}for(v=0;x>=v;v+=1)A[v]=909522486^s[v],B[v]=1549556828^s[v];if("SHA-1"===c&&1&d)w=M(B.concat(M(A.concat(p),u+o)),u+z);else{if(!(6&d))throw"Unexpected error in HMAC implementation";w=N(B.concat(N(A.concat(p),u+o,c)),u+z,c)}return r(w,n(m))}};b.exports={sha1:function(a){var b=new O(a,"TYPED","UTF8");return b.getHash("SHA-1","TYPED")},sha224:function(a){var b=new O(a,"TYPED","UTF8");return b.getHash("SHA-224","TYPED")},sha256:function(a){var b=new O(a,"TYPED","UTF8");return b.getHash("SHA-256","TYPED")},sha384:function(a){var b=new O(a,"TYPED","UTF8");return b.getHash("SHA-384","TYPED")},sha512:function(a){var b=new O(a,"TYPED","UTF8");return b.getHash("SHA-512","TYPED")}}}(this)},{"../../util.js":74}],32:[function(a,b,c){a("./asmcrypto.js"),b.exports={cipher:a("./cipher"),hash:a("./hash"),cfb:a("./cfb.js"),publicKey:a("./public_key"),signature:a("./signature.js"),random:a("./random.js"),pkcs1:a("./pkcs1.js")};var d=a("./crypto.js");for(var e in d)b.exports[e]=d[e]},{"./asmcrypto.js":18,"./cfb.js":19,"./cipher":24,"./crypto.js":26,"./hash":27,"./pkcs1.js":33,"./public_key":36,"./random.js":39,"./signature.js":40}],33:[function(a,b,c){function d(a){for(var b,c="";c.lengthb-11)throw new Error("Message too long");var e=d(b-c-3),f=String.fromCharCode(0)+String.fromCharCode(2)+e+String.fromCharCode(0)+a;return f},decode:function(a){0!==a.charCodeAt(0)&&(a=String.fromCharCode(0)+a);for(var b=a.charCodeAt(0),c=a.charCodeAt(1),d=2;0!==a.charCodeAt(d)&&d=8&&0===f)return a.substr(d);throw new Error("Decryption error")}},emsa:{encode:function(a,b,c){var d,f=g.Uint8Array2str(i.digest(a,g.str2Uint8Array(b)));if(f.length!==i.getHashByteLength(a))throw new Error("Invalid hash length");var j="";for(d=0;dc)throw new Error("Intended encoded message length too short");var l="";for(d=0;c-k-3>d;d++)l+=String.fromCharCode(255);var m=String.fromCharCode(0)+String.fromCharCode(1)+l+String.fromCharCode(0)+j;return new h(g.hexstrdump(m),16)}}}},{"../util.js":74,"./crypto.js":26,"./hash":27,"./public_key/jsbn.js":37,"./random.js":39}],34:[function(a,b,c){function d(){function a(a,b,c,d,i,j){for(var k,l,m,n=h.getLeftNBits(h.Uint8Array2str(g.digest(a,h.str2Uint8Array(b))),i.bitLength()),o=new e(h.hexstrdump(n),16);;)if(k=f.getRandomBigIntegerInRange(e.ONE,i.subtract(e.ONE)),l=c.modPow(k,d).mod(i),m=k.modInverse(i).multiply(o.add(j.multiply(l))).mod(i),0!=l&&0!=m)break;var p=[];return p[0]=l.toMPI(),p[1]=m.toMPI(),p}function b(a){var b=i.prefer_hash_algorithm;switch(Math.round(a.bitLength()/8)){case 20:return 2!=b&&b>11&&10!=b&&8>b?2:b;case 28:return b>11&&8>b?11:b;case 32:return b>10&&8>b?8:b;default:return h.print_debug("DSA select hash algorithm: returning null for an unknown length of q"),null}}function c(a,b,c,d,f,i,j,k){var l=h.getLeftNBits(h.Uint8Array2str(g.digest(a,h.str2Uint8Array(d))),i.bitLength()),m=new e(h.hexstrdump(l),16);if(e.ZERO.compareTo(b)>=0||b.compareTo(i)>=0||e.ZERO.compareTo(c)>=0||c.compareTo(i)>=0)return h.print_debug("invalid DSA Signature"),null;var n=c.modInverse(i);if(0==e.ZERO.compareTo(n))return h.print_debug("invalid DSA Signature"),null;var o=m.multiply(n).mod(i),p=b.multiply(n).mod(i);return j.modPow(o,f).multiply(k.modPow(p,f)).mod(f).mod(i)}this.select_hash_algorithm=b,this.sign=a,this.verify=c}var e=a("./jsbn.js"),f=a("../random.js"),g=a("../hash"),h=a("../../util.js"),i=a("../../config");b.exports=d},{"../../config":17,"../../util.js":74,"../hash":27,"../random.js":39,"./jsbn.js":37}],35:[function(a,b,c){function d(){function a(a,b,c,d){var g=c.subtract(e.TWO),h=f.getRandomBigIntegerInRange(e.ONE,g);h=h.mod(g).add(e.ONE);var i=[];return i[0]=b.modPow(h,c),i[1]=d.modPow(h,c).multiply(a).mod(c),i}function b(a,b,c,d){return g.print_debug("Elgamal Decrypt:\nc1:"+g.hexstrdump(a.toMPI())+"\nc2:"+g.hexstrdump(b.toMPI())+"\np:"+g.hexstrdump(c.toMPI())+"\nx:"+g.hexstrdump(d.toMPI())),a.modPow(d,c).modInverse(c).multiply(b).mod(c)}this.encrypt=a,this.decrypt=b}var e=a("./jsbn.js"),f=a("../random.js"),g=a("../../util.js");b.exports=d},{"../../util.js":74,"../random.js":39,"./jsbn.js":37}],36:[function(a,b,c){b.exports={rsa:a("./rsa.js"),elgamal:a("./elgamal.js"),dsa:a("./dsa.js")}},{"./dsa.js":34,"./elgamal.js":35,"./rsa.js":38}],37:[function(a,b,c){function d(a,b,c){null!=a&&("number"==typeof a?this.fromNumber(a,b,c):null==b&&"string"!=typeof a?this.fromString(a,256):this.fromString(a,b))}function e(){return new d(null)}function f(a,b,c,d,e,f){for(;--f>=0;){var g=b*this[a++]+c[d]+e;e=Math.floor(g/67108864),c[d++]=67108863&g}return e}function g(a){return fb.charAt(a)}function h(a,b){var c=gb[a.charCodeAt(b)];return null==c?-1:c}function i(a){for(var b=this.t-1;b>=0;--b)a[b]=this[b];a.t=this.t,a.s=this.s}function j(a){this.t=1,this.s=0>a?-1:0,a>0?this[0]=a:-1>a?this[0]=a+this.DV:this.t=0}function k(a){var b=e();return b.fromInt(a),b}function l(a,b){var c;if(16==b)c=4;else if(8==b)c=3;else if(256==b)c=8;else if(2==b)c=1;else if(32==b)c=5;else{if(4!=b)return void this.fromRadix(a,b);c=2}this.t=0,this.s=0;for(var e=a.length,f=!1,g=0;--e>=0;){var i=8==c?255&a[e]:h(a,e);0>i?"-"==a.charAt(e)&&(f=!0):(f=!1,0==g?this[this.t++]=i:g+c>this.DB?(this[this.t-1]|=(i&(1<>this.DB-g):this[this.t-1]|=i<=this.DB&&(g-=this.DB))}8==c&&0!=(128&a[0])&&(this.s=-1,g>0&&(this[this.t-1]|=(1<0&&this[this.t-1]==a;)--this.t}function n(a){if(this.s<0)return"-"+this.negate().toString(a);var b;if(16==a)b=4;else if(8==a)b=3;else if(2==a)b=1;else if(32==a)b=5;else{if(4!=a)return this.toRadix(a);b=2}var c,d=(1<0)for(i>i)>0&&(e=!0,f=g(c));h>=0;)b>i?(c=(this[h]&(1<>(i+=this.DB-b)):(c=this[h]>>(i-=b)&d,0>=i&&(i+=this.DB,--h)),c>0&&(e=!0),e&&(f+=g(c));return e?f:"0"}function o(){var a=e();return d.ZERO.subTo(this,a),a}function p(){return this.s<0?this.negate():this}function q(a){var b=this.s-a.s;if(0!=b)return b;var c=this.t;if(b=c-a.t,0!=b)return this.s<0?-b:b;for(;--c>=0;)if(0!=(b=this[c]-a[c]))return b;return 0}function r(a){var b,c=1;return 0!=(b=a>>>16)&&(a=b,c+=16),0!=(b=a>>8)&&(a=b,c+=8),0!=(b=a>>4)&&(a=b,c+=4),0!=(b=a>>2)&&(a=b,c+=2),0!=(b=a>>1)&&(a=b,c+=1),c}function s(){return this.t<=0?0:this.DB*(this.t-1)+r(this[this.t-1]^this.s&this.DM)}function t(a,b){var c;for(c=this.t-1;c>=0;--c)b[c+a]=this[c];for(c=a-1;c>=0;--c)b[c]=0;b.t=this.t+a,b.s=this.s}function u(a,b){for(var c=a;c=0;--c)b[c+g+1]=this[c]>>e|h,h=(this[c]&f)<=0;--c)b[c]=0;b[g]=h,b.t=this.t+g+1,b.s=this.s,b.clamp()}function w(a,b){b.s=this.s;var c=Math.floor(a/this.DB);if(c>=this.t)return void(b.t=0);var d=a%this.DB,e=this.DB-d,f=(1<>d;for(var g=c+1;g>d;d>0&&(b[this.t-c-1]|=(this.s&f)<c;)d+=this[c]-a[c],b[c++]=d&this.DM,d>>=this.DB;if(a.t>=this.DB;d+=this.s}else{for(d+=this.s;c>=this.DB;d-=a.s}b.s=0>d?-1:0,-1>d?b[c++]=this.DV+d:d>0&&(b[c++]=d),b.t=c,b.clamp()}function y(a,b){var c=this.abs(),e=a.abs(),f=c.t;for(b.t=f+e.t;--f>=0;)b[f]=0;for(f=0;f=0;)a[c]=0;for(c=0;c=b.DV&&(a[c+b.t]-=b.DV,a[c+b.t+1]=1)}a.t>0&&(a[a.t-1]+=b.am(c,b[c],a,2*c,0,1)),a.s=0,a.clamp()}function A(a,b,c){var f=a.abs();if(!(f.t<=0)){var g=this.abs();if(g.t0?(f.lShiftTo(k,h),g.lShiftTo(k,c)):(f.copyTo(h),g.copyTo(c));var l=h.t,m=h[l-1];if(0!=m){var n=m*(1<1?h[l-2]>>this.F2:0),o=this.FV/n,p=(1<=0&&(c[c.t++]=1,c.subTo(u,c)),d.ONE.dlShiftTo(l,u),u.subTo(h,h);h.t=0;){var v=c[--s]==m?this.DM:Math.floor(c[s]*o+(c[s-1]+q)*p);if((c[s]+=h.am(0,v,c,t,0,l))0&&c.rShiftTo(k,c),0>i&&d.ZERO.subTo(c,c)}}}function B(a){var b=e();return this.abs().divRemTo(a,null,b),this.s<0&&b.compareTo(d.ZERO)>0&&a.subTo(b,b),b}function C(a){this.m=a}function D(a){return a.s<0||a.compareTo(this.m)>=0?a.mod(this.m):a}function E(a){return a}function F(a){a.divRemTo(this.m,null,a)}function G(a,b,c){a.multiplyTo(b,c),this.reduce(c)}function H(a,b){a.squareTo(b),this.reduce(b)}function I(){if(this.t<1)return 0;var a=this[0];if(0==(1&a))return 0;var b=3&a;return b=b*(2-(15&a)*b)&15,b=b*(2-(255&a)*b)&255,b=b*(2-((65535&a)*b&65535))&65535,b=b*(2-a*b%this.DV)%this.DV,b>0?this.DV-b:-b}function J(a){this.m=a,this.mp=a.invDigit(),this.mpl=32767&this.mp,this.mph=this.mp>>15,this.um=(1<0&&this.m.subTo(b,b),b}function L(a){var b=e();return a.copyTo(b),this.reduce(b),b}function M(a){for(;a.t<=this.mt2;)a[a.t++]=0;for(var b=0;b>15)*this.mpl&this.um)<<15)&a.DM;for(c=b+this.m.t,a[c]+=this.m.am(0,d,a,b,0,this.m.t);a[c]>=a.DV;)a[c]-=a.DV,a[++c]++}a.clamp(),a.drShiftTo(this.m.t,a),a.compareTo(this.m)>=0&&a.subTo(this.m,a)}function N(a,b){a.squareTo(b),this.reduce(b)}function O(a,b,c){a.multiplyTo(b,c),this.reduce(c)}function P(){return 0==(this.t>0?1&this[0]:this.s)}function Q(a,b){if(a>4294967295||1>a)return d.ONE;var c=e(),f=e(),g=b.convert(this),h=r(a)-1;for(g.copyTo(c);--h>=0;)if(b.sqrTo(c,f),(a&1<0)b.mulTo(f,g,c);else{var i=c;c=f,f=i}return b.revert(c)}function R(a,b){var c;return c=256>a||b.isEven()?new C(b):new J(b),this.exp(a,c)}function S(){var a=e();return this.copyTo(a),a}function T(){if(this.s<0){if(1==this.t)return this[0]-this.DV;if(0==this.t)return-1}else{if(1==this.t)return this[0];if(0==this.t)return 0}return(this[1]&(1<<32-this.DB)-1)<>24}function V(){return 0==this.t?this.s:this[0]<<16>>16}function W(a){return Math.floor(Math.LN2*this.DB/Math.log(a))}function X(){return this.s<0?-1:this.t<=0||1==this.t&&this[0]<=0?0:1}function Y(a){if(null==a&&(a=10),0==this.signum()||2>a||a>36)return"0";var b=this.chunkSize(a),c=Math.pow(a,b),d=k(c),f=e(),g=e(),h="";for(this.divRemTo(d,f,g);f.signum()>0;)h=(c+g.intValue()).toString(a).substr(1)+h,f.divRemTo(d,f,g);return g.intValue().toString(a)+h}function Z(a,b){this.fromInt(0),null==b&&(b=10);for(var c=this.chunkSize(b),e=Math.pow(b,c),f=!1,g=0,i=0,j=0;jk?"-"==a.charAt(j)&&0==this.signum()&&(f=!0):(i=b*i+k,++g>=c&&(this.dMultiply(e),this.dAddOffset(i,0),g=0,i=0))}g>0&&(this.dMultiply(Math.pow(b,g)),this.dAddOffset(i,0)),f&&d.ZERO.subTo(this,this)}function $(a,b,c){if("number"==typeof b)if(2>a)this.fromInt(1);else for(this.fromNumber(a,c),this.testBit(a-1)||this.bitwiseTo(d.ONE.shiftLeft(a-1),ga,this),this.isEven()&&this.dAddOffset(1,0);!this.isProbablePrime(b);)this.dAddOffset(2,0),this.bitLength()>a&&this.subTo(d.ONE.shiftLeft(a-1),this);else{var e=new Array,f=7&a;e.length=(a>>3)+1,b.nextBytes(e),f>0?e[0]&=(1<0)for(d>d)!=(this.s&this.DM)>>d&&(b[e++]=c|this.s<=0;)8>d?(c=(this[a]&(1<>(d+=this.DB-8)):(c=this[a]>>(d-=8)&255,0>=d&&(d+=this.DB,--a)),(e>0||c!=this.s)&&(b[e++]=c);return b}function aa(a){return 0==this.compareTo(a)}function ba(a){return this.compareTo(a)<0?this:a}function ca(a){return this.compareTo(a)>0?this:a}function da(a,b,c){var d,e,f=Math.min(a.t,this.t);for(d=0;f>d;++d)c[d]=b(this[d],a[d]);if(a.ta?this.rShiftTo(-a,b):this.lShiftTo(a,b),b}function oa(a){var b=e();return 0>a?this.lShiftTo(-a,b):this.rShiftTo(a,b),b}function pa(a){if(0==a)return-1;var b=0;return 0==(65535&a)&&(a>>=16,b+=16),0==(255&a)&&(a>>=8,b+=8),0==(15&a)&&(a>>=4,b+=4),0==(3&a)&&(a>>=2,b+=2),0==(1&a)&&++b,b}function qa(){for(var a=0;a=this.t?0!=this.s:0!=(this[b]&1<c;)d+=this[c]+a[c],b[c++]=d&this.DM,d>>=this.DB;if(a.t>=this.DB;d+=this.s}else{for(d+=this.s;c>=this.DB;d+=a.s}b.s=0>d?-1:0,d>0?b[c++]=d:-1>d&&(b[c++]=this.DV+d),b.t=c,b.clamp()}function za(a){var b=e();return this.addTo(a,b),b}function Aa(a){var b=e();return this.subTo(a,b),b}function Ba(a){var b=e();return this.multiplyTo(a,b),b}function Ca(){var a=e();return this.squareTo(a),a}function Da(a){var b=e();return this.divRemTo(a,b,null),b}function Ea(a){var b=e();return this.divRemTo(a,null,b),b}function Fa(a){var b=e(),c=e();return this.divRemTo(a,b,c),new Array(b,c)}function Ga(a){this[this.t]=this.am(0,a-1,this,0,0,this.t),++this.t,this.clamp()}function Ha(a,b){if(0!=a){for(;this.t<=b;)this[this.t++]=0;for(this[b]+=a;this[b]>=this.DV;)this[b]-=this.DV,++b>=this.t&&(this[this.t++]=0),++this[b]}}function Ia(){}function Ja(a){return a}function Ka(a,b,c){a.multiplyTo(b,c)}function La(a,b){a.squareTo(b)}function Ma(a){return this.exp(a,new Ia)}function Na(a,b,c){var d=Math.min(this.t+a.t,b);for(c.s=0,c.t=d;d>0;)c[--d]=0;var e;for(e=c.t-this.t;e>d;++d)c[d+this.t]=this.am(0,a[d],c,d,0,this.t);for(e=Math.min(a.t,b);e>d;++d)this.am(0,a[d],c,d,0,b-d);c.clamp()}function Oa(a,b,c){--b;var d=c.t=this.t+a.t-b;for(c.s=0;--d>=0;)c[d]=0;for(d=Math.max(b-this.t,0);d2*this.m.t)return a.mod(this.m);if(a.compareTo(this.m)<0)return a;var b=e();return a.copyTo(b),this.reduce(b),b}function Ra(a){return a}function Sa(a){for(a.drShiftTo(this.m.t-1,this.r2),a.t>this.m.t+1&&(a.t=this.m.t+1,a.clamp()),this.mu.multiplyUpperTo(this.r2,this.m.t+1,this.q3),this.m.multiplyLowerTo(this.q3,this.m.t+1,this.r2);a.compareTo(this.r2)<0;)a.dAddOffset(1,this.m.t+1);for(a.subTo(this.r2,a);a.compareTo(this.m)>=0;)a.subTo(this.m,a)}function Ta(a,b){a.squareTo(b),this.reduce(b)}function Ua(a,b,c){a.multiplyTo(b,c),this.reduce(c)}function Va(a,b){var c,d,f=a.bitLength(),g=k(1);if(0>=f)return g;c=18>f?1:48>f?3:144>f?4:768>f?5:6,d=8>f?new C(b):b.isEven()?new Pa(b):new J(b);var h=new Array,i=3,j=c-1,l=(1<1){var m=e();for(d.sqrTo(h[1],m);l>=i;)h[i]=e(),d.mulTo(m,h[i-2],h[i]),i+=2}var n,o,p=a.t-1,q=!0,s=e();for(f=r(a[p])-1;p>=0;){for(f>=j?n=a[p]>>f-j&l:(n=(a[p]&(1<0&&(n|=a[p-1]>>this.DB+f-j)),i=c;0==(1&n);)n>>=1,--i;if((f-=i)<0&&(f+=this.DB,--p),q)h[n].copyTo(g),q=!1;else{for(;i>1;)d.sqrTo(g,s),d.sqrTo(s,g),i-=2;i>0?d.sqrTo(g,s):(o=g,g=s,s=o),d.mulTo(s,h[n],g)}for(;p>=0&&0==(a[p]&1<f)return b;for(f>e&&(f=e),f>0&&(b.rShiftTo(f,b),c.rShiftTo(f,c));b.signum()>0;)(e=b.getLowestSetBit())>0&&b.rShiftTo(e,b),(e=c.getLowestSetBit())>0&&c.rShiftTo(e,c),b.compareTo(c)>=0?(b.subTo(c,b),b.rShiftTo(1,b)):(c.subTo(b,c),c.rShiftTo(1,c));return f>0&&c.lShiftTo(f,c),c}function Xa(a){if(0>=a)return 0;var b=this.DV%a,c=this.s<0?a-1:0;if(this.t>0)if(0==b)c=this[0]%a;else for(var d=this.t-1;d>=0;--d)c=(b*c+this[d])%a;return c}function Ya(a){var b=a.isEven();if(this.isEven()&&b||0==a.signum())return d.ZERO;for(var c=a.clone(),e=this.clone(),f=k(1),g=k(0),h=k(0),i=k(1);0!=c.signum();){for(;c.isEven();)c.rShiftTo(1,c),b?(f.isEven()&&g.isEven()||(f.addTo(this,f),g.subTo(a,g)),f.rShiftTo(1,f)):g.isEven()||g.subTo(a,g),g.rShiftTo(1,g);for(;e.isEven();)e.rShiftTo(1,e),b?(h.isEven()&&i.isEven()||(h.addTo(this,h),i.subTo(a,i)),h.rShiftTo(1,h)):i.isEven()||i.subTo(a,i),i.rShiftTo(1,i);c.compareTo(e)>=0?(c.subTo(e,c),b&&f.subTo(h,f),g.subTo(i,g)):(e.subTo(c,e),b&&h.subTo(f,h),i.subTo(g,i))}return 0!=e.compareTo(d.ONE)?d.ZERO:i.compareTo(a)>=0?i.subtract(a):i.signum()<0?(i.addTo(a,i),i.signum()<0?i.add(a):i):i}function Za(a){var b,c=this.abs();if(1==c.t&&c[0]<=hb[hb.length-1]){for(b=0;bd;)d*=hb[e++];for(d=c.modInt(d);e>b;)if(d%hb[b++]==0)return!1}return c.millerRabin(a)}function r(a){var b,c=1;return 0!=(b=a>>>16)&&(a=b,c+=16),0!=(b=a>>8)&&(a=b,c+=8),0!=(b=a>>4)&&(a=b,c+=4),0!=(b=a>>2)&&(a=b,c+=2),0!=(b=a>>1)&&(a=b,c+=1),c}function $a(){var a=this.toByteArray(),b=8*(a.length-1)+r(a[0]),c="";return c+=String.fromCharCode((65280&b)>>8),c+=String.fromCharCode(255&b),c+=bb.bin2str(a)}function _a(a){var b=this.subtract(d.ONE),c=b.getLowestSetBit();if(0>=c)return!1;var f=b.shiftRight(c);a=a+1>>1,a>hb.length&&(a=hb.length);for(var g,h=e(),i=[],j=0;a>j;++j){for(;g=hb[Math.floor(Math.random()*hb.length)],-1!=i.indexOf(g););i.push(g),h.fromInt(g);var k=h.modPow(f,this);if(0!=k.compareTo(d.ONE)&&0!=k.compareTo(b)){for(var g=1;g++=eb;++eb)gb[db++]=eb;for(db="a".charCodeAt(0),eb=10;36>eb;++eb)gb[db++]=eb;for(db="A".charCodeAt(0),eb=10;36>eb;++eb)gb[db++]=eb;C.prototype.convert=D,C.prototype.revert=E,C.prototype.reduce=F,C.prototype.mulTo=G,C.prototype.sqrTo=H,J.prototype.convert=K,J.prototype.revert=L,J.prototype.reduce=M,J.prototype.mulTo=O,J.prototype.sqrTo=N,d.prototype.copyTo=i,d.prototype.fromInt=j,d.prototype.fromString=l,d.prototype.clamp=m,d.prototype.dlShiftTo=t,d.prototype.drShiftTo=u,d.prototype.lShiftTo=v,d.prototype.rShiftTo=w,d.prototype.subTo=x,d.prototype.multiplyTo=y,d.prototype.squareTo=z,d.prototype.divRemTo=A,d.prototype.invDigit=I,d.prototype.isEven=P,d.prototype.exp=Q,d.prototype.toString=n,d.prototype.negate=o,d.prototype.abs=p,d.prototype.compareTo=q,d.prototype.bitLength=s,d.prototype.mod=B,d.prototype.modPowInt=R,d.ZERO=k(0),d.ONE=k(1),d.TWO=k(2),b.exports=d,Ia.prototype.convert=Ja,Ia.prototype.revert=Ja,Ia.prototype.mulTo=Ka,Ia.prototype.sqrTo=La,Pa.prototype.convert=Qa,Pa.prototype.revert=Ra,Pa.prototype.reduce=Sa,Pa.prototype.mulTo=Ua,Pa.prototype.sqrTo=Ta;var hb=[2,3,5,7,11,13,17,19,23,29,31,37,41,43,47,53,59,61,67,71,73,79,83,89,97,101,103,107,109,113,127,131,137,139,149,151,157,163,167,173,179,181,191,193,197,199,211,223,227,229,233,239,241,251,257,263,269,271,277,281,283,293,307,311,313,317,331,337,347,349,353,359,367,373,379,383,389,397,401,409,419,421,431,433,439,443,449,457,461,463,467,479,487,491,499,503,509,521,523,541,547,557,563,569,571,577,587,593,599,601,607,613,617,619,631,641,643,647,653,659,661,673,677,683,691,701,709,719,727,733,739,743,751,757,761,769,773,787,797,809,811,821,823,827,829,839,853,857,859,863,877,881,883,887,907,911,919,929,937,941,947,953,967,971,977,983,991,997],ib=(1<<26)/hb[hb.length-1],d=a("./jsbn.js");d.prototype.chunkSize=W,d.prototype.toRadix=Y,d.prototype.fromRadix=Z,d.prototype.fromNumber=$,d.prototype.bitwiseTo=da,d.prototype.changeBit=ua,d.prototype.addTo=ya,d.prototype.dMultiply=Ga,d.prototype.dAddOffset=Ha,d.prototype.multiplyLowerTo=Na,d.prototype.multiplyUpperTo=Oa,d.prototype.modInt=Xa,d.prototype.millerRabin=_a,d.prototype.clone=S,d.prototype.intValue=T,d.prototype.byteValue=U,d.prototype.shortValue=V,d.prototype.signum=X,d.prototype.toByteArray=_,d.prototype.equals=aa,d.prototype.min=ba,d.prototype.max=ca,d.prototype.and=fa,d.prototype.or=ha,d.prototype.xor=ja,d.prototype.andNot=la,d.prototype.not=ma,d.prototype.shiftLeft=na,d.prototype.shiftRight=oa,d.prototype.getLowestSetBit=qa,d.prototype.bitCount=sa,d.prototype.testBit=ta,d.prototype.setBit=va,d.prototype.clearBit=wa,d.prototype.flipBit=xa,d.prototype.add=za,d.prototype.subtract=Aa,d.prototype.multiply=Ba,d.prototype.divide=Da,d.prototype.remainder=Ea,d.prototype.divideAndRemainder=Fa,d.prototype.modPow=Va,d.prototype.modInverse=Ya,d.prototype.pow=Ma,d.prototype.gcd=Wa,d.prototype.isProbablePrime=Za,d.prototype.toMPI=$a,d.prototype.square=Ca},{"../../util.js":74,"./jsbn.js":37}],38:[function(a,b,c){function d(){function a(a){for(var b=0;b>1;for(e.e=parseInt(b,16),e.ee=new h(b,16);;){for(;e.p=new h(a-g,1,f),0!==e.p.subtract(h.ONE).gcd(e.ee).compareTo(h.ONE)||!e.p.isProbablePrime(10););for(;e.q=new h(g,1,f),0!==e.q.subtract(h.ONE).gcd(e.ee).compareTo(h.ONE)||!e.q.isProbablePrime(10););if(e.p.compareTo(e.q)<=0){var i=e.p;e.p=e.q,e.q=i}var k=e.p.subtract(h.ONE),l=e.q.subtract(h.ONE),m=k.multiply(l);if(0===m.gcd(e.ee).compareTo(h.ONE)){e.n=e.p.multiply(e.q),e.d=e.ee.modInverse(m),e.dmp1=e.d.mod(k),e.dmq1=e.d.mod(l),e.u=e.p.modInverse(e.q);break}}c(e)})}this.encrypt=b,this.decrypt=a,this.verify=g,this.sign=c,this.generate=l,this.keyObject=j}var h=a("./jsbn.js"),i=a("../../util.js"),j=a("../random.js"),k=a("../../config"),l=h.ZERO,m=h.ZERO;b.exports=g},{"../../config":17,"../../util.js":74,"../random.js":39,"./jsbn.js":37}],39:[function(a,b,c){ +function d(){this.buffer=null,this.size=null}var e=a("../type/mpi.js"),f=a("../util.js"),g=null;"undefined"==typeof window&&(g=a("crypto")),b.exports={getRandomBytes:function(a){for(var b=new Uint8Array(a),c=0;a>c;c++)b[c]=this.getSecureRandomOctet();return b},getSecureRandom:function(a,b){for(var c=this.getSecureRandomUint(),d=(b-a).toString(2).length;(c&Math.pow(2,d)-1)>b-a;)c=this.getSecureRandomUint();return a+Math.abs(c&Math.pow(2,d)-1)},getSecureRandomOctet:function(){var a=new Uint8Array(1);return this.getRandomValues(a),a[0]},getSecureRandomUint:function(){var a=new Uint8Array(4),b=new DataView(a.buffer);return this.getRandomValues(a),b.getUint32(0)},getRandomValues:function(a){if(!(a instanceof Uint8Array))throw new Error("Invalid type: buf not an Uint8Array");if("undefined"!=typeof window&&window.crypto&&window.crypto.getRandomValues)window.crypto.getRandomValues(a);else if("undefined"!=typeof window&&"object"==typeof window.msCrypto&&"function"==typeof window.msCrypto.getRandomValues)window.msCrypto.getRandomValues(a);else if(g){var b=g.randomBytes(a.length);a.set(b)}else{if(!this.randomBuffer.buffer)throw new Error("No secure random number generator available.");this.randomBuffer.get(a)}},getRandomBigInteger:function(a){if(1>a)throw new Error("Illegal parameter value: bits < 1");var b=Math.floor((a+7)/8),c=f.Uint8Array2str(this.getRandomBytes(b));a%8>0&&(c=String.fromCharCode(Math.pow(2,a%8)-1&c.charCodeAt(0))+c.substring(1));var d=new e;return d.fromBytes(c),d.toBigInteger()},getRandomBigIntegerInRange:function(a,b){if(b.compareTo(a)<=0)throw new Error("Illegal parameter value: max <= min");for(var c=b.subtract(a),d=this.getRandomBigInteger(c.bitLength());d.compareTo(c)>0;)d=this.getRandomBigInteger(c.bitLength());return a.add(d)},randomBuffer:new d},d.prototype.init=function(a){this.buffer=new Uint8Array(a),this.size=0},d.prototype.set=function(a){if(!this.buffer)throw new Error("RandomBuffer is not initialized");if(!(a instanceof Uint8Array))throw new Error("Invalid type: buf not an Uint8Array");var b=this.buffer.length-this.size;a.length>b&&(a=a.subarray(0,b)),this.buffer.set(a,this.size),this.size+=a.length},d.prototype.get=function(a){if(!this.buffer)throw new Error("RandomBuffer is not initialized");if(!(a instanceof Uint8Array))throw new Error("Invalid type: buf not an Uint8Array");if(this.size>16,b>>8&255,255&b]);return n.encode(c)}function g(a,b){var c=f(a),d=b;return c[0]==d[0]&&c[1]==d[1]&&c[2]==d[2]&&c[3]==d[3]}function h(a){for(var b=11994318,c=0;a.length-c>16;)b=b<<8^q[255&(b>>16^a[c])],b=b<<8^q[255&(b>>16^a[c+1])],b=b<<8^q[255&(b>>16^a[c+2])],b=b<<8^q[255&(b>>16^a[c+3])],b=b<<8^q[255&(b>>16^a[c+4])],b=b<<8^q[255&(b>>16^a[c+5])],b=b<<8^q[255&(b>>16^a[c+6])],b=b<<8^q[255&(b>>16^a[c+7])],b=b<<8^q[255&(b>>16^a[c+8])],b=b<<8^q[255&(b>>16^a[c+9])],b=b<<8^q[255&(b>>16^a[c+10])],b=b<<8^q[255&(b>>16^a[c+11])],b=b<<8^q[255&(b>>16^a[c+12])],b=b<<8^q[255&(b>>16^a[c+13])],b=b<<8^q[255&(b>>16^a[c+14])],b=b<<8^q[255&(b>>16^a[c+15])],c+=16;for(var d=c;d>16^a[c++])];return 16777215&b}function i(a){var b=/^[ \f\r\t\u00a0\u2000-\u200a\u202f\u205f\u3000]*\n/m,c="",d=a,e=b.exec(a);if(null===e)throw new Error("Mandatory blank line missing between armor headers and armor data");return c=a.slice(0,e.index),d=a.slice(e.index+e[0].length),c=c.split("\n"),c.pop(),{headers:c,body:d}}function j(a){for(var b=0;be;e++)d=a[e],0===i?(g.push(f.charAt(d>>2&63)),c=(3&d)<<4):1==i?(g.push(f.charAt(c|d>>4&15)),c=(15&d)<<2):2==i&&(g.push(f.charAt(c|d>>6&3)),h+=1,h%60===0&&g.push("\n"),g.push(f.charAt(63&d))),h+=1,h%60===0&&g.push("\n"),i+=1,3==i&&(i=0);return i>0&&(g.push(f.charAt(c)),h+=1,h%60===0&&g.push("\n"),g.push("="),h+=1),1==i&&(h%60===0&&g.push("\n"),g.push("=")),b?void 0:g.join("")}function e(a){var b,c,d=[],e=0,g=0,h=a.length;for(c=0;h>c;c++)b=f.indexOf(a.charAt(c)),b>=0&&(e&&d.push(g|b>>6-e&255),e=e+2&7,g=b<>c,d.count++})}var e={prio:0,algo:q.encryption_cipher};for(var f in b)try{f!==o.symmetric.plaintext&&f!==o.symmetric.idea&&o.read(o.symmetric,f)&&b[f].count===a.length&&b[f].prio>e.prio&&(e=b[f])}catch(g){}return e.algo}var n=a("./packet"),o=a("./enums.js"),p=a("./encoding/armor.js"),q=a("./config"),r=a("./util");d.prototype.packetlist2structure=function(a){for(var b,c,d,e=0;ethis.primaryKey.created.getTime()+24*this.primaryKey.expirationTimeV3*3600*1e3)return o.keyStatus.expired;for(var a=!1,b=0;bthis.primaryKey.created.getTime()+1e3*c.selfCertificate.keyExpirationTime?o.keyStatus.expired:o.keyStatus.valid:o.keyStatus.invalid},d.prototype.getExpirationTime=function(){if(3==this.primaryKey.version)return g(this.primaryKey);if(4==this.primaryKey.version){var a=this.getPrimaryUser();return a?g(this.primaryKey,a.selfCertificate):null}},d.prototype.getPrimaryUser=function(){for(var a=[],b=0;bb.selfCertificate.isPrimaryUserID?-1:a.selfCertificate.isPrimaryUserIDb.selfCertificate.created?-1:a.selfCertificate.createdb?-1:b>a?1:0}),c=0;cthis.subKey.created.getTime()+24*this.subKey.expirationTimeV3*3600*1e3?o.keyStatus.expired:this.bindingSignature?this.bindingSignature.isExpired()?o.keyStatus.expired:this.bindingSignature.verified||this.bindingSignature.verify(a,{key:a,bind:this.subKey})?4==this.subKey.version&&this.bindingSignature.keyNeverExpires===!1&&Date.now()>this.subKey.created.getTime()+1e3*this.bindingSignature.keyExpirationTime?o.keyStatus.expired:o.keyStatus.valid:o.keyStatus.invalid:o.keyStatus.invalid},j.prototype.getExpirationTime=function(){return g(this.subKey,this.bindingSignature)},j.prototype.update=function(a,b){if(a.verify(b)!==o.keyStatus.invalid){if(this.subKey.getFingerprint()!==a.subKey.getFingerprint())throw new Error("SubKey update method: fingerprints of subkeys not equal");this.subKey.tag===o.packet.publicSubkey&&a.subKey.tag===o.packet.secretSubkey&&(this.subKey=a.subKey),!this.bindingSignature&&a.bindingSignature&&(a.bindingSignature.verified||a.bindingSignature.verify(b,{key:b,bind:this.subKey}))&&(this.bindingSignature=a.bindingSignature),this.revocationSignature||!a.revocationSignature||a.revocationSignature.isExpired()||!a.revocationSignature.verified&&!a.revocationSignature.verify(b,{key:b,bind:this.subKey})||(this.revocationSignature=a.revocationSignature)}},c.Key=d,c.readArmored=k,c.generate=l,c.getPreferredSymAlgo=m},{"./config":17,"./encoding/armor.js":41,"./enums.js":43,"./packet":53,"./util":74}],46:[function(a,b,c){b.exports=a("./keyring.js"),b.exports.localstore=a("./localstore.js")},{"./keyring.js":47,"./localstore.js":48}],47:[function(a,b,c){function d(b){this.storeHandler=b||new(a("./localstore.js")),this.publicKeys=new e(this.storeHandler.loadPublic()),this.privateKeys=new e(this.storeHandler.loadPrivate())}function e(a){this.keys=a}function f(a,b){a=a.toLowerCase().replace(/[.*+?^${}()|[\]\\]/g,"\\$&");for(var c=new RegExp("<"+a+">"),d=b.getUserIds(),e=0;ee;e++){b=c[e];try{b.decrypt(a);break}catch(f){if(e===d-1)throw f}}if(!b)throw new Error("No symmetrically encrypted session key packet found.")}else{var g=this.getEncryptionKeyIds();if(!g.length)return this;var h=a.getKeyPacket(g);if(null==h)throw new Error("No appropriate private key found.");if(!h.isDecrypted)throw new Error("Private key is not decrypted.");for(var i=this.packets.filterByTag(m.packet.publicKeyEncryptedSessionKey),e=0;e=0;e--){var j=new l.Signature;if(j.signatureType=g,j.hashAlgorithm=o.prefer_hash_algorithm,j.publicKeyAlgorithm=i.algorithm,!i.isDecrypted)throw new Error("Private key is not decrypted.");j.sign(i,c),b.push(j)}return new d(b)},d.prototype.verify=function(a){var b=[],c=this.unwrapCompressed(),d=c.packets.filterByTag(m.packet.literal);if(1!==d.length)throw new Error("Can only verify message with one literal data packet.");for(var e=c.packets.filterByTag(m.packet.signature),f=0;fe?(c=a[0],b=1):255>e?(c=(a[0]-192<<8)+a[1]+192,b=2):255==e&&(c=d.readNumber(a.subarray(1,5)),b=5),{len:c,offset:b}},writeSimpleLength:function(a){return 192>a?new Uint8Array([a]):a>191&&8384>a?new Uint8Array([(a-192>>8)+192,a-192&255]):d.concatUint8Array([new Uint8Array([255]),d.writeNumber(a,4)])},writeHeader:function(a,b){return d.concatUint8Array([new Uint8Array([192|a]),this.writeSimpleLength(b)])},writeOldHeader:function(a,b){return 256>b?new Uint8Array([128|a<<2,b]):d.concatUint8Array(65536>b?[128|a<<2|1,d.writeNumber(b,2)]:[128|a<<2|2,d.writeNumber(b,4)])},read:function(a,b,c){if(null===a||a.length<=b||a.subarray(b,a.length).length<2||0===(128&a[b]))throw new Error("Error during parsing. This message / key probably does not conform to a valid OpenPGP format.");var e,f=b,g=-1,h=-1;h=0,0!==(64&a[f])&&(h=1);var i;h?g=63&a[f]:(g=(63&a[f])>>2,i=3&a[f]),f++;var j=null,k=-1;if(h)if(a[f]<192)e=a[f++],d.print_debug("1 byte length:"+e);else if(a[f]>=192&&a[f]<224)e=(a[f++]-192<<8)+a[f++]+192,d.print_debug("2 byte length:"+e);else if(a[f]>223&&a[f]<255){e=1<<(31&a[f++]),d.print_debug("4 byte length:"+e);var l=f+e;j=[a.subarray(f,f+e)];for(var m;;){if(a[l]<192){m=a[l++],e+=m,j.push(a.subarray(l,l+m)),l+=m;break}if(a[l]>=192&&a[l]<224){m=(a[l++]-192<<8)+a[l++]+192,e+=m,j.push(a.subarray(l,l+m)),l+=m;break}if(!(a[l]>223&&a[l]<255)){l++,m=a[l++]<<24|a[l++]<<16|a[l++]<<8|a[l++],j.push(a.subarray(l,l+m)),e+=m,l+=m;break}m=1<<(31&a[l++]),e+=m,j.push(a.subarray(l,l+m)),l+=m}k=l-f}else f++,e=a[f++]<<24|a[f++]<<16|a[f++]<<8|a[f++];else switch(i){case 0:e=a[f++];break;case 1:e=a[f++]<<8|a[f++];break;case 2:e=a[f++]<<24|a[f++]<<16|a[f++]<<8|a[f++];break;default:e=c}return-1==k&&(k=e),null===j?j=a.subarray(f,f+k):j instanceof Array&&(j=d.concatUint8Array(j)),{tag:g,packet:j,offset:f+k}}}},{"../enums.js":43,"../util.js":74}],58:[function(a,b,c){function d(){this.length=0}b.exports=d;var e=a("../util"),f=a("./packet.js"),g=a("./all_packets.js"),h=a("../enums.js");d.prototype.read=function(a){for(var b=0;be;e++)c.push(this[e]);return c},d.prototype.concat=function(a){if(a)for(var b=0;bj&&gd.length)throw new Error("Error reading MPI @:"+g);return g+6}throw new Error("Version "+this.version+" of the key packet is unsupported.")},d.prototype.readPublicKey=d.prototype.read,d.prototype.write=function(){var a=[];a.push(new Uint8Array([this.version])),a.push(e.writeDate(this.created)),3==this.version&&a.push(e.writeNumber(this.expirationTimeV3,2)),a.push(new Uint8Array([h.write(h.publicKey,this.algorithm)]));for(var b=i.getPublicMpiCount(this.algorithm),c=0;b>c;c++)a.push(this.mpi[c].write());return e.concatUint8Array(a)},d.prototype.writePublicKey=d.prototype.write,d.prototype.writeOld=function(){var a=this.writePublicKey();return e.concatUint8Array([new Uint8Array([153]),e.writeNumber(a.length,2),a])},d.prototype.getKeyId=function(){if(this.keyid)return this.keyid;if(this.keyid=new g,4==this.version)this.keyid.read(e.str2Uint8Array(e.hex2bin(this.getFingerprint()).substr(12,8)));else if(3==this.version){var a=this.mpi[0].write();this.keyid.read(a.subarray(a.length-8,a.length))}return this.keyid},d.prototype.getFingerprint=function(){if(this.fingerprint)return this.fingerprint;var a="";if(4==this.version)a=this.writeOld(),this.fingerprint=e.Uint8Array2str(i.hash.sha1(a));else if(3==this.version){for(var b=i.getPublicMpiCount(this.algorithm),c=0;b>c;c++)a+=this.mpi[c].toBytes();this.fingerprint=e.Uint8Array2str(i.hash.md5(e.str2Uint8Array(a)))}return this.fingerprint=e.hexstrdump(this.fingerprint),this.fingerprint},d.prototype.getBitSize=function(){return 8*this.mpi[0].byteLength()},d.prototype.postCloneTypeFix=function(){for(var a=0;ad;d++){var e=new g;b+=e.read(a.subarray(b,a.length)),this.encrypted.push(e)}},d.prototype.write=function(){for(var a=[new Uint8Array([this.version]),this.publicKeyId.write(),new Uint8Array([h.write(h.publicKey,this.publicKeyAlgorithm)])],b=0;bp&&kc;){var d=g.readSimpleLength(a.subarray(c,a.length));c+=d.offset,this.read_sub_packet(a.subarray(c,c+d.len)),c+=d.len}return c}var c=0;switch(this.version=a[c++],this.version){case 3:5!=a[c++]&&f.print_debug("packet/signature.js\ninvalid One-octet length of following hashed material.MUST be 5. @:"+(c-1));var d=c;this.signatureType=a[c++],this.created=f.readDate(a.subarray(c,c+4)),c+=4,this.signatureData=a.subarray(d,c),this.issuerKeyId.read(a.subarray(c,c+8)),c+=8,this.publicKeyAlgorithm=a[c++],this.hashAlgorithm=a[c++];break;case 4:this.signatureType=a[c++],this.publicKeyAlgorithm=a[c++],this.hashAlgorithm=a[c++],c+=b.call(this,a.subarray(c,a.length),!0),this.signatureData=a.subarray(0,c);var e=c;c+=b.call(this,a.subarray(c,a.length),!1),this.unhashedSubpackets=a.subarray(e,c);break;default:throw new Error("Version "+this.version+" of the signature is unsupported.")}this.signedHashValue=a.subarray(c,c+2),c+=2,this.signature=a.subarray(c,a.length)},d.prototype.write=function(){var a=[];switch(this.version){case 3:a.push(new Uint8Array([3,5])),a.push(this.signatureData),a.push(this.issuerKeyId.write()),a.push(new Uint8Array([this.publicKeyAlgorithm,this.hashAlgorithm]));break;case 4:a.push(this.signatureData),a.push(this.unhashedSubpackets?this.unhashedSubpackets:f.writeNumber(0,2))}return a.push(this.signedHashValue),a.push(this.signature),f.concatUint8Array(a)},d.prototype.sign=function(a,b){var c=h.write(h.signature,this.signatureType),d=h.write(h.publicKey,this.publicKeyAlgorithm),e=h.write(h.hash,this.hashAlgorithm),g=[new Uint8Array([4,c,d,e])];this.issuerKeyId=a.getKeyId(),g.push(this.write_all_sub_packets()),this.signatureData=f.concatUint8Array(g);var j=this.calculateTrailer(),k=f.concatUint8Array([this.toSign(c,b),this.signatureData,j]),l=i.hash.digest(e,k); -d?d.update(a):c.push(a)}),b.err?b.err:null},e.prototype.push=function(a){return this.keys.push(a)},e.prototype.removeForId=function(a){for(var b=0;be;e++){b=c[e];try{b.decrypt(a);break}catch(f){if(e===d-1)throw f}}if(!b)throw new Error("No symmetrically encrypted session key packet found.")}else{var g=this.getEncryptionKeyIds();if(!g.length)return this;var h=a.getKeyPacket(g);if(!h.isDecrypted)throw new Error("Private key is not decrypted.");for(var i=this.packets.filterByTag(m.packet.publicKeyEncryptedSessionKey),e=0;e=0;e--){var j=new l.Signature;if(j.signatureType=g,j.hashAlgorithm=o.prefer_hash_algorithm,j.publicKeyAlgorithm=i.algorithm,!i.isDecrypted)throw new Error("Private key is not decrypted.");j.sign(i,c),b.push(j)}return new d(b)},d.prototype.verify=function(a){var b=[],c=this.unwrapCompressed(),d=c.packets.filterByTag(m.packet.literal);if(1!==d.length)throw new Error("Can only verify message with one literal data packet.");for(var e=c.packets.filterByTag(m.packet.signature),f=0;fe?(c=a[0],b=1):255>e?(c=(a[0]-192<<8)+a[1]+192,b=2):255==e&&(c=d.readNumber(a.subarray(1,5)),b=5),{len:c,offset:b}},writeSimpleLength:function(a){return 192>a?new Uint8Array([a]):a>191&&8384>a?new Uint8Array([(a-192>>8)+192,a-192&255]):d.concatUint8Array([new Uint8Array([255]),d.writeNumber(a,4)])},writeHeader:function(a,b){return d.concatUint8Array([new Uint8Array([192|a]),this.writeSimpleLength(b)])},writeOldHeader:function(a,b){return 256>b?new Uint8Array([128|a<<2,b]):d.concatUint8Array(65536>b?[128|a<<2|1,d.writeNumber(b,2)]:[128|a<<2|2,d.writeNumber(b,4)])},read:function(a,b,c){if(null===a||a.length<=b||a.subarray(b,a.length).length<2||0===(128&a[b]))throw new Error("Error during parsing. This message / key probably does not conform to a valid OpenPGP format.");var e,f=b,g=-1,h=-1;h=0,0!==(64&a[f])&&(h=1);var i;h?g=63&a[f]:(g=(63&a[f])>>2,i=3&a[f]),f++;var j=null,k=-1;if(h)if(a[f]<192)e=a[f++],d.print_debug("1 byte length:"+e);else if(a[f]>=192&&a[f]<224)e=(a[f++]-192<<8)+a[f++]+192,d.print_debug("2 byte length:"+e);else if(a[f]>223&&a[f]<255){e=1<<(31&a[f++]),d.print_debug("4 byte length:"+e);var l=f+e;j=[a.subarray(f,f+e)];for(var m;;){if(a[l]<192){m=a[l++],e+=m,j.push(a.subarray(l,l+m)),l+=m;break}if(a[l]>=192&&a[l]<224){m=(a[l++]-192<<8)+a[l++]+192,e+=m,j.push(a.subarray(l,l+m)),l+=m;break}if(!(a[l]>223&&a[l]<255)){l++,m=a[l++]<<24|a[l++]<<16|a[l++]<<8|a[l++],j.push(a.subarray(l,l+m)),e+=m,l+=m;break}m=1<<(31&a[l++]),e+=m,j.push(a.subarray(l,l+m)),l+=m}k=l-f}else f++,e=a[f++]<<24|a[f++]<<16|a[f++]<<8|a[f++];else switch(i){case 0:e=a[f++];break;case 1:e=a[f++]<<8|a[f++];break;case 2:e=a[f++]<<24|a[f++]<<16|a[f++]<<8|a[f++];break;default:e=c}return-1==k&&(k=e),null===j?j=a.subarray(f,f+k):j instanceof Array&&(j=d.concatUint8Array(j)),{tag:g,packet:j,offset:f+k}}}},{"../enums.js":43,"../util.js":74}],58:[function(a,b,c){function d(){this.length=0}b.exports=d;var e=a("../util"),f=a("./packet.js"),g=a("./all_packets.js"),h=a("../enums.js");d.prototype.read=function(a){for(var b=0;be;e++)c.push(this[e]);return c},d.prototype.concat=function(a){if(a)for(var b=0;bj&&gd.length)throw new Error("Error reading MPI @:"+g);return g+6}throw new Error("Version "+this.version+" of the key packet is unsupported.")},d.prototype.readPublicKey=d.prototype.read,d.prototype.write=function(){var a=[];a.push(new Uint8Array([this.version])),a.push(e.writeDate(this.created)),3==this.version&&a.push(e.writeNumber(this.expirationTimeV3,2)),a.push(new Uint8Array([h.write(h.publicKey,this.algorithm)]));for(var b=i.getPublicMpiCount(this.algorithm),c=0;b>c;c++)a.push(this.mpi[c].write());return e.concatUint8Array(a)},d.prototype.writePublicKey=d.prototype.write,d.prototype.writeOld=function(){var a=this.writePublicKey();return e.concatUint8Array([new Uint8Array([153]),e.writeNumber(a.length,2),a])},d.prototype.getKeyId=function(){if(this.keyid)return this.keyid;if(this.keyid=new g,4==this.version)this.keyid.read(e.str2Uint8Array(e.hex2bin(this.getFingerprint()).substr(12,8)));else if(3==this.version){var a=this.mpi[0].write();this.keyid.read(a.subarray(a.length-8,a.length))}return this.keyid},d.prototype.getFingerprint=function(){if(this.fingerprint)return this.fingerprint;var a="";if(4==this.version)a=this.writeOld(),this.fingerprint=e.Uint8Array2str(i.hash.sha1(a));else if(3==this.version){for(var b=i.getPublicMpiCount(this.algorithm),c=0;b>c;c++)a+=this.mpi[c].toBytes();this.fingerprint=e.Uint8Array2str(i.hash.md5(e.str2Uint8Array(a)))}return this.fingerprint=e.hexstrdump(this.fingerprint),this.fingerprint},d.prototype.getBitSize=function(){return 8*this.mpi[0].byteLength()},d.prototype.postCloneTypeFix=function(){for(var a=0;ad;d++){var e=new g;b+=e.read(a.subarray(b,a.length)),this.encrypted.push(e)}},d.prototype.write=function(){for(var a=[new Uint8Array([this.version]),this.publicKeyId.write(),new Uint8Array([h.write(h.publicKey,this.publicKeyAlgorithm)])],b=0;bp&&kc;){var d=g.readSimpleLength(a.subarray(c,a.length));c+=d.offset,this.read_sub_packet(a.subarray(c,c+d.len)),c+=d.len}return c}var c=0;switch(this.version=a[c++],this.version){case 3:5!=a[c++]&&f.print_debug("packet/signature.js\ninvalid One-octet length of following hashed material.MUST be 5. @:"+(c-1));var d=c;this.signatureType=a[c++],this.created=f.readDate(a.subarray(c,c+4)),c+=4,this.signatureData=a.subarray(d,c),this.issuerKeyId.read(a.subarray(c,c+8)),c+=8,this.publicKeyAlgorithm=a[c++],this.hashAlgorithm=a[c++];break;case 4:this.signatureType=a[c++],this.publicKeyAlgorithm=a[c++],this.hashAlgorithm=a[c++],c+=b.call(this,a.subarray(c,a.length),!0),this.signatureData=a.subarray(0,c);var e=c;c+=b.call(this,a.subarray(c,a.length),!1),this.unhashedSubpackets=a.subarray(e,c);break;default:throw new Error("Version "+this.version+" of the signature is unsupported.")}this.signedHashValue=a.subarray(c,c+2),c+=2,this.signature=a.subarray(c,a.length)},d.prototype.write=function(){var a=[];switch(this.version){case 3:a.push(new Uint8Array([3,5])),a.push(this.signatureData),a.push(this.issuerKeyId.write()),a.push(new Uint8Array([this.publicKeyAlgorithm,this.hashAlgorithm]));break;case 4:a.push(this.signatureData),a.push(this.unhashedSubpackets?this.unhashedSubpackets:f.writeNumber(0,2))}return a.push(this.signedHashValue),a.push(this.signature),f.concatUint8Array(a)},d.prototype.sign=function(a,b){var c=h.write(h.signature,this.signatureType),d=h.write(h.publicKey,this.publicKeyAlgorithm),e=h.write(h.hash,this.hashAlgorithm),g=[new Uint8Array([4,c,d,e])];this.issuerKeyId=a.getKeyId(),g.push(this.write_all_sub_packets()),this.signatureData=f.concatUint8Array(g);var j=this.calculateTrailer(),k=f.concatUint8Array([this.toSign(c,b),this.signatureData,j]),l=i.hash.digest(e,k);this.signedHashValue=l.subarray(0,2),this.signature=i.signature.sign(e,d,a.mpi,k)},d.prototype.write_all_sub_packets=function(){var a,b=h.signatureSubpacket,c=[];if(null!==this.created&&c.push(e(b.signature_creation_time,f.writeDate(this.created))),null!==this.signatureExpirationTime&&c.push(e(b.signature_expiration_time,f.writeNumber(this.signatureExpirationTime,4))),null!==this.exportable&&c.push(e(b.exportable_certification,new Uint8Array([this.exportable?1:0]))),null!==this.trustLevel&&(a=new Uint8Array([this.trustLevel,this.trustAmount]),c.push(e(b.trust_signature,a))),null!==this.regularExpression&&c.push(e(b.regular_expression,this.regularExpression)),null!==this.revocable&&c.push(e(b.revocable,new Uint8Array([this.revocable?1:0]))),null!==this.keyExpirationTime&&c.push(e(b.key_expiration_time,f.writeNumber(this.keyExpirationTime,4))),null!==this.preferredSymmetricAlgorithms&&(a=f.str2Uint8Array(f.bin2str(this.preferredSymmetricAlgorithms)),c.push(e(b.preferred_symmetric_algorithms,a))),null!==this.revocationKeyClass&&(a=new Uint8Array([this.revocationKeyClass,this.revocationKeyAlgorithm]), -a=f.concatUint8Array([a,this.revocationKeyFingerprint]),c.push(e(b.revocation_key,a))),this.issuerKeyId.isNull()||c.push(e(b.issuer,this.issuerKeyId.write())),null!==this.notation)for(var d in this.notation)if(this.notation.hasOwnProperty(d)){var g=this.notation[d];a=[new Uint8Array([128,0,0,0])],a.push(f.writeNumber(d.length,2)),a.push(f.writeNumber(g.length,2)),a.push(f.str2Uint8Array(d+g)),a=f.concatUint8Array(a),c.push(e(b.notation_data,a))}null!==this.preferredHashAlgorithms&&(a=f.str2Uint8Array(f.bin2str(this.preferredHashAlgorithms)),c.push(e(b.preferred_hash_algorithms,a))),null!==this.preferredCompressionAlgorithms&&(a=f.str2Uint8Array(f.bin2str(this.preferredCompressionAlgorithms)),c.push(e(b.preferred_compression_algorithms,a))),null!==this.keyServerPreferences&&(a=f.str2Uint8Array(f.bin2str(this.keyServerPreferences)),c.push(e(b.key_server_preferences,a))),null!==this.preferredKeyServer&&c.push(e(b.preferred_key_server,f.str2Uint8Array(this.preferredKeyServer))),null!==this.isPrimaryUserID&&c.push(e(b.primary_user_id,new Uint8Array([this.isPrimaryUserID?1:0]))),null!==this.policyURI&&c.push(e(b.policy_uri,f.str2Uint8Array(this.policyURI))),null!==this.keyFlags&&(a=f.str2Uint8Array(f.bin2str(this.keyFlags)),c.push(e(b.key_flags,a))),null!==this.signersUserId&&c.push(e(b.signers_user_id,f.str2Uint8Array(this.signersUserId))),null!==this.reasonForRevocationFlag&&(a=f.str2Uint8Array(String.fromCharCode(this.reasonForRevocationFlag)+this.reasonForRevocationString),c.push(e(b.reason_for_revocation,a))),null!==this.features&&(a=f.str2Uint8Array(f.bin2str(this.features)),c.push(e(b.features,a))),null!==this.signatureTargetPublicKeyAlgorithm&&(a=[new Uint8Array([this.signatureTargetPublicKeyAlgorithm,this.signatureTargetHashAlgorithm])],a.push(f.str2Uint8Array(this.signatureTargetHash)),a=f.concatUint8Array(a),c.push(e(b.signature_target,a))),null!==this.embeddedSignature&&c.push(e(b.embedded_signature,this.embeddedSignature.write()));var i=f.concatUint8Array(c),j=f.writeNumber(i.length,2);return f.concatUint8Array([j,i])},d.prototype.read_sub_packet=function(a){function b(a,b){this[a]=[];for(var c=0;c0&&4>d?l=1:17==d&&(l=2);for(var m=[],n=0,o=0;l>o;o++)m[o]=new j,n+=m[o].read(this.signature.subarray(n,this.signature.length));return this.verified=i.signature.verify(d,e,m,a.mpi,f.concatUint8Array([g,this.signatureData,k])),this.verified},d.prototype.isExpired=function(){return this.signatureNeverExpires?!1:Date.now()>this.created.getTime()+1e3*this.signatureExpirationTime},d.prototype.postCloneTypeFix=function(){this.issuerKeyId=k.fromClone(this.issuerKeyId)}},{"../crypto":32,"../enums.js":43,"../type/keyid.js":71,"../type/mpi.js":72,"../util.js":74,"./packet.js":57}],65:[function(a,b,c){function d(){this.tag=h.packet.symEncryptedIntegrityProtected,this.encrypted=null,this.modification=!1,this.packets=null}b.exports=d;var e=a("../util.js"),f=a("../crypto"),g=a("../config"),h=a("../enums.js");d.prototype.read=function(a){var b=a[0];if(1!=b)throw new Error("Invalid packet version.");this.encrypted=a.subarray(1,a.length)},d.prototype.write=function(){return e.concatUint8Array([new Uint8Array([1]),this.encrypted])},d.prototype.encrypt=function(c,d){var h=this.packets.write(),i=f.getPrefixRandom(c),j=new Uint8Array([i[i.length-2],i[i.length-1]]),k=e.concatUint8Array([i,j]),l=new Uint8Array([211,20]),m=e.concatUint8Array([h,l]),n=f.hash.sha1(e.concatUint8Array([k,m]));if(m=e.concatUint8Array([m,n]),"aes"===c.substr(0,3)){var o=f.cipher[c].blockSize;if("undefined"!=typeof b&&b.exports&&g.useNative){var p=a("crypto"),q=a("buffer").Buffer,r=new p.createCipheriv("aes-"+c.substr(3,3)+"-cfb",new q(d),new q(new Uint8Array(o)));this.encrypted=new Uint8Array(r.update(new q(e.concatUint8Array([k,m]))))}else this.encrypted=asmCrypto.AES_CFB.encrypt(e.concatUint8Array([k,m]),d)}else this.encrypted=f.cfb.encrypt(i,c,m,d,!1).subarray(0,k.length+m.length)},d.prototype.decrypt=function(c,d){var h;if("aes"===c.substr(0,3)){var i=f.cipher[c].blockSize;if("undefined"!=typeof b&&b.exports&&g.useNative){var j=a("crypto"),k=a("buffer").Buffer,l=new j.createDecipheriv("aes-"+c.substr(3,3)+"-cfb",new k(d),new k(new Uint8Array(i)));h=new Uint8Array(l.update(new k(this.encrypted)))}else h=asmCrypto.AES_CFB.decrypt(this.encrypted,d);h=h.subarray(i+2,h.length)}else h=f.cfb.decrypt(c,d,this.encrypted,!1);this.hash=e.Uint8Array2str(f.hash.sha1(e.concatUint8Array([f.cfb.mdc(c,d,this.encrypted),h.subarray(0,h.length-20)])));var m=e.Uint8Array2str(h.subarray(h.length-20,h.length));if(this.hash!=m)throw new Error("Modification detected.");this.packets.read(h.subarray(0,h.length-22))}},{"../config":17,"../crypto":32,"../enums.js":43,"../util.js":74,buffer:!1,crypto:!1}],66:[function(a,b,c){function d(){this.tag=g.packet.symEncryptedSessionKey,this.version=4,this.sessionKey=null,this.sessionKeyEncryptionAlgorithm=null,this.sessionKeyAlgorithm="aes256",this.encrypted=null,this.s2k=new f}var e=a("../util.js"),f=a("../type/s2k.js"),g=a("../enums.js"),h=a("../crypto");b.exports=d,d.prototype.read=function(a){this.version=a[0];var b=g.read(g.symmetric,a[1]),c=this.s2k.read(a.subarray(2,a.length)),d=c+2;d>4)+a},d.prototype.read=function(a){var b=0;switch(this.type=e.read(e.s2k,a[b++]),this.algorithm=e.read(e.hash,a[b++]),this.type){case"simple":break;case"salted":this.salt=a.subarray(b,b+8),b+=8;break;case"iterated":this.salt=a.subarray(b,b+8),b+=8,this.c=a[b++];break;case"gnu":if("GNU"!=f.Uint8Array2str(a.subarray(b,3)))throw new Error("Unknown s2k type.");b+=3;var c=1e3+a[b++];if(1001!=c)throw new Error("Unknown s2k gnu protection mode.");this.type=c;break;default:throw new Error("Unknown s2k type.")}return b},d.prototype.write=function(){var a=[new Uint8Array([e.write(e.s2k,this.type),e.write(e.hash,this.algorithm)])];switch(this.type){case"simple":break;case"salted":a.push(this.salt);break;case"iterated":a.push(this.salt),a.push(new Uint8Array([this.c]))}return f.concatUint8Array(a)},d.prototype.produce_key=function(a,b){function c(b,c){var d=e.write(e.hash,c.algorithm);switch(c.type){case"simple":return g.hash.digest(d,f.concatUint8Array([b,a]));case"salted":return g.hash.digest(d,f.concatUint8Array([b,c.salt,a]));case"iterated":var h=[],i=c.get_count();for(data=f.concatUint8Array([c.salt,a]);h.length*data.lengthi&&(h=h.subarray(0,i)),g.hash.digest(d,f.concatUint8Array([b,h]))}}a=f.str2Uint8Array(f.encode_utf8(a));for(var d=[],h=0,i=new Uint8Array(b),j=0;b>j;j++)i[j]=0;for(j=0;b>=h;){var k=c(i.subarray(0,j),this);d.push(k),h+=k.length,j++}return f.concatUint8Array(d).subarray(0,b)},b.exports.fromClone=function(a){var b=new d;return b.algorithm=a.algorithm,b.type=a.type,b.c=a.c,b.salt=a.salt,b}},{"../crypto":32,"../enums.js":43,"../util.js":74}],74:[function(a,b,c){"use strict";var d=a("./config");b.exports={readNumber:function(a){for(var b=0,c=0;cd;d++)c[d]=a>>8*(b-d-1)&255;return c},readDate:function(a){var b=this.readNumber(a),c=new Date;return c.setTime(1e3*b),c},writeDate:function(a){var b=Math.round(a.getTime()/1e3);return this.writeNumber(b,4)},emailRegEx:/^[+a-zA-Z0-9_.-]+@([a-zA-Z0-9-]+\.)+[a-zA-Z0-9]{2,6}$/,hexdump:function(a){for(var b,c=[],d=a.length,e=0,f=0;d>e;){for(b=a.charCodeAt(e++).toString(16);b.length<2;)b="0"+b;c.push(" "+b),f++,f%32===0&&c.push("\n ")}return c.join("")},hexstrdump:function(a){if(null===a)return"";for(var b,c=[],d=a.length,e=0;d>e;){for(b=a.charCodeAt(e++).toString(16);b.length<2;)b="0"+b;c.push(""+b)}return c.join("")},hex2bin:function(a){for(var b="",c=0;ce;){for(b=a[e++].toString(16);b.length<2;)b="0"+b;c.push(""+b)}return c.join("")},encode_utf8:function(a){return unescape(encodeURIComponent(a))},decode_utf8:function(a){if("string"!=typeof a)throw new Error('Parameter "utf8" is not of type string');try{return decodeURIComponent(escape(a))}catch(b){return a}},bin2str:function(a){for(var b=[],c=0;c=0;d--)c[d]>>=b%8,d>0&&(c[d]|=c[d-1]<<8-b%8&255);return util.bin2str(c)},get_hashAlgorithmString:function(a){switch(a){case 1:return"MD5";case 2:return"SHA1";case 3:return"RIPEMD160";case 8:return"SHA256";case 9:return"SHA384";case 10:return"SHA512";case 11:return"SHA224"}return"unknown"},getWebCrypto:function(){if(d.useWebCrypto!==!1&&"undefined"!=typeof window){if(window.crypto)return window.crypto.subtle||window.crypto.webkitSubtle;if(window.msCrypto)return window.msCrypto.subtle}}}},{"./config":17}],75:[function(a,b,c){"use strict";function d(a,b){this.worker=b&&b.worker?b.worker:new Worker(a||"openpgp.worker.js"),this.worker.onmessage=this.onMessage.bind(this),this.worker.onerror=function(a){throw new Error("Unhandled error in openpgp worker: "+a.message+" ("+a.filename+":"+a.lineno+")")},this.seedRandom(i),this.tasks=[],b&&b.config&&this.worker.postMessage({event:"configure",config:b.config})}var e=a("../crypto"),f=a("../packet"),g=a("../key.js"),h=a("../type/keyid.js"),i=5e4,j=2e4;d.prototype.execute=function(a){var b=this,c=new Promise(function(c,d){a(),b.tasks.push({resolve:c,reject:d})});return c},d.prototype.onMessage=function(a){var b=a.data;switch(b.event){case"method-return":b.err?this.tasks.shift().reject(new Error(b.err)):this.tasks.shift().resolve(b.data);break;case"request-seed":this.seedRandom(j);break;default:throw new Error("Unknown Worker Event.")}},d.prototype.seedRandom=function(a){var b=this.getRandomBuffer(a);this.worker.postMessage({event:"seed-random",buf:b})},d.prototype.getRandomBuffer=function(a){if(!a)return null;var b=new Uint8Array(a);return e.random.getRandomValues(b),b},d.prototype.terminate=function(){this.worker.terminate()},d.prototype.encryptMessage=function(a,b,c,d){var e=this;return e.execute(function(){a&&(Array.prototype.isPrototypeOf(a)||(a=[a]),a=a.map(function(a){return a.toPacketlist()})),e.worker.postMessage({event:"encrypt-message",keys:a,data:b,passwords:c,params:d})})},d.prototype.encryptSessionKey=function(a,b,c,d){var e=this;return e.execute(function(){c&&(Array.prototype.isPrototypeOf(c)||(c=[c]),c=c.map(function(a){return a.toPacketlist()})),e.worker.postMessage({event:"encrypt-session-key",sessionKey:a,algo:b,keys:c,passwords:d})})},d.prototype.signAndEncryptMessage=function(a,b,c){var d=this;return d.execute(function(){a.length||(a=[a]),a=a.map(function(a){return a.toPacketlist()}),b=b.toPacketlist(),d.worker.postMessage({event:"sign-and-encrypt-message",publicKeys:a,privateKey:b,text:c})})},d.prototype.decryptMessage=function(a,b,c){var d=this;return d.execute(function(){String.prototype.isPrototypeOf(a)||"string"==typeof a||Uint8Array.prototype.isPrototypeOf(a)||(a=a.toPacketlist()),d.worker.postMessage({event:"decrypt-message",privateKey:a,message:b,params:c})})},d.prototype.decryptSessionKey=function(a,b){var c=this;return c.execute(function(){String.prototype.isPrototypeOf(a)||"string"==typeof a||(a=a.toPacketlist()),c.worker.postMessage({event:"decrypt-session-key",privateKey:a,message:b})})},d.prototype.decryptAndVerifyMessage=function(a,b,c){var d=this,e=new Promise(function(e,f){a=a.toPacketlist(),b.length||(b=[b]),b=b.map(function(a){return a.toPacketlist()}),d.worker.postMessage({event:"decrypt-and-verify-message",privateKey:a,publicKeys:b,message:c}),d.tasks.push({resolve:function(a){a.signatures=a.signatures.map(function(a){return a.keyid=h.fromClone(a.keyid),a}),e(a)},reject:f})});return e},d.prototype.signClearMessage=function(a,b){var c=this;return c.execute(function(){a.length||(a=[a]),a=a.map(function(a){return a.toPacketlist()}),c.worker.postMessage({event:"sign-clear-message",privateKeys:a,text:b})})},d.prototype.verifyClearSignedMessage=function(a,b){var c=this,d=new Promise(function(d,e){a.length||(a=[a]),a=a.map(function(a){return a.toPacketlist()}),c.worker.postMessage({event:"verify-clear-signed-message",publicKeys:a,message:b}),c.tasks.push({resolve:function(a){a.signatures=a.signatures.map(function(a){return a.keyid=h.fromClone(a.keyid),a}),d(a)},reject:e})});return d},d.prototype.generateKeyPair=function(a){var b=this,c=new Promise(function(c,d){b.worker.postMessage({event:"generate-key-pair",options:a}),b.tasks.push({resolve:function(a){var b=f.List.fromStructuredClone(a.key);a.key=new g.Key(b),c(a)},reject:d})});return c},d.prototype.decryptKey=function(a,b){var c=this,d=new Promise(function(d,e){a=a.toPacketlist(),c.worker.postMessage({event:"decrypt-key",privateKey:a,password:b}),c.tasks.push({resolve:function(a){var b=f.List.fromStructuredClone(a);a=new g.Key(b),d(a)},reject:e})});return d},d.prototype.decryptKeyPacket=function(a,b,c){var d=this,e=new Promise(function(e,h){a=a.toPacketlist(),d.worker.postMessage({event:"decrypt-key-packet",privateKey:a,keyIds:b,password:c}),d.tasks.push({resolve:function(a){var b=f.List.fromStructuredClone(a);a=new g.Key(b),e(a)},reject:h})});return e},b.exports=d},{"../crypto":32,"../key.js":45,"../packet":53,"../type/keyid.js":71}]},{},[44])(44)}); \ No newline at end of file +this.signedHashValue=l.subarray(0,2),this.signature=i.signature.sign(e,d,a.mpi,k)},d.prototype.write_all_sub_packets=function(){var a,b=h.signatureSubpacket,c=[];if(null!==this.created&&c.push(e(b.signature_creation_time,f.writeDate(this.created))),null!==this.signatureExpirationTime&&c.push(e(b.signature_expiration_time,f.writeNumber(this.signatureExpirationTime,4))),null!==this.exportable&&c.push(e(b.exportable_certification,new Uint8Array([this.exportable?1:0]))),null!==this.trustLevel&&(a=new Uint8Array([this.trustLevel,this.trustAmount]),c.push(e(b.trust_signature,a))),null!==this.regularExpression&&c.push(e(b.regular_expression,this.regularExpression)),null!==this.revocable&&c.push(e(b.revocable,new Uint8Array([this.revocable?1:0]))),null!==this.keyExpirationTime&&c.push(e(b.key_expiration_time,f.writeNumber(this.keyExpirationTime,4))),null!==this.preferredSymmetricAlgorithms&&(a=f.str2Uint8Array(f.bin2str(this.preferredSymmetricAlgorithms)),c.push(e(b.preferred_symmetric_algorithms,a))),null!==this.revocationKeyClass&&(a=new Uint8Array([this.revocationKeyClass,this.revocationKeyAlgorithm]),a=f.concatUint8Array([a,this.revocationKeyFingerprint]),c.push(e(b.revocation_key,a))),this.issuerKeyId.isNull()||c.push(e(b.issuer,this.issuerKeyId.write())),null!==this.notation)for(var d in this.notation)if(this.notation.hasOwnProperty(d)){var g=this.notation[d];a=[new Uint8Array([128,0,0,0])],a.push(f.writeNumber(d.length,2)),a.push(f.writeNumber(g.length,2)),a.push(f.str2Uint8Array(d+g)),a=f.concatUint8Array(a),c.push(e(b.notation_data,a))}null!==this.preferredHashAlgorithms&&(a=f.str2Uint8Array(f.bin2str(this.preferredHashAlgorithms)),c.push(e(b.preferred_hash_algorithms,a))),null!==this.preferredCompressionAlgorithms&&(a=f.str2Uint8Array(f.bin2str(this.preferredCompressionAlgorithms)),c.push(e(b.preferred_compression_algorithms,a))),null!==this.keyServerPreferences&&(a=f.str2Uint8Array(f.bin2str(this.keyServerPreferences)),c.push(e(b.key_server_preferences,a))),null!==this.preferredKeyServer&&c.push(e(b.preferred_key_server,f.str2Uint8Array(this.preferredKeyServer))),null!==this.isPrimaryUserID&&c.push(e(b.primary_user_id,new Uint8Array([this.isPrimaryUserID?1:0]))),null!==this.policyURI&&c.push(e(b.policy_uri,f.str2Uint8Array(this.policyURI))),null!==this.keyFlags&&(a=f.str2Uint8Array(f.bin2str(this.keyFlags)),c.push(e(b.key_flags,a))),null!==this.signersUserId&&c.push(e(b.signers_user_id,f.str2Uint8Array(this.signersUserId))),null!==this.reasonForRevocationFlag&&(a=f.str2Uint8Array(String.fromCharCode(this.reasonForRevocationFlag)+this.reasonForRevocationString),c.push(e(b.reason_for_revocation,a))),null!==this.features&&(a=f.str2Uint8Array(f.bin2str(this.features)),c.push(e(b.features,a))),null!==this.signatureTargetPublicKeyAlgorithm&&(a=[new Uint8Array([this.signatureTargetPublicKeyAlgorithm,this.signatureTargetHashAlgorithm])],a.push(f.str2Uint8Array(this.signatureTargetHash)),a=f.concatUint8Array(a),c.push(e(b.signature_target,a))),null!==this.embeddedSignature&&c.push(e(b.embedded_signature,this.embeddedSignature.write()));var i=f.concatUint8Array(c),j=f.writeNumber(i.length,2);return f.concatUint8Array([j,i])},d.prototype.read_sub_packet=function(a){function b(a,b){this[a]=[];for(var c=0;c0&&4>d?l=1:17==d&&(l=2);for(var m=[],n=0,o=0;l>o;o++)m[o]=new j,n+=m[o].read(this.signature.subarray(n,this.signature.length));return this.verified=i.signature.verify(d,e,m,a.mpi,f.concatUint8Array([g,this.signatureData,k])),this.verified},d.prototype.isExpired=function(){return this.signatureNeverExpires?!1:Date.now()>this.created.getTime()+1e3*this.signatureExpirationTime},d.prototype.postCloneTypeFix=function(){this.issuerKeyId=k.fromClone(this.issuerKeyId)}},{"../crypto":32,"../enums.js":43,"../type/keyid.js":71,"../type/mpi.js":72,"../util.js":74,"./packet.js":57}],65:[function(a,b,c){function d(){this.tag=h.packet.symEncryptedIntegrityProtected,this.encrypted=null,this.modification=!1,this.packets=null}b.exports=d;var e=a("../util.js"),f=a("../crypto"),g=a("../config"),h=a("../enums.js");d.prototype.read=function(a){var b=a[0];if(1!=b)throw new Error("Invalid packet version.");this.encrypted=a.subarray(1,a.length)},d.prototype.write=function(){return e.concatUint8Array([new Uint8Array([1]),this.encrypted])},d.prototype.encrypt=function(c,d){var h=this.packets.write(),i=f.getPrefixRandom(c),j=new Uint8Array([i[i.length-2],i[i.length-1]]),k=e.concatUint8Array([i,j]),l=new Uint8Array([211,20]),m=e.concatUint8Array([h,l]),n=f.hash.sha1(e.concatUint8Array([k,m]));if(m=e.concatUint8Array([m,n]),"aes"===c.substr(0,3)){var o=f.cipher[c].blockSize;if("undefined"!=typeof b&&b.exports&&g.useNative){var p=a("crypto"),q=a("buffer").Buffer,r=new p.createCipheriv("aes-"+c.substr(3,3)+"-cfb",new q(d),new q(new Uint8Array(o)));this.encrypted=new Uint8Array(r.update(new q(e.concatUint8Array([k,m]))))}else this.encrypted=asmCrypto.AES_CFB.encrypt(e.concatUint8Array([k,m]),d)}else this.encrypted=f.cfb.encrypt(i,c,m,d,!1).subarray(0,k.length+m.length)},d.prototype.decrypt=function(c,d){var h;if("aes"===c.substr(0,3)){var i=f.cipher[c].blockSize;if("undefined"!=typeof b&&b.exports&&g.useNative){var j=a("crypto"),k=a("buffer").Buffer,l=new j.createDecipheriv("aes-"+c.substr(3,3)+"-cfb",new k(d),new k(new Uint8Array(i)));h=new Uint8Array(l.update(new k(this.encrypted)))}else h=asmCrypto.AES_CFB.decrypt(this.encrypted,d);h=h.subarray(i+2,h.length)}else h=f.cfb.decrypt(c,d,this.encrypted,!1);this.hash=e.Uint8Array2str(f.hash.sha1(e.concatUint8Array([f.cfb.mdc(c,d,this.encrypted),h.subarray(0,h.length-20)])));var m=e.Uint8Array2str(h.subarray(h.length-20,h.length));if(this.hash!=m)throw new Error("Modification detected.");this.packets.read(h.subarray(0,h.length-22))}},{"../config":17,"../crypto":32,"../enums.js":43,"../util.js":74,buffer:!1,crypto:!1}],66:[function(a,b,c){function d(){this.tag=g.packet.symEncryptedSessionKey,this.version=4,this.sessionKey=null,this.sessionKeyEncryptionAlgorithm=null,this.sessionKeyAlgorithm="aes256",this.encrypted=null,this.s2k=new f}var e=a("../util.js"),f=a("../type/s2k.js"),g=a("../enums.js"),h=a("../crypto");b.exports=d,d.prototype.read=function(a){this.version=a[0];var b=g.read(g.symmetric,a[1]),c=this.s2k.read(a.subarray(2,a.length)),d=c+2;d>4)+a},d.prototype.read=function(a){var b=0;switch(this.type=e.read(e.s2k,a[b++]),this.algorithm=e.read(e.hash,a[b++]),this.type){case"simple":break;case"salted":this.salt=a.subarray(b,b+8),b+=8;break;case"iterated":this.salt=a.subarray(b,b+8),b+=8,this.c=a[b++];break;case"gnu":if("GNU"!=f.Uint8Array2str(a.subarray(b,3)))throw new Error("Unknown s2k type.");b+=3;var c=1e3+a[b++];if(1001!=c)throw new Error("Unknown s2k gnu protection mode.");this.type=c;break;default:throw new Error("Unknown s2k type.")}return b},d.prototype.write=function(){var a=[new Uint8Array([e.write(e.s2k,this.type),e.write(e.hash,this.algorithm)])];switch(this.type){case"simple":break;case"salted":a.push(this.salt);break;case"iterated":a.push(this.salt),a.push(new Uint8Array([this.c]))}return f.concatUint8Array(a)},d.prototype.produce_key=function(a,b){function c(b,c){var d=e.write(e.hash,c.algorithm);switch(c.type){case"simple":return g.hash.digest(d,f.concatUint8Array([b,a]));case"salted":return g.hash.digest(d,f.concatUint8Array([b,c.salt,a]));case"iterated":var h=[],i=c.get_count();for(data=f.concatUint8Array([c.salt,a]);h.length*data.lengthi&&(h=h.subarray(0,i)),g.hash.digest(d,f.concatUint8Array([b,h]))}}a=f.str2Uint8Array(f.encode_utf8(a));for(var d=[],h=0,i=new Uint8Array(b),j=0;b>j;j++)i[j]=0;for(j=0;b>=h;){var k=c(i.subarray(0,j),this);d.push(k),h+=k.length,j++}return f.concatUint8Array(d).subarray(0,b)},b.exports.fromClone=function(a){var b=new d;return b.algorithm=a.algorithm,b.type=a.type,b.c=a.c,b.salt=a.salt,b}},{"../crypto":32,"../enums.js":43,"../util.js":74}],74:[function(a,b,c){"use strict";var d=a("./config");b.exports={readNumber:function(a){for(var b=0,c=0;cd;d++)c[d]=a>>8*(b-d-1)&255;return c},readDate:function(a){var b=this.readNumber(a),c=new Date;return c.setTime(1e3*b),c},writeDate:function(a){var b=Math.round(a.getTime()/1e3);return this.writeNumber(b,4)},emailRegEx:/^[+a-zA-Z0-9_.-]+@([a-zA-Z0-9-]+\.)+[a-zA-Z0-9]{2,6}$/,hexdump:function(a){for(var b,c=[],d=a.length,e=0,f=0;d>e;){for(b=a.charCodeAt(e++).toString(16);b.length<2;)b="0"+b;c.push(" "+b),f++,f%32===0&&c.push("\n ")}return c.join("")},hexstrdump:function(a){if(null===a)return"";for(var b,c=[],d=a.length,e=0;d>e;){for(b=a.charCodeAt(e++).toString(16);b.length<2;)b="0"+b;c.push(""+b)}return c.join("")},hex2bin:function(a){for(var b="",c=0;ce;){for(b=a[e++].toString(16);b.length<2;)b="0"+b;c.push(""+b)}return c.join("")},encode_utf8:function(a){return unescape(encodeURIComponent(a))},decode_utf8:function(a){if("string"!=typeof a)throw new Error('Parameter "utf8" is not of type string');try{return decodeURIComponent(escape(a))}catch(b){return a}},bin2str:function(a){for(var b=[],c=0;c=0;d--)c[d]>>=b%8,d>0&&(c[d]|=c[d-1]<<8-b%8&255);return util.bin2str(c)},get_hashAlgorithmString:function(a){switch(a){case 1:return"MD5";case 2:return"SHA1";case 3:return"RIPEMD160";case 8:return"SHA256";case 9:return"SHA384";case 10:return"SHA512";case 11:return"SHA224"}return"unknown"},getWebCrypto:function(){if(d.useWebCrypto!==!1&&"undefined"!=typeof window){if(window.crypto)return window.crypto.subtle||window.crypto.webkitSubtle;if(window.msCrypto)return window.msCrypto.subtle}}}},{"./config":17}],75:[function(a,b,c){"use strict";function d(a,b){this.worker=b&&b.worker?b.worker:new Worker(a||"openpgp.worker.js"),this.worker.onmessage=this.onMessage.bind(this),this.worker.onerror=function(a){throw new Error("Unhandled error in openpgp worker: "+a.message+" ("+a.filename+":"+a.lineno+")")},this.seedRandom(i),this.tasks=[],b&&b.config&&this.worker.postMessage({event:"configure",config:b.config})}var e=a("../crypto"),f=a("../packet"),g=a("../key.js"),h=a("../type/keyid.js"),i=5e4,j=2e4;d.prototype.execute=function(a){var b=this,c=new Promise(function(c,d){a(),b.tasks.push({resolve:c,reject:d})});return c},d.prototype.onMessage=function(a){var b=a.data;switch(b.event){case"method-return":b.err?this.tasks.shift().reject(new Error(b.err)):this.tasks.shift().resolve(b.data);break;case"request-seed":this.seedRandom(j);break;default:throw new Error("Unknown Worker Event.")}},d.prototype.seedRandom=function(a){var b=this.getRandomBuffer(a);this.worker.postMessage({event:"seed-random",buf:b})},d.prototype.getRandomBuffer=function(a){if(!a)return null;var b=new Uint8Array(a);return e.random.getRandomValues(b),b},d.prototype.terminate=function(){this.worker.terminate()},d.prototype.encryptMessage=function(a,b,c,d){var e=this;return e.execute(function(){a&&(Array.prototype.isPrototypeOf(a)||(a=[a]),a=a.map(function(a){return a.toPacketlist()})),e.worker.postMessage({event:"encrypt-message",keys:a,data:b,passwords:c,params:d})})},d.prototype.encryptSessionKey=function(a,b,c,d){var e=this;return e.execute(function(){c&&(Array.prototype.isPrototypeOf(c)||(c=[c]),c=c.map(function(a){return a.toPacketlist()})),e.worker.postMessage({event:"encrypt-session-key",sessionKey:a,algo:b,keys:c,passwords:d})})},d.prototype.signAndEncryptMessage=function(a,b,c){var d=this;return d.execute(function(){a.length||(a=[a]),a=a.map(function(a){return a.toPacketlist()}),b=b.toPacketlist(),d.worker.postMessage({event:"sign-and-encrypt-message",publicKeys:a,privateKey:b,text:c})})},d.prototype.decryptMessage=function(a,b,c){var d=this;return d.execute(function(){String.prototype.isPrototypeOf(a)||"string"==typeof a||Uint8Array.prototype.isPrototypeOf(a)||(a=a.toPacketlist()),d.worker.postMessage({event:"decrypt-message",privateKey:a,message:b,params:c})})},d.prototype.decryptSessionKey=function(a,b){var c=this;return c.execute(function(){String.prototype.isPrototypeOf(a)||"string"==typeof a||(a=a.toPacketlist()),c.worker.postMessage({event:"decrypt-session-key",privateKey:a,message:b})})},d.prototype.decryptAndVerifyMessage=function(a,b,c){var d=this,e=new Promise(function(e,f){a=a.toPacketlist(),b.length||(b=[b]),b=b.map(function(a){return a.toPacketlist()}),d.worker.postMessage({event:"decrypt-and-verify-message",privateKey:a,publicKeys:b,message:c}),d.tasks.push({resolve:function(a){a.signatures=a.signatures.map(function(a){return a.keyid=h.fromClone(a.keyid),a}),e(a)},reject:f})});return e},d.prototype.signClearMessage=function(a,b){var c=this;return c.execute(function(){a.length||(a=[a]),a=a.map(function(a){return a.toPacketlist()}),c.worker.postMessage({event:"sign-clear-message",privateKeys:a,text:b})})},d.prototype.verifyClearSignedMessage=function(a,b){var c=this,d=new Promise(function(d,e){a.length||(a=[a]),a=a.map(function(a){return a.toPacketlist()}),c.worker.postMessage({event:"verify-clear-signed-message",publicKeys:a,message:b}),c.tasks.push({resolve:function(a){a.signatures=a.signatures.map(function(a){return a.keyid=h.fromClone(a.keyid),a}),d(a)},reject:e})});return d},d.prototype.generateKeyPair=function(a){var b=this,c=new Promise(function(c,d){b.worker.postMessage({event:"generate-key-pair",options:a}),b.tasks.push({resolve:function(a){var b=f.List.fromStructuredClone(a.key);a.key=new g.Key(b),c(a)},reject:d})});return c},d.prototype.decryptKey=function(a,b){var c=this,d=new Promise(function(d,e){a=a.toPacketlist(),c.worker.postMessage({event:"decrypt-key",privateKey:a,password:b}),c.tasks.push({resolve:function(a){var b=f.List.fromStructuredClone(a);a=new g.Key(b),d(a)},reject:e})});return d},d.prototype.decryptKeyPacket=function(a,b,c){var d=this,e=new Promise(function(e,h){a=a.toPacketlist(),d.worker.postMessage({event:"decrypt-key-packet",privateKey:a,keyIds:b,password:c}),d.tasks.push({resolve:function(a){var b=f.List.fromStructuredClone(a);a=new g.Key(b),e(a)},reject:h})});return e},b.exports=d},{"../crypto":32,"../key.js":45,"../packet":53,"../type/keyid.js":71}]},{},[44])(44)}); \ No newline at end of file diff --git a/openpgp.worker.min.js b/openpgp.worker.min.js old mode 100755 new mode 100644 index 055a379..a9411ab --- a/openpgp.worker.min.js +++ b/openpgp.worker.min.js @@ -1 +1 @@ -/*! OpenPGPjs.org this is LGPL licensed code, see LICENSE/our website for more information.- v0.11.0-PM - 2015-04-21 */!function a(b,c,d){function e(g,h){if(!c[g]){if(!b[g]){var i="function"==typeof require&&require;if(!h&&i)return i(g,!0);if(f)return f(g,!0);throw new Error("Cannot find module '"+g+"'")}var j=c[g]={exports:{}};b[g][0].call(j.exports,function(a){var c=b[g][1][a];return e(c?c:a)},j,j.exports,a,b,c,d)}return c[g].exports}for(var f="function"==typeof require&&require,g=0;g\n" +"Language-Team: ProtonMail\n" +"Language: en\n" +"MIME-Version: 1.0\n" +"Content-Type: text/plain; charset=UTF-8\n" +"Content-Transfer-Encoding: 8bit\n" +"X-Generator: Poedit 1.8.7\n" +"Plural-Forms: nplurals=2; plural=(n != 1);\n" + +#. placeholder showing unread conversations +#: src/app/templates/partials/conversation-placeholder.tpl.html:43 +msgctxt "Title" +msgid "{{ $count }} conversation selected" +msgid_plural "{{ $count }} conversations selected" +msgstr[0] "{{ $count }} conversation selected" +msgstr[1] "{{ $count }} conversations selected" + +#. keys page to show the key size for an address +#: src/app/templates/views/keys.tpl.html:135 +#: src/app/templates/views/keys.tpl.html:39 +#: src/app/templates/views/keys.tpl.html:86 +msgid "{{ key.bitSize }} Bit" +msgstr "{{ key.bitSize }} Bit" + +#: src/app/templates/views/keys.tpl.html:37 +#: src/app/templates/views/keys.tpl.html:84 +msgid "{{ key.created | date }} - {{ key.fingerprint }}" +msgstr "{{ key.created | date }} - {{ key.fingerprint }}" + +#: src/app/templates/views/keys.tpl.html:132 +#: src/app/templates/views/keys.tpl.html:133 +msgid "{{ key.fingerprint }} ({{ key.created | date }})" +msgstr "{{ key.fingerprint }} ({{ key.created | date }})" + +#. space used out of total space allowed for a member +#: src/app/templates/views/members.tpl.html:91 +msgid "" +"{{ member.UsedSpace | humanSize }} of {{ member.MaxSpace | humanSize }} Used" +msgstr "" +"{{ member.UsedSpace | humanSize }} of {{ member.MaxSpace | humanSize }} Used" + +#: src/app/templates/partials/composer.tpl.html:191 +msgid "" +"{{ message.Attachments.length }} Files attached " +"({{ getAttachmentsSize(message) | humanSize }})" +msgstr "" +"{{ message.Attachments.length }} Files attached " +"({{ getAttachmentsSize(message) | humanSize }})" + +#. addresses page. how many addresses are in use +#: src/app/templates/views/addresses.tpl.html:8 +msgid "{{ organization.MaxAddresses }} addresses used." +msgstr "{{ organization.MaxAddresses }} addresses used." + +#. dashboard page. how many addresses exist for an organization as well as the total number allowed. +#: src/app/templates/views/dashboard.tpl.html:32 +msgid "{{ organization.UsedAddresses }} of {{ organization.MaxAddresses }}" +msgstr "{{ organization.UsedAddresses }} of {{ organization.MaxAddresses }}" + +#: src/app/templates/views/domains.tpl.html:14 +msgid "" +"{{ organization.UsedDomains }} / {{ organization.MaxDomains }} Domains used." +msgstr "" +"{{ organization.UsedDomains }} / {{ organization.MaxDomains }} Domains used." + +#. dashboard page. how many domains exist for an organization as well as the total number allowed. +#: src/app/templates/views/dashboard.tpl.html:21 +msgid "{{ organization.UsedDomains }} of {{ organization.MaxDomains }}" +msgstr "{{ organization.UsedDomains }} of {{ organization.MaxDomains }}" + +#. members page. how many members exist for an organization as well as the total number allowed. +#: src/app/templates/views/members.tpl.html:31 +msgid "{{ organization.UsedMembers }} of {{ organization.MaxMembers }} Used" +msgstr "{{ organization.UsedMembers }} of {{ organization.MaxMembers }} Used" + +#. show used storage for an account +#: src/app/templates/views/dashboard.tpl.html:43 +msgid "" +"{{ organization.UsedSpace | humanSize }} of {{ organization.MaxSpace | " +"humanSize }}" +msgstr "" +"{{ organization.UsedSpace | humanSize }} of {{ organization.MaxSpace | " +"humanSize }}" + +#. show used storage for an account +#: src/app/templates/views/dashboard.tpl.html:44 +msgid "{{ user.UsedSpace | humanSize }} of {{ user.MaxSpace | humanSize }}" +msgstr "{{ user.UsedSpace | humanSize }} of {{ user.MaxSpace | humanSize }}" + +#. price per month for a plan +#: src/app/templates/views/dashboard.tpl.html:217 +#: src/app/templates/views/dashboard.tpl.html:234 +msgid "/Month" +msgstr "/Month" + +#. copyright footer +#: src/app/templates/layout/login.tpl.html:8 +#: src/app/templates/layout/outside.tpl.html:9 +#: src/app/templates/views/step1.tpl.html:214 +msgid "© 2016 ProtonMail.com - Made globally, hosted in Switzerland." +msgstr "© 2016 ProtonMail.com - Made globally, hosted in Switzerland." + +#: src/app/templates/partials/conversation-list-columns.tpl.html:79 +#: src/app/templates/partials/conversation-list-rows.tpl.html:77 +msgid "+{{ (conversation.LabelIDs | labels).length - 4 }} More labels" +msgstr "+{{ (conversation.LabelIDs | labels).length - 4 }} More labels" + +#: src/app/templates/partials/message.tpl.html:55 +msgid "+{{ (message.LabelIDs | labels).length - 4 }} More labels" +msgstr "+{{ (message.LabelIDs | labels).length - 4 }} More labels" + +#. feature for upgrading from a free account to a paid account +#: src/app/templates/modals/monetize.tpl.html:36 +msgid "5GB Storage (instead of 500MB)" +msgstr "5GB Storage (instead of 500MB)" + +#: src/app/controllers/contacts.js:207 +msgid "A contact already exists for this email address." +msgstr "A contact already exists for this email address." + +#. Explain privacy issues for using img.ur to do screenshot uploading +#: src/app/templates/modals/bug.tpl.html:70 +msgctxt "Info" +msgid "" +"A screenshot of your current page will be sent to us automatically, so we " +"can help debug your problem! Screenshots are hosted using a 3rd party, " +"public service [imgur]." +msgstr "" +"A screenshot of your current page will be sent to us automatically, so we " +"can help debug your problem! Screenshots are hosted using a 3rd party, " +"public service [imgur]." + +#. upgrade page title +#: src/app/templates/views/upgrade.tpl.html:3 +msgctxt "Title" +msgid "Absolute security" +msgstr "Absolute security" + +#. custom domain menu +#. custom domain menu select dropdown +#: src/app/templates/partials/menu.settings.tpl.html:30 +#: src/app/templates/partials/menu.settings.tpl.html:6 +msgctxt "Nav" +msgid "Account" +msgstr "Account" + +#: src/app/controllers/secured.js:226 src/app/controllers/secured.js:31 +msgctxt "Title" +msgid "Account" +msgstr "Account" + +#. table heading +#. Table heading +#: src/app/templates/views/contacts.tpl.html:35 +#: src/app/templates/views/domains.tpl.html:139 +#: src/app/templates/views/domains.tpl.html:29 +#: src/app/templates/views/invoices.tpl.html:18 +#: src/app/templates/views/invoices.tpl.html:46 +#: src/app/templates/views/keys.tpl.html:121 +#: src/app/templates/views/keys.tpl.html:26 +#: src/app/templates/views/keys.tpl.html:73 +#: src/app/templates/views/members.tpl.html:74 +#: src/app/templates/views/payments.tpl.html:110 +#: src/app/templates/views/payments.tpl.html:18 +msgctxt "Title" +msgid "Actions" +msgstr "Actions" + +#. heading for active addresses listing +#: src/app/templates/views/addresses.tpl.html:18 +msgctxt "Title" +msgid "Active addresses" +msgstr "Active addresses" + +#. Tooltip +#: src/app/templates/partials/message.tpl.html:154 +msgid "Add" +msgstr "Add" + +#. button +#. contacts toolbar menu option +#: src/app/templates/modals/domain/address.tpl.html:30 +#: src/app/templates/modals/user/address.tpl.html:28 +#: src/app/templates/partials/toolbar-contacts.tpl.html:17 +#: src/app/templates/views/labels.tpl.html:5 +#: src/app/templates/views/payments.tpl.html:8 +msgctxt "Action" +msgid "Add" +msgstr "Add" + +#. label for adding a new custom domain +#: src/app/templates/modals/domain/domain.tpl.html:11 +msgid "Add a domain that you own to your ProtonMail account." +msgstr "Add a domain that you own to your ProtonMail account." + +#. add address button on members page +#. add address button on the domains page +#: src/app/templates/views/domains.tpl.html:130 +#: src/app/templates/views/members.tpl.html:98 +msgctxt "Action" +msgid "Add address" +msgstr "Add address" + +#. label for adding new address form +#: src/app/templates/modals/user/address.tpl.html:21 +msgctxt "Title" +msgid "Add address" +msgstr "Add address" + +#. payment modal add coupon button +#: src/app/templates/modals/payment/payment.tpl.html:159 +msgctxt "Action" +msgid "Add coupon" +msgstr "Add coupon" + +#. button to add custom domains +#: src/app/templates/views/domains.tpl.html:21 +#: src/app/templates/views/members.tpl.html:65 +msgctxt "Action" +msgid "Add custom domain" +msgstr "Add custom domain" + +#. addresses page +#: src/app/templates/views/addresses.tpl.html:13 +msgctxt "Action" +msgid "Add custom domain address" +msgstr "Add custom domain address" + +#: src/app/templates/modals/customizeInvoice.tpl.html:6 +msgctxt "Title" +msgid "Add invoice details" +msgstr "Add invoice details" + +#: src/app/controllers/contacts.js:203 +msgctxt "Action" +msgid "Add new contact" +msgstr "Add new contact" + +#: src/app/templates/directives/labels.tpl.html:35 +msgid "Add new label" +msgstr "Add new label" + +#. addresses page +#: src/app/templates/views/addresses.tpl.html:12 +msgctxt "Action" +msgid "Add new ProtonMail address" +msgstr "Add new ProtonMail address" + +#. heading for alias modal +#: src/app/templates/modals/alias.tpl.html:6 +msgctxt "Title" +msgid "Add new ProtonMail address" +msgstr "Add new ProtonMail address" + +#: src/app/templates/modals/user/address.tpl.html:3 +#: src/app/templates/modals/user/member.tpl.html:3 +msgctxt "Title" +msgid "Add user" +msgstr "Add user" + +#: src/app/templates/views/members.tpl.html:64 +msgctxt "Action" +msgid "Add user" +msgstr "Add user" + +#: src/app/templates/modals/customizeInvoice.tpl.html:7 +msgctxt "Info" +msgid "Add your name (or company name) and address to your invoices." +msgstr "Add your name (or company name) and address to your invoices." + +#. added addesses table label / heading +#: src/app/templates/modals/domain/address.tpl.html:34 +msgctxt "Title" +msgid "Added addresses" +msgstr "Added addresses" + +#. legend / form heading for adding custom CSS theme code +#: src/app/templates/views/appearance.tpl.html:99 +msgctxt "Title" +msgid "Additional themes (experimental)" +msgstr "Additional themes (experimental)" + +#. table heading +#. table heading for the domains page table listing of addresses +#: src/app/templates/modals/domain/address.tpl.html:38 +#: src/app/templates/modals/generate.tpl.html:28 +#: src/app/templates/partials/searchForm.tpl.html:57 +#: src/app/templates/views/domains.tpl.html:137 +msgctxt "Title" +msgid "Address" +msgstr "Address" + +#: src/app/templates/modals/alias.tpl.html:11 +#: src/app/templates/modals/domain/address.tpl.html:24 +#: src/app/templates/modals/payment/payment.tpl.html:21 +#: src/app/templates/modals/user/address.tpl.html:24 +#: src/app/templates/views/dashboard.tpl.html:185 +msgid "Address" +msgid_plural "Addresses" +msgstr[0] "Address" +msgstr[1] "Addresses" + +#: src/app/services/modal.js:1058 +msgid "Address added" +msgstr "Address added" + +#: src/app/services/modal.js:1066 src/app/services/modal.js:1069 +msgctxt "Error" +msgid "Address creation failed" +msgstr "Address creation failed" + +#: src/app/controllers/settings/addresses.js:173 +#: src/app/controllers/settings/domains.js:249 +msgid "Address deleted" +msgstr "Address deleted" + +#: src/app/controllers/settings/addresses.js:103 +#: src/app/controllers/settings/domains.js:298 +#: src/app/controllers/settings/members.js:181 +msgid "Address disabled" +msgstr "Address disabled" + +#: src/app/controllers/settings/addresses.js:80 +#: src/app/controllers/settings/domains.js:275 +msgid "Address enabled" +msgstr "Address enabled" + +#: src/app/controllers/settings/addresses.js:239 +msgid "Address order saved" +msgstr "Address order saved" + +#: src/app/controllers/settings/addresses.js:140 +msgid "Address updated" +msgstr "Address updated" + +#. page heading +#. table heading +#: src/app/templates/modals/domain/address.tpl.html:7 +#: src/app/templates/modals/user/address.tpl.html:39 +#: src/app/templates/views/addresses.tpl.html:9 +#: src/app/templates/views/dashboard.tpl.html:30 +#: src/app/templates/views/dashboard.tpl.html:77 +#: src/app/templates/views/members.tpl.html:73 +msgctxt "Title" +msgid "Addresses" +msgstr "Addresses" + +#: src/app/templates/views/domains.tpl.html:51 +msgctxt "Action" +msgid "Addresses" +msgstr "Addresses" + +#. custom domain menu +#: src/app/templates/modals/domain/menu.tpl.html:18 +#: src/app/templates/partials/menu.settings.tpl.html:21 +msgctxt "Nav" +msgid "Addresses" +msgstr "Addresses" + +#: src/app/templates/modals/user/address.tpl.html:33 +msgctxt "Title" +msgid "Addresses added" +msgstr "Addresses added" + +#: src/app/templates/views/domains.tpl.html:120 +msgid "Addresses used." +msgstr "Addresses used." + +#. DMARC status badge +#: src/app/templates/modals/domain/dmarc.tpl.html:9 +msgid "advanced" +msgstr "advanced" + +#: src/app/templates/views/security.tpl.html:18 +msgctxt "Action" +msgid "Advanced" +msgstr "Advanced" + +#: src/app/templates/partials/searchForm.tpl.html:3 +msgctxt "Action" +msgid "Advanced search" +msgstr "Advanced search" + +#: src/app/templates/directives/squire.tpl.html:37 +msgctxt "Action" +msgid "Align center" +msgstr "Align center" + +#: src/app/templates/directives/squire.tpl.html:32 +msgctxt "Action" +msgid "Align left" +msgstr "Align left" + +#: src/app/templates/directives/squire.tpl.html:42 +msgctxt "Action" +msgid "Align right" +msgstr "Align right" + +#. form option +#: src/app/controllers/header.js:160 src/app/controllers/header.js:21 +#: src/app/controllers/header.js:35 src/app/controllers/settings/invoices.js:20 +#: src/app/templates/partials/searchForm.tpl.html:68 +msgid "All" +msgstr "All" + +#. reset warning 2/3 +#: src/app/templates/views/reset-mailbox-password.tpl.html:6 +msgctxt "Info" +msgid "ALL OF YOUR DATA WILL BE LOST FOREVER!" +msgstr "ALL OF YOUR DATA WILL BE LOST FOREVER!" + +#: src/app/templates/modals/payment/payment.tpl.html:143 +msgctxt "Info" +msgid "" +"All PayPal orders are charged in US Dollar, click the link to change your " +"subscription to US Dollar." +msgstr "" +"All PayPal orders are charged in US Dollar, click the link to change your " +"subscription to US Dollar." + +#: src/app/templates/modals/dropzone.tpl.html:9 +msgctxt "Info" +msgid "" +"Allowed formats (UTF-8 encoding): .vcf, .csvNeed help?" +msgstr "" +"Allowed formats (UTF-8 encoding): .vcf, .csvNeed help?" + +#. link to login +#: src/app/templates/views/step1.tpl.html:74 +msgctxt "Action" +msgid "Already have an account?" +msgstr "Already have an account?" + +#: src/app/controllers/settings/dashboard.js:264 +msgctxt "Info" +msgid "Already subscribed" +msgstr "Already subscribed" + +#. Form checkbox option +#: src/app/templates/directives/labels.tpl.html:31 +msgid "Also archive" +msgstr "Also archive" + +#: src/app/templates/views/account.tpl.html:58 +msgctxt "Info" +msgid "Also used to reset a forgotten password." +msgstr "Also used to reset a forgotten password." + +#: src/app/templates/modals/donate.tpl.html:12 +msgid "Amount" +msgstr "Amount" + +#: src/app/templates/modals/pay.tpl.html:12 +msgctxt "Title" +msgid "Amount" +msgstr "Amount" + +#. invoice heading +#: src/app/templates/modals/pay.tpl.html:20 +#: src/app/templates/views/invoice.print.tpl.html:89 +msgctxt "Title" +msgid "Amount due" +msgstr "Amount due" + +#: src/app/templates/modals/payment/payment.tpl.html:50 +msgid "Amount due" +msgstr "Amount due" + +#: src/app/controllers/settings/dashboard.js:469 +msgctxt "Error" +msgid "Amount is different" +msgstr "Amount is different" + +#: src/app/templates/views/payments.tpl.html:106 +msgctxt "Title" +msgid "Amount Paid / Due" +msgstr "Amount Paid / Due" + +#: src/app/templates/views/step1.tpl.html:179 +msgctxt "Error" +msgid "" +"An error occured while trying to create your account. To see common problems " +"and solutions click here." +msgstr "" +"An error occurred while trying to create your account. To see common " +"problems and solutions click here." + +#. select dropdown options +#: src/app/templates/modals/bug.tpl.html:19 +msgid "Android" +msgstr "Android" + +#: src/app/templates/views/dashboard.tpl.html:83 +msgctxt "Title" +msgid "Annually" +msgstr "Annually" + +#: src/app/templates/views/invoices.tpl.html:27 +#: src/app/templates/views/invoices.tpl.html:55 +msgid "Annually" +msgstr "Annually" + +#. custom domain menu +#. custom domain menu select dropdown +#: src/app/templates/partials/menu.settings.tpl.html:15 +#: src/app/templates/partials/menu.settings.tpl.html:33 +msgctxt "Nav" +msgid "Appearance" +msgstr "Appearance" + +#: src/app/controllers/secured.js:235 src/app/controllers/secured.js:35 +msgctxt "Title" +msgid "Appearance" +msgstr "Appearance" + +#: src/app/templates/directives/labels.tpl.html:38 +#: src/app/templates/modals/payment/payment.tpl.html:169 +#: src/app/templates/modals/storage.tpl.html:24 +msgctxt "Action" +msgid "Apply" +msgstr "Apply" + +#. Folder name +#: src/app/templates/partials/sidebar-responsive.tpl.html:44 +#: src/app/templates/partials/sidebar.tpl.html:45 +msgctxt "Nav" +msgid "Archive" +msgstr "Archive" + +#. location tag +#: src/app/directives/move.js:22 +#: src/app/templates/directives/location-tag.tpl.html:7 +msgid "Archive" +msgstr "Archive" + +#. no results heading +#: src/app/controllers/secured.js:202 +#: src/app/templates/partials/no-results.tpl.html:21 +msgctxt "Title" +msgid "Archive" +msgstr "Archive" + +#. Antispam section of account creation +#: src/app/templates/views/step1.tpl.html:81 +msgctxt "Title" +msgid "Are you human?" +msgstr "Are you human?" + +#: src/app/controllers/settings/security.js:98 +msgid "Are you sure you want to clear all your logs?" +msgstr "Are you sure you want to clear all your logs?" + +#: src/app/controllers/settings/security.js:46 +msgctxt "Info" +msgid "Are you sure you want to clear all your logs?" +msgstr "Are you sure you want to clear all your logs?" + +#: src/app/controllers/contacts.js:133 +msgctxt "Info" +msgid "Are you sure you want to delete all your contacts?" +msgstr "Are you sure you want to delete all your contacts?" + +#: src/app/controllers/settings/addresses.js:169 +#: src/app/controllers/settings/domains.js:171 +#: src/app/controllers/settings/domains.js:245 +msgctxt "Info" +msgid "Are you sure you want to delete this address?" +msgstr "Are you sure you want to delete this address?" + +#: src/app/controllers/settings/labels.js:134 +msgctxt "Info" +msgid "Are you sure you want to delete this label?" +msgstr "Are you sure you want to delete this label?" + +#: src/app/controllers/settings/payments.js:97 +msgctxt "Info" +msgid "Are you sure you want to delete this payment method?" +msgstr "Are you sure you want to delete this payment method?" + +#: src/app/controllers/settings/addresses.js:98 +#: src/app/controllers/settings/domains.js:294 +msgid "Are you sure you want to disable this address?" +msgstr "Are you sure you want to disable this address?" + +#: src/app/controllers/settings/members.js:222 +msgid "Are you sure you want to remove this member?" +msgstr "Are you sure you want to remove this member?" + +#: src/app/controllers/settings/members.js:170 +msgid "Are you sure you want to unlink this address?" +msgstr "Are you sure you want to unlink this address?" + +#: src/app/controllers/conversations.js:891 +msgid "Are you sure?" +msgstr "Are you sure?" + +#. but report form heading label +#: src/app/templates/modals/bug.tpl.html:66 +msgctxt "Title" +msgid "Attach screenshot" +msgstr "Attach screenshot" + +#: src/app/templates/partials/attachments.tpl.html:5 +#: src/app/templates/views/message.print.tpl.html:54 +msgid "Attachment" +msgid_plural "Attachments" +msgstr[0] "Attachment" +msgstr[1] "Attachments" + +#: src/app/templates/partials/composer.tpl.html:194 +#: src/app/templates/views/outside.reply.tpl.html:37 +msgid "Attachments" +msgstr "Attachments" + +#. Search form option heading +#: src/app/templates/partials/searchForm.tpl.html:64 +msgctxt "Title" +msgid "Attachments" +msgstr "Attachments" + +#. logs page heading +#: src/app/templates/views/security.tpl.html:7 +msgctxt "Title" +msgid "Authentication Logs" +msgstr "Authentication Logs" + +#. form option +#: src/app/templates/views/account.tpl.html:241 +msgctxt "Action" +msgid "Auto" +msgstr "Auto" + +#. Section heading +#. Settings/Account page form heading for enabling or disabling autosave contacts +#: src/app/templates/views/account.tpl.html:206 +#: src/app/templates/views/account.tpl.html:209 +msgctxt "Title" +msgid "Automatically save contacts" +msgstr "Automatically save contacts" + +#: src/app/templates/partials/header-auth-simple.tpl.html:10 +msgctxt "Action" +msgid "Back to inbox" +msgstr "Back to inbox" + +#: src/app/templates/partials/toolbar-desktop.tpl.html:3 +#: src/app/templates/partials/toolbar-list-rows-responsive.tpl.html:4 +#: src/app/templates/partials/toolbar-list-rows.tpl.html:18 +#: src/app/templates/partials/toolbar-mobile.tpl.html:8 +msgctxt "Action" +msgid "Back to list" +msgstr "Back to list" + +#: src/app/templates/partials/header-no-auth.tpl.html:10 +msgctxt "Action" +msgid "Back to protonmail.com" +msgstr "Back to protonmail.com" + +#: src/app/templates/views/security.tpl.html:17 +msgctxt "Action" +msgid "Basic" +msgstr "Basic" + +#. printed message info +#: src/app/controllers/compose.js:1564 +#: src/app/templates/partials/message.tpl.html:117 +#: src/app/templates/views/message.print.tpl.html:46 +msgid "BCC" +msgstr "BCC" + +#: src/app/templates/partials/composer.tpl.html:153 +msgctxt "Title" +msgid "BCC" +msgstr "BCC" + +#: src/app/templates/modals/domain/mx.tpl.html:13 +msgctxt "Info" +msgid "" +"Before you can receive emails for your custom domain addresses at " +"ProtonMail, you need to add the following MX record to your DNS. This can " +"typically be done in the control panel of your domain name registrar." +msgstr "" +"Before you can receive emails for your custom domain addresses at " +"ProtonMail, you need to add the following MX record to your DNS. This can " +"typically be done in the control panel of your domain name registrar." + +#. payment status badge +#: src/app/templates/views/payments.tpl.html:133 +#: src/app/templates/views/payments.tpl.html:86 +msgid "Billed" +msgstr "Billed" + +#. invoice heading +#: src/app/templates/views/invoice.print.tpl.html:81 +msgctxt "Title" +msgid "Billing cycle" +msgstr "Billing cycle" + +#: src/app/templates/directives/squire.tpl.html:5 +msgctxt "Action" +msgid "Bold" +msgstr "Bold" + +#: src/app/templates/modals/bug.tpl.html:39 +#: src/app/templates/views/upgrade.tpl.html:41 +msgid "Browser" +msgstr "Browser" + +#: src/app/templates/modals/bug.tpl.html:36 +msgctxt "Title" +msgid "Browser" +msgstr "Browser" + +#: src/app/templates/modals/bug.tpl.html:45 +msgid "Browser version" +msgstr "Browser version" + +#: src/app/templates/modals/bug.tpl.html:42 +msgctxt "Title" +msgid "Browser version" +msgstr "Browser version" + +#: src/app/templates/modals/bug.tpl.html:71 +msgctxt "Info" +msgid "" +"Bug reports are not end-to-end encrypted, please do not send any sensitive " +"information." +msgstr "" +"Bug reports are not end-to-end encrypted, please do not send any sensitive " +"information." + +#: src/app/controllers/settings/appearance.js:120 +msgid "Buttons position saved" +msgstr "Buttons position saved" + +#: src/app/templates/modals/payment/payment.tpl.html:172 +#: src/app/templates/views/step1.tpl.html:71 +msgctxt "Info" +msgid "" +"By clicking Create Account, you agree to abide by ProtonMail's Terms and " +"Conditions." +msgstr "" +"By clicking Create Account, you agree to abide by ProtonMail’s Terms and " +"Conditions." + +#: src/app/controllers/compose.js:93 src/app/routes.js:462 +msgid "" +"By leaving now, you will lose what you have written in this email. You can " +"save a draft if you want to come back to it later on." +msgstr "" +"By leaving now, you will lose what you have written in this email. You can " +"save a draft if you want to come back to it later on." + +#. back to login page +#. cancel reset process +#: src/app/templates/modals/alias.tpl.html:23 +#: src/app/templates/modals/bug.tpl.html:78 +#: src/app/templates/modals/card.tpl.html:56 +#: src/app/templates/modals/confirm.tpl.html:13 +#: src/app/templates/modals/contact.tpl.html:29 +#: src/app/templates/modals/customizeInvoice.tpl.html:16 +#: src/app/templates/modals/deleteAccount.tpl.html:26 +#: src/app/templates/modals/dropzone.tpl.html:20 +#: src/app/templates/modals/generate.tpl.html:54 +#: src/app/templates/modals/identity.tpl.html:49 +#: src/app/templates/modals/label.tpl.html:34 +#: src/app/templates/modals/loginHelp.tpl.html:24 +#: src/app/templates/modals/loginPassword.tpl.html:14 +#: src/app/templates/modals/organizationRecovery.tpl.html:14 +#: src/app/templates/modals/pay.tpl.html:61 +#: src/app/templates/modals/payment/payment.tpl.html:178 +#: src/app/templates/modals/reactivate.tpl.html:16 +#: src/app/templates/modals/storage.tpl.html:23 +#: src/app/templates/modals/user/address.tpl.html:55 +#: src/app/templates/modals/user/member.tpl.html:53 +#: src/app/templates/partials/composer.tpl.html:120 +#: src/app/templates/partials/composer.tpl.html:87 +#: src/app/templates/views/outside.reply.tpl.html:36 +#: src/app/templates/views/reset-mailbox-password.tpl.html:11 +#: src/app/templates/views/reset-mailbox-password.tpl.html:50 +msgctxt "Action" +msgid "Cancel" +msgstr "Cancel" + +#. payment type badge +#: src/app/templates/views/payments.tpl.html:125 +#: src/app/templates/views/payments.tpl.html:68 +msgid "Cancellation" +msgstr "Cancellation" + +#: src/app/templates/modals/card.tpl.html:29 +#: src/app/templates/modals/donate.tpl.html:45 +#: src/app/templates/modals/payment/payment.tpl.html:101 +msgid "Card number" +msgstr "Card number" + +#: src/app/models/payments.js:264 +msgctxt "Error" +msgid "Card number invalid" +msgstr "Card number invalid" + +#: src/app/templates/modals/card.tpl.html:47 +#: src/app/templates/modals/donate.tpl.html:63 +#: src/app/templates/modals/payment/payment.tpl.html:119 +msgid "Card validation code" +msgstr "Card validation code" + +#: src/app/templates/partials/composer.tpl.html:149 +msgctxt "Title" +msgid "CC" +msgstr "CC" + +#. message metadata +#. printed message info +#: src/app/controllers/compose.js:1554 +#: src/app/templates/partials/message.tpl.html:103 +#: src/app/templates/views/message.print.tpl.html:39 +#: src/app/templates/views/outside.message.tpl.html:34 +msgid "CC" +msgstr "CC" + +#: src/app/templates/partials/composer.tpl.html:137 +#: src/app/templates/partials/composer.tpl.html:144 +msgid "CC BCC" +msgstr "CC BCC" + +#: src/app/templates/partials/toolbar-desktop.tpl.html:90 +#: src/app/templates/partials/toolbar-desktop.tpl.html:93 +#: src/app/templates/partials/toolbar-list-rows.tpl.html:5 +msgid "Change layout" +msgstr "Change layout" + +#: src/app/templates/modals/payment/payment.tpl.html:136 +#: src/app/templates/modals/payment/payment.tpl.html:140 +#: src/app/templates/modals/payment/payment.tpl.html:144 +msgctxt "Action" +msgid "Change subscription" +msgstr "Change subscription" + +#: src/app/templates/views/reset-mailbox-password.tpl.html:19 +msgctxt "Title" +msgid "Check your email" +msgstr "Check your email" + +#. select dropdown options +#: src/app/templates/modals/bug.tpl.html:16 +msgid "Choose" +msgstr "Choose" + +#: src/app/templates/modals/welcome.tpl.html:15 +msgid "Choose a display name" +msgstr "Choose a display name" + +#: src/app/templates/views/step1.tpl.html:37 +msgid "Choose a login password" +msgstr "Choose a login password" + +#: src/app/templates/views/step1.tpl.html:50 +msgid "Choose a mailbox password" +msgstr "Choose a mailbox password" + +#: src/app/templates/modals/alias.tpl.html:9 +msgctxt "Title" +msgid "Choose address" +msgstr "Choose address" + +#: src/app/templates/views/step1.tpl.html:22 +msgid "Choose username" +msgstr "Choose username" + +#: src/app/templates/views/appearance.tpl.html:56 +msgctxt "Info" +msgid "" +"Choose your prefered button order for marking messages as read / unread." +msgstr "" +"Choose your prefered button order for marking messages as read / unread." + +#: src/app/templates/views/appearance.tpl.html:94 +msgctxt "Action" +msgid "Clear" +msgstr "Clear" + +#: src/app/controllers/settings/security.js:45 +msgctxt "Title" +msgid "Clear" +msgstr "Clear" + +#. safari attachment instructions +#: src/app/templates/partials/safari.attachment.warning.tpl.html:16 +#: src/app/templates/partials/safari.warning.tpl.html:16 +msgid "" +"Click your attachment once to decrypt it. Once decryption finishes you will " +"see a download arrow icon appear." +msgstr "" +"Click your attachment once to decrypt it. Once decryption finishes you will " +"see a download arrow icon appear." + +#: src/app/templates/modals/alert.tpl.html:3 +#: src/app/templates/modals/alias.tpl.html:3 +#: src/app/templates/modals/bug.tpl.html:3 +#: src/app/templates/modals/card.tpl.html:4 +#: src/app/templates/modals/confirm.tpl.html:3 +#: src/app/templates/modals/contact.tpl.html:3 +#: src/app/templates/modals/customizeInvoice.tpl.html:3 +#: src/app/templates/modals/deleteAccount.tpl.html:3 +#: src/app/templates/modals/domain/address.tpl.html:3 +#: src/app/templates/modals/domain/address.tpl.html:53 +#: src/app/templates/modals/domain/dkim.tpl.html:3 +#: src/app/templates/modals/domain/dkim.tpl.html:50 +#: src/app/templates/modals/domain/dmarc.tpl.html:3 +#: src/app/templates/modals/domain/dmarc.tpl.html:47 +#: src/app/templates/modals/domain/domain.tpl.html:17 +#: src/app/templates/modals/domain/domain.tpl.html:3 +#: src/app/templates/modals/domain/mx.tpl.html:3 +#: src/app/templates/modals/domain/mx.tpl.html:56 +#: src/app/templates/modals/domain/spf.tpl.html:3 +#: src/app/templates/modals/domain/spf.tpl.html:48 +#: src/app/templates/modals/domain/verification.tpl.html:3 +#: src/app/templates/modals/domain/verification.tpl.html:52 +#: src/app/templates/modals/donate.tpl.html:3 +#: src/app/templates/modals/dropzone.tpl.html:3 +#: src/app/templates/modals/feedback.tpl.html:15 +#: src/app/templates/modals/feedback.tpl.html:3 +#: src/app/templates/modals/generate.tpl.html:3 +#: src/app/templates/modals/identity.tpl.html:3 +#: src/app/templates/modals/label.tpl.html:3 +#: src/app/templates/modals/loginHelp.tpl.html:3 +#: src/app/templates/modals/loginPassword.tpl.html:3 +#: src/app/templates/modals/monetize.tpl.html:3 +#: src/app/templates/modals/monetize.tpl.html:49 +#: src/app/templates/modals/organizationRecovery.tpl.html:3 +#: src/app/templates/modals/pay.tpl.html:3 +#: src/app/templates/modals/payment/modal.tpl.html:3 +#: src/app/templates/modals/payment/thanks.tpl.html:8 +#: src/app/templates/modals/reactivate.tpl.html:3 +#: src/app/templates/modals/storage.tpl.html:3 +#: src/app/templates/modals/support.tpl.html:14 +#: src/app/templates/modals/support.tpl.html:3 +#: src/app/templates/modals/user/modal.tpl.html:3 +#: src/app/templates/modals/welcome.tpl.html:3 +#: src/app/templates/partials/composer.tpl.html:40 +#: src/app/templates/partials/safari.attachment.warning.tpl.html:24 +#: src/app/templates/partials/safari.attachment.warning.tpl.html:6 +#: src/app/templates/partials/safari.attachment.warning.tpl.html:7 +#: src/app/templates/partials/safari.warning.tpl.html:24 +#: src/app/templates/partials/safari.warning.tpl.html:6 +#: src/app/templates/partials/safari.warning.tpl.html:7 +#: src/app/templates/partials/wizard.tpl.html:4 +msgctxt "Action" +msgid "Close" +msgstr "Close" + +#: src/app/templates/views/step1.tpl.html:144 +msgid "Code verification" +msgstr "Code verification" + +#: src/app/templates/modals/label.tpl.html:19 +msgctxt "Title" +msgid "Color" +msgstr "Color" + +#. form option +#: src/app/templates/views/appearance.tpl.html:35 +msgid "Column" +msgstr "Column" + +#: src/app/templates/modals/loginHelp.tpl.html:16 +msgctxt "Action" +msgid "Common login problems" +msgstr "Common login problems" + +#: src/app/templates/views/step1.tpl.html:160 +msgctxt "Action" +msgid "Complete setup" +msgstr "Complete setup" + +#. compose button in sidebar +#. contacts toolbar menu option +#: src/app/templates/partials/sidebar.tpl.html:5 +#: src/app/templates/partials/toolbar-contacts.tpl.html:23 +msgctxt "Action" +msgid "Compose" +msgstr "Compose" + +#: src/app/controllers/settings/appearance.js:74 +msgctxt "Info" +msgid "Compose mode saved" +msgstr "Compose mode saved" + +#: src/app/templates/partials/message.tpl.html:110 +#: src/app/templates/partials/message.tpl.html:124 +#: src/app/templates/partials/message.tpl.html:32 +#: src/app/templates/partials/message.tpl.html:96 +msgid "Compose to" +msgstr "Compose to" + +#: src/app/templates/views/appearance.tpl.html:10 +msgctxt "Title" +msgid "Composer" +msgstr "Composer" + +#: src/app/templates/modals/confirm.tpl.html:14 +#: src/app/templates/modals/identity.tpl.html:50 +msgctxt "Action" +msgid "Confirm" +msgstr "Confirm" + +#: src/app/controllers/settings/dashboard.js:314 +msgctxt "Title" +msgid "Confirm downgrade" +msgstr "Confirm downgrade" + +#: src/app/templates/modals/user/member.tpl.html:20 +#: src/app/templates/views/step1.tpl.html:41 +msgid "Confirm login password" +msgstr "Confirm login password" + +#: src/app/templates/views/reset-mailbox-password.tpl.html:42 +#: src/app/templates/views/step1.tpl.html:54 +msgid "Confirm mailbox password" +msgstr "Confirm mailbox password" + +#: src/app/templates/partials/composer.tpl.html:65 +msgctxt "Title" +msgid "Confirm message password" +msgstr "Confirm message password" + +#: src/app/templates/views/account.tpl.html:178 +msgid "Confirm new mailbox password" +msgstr "Confirm new mailbox password" + +#. form label / heading for confirming new login password +#: src/app/templates/views/account.tpl.html:119 +msgctxt "Title" +msgid "Confirm new password" +msgstr "Confirm new password" + +#: src/app/templates/views/account.tpl.html:122 +msgid "Confirm new password" +msgstr "Confirm new password" + +#: src/app/templates/partials/composer.tpl.html:68 +#: src/app/templates/views/reset-login-password.tpl.html:47 +msgid "Confirm password" +msgstr "Confirm password" + +#: src/app/controllers/conversations.js:890 +msgid "Confirmation" +msgstr "Confirmation" + +#: src/app/controllers/contacts.js:221 +msgid "Contact added" +msgstr "Contact added" + +#: src/app/controllers/contacts.js:247 +msgid "Contact edited" +msgstr "Contact edited" + +#: src/app/templates/modals/contact.tpl.html:23 +msgid "Contact email" +msgstr "Contact email" + +#: src/app/controllers/contacts.js:413 +msgid "Contact imported" +msgstr "Contact imported" + +#: src/app/templates/modals/contact.tpl.html:15 +msgid "Contact name" +msgstr "Contact name" + +#: src/app/templates/modals/support.tpl.html:6 +msgctxt "Title" +msgid "Contact us" +msgstr "Contact us" + +#: src/app/templates/modals/bug.tpl.html:72 +msgctxt "Info" +msgid "" +"Contact us at security@protonmail." +"com for critical security issues." +msgstr "" +"Contact us at security@protonmail." +"com for critical security issues." + +#: src/app/controllers/secured.js:220 +msgctxt "Title" +msgid "Contacts" +msgstr "Contacts" + +#. Folder name +#: src/app/templates/partials/sidebar-responsive.tpl.html:66 +msgctxt "Nav" +msgid "Contacts" +msgstr "Contacts" + +#: src/app/templates/partials/header-auth-desktop.tpl.html:38 +msgctxt "Action" +msgid "Contacts" +msgstr "Contacts" + +#: src/app/controllers/contacts.js:142 src/app/controllers/contacts.js:186 +msgid "Contacts deleted" +msgstr "Contacts deleted" + +#: src/app/controllers/contacts.js:415 +msgid "Contacts imported" +msgstr "Contacts imported" + +#: src/app/controllers/login.js:68 +msgctxt "Error" +msgid "" +"Cookies are disabled.\n" +"Please activate it and then reload the page.\n" +"More information here." +msgstr "" +"Cookies are disabled.\n" +"Please activate it and then reload the page.\n" +"More information here." + +#: src/app/templates/modals/payment/payment.tpl.html:165 +#: src/app/templates/modals/payment/payment.tpl.html:42 +msgid "Coupon" +msgstr "Coupon" + +#: src/app/services/modal.js:866 +msgid "Coupon accepted" +msgstr "Coupon accepted" + +#: src/app/templates/views/step1.tpl.html:72 +msgctxt "Action" +msgid "Create account" +msgstr "Create account" + +#: src/app/controllers/settings/labels.js:60 +msgctxt "Title" +msgid "Create new label" +msgstr "Create new label" + +#: src/app/templates/views/payments.tpl.html:109 +msgctxt "Title" +msgid "Create time" +msgstr "Create time" + +#: src/app/templates/views/step1.tpl.html:9 +msgctxt "Title" +msgid "Create your account" +msgstr "Create your account" + +#: src/app/templates/views/step1.tpl.html:176 +msgid "Creating account" +msgstr "Creating account" + +#: src/app/templates/views/reset-mailbox-password.tpl.html:56 +msgctxt "Title" +msgid "Creating new mailbox" +msgstr "Creating new mailbox" + +#: src/app/templates/views/step1.tpl.html:188 +msgid "Creating new user" +msgstr "Creating new user" + +#: src/app/templates/modals/pay.tpl.html:16 +#: src/app/templates/views/dashboard.tpl.html:88 +msgctxt "Title" +msgid "Credit" +msgstr "Credit" + +#. payment type badge +#: src/app/templates/modals/payment/payment.tpl.html:46 +#: src/app/templates/views/payments.tpl.html:126 +#: src/app/templates/views/payments.tpl.html:71 +msgid "Credit" +msgstr "Credit" + +#: src/app/services/modal.js:600 src/app/services/modal.js:605 +#: src/app/templates/modals/pay.tpl.html:30 +msgid "Credit card" +msgstr "Credit card" + +#: src/app/templates/views/dashboard.tpl.html:98 +msgctxt "Title" +msgid "Credit card" +msgstr "Credit card" + +#: src/app/templates/views/dashboard.tpl.html:126 +msgid "Currency" +msgstr "Currency" + +#: src/app/templates/views/account.tpl.html:145 +#: src/app/templates/views/account.tpl.html:49 +msgid "Current login password" +msgstr "Current login password" + +#. form heading for current login password +#. form label for entering current login password +#: src/app/templates/views/account.tpl.html:142 +#: src/app/templates/views/account.tpl.html:46 +msgctxt "Title" +msgid "Current login password" +msgstr "Current login password" + +#: src/app/templates/views/account.tpl.html:156 +msgid "Current mailbox password" +msgstr "Current mailbox password" + +#. form heading for current mailbox password +#: src/app/templates/views/account.tpl.html:153 +msgctxt "Title" +msgid "Current mailbox password" +msgstr "Current mailbox password" + +#. current login password for heading for changing login password +#: src/app/templates/views/account.tpl.html:97 +msgctxt "Title" +msgid "Current password" +msgstr "Current password" + +#: src/app/templates/views/account.tpl.html:100 +msgid "Current password" +msgstr "Current password" + +#: src/app/templates/views/domains.tpl.html:28 +msgctxt "Title" +msgid "Current status" +msgstr "Current status" + +#. form label +#: src/app/templates/modals/identity.tpl.html:18 +msgctxt "Title" +msgid "Custom" +msgstr "Custom" + +#: src/app/templates/modals/payment/payment.tpl.html:20 +#: src/app/templates/views/dashboard.tpl.html:174 +msgid "Custom domain" +msgid_plural "Custom domains" +msgstr[0] "Custom domain" +msgstr[1] "Custom domains" + +#: src/app/templates/views/keys.tpl.html:101 +msgctxt "Title" +msgid "Custom domain addresses" +msgstr "Custom domain addresses" + +#: src/app/templates/views/domains.tpl.html:123 +msgid "Custom domain addresses" +msgstr "Custom domain addresses" + +#: src/app/templates/views/appearance.tpl.html:88 +msgctxt "Title" +msgid "Custom theme" +msgstr "Custom theme" + +#: src/app/templates/views/appearance.tpl.html:90 +msgctxt "Info" +msgid "" +"Custom themes from third-parties can potentially betray your privacy. Only " +"use themes from trusted sources." +msgstr "" +"Custom themes from third-parties can potentially betray your privacy. Only " +"use themes from trusted sources." + +#: src/app/templates/views/payments.tpl.html:41 +msgctxt "Action" +msgid "Customize" +msgstr "Customize" + +#: src/app/templates/modals/customizeInvoice.tpl.html:10 +msgctxt "Title" +msgid "Customize invoices" +msgstr "Customize invoices" + +#: src/app/templates/modals/card.tpl.html:47 +#: src/app/templates/modals/donate.tpl.html:63 +#: src/app/templates/modals/payment/payment.tpl.html:119 +msgid "CVC" +msgstr "CVC" + +#: src/app/models/payments.js:286 +msgctxt "Error" +msgid "CVC invalid" +msgstr "CVC invalid" + +#. form heading for changing notification settings +#: src/app/templates/views/account.tpl.html:66 +msgctxt "Title" +msgid "Daily email notifications" +msgstr "Daily email notifications" + +#. custom domain menu +#. custom domain menu select dropdown +#: src/app/templates/partials/menu.settings.tpl.html:29 +#: src/app/templates/partials/menu.settings.tpl.html:3 +msgctxt "Nav" +msgid "Dashboard" +msgstr "Dashboard" + +#: src/app/controllers/secured.js:223 src/app/controllers/secured.js:30 +#: src/app/controllers/secured.js:34 +msgctxt "Title" +msgid "Dashboard" +msgstr "Dashboard" + +#. Table heading +#: src/app/templates/views/invoices.tpl.html:15 +#: src/app/templates/views/invoices.tpl.html:43 +msgctxt "Title" +msgid "Date" +msgstr "Date" + +#: src/app/templates/partials/toolbar-desktop.tpl.html:68 +#: src/app/templates/partials/toolbar-list-rows-responsive.tpl.html:110 +#: src/app/templates/partials/toolbar-list-rows.tpl.html:75 +msgctxt "Action" +msgid "Date: New to old" +msgstr "Date: New to old" + +#: src/app/templates/partials/toolbar-desktop.tpl.html:72 +#: src/app/templates/partials/toolbar-list-rows-responsive.tpl.html:114 +#: src/app/templates/partials/toolbar-list-rows.tpl.html:79 +msgctxt "Action" +msgid "Date: Old to new" +msgstr "Date: Old to new" + +#: src/app/filters/filters.js:33 +#: src/app/templates/partials/composer.tpl.html:112 +msgid "Days" +msgstr "Days" + +#: src/app/templates/views/outside.unlock.tpl.html:22 +msgid "Decrypt" +msgstr "Decrypt" + +#: src/app/templates/views/unlock.tpl.html:8 +msgctxt "Title" +msgid "Decrypt mailbox" +msgstr "Decrypt mailbox" + +#: src/app/templates/views/outside.unlock.tpl.html:7 +msgctxt "Title" +msgid "Decrypt message" +msgstr "Decrypt message" + +#: src/app/templates/views/outside.unlock.tpl.html:23 +#: src/app/templates/views/unlock.tpl.html:27 +msgid "Decrypting" +msgstr "Decrypting" + +#: src/app/templates/partials/message.tpl.html:248 +#: src/app/templates/views/outside.reply.tpl.html:28 +msgctxt "Error" +msgid "Decryption error" +msgstr "Decryption error" + +#: src/app/templates/partials/message.tpl.html:249 +#: src/app/templates/views/outside.reply.tpl.html:29 +msgctxt "Error" +msgid "Decryption of this message's encryption content failed." +msgstr "Decryption of this message’s encryption content failed." + +#: src/app/templates/views/addresses.tpl.html:29 +#: src/app/templates/views/members.tpl.html:95 +#: src/app/templates/views/payments.tpl.html:27 +msgid "Default" +msgstr "Default" + +#. form label +#: src/app/templates/modals/identity.tpl.html:13 +msgctxt "Title" +msgid "Default" +msgstr "Default" + +#. Account page heading +#: src/app/templates/views/account.tpl.html:10 +msgid "Default identity" +msgstr "Default identity" + +#: src/app/controllers/contacts.js:162 src/app/controllers/contacts.js:165 +msgctxt "Title" +msgid "Delete" +msgstr "Delete" + +#. contacts toolbar menu option +#: src/app/templates/modals/deleteAccount.tpl.html:25 +#: src/app/templates/partials/message.tpl.html:193 +#: src/app/templates/partials/toolbar-contacts.tpl.html:20 +#: src/app/templates/partials/toolbar-desktop.tpl.html:23 +#: src/app/templates/partials/toolbar-list-rows-responsive.tpl.html:25 +#: src/app/templates/partials/toolbar-list-rows-responsive.tpl.html:76 +#: src/app/templates/partials/toolbar-list-rows.tpl.html:38 +#: src/app/templates/partials/toolbar-mobile.tpl.html:54 +#: src/app/templates/views/addresses.tpl.html:58 +#: src/app/templates/views/contacts.tpl.html:53 +#: src/app/templates/views/domains.tpl.html:95 +#: src/app/templates/views/labels.tpl.html:17 +#: src/app/templates/views/payments.tpl.html:32 +msgctxt "Action" +msgid "Delete" +msgstr "Delete" + +#: src/app/templates/modals/deleteAccount.tpl.html:6 +#: src/app/templates/views/account.tpl.html:262 +msgctxt "Title" +msgid "Delete account" +msgstr "Delete account" + +#: src/app/controllers/settings/addresses.js:168 +#: src/app/controllers/settings/domains.js:244 +msgctxt "Title" +msgid "Delete address" +msgstr "Delete address" + +#: src/app/controllers/contacts.js:132 +msgctxt "Title" +msgid "Delete all" +msgstr "Delete all" + +#. contacts toolbar menu option +#: src/app/templates/partials/toolbar-contacts.tpl.html:7 +msgctxt "Action" +msgid "Delete all" +msgstr "Delete all" + +#: src/app/templates/modals/domain/mx.tpl.html:49 +msgctxt "Info" +msgid "" +"Delete any other MX records or make sure ProtonMail's Priority is the lowest " +"number." +msgstr "" +"Delete any other MX records or make sure ProtonMail’s Priority is the lowest " +"number." + +#: src/app/controllers/settings/domains.js:170 +msgctxt "Title" +msgid "Delete domain" +msgstr "Delete domain" + +#: src/app/templates/partials/composer.tpl.html:236 +msgid "Delete draft" +msgstr "Delete draft" + +#: src/app/controllers/settings/labels.js:133 +msgctxt "Title" +msgid "Delete label" +msgstr "Delete label" + +#: src/app/controllers/settings/payments.js:96 +msgctxt "Title" +msgid "Delete payment method" +msgstr "Delete payment method" + +#: src/app/templates/views/account.tpl.html:263 +msgctxt "Action" +msgid "Delete your account" +msgstr "Delete your account" + +#: src/app/templates/partials/conversation-placeholder.tpl.html:44 +msgctxt "Action" +msgid "Deselect all" +msgstr "Deselect all" + +#. logging page +#: src/app/controllers/settings/security.js:119 +#: src/app/controllers/settings/security.js:20 +#: src/app/templates/views/addresses.tpl.html:33 +#: src/app/templates/views/addresses.tpl.html:57 +msgctxt "Action" +msgid "Disable" +msgstr "Disable" + +#: src/app/controllers/settings/addresses.js:97 +#: src/app/controllers/settings/domains.js:293 +msgid "Disable address" +msgstr "Disable address" + +#. address state badge +#. form option +#: src/app/controllers/settings/security.js:105 +#: src/app/templates/views/account.tpl.html:221 +#: src/app/templates/views/addresses.tpl.html:49 +#: src/app/templates/views/domains.tpl.html:147 +#: src/app/templates/views/keys.tpl.html:16 +msgid "Disabled" +msgstr "Disabled" + +#. notification settings option +#: src/app/templates/views/account.tpl.html:76 +#: src/app/templates/views/keys.tpl.html:63 +msgctxt "Action" +msgid "Disabled" +msgstr "Disabled" + +#: src/app/templates/partials/composer.tpl.html:238 +msgctxt "Action" +msgid "Discard" +msgstr "Discard" + +#. displays invoice details as a PDF in new tab +#: src/app/templates/views/invoices.tpl.html:33 +#: src/app/templates/views/invoices.tpl.html:61 +msgctxt "Action" +msgid "Display invoice" +msgstr "Display invoice" + +#. display name heading on account page +#: src/app/templates/modals/identity.tpl.html:24 +#: src/app/templates/modals/identity.tpl.html:38 +#: src/app/templates/views/account.tpl.html:15 +msgctxt "Title" +msgid "Display name" +msgstr "Display name" + +#: src/app/templates/modals/welcome.tpl.html:21 +msgid "Display name" +msgstr "Display name" + +#: src/app/templates/modals/domain/menu.tpl.html:36 +msgctxt "Nav" +msgid "DKIM" +msgstr "DKIM" + +#: src/app/templates/modals/domain/dkim.tpl.html:11 +msgctxt "Title" +msgid "DKIM" +msgstr "DKIM" + +#: src/app/templates/modals/domain/menu.tpl.html:42 +msgctxt "Nav" +msgid "DMARC" +msgstr "DMARC" + +#: src/app/templates/modals/domain/domain.tpl.html:8 +#: src/app/templates/views/domains.tpl.html:27 +msgctxt "Title" +msgid "Domain" +msgstr "Domain" + +#: src/app/templates/modals/domain/menu.tpl.html:6 +msgctxt "Nav" +msgid "Domain" +msgstr "Domain" + +#: src/app/controllers/settings/domains.js:328 +msgid "Domain created" +msgstr "Domain created" + +#: src/app/controllers/settings/domains.js:175 +msgid "Domain deleted" +msgstr "Domain deleted" + +#: src/app/templates/modals/domain/domain.tpl.html:12 +msgid "Domain name" +msgstr "Domain name" + +#: src/app/services/modal.js:1062 +msgctxt "Error" +msgid "Domain not found" +msgstr "Domain not found" + +#: src/app/controllers/settings/domains.js:390 +msgid "Domain verified" +msgstr "Domain verified" + +#. invoice heading +#: src/app/controllers/secured.js:238 src/app/controllers/secured.js:36 +#: src/app/templates/views/dashboard.tpl.html:19 +#: src/app/templates/views/dashboard.tpl.html:73 +#: src/app/templates/views/domains.tpl.html:17 +#: src/app/templates/views/invoice.print.tpl.html:61 +msgctxt "Title" +msgid "Domains" +msgstr "Domains" + +#. custom domain menu +#: src/app/templates/partials/menu.settings.tpl.html:18 +msgctxt "Nav" +msgid "Domains" +msgstr "Domains" + +#: src/app/templates/modals/donate.tpl.html:6 +#: src/app/templates/views/dashboard.tpl.html:108 +msgctxt "Title" +msgid "Donate" +msgstr "Donate" + +#: src/app/templates/modals/donate.tpl.html:72 +#: src/app/templates/modals/monetize.tpl.html:27 +#: src/app/templates/views/dashboard.tpl.html:113 +msgctxt "Action" +msgid "Donate" +msgstr "Donate" + +#: src/app/templates/modals/monetize.tpl.html:11 +msgctxt "Title" +msgid "Donate to ProtonMail" +msgstr "Donate to ProtonMail" + +#. payment type badge +#: src/app/templates/views/payments.tpl.html:127 +#: src/app/templates/views/payments.tpl.html:74 +msgid "Donation" +msgstr "Donation" + +#. key generation progrss +#: src/app/templates/modals/generate.tpl.html:38 +#: src/app/templates/views/step1.tpl.html:204 +msgid "Done" +msgstr "Done" + +#: src/app/controllers/settings/dashboard.js:266 +msgctxt "Action" +msgid "Downgrade to Free" +msgstr "Downgrade to Free" + +#: src/app/controllers/settings/dashboard.js:274 +msgctxt "Action" +msgid "Downgrade to Plus" +msgstr "Downgrade to Plus" + +#: src/app/templates/partials/attachments.tpl.html:10 +msgid "Download" +msgstr "Download" + +#. contacts toolbar menu option +#: src/app/templates/partials/toolbar-contacts.tpl.html:10 +#: src/app/templates/views/payments.tpl.html:138 +#: src/app/templates/views/payments.tpl.html:95 +#: src/app/templates/views/security.tpl.html:10 +msgctxt "Action" +msgid "Download" +msgstr "Download" + +#. table heading +#: src/app/controllers/contacts.js:444 src/app/controllers/message.js:280 +#: src/app/templates/views/keys.tpl.html:120 +#: src/app/templates/views/keys.tpl.html:25 +#: src/app/templates/views/keys.tpl.html:72 +msgctxt "Title" +msgid "Download" +msgstr "Download" + +#: src/app/templates/views/keys.tpl.html:6 +msgctxt "Info" +msgid "" +"Download your PGP Keys for use with other PGP compatible services. Only " +"incoming messages in inline OpenPGP format are currently supported." +msgstr "" +"Download your PGP Keys for use with other PGP compatible services. Only " +"incoming messages in inline OpenPGP format are currently supported." + +#: src/app/templates/partials/safari.attachment.warning.tpl.html:9 +#: src/app/templates/partials/safari.warning.tpl.html:9 +msgctxt "Title" +msgid "Downloading" +msgstr "Downloading" + +#. location tag +#: src/app/templates/directives/location-tag.tpl.html:3 +#: src/app/templates/partials/message.tpl.html:135 +#: src/app/templates/partials/message.tpl.html:40 +msgid "Draft" +msgstr "Draft" + +#. Folder name +#: src/app/templates/partials/sidebar-responsive.tpl.html:23 +#: src/app/templates/partials/sidebar.tpl.html:21 +msgctxt "Nav" +msgid "Drafts" +msgstr "Drafts" + +#. no results heading +#: src/app/controllers/secured.js:193 +#: src/app/templates/partials/no-results.tpl.html:16 +msgctxt "Title" +msgid "Drafts" +msgstr "Drafts" + +#: src/app/controllers/compose.js:305 +msgctxt "Info" +msgid "Drop a file here to upload" +msgstr "Drop a file here to upload" + +#: src/app/controllers/contacts.js:238 +#: src/app/templates/views/contacts.tpl.html:52 +#: src/app/templates/views/labels.tpl.html:16 +#: src/app/templates/views/payments.tpl.html:31 +msgctxt "Action" +msgid "Edit" +msgstr "Edit" + +#: src/app/controllers/settings/addresses.js:127 +msgctxt "Title" +msgid "Edit address" +msgstr "Edit address" + +#: src/app/templates/views/addresses.tpl.html:32 +msgctxt "Action" +msgid "Edit identity" +msgstr "Edit identity" + +#: src/app/controllers/settings/labels.js:91 +msgctxt "Title" +msgid "Edit label" +msgstr "Edit label" + +#: src/app/templates/modals/contact.tpl.html:20 +#: src/app/templates/views/step1.tpl.html:87 +msgctxt "Title" +msgid "Email" +msgstr "Email" + +#. table heading / link to sort table +#: src/app/templates/views/contacts.tpl.html:27 +msgctxt "Action" +msgid "Email" +msgstr "Email" + +#: src/app/templates/modals/bug.tpl.html:50 +msgctxt "Title" +msgid "Email address" +msgstr "Email address" + +#: src/app/templates/views/step1.tpl.html:30 +msgctxt "Error" +msgid "Email already taken" +msgstr "Email already taken" + +#: src/app/templates/views/step1.tpl.html:31 +msgid "Email available" +msgstr "Email available" + +#: src/app/templates/views/account.tpl.html:232 +msgctxt "Title" +msgid "Email images" +msgstr "Email images" + +#: src/app/templates/modals/loginHelp.tpl.html:19 +msgctxt "Action" +msgid "Email our aupport team" +msgstr "Email our support team" + +#: src/app/templates/views/step1.tpl.html:105 +msgctxt "Title" +msgid "Email verification" +msgstr "Email verification" + +#: src/app/templates/views/step1.tpl.html:108 +msgid "Email verification" +msgstr "Email verification" + +#: src/app/templates/partials/toolbar-desktop.tpl.html:48 +#: src/app/templates/partials/toolbar-list-rows-responsive.tpl.html:90 +#: src/app/templates/partials/toolbar-list-rows.tpl.html:55 +msgctxt "Action" +msgid "Empty drafts" +msgstr "Empty drafts" + +#: src/app/templates/partials/toolbar-desktop.tpl.html:52 +#: src/app/templates/partials/toolbar-list-rows-responsive.tpl.html:94 +#: src/app/templates/partials/toolbar-list-rows.tpl.html:59 +msgctxt "Action" +msgid "Empty spam" +msgstr "Empty spam" + +#: src/app/templates/partials/toolbar-desktop.tpl.html:56 +#: src/app/templates/partials/toolbar-list-rows-responsive.tpl.html:98 +#: src/app/templates/partials/toolbar-list-rows.tpl.html:63 +msgctxt "Action" +msgid "Empty trash" +msgstr "Empty trash" + +#: src/app/templates/views/addresses.tpl.html:56 +#: src/app/templates/views/keys.tpl.html:142 +#: src/app/templates/views/keys.tpl.html:46 +#: src/app/templates/views/keys.tpl.html:93 +msgctxt "Action" +msgid "Enable" +msgstr "Enable" + +#. notification settings option +#: src/app/templates/views/account.tpl.html:71 +#: src/app/templates/views/keys.tpl.html:62 +msgctxt "Action" +msgid "Enabled" +msgstr "Enabled" + +#. form option +#: src/app/templates/views/account.tpl.html:215 +#: src/app/templates/views/addresses.tpl.html:28 +#: src/app/templates/views/domains.tpl.html:146 +#: src/app/templates/views/keys.tpl.html:15 +msgid "Enabled" +msgstr "Enabled" + +#: src/app/templates/partials/composer.tpl.html:49 +msgctxt "Title" +msgid "Encrypt for non-ProtonMail users" +msgstr "Encrypt for non-ProtonMail users" + +#: src/app/templates/partials/composer.tpl.html:83 +msgctxt "Info" +msgid "" +"Encrypted messages to non-ProtonMail recipients will expire in 28 days " +"unless a shorter expiration time is set." +msgstr "" +"Encrypted messages to non-ProtonMail recipients will expire in 28 days " +"unless a shorter expiration time is set." + +#: src/app/templates/partials/composer.tpl.html:248 +msgctxt "Action" +msgid "Encrypting" +msgstr "Encrypting" + +#: src/app/templates/partials/composer.tpl.html:206 +msgid "Encryption" +msgstr "Encryption" + +#: src/app/templates/partials/composer.tpl.html:218 +msgctxt "Title" +msgid "Encryption" +msgstr "Encryption" + +#: src/app/templates/partials/searchForm.tpl.html:48 +msgctxt "Title" +msgid "End date" +msgstr "End date" + +#: src/app/models/message.js:137 +msgid "End to end encrypted for outside" +msgstr "End to end encrypted for outside" + +#: src/app/models/message.js:140 +msgid "End to end encrypted for outside reply" +msgstr "End to end encrypted for outside reply" + +#: src/app/models/message.js:135 +msgid "End to end encrypted internal message" +msgstr "End to end encrypted internal message" + +#: src/app/models/message.js:141 +msgid "End to end encrypted using PGP" +msgstr "End to end encrypted using PGP" + +#: src/app/models/message.js:142 +msgid "End to end encrypted using PGP/MIME" +msgstr "End to end encrypted using PGP/MIME" + +#: src/app/controllers/settings/appearance.js:17 +msgid "English" +msgstr "English" + +#: src/app/templates/views/members.tpl.html:112 +msgid "Enter mailbox" +msgstr "Enter mailbox" + +#: src/app/templates/views/members.tpl.html:113 +msgctxt "Action" +msgid "Enter mailbox" +msgstr "Enter mailbox" + +#: src/app/templates/modals/reactivate.tpl.html:11 +msgid "Enter the key password:" +msgstr "Enter the key password:" + +#: src/app/templates/views/reset-mailbox-password.tpl.html:9 +msgid "Enter the word 'DANGER' here." +msgstr "Enter the word ‘DANGER’ here." + +#: src/app/templates/modals/deleteAccount.tpl.html:19 +msgctxt "Title" +msgid "Enter your login password to confirm your identity:" +msgstr "Enter your login password to confirm your identity:" + +#: src/app/templates/modals/loginPassword.tpl.html:9 +#: src/app/templates/modals/reactivate.tpl.html:9 +msgid "Enter your login password:" +msgstr "Enter your login password:" + +#. key generation progrss +#: src/app/templates/modals/generate.tpl.html:40 +msgctxt "Error" +msgid "Error" +msgstr "Error" + +#: src/app/templates/views/outside.unlock.tpl.html:30 +msgctxt "Title" +msgid "Error" +msgstr "Error" + +#: src/app/templates/modals/payment/payment.tpl.html:131 +msgctxt "Error" +msgid "Error connecting to PayPal." +msgstr "Error connecting to PayPal." + +#: src/app/controllers/settings/domains.js:337 +#: src/app/controllers/settings/domains.js:340 +msgctxt "Error" +msgid "Error during creation" +msgstr "Error during creation" + +#: src/app/controllers/settings/addresses.js:179 +#: src/app/controllers/settings/addresses.js:182 +#: src/app/controllers/settings/domains.js:182 +#: src/app/controllers/settings/domains.js:185 +#: src/app/controllers/settings/domains.js:256 +#: src/app/controllers/settings/domains.js:259 +#: src/app/controllers/settings/members.js:238 +#: src/app/controllers/settings/members.js:241 +msgctxt "Error" +msgid "Error during deletion" +msgstr "Error during deletion" + +#: src/app/controllers/settings/addresses.js:108 +#: src/app/controllers/settings/addresses.js:111 +#: src/app/controllers/settings/domains.js:304 +#: src/app/controllers/settings/domains.js:307 +msgctxt "Error" +msgid "Error during disable request" +msgstr "Error during disable request" + +#: src/app/controllers/settings/addresses.js:84 +#: src/app/controllers/settings/addresses.js:87 +#: src/app/controllers/settings/domains.js:280 +#: src/app/controllers/settings/domains.js:283 +msgctxt "Error" +msgid "Error during enable request" +msgstr "Error during enable request" + +#: src/app/controllers/settings/labels.js:115 +#: src/app/controllers/settings/labels.js:152 +#: src/app/controllers/settings/labels.js:156 +#: src/app/controllers/settings/labels.js:181 +#: src/app/controllers/settings/labels.js:185 +#: src/app/controllers/settings/labels.js:206 +#: src/app/controllers/settings/labels.js:210 +msgctxt "Error" +msgid "Error during label request" +msgstr "Error during label request" + +#: src/app/controllers/settings/dashboard.js:332 src/app/services/modal.js:692 +#: src/app/services/modal.js:695 +msgctxt "Error" +msgid "Error during organization request" +msgstr "Error during organization request" + +#: src/app/controllers/conversations.js:330 +msgctxt "Error" +msgid "Error during quering conversations" +msgstr "Error during quering conversations" + +#: src/app/controllers/message.js:207 +msgctxt "Error" +msgid "Error during the decryption of the message" +msgstr "Error during the decryption of the message" + +#: src/app/controllers/outside.js:154 +msgctxt "Error" +msgid "Error during the encryption" +msgstr "Error during the encryption" + +#: src/app/controllers/message.js:211 +msgctxt "Error" +msgid "Error during the getting message" +msgstr "Error during the getting message" + +#: src/app/controllers/settings/security.js:37 +msgctxt "Error" +msgid "Error during the initialization of logs" +msgstr "Error during the initialization of logs" + +#: src/app/controllers/outside.js:148 +msgctxt "Error" +msgid "Error during the reply process" +msgstr "Error during the reply process" + +#: src/app/controllers/settings/addresses.js:145 +#: src/app/controllers/settings/addresses.js:148 +#: src/app/controllers/settings/members.js:135 +#: src/app/controllers/settings/members.js:138 +#: src/app/controllers/settings/members.js:156 +#: src/app/controllers/settings/members.js:159 +msgctxt "Error" +msgid "Error during updating" +msgstr "Error during updating" + +#: src/app/controllers/settings/dashboard.js:349 +msgctxt "Error" +msgid "Error processing payment." +msgstr "Error processing payment." + +#: src/app/services/modal.js:1571 +msgctxt "Error" +msgid "Error while processing donation." +msgstr "Error while processing donation." + +#. Table heading +#: src/app/templates/views/invoices.tpl.html:16 +#: src/app/templates/views/invoices.tpl.html:44 +#: src/app/templates/views/security.tpl.html:33 +msgctxt "Title" +msgid "Event" +msgstr "Event" + +#: src/app/templates/modals/user/member.tpl.html:11 +msgid "ex: Thomas Anderson" +msgstr "ex: Thomas Anderson" + +#: src/app/templates/partials/composer.tpl.html:37 +msgctxt "Action" +msgid "Exit fullscreen" +msgstr "Exit fullscreen" + +#: src/app/templates/partials/composer.tpl.html:31 +msgctxt "Action" +msgid "Expand" +msgstr "Expand" + +#: src/app/templates/views/payments.tpl.html:16 +msgctxt "Title" +msgid "Expiration" +msgstr "Expiration" + +#: src/app/templates/partials/composer.tpl.html:232 +msgctxt "Action" +msgid "Expiration" +msgstr "Expiration" + +#: src/app/models/payments.js:275 +msgctxt "Error" +msgid "Expiration date invalid" +msgstr "Expiration date invalid" + +#: src/app/templates/partials/composer.tpl.html:95 +msgctxt "Title" +msgid "Expiration time" +msgstr "Expiration time" + +#: src/app/templates/partials/composer.tpl.html:220 +msgctxt "Action" +msgid "Expiration time" +msgstr "Expiration time" + +#: src/app/templates/views/outside.message.tpl.html:3 +msgid "Expiring in" +msgstr "Expiring in" + +#: src/app/models/message.js:136 src/app/models/message.js:138 +msgid "External message stored encrypted" +msgstr "External message stored encrypted" + +#: src/app/templates/modals/deleteAccount.tpl.html:16 +msgid "Feedback" +msgstr "Feedback" + +#: src/app/templates/modals/feedback.tpl.html:6 +msgctxt "Title" +msgid "Feedback form" +msgstr "Feedback form" + +#: src/app/templates/views/account.tpl.html:102 +#: src/app/templates/views/account.tpl.html:113 +#: src/app/templates/views/account.tpl.html:124 +#: src/app/templates/views/account.tpl.html:147 +#: src/app/templates/views/account.tpl.html:158 +msgctxt "Error" +msgid "Field required" +msgstr "Field required" + +#: src/app/templates/directives/move.tpl.html:2 +msgid "Filter" +msgstr "Filter" + +#: src/app/templates/directives/labels.tpl.html:6 +msgid "Filter labels" +msgstr "Filter labels" + +#. table heading +#: src/app/templates/views/keys.tpl.html:118 +#: src/app/templates/views/keys.tpl.html:23 +#: src/app/templates/views/keys.tpl.html:70 +msgctxt "Title" +msgid "Fingerprint" +msgstr "Fingerprint" + +#: src/app/templates/modals/domain/dmarc.tpl.html:46 +#: src/app/templates/partials/wizard.tpl.html:41 +#: src/app/templates/views/reset-mailbox-password.tpl.html:45 +msgctxt "Action" +msgid "Finish" +msgstr "Finish" + +#: src/app/controllers/conversations.js:918 +msgid "Folder emptied" +msgstr "Folder emptied" + +#: src/app/templates/modals/support.tpl.html:9 +msgid "" +"For a custom solution, contact our knowledgable entrprise sales team for a " +"quote." +msgstr "" +"For a custom solution, contact our knowledgable enterprise sales team for a " +"quote." + +#: src/app/templates/partials/safari.attachment.warning.tpl.html:21 +#: src/app/templates/partials/safari.warning.tpl.html:21 +msgctxt "Info" +msgid "For more help please contact us directly: support@protonmail.com" +msgstr "For more help please contact us directly: support@protonmail.com" + +#: src/app/templates/modals/domain/verification.tpl.html:14 +msgctxt "Info" +msgid "" +"For security reasons, we need to verify that you are the owner of your " +"domain. Please add the following code into your DNS. Do not remove " +"it even after successful verification. This can typically be done " +"in the control panel of your domain name registrar." +msgstr "" +"For security reasons, we need to verify that you are the owner of your " +"domain. Please add the following code into your DNS. Do not remove " +"it even after successful verification. This can typically be done " +"in the control panel of your domain name registrar." + +#. link to reset mailbox +#: src/app/templates/views/unlock.tpl.html:18 +msgctxt "Action" +msgid "Forgot password?" +msgstr "Forgot password?" + +#: src/app/templates/modals/loginHelp.tpl.html:13 +msgctxt "Action" +msgid "Forgot username?" +msgstr "Forgot username?" + +#: src/app/templates/partials/message.tpl.html:168 +msgctxt "Action" +msgid "Forward" +msgstr "Forward" + +#: src/app/templates/views/dashboard.tpl.html:205 +msgid "Free" +msgstr "Free" + +#: src/app/templates/partials/composer.tpl.html:127 +msgctxt "Title" +msgid "From" +msgstr "From" + +#. message metadata +#. printed message info +#: src/app/templates/partials/message.tpl.html:28 +#: src/app/templates/partials/searchForm.tpl.html:32 +#: src/app/templates/views/message.print.tpl.html:27 +#: src/app/templates/views/outside.message.tpl.html:23 +#: src/app/templates/views/outside.reply.tpl.html:14 +msgid "From" +msgstr "From" + +#: src/app/templates/partials/composer.tpl.html:34 +msgctxt "Action" +msgid "Fullscreen" +msgstr "Fullscreen" + +#: src/app/controllers/message.js:686 +msgid "Fw:" +msgstr "Fw:" + +#: src/app/controllers/settings/addresses.js:199 +#: src/app/controllers/settings/domains.js:223 +msgid "Generate key pair" +msgstr "Generate key pair" + +#: src/app/templates/modals/generate.tpl.html:55 +#: src/app/templates/views/members.tpl.html:107 +#: src/app/templates/views/members.tpl.html:108 +msgctxt "Action" +msgid "Generate keys" +msgstr "Generate keys" + +#: src/app/templates/views/addresses.tpl.html:54 +msgctxt "Action" +msgid "Generate missing keys" +msgstr "Generate missing keys" + +#: src/app/templates/views/keys.tpl.html:12 +msgid "Generate new key pair" +msgstr "Generate new key pair" + +#. link to generate new keys +#: src/app/templates/views/keys.tpl.html:107 +#: src/app/templates/views/keys.tpl.html:59 +msgctxt "Action" +msgid "Generate new key pair" +msgstr "Generate new key pair" + +#: src/app/templates/modals/generate.tpl.html:24 +msgctxt "Info" +msgid "" +"Generating 4096-bit encryption keys may crash or freeze your browser. 4096-" +"bit keys are only recommended for high performance computers - not " +"recommended for tablet and mobile devices." +msgstr "" +"Generating 4096-bit encryption keys may crash or freeze your browser. 4096-" +"bit keys are only recommended for high performance computers - not " +"recommended for tablet and mobile devices." + +#: src/app/templates/views/step1.tpl.html:184 +msgid "Generating keys" +msgstr "Generating keys" + +#: src/app/templates/views/step1.tpl.html:168 +msgid "Generating keys..." +msgstr "Generating keys…" + +#: src/app/templates/views/reset-mailbox-password.tpl.html:63 +msgid "Generating new key pair" +msgstr "Generating new key pair" + +#. MX status badge +#. SPF status badge +#. Verification status badge +#: src/app/templates/modals/domain/mx.tpl.html:9 +#: src/app/templates/modals/domain/spf.tpl.html:9 +#: src/app/templates/modals/domain/verification.tpl.html:9 +msgid "Good" +msgstr "Good" + +#. link for v2 +#: src/app/templates/views/login.tpl.html:31 +msgctxt "Action" +msgid "Having trouble? Use the old version (v2)" +msgstr "Having trouble? Use the old version (v2)" + +#: src/app/templates/modals/loginHelp.tpl.html:6 +msgctxt "Title" +msgid "Help" +msgstr "Help" + +#: src/app/templates/partials/header-auth-desktop.tpl.html:79 +msgctxt "Action" +msgid "Help & answers" +msgstr "Help & answers" + +#: src/app/templates/partials/wizard.tpl.html:33 +msgctxt "Title" +msgid "Help and support" +msgstr "Help and support" + +#: src/app/templates/modals/monetize.tpl.html:6 +msgctxt "Title" +msgid "Help us protect online privacy" +msgstr "Help us protect online privacy" + +#: src/app/templates/modals/domain/dmarc.tpl.html:13 +msgctxt "Info" +msgid "" +"Here is a basic DMARC record that does nothing except email you reports." +msgstr "" +"Here is a basic DMARC record that does nothing except email you reports." + +#: src/app/templates/partials/composer.tpl.html:189 +msgctxt "Action" +msgid "Hide" +msgstr "Hide" + +#: src/app/templates/partials/message.tpl.html:223 +msgctxt "Action" +msgid "Hide details" +msgstr "Hide details" + +#. form option heading +#: src/app/templates/modals/generate.tpl.html:14 +msgctxt "Title" +msgid "High security" +msgstr "High security" + +#. feature for upgrading from a free account to a paid account +#: src/app/templates/modals/monetize.tpl.html:37 +msgid "Higher message sending limits" +msgstr "Higher message sending limits" + +#. form option heading +#: src/app/templates/modals/generate.tpl.html:20 +msgctxt "Title" +msgid "Highest security" +msgstr "Highest security" + +#: src/app/templates/partials/composer.tpl.html:78 +msgid "Hint" +msgstr "Hint" + +#: src/app/templates/modals/domain/dkim.tpl.html:20 +#: src/app/templates/modals/domain/dkim.tpl.html:36 +#: src/app/templates/modals/domain/dmarc.tpl.html:17 +#: src/app/templates/modals/domain/dmarc.tpl.html:33 +#: src/app/templates/modals/domain/mx.tpl.html:19 +#: src/app/templates/modals/domain/mx.tpl.html:37 +#: src/app/templates/modals/domain/spf.tpl.html:19 +#: src/app/templates/modals/domain/spf.tpl.html:35 +#: src/app/templates/modals/domain/verification.tpl.html:20 +#: src/app/templates/modals/domain/verification.tpl.html:36 +msgctxt "Title" +msgid "Host name" +msgstr "Host name" + +#: src/app/filters/filters.js:33 +#: src/app/templates/partials/composer.tpl.html:117 +msgid "Hours" +msgstr "Hours" + +#. link to learn more +#. link to learn more about changing your mailbox password +#: src/app/templates/views/account.tpl.html:194 +#: src/app/templates/views/account.tpl.html:250 +#: src/app/templates/views/account.tpl.html:80 +msgctxt "Action" +msgid "How does this work?" +msgstr "How does this work?" + +#: src/app/templates/partials/header-auth-desktop.tpl.html:52 +msgctxt "Action" +msgid "I have a question" +msgstr "I have a question" + +#: src/app/templates/views/payments.tpl.html:105 +msgctxt "Title" +msgid "ID" +msgstr "ID" + +#: src/app/templates/modals/identity.tpl.html:6 +msgctxt "Title" +msgid "Identity" +msgstr "Identity" + +#: src/app/templates/views/addresses.tpl.html:55 +msgctxt "Action" +msgid "Identity" +msgstr "Identity" + +#: src/app/templates/modals/domain/mx.tpl.html:50 +msgctxt "Info" +msgid "" +"If this domain is currently actively receiving emails, create all used email " +"addresses in Step 3 before changing MX record to ensure a smooth transition." +msgstr "" +"If this domain is currently actively receiving emails, create all used email " +"addresses in Step 3 before changing MX record to ensure a smooth transition." + +#. reset warning 1/3 +#: src/app/templates/views/reset-mailbox-password.tpl.html:5 +msgctxt "Info" +msgid "If you forget your mailbox password, you can reset your account but..." +msgstr "If you forget your mailbox password, you can reset your account but…" + +#: src/app/templates/partials/wizard.tpl.html:35 +msgctxt "Info" +msgid "" +"If you have questions or need help, please visit our support page to find " +"troubleshooting guides and contact our support team. If you find a bug in " +"ProtonMail, please let us know! You can send us a bug report by clicking " +"Report bugs (1)" +msgstr "" +"If you have questions or need help, please visit our support page to find troubleshooting " +"guides and contact our support team. If you find a bug in ProtonMail, please " +"let us know! You can send us a bug report by clicking Report bugs " +"(1)" + +#: src/app/templates/modals/domain/dmarc.tpl.html:12 +msgctxt "Info" +msgid "" +"If you have set both SPF and DKIM, DMARC allows you to specify how other " +"email services should deliver email for your domain if both SPF and DKIM " +"checks have failed. This can make it harder for spammers pretending to be " +"you but may also cause delivery issues if not done properly. Feel free to " +"ignore and skip DMARC unless you really want strict policies such as " +"p=quarantine or p=reject. Learn more" +msgstr "" +"If you have set both SPF and DKIM, DMARC allows you to specify how other " +"email services should deliver email for your domain if both SPF and DKIM " +"checks have failed. This can make it harder for spammers pretending to be " +"you but may also cause delivery issues if not done properly. Feel free to " +"ignore and skip DMARC unless you really want strict policies such as " +"p=quarantine or p=reject. Learn more" + +#: src/app/templates/views/step1.tpl.html:58 +msgctxt "Info" +msgid "" +"If you lose your mailbox password, you won't be able to read your emails, we " +"cannot recover this password for you." +msgstr "" +"If you lose your mailbox password, you won’t be able to read your emails, we " +"cannot recover this password for you." + +#: src/app/templates/modals/domain/spf.tpl.html:43 +msgctxt "Info" +msgid "" +"If you want to keep an existing SPF record, you can just add include:" +"_spf.protonmail.ch to it after the v=spf1. Do not create " +"multiple SPF records." +msgstr "" +"If you want to keep an existing SPF record, you can just add include:" +"_spf.protonmail.ch to it after the v=spf1. Do not create " +"multiple SPF records." + +#: src/app/templates/modals/deleteAccount.tpl.html:11 +msgctxt "Info" +msgid "" +"If you wish to delete in order to combine this account with another one, do " +"NOT delete your account. You need to instead follow the procedure here." +msgstr "" +"If you wish to delete in order to combine this account with another one, do " +"NOT delete your account. You need to instead follow the procedure here." + +#. message label +#: src/app/templates/partials/message.tpl.html:132 +#: src/app/templates/partials/message.tpl.html:37 +msgid "In archive" +msgstr "In archive" + +#. message label +#: src/app/templates/partials/message.tpl.html:134 +#: src/app/templates/partials/message.tpl.html:39 +msgid "In spam" +msgstr "In spam" + +#. message label +#: src/app/templates/partials/message.tpl.html:133 +#: src/app/templates/partials/message.tpl.html:38 +msgid "In trash" +msgstr "In trash" + +#: src/app/templates/views/addresses.tpl.html:41 +msgctxt "Title" +msgid "Inactive addresses" +msgstr "Inactive addresses" + +#. location tag +#: src/app/directives/move.js:21 +#: src/app/templates/directives/location-tag.tpl.html:2 +msgid "Inbox" +msgstr "Inbox" + +#. no results heading +#: src/app/controllers/secured.js:190 +#: src/app/templates/partials/no-results.tpl.html:15 +msgctxt "Title" +msgid "Inbox" +msgstr "Inbox" + +#. Folder name +#: src/app/templates/partials/sidebar-responsive.tpl.html:16 +#: src/app/templates/partials/sidebar.tpl.html:13 +msgctxt "Nav" +msgid "Inbox" +msgstr "Inbox" + +#: src/app/templates/directives/squire.tpl.html:53 +#: src/app/templates/directives/squire.tpl.html:75 +msgctxt "Action" +msgid "Insert image" +msgstr "Insert image" + +#: src/app/templates/directives/squire.tpl.html:48 +msgctxt "Action" +msgid "Insert link" +msgstr "Insert link" + +#: src/app/templates/directives/squire.tpl.html:66 +msgid "Insert link" +msgstr "Insert link" + +#: src/app/services/modal.js:863 +msgctxt "Error" +msgid "Invalid coupon" +msgstr "Invalid coupon" + +#: src/app/templates/views/account.tpl.html:84 +#: src/app/templates/views/reset-login-password.tpl.html:9 +msgctxt "Error" +msgid "Invalid email." +msgstr "Invalid email." + +#: src/app/controllers/contacts.js:390 +msgctxt "Error" +msgid "Invalid file type" +msgstr "Invalid file type" + +#: src/app/templates/views/step1.tpl.html:67 +msgctxt "Error" +msgid "Invalid recovery email." +msgstr "Invalid recovery email." + +#: src/app/controllers/secured.js:244 +#: src/app/controllers/settings/invoices.js:16 +#: src/app/templates/views/payments.tpl.html:39 +msgctxt "Title" +msgid "Invoices" +msgstr "Invoices" + +#. select dropdown options +#: src/app/templates/modals/bug.tpl.html:18 +msgid "iOS" +msgstr "iOS" + +#: src/app/templates/views/security.tpl.html:34 +msgctxt "Title" +msgid "IP" +msgstr "IP" + +#: src/app/templates/modals/domain/verification.tpl.html:45 +msgctxt "Info" +msgid "It can take up to a day for DNS changes to update." +msgstr "It can take up to a day for DNS changes to update." + +#: src/app/templates/modals/donate.tpl.html:68 +msgctxt "Info" +msgid "" +"It's also possible to donate with PayPal or Bitcoin." +msgstr "" +"It’s also possible to donate with PayPal or Bitcoin." + +#: src/app/templates/directives/squire.tpl.html:10 +msgctxt "Action" +msgid "Italic" +msgstr "Italic" + +#: src/app/templates/views/reset-mailbox-password.tpl.html:44 +msgctxt "Info" +msgid "Keep this password safe - it cannot be recovered." +msgstr "Keep this password safe - it cannot be recovered." + +#: src/app/templates/modals/domain/dkim.tpl.html:45 +msgctxt "Info" +msgid "" +"Keep this record in your DNS for as long as you want to use DKIM. You can " +"change its Value to off to disable DKIM" +msgstr "" +"Keep this record in your DNS for as long as you want to use DKIM. You can " +"change its Value to off to disable DKIM" + +#: src/app/templates/modals/reactivate.tpl.html:12 +msgid "Key password" +msgstr "Key password" + +#. table heading +#: src/app/templates/views/keys.tpl.html:119 +#: src/app/templates/views/keys.tpl.html:24 +#: src/app/templates/views/keys.tpl.html:71 +msgctxt "Title" +msgid "Key size" +msgstr "Key size" + +#: src/app/templates/partials/searchForm.tpl.html:19 +msgid "Keywords" +msgstr "Keywords" + +#: src/app/templates/partials/searchForm.tpl.html:18 +msgctxt "Title" +msgid "Keywords" +msgstr "Keywords" + +#. no results heading +#: src/app/controllers/secured.js:216 +#: src/app/templates/partials/no-results.tpl.html:23 +msgctxt "Title" +msgid "Label" +msgstr "Label" + +#: src/app/controllers/settings/labels.js:71 +msgid "Label created" +msgstr "Label created" + +#: src/app/controllers/settings/labels.js:145 +msgid "Label deleted" +msgstr "Label deleted" + +#: src/app/controllers/settings/labels.js:107 +#: src/app/controllers/settings/labels.js:201 +msgid "Label edited" +msgstr "Label edited" + +#: src/app/templates/modals/label.tpl.html:14 +msgid "Label name" +msgstr "Label name" + +#: src/app/controllers/settings/labels.js:176 +msgid "Label order saved" +msgstr "Label order saved" + +#: src/app/templates/partials/sidebar.tpl.html:71 +msgctxt "Action" +msgid "Label settings" +msgstr "Label settings" + +#: src/app/models/payments.js:91 src/app/models/payments.js:98 +#: src/app/templates/partials/menu.settings.tpl.html:31 +#: src/app/templates/partials/toolbar-desktop.tpl.html:31 +#: src/app/templates/partials/toolbar-list-rows.tpl.html:42 +#: src/app/templates/partials/toolbar-mobile.tpl.html:64 +msgid "Labels" +msgstr "Labels" + +#: src/app/controllers/secured.js:229 src/app/controllers/secured.js:32 +msgctxt "Title" +msgid "Labels" +msgstr "Labels" + +#. custom domain menu +#: src/app/templates/partials/menu.settings.tpl.html:9 +msgctxt "Nav" +msgid "Labels" +msgstr "Labels" + +#: src/app/templates/partials/wizard.tpl.html:27 +msgctxt "Info" +msgid "" +"Labels are a powerful tool to manage your inbox. You can add and remove " +"labels from selected emails by clicking the Label button (1). You can also add, delete, and edit labels by clicking on Label " +"settings (2)." +msgstr "" +"Labels are a powerful tool to manage your inbox. You can add and remove " +"labels from selected emails by clicking the Label button (1). You can also add, delete, and edit labels by clicking on Label " +"settings (2)." + +#: src/app/services/actions.js:109 src/app/services/actions.js:552 +msgid "Labels saved" +msgstr "Labels saved" + +#: src/app/templates/views/appearance.tpl.html:30 +msgctxt "Title" +msgid "Layout" +msgstr "Layout" + +#: src/app/controllers/conversations.js:632 +#: src/app/controllers/settings/appearance.js:97 +msgid "Layout saved" +msgstr "Layout saved" + +#. learn more link +#: src/app/templates/modals/domain/dkim.tpl.html:16 +#: src/app/templates/modals/domain/dmarc.tpl.html:12 +#: src/app/templates/modals/domain/domain.tpl.html:11 +#: src/app/templates/modals/domain/mx.tpl.html:15 +#: src/app/templates/modals/domain/spf.tpl.html:15 +#: src/app/templates/modals/domain/verification.tpl.html:16 +#: src/app/templates/views/appearance.tpl.html:11 +#: src/app/templates/views/appearance.tpl.html:31 +#: src/app/templates/views/dashboard.tpl.html:124 +msgctxt "Action" +msgid "Learn more" +msgstr "Learn more" + +#: src/app/models/payments.js:92 +msgid "Limited support" +msgstr "Limited support" + +#: src/app/templates/directives/squire.tpl.html:62 +msgid "Link URL" +msgstr "Link URL" + +#. select dropdown options +#: src/app/templates/modals/bug.tpl.html:21 +msgid "Linux" +msgstr "Linux" + +#: src/app/templates/views/appearance.tpl.html:104 +msgctxt "Action" +msgid "Load classic theme" +msgstr "Load classic theme" + +#: src/app/templates/views/appearance.tpl.html:105 +msgctxt "Action" +msgid "Load edison theme" +msgstr "Load edison theme" + +#: src/app/templates/views/step1.tpl.html:200 +msgid "Loading new account" +msgstr "Loading new account" + +#: src/app/templates/views/appearance.tpl.html:101 +msgctxt "Info" +msgid "Loading themes will override your current theme!" +msgstr "Loading themes will override your current theme!" + +#: src/app/templates/modals/pay.tpl.html:48 +#: src/app/templates/modals/payment/payment.tpl.html:128 +#: src/app/templates/views/step1.tpl.html:155 +msgid "Loading..." +msgstr "Loading…" + +#: src/app/templates/partials/searchForm.tpl.html:22 +msgctxt "Title" +msgid "Location" +msgstr "Location" + +#: src/app/templates/partials/header-auth-simple.tpl.html:6 +#: src/app/templates/partials/header-no-auth.tpl.html:7 +#: src/app/templates/partials/sidebar-responsive.tpl.html:90 +msgctxt "Action" +msgid "Log out" +msgstr "Log out" + +#. auth log entry +#: src/app/templates/views/security.tpl.html:48 +msgid "Log out" +msgstr "Log out" + +#: src/app/controllers/settings/security.js:103 +#: src/app/controllers/settings/security.js:116 +msgid "Logging preference updated" +msgstr "Logging preference updated" + +#: src/app/controllers/secured.js:247 +msgctxt "Title" +msgid "Login" +msgstr "Login" + +#: src/app/templates/views/login.tpl.html:17 +msgctxt "Action" +msgid "Login" +msgstr "Login" + +#. authentication log record +#: src/app/templates/views/security.tpl.html:42 +msgctxt "Info" +msgid "Login failed" +msgstr "Login failed" + +#: src/app/templates/modals/deleteAccount.tpl.html:20 +#: src/app/templates/modals/loginPassword.tpl.html:10 +#: src/app/templates/modals/reactivate.tpl.html:10 +#: src/app/templates/modals/user/member.tpl.html:19 +msgid "Login password" +msgstr "Login password" + +#. change login password heading +#: src/app/templates/modals/user/member.tpl.html:16 +#: src/app/templates/views/account.tpl.html:93 +#: src/app/templates/views/step1.tpl.html:34 +msgctxt "Title" +msgid "Login password" +msgstr "Login password" + +#: src/app/templates/views/reset-login-password.tpl.html:38 +#: src/app/templates/views/step1.tpl.html:39 +msgctxt "Error" +msgid "Login password is required." +msgstr "Login password is required." + +#: src/app/templates/modals/loginPassword.tpl.html:6 +msgctxt "Title" +msgid "Login password required" +msgstr "Login password required" + +#. auth log entry +#: src/app/templates/views/security.tpl.html:45 +msgid "Login success" +msgstr "Login success" + +#: src/app/templates/partials/header-auth-desktop.tpl.html:81 +msgctxt "Action" +msgid "Logout" +msgstr "Logout" + +#: src/app/controllers/settings/security.js:58 +msgid "Logs cleared" +msgstr "Logs cleared" + +#. select dropdown options +#: src/app/templates/modals/bug.tpl.html:17 +msgid "Mac OSX" +msgstr "Mac OS X" + +#: src/app/templates/views/unlock.tpl.html:15 +msgid "Mailbox password" +msgstr "Mailbox password" + +#. form heading for changing mailbox password +#: src/app/templates/views/account.tpl.html:138 +#: src/app/templates/views/step1.tpl.html:47 +msgctxt "Title" +msgid "Mailbox password" +msgstr "Mailbox password" + +#: src/app/templates/views/step1.tpl.html:52 +msgctxt "Error" +msgid "Mailbox password is required." +msgstr "Mailbox password is required." + +#: src/app/templates/views/payments.tpl.html:30 +msgctxt "Action" +msgid "Make default" +msgstr "Make default" + +#: src/app/templates/views/keys.tpl.html:141 +#: src/app/templates/views/keys.tpl.html:45 +#: src/app/templates/views/keys.tpl.html:92 +msgctxt "Action" +msgid "Make primary" +msgstr "Make primary" + +#. Form checkbox option +#: src/app/templates/modals/user/member.tpl.html:45 +msgctxt "Action" +msgid "Make user private" +msgstr "Make user private" + +#: src/app/templates/views/dashboard.tpl.html:101 +#: src/app/templates/views/dashboard.tpl.html:25 +#: src/app/templates/views/dashboard.tpl.html:36 +#: src/app/templates/views/domains.tpl.html:151 +msgctxt "Action" +msgid "Manage" +msgstr "Manage" + +#: src/app/templates/views/members.tpl.html:102 +#: src/app/templates/views/members.tpl.html:103 +msgctxt "Action" +msgid "Manage passwords" +msgstr "Manage passwords" + +#: src/app/templates/modals/storage.tpl.html:6 +msgctxt "Title" +msgid "Manage storage" +msgstr "Manage storage" + +#: src/app/templates/partials/wizard.tpl.html:25 +msgctxt "Title" +msgid "Manage your email with labels" +msgstr "Manage your email with labels" + +#. form option +#: src/app/templates/views/account.tpl.html:246 +msgctxt "Action" +msgid "Manual" +msgstr "Manual" + +#: src/app/templates/partials/toolbar-desktop.tpl.html:12 +#: src/app/templates/partials/toolbar-desktop.tpl.html:15 +#: src/app/templates/partials/toolbar-list-rows-responsive.tpl.html:11 +#: src/app/templates/partials/toolbar-list-rows-responsive.tpl.html:17 +#: src/app/templates/partials/toolbar-list-rows-responsive.tpl.html:38 +#: src/app/templates/partials/toolbar-list-rows.tpl.html:26 +#: src/app/templates/partials/toolbar-list-rows.tpl.html:31 +#: src/app/templates/partials/toolbar-mobile.tpl.html:25 +msgctxt "Action" +msgid "Mark as read" +msgstr "Mark as read" + +#: src/app/templates/partials/toolbar-list-rows-responsive.tpl.html:37 +msgid "Mark as read" +msgstr "Mark as read" + +#: src/app/templates/views/appearance.tpl.html:59 +msgctxt "Action" +msgid "Mark as read / Mark as unread" +msgstr "Mark as read / Mark as unread" + +#: src/app/templates/partials/message.tpl.html:189 +#: src/app/templates/partials/toolbar-list-rows-responsive.tpl.html:24 +#: src/app/templates/partials/toolbar-list-rows-responsive.tpl.html:72 +msgctxt "Action" +msgid "Mark as spam" +msgstr "Mark as spam" + +#: src/app/templates/partials/message.tpl.html:185 +#: src/app/templates/partials/toolbar-desktop.tpl.html:11 +#: src/app/templates/partials/toolbar-desktop.tpl.html:16 +#: src/app/templates/partials/toolbar-list-rows-responsive.tpl.html:12 +#: src/app/templates/partials/toolbar-list-rows-responsive.tpl.html:16 +#: src/app/templates/partials/toolbar-list-rows-responsive.tpl.html:35 +#: src/app/templates/partials/toolbar-list-rows.tpl.html:27 +#: src/app/templates/partials/toolbar-list-rows.tpl.html:30 +#: src/app/templates/partials/toolbar-mobile.tpl.html:21 +msgctxt "Action" +msgid "Mark as unread" +msgstr "Mark as unread" + +#: src/app/templates/partials/toolbar-list-rows-responsive.tpl.html:34 +msgid "Mark as unread" +msgstr "Mark as unread" + +#: src/app/templates/views/appearance.tpl.html:66 +msgctxt "Action" +msgid "Mark as unread / Mark as read" +msgstr "Mark as unread / Mark as read" + +#: src/app/controllers/settings/members.js:24 +#: src/app/templates/views/members.tpl.html:83 +msgid "Master" +msgstr "Master" + +#. form option +#: src/app/templates/views/appearance.tpl.html:23 +msgid "Maximized" +msgstr "Maximized" + +#: src/app/controllers/compose.js:140 src/app/controllers/compose.js:562 +msgctxt "Error" +msgid "Maximum composer reached" +msgstr "" +"You’ve hit the limit on the number of composers you can have open at once." + +#. if an email is sent to you, we replace the email with this string +#: src/app/filters/filters.js:268 +msgid "Me" +msgstr "Me" + +#: src/app/controllers/settings/members.js:234 +msgid "Member removed" +msgstr "Member removed" + +#. invoice heading +#: src/app/templates/views/invoice.print.tpl.html:69 +msgctxt "Title" +msgid "Members" +msgstr "Members" + +#: src/app/controllers/compose.js:1530 +msgid "Message discarded" +msgstr "Message discarded" + +#: src/app/templates/partials/composer.tpl.html:57 +msgctxt "Title" +msgid "Message password" +msgstr "Message password" + +#: src/app/templates/views/outside.unlock.tpl.html:14 +msgid "Message password" +msgstr "Message password" + +#: src/app/controllers/compose.js:1166 +msgid "Message saved" +msgstr "Message saved" + +#: src/app/controllers/compose.js:1384 src/app/controllers/outside.js:144 +msgid "Message sent" +msgstr "Message sent" + +#: src/app/models/payments.js:90 src/app/models/payments.js:97 +msgid "Messages per day" +msgstr "Messages sent per day" + +#: src/app/templates/partials/composer.tpl.html:28 +msgctxt "Action" +msgid "Minimize" +msgstr "Minimize" + +#: src/app/filters/filters.js:33 +msgid "Minutes" +msgstr "Minutes" + +#. address state badge +#: src/app/templates/views/addresses.tpl.html:50 +#: src/app/templates/views/domains.tpl.html:148 +msgid "Missing keys" +msgstr "Missing keys" + +#: src/app/templates/modals/card.tpl.html:35 +#: src/app/templates/modals/donate.tpl.html:51 +#: src/app/templates/modals/payment/payment.tpl.html:107 +msgid "MM" +msgstr "MM" + +#: src/app/templates/partials/searchForm.tpl.html:44 +#: src/app/templates/partials/searchForm.tpl.html:51 +msgid "MM/DD/YYYY" +msgstr "MM/DD/YYYY" + +#: src/app/templates/modals/card.tpl.html:35 +#: src/app/templates/modals/donate.tpl.html:51 +#: src/app/templates/modals/monetize.tpl.html:33 +#: src/app/templates/modals/payment/payment.tpl.html:107 +#: src/app/templates/views/invoice.print.tpl.html:84 +msgid "Month" +msgid_plural "Months" +msgstr[0] "Month" +msgstr[1] "Months" + +#: src/app/templates/views/invoices.tpl.html:27 +#: src/app/templates/views/invoices.tpl.html:55 +msgid "Monthly" +msgstr "Monthly" + +#: src/app/templates/views/dashboard.tpl.html:82 +msgctxt "Title" +msgid "Monthly" +msgstr "Monthly" + +#: src/app/templates/partials/toolbar-desktop.tpl.html:44 +#: src/app/templates/partials/toolbar-list-rows-responsive.tpl.html:85 +#: src/app/templates/partials/toolbar-list-rows.tpl.html:51 +msgid "More" +msgstr "More" + +#: src/app/templates/partials/message.tpl.html:171 +msgctxt "Action" +msgid "More" +msgstr "More" + +#: src/app/templates/partials/toolbar-desktop.tpl.html:21 +#: src/app/templates/partials/toolbar-list-rows-responsive.tpl.html:23 +#: src/app/templates/partials/toolbar-list-rows-responsive.tpl.html:68 +#: src/app/templates/partials/toolbar-list-rows.tpl.html:36 +#: src/app/templates/partials/toolbar-mobile.tpl.html:46 +msgctxt "Action" +msgid "Move to archive" +msgstr "Move to archive" + +#: src/app/templates/partials/message.tpl.html:177 +#: src/app/templates/partials/toolbar-desktop.tpl.html:20 +#: src/app/templates/partials/toolbar-list-rows-responsive.tpl.html:22 +#: src/app/templates/partials/toolbar-list-rows-responsive.tpl.html:64 +#: src/app/templates/partials/toolbar-list-rows.tpl.html:35 +#: src/app/templates/partials/toolbar-mobile.tpl.html:42 +msgctxt "Action" +msgid "Move to inbox" +msgstr "Move to inbox" + +#: src/app/templates/partials/toolbar-desktop.tpl.html:22 +#: src/app/templates/partials/toolbar-list-rows.tpl.html:37 +#: src/app/templates/partials/toolbar-mobile.tpl.html:50 +msgctxt "Action" +msgid "Move to spam" +msgstr "Move to spam" + +#: src/app/templates/partials/message.tpl.html:181 +#: src/app/templates/partials/toolbar-desktop.tpl.html:19 +#: src/app/templates/partials/toolbar-list-rows-responsive.tpl.html:21 +#: src/app/templates/partials/toolbar-list-rows-responsive.tpl.html:60 +#: src/app/templates/partials/toolbar-list-rows.tpl.html:34 +#: src/app/templates/partials/toolbar-mobile.tpl.html:38 +msgctxt "Action" +msgid "Move to trash" +msgstr "Move to trash" + +#: src/app/templates/modals/domain/menu.tpl.html:24 +msgctxt "Nav" +msgid "MX" +msgstr "MX" + +#: src/app/templates/modals/domain/mx.tpl.html:10 +msgctxt "Title" +msgid "MX Record" +msgstr "MX Record" + +#: src/app/services/modal.js:635 +msgctxt "Title" +msgid "My organization" +msgstr "My organization" + +#: src/app/templates/views/dashboard.tpl.html:56 +msgctxt "Title" +msgid "My subscription" +msgstr "My subscription" + +#. table heading / link to sort table +#: src/app/templates/views/contacts.tpl.html:17 +msgctxt "Action" +msgid "Name" +msgstr "Name" + +#: src/app/templates/modals/contact.tpl.html:12 +#: src/app/templates/modals/label.tpl.html:11 +#: src/app/templates/modals/user/member.tpl.html:8 +msgctxt "Title" +msgid "Name" +msgstr "Name" + +#: src/app/templates/directives/labels.tpl.html:23 +msgid "Name" +msgstr "Name" + +#: src/app/templates/modals/card.tpl.html:14 +#: src/app/templates/modals/donate.tpl.html:30 +#: src/app/templates/modals/payment/payment.tpl.html:86 +msgid "Name on card" +msgstr "Name on card" + +#. safari attachment instructions +#: src/app/templates/partials/safari.attachment.warning.tpl.html:19 +#: src/app/templates/partials/safari.warning.tpl.html:19 +msgid "" +"Name your attachment from 'unknown' to the correct name, including the file " +"extension." +msgstr "" +"Name your attachment from ‘unknown’ to the correct name, including the file " +"extension." + +#. link for login help +#. link to support portal +#: src/app/templates/views/login.tpl.html:16 +#: src/app/templates/views/outside.unlock.tpl.html:19 +msgctxt "Action" +msgid "Need help?" +msgstr "Need help?" + +#: src/app/templates/views/account.tpl.html:164 +msgctxt "Title" +msgid "New mailbox password" +msgstr "New mailbox password" + +#: src/app/templates/views/account.tpl.html:167 +#: src/app/templates/views/reset-mailbox-password.tpl.html:39 +msgid "New mailbox password" +msgstr "New mailbox password" + +#: src/app/controllers/compose.js:1219 +msgctxt "Title" +msgid "New message" +msgstr "New message" + +#. form heading for new login password +#: src/app/templates/views/account.tpl.html:108 +msgctxt "Title" +msgid "New password" +msgstr "New password" + +#: src/app/templates/views/account.tpl.html:111 +msgid "New password" +msgstr "New password" + +#: src/app/templates/partials/toolbar-desktop.tpl.html:101 +#: src/app/templates/partials/toolbar-list-rows.tpl.html:12 +msgid "Next" +msgstr "Next" + +#: src/app/templates/directives/paginator.tpl.html:16 +#: src/app/templates/modals/domain/address.tpl.html:52 +#: src/app/templates/modals/domain/dkim.tpl.html:49 +#: src/app/templates/modals/domain/domain.tpl.html:18 +#: src/app/templates/modals/domain/domain.tpl.html:19 +#: src/app/templates/modals/domain/mx.tpl.html:55 +#: src/app/templates/modals/domain/spf.tpl.html:47 +#: src/app/templates/modals/domain/verification.tpl.html:51 +#: src/app/templates/modals/user/member.tpl.html:54 +#: src/app/templates/modals/welcome.tpl.html:29 +msgctxt "Action" +msgid "Next" +msgstr "Next" + +#: src/app/templates/partials/wizard.tpl.html:40 +msgctxt "Action" +msgid "Next tip" +msgstr "Next tip" + +#. form option +#: src/app/templates/partials/searchForm.tpl.html:76 +msgid "No" +msgstr "No" + +#: src/app/templates/partials/no-results.tpl.html:25 +msgctxt "Title" +msgid "No conversations" +msgstr "No conversations" + +#: src/app/templates/views/domains.tpl.html:110 +#: src/app/templates/views/domains.tpl.html:159 +msgid "No custom domain found" +msgstr "No custom domain found" + +#: src/app/controllers/contacts.js:332 +msgctxt "Error" +msgid "No files were selected" +msgstr "No files were selected" + +#: src/app/templates/directives/labels.tpl.html:3 +msgctxt "Info" +msgid "No labels" +msgstr "No labels" + +#: src/app/templates/views/security.tpl.html:28 +msgid "No logs yet" +msgstr "No logs yet" + +#: src/app/templates/partials/no-results.tpl.html:24 +msgctxt "Title" +msgid "No messages" +msgstr "No messages" + +#: src/app/templates/views/contacts.tpl.html:8 +msgctxt "Info" +msgid "No results for this search in your contacts list." +msgstr "No results for this search in your contacts list." + +#: src/app/controllers/compose.js:1229 +msgctxt "Title" +msgid "No subject" +msgstr "No subject" + +#: src/app/controllers/compose.js:1230 +msgctxt "Info" +msgid "No subject, send anyway?" +msgstr "No subject, send anyway?" + +#. informs the user about permanance of custom addresses +#: src/app/templates/views/addresses.tpl.html:15 +msgctxt "Info" +msgid "" +"Non-original @protonmail addresses can never be deleted " +"(only disabled). This means that once you create an address it will always " +"count towards your address limit. Custom domain addresses must be disabled " +"before they can be deleted. Custom domain addresses can only be deleted if " +"all messages associated with that address are deleted. Learn more about addresses here." +msgstr "" +"Non-original @protonmail addresses can never be deleted " +"(only disabled). This means that once you create an address it will always " +"count towards your address limit. Custom domain addresses must be disabled " +"before they can be deleted. Custom domain addresses can only be deleted if " +"all messages associated with that address are deleted. Learn more about addresses here." + +#: src/app/templates/views/dashboard.tpl.html:97 +msgctxt "Title" +msgid "None" +msgstr "None" + +#. DMARC status badge +#. MX status badge +#. SPF status badge +#. Verification status badge +#: src/app/templates/modals/domain/dkim.tpl.html:7 +#: src/app/templates/modals/domain/dmarc.tpl.html:7 +#: src/app/templates/modals/domain/mx.tpl.html:7 +#: src/app/templates/modals/domain/spf.tpl.html:7 +#: src/app/templates/modals/domain/verification.tpl.html:7 +msgid "Not set" +msgstr "Not set" + +#. dkim status badge +#. MX status badge +#. SPF status badge +#. Verification status badge +#: src/app/templates/modals/domain/dkim.tpl.html:8 +#: src/app/templates/modals/domain/mx.tpl.html:8 +#: src/app/templates/modals/domain/spf.tpl.html:8 +#: src/app/templates/modals/domain/verification.tpl.html:8 +msgid "Not set properly" +msgstr "Not set properly" + +#: src/app/templates/partials/toolbar-desktop.tpl.html:24 +#: src/app/templates/partials/toolbar-list-rows.tpl.html:39 +#: src/app/templates/partials/toolbar-mobile.tpl.html:58 +msgctxt "Action" +msgid "Not spam" +msgstr "Not spam" + +#: src/app/templates/views/account.tpl.html:57 +msgid "Notification email" +msgstr "Notification email" + +#. notifications heading on account page +#: src/app/templates/views/account.tpl.html:42 +msgid "Notifications" +msgstr "Notifications" + +#: src/app/templates/views/payments.tpl.html:15 +msgctxt "Title" +msgid "Number" +msgstr "Number" + +#: src/app/templates/partials/conversation-placeholder.tpl.html:3 +msgid "Number of unread conversations" +msgstr "Number of unread conversations" + +#: src/app/templates/views/members.tpl.html:29 +msgctxt "Title" +msgid "Number of users:" +msgstr "Number of users:" + +#. dkim status badge +#: src/app/templates/modals/domain/dkim.tpl.html:10 +msgid "Off" +msgstr "Off" + +#: src/app/templates/directives/labels.tpl.html:26 +#: src/app/templates/modals/alert.tpl.html:13 +msgctxt "Action" +msgid "OK" +msgstr "OK" + +#. dkim status badge +#: src/app/templates/modals/domain/dkim.tpl.html:9 +msgid "On" +msgstr "On" + +#: src/app/templates/modals/bug.tpl.html:11 +msgctxt "Title" +msgid "Operating system" +msgstr "Operating system" + +#: src/app/templates/modals/welcome.tpl.html:17 +#: src/app/templates/views/step1.tpl.html:62 +msgid "Optional" +msgstr "Optional" + +#. DMARC status badge +#: src/app/templates/modals/domain/dmarc.tpl.html:9 +msgid "" +"Optional, advanced" +msgstr "" +"Optional, advanced" + +#: src/app/templates/directives/squire.tpl.html:26 +msgctxt "Action" +msgid "Ordered list" +msgstr "Ordered list" + +#. invoice heading +#: src/app/templates/views/invoice.print.tpl.html:57 +#: src/app/templates/views/members.tpl.html:8 +msgctxt "Title" +msgid "Organization" +msgstr "Organization" + +#: src/app/templates/modals/user/member.tpl.html:47 +msgctxt "Info" +msgid "" +"Organization administrators cannot access the messages of private users." +msgstr "" +"Organization administrators cannot access the messages of private users." + +#: src/app/templates/views/invoices.tpl.html:11 +msgctxt "Title" +msgid "Organization history" +msgstr "Organization history" + +#: src/app/templates/views/members.tpl.html:17 +msgid "Organization name" +msgstr "Organization name" + +#: src/app/templates/views/members.tpl.html:13 +msgctxt "Title" +msgid "Organization name" +msgstr "Organization name" + +#: src/app/templates/modals/organizationRecovery.tpl.html:6 +msgctxt "Title" +msgid "Organization recovery password" +msgstr "Organization recovery password" + +#: src/app/templates/views/members.tpl.html:40 +msgctxt "Title" +msgid "Organization storage:" +msgstr "Organization storage:" + +#: src/app/controllers/settings/members.js:152 +msgid "Organization updated" +msgstr "Organization updated" + +#. address state badge +#: src/app/templates/views/addresses.tpl.html:51 +msgid "Orphan" +msgstr "Orphan" + +#: src/app/templates/modals/bug.tpl.html:31 +msgid "OS version" +msgstr "OS version" + +#: src/app/templates/modals/bug.tpl.html:28 +msgctxt "Title" +msgid "OS version" +msgstr "OS version" + +#. payment type badge +#. select dropdown options +#: src/app/templates/modals/bug.tpl.html:22 +#: src/app/templates/views/payments.tpl.html:123 +#: src/app/templates/views/payments.tpl.html:62 +msgid "Other" +msgstr "Other" + +#: src/app/templates/modals/monetize.tpl.html:18 +msgid "Other amount" +msgstr "Other amount" + +#. link to addresses page +#: src/app/templates/views/account.tpl.html:34 +msgctxt "Action" +msgid "Other identities" +msgstr "Other identities" + +#: src/app/templates/views/upgrade.tpl.html:6 +msgctxt "Info" +msgid "Our secure email requires a modern web browser." +msgstr "Our secure email requires a modern web browser." + +#: src/app/templates/views/dashboard.tpl.html:8 +msgctxt "Title" +msgid "Overview" +msgstr "Overview" + +#. current page dropdown in paginator +#: src/app/templates/directives/paginator.tpl.html:12 +msgid "Page" +msgstr "Page" + +#: src/app/templates/directives/paginator.tpl.html:6 +msgctxt "Action" +msgid "Page number" +msgstr "Page number" + +#. payment status badge +#: src/app/templates/views/payments.tpl.html:131 +#: src/app/templates/views/payments.tpl.html:80 +msgid "Paid" +msgstr "Paid" + +#: src/app/templates/partials/composer.tpl.html:60 +#: src/app/templates/views/login.tpl.html:13 +#: src/app/templates/views/reset-login-password.tpl.html:44 +msgid "Password" +msgstr "Password" + +#: src/app/templates/partials/composer.tpl.html:74 +msgctxt "Title" +msgid "Password hint" +msgstr "Password hint" + +#: src/app/controllers/login.js:120 +msgctxt "Error" +msgid "Passwords are limited to characters." +msgstr "Passwords are limited to characters." + +#: src/app/templates/views/reset-login-password.tpl.html:41 +#: src/app/templates/views/step1.tpl.html:43 +#: src/app/templates/views/step1.tpl.html:56 +msgctxt "Error" +msgid "Passwords don't match." +msgstr "Passwords don’t match." + +#: src/app/templates/views/appearance.tpl.html:91 +msgid "Paste your CSS code here (limited to 200,000 characters)" +msgstr "Paste your CSS code here (limited to 200,000 characters)" + +#: src/app/templates/views/payments.tpl.html:137 +#: src/app/templates/views/payments.tpl.html:92 +msgctxt "Action" +msgid "Pay" +msgstr "Pay" + +#: src/app/templates/modals/payment/payment.tpl.html:60 +msgctxt "Action" +msgid "Pay annually" +msgstr "Pay annually" + +#. form option +#: src/app/templates/views/dashboard.tpl.html:228 +msgid "Pay annually" +msgstr "Pay annually" + +#: src/app/templates/modals/pay.tpl.html:6 +msgctxt "Title" +msgid "Pay invoice" +msgstr "Pay invoice" + +#. form option +#: src/app/templates/views/dashboard.tpl.html:211 +msgid "Pay monthly" +msgstr "Pay monthly" + +#: src/app/templates/modals/payment/payment.tpl.html:3 +#: src/app/templates/modals/payment/process.tpl.html:3 +#: src/app/templates/views/dashboard.tpl.html:94 +msgctxt "Title" +msgid "Payment" +msgstr "Payment" + +#: src/app/templates/modals/card.tpl.html:7 +msgctxt "Title" +msgid "Payment details" +msgstr "Payment details" + +#: src/app/controllers/settings/payments.js:110 +msgid "Payment method deleted" +msgstr "Payment method deleted" + +#: src/app/controllers/settings/payments.js:84 +msgid "Payment method updated" +msgstr "Payment method updated" + +#: src/app/templates/views/payments.tpl.html:6 +msgctxt "Title" +msgid "Payment methods" +msgstr "Payment methods" + +#: src/app/controllers/secured.js:38 +msgctxt "Title" +msgid "Payments" +msgstr "Payments" + +#. custom domain menu +#. custom domain menu select dropdown +#: src/app/templates/partials/menu.settings.tpl.html:24 +#: src/app/templates/partials/menu.settings.tpl.html:34 +msgctxt "Nav" +msgid "Payments" +msgstr "Payments" + +#: src/app/templates/partials/wizard.tpl.html:17 +msgctxt "Title" +msgid "Personalize your layout" +msgstr "Personalize your layout" + +#. table heading +#: src/app/templates/modals/payment/payment.tpl.html:11 +#: src/app/templates/modals/payment/payment.tpl.html:18 +msgctxt "Title" +msgid "Plan" +msgstr "Plan" + +#: src/app/templates/views/invoices.tpl.html:27 +#: src/app/templates/views/invoices.tpl.html:55 +msgid "Plan subscription" +msgstr "Plan subscription" + +#: src/app/templates/views/dashboard.tpl.html:60 +msgctxt "Title" +msgid "Plan:" +msgstr "Plan:" + +#: src/app/templates/views/dashboard.tpl.html:122 +msgid "Plans and prices" +msgstr "Plans and prices" + +#: src/app/templates/modals/domain/dkim.tpl.html:15 +msgid "" +"Please add the follow TXT record. Note, DNS records can take several hours " +"to update." +msgstr "" +"Please add the follow TXT record. Note, DNS records can take several hours " +"to update." + +#: src/app/templates/modals/domain/mx.tpl.html:14 +msgctxt "Info" +msgid "" +"Please add the following MX record. Note, DNS records can take several hours " +"to update." +msgstr "" +"Please add the following MX record. Note, DNS records can take several hours " +"to update." + +#: src/app/templates/modals/domain/verification.tpl.html:15 +msgctxt "Info" +msgid "Please add the following TXT record:" +msgstr "Please add the following TXT record:" + +#: src/app/templates/modals/domain/spf.tpl.html:14 +msgctxt "Info" +msgid "" +"Please add the following TXT record. Note, DNS records can take several " +"hours to update." +msgstr "" +"Please add the following TXT record. Note, DNS records can take several " +"hours to update." + +#: src/app/templates/views/step1.tpl.html:116 +msgctxt "Info" +msgid "Please check your email and enter the code below:" +msgstr "Please check your email and enter the code below:" + +#: src/app/templates/modals/bug.tpl.html:61 +msgid "Please describe the problem and include any error messages" +msgstr "Please describe the problem and include any error messages" + +#: src/app/templates/modals/organizationRecovery.tpl.html:9 +msgid "Please enter your organization recovery password:" +msgstr "Please enter your organization recovery password:" + +#: src/app/controllers/login.js:110 +msgctxt "Error" +msgid "Please enter your username and password." +msgstr "Please enter your username and password." + +#: src/app/templates/modals/bug.tpl.html:53 +msgid "Please make sure to give us a way to contact you" +msgstr "Please make sure to give us a way to contact you" + +#: src/app/templates/modals/deleteAccount.tpl.html:15 +msgctxt "Title" +msgid "Please tell us why you are leaving:" +msgstr "Please tell us why you are leaving:" + +#: src/app/templates/views/appearance.tpl.html:15 +msgid "Popup" +msgstr "Popup" + +#: src/app/templates/directives/paginator.tpl.html:2 +#: src/app/templates/partials/toolbar-desktop.tpl.html:98 +#: src/app/templates/partials/toolbar-list-rows.tpl.html:9 +msgctxt "Action" +msgid "Previous" +msgstr "Previous" + +#. invoice heading +#. table heading +#. Table heading +#: src/app/templates/modals/payment/payment.tpl.html:12 +#: src/app/templates/views/invoice.print.tpl.html:73 +#: src/app/templates/views/invoices.tpl.html:17 +#: src/app/templates/views/invoices.tpl.html:45 +msgctxt "Title" +msgid "Price" +msgstr "Price" + +#: src/app/templates/views/keys.tpl.html:129 +#: src/app/templates/views/keys.tpl.html:34 +#: src/app/templates/views/keys.tpl.html:81 +msgid "Primary" +msgstr "Primary" + +#: src/app/templates/partials/message.tpl.html:215 +msgctxt "Action" +msgid "Print" +msgstr "Print" + +#: src/app/templates/modals/domain/mx.tpl.html:21 +#: src/app/templates/modals/domain/mx.tpl.html:45 +msgctxt "Title" +msgid "Priority" +msgstr "Priority" + +#. feature for upgrading from a free account to a paid account +#: src/app/templates/modals/monetize.tpl.html:38 +msgid "Priority customer support" +msgstr "Priority customer support" + +#: src/app/models/payments.js:113 +msgid "Priority support" +msgstr "Priority support" + +#. link to download key +#: src/app/templates/views/keys.tpl.html:138 +#: src/app/templates/views/keys.tpl.html:42 +#: src/app/templates/views/keys.tpl.html:89 +msgctxt "Action" +msgid "Private key" +msgstr "Private key" + +#: src/app/templates/modals/user/member.tpl.html:40 +msgctxt "Title" +msgid "Private user" +msgstr "Private user" + +#: src/app/templates/modals/payment/payment.tpl.html:38 +msgid "Proration" +msgstr "Proration" + +#: src/app/templates/modals/alias.tpl.html:19 +msgctxt "Info" +msgid "" +"ProtonMail address can never be deleted (only disabled). This means that " +"once you create an address it will always count towards your address limit. " +"Learn more about addresses here." +msgstr "" +"ProtonMail address can never be deleted (only disabled). This means that " +"once you create an address it will always count towards your address limit. " +"Learn more about addresses here." + +#: src/app/templates/views/keys.tpl.html:7 +msgctxt "Title" +msgid "ProtonMail addresses" +msgstr "ProtonMail addresses" + +#: src/app/templates/views/keys.tpl.html:54 +msgctxt "Title" +msgid "ProtonMail aliases" +msgstr "ProtonMail aliases" + +#: src/app/templates/partials/wizard.tpl.html:19 +msgctxt "Info" +msgid "" +"ProtonMail allows you to fully customize your inbox experience. By clicking " +"(1) you can quickly switch between two possible layouts. " +"You can set a default layout, set your composer style, adjust button " +"layouts, and even switch themes under Settings --> Appearance (2)" +msgstr "" +"ProtonMail allows you to fully customize your inbox experience. By clicking " +"(1) you can quickly switch between two possible layouts. " +"You can set a default layout, set your composer style, adjust button " +"layouts, and even switch themes under Settings —> Appearance (2)" + +#: src/app/templates/views/members.tpl.html:53 +msgctxt "Info" +msgid "" +"ProtonMail business accounts can create subaccounts which are used by other " +"members of your organization." +msgstr "" +"ProtonMail business accounts can create sub accounts which are used by other " +"members of your organization." + +#: src/app/templates/modals/monetize.tpl.html:10 +msgctxt "Info" +msgid "" +"ProtonMail is open source software that protects your privacy and doesn't " +"have ads. Your support is essential for keeping the service running." +msgstr "" +"ProtonMail is open source software that protects your privacy and doesn’t " +"have ads. Your support is essential for keeping the service running." + +#: src/app/templates/views/appearance.tpl.html:31 +msgctxt "Info" +msgid "" +"ProtonMail supports both column and row layouts for the inbox. Using this " +"setting, it is possible to change between the two layouts." +msgstr "" +"ProtonMail supports both column and row layouts for the inbox. Using this " +"setting, it is possible to change between the two layouts." + +#: src/app/templates/modals/domain/dkim.tpl.html:14 +msgid "" +"ProtonMail supports DKIM signing for custom domains! To use DKIM " +"authentication, please add the following TXT record into your DNS for this " +"domain. This can typically be done in the control panel of your domain name " +"registrar." +msgstr "" +"ProtonMail supports DKIM signing for custom domains! To use DKIM " +"authentication, please add the following TXT record into your DNS for this " +"domain. This can typically be done in the control panel of your domain name " +"registrar." + +#: src/app/templates/views/outside.message.tpl.html:25 +msgid "ProtonMail Verified" +msgstr "ProtonMail Verified" + +#. link to download key +#: src/app/templates/views/keys.tpl.html:137 +#: src/app/templates/views/keys.tpl.html:41 +#: src/app/templates/views/keys.tpl.html:88 +msgctxt "Action" +msgid "Public key" +msgstr "Public key" + +#. key generation progrss +#: src/app/templates/modals/generate.tpl.html:36 +msgid "Queued" +msgstr "Queued" + +#: src/app/controllers/settings/members.js:265 +msgid "Quota updated" +msgstr "Quota updated" + +#: src/app/controllers/message.js:685 +msgid "Re:" +msgstr "Re:" + +#: src/app/templates/modals/reactivate.tpl.html:6 +msgctxt "Title" +msgid "Reactivate key pair" +msgstr "Reactivate key pair" + +#: src/app/templates/views/step1.tpl.html:154 +msgctxt "Title" +msgid "reCAPTCHA verification" +msgstr "reCAPTCHA verification" + +#. printed message info +#: src/app/templates/views/message.print.tpl.html:13 +msgid "Received" +msgstr "Received" + +#: src/app/templates/partials/searchForm.tpl.html:35 +msgctxt "Title" +msgid "Recipient" +msgstr "Recipient" + +#: src/app/templates/partials/composer.tpl.html:135 +msgctxt "Title" +msgid "Recipients" +msgstr "Recipients" + +#: src/app/templates/modals/domain/dkim.tpl.html:11 +#: src/app/templates/modals/domain/spf.tpl.html:10 +msgid "Recommended" +msgstr "Recommended" + +#: src/app/templates/views/reset-login-password.tpl.html:15 +#: src/app/templates/views/step1.tpl.html:65 +msgid "Recovery email" +msgstr "Recovery email" + +#. form label for setting recovery email +#: src/app/templates/views/account.tpl.html:54 +#: src/app/templates/views/step1.tpl.html:61 +msgctxt "Title" +msgid "Recovery email" +msgstr "Recovery email" + +#: src/app/templates/views/reset-mailbox-password.tpl.html:73 +#: src/app/templates/views/step1.tpl.html:208 +msgid "Redirecting" +msgstr "Redirecting" + +#: src/app/templates/views/domains.tpl.html:22 +msgctxt "Action" +msgid "Refresh domain status" +msgstr "Refresh domain status" + +#: src/app/templates/directives/autocomplete.tpl.html:6 +msgctxt "Action" +msgid "Remove" +msgstr "Remove" + +#: src/app/templates/partials/composer.tpl.html:132 +msgid "Remove Attachments to change your From address." +msgstr "Remove Attachments to change your From address." + +#: src/app/templates/directives/squire.tpl.html:64 +msgctxt "Action" +msgid "Remove link" +msgstr "Remove link" + +#: src/app/controllers/settings/members.js:221 +msgctxt "Title" +msgid "Remove member" +msgstr "Remove member" + +#: src/app/templates/views/members.tpl.html:118 +msgctxt "Action" +msgid "Remove user" +msgstr "Remove user" + +#: src/app/templates/partials/message.tpl.html:162 +msgctxt "Action" +msgid "Reply" +msgstr "Reply" + +#: src/app/templates/partials/message.tpl.html:165 +msgctxt "Action" +msgid "Reply all" +msgstr "Reply all" + +#: src/app/templates/views/outside.message.tpl.html:11 +msgctxt "Action" +msgid "Reply securely" +msgstr "Reply securely" + +#: src/app/templates/partials/header-auth-desktop.tpl.html:56 +msgctxt "Action" +msgid "Report a bug" +msgstr "Report a bug" + +#: src/app/templates/partials/header-auth-desktop.tpl.html:47 +#: src/app/templates/partials/header-auth-simple.tpl.html:4 +#: src/app/templates/partials/header-no-auth.tpl.html:4 +#: src/app/templates/partials/sidebar-responsive.tpl.html:84 +msgctxt "Action" +msgid "Report bug" +msgstr "Report bug" + +#: src/app/templates/modals/bug.tpl.html:6 +msgctxt "Title" +msgid "Report bug" +msgstr "Report bug" + +#: src/app/templates/modals/domain/address.tpl.html:7 +#: src/app/templates/modals/domain/mx.tpl.html:10 +#: src/app/templates/modals/domain/verification.tpl.html:10 +msgid "Required" +msgstr "Required" + +#: src/app/templates/views/reset-mailbox-password.tpl.html:13 +msgctxt "Action" +msgid "Reset" +msgstr "Reset" + +#: src/app/templates/views/reset-login-password.tpl.html:4 +msgctxt "Info" +msgid "Reset login password" +msgstr "Reset login password" + +#. button to reset login password +#: src/app/templates/views/reset-login-password.tpl.html:17 +#: src/app/templates/views/reset-login-password.tpl.html:29 +#: src/app/templates/views/reset-login-password.tpl.html:49 +msgctxt "Action" +msgid "Reset login password" +msgstr "Reset login password" + +#: src/app/templates/views/reset-login-password.tpl.html:24 +#: src/app/templates/views/reset-login-password.tpl.html:36 +msgctxt "Title" +msgid "Reset login password" +msgstr "Reset login password" + +#: src/app/templates/views/reset-mailbox-password.tpl.html:34 +msgctxt "Title" +msgid "Reset mailbox" +msgstr "Reset mailbox" + +#: src/app/templates/views/reset-mailbox-password.tpl.html:27 +msgctxt "Action" +msgid "Reset mailbox" +msgstr "Reset mailbox" + +#: src/app/templates/views/reset-mailbox-password.tpl.html:14 +msgctxt "Action" +msgid "Reset now" +msgstr "Reset now" + +#: src/app/templates/modals/loginHelp.tpl.html:10 +msgctxt "Action" +msgid "Reset password" +msgstr "Reset password" + +#. safari attachment instructions +#: src/app/templates/partials/safari.attachment.warning.tpl.html:17 +#: src/app/templates/partials/safari.warning.tpl.html:17 +msgid "Right-click on your attachment and choose 'Download linked file as...'" +msgstr "Right-click on your attachment and choose ‘Download linked file as…’" + +#. table heading +#: src/app/templates/views/members.tpl.html:71 +msgctxt "Title" +msgid "Role" +msgstr "Role" + +#: src/app/controllers/settings/members.js:131 +msgid "Role updated" +msgstr "Role updated" + +#. form option +#: src/app/templates/views/appearance.tpl.html:43 +msgid "Row" +msgstr "Row" + +#: src/app/controllers/contacts.js:446 src/app/controllers/message.js:282 +msgctxt "Error" +msgid "" +"Safari does not fully support downloading contacts.

Please login " +"with a different browser to download contacts." +msgstr "" +"Safari does not fully support downloading contacts.

Please login " +"with a different browser to download contacts." + +#: src/app/templates/partials/safari.attachment.warning.tpl.html:12 +#: src/app/templates/partials/safari.warning.tpl.html:12 +msgctxt "Info" +msgid "Safari does not fully support downloading encrypted attachments." +msgstr "Safari does not fully support downloading encrypted attachments." + +#: src/app/templates/views/keys.tpl.html:5 +msgctxt "Error" +msgid "" +"Safari doesn't support downloading of keys. We are working on a fix for this." +msgstr "" +"Safari doesn’t support downloading of keys. We are working on a fix for this." + +#. save button for saving notification email +#. Save button for updating default identity on account page +#: src/app/templates/modals/contact.tpl.html:30 +#: src/app/templates/modals/label.tpl.html:35 +#: src/app/templates/partials/composer.tpl.html:240 +#: src/app/templates/partials/composer.tpl.html:242 +#: src/app/templates/views/account.tpl.html:131 +#: src/app/templates/views/account.tpl.html:187 +#: src/app/templates/views/account.tpl.html:35 +#: src/app/templates/views/account.tpl.html:60 +#: src/app/templates/views/appearance.tpl.html:95 +#: src/app/templates/views/members.tpl.html:20 +msgctxt "Action" +msgid "Save" +msgstr "Save" + +#: src/app/templates/modals/payment/payment.tpl.html:57 +msgid "Save 20% with the annual plan!" +msgstr "Save 20% with the annual plan!" + +#. key generation progrss +#: src/app/templates/modals/generate.tpl.html:39 +msgid "Saved" +msgstr "Saved" + +#: src/app/templates/partials/composer.tpl.html:234 +msgid "Saved at {{ message.Time | date : \"shortTime\" }}" +msgstr "Saved at {{ message.Time | date : \"shortTime\" }}" + +#: src/app/templates/partials/composer.tpl.html:249 +msgctxt "Action" +msgid "Saving" +msgstr "Saving" + +#: src/app/templates/views/reset-mailbox-password.tpl.html:68 +msgid "Saving encrypted keys" +msgstr "Saving encrypted keys" + +#. no results heading +#: src/app/templates/partials/no-results.tpl.html:22 +msgctxt "Title" +msgid "Search" +msgstr "Search" + +#: src/app/templates/partials/searchForm.tpl.html:86 +msgctxt "Action" +msgid "Search" +msgstr "Search" + +#: src/app/templates/partials/header-auth-desktop.tpl.html:10 +msgid "Search contacts" +msgstr "Search contacts" + +#: src/app/templates/partials/searchForm.tpl.html:6 +msgid "Search messages" +msgstr "Search messages" + +#: src/app/filters/filters.js:33 +msgid "Seconds" +msgstr "Seconds" + +#. custom domain menu +#. custom domain menu select dropdown +#: src/app/templates/partials/menu.settings.tpl.html:12 +#: src/app/templates/partials/menu.settings.tpl.html:32 +msgctxt "Nav" +msgid "Security" +msgstr "Security" + +#: src/app/controllers/secured.js:232 src/app/controllers/secured.js:33 +msgctxt "Title" +msgid "Security" +msgstr "Security" + +#: src/app/templates/partials/toolbar-desktop.tpl.html:8 +#: src/app/templates/partials/toolbar-list-rows-responsive.tpl.html:8 +#: src/app/templates/partials/toolbar-list-rows.tpl.html:23 +#: src/app/templates/partials/toolbar-mobile.tpl.html:4 +msgctxt "Action" +msgid "Select all messages" +msgstr "Select all messages" + +#: src/app/templates/modals/user/address.tpl.html:8 +msgctxt "Title" +msgid "Select domain" +msgstr "Select domain" + +#. form label +#: src/app/templates/modals/payment/payment.tpl.html:68 +msgctxt "Title" +msgid "Select payment method:" +msgstr "Select payment method:" + +#: src/app/templates/modals/feedback.tpl.html:16 +#: src/app/templates/partials/composer.tpl.html:245 +#: src/app/templates/views/outside.reply.tpl.html:38 +#: src/app/templates/views/step1.tpl.html:111 +#: src/app/templates/views/step1.tpl.html:135 +msgctxt "Action" +msgid "Send" +msgstr "Send" + +#: src/app/templates/views/step1.tpl.html:121 +#: src/app/templates/views/step1.tpl.html:147 +msgctxt "Action" +msgid "Send new code" +msgstr "Send new code" + +#: src/app/templates/partials/searchForm.tpl.html:31 +msgctxt "Title" +msgid "Sender" +msgstr "Sender" + +#: src/app/templates/partials/composer.tpl.html:247 +msgctxt "Action" +msgid "Sending" +msgstr "Sending" + +#. location tag +#. printed message info +#: src/app/templates/directives/location-tag.tpl.html:4 +#: src/app/templates/partials/message.tpl.html:136 +#: src/app/templates/partials/message.tpl.html:41 +#: src/app/templates/views/message.print.tpl.html:14 +msgid "Sent" +msgstr "Sent" + +#. Folder name +#: src/app/templates/partials/sidebar-responsive.tpl.html:30 +#: src/app/templates/partials/sidebar.tpl.html:29 +msgctxt "Nav" +msgid "Sent" +msgstr "Sent" + +#. no results heading +#: src/app/controllers/secured.js:196 +#: src/app/templates/partials/no-results.tpl.html:17 +msgctxt "Title" +msgid "Sent" +msgstr "Sent" + +#: src/app/templates/partials/composer.tpl.html:121 +#: src/app/templates/partials/composer.tpl.html:88 +msgctxt "Action" +msgid "Set" +msgstr "Set" + +#. DMARC status badge +#: src/app/templates/modals/domain/dmarc.tpl.html:8 +#: src/app/templates/modals/domain/domain.tpl.html:7 +msgid "Set" +msgstr "Set" + +#: src/app/templates/modals/storage.tpl.html:9 +msgctxt "Title" +msgid "Set user storage" +msgstr "Set user storage" + +#. Folder name +#: src/app/templates/partials/sidebar-responsive.tpl.html:78 +msgctxt "Nav" +msgid "Settings" +msgstr "Settings" + +#: src/app/templates/partials/header-auth-desktop.tpl.html:30 +msgctxt "Action" +msgid "Settings" +msgstr "Settings" + +#: src/app/templates/partials/composer.tpl.html:190 +msgctxt "Action" +msgid "Show" +msgstr "Show" + +#: src/app/templates/partials/toolbar-desktop.tpl.html:74 +#: src/app/templates/partials/toolbar-desktop.tpl.html:76 +#: src/app/templates/partials/toolbar-list-rows.tpl.html:83 +msgctxt "Action" +msgid "Show all" +msgstr "Show all" + +#: src/app/templates/partials/message.tpl.html:222 +msgctxt "Action" +msgid "Show details" +msgstr "Show details" + +#. show images in an email button +#: src/app/templates/partials/message.tpl.html:239 +#: src/app/templates/views/outside.message.tpl.html:42 +msgctxt "Action" +msgid "Show images" +msgstr "Show images" + +#: src/app/templates/views/account.tpl.html:236 +msgctxt "Title" +msgid "Show images" +msgstr "Show images" + +#: src/app/directives/transformation.js:47 +msgctxt "Title" +msgid "Show previous message" +msgstr "Show previous message" + +#: src/app/templates/partials/toolbar-desktop.tpl.html:84 +#: src/app/templates/partials/toolbar-list-rows.tpl.html:91 +msgctxt "Action" +msgid "Show read" +msgstr "Show read" + +#: src/app/templates/partials/toolbar-desktop.tpl.html:80 +#: src/app/templates/partials/toolbar-list-rows.tpl.html:87 +msgctxt "Action" +msgid "Show unread" +msgstr "Show unread" + +#: src/app/templates/views/step1.tpl.html:177 +msgctxt "Error" +msgid "Sign up failed" +msgstr "Sign up failed" + +#. link for account creation +#: src/app/templates/partials/header-no-auth.tpl.html:6 +#: src/app/templates/views/login.tpl.html:23 +msgctxt "Action" +msgid "Sign up for free" +msgstr "Sign up for free" + +#. Signature heading on account page +#: src/app/templates/modals/identity.tpl.html:30 +#: src/app/templates/modals/identity.tpl.html:42 +#: src/app/templates/views/account.tpl.html:25 +msgctxt "Title" +msgid "Signature" +msgstr "Signature" + +#: src/app/templates/partials/toolbar-desktop.tpl.html:64 +#: src/app/templates/partials/toolbar-list-rows-responsive.tpl.html:106 +#: src/app/templates/partials/toolbar-list-rows.tpl.html:71 +msgctxt "Action" +msgid "Size: Large to small" +msgstr "Size: Large to small" + +#: src/app/templates/partials/toolbar-desktop.tpl.html:60 +#: src/app/templates/partials/toolbar-list-rows-responsive.tpl.html:102 +#: src/app/templates/partials/toolbar-list-rows.tpl.html:67 +msgctxt "Action" +msgid "Size: Small to large" +msgstr "Size: Small to large" + +#: src/app/templates/views/step1.tpl.html:99 +msgctxt "Title" +msgid "SMS" +msgstr "SMS" + +#: src/app/templates/views/step1.tpl.html:129 +msgctxt "Title" +msgid "SMS verification" +msgstr "SMS verification" + +#: src/app/controllers/signup.js:211 +msgctxt "Error" +msgid "Something went wrong" +msgstr "Something went wrong" + +#: src/app/templates/views/outside.unlock.tpl.html:31 +msgctxt "Error" +msgid "Sorry, this message does not exist or has already expired" +msgstr "Sorry, this message does not exist or has already expired" + +#. invoice heading +#: src/app/templates/views/invoice.print.tpl.html:65 +msgctxt "Title" +msgid "Space" +msgstr "Space" + +#. location tag +#: src/app/directives/move.js:23 +#: src/app/templates/directives/location-tag.tpl.html:6 +msgid "Spam" +msgstr "Spam" + +#. Folder name +#: src/app/templates/partials/sidebar-responsive.tpl.html:51 +#: src/app/templates/partials/sidebar.tpl.html:53 +msgctxt "Nav" +msgid "Spam" +msgstr "Spam" + +#. no results heading +#: src/app/controllers/secured.js:205 +#: src/app/templates/partials/no-results.tpl.html:19 +msgctxt "Title" +msgid "Spam" +msgstr "Spam" + +#: src/app/templates/modals/domain/menu.tpl.html:30 +msgctxt "Nav" +msgid "SPF" +msgstr "SPF" + +#: src/app/templates/modals/domain/spf.tpl.html:10 +msgctxt "Title" +msgid "SPF" +msgstr "SPF" + +#: src/app/templates/modals/domain/spf.tpl.html:13 +msgctxt "Info" +msgid "" +"SPF is used to specify who is allowed to send email for the domain so we " +"strongly recommend including ProtonMail in your SPF record. Please add the " +"following TXT record into your DNS. This can typically be done in the " +"control panel of your domain name registrar." +msgstr "" +"SPF is used to specify who is allowed to send email for the domain so we " +"strongly recommend including ProtonMail in your SPF record. Please add the " +"following TXT record into your DNS. This can typically be done in the " +"control panel of your domain name registrar." + +#. no results heading +#: src/app/templates/partials/no-results.tpl.html:20 +msgctxt "Title" +msgid "Star" +msgstr "Star" + +#: src/app/templates/partials/conversation.tpl.html:3 +msgid "Star conversation" +msgstr "Star conversation" + +#: src/app/controllers/secured.js:199 +msgctxt "Title" +msgid "Starred" +msgstr "Starred" + +#. Folder name +#: src/app/templates/partials/sidebar-responsive.tpl.html:37 +#: src/app/templates/partials/sidebar.tpl.html:37 +msgctxt "Nav" +msgid "Starred" +msgstr "Starred" + +#: src/app/templates/partials/searchForm.tpl.html:41 +msgctxt "Title" +msgid "Start date" +msgstr "Start date" + +#. table heading +#. table heading for the domains page table listing of addresses +#: src/app/templates/modals/generate.tpl.html:29 +#: src/app/templates/views/domains.tpl.html:138 +#: src/app/templates/views/keys.tpl.html:117 +#: src/app/templates/views/keys.tpl.html:22 +#: src/app/templates/views/keys.tpl.html:69 +#: src/app/templates/views/payments.tpl.html:108 +msgctxt "Title" +msgid "Status" +msgstr "Status" + +#: src/app/templates/modals/payment/payment.tpl.html:19 +#: src/app/templates/views/dashboard.tpl.html:162 +msgid "Storage" +msgstr "Storage" + +#. table heading +#: src/app/templates/modals/storage.tpl.html:12 +#: src/app/templates/views/dashboard.tpl.html:41 +#: src/app/templates/views/dashboard.tpl.html:69 +#: src/app/templates/views/members.tpl.html:72 +msgctxt "Title" +msgid "Storage" +msgstr "Storage" + +#: src/app/templates/modals/user/member.tpl.html:28 +msgid "Storage as MB" +msgstr "Storage as MB" + +#: src/app/models/message.js:139 +msgid "Stored encrypted" +msgstr "Stored encrypted" + +#: src/app/controllers/settings/members.js:25 +msgid "Sub" +msgstr "Sub" + +#: src/app/templates/partials/composer.tpl.html:157 +msgid "Subject" +msgstr "Subject" + +#: src/app/templates/modals/pay.tpl.html:62 +msgctxt "Info" +msgid "Submit" +msgstr "Submit" + +#: src/app/templates/modals/alias.tpl.html:24 +#: src/app/templates/modals/bug.tpl.html:79 +#: src/app/templates/modals/card.tpl.html:57 +#: src/app/templates/modals/customizeInvoice.tpl.html:15 +#: src/app/templates/modals/loginPassword.tpl.html:15 +#: src/app/templates/modals/organizationRecovery.tpl.html:15 +#: src/app/templates/modals/payment/payment.tpl.html:179 +#: src/app/templates/modals/reactivate.tpl.html:17 +#: src/app/templates/modals/user/address.tpl.html:56 +msgctxt "Action" +msgid "Submit" +msgstr "Submit" + +#. payment type badge +#: src/app/templates/views/payments.tpl.html:124 +#: src/app/templates/views/payments.tpl.html:65 +msgid "Subscription" +msgstr "Subscription" + +#: src/app/models/payments.js:99 +msgid "Support" +msgstr "Support" + +#. feature for upgrading from a free account to a paid account +#: src/app/templates/modals/monetize.tpl.html:35 +msgid "Support for custom domains and aliases" +msgstr "Support for custom domains and aliases" + +#: src/app/templates/views/dashboard.tpl.html:147 +msgid "Support ProtonMail" +msgstr "Support ProtonMail" + +#: src/app/templates/modals/monetize.tpl.html:32 +msgctxt "Title" +msgid "Support ProtonMail by upgrading to a paid account" +msgstr "Support ProtonMail by upgrading to a paid account" + +#: src/app/templates/views/step1.tpl.html:14 +msgctxt "Info" +msgid "" +"Take back your privacy! Creating your free secure email account takes less " +"than 2 minutes in most cases." +msgstr "" +"Take back your privacy! Creating your free secure email account takes less " +"than 2 minutes in most cases." + +#: src/app/templates/modals/payment/thanks.tpl.html:3 +msgctxt "Title" +msgid "Thank you for your subscription." +msgstr "Thank you for your subscription." + +#: src/app/controllers/settings/appearance.js:40 +msgid "Theme saved" +msgstr "Theme saved" + +#: src/app/templates/views/step1.tpl.html:170 +msgctxt "Info" +msgid "This can take a few seconds or a few minutes depending on your device." +msgstr "This can take a few seconds or a few minutes depending on your device." + +#: src/app/controllers/conversations.js:891 +msgid "This cannot be undone." +msgstr "This cannot be undone." + +#: src/app/templates/partials/conversation.tpl.html:15 +msgctxt "Info" +msgid "This conversation contains non-trashed messages." +msgstr "This conversation contains non-trashed messages." + +#: src/app/templates/partials/conversation.tpl.html:22 +msgctxt "Info" +msgid "This conversation contains trashed messages." +msgstr "This conversation contains trashed messages." + +#: src/app/templates/modals/welcome.tpl.html:22 +msgctxt "Info" +msgid "This is the 'From' name that people will see when you email them." +msgstr "This is the ‘From’ name that people will see when you email them." + +#: src/app/templates/views/step1.tpl.html:49 +msgctxt "Info" +msgid "" +"This is used to encrypt and decrypt your messages. This is private and only " +"you know it." +msgstr "" +"This is used to encrypt and decrypt your messages. This is private and only " +"you know it." + +#: src/app/templates/views/step1.tpl.html:36 +msgctxt "Info" +msgid "This is used to log you into our system." +msgstr "This is used to log you into our system." + +#: src/app/templates/views/step1.tpl.html:64 +msgctxt "Info" +msgid "" +"This is used to recover your account if you get locked out or forget your " +"login password." +msgstr "" +"This is used to recover your account if you get locked out or forget your " +"login password." + +#: src/app/templates/partials/composer.tpl.html:101 +#: src/app/templates/partials/message.tpl.html:232 +msgid "This message will expire in" +msgstr "This message will expire in" + +#. responsiveness info +#: src/app/templates/views/addresses.tpl.html:4 +msgctxt "Info" +msgid "" +"This page is only available on larger resolution devices. If you are on a " +"phone, try landscape mode, or visit on a computer instead." +msgstr "" +"This page is only available on larger resolution devices. If you are on a " +"phone, try landscape mode, or visit on a computer instead." + +#: src/app/templates/views/appearance.tpl.html:11 +msgctxt "Info" +msgid "" +"This sets the default composer size. Two sizes are available, a smaller " +"popup composer, and a bigger full screen composer." +msgstr "" +"This sets the default composer size. Two sizes are available, a smaller " +"popup composer, and a bigger full screen composer." + +#: src/app/templates/partials/wizard.tpl.html:11 +msgctxt "Info" +msgid "" +"This short tutorial will show you the main features of your new ProtonMail " +"account. For more information, you can also check out the Welcome email we " +"have sent you. If you ever want to view this tutorial again, you can access " +"it by clicking your username in the upper right corner." +msgstr "" +"This short tutorial will show you the main features of your new ProtonMail " +"account. For more information, you can also check out the Welcome email we " +"have sent you. If you ever want to view this tutorial again, you can access " +"it by clicking your username in the upper right corner." + +#: src/app/templates/modals/alias.tpl.html:18 +msgctxt "Info" +msgid "This will be a new address you can send and receive emails with." +msgstr "This will be a new address you can send and receive emails with." + +#: src/app/templates/views/step1.tpl.html:20 +msgctxt "Info" +msgid "" +"This will be your email address. Select the drop down to choose your domain." +msgstr "" +"This will be your email address. Select the drop down to choose your domain." + +#: src/app/controllers/settings/dashboard.js:315 +msgctxt "Info" +msgid "" +"This will downgrade your account to a free account.

Please " +"disable all additional addresses prior to downgrading your account. You can " +"manage that inside the addresses tab.

ProtonMail is free software " +"that is supported by donations and paid accounts. Please consider making a donation so " +"we can continue to offer the service for free." +msgstr "" +"This will downgrade your account to a free account.

Please " +"disable all additional addresses prior to downgrading your account. You can " +"manage that inside the addresses tab.

ProtonMail is free software " +"that is supported by donations and paid accounts. Please consider making a donation " +"so we can continue to offer the service for free." + +#. invoice heading +#: src/app/templates/views/invoice.print.tpl.html:77 +#: src/app/templates/views/security.tpl.html:35 +msgctxt "Title" +msgid "Time" +msgstr "Time" + +#. message metadata +#. printed message info +#: src/app/controllers/compose.js:1544 +#: src/app/templates/partials/message.tpl.html:80 +#: src/app/templates/partials/message.tpl.html:89 +#: src/app/templates/partials/searchForm.tpl.html:36 +#: src/app/templates/views/message.print.tpl.html:32 +#: src/app/templates/views/outside.message.tpl.html:28 +#: src/app/templates/views/outside.reply.tpl.html:18 +msgid "To" +msgstr "To" + +#: src/app/templates/partials/composer.tpl.html:142 +msgctxt "Title" +msgid "To" +msgstr "To" + +#: src/app/templates/views/addresses.tpl.html:64 +msgctxt "Info" +msgid "" +"To add more addresses to your account, or to use your own domain, upgrade " +"your account." +msgstr "" +"To add more addresses to your account, or to use your own domain, upgrade " +"your account." + +#. reset warning 3/3 +#: src/app/templates/views/reset-mailbox-password.tpl.html:7 +msgctxt "Info" +msgid "To continue, type 'DANGER' below:" +msgstr "To continue, type ‘DANGER’ below:" + +#: src/app/templates/partials/safari.attachment.warning.tpl.html:14 +#: src/app/templates/partials/safari.warning.tpl.html:14 +msgid "To download attachments in Safari:" +msgstr "To download attachments in Safari:" + +#: src/app/templates/modals/payment/payment.tpl.html:154 +msgctxt "Info" +msgid "" +"To pay via Bitcoin or Cash, please email us at contact@protonmail." +"ch for instructions." +msgstr "" +"To pay via Bitcoin or Cash, please email us at contact@protonmail." +"ch for instructions." + +#: src/app/templates/modals/domain/address.tpl.html:10 +msgid "To send and receive email with this domain, please add all addresses" +msgstr "To send and receive email with this domain, please add all addresses" + +#: src/app/templates/views/appearance.tpl.html:55 +msgctxt "Title" +msgid "Toolbar" +msgstr "Toolbar" + +#: src/app/templates/modals/payment/payment.tpl.html:31 +msgid "Total per year (incl. taxes)" +msgstr "Total per year (incl. taxes)" + +#: src/app/templates/views/dashboard.tpl.html:80 +msgctxt "Title" +msgid "Total price:" +msgstr "Total price:" + +#. location tag +#: src/app/directives/move.js:24 +#: src/app/templates/directives/location-tag.tpl.html:5 +msgid "Trash" +msgstr "Trash" + +#. Folder name +#: src/app/templates/partials/sidebar-responsive.tpl.html:58 +#: src/app/templates/partials/sidebar.tpl.html:61 +msgctxt "Nav" +msgid "Trash" +msgstr "Trash" + +#. no results heading +#: src/app/controllers/secured.js:208 +#: src/app/templates/partials/no-results.tpl.html:18 +msgctxt "Title" +msgid "Trash" +msgstr "Trash" + +#: src/app/templates/partials/header-auth-desktop.tpl.html:75 +msgctxt "Action" +msgid "Tutorial" +msgstr "Tutorial" + +#: src/app/templates/modals/domain/dkim.tpl.html:19 +#: src/app/templates/modals/domain/dkim.tpl.html:32 +#: src/app/templates/modals/domain/dmarc.tpl.html:16 +#: src/app/templates/modals/domain/dmarc.tpl.html:29 +#: src/app/templates/modals/domain/mx.tpl.html:18 +#: src/app/templates/modals/domain/mx.tpl.html:33 +#: src/app/templates/modals/domain/spf.tpl.html:18 +#: src/app/templates/modals/domain/spf.tpl.html:31 +#: src/app/templates/modals/domain/verification.tpl.html:19 +#: src/app/templates/modals/domain/verification.tpl.html:32 +#: src/app/templates/views/payments.tpl.html:107 +#: src/app/templates/views/payments.tpl.html:17 +msgctxt "Title" +msgid "Type" +msgstr "Type" + +#: src/app/controllers/settings/addresses.js:243 +#: src/app/controllers/settings/appearance.js:46 +#: src/app/controllers/settings/labels.js:118 +#: src/app/controllers/settings/members.js:269 +#: src/app/controllers/settings/members.js:272 +#: src/app/controllers/settings/payments.js:88 +#: src/app/controllers/settings/payments.js:91 +#: src/app/controllers/settings/security.js:61 +msgctxt "Error" +msgid "Unable to save your changes, please try again." +msgstr "Unable to save your changes, please try again." + +#: src/app/services/attachments.js:107 src/app/services/attachments.js:99 +msgctxt "Error" +msgid "Unable to upload file. Please try again" +msgstr "Unable to upload file. Please try again" + +#: src/app/templates/directives/squire.tpl.html:15 +msgctxt "Action" +msgid "Underline" +msgstr "Underline" + +#: src/app/models/message.js:134 +msgid "Unencrypted message" +msgstr "Unencrypted message" + +#: src/app/models/payments.js:112 +msgid "Unlimited labels" +msgstr "Unlimited labels" + +#: src/app/models/payments.js:111 +msgid "Unlimited sending" +msgstr "Unlimited sending" + +#: src/app/controllers/settings/members.js:169 +#: src/app/templates/views/members.tpl.html:96 +msgid "Unlink address" +msgstr "Unlink address" + +#: src/app/templates/views/unlock.tpl.html:19 +msgctxt "Action" +msgid "Unlock" +msgstr "Unlock" + +#: src/app/templates/directives/squire.tpl.html:21 +msgctxt "Action" +msgid "Unordered list" +msgstr "Unordered list" + +#. payment status badge +#: src/app/templates/views/payments.tpl.html:130 +#: src/app/templates/views/payments.tpl.html:77 +msgid "Unpaid" +msgstr "Unpaid" + +#: src/app/templates/directives/squire.tpl.html:65 +msgctxt "Action" +msgid "Update link" +msgstr "Update link" + +#: src/app/controllers/settings/dashboard.js:270 +msgctxt "Action" +msgid "Update Plus" +msgstr "Update Plus" + +#: src/app/controllers/settings/dashboard.js:278 +msgctxt "Action" +msgid "Update Visionary" +msgstr "Update Visionary" + +#. Folder name +#: src/app/templates/partials/sidebar-responsive.tpl.html:72 +msgctxt "Nav" +msgid "Upgrade" +msgstr "Upgrade" + +#. link to dashboard +#: src/app/templates/modals/monetize.tpl.html:40 +#: src/app/templates/partials/header-auth-desktop.tpl.html:22 +#: src/app/templates/views/dashboard.tpl.html:26 +#: src/app/templates/views/dashboard.tpl.html:37 +#: src/app/templates/views/members.tpl.html:35 +#: src/app/templates/views/members.tpl.html:46 +msgctxt "Action" +msgid "Upgrade" +msgstr "Upgrade" + +#: src/app/templates/partials/conversation-placeholder.tpl.html:20 +msgctxt "Action" +msgid "Upgrade account" +msgstr "Upgrade account" + +#: src/app/templates/partials/sidebar.tpl.html:94 +msgctxt "Action" +msgid "Upgrade storage" +msgstr "Upgrade storage" + +#: src/app/controllers/settings/dashboard.js:272 +msgctxt "Action" +msgid "Upgrade to Plus" +msgstr "Upgrade to Plus" + +#: src/app/controllers/settings/dashboard.js:280 +msgctxt "Action" +msgid "Upgrade to Visionary" +msgstr "Upgrade to Visionary" + +#. link to dashboard +#. link to dashboard page +#: src/app/templates/views/addresses.tpl.html:8 +#: src/app/templates/views/domains.tpl.html:121 +#: src/app/templates/views/domains.tpl.html:15 +msgctxt "Action" +msgid "Upgrade your plan" +msgstr "Upgrade your plan" + +#: src/app/templates/views/dashboard.tpl.html:110 +msgid "" +"Upgrading to a paid account is the best way to support ProtonMail, but you " +"can also donate any amount." +msgstr "" +"Upgrading to a paid account is the best way to support ProtonMail, but you " +"can also donate any amount." + +#: src/app/templates/modals/dropzone.tpl.html:6 +msgctxt "Title" +msgid "Upload" +msgstr "Upload" + +#. contacts toolbar menu option +#: src/app/templates/modals/dropzone.tpl.html:21 +#: src/app/templates/partials/toolbar-contacts.tpl.html:13 +msgctxt "Action" +msgid "Upload" +msgstr "Upload" + +#: src/app/templates/partials/composer.tpl.html:246 +msgctxt "Action" +msgid "Uploading" +msgstr "Uploading" + +#: src/app/templates/directives/squire.tpl.html:73 +msgid "URL to image" +msgstr "URL to image" + +#: src/app/templates/views/upgrade.tpl.html:31 +msgctxt "Info" +msgid "Use one of these browsers for the best experience during Beta:" +msgstr "Use one of these browsers for the best experience during Beta:" + +#. invoice heading +#: src/app/templates/views/invoice.print.tpl.html:53 +msgctxt "Title" +msgid "User" +msgstr "User" + +#: src/app/templates/views/invoices.tpl.html:39 +msgctxt "Title" +msgid "User history" +msgstr "User history" + +#: src/app/templates/views/login.tpl.html:6 +msgctxt "Title" +msgid "User login" +msgstr "User login" + +#: src/app/templates/modals/user/member.tpl.html:25 +msgctxt "Title" +msgid "User storage" +msgstr "User storage" + +#: src/app/templates/views/login.tpl.html:11 +#: src/app/templates/views/reset-login-password.tpl.html:12 +msgid "Username" +msgstr "Username" + +#. table heading +#: src/app/templates/views/dashboard.tpl.html:12 +#: src/app/templates/views/members.tpl.html:70 +msgctxt "Title" +msgid "Username" +msgstr "Username" + +#: src/app/templates/views/step1.tpl.html:17 +msgctxt "Title" +msgid "Username and domain" +msgstr "Username and domain" + +#: src/app/templates/views/reset-login-password.tpl.html:6 +msgctxt "Error" +msgid "Username is required." +msgstr "Username is required." + +#: src/app/controllers/secured.js:241 src/app/controllers/secured.js:37 +#: src/app/templates/views/members.tpl.html:62 +msgctxt "Title" +msgid "Users" +msgstr "Users" + +#: src/app/templates/modals/domain/dkim.tpl.html:21 +#: src/app/templates/modals/domain/dkim.tpl.html:40 +#: src/app/templates/modals/domain/dmarc.tpl.html:18 +#: src/app/templates/modals/domain/dmarc.tpl.html:37 +#: src/app/templates/modals/domain/mx.tpl.html:20 +#: src/app/templates/modals/domain/mx.tpl.html:41 +#: src/app/templates/modals/domain/spf.tpl.html:20 +#: src/app/templates/modals/domain/spf.tpl.html:39 +#: src/app/templates/modals/domain/verification.tpl.html:21 +#: src/app/templates/modals/domain/verification.tpl.html:40 +msgctxt "Title" +msgid "Value / Data / Points to" +msgstr "Value / Data / Points to" + +#: src/app/templates/views/domains.tpl.html:48 +msgid "Verification" +msgstr "Verification" + +#: src/app/templates/views/step1.tpl.html:118 +msgid "Verification code" +msgstr "Verification code" + +#: src/app/templates/views/reset-login-password.tpl.html:26 +#: src/app/templates/views/reset-mailbox-password.tpl.html:23 +msgctxt "Title" +msgid "Verification code" +msgstr "Verification code" + +#: src/app/templates/views/step1.tpl.html:116 +msgctxt "Info" +msgid "Verification code sent" +msgstr "Verification code sent" + +#: src/app/controllers/settings/domains.js:384 +#: src/app/controllers/settings/domains.js:402 +#: src/app/controllers/settings/domains.js:405 +#: src/app/controllers/settings/domains.js:527 +#: src/app/controllers/settings/domains.js:530 +msgctxt "Error" +msgid "Verification did not succeed, please try again in an hour." +msgstr "Verification did not succeed, please try again in an hour." + +#: src/app/templates/modals/domain/verification.tpl.html:50 +msgctxt "Action" +msgid "Verify" +msgstr "Verify" + +#: src/app/templates/modals/domain/verification.tpl.html:10 +msgctxt "Title" +msgid "Verify" +msgstr "Verify" + +#: src/app/templates/modals/domain/menu.tpl.html:12 +msgctxt "Nav" +msgid "Verify" +msgstr "Verify" + +#: src/app/templates/views/step1.tpl.html:196 +msgid "Verifying encryption keys" +msgstr "Verifying encryption keys" + +#: src/app/templates/layout/pre.tpl.html:7 +msgid "Verifying invite link..." +msgstr "Verifying invite link…" + +#: src/app/templates/views/step1.tpl.html:192 +msgid "Verifying new account" +msgstr "Verifying new account" + +#: src/app/templates/views/upgrade.tpl.html:42 +msgid "Version" +msgstr "Version" + +#: src/app/templates/partials/message.tpl.html:207 +msgctxt "Action" +msgid "View headers" +msgstr "View headers" + +#: src/app/templates/partials/message.tpl.html:211 +msgctxt "Action" +msgid "View original" +msgstr "View original" + +#: src/app/templates/partials/message.tpl.html:202 +msgctxt "Action" +msgid "View rendered HTML" +msgstr "View rendered HTML" + +#: src/app/templates/partials/message.tpl.html:198 +msgctxt "Action" +msgid "View source code" +msgstr "View source code" + +#. payment status badge +#: src/app/templates/views/payments.tpl.html:132 +#: src/app/templates/views/payments.tpl.html:83 +msgid "Void" +msgstr "Void" + +#: src/app/templates/views/reset-mailbox-password.tpl.html:4 +msgctxt "Title" +msgid "Warning" +msgstr "Warning" + +#. account deletion warning +#: src/app/templates/modals/deleteAccount.tpl.html:10 +msgctxt "Info" +msgid "WARNING: DELETION IS PERMANENT" +msgstr "WARNING: DELETION IS PERMANENT" + +#: src/app/templates/modals/generate.tpl.html:48 +msgctxt "Info" +msgid "" +"We are now generating encryption keys for your account, this may take " +"several minutes and temporarily freeze your browser." +msgstr "" +"We are now generating encryption keys for your account, this may take " +"several minutes and temporarily freeze your browser." + +#: src/app/templates/modals/deleteAccount.tpl.html:14 +msgctxt "Title" +msgid "We are sorry to see you go!" +msgstr "We are sorry to see you go!" + +#: src/app/templates/modals/payment/payment.tpl.html:135 +msgctxt "Info" +msgid "" +"We only accept PayPal for annual subscriptions, click the link to switch to " +"an annual subscription." +msgstr "" +"We only accept PayPal for annual subscriptions, click the link to switch to " +"an annual subscription." + +#: src/app/templates/modals/payment/payment.tpl.html:139 +msgctxt "Info" +msgid "" +"We only accept PayPal for annual subscriptions. PayPal is also only accepted " +"for US Dollar plans. Click here to switch to an annual US Dollar " +"subscription." +msgstr "" +"We only accept PayPal for annual subscriptions. PayPal is also only accepted " +"for US Dollar plans. Click here to switch to an annual US Dollar " +"subscription." + +#: src/app/templates/views/reset-login-password.tpl.html:2 +msgctxt "Info" +msgid "" +"We will send a code to your Recovery email to reset your Recovery email
. " +"Enter it below to continue." +msgstr "" +"We’ve sent a verification code to your Recovery email. " +"Enter it below to continue." + +#: src/app/templates/partials/composer.tpl.html:107 +msgid "Weeks" +msgstr "Weeks" + +#: src/app/templates/partials/conversation-placeholder.tpl.html:2 +msgctxt "Title" +msgid "Welcome" +msgstr "Welcome" + +#: src/app/templates/modals/welcome.tpl.html:6 +msgctxt "Title" +msgid "Welcome to ProtonMail" +msgstr "Welcome to ProtonMail" + +#: src/app/templates/partials/wizard.tpl.html:9 +msgctxt "Title" +msgid "Welcome to your new encrypted email account" +msgstr "Welcome to your new encrypted email account" + +#: src/app/templates/modals/feedback.tpl.html:9 +msgctxt "Info" +msgid "What do you think of ProtonMail version 3.0?" +msgstr "What do you think of ProtonMail version 3.0?" + +#: src/app/templates/modals/bug.tpl.html:58 +msgctxt "Title" +msgid "What happened?" +msgstr "What happened?" + +#. select dropdown options +#: src/app/templates/modals/bug.tpl.html:20 +msgid "Windows" +msgstr "Windows" + +#: src/app/templates/views/security.tpl.html:9 +msgctxt "Action" +msgid "Wipe" +msgstr "Wipe" + +#: src/app/templates/views/domains.tpl.html:92 +msgid "Wizard" +msgstr "Wizard" + +#: src/app/controllers/settings/domains.js:387 +msgctxt "Error" +msgid "" +"Wrong verification code. Please make sure you copied the verification code " +"correctly and try again. It can take up to 1 hour for changes to take affect." +msgstr "" +"Wrong verification code. Please make sure you copied the verification code " +"correctly and try again. It can take up to 1 hour for changes to take affect." + +#: src/app/templates/modals/card.tpl.html:41 +#: src/app/templates/modals/donate.tpl.html:57 +#: src/app/templates/modals/monetize.tpl.html:33 +#: src/app/templates/modals/payment/payment.tpl.html:113 +#: src/app/templates/views/invoice.print.tpl.html:85 +msgid "Year" +msgstr "Year" + +#. form option +#: src/app/templates/partials/searchForm.tpl.html:72 +msgid "Yes" +msgstr "Yes" + +#: src/app/controllers/login.js:63 +msgctxt "Error" +msgid "" +"You are in Private Mode or have Session Storage disabled.\n" +"Please deactivate Private Mode and then reload the page.\n" +"More information here." +msgstr "" +"You are in Private Mode or have Session Storage disabled.\n" +"Please deactivate Private Mode and then reload the page.\n" +"More information here." + +#: src/app/templates/views/addresses.tpl.html:17 +msgctxt "Info" +msgid "You can drag and drop addresses to order them." +msgstr "You can drag and drop addresses to order them." + +#: src/app/templates/views/security.tpl.html:25 +msgctxt "Info" +msgid "" +"You can enable authentication logging to see who and when your account is " +"accessed. We will record the IP address that accesses the account and the " +"time, as well as failed attempts." +msgstr "" +"You can enable authentication logging to see who and when your account is " +"accessed. We will record the IP address that accesses the account and the " +"time, as well as failed attempts." + +#: src/app/templates/views/contacts.tpl.html:7 +msgctxt "Info" +msgid "" +"You have no contacts, you can add contact with the above button 'ADD " +"CONTACT'." +msgstr "" +"You have no contacts, you can add contact with the above button ‘ADD " +"CONTACT’." + +#: src/app/templates/views/payments.tpl.html:44 +msgctxt "Info" +msgid "You have no invoices." +msgstr "You have no invoices." + +#: src/app/templates/views/labels.tpl.html:7 +msgctxt "Info" +msgid "" +"You have no labels, you can add label with the above button 'ADD LABEL'." +msgstr "" +"You have no labels, you can add label with the above button ‘ADD LABEL’." + +#: src/app/templates/views/payments.tpl.html:10 +msgctxt "Info" +msgid "" +"You have no saved payment methods, you can add a payment method by clicking " +"'ADD'." +msgstr "" +"You have no saved payment methods, you can add a payment method by clicking " +"‘ADD’." + +#: src/app/controllers/settings/dashboard.js:359 +msgid "You have successfully unsubscribed" +msgstr "You have successfully unsubscribed" + +#: src/app/templates/modals/pay.tpl.html:26 +msgctxt "Info" +msgid "You need to add a credit card before to pay with it." +msgstr "You need to add a credit card before to pay with it." + +#: src/app/templates/modals/welcome.tpl.html:9 +msgctxt "Info" +msgid "" +"You now have an encrypted email account! Below are optional settings you can " +"use to customize your account. You can always find these on your Settings " +"page." +msgstr "" +"You now have an encrypted email account! Below are optional settings you can " +"use to customize your account. You can always find these on your Settings " +"page." + +#. safari attachment instructions +#: src/app/templates/partials/safari.attachment.warning.tpl.html:18 +#: src/app/templates/partials/safari.warning.tpl.html:18 +msgid "You will be prompted to save the attachment." +msgstr "You will be prompted to save the attachment." + +#: src/app/templates/modals/pay.tpl.html:50 +#: src/app/templates/modals/payment/payment.tpl.html:146 +msgctxt "Info" +msgid "" +"You will need to login to your PayPal account to complete this transaction. " +"We will open a new tab with PayPal for you. If you use any pop-up blockers, " +"please disable them to continue." +msgstr "" +"You will need to login to your PayPal account to complete this transaction. " +"We will open a new tab with PayPal for you. If you use any pop-up blockers, " +"please disable them to continue." + +#: src/app/templates/modals/payment/process.tpl.html:7 +msgctxt "Info" +msgid "" +"You're upgrading your account. Once we successfully process payment, we'll " +"immediately upgrade your account. Thanks for choosing to become a paying " +"customer!" +msgstr "" +"You’re upgrading your account. Once we successfully process payment, we’ll " +"immediately upgrade your account. Thanks for choosing to become a paying " +"customer!" + +#: src/app/controllers/compose.js:548 src/app/routes.js:551 +#: src/app/routes.js:841 src/app/templates/views/payments.tpl.html:43 +msgctxt "Info" +msgid "" +"Your account currently has an overdue invoice. Please pay all unpaid " +"invoices." +msgstr "" +"Your account currently has an overdue invoice. Please pay all unpaid " +"invoices." + +#: src/app/templates/modals/payment/process.tpl.html:9 +msgctxt "Info" +msgid "Your account is being updated, this may take up to 30 seconds." +msgstr "Your account is being updated, this may take up to 30 seconds." + +#: src/app/templates/partials/safari.attachment.warning.tpl.html:13 +#: src/app/templates/partials/safari.warning.tpl.html:13 +msgctxt "Info" +msgid "" +"Your attachments are secure and encrypted, but to download them requires " +"extra work. We recommend using a different web browser such as Chrome or " +"Firefox for a better user experience." +msgstr "" +"Your attachments are secure and encrypted, but to download them requires " +"extra work. We recommend using a different web browser such as Chrome or " +"Firefox for a better user experience." + +#: src/app/templates/views/dashboard.tpl.html:111 +msgid "" +"Your donation helps us support more users and continue to develop ProtonMail " +"as free and open source software." +msgstr "" +"Your donation helps us support more users and continue to develop ProtonMail " +"as free and open source software." + +#: src/app/templates/modals/payment/thanks.tpl.html:4 +msgid "Your new features are now available." +msgstr "Your new features are now available." + +#: src/app/templates/modals/feedback.tpl.html:10 +msgid "Your thoughts..." +msgstr "Your thoughts..." + +#: src/app/templates/modals/card.tpl.html:41 +#: src/app/templates/modals/donate.tpl.html:57 +#: src/app/templates/modals/payment/payment.tpl.html:113 +msgid "YY" +msgstr "YY" + +#: src/app/templates/modals/card.tpl.html:24 +#: src/app/templates/modals/donate.tpl.html:40 +#: src/app/templates/modals/payment/payment.tpl.html:96 +msgid "ZIP code" +msgstr "ZIP code" + +#~ msgctxt "Action" +#~ msgid "Help & answers" +#~ msgstr "Help & answers" + +#~ msgctxt "Info" +#~ msgid "You must unsubscribe before requesting deletion of your account." +#~ msgstr "You must unsubscribe before requesting deletion of your account." + +#~ msgctxt "Title" +#~ msgid "Invoice" +#~ msgstr "Invoice" + +#~ msgctxt "Title" +#~ msgid "reCaptcha" +#~ msgstr "reCaptcha" + +#~ msgctxt "Title" +#~ msgid "reCaptcha verification" +#~ msgstr "reCaptcha verification" + +#~ msgid "Choose your default language." +#~ msgstr "Choose your default language." + +#~ msgctxt "Title" +#~ msgid "Internationalization" +#~ msgstr "Internationalization" + +#~ msgctxt "Error" +#~ msgid "Please add a payment method first" +#~ msgstr "Please add a payment method first" + +#~ msgid "Saved at {{ message.Time | date : 'shortTime' }}" +#~ msgstr "Saved at {{ message.Time | date : ‘shortTime’ }}" + +#~ msgid "" +#~ "{{ organization.UsedDomains }} / {{ organization.MaxDomains Domains used." +#~ msgstr "" +#~ "{{ organization.UsedDomains }} / {{ organization.MaxDomains Domains used." + +#~ msgctxt "Info" +#~ msgid "" +#~ "Enter custom text that you want to appear on your invoice beneath the " +#~ "ProtonMail logo." +#~ msgstr "" +#~ "Enter custom text that you want to appear on your invoice beneath the " +#~ "ProtonMail logo." + +#~ msgid "Remove" +#~ msgstr "Remove" + +#~ msgctxt "Info" +#~ msgid "" +#~ "We've sent a Verification Token to your Recovery Email. Please enter it " +#~ "below:" +#~ msgstr "" +#~ "We’ve sent a Verification Token to your Recovery Email. Please enter it " +#~ "below:" + +#~ msgctxt "Default" +#~ msgid "From" +#~ msgstr "From" + +#~ msgid "Host name" +#~ msgstr "Host name" + +#~ msgctxt "title" +#~ msgid "Overview" +#~ msgstr "Overview" + +#~ msgid "Priority" +#~ msgstr "Priority" + +#~ msgid "This message will expire in:" +#~ msgstr "This message will expire in:" + +#~ msgctxt "Default" +#~ msgid "To" +#~ msgstr "To" + +#~ msgid "To:" +#~ msgstr "To:" + +#~ msgid "Type" +#~ msgstr "Type" + +#~ msgctxt "Error" +#~ msgid "Unable to upload" +#~ msgstr "Unable to upload" + +#~ msgctxt "Error" +#~ msgid "Unable to upload file. Please try again." +#~ msgstr "Unable to upload file. Please try again." + +#~ msgid "Upgrade storage" +#~ msgstr "Upgrade storage" + +#~ msgid "Value / Data / Points to" +#~ msgstr "Value / Data / Points to" + +#~ msgid "Set user storage" +#~ msgstr "Set user storage" + +#~ msgid "Show all" +#~ msgstr "Show all" + +#~ msgid "Show previous message" +#~ msgstr "Show previous message" + +#~ msgid "Forward" +#~ msgstr "Forward" + +#~ msgid "Received:" +#~ msgstr "Received:" + +#~ msgid "Remove member" +#~ msgstr "Remove member" + +#~ msgid "Reply" +#~ msgstr "Reply" + +#~ msgid "Reply all" +#~ msgstr "Reply all" + +#~ msgctxt "Info" +#~ msgid "" +#~ "Safari does not fully support downloading contacts.

Please " +#~ "login with a different browser to download contacts." +#~ msgstr "" +#~ "Safari does not fully support downloading contacts.

Please " +#~ "login with a different browser to download contacts." + +#~ msgid "Safari does not fully support downloading encrypted attachments." +#~ msgstr "Safari does not fully support downloading encrypted attachments." + +#~ msgid "Save" +#~ msgstr "Save" + +#~ msgid "Select all messages" +#~ msgstr "Select all messages" + +#~ msgid "Sent:" +#~ msgstr "Sent:" + +#~ msgid "Close" +#~ msgstr "Close" + +#~ msgid "Exit fullscreen" +#~ msgstr "Exit fullscreen" + +#~ msgid "Expand" +#~ msgstr "Expand" + +#~ msgid "Fullscreen" +#~ msgstr "Fullscreen" + +#~ msgid "Minimize" +#~ msgstr "Minimize" + +#~ msgid "My organization" +#~ msgstr "My organization" + +#~ msgid "New message" +#~ msgstr "New message" + +#~ msgid "No logs yet." +#~ msgstr "No logs yet." + +#~ msgid "No subject" +#~ msgstr "No subject" + +#~ msgid "No subject, send anyway?" +#~ msgstr "No subject, send anyway?" + +#~ msgid "Not spam" +#~ msgstr "Not spam" + +#~ msgid "Optional, advanced" +#~ msgstr "Optional, advanced" + +#~ msgctxt "Action" +#~ msgid "Others identities" +#~ msgstr "Others identities" + +#~ msgid "Page number" +#~ msgstr "Page number" + +#~ msgctxt "Title" +#~ msgid "Password hint (optional)" +#~ msgstr "Password hint (optional)" + +#~ msgctxt "Title" +#~ msgid "Payment:" +#~ msgstr "Payment:" + +#~ msgid "Plan" +#~ msgstr "Plan" + +#~ msgid "Previous" +#~ msgstr "Previous" + +#~ msgid "Main" +#~ msgstr "Main" + +#~ msgid "Make user private" +#~ msgstr "Make user private" + +#~ msgctxt "Action" +#~ msgid "Manage password" +#~ msgstr "Manage password" + +#~ msgid "Manage passwords" +#~ msgstr "Manage passwords" + +#~ msgid "Mark as read / Mark as unread" +#~ msgstr "Mark as read / Mark as unread" + +#~ msgid "Mark as unread / Mark as read" +#~ msgstr "Mark as unread / Mark as read" + +#~ msgctxt "Button" +#~ msgid "Load classic theme" +#~ msgstr "Load classic theme" + +#~ msgctxt "Button" +#~ msgid "Load edison theme" +#~ msgstr "Load edison theme" + +#~ msgctxt "Error" +#~ msgid "Login failed" +#~ msgstr "Login failed" + +#~ msgid "Align center" +#~ msgstr "Align center" + +#~ msgid "Align left" +#~ msgstr "Align left" + +#~ msgid "Align right" +#~ msgstr "Align right" + +#~ msgid "Bold" +#~ msgstr "Bold" + +#~ msgctxt "Info" +#~ msgid "" +#~ "If you have set both SPF and DKIM, DMARC allows you to specify how other " +#~ "email services should deliver email for your domain if both SPF and DKIM " +#~ "checks have failed. This can make it harder for spammers pretending to be " +#~ "you but may also cause delivery issues if not done properly. Feel free to " +#~ "ignore and skip DMARC unless you really want strict policies such as " +#~ "p=quarantine or p=reject. Learn more" +#~ msgstr "" +#~ "If you have set both SPF and DKIM, DMARC allows you to specify how other " +#~ "email services should deliver email for your domain if both SPF and DKIM " +#~ "checks have failed. This can make it harder for spammers pretending to be " +#~ "you but may also cause delivery issues if not done properly. Feel free to " +#~ "ignore and skip DMARC unless you really want strict policies such as " +#~ "p=quarantine or p=reject. Learn more" + +#~ msgid "Insert image" +#~ msgstr "Insert image" + +#~ msgid "Invoices" +#~ msgstr "Invoices" + +#~ msgid "Italic" +#~ msgstr "Italic" + +#~ msgid "Learn more" +#~ msgstr "Learn more" + +#~ msgid "Ordered list" +#~ msgstr "Ordered list" + +#~ msgid "Underline" +#~ msgstr "Underline" + +#~ msgid "Unordered list" +#~ msgstr "Unordered list" + +#~ msgid "{{ $count }} conversation selected" +#~ msgid_plural "{{ $count }} conversations selected" +#~ msgstr[0] "{{ $count }} conversation selected" +#~ msgstr[1] "{{ $count }} conversations selected" + +#~ msgctxt "Default" +#~ msgid "" +#~ "{{ member.UsedSpace | humanSize }} of {{ member.MaxSpace | humanSize }} " +#~ "Used" +#~ msgstr "" +#~ "{{ member.UsedSpace | humanSize }} of {{ member.MaxSpace | humanSize }} " +#~ "Used" + +#~ msgctxt "Default" +#~ msgid "{{ organization.MaxAddresses }} addresses used." +#~ msgstr "{{ organization.MaxAddresses }} addresses used." + +#~ msgctxt "Default" +#~ msgid "/Month" +#~ msgstr "/Month" + +#~ msgctxt "Default" +#~ msgid "© 2016 ProtonMail.com - Made globally, hosted in Switzerland." +#~ msgstr "© 2016 ProtonMail.com - Made globally, hosted in Switzerland." + +#~ msgid "" +#~ "This will only be shown once. ProtonMail is a global " +#~ "effort. Your feedback is very important in our mission to make encryption " +#~ "available for everyone. Thank You!" +#~ msgstr "" +#~ "This will only be shown once. ProtonMail is a global " +#~ "effort. Your feedback is very important in our mission to make encryption " +#~ "available for everyone. Thank You!" + +#~ msgid "" +#~ "A screenshot of your current page will be sent to us automatically, so we " +#~ "can help debug your problem! Screenshots are hosted using a 3rd party, " +#~ "public service [imgur]." +#~ msgstr "" +#~ "A screenshot of your current page will be sent to us automatically, so we " +#~ "can help debug your problem! Screenshots are hosted using a 3rd party, " +#~ "public service [imgur]." + +#~ msgctxt "Default" +#~ msgid "Absolute security" +#~ msgstr "Absolute security" + +#~ msgctxt "Default" +#~ msgid "Account" +#~ msgstr "Account" + +#~ msgid "Account" +#~ msgstr "Account" + +#~ msgctxt "Default" +#~ msgid "Actions" +#~ msgstr "Actions" + +#~ msgctxt "Default" +#~ msgid "Active addresses" +#~ msgstr "Active addresses" + +#~ msgctxt "Default" +#~ msgid "Add" +#~ msgstr "Add" + +#~ msgctxt "Default" +#~ msgid "Add address" +#~ msgstr "Add address" + +#~ msgid "Add address" +#~ msgstr "Add address" + +#~ msgid "Add coupon" +#~ msgstr "Add coupon" + +#~ msgctxt "Default" +#~ msgid "Add custom domain" +#~ msgstr "Add custom domain" + +#~ msgctxt "Default" +#~ msgid "Add custom domain address" +#~ msgstr "Add custom domain address" + +#~ msgctxt "Default" +#~ msgid "Add new contact" +#~ msgstr "Add new contact" + +#~ msgid "Add new ProtonMail address" +#~ msgstr "Add new ProtonMail address" + +#~ msgctxt "Default" +#~ msgid "Add ProtonMail address" +#~ msgstr "Add ProtonMail address" + +#~ msgid "Add user" +#~ msgstr "Add user" + +#~ msgctxt "Default" +#~ msgid "Add user" +#~ msgstr "Add user" + +#~ msgid "Added addresses" +#~ msgstr "Added addresses" + +#~ msgctxt "Default" +#~ msgid "Additional themes (experimental)" +#~ msgstr "Additional themes (experimental)" + +#~ msgctxt "Default" +#~ msgid "Address" +#~ msgstr "Address" + +#~ msgctxt "Default" +#~ msgid "Address added" +#~ msgstr "Address added" + +#~ msgctxt "Error" +#~ msgid "Address created failed" +#~ msgstr "Address created failed" + +#~ msgctxt "Default" +#~ msgid "Address deleted" +#~ msgstr "Address deleted" + +#~ msgctxt "Default" +#~ msgid "Address disabled" +#~ msgstr "Address disabled" + +#~ msgctxt "Default" +#~ msgid "Address enabled" +#~ msgstr "Address enabled" + +#~ msgctxt "Default" +#~ msgid "Address order saved" +#~ msgstr "Address order saved" + +#~ msgctxt "Default" +#~ msgid "Address updated" +#~ msgstr "Address updated" + +#~ msgid "Addresses" +#~ msgstr "Addresses" + +#~ msgctxt "Default" +#~ msgid "Addresses" +#~ msgstr "Addresses" + +#~ msgid "Addresses added" +#~ msgstr "Addresses added" + +#~ msgid "Addresses used" +#~ msgstr "Addresses used" + +#~ msgctxt "Default" +#~ msgid "Addresses:" +#~ msgstr "Addresses:" + +#~ msgctxt "Default" +#~ msgid "Advanced" +#~ msgstr "Advanced" + +#~ msgid "Advanced search" +#~ msgstr "Advanced search" + +#~ msgctxt "Default" +#~ msgid "All" +#~ msgstr "All" + +#~ msgctxt "Default" +#~ msgid "ALL OF YOUR DATA WILL BE LOST FOREVER!" +#~ msgstr "ALL OF YOUR DATA WILL BE LOST FOREVER!" + +#~ msgid "" +#~ "All PayPal orders are charged in US Dollar, click the link to change your " +#~ "subscription to US Dollar." +#~ msgstr "" +#~ "All PayPal orders are charged in US Dollar, click the link to change your " +#~ "subscription to US Dollar." + +#~ msgid "" +#~ "Allowed formats (UTF-8 encoding): .vcf, .csvNeed help?" +#~ msgstr "" +#~ "Allowed formats (UTF-8 encoding): .vcf, .csvNeed help?" + +#~ msgctxt "Default" +#~ msgid "Already have an account?" +#~ msgstr "Already have an account?" + +#~ msgctxt "Default" +#~ msgid "Already subscribed" +#~ msgstr "Already subscribed" + +#~ msgctxt "Default" +#~ msgid "Also used to reset a forgotten password." +#~ msgstr "Also used to reset a forgotten password." + +#~ msgctxt "Default" +#~ msgid "Amount due" +#~ msgstr "Amount due" + +#~ msgctxt "Default" +#~ msgid "" +#~ "An error occured while trying to create your account. To see common " +#~ "problems and solutions click " +#~ "here." +#~ msgstr "" +#~ "An error occured while trying to create your account. To see common " +#~ "problems and solutions click " +#~ "here." + +#~ msgctxt "Default" +#~ msgid "Annually" +#~ msgstr "Annually" + +#~ msgid "Appearance" +#~ msgstr "Appearance" + +#~ msgctxt "Default" +#~ msgid "Appearance" +#~ msgstr "Appearance" + +#~ msgid "Apply" +#~ msgstr "Apply" + +#~ msgctxt "Default" +#~ msgid "Archive" +#~ msgstr "Archive" + +#~ msgctxt "Noun" +#~ msgid "Archive" +#~ msgstr "Archive" + +#~ msgid "Are you human?" +#~ msgstr "Are you human?" + +#~ msgctxt "Default" +#~ msgid "Are you sure you want to clear all your logs?" +#~ msgstr "Are you sure you want to clear all your logs?" + +#~ msgctxt "Default" +#~ msgid "Are you sure you want to delete all your contacts?" +#~ msgstr "Are you sure you want to delete all your contacts?" + +#~ msgctxt "Default" +#~ msgid "Are you sure you want to delete this address?" +#~ msgstr "Are you sure you want to delete this address?" + +#~ msgctxt "Default" +#~ msgid "Are you sure you want to delete this label?" +#~ msgstr "Are you sure you want to delete this label?" + +#~ msgctxt "Default" +#~ msgid "Are you sure you want to delete this payment method?" +#~ msgstr "Are you sure you want to delete this payment method?" + +#~ msgctxt "Default" +#~ msgid "Are you sure you want to disable this address?" +#~ msgstr "Are you sure you want to disable this address?" + +#~ msgctxt "Default" +#~ msgid "Are you sure you want to remove this member?" +#~ msgstr "Are you sure you want to remove this member?" + +#~ msgctxt "Default" +#~ msgid "Are you sure you want to unlink this address?" +#~ msgstr "Are you sure you want to unlink this address?" + +#~ msgid "Attach screenshot" +#~ msgstr "Attach screenshot" + +#~ msgctxt "Default" +#~ msgid "Attachment" +#~ msgid_plural "Attachments" +#~ msgstr[0] "Attachment" +#~ msgstr[1] "Attachments" + +#~ msgctxt "Default" +#~ msgid "Authentication Logs" +#~ msgstr "Authentication Logs" + +#~ msgctxt "Default" +#~ msgid "Auto" +#~ msgstr "Auto" + +#~ msgctxt "Default" +#~ msgid "Autosave contact list" +#~ msgstr "Autosave contact list" + +#~ msgctxt "Default" +#~ msgid "Autosave contacts" +#~ msgstr "Autosave contacts" + +#~ msgid "Back to inbox" +#~ msgstr "Back to inbox" + +#~ msgid "Back to list" +#~ msgstr "Back to list" + +#~ msgid "Back to protonmail.com" +#~ msgstr "Back to protonmail.com" + +#~ msgctxt "Default" +#~ msgid "Basic" +#~ msgstr "Basic" + +#~ msgctxt "Default" +#~ msgid "BCC" +#~ msgstr "BCC" + +#~ msgid "BCC:" +#~ msgstr "BCC:" + +#~ msgid "" +#~ "Before you can receive emails for your custom domain addresses at " +#~ "ProtonMail, you need to add the following MX record to your DNS. This can " +#~ "typically be done in the control panel of your domain name registrar." +#~ msgstr "" +#~ "Before you can receive emails for your custom domain addresses at " +#~ "ProtonMail, you need to add the following MX record to your DNS. This can " +#~ "typically be done in the control panel of your domain name registrar." + +#~ msgctxt "Default" +#~ msgid "Billed" +#~ msgstr "Billed" + +#~ msgctxt "Default" +#~ msgid "Billing cycle" +#~ msgstr "Billing cycle" + +#~ msgctxt "Default" +#~ msgid "Browser" +#~ msgstr "Browser" + +#~ msgid "" +#~ "Bug reports are not end-to-end encrypted, please do not send any " +#~ "sensitive information." +#~ msgstr "" +#~ "Bug reports are not end-to-end encrypted, please do not send any " +#~ "sensitive information." + +#~ msgctxt "Default" +#~ msgid "Buttons position saved" +#~ msgstr "Buttons position saved" + +#~ msgid "" +#~ "By clicking Create Account, you agree to abide by ProtonMail's Terms " +#~ "and Conditions." +#~ msgstr "" +#~ "By clicking Create Account, you agree to abide by ProtonMail's Terms " +#~ "and Conditions." + +#~ msgctxt "Default" +#~ msgid "" +#~ "By clicking Create Account, you agree to abide by ProtonMail's Terms " +#~ "and Conditions." +#~ msgstr "" +#~ "By clicking Create Account, you agree to abide by ProtonMail's Terms " +#~ "and Conditions." + +#~ msgctxt "Default" +#~ msgid "" +#~ "By leaving now, you will lose what you have written in this email. You " +#~ "can save a draft if you want to come back to it later on." +#~ msgstr "" +#~ "By leaving now, you will lose what you have written in this email. You " +#~ "can save a draft if you want to come back to it later on." + +#~ msgid "Cancel" +#~ msgstr "Cancel" + +#~ msgctxt "Default" +#~ msgid "Cancel" +#~ msgstr "Cancel" + +#~ msgctxt "Default" +#~ msgid "Cancellation" +#~ msgstr "Cancellation" + +#~ msgctxt "Default" +#~ msgid "Card number invalid" +#~ msgstr "Card number invalid" + +#~ msgctxt "Default" +#~ msgid "CC" +#~ msgstr "CC" + +#~ msgid "CC:" +#~ msgstr "CC:" + +#~ msgid "Change subscription" +#~ msgstr "Change subscription" + +#~ msgctxt "Default" +#~ msgid "Check your email" +#~ msgstr "Check your email" + +#~ msgid "Choose address" +#~ msgstr "Choose address" + +#~ msgctxt "Default" +#~ msgid "Choose your default language." +#~ msgstr "Choose your default language." + +#~ msgctxt "Default" +#~ msgid "" +#~ "Choose your prefered button order for marking messages as read / unread." +#~ msgstr "" +#~ "Choose your prefered button order for marking messages as read / unread." + +#~ msgctxt "Default" +#~ msgid "Clear" +#~ msgstr "Clear" + +#~ msgid "Close tutorial" +#~ msgstr "Close tutorial" + +#~ msgid "Color" +#~ msgstr "Color" + +#~ msgctxt "Default" +#~ msgid "Column" +#~ msgstr "Column" + +#~ msgid "Common login problems" +#~ msgstr "Common login problems" + +#~ msgid "Complete setup" +#~ msgstr "Complete setup" + +#~ msgid "Compose" +#~ msgstr "Compose" + +#~ msgctxt "Default" +#~ msgid "Compose mode saved" +#~ msgstr "Compose mode saved" + +#~ msgctxt "Default" +#~ msgid "Composer" +#~ msgstr "Composer" + +#~ msgid "Confirm" +#~ msgstr "Confirm" + +#~ msgctxt "Default" +#~ msgid "Confirm downgrade" +#~ msgstr "Confirm downgrade" + +#~ msgid "Confirm message password" +#~ msgstr "Confirm message password" + +#~ msgctxt "Default" +#~ msgid "Confirm new mailbox password" +#~ msgstr "Confirm new mailbox password" + +#~ msgctxt "Default" +#~ msgid "Confirm new password" +#~ msgstr "Confirm new password" + +#~ msgctxt "Default" +#~ msgid "Confirmation" +#~ msgstr "Confirmation" + +#~ msgctxt "Default" +#~ msgid "Contact added" +#~ msgstr "Contact added" + +#~ msgctxt "Default" +#~ msgid "Contact edited" +#~ msgstr "Contact edited" + +#~ msgctxt "Default" +#~ msgid "Contact exists for this email address" +#~ msgstr "Contact exists for this email address" + +#~ msgctxt "Default" +#~ msgid "Contact imported" +#~ msgstr "Contact imported" + +#~ msgid "Contact us" +#~ msgstr "Contact us" + +#~ msgid "" +#~ "Contact us at security@protonmail.com for critical security issues." +#~ msgstr "" +#~ "Contact us at security@protonmail.com for critical security issues." + +#~ msgctxt "Default" +#~ msgid "Contacts" +#~ msgstr "Contacts" + +#~ msgid "Contacts" +#~ msgstr "Contacts" + +#~ msgctxt "Default" +#~ msgid "Contacts deleted" +#~ msgstr "Contacts deleted" + +#~ msgctxt "Default" +#~ msgid "Contacts imported" +#~ msgstr "Contacts imported" + +#~ msgctxt "Error" +#~ msgid "" +#~ "Cookie are disabled.\n" +#~ "Please activate it and then reload the page.\n" +#~ "More information here." +#~ msgstr "" +#~ "Cookie are disabled.\n" +#~ "Please activate it and then reload the page.\n" +#~ "More information here." + +#~ msgctxt "Default" +#~ msgid "Coupon accepted" +#~ msgstr "Coupon accepted" + +#~ msgctxt "Error" +#~ msgid "Coupon invalid" +#~ msgstr "Coupon invalid" + +#~ msgctxt "Default" +#~ msgid "Create account" +#~ msgstr "Create account" + +#~ msgctxt "Default" +#~ msgid "Create time" +#~ msgstr "Create time" + +#~ msgid "Create your account" +#~ msgstr "Create your account" + +#~ msgctxt "Default" +#~ msgid "Creating account" +#~ msgstr "Creating account" + +#~ msgctxt "Default" +#~ msgid "Creating new mailbox" +#~ msgstr "Creating new mailbox" + +#~ msgctxt "Default" +#~ msgid "Credit" +#~ msgstr "Credit" + +#~ msgctxt "Default" +#~ msgid "Credit card" +#~ msgstr "Credit card" + +#~ msgctxt "Default" +#~ msgid "Credit:" +#~ msgstr "Credit:" + +#~ msgctxt "Default" +#~ msgid "Currency" +#~ msgstr "Currency" + +#~ msgctxt "Default" +#~ msgid "Current login password" +#~ msgstr "Current login password" + +#~ msgctxt "Default" +#~ msgid "Current mailbox password" +#~ msgstr "Current mailbox password" + +#~ msgctxt "Default" +#~ msgid "Current password" +#~ msgstr "Current password" + +#~ msgctxt "Default" +#~ msgid "Current status" +#~ msgstr "Current status" + +#~ msgid "Custom" +#~ msgstr "Custom" + +#~ msgctxt "Default" +#~ msgid "Custom addresses" +#~ msgstr "Custom addresses" + +#~ msgctxt "Default" +#~ msgid "Custom theme" +#~ msgstr "Custom theme" + +#~ msgctxt "Default" +#~ msgid "" +#~ "Custom themes from third-parties can potentially betray your privacy. " +#~ "Only use themes from trusted sources." +#~ msgstr "" +#~ "Custom themes from third-parties can potentially betray your privacy. " +#~ "Only use themes from trusted sources." + +#~ msgctxt "Default" +#~ msgid "Customize" +#~ msgstr "Customize" + +#~ msgid "Customize invoices" +#~ msgstr "Customize invoices" + +#~ msgctxt "Default" +#~ msgid "CVC invalid" +#~ msgstr "CVC invalid" + +#~ msgctxt "Default" +#~ msgid "Daily email notifications" +#~ msgstr "Daily email notifications" + +#~ msgid "Dashboard" +#~ msgstr "Dashboard" + +#~ msgctxt "Default" +#~ msgid "Dashboard" +#~ msgstr "Dashboard" + +#~ msgid "Date" +#~ msgstr "Date" + +#~ msgctxt "Default" +#~ msgid "Date" +#~ msgstr "Date" + +#~ msgctxt "Default" +#~ msgid "Decrypt" +#~ msgstr "Decrypt" + +#~ msgid "Decrypt mailbox" +#~ msgstr "Decrypt mailbox" + +#~ msgctxt "Default" +#~ msgid "Decrypt message" +#~ msgstr "Decrypt message" + +#~ msgctxt "Default" +#~ msgid "Decrypting" +#~ msgstr "Decrypting" + +#~ msgctxt "Default" +#~ msgid "Decrypting..." +#~ msgstr "Decrypting..." + +#~ msgctxt "Default" +#~ msgid "Decryption error" +#~ msgstr "Decryption error" + +#~ msgid "Decryption error" +#~ msgstr "Decryption error" + +#~ msgctxt "Default" +#~ msgid "Decryption of this message's encryption content failed." +#~ msgstr "Decryption of this message's encryption content failed." + +#~ msgid "Decryption of this message's encryption content failed." +#~ msgstr "Decryption of this message’s encryption content failed." + +#~ msgctxt "Default" +#~ msgid "Default" +#~ msgstr "Default" + +#~ msgctxt "Default" +#~ msgid "Default identity" +#~ msgstr "Default identity" + +#~ msgctxt "Default" +#~ msgid "Delete" +#~ msgstr "Delete" + +#~ msgid "Delete" +#~ msgstr "Delete" + +#~ msgctxt "Default" +#~ msgid "Delete account" +#~ msgstr "Delete account" + +#~ msgid "Delete account" +#~ msgstr "Delete account" + +#~ msgctxt "Default" +#~ msgid "Delete address" +#~ msgstr "Delete address" + +#~ msgctxt "Default" +#~ msgid "Delete all" +#~ msgstr "Delete all" + +#~ msgid "Delete all" +#~ msgstr "Delete all" + +#~ msgid "" +#~ "Delete any other MX records or make sure ProtonMail's Priority is the " +#~ "lowest number." +#~ msgstr "" +#~ "Delete any other MX records or make sure ProtonMail’s Priority is the " +#~ "lowest number." + +#~ msgctxt "Default" +#~ msgid "Delete domain" +#~ msgstr "Delete domain" + +#~ msgctxt "Default" +#~ msgid "Delete payment method" +#~ msgstr "Delete payment method" + +#~ msgctxt "Default" +#~ msgid "Delete your account" +#~ msgstr "Delete your account" + +#~ msgid "Deselect all" +#~ msgstr "Deselect all" + +#~ msgctxt "Default" +#~ msgid "Disable" +#~ msgstr "Disable" + +#~ msgctxt "Default" +#~ msgid "Disable address" +#~ msgstr "Disable address" + +#~ msgctxt "Default" +#~ msgid "Disabled" +#~ msgstr "Disabled" + +#~ msgid "Discard" +#~ msgstr "Discard" + +#~ msgctxt "Default" +#~ msgid "Display invoice" +#~ msgstr "Display invoice" + +#~ msgctxt "Default" +#~ msgid "" +#~ "Display name " +#~ msgstr "" +#~ "Display name " + +#~ msgid "Domain" +#~ msgstr "Domain" + +#~ msgctxt "Default" +#~ msgid "Domain" +#~ msgstr "Domain" + +#~ msgctxt "Default" +#~ msgid "Domain created" +#~ msgstr "Domain created" + +#~ msgctxt "Default" +#~ msgid "Domain deleted" +#~ msgstr "Domain deleted" + +#~ msgctxt "Default" +#~ msgid "Domain verified" +#~ msgstr "Domain verified" + +#~ msgid "Domains" +#~ msgstr "Domains" + +#~ msgctxt "Default" +#~ msgid "Domains" +#~ msgstr "Domains" + +#~ msgid "Domains used" +#~ msgstr "Domains used" + +#~ msgctxt "Default" +#~ msgid "Domains:" +#~ msgstr "Domains:" + +#~ msgid "Donate" +#~ msgstr "Donate" + +#~ msgctxt "Default" +#~ msgid "Donate" +#~ msgstr "Donate" + +#~ msgid "Donate to ProtonMail" +#~ msgstr "Donate to ProtonMail" + +#~ msgctxt "Default" +#~ msgid "Donation" +#~ msgstr "Donation" + +#~ msgctxt "Default" +#~ msgid "Downgrade to Free" +#~ msgstr "Downgrade to Free" + +#~ msgctxt "Default" +#~ msgid "Downgrade to Plus" +#~ msgstr "Downgrade to Plus" + +#~ msgctxt "Default" +#~ msgid "Download" +#~ msgstr "Download" + +#~ msgctxt "Default" +#~ msgid "" +#~ "Download your PGP Keys for use with other PGP compatible services. Only " +#~ "incoming messages in inline OpenPGP format are currently supported." +#~ msgstr "" +#~ "Download your PGP Keys for use with other PGP compatible services. Only " +#~ "incoming messages in inline OpenPGP format are currently supported." + +#~ msgid "Downloading" +#~ msgstr "Downloading" + +#~ msgctxt "Noun" +#~ msgid "Drafts" +#~ msgstr "Drafts" + +#~ msgctxt "Default" +#~ msgid "Drafts" +#~ msgstr "Drafts" + +#~ msgid "Drafts" +#~ msgstr "Drafts" + +#~ msgctxt "Default" +#~ msgid "Drop a file here to upload" +#~ msgstr "Drop a file here to upload" + +#~ msgid "Drop here" +#~ msgstr "Drop here" + +#~ msgctxt "Default" +#~ msgid "Edit" +#~ msgstr "Edit" + +#~ msgctxt "Default" +#~ msgid "Edit identity" +#~ msgstr "Edit identity" + +#~ msgctxt "Default" +#~ msgid "Email" +#~ msgstr "Email" + +#~ msgid "Email" +#~ msgstr "Email" + +#~ msgid "Email address" +#~ msgstr "Email address" + +#~ msgctxt "Default" +#~ msgid "Email already taken" +#~ msgstr "Email already taken" + +#~ msgctxt "Default" +#~ msgid "Email available" +#~ msgstr "Email available" + +#~ msgctxt "Default" +#~ msgid "Email images" +#~ msgstr "Email images" + +#~ msgid "Email our support team" +#~ msgstr "Email our support team" + +#~ msgid "Empty drafts" +#~ msgstr "Empty drafts" + +#~ msgid "Empty spam" +#~ msgstr "Empty spam" + +#~ msgid "Empty trash" +#~ msgstr "Empty trash" + +#~ msgctxt "Default" +#~ msgid "Enable" +#~ msgstr "Enable" + +#~ msgctxt "Default" +#~ msgid "Enabled" +#~ msgstr "Enabled" + +#~ msgid "Encrypt for non-ProtonMail users" +#~ msgstr "Encrypt for non-ProtonMail users" + +#~ msgid "" +#~ "Encrypted messages to non-ProtonMail recipients will expire in 28 days " +#~ "unless a shorter expiration time is set." +#~ msgstr "" +#~ "Encrypted messages to non-ProtonMail recipients will expire in 28 days " +#~ "unless a shorter expiration time is set." + +#~ msgid "Encrypting" +#~ msgstr "Encrypting" + +#~ msgid "End date" +#~ msgstr "End date" + +#~ msgctxt "Default" +#~ msgid "End to end encrypted for outside" +#~ msgstr "End to end encrypted for outside" + +#~ msgctxt "Default" +#~ msgid "End to end encrypted for outside reply" +#~ msgstr "End to end encrypted for outside reply" + +#~ msgctxt "Default" +#~ msgid "End to end encrypted internal message" +#~ msgstr "End to end encrypted internal message" + +#~ msgctxt "Default" +#~ msgid "End to end encrypted using PGP" +#~ msgstr "End to end encrypted using PGP" + +#~ msgctxt "Default" +#~ msgid "End to end encrypted using PGP/MIME" +#~ msgstr "End to end encrypted using PGP/MIME" + +#~ msgctxt "Default" +#~ msgid "English" +#~ msgstr "English" + +#~ msgid "" +#~ "Enter custom text that you want to appear on your invoice beneath the " +#~ "ProtonMail logo." +#~ msgstr "" +#~ "Enter custom text that you want to appear on your invoice beneath the " +#~ "ProtonMail logo." + +#~ msgctxt "Default" +#~ msgid "Enter mailbox" +#~ msgstr "Enter mailbox" + +#~ msgid "Enter your login password to confirm your identity:" +#~ msgstr "Enter your login password to confirm your identity:" + +#~ msgctxt "Default" +#~ msgid "Error" +#~ msgstr "Error" + +#~ msgid "Error" +#~ msgstr "Error" + +#~ msgid "Error connecting to PayPal." +#~ msgstr "Error connecting to PayPal." + +#~ msgctxt "Default" +#~ msgid "Error during organization request" +#~ msgstr "Error during organization request" + +#~ msgctxt "Default" +#~ msgid "Error during the encryption" +#~ msgstr "Error during the encryption" + +#~ msgctxt "Default" +#~ msgid "Error during the reply process" +#~ msgstr "Error during the reply process" + +#~ msgctxt "Default" +#~ msgid "Error processing payment." +#~ msgstr "Error processing payment." + +#~ msgctxt "Default" +#~ msgid "Error while processing donation." +#~ msgstr "Error while processing donation." + +#~ msgctxt "Default" +#~ msgid "Event" +#~ msgstr "Event" + +#~ msgctxt "Default" +#~ msgid "Expiration" +#~ msgstr "Expiration" + +#~ msgid "Expiration time" +#~ msgstr "Expiration time" + +#~ msgctxt "Default" +#~ msgid "Expiring in" +#~ msgstr "Expiring in" + +#~ msgctxt "Default" +#~ msgid "Expiry invalid" +#~ msgstr "Expiry invalid" + +#~ msgctxt "Default" +#~ msgid "External message stored encrypted" +#~ msgstr "External message stored encrypted" + +#~ msgid "Feedback form" +#~ msgstr "Feedback form" + +#~ msgctxt "Default" +#~ msgid "Field required" +#~ msgstr "Field required" + +#~ msgid "Files attached" +#~ msgstr "Files attached" + +#~ msgctxt "Default" +#~ msgid "Fingerprint" +#~ msgstr "Fingerprint" + +#~ msgid "Finish" +#~ msgstr "Finish" + +#~ msgctxt "Default" +#~ msgid "Folder emptied" +#~ msgstr "Folder emptied" + +#~ msgid "For more help please contact us directly: support@protonmail.com" +#~ msgstr "For more help please contact us directly: support@protonmail.com" + +#~ msgid "" +#~ "For security reasons, we need to verify that you are the owner of your " +#~ "domain. Please add the following code into your DNS. Do not " +#~ "remove it even after successful verification. This can typically " +#~ "be done in the control panel of your domain name registrar." +#~ msgstr "" +#~ "For security reasons, we need to verify that you are the owner of your " +#~ "domain. Please add the following code into your DNS. Do not " +#~ "remove it even after successful verification. This can typically " +#~ "be done in the control panel of your domain name registrar." + +#~ msgctxt "Default" +#~ msgid "Forgot password?" +#~ msgstr "Forgot password?" + +#~ msgid "Forgot username?" +#~ msgstr "Forgot username?" + +#~ msgctxt "Default" +#~ msgid "Free" +#~ msgstr "Free" + +#~ msgctxt "Default" +#~ msgid "Fw:" +#~ msgstr "Fw:" + +#~ msgctxt "Default" +#~ msgid "Generate key pair" +#~ msgstr "Generate key pair" + +#~ msgctxt "Default" +#~ msgid "Generate keys" +#~ msgstr "Generate keys" + +#~ msgid "Generate keys" +#~ msgstr "Generate keys" + +#~ msgctxt "Default" +#~ msgid "Generate missing keys" +#~ msgstr "Generate missing keys" + +#~ msgctxt "Default" +#~ msgid "Generate new key pair" +#~ msgstr "Generate new key pair" + +#~ msgid "Generating" +#~ msgstr "Generating" + +#~ msgid "" +#~ "Generating 4096-bit encryption keys may crash or freeze your browser. " +#~ "4096-bit keys are only recommended for high performance computers - not " +#~ "recommended for tablet and mobile devices." +#~ msgstr "" +#~ "Generating 4096-bit encryption keys may crash or freeze your browser. " +#~ "4096-bit keys are only recommended for high performance computers - not " +#~ "recommended for tablet and mobile devices." + +#~ msgctxt "Default" +#~ msgid "Generating keys..." +#~ msgstr "Generating keys..." + +#~ msgctxt "Default" +#~ msgid "Having trouble? Use the old version (v2)" +#~ msgstr "Having trouble? Use the old version (v2)" + +#~ msgid "Help" +#~ msgstr "Help" + +#~ msgid "Help & answers" +#~ msgstr "Help & answers" + +#~ msgid "Help and support" +#~ msgstr "Help and support" + +#~ msgid "Help us protect online privacy" +#~ msgstr "Help us protect online privacy" + +#~ msgid "" +#~ "Here is a basic DMARC record that does nothing except email you reports." +#~ msgstr "" +#~ "Here is a basic DMARC record that does nothing except email you reports." + +#~ msgid "Hide" +#~ msgstr "Hide" + +#~ msgid "Hide details" +#~ msgstr "Hide details" + +#~ msgid "High security" +#~ msgstr "High security" + +#~ msgid "Highest security" +#~ msgstr "Highest security" + +#~ msgctxt "Default" +#~ msgid "How does this work?" +#~ msgstr "How does this work?" + +#~ msgid "I have a question" +#~ msgstr "I have a question" + +#~ msgid "Identity" +#~ msgstr "Identity" + +#~ msgctxt "Default" +#~ msgid "Identity" +#~ msgstr "Identity" + +#~ msgid "" +#~ "If this domain is currently actively receiving emails, create all used " +#~ "email addresses in Step 3 before changing MX record to ensure a smooth " +#~ "transition." +#~ msgstr "" +#~ "If this domain is currently actively receiving emails, create all used " +#~ "email addresses in Step 3 before changing MX record to ensure a smooth " +#~ "transition." + +#~ msgctxt "Default" +#~ msgid "" +#~ "If you forget your mailbox password, you can reset your account but..." +#~ msgstr "" +#~ "If you forget your mailbox password, you can reset your account but..." + +#~ msgid "" +#~ "If you have questions or need help, please visit our support page to find " +#~ "troubleshooting guides and contact our support team. If you find a bug in " +#~ "ProtonMail, please let us know! You can send us a bug report by clicking " +#~ "Report bugs (1)" +#~ msgstr "" +#~ "If you have questions or need help, please visit our support page to find " +#~ "troubleshooting guides and contact our support team. If you find a bug in " +#~ "ProtonMail, please let us know! You can send us a bug report by clicking " +#~ "Report bugs (1)" + +#~ msgid "" +#~ "If you have set both SPF and DKIM, DMARC allows you to specify how other " +#~ "email services should deliver email for your domain if both SPF and DKIM " +#~ "checks have failed. This can make it harder for spammers pretending to be " +#~ "you but may also cause delivery issues if not done properly. Feel free to " +#~ "ignore and skip DMARC unless you really want strict policies such as " +#~ "p=quarantine or p=reject. Learn more" +#~ msgstr "" +#~ "If you have set both SPF and DKIM, DMARC allows you to specify how other " +#~ "email services should deliver email for your domain if both SPF and DKIM " +#~ "checks have failed. This can make it harder for spammers pretending to be " +#~ "you but may also cause delivery issues if not done properly. Feel free to " +#~ "ignore and skip DMARC unless you really want strict policies such as " +#~ "p=quarantine or p=reject. Learn more" + +#~ msgctxt "Default" +#~ msgid "" +#~ "If you lose your mailbox password, you won't be able to read your emails, " +#~ "we cannot recover this password for you." +#~ msgstr "" +#~ "If you lose your mailbox password, you won't be able to read your emails, " +#~ "we cannot recover this password for you." + +#~ msgid "" +#~ "If you want to keep an existing SPF record, you can just add " +#~ "include:_spf.protonmail.ch to it after the v=spf1. Do not create multiple SPF records." +#~ msgstr "" +#~ "If you want to keep an existing SPF record, you can just add " +#~ "include:_spf.protonmail.ch to it after the v=spf1. Do not create multiple SPF records." + +#~ msgid "" +#~ "If you wish to delete in order to combine this account with another one, " +#~ "do NOT delete your account. You need to instead follow the procedure here." +#~ msgstr "" +#~ "If you wish to delete in order to combine this account with another one, " +#~ "do NOT delete your account. You need to instead follow the procedure here." + +#~ msgctxt "Default" +#~ msgid "Inactive addresses" +#~ msgstr "Inactive addresses" + +#~ msgctxt "Noun" +#~ msgid "Inbox" +#~ msgstr "Inbox" + +#~ msgctxt "Default" +#~ msgid "Inbox" +#~ msgstr "Inbox" + +#~ msgctxt "Default" +#~ msgid "Internationalization" +#~ msgstr "Internationalization" + +#~ msgctxt "Default" +#~ msgid "Invalid email." +#~ msgstr "Invalid email." + +#~ msgctxt "Default" +#~ msgid "Invalid recovery email." +#~ msgstr "Invalid recovery email." + +#~ msgctxt "Default" +#~ msgid "Invoice" +#~ msgstr "Invoice" + +#~ msgctxt "Default" +#~ msgid "Invoices" +#~ msgstr "Invoices" + +#~ msgid "It can take up to a day for DNS changes to update." +#~ msgstr "It can take up to a day for DNS changes to update." + +#~ msgid "" +#~ "It's also possible to donate with PayPal or Bitcoin." +#~ msgstr "" +#~ "It’s also possible to donate with PayPal or Bitcoin." + +#~ msgctxt "Default" +#~ msgid "Keep this password safe - it cannot be recovered." +#~ msgstr "Keep this password safe - it cannot be recovered." + +#~ msgid "" +#~ "Keep this record in your DNS for as long as you want to use DKIM. You can " +#~ "change its Value to off to disable DKIM" +#~ msgstr "" +#~ "Keep this record in your DNS for as long as you want to use DKIM. You can " +#~ "change its Value to off to disable DKIM" + +#~ msgctxt "Default" +#~ msgid "Key size" +#~ msgstr "Key size" + +#~ msgid "Label" +#~ msgstr "Label" + +#~ msgctxt "Default" +#~ msgid "Label" +#~ msgstr "Label" + +#~ msgctxt "Default" +#~ msgid "Label created" +#~ msgstr "Label created" + +#~ msgctxt "Default" +#~ msgid "Label deleted" +#~ msgstr "Label deleted" + +#~ msgctxt "Default" +#~ msgid "Label edited" +#~ msgstr "Label edited" + +#~ msgctxt "Default" +#~ msgid "Label order saved" +#~ msgstr "Label order saved" + +#~ msgid "Label settings" +#~ msgstr "Label settings" + +#~ msgctxt "Default" +#~ msgid "Labels" +#~ msgstr "Labels" + +#~ msgid "" +#~ "Labels are a powerful tool to manage your inbox. You can add and remove " +#~ "labels from selected emails by clicking the Label button (1). You can also add, delete, and edit labels by clicking on " +#~ "Label settings (2)." +#~ msgstr "" +#~ "Labels are a powerful tool to manage your inbox. You can add and remove " +#~ "labels from selected emails by clicking the Label button (1). You can also add, delete, and edit labels by clicking on " +#~ "Label settings (2)." + +#~ msgctxt "Default" +#~ msgid "Labels saved" +#~ msgstr "Labels saved" + +#~ msgid "Large to small" +#~ msgstr "Large to small" + +#~ msgctxt "Default" +#~ msgid "Layout" +#~ msgstr "Layout" + +#~ msgctxt "Default" +#~ msgid "Layout saved" +#~ msgstr "Layout saved" + +#~ msgctxt "Default" +#~ msgid "Learn more" +#~ msgstr "Learn more" + +#~ msgctxt "Default" +#~ msgid "Limited support" +#~ msgstr "Limited support" + +#~ msgctxt "Default" +#~ msgid "Load classic theme" +#~ msgstr "Load classic theme" + +#~ msgctxt "Default" +#~ msgid "Load edison theme" +#~ msgstr "Load edison theme" + +#~ msgid "Loading" +#~ msgstr "Loading" + +#~ msgctxt "Default" +#~ msgid "Loading themes will override your current theme!" +#~ msgstr "Loading themes will override your current theme!" + +#~ msgctxt "Default" +#~ msgid "Loading..." +#~ msgstr "Loading..." + +#~ msgid "Location" +#~ msgstr "Location" + +#~ msgctxt "Default" +#~ msgid "Log out" +#~ msgstr "Log out" + +#~ msgctxt "Default" +#~ msgid "Logging preference updated" +#~ msgstr "Logging preference updated" + +#~ msgctxt "Default" +#~ msgid "Login" +#~ msgstr "Login" + +#~ msgctxt "Default" +#~ msgid "Login failed" +#~ msgstr "Login failed" + +#~ msgctxt "Default" +#~ msgid "Login password" +#~ msgstr "Login password" + +#~ msgctxt "Default" +#~ msgid "Login password is required." +#~ msgstr "Login password is required." + +#~ msgid "Login password required" +#~ msgstr "Login password required" + +#~ msgctxt "Default" +#~ msgid "Login success" +#~ msgstr "Login success" + +#~ msgid "Logout" +#~ msgstr "Logout" + +#~ msgctxt "Default" +#~ msgid "Logs cleared" +#~ msgstr "Logs cleared" + +#~ msgctxt "Default" +#~ msgid "Mailbox password" +#~ msgstr "Mailbox password" + +#~ msgctxt "Default" +#~ msgid "Mailbox password is required." +#~ msgstr "Mailbox password is required." + +#~ msgctxt "Default" +#~ msgid "Main" +#~ msgstr "Main" + +#~ msgctxt "Default" +#~ msgid "Make default" +#~ msgstr "Make default" + +#~ msgctxt "Default" +#~ msgid "Make primary" +#~ msgstr "Make primary" + +#~ msgctxt "Default" +#~ msgid "Manage" +#~ msgstr "Manage" + +#~ msgctxt "Default" +#~ msgid "Manage password" +#~ msgstr "Manage password" + +#~ msgid "Manage storage" +#~ msgstr "Manage storage" + +#~ msgid "Manage your email with labels" +#~ msgstr "Manage your email with labels" + +#~ msgctxt "Default" +#~ msgid "Manual" +#~ msgstr "Manual" + +#~ msgid "Mark as spam" +#~ msgstr "Mark as spam" + +#~ msgctxt "Default" +#~ msgid "Master" +#~ msgstr "Master" + +#~ msgctxt "Default" +#~ msgid "Maximized" +#~ msgstr "Maximized" + +#~ msgctxt "Default" +#~ msgid "Me" +#~ msgstr "Me" + +#~ msgctxt "Default" +#~ msgid "Member removed" +#~ msgstr "Member removed" + +#~ msgctxt "Default" +#~ msgid "Members" +#~ msgstr "Members" + +#~ msgctxt "Default" +#~ msgid "Message discarded" +#~ msgstr "Message discarded" + +#~ msgctxt "Default" +#~ msgid "Message saved" +#~ msgstr "Message saved" + +#~ msgctxt "Default" +#~ msgid "Message sent" +#~ msgstr "Message sent" + +#~ msgctxt "Default" +#~ msgid "Messages per day" +#~ msgstr "Messages per day" + +#~ msgctxt "Default" +#~ msgid "Missing keys" +#~ msgstr "Missing keys" + +#, fuzzy +#~ msgctxt "Default" +#~ msgid "Month" +#~ msgstr "Month" + +#~ msgctxt "Default" +#~ msgid "Monthly" +#~ msgstr "Monthly" + +#~ msgid "More labels" +#~ msgstr "More labels" + +#~ msgid "Move to archive" +#~ msgstr "Move to archive" + +#~ msgid "Move to inbox" +#~ msgstr "Move to inbox" + +#~ msgid "Move to spam" +#~ msgstr "Move to spam" + +#~ msgid "Move to trash" +#~ msgstr "Move to trash" + +#~ msgctxt "Default" +#~ msgid "My organization" +#~ msgstr "My organization" + +#~ msgctxt "Default" +#~ msgid "My subscription" +#~ msgstr "My subscription" + +#~ msgctxt "Default" +#~ msgid "Name" +#~ msgstr "Name" + +#~ msgctxt "Default" +#~ msgid "Need help?" +#~ msgstr "Need help?" + +#~ msgctxt "Default" +#~ msgid "New mailbox password" +#~ msgstr "New mailbox password" + +#~ msgctxt "Default" +#~ msgid "New message" +#~ msgstr "New message" + +#~ msgctxt "Default" +#~ msgid "New password" +#~ msgstr "New password" + +#~ msgid "New to old" +#~ msgstr "New to old" + +#~ msgid "No conversations" +#~ msgstr "No conversations" + +#~ msgctxt "Default" +#~ msgid "No custom domain found" +#~ msgstr "No custom domain found" + +#~ msgid "No labels" +#~ msgstr "No labels" + +#~ msgctxt "Default" +#~ msgid "No logs yet." +#~ msgstr "No logs yet." + +#~ msgid "No messages" +#~ msgstr "No messages" + +#~ msgctxt "Default" +#~ msgid "No results for this search in your contacts list." +#~ msgstr "No results for this search in your contacts list." + +#~ msgctxt "Default" +#~ msgid "No subject" +#~ msgstr "No subject" + +#~ msgctxt "Default" +#~ msgid "No subject, send anyway?" +#~ msgstr "No subject, send anyway?" + +#~ msgctxt "Default" +#~ msgid "" +#~ "Non-original @protonmail addresses can never be deleted " +#~ "(only disabled). This means that once you create an address it will " +#~ "always count towards your address limit. Custom domain addresses must be " +#~ "disabled before they can be deleted. Custom domain addresses can only be " +#~ "deleted if all messages associated with that address are deleted. Learn more about addresses here." +#~ msgstr "" +#~ "Non-original @protonmail addresses can never be deleted " +#~ "(only disabled). This means that once you create an address it will " +#~ "always count towards your address limit. Custom domain addresses must be " +#~ "disabled before they can be deleted. Custom domain addresses can only be " +#~ "deleted if all messages associated with that address are deleted. Learn more about addresses here." + +#~ msgctxt "Default" +#~ msgid "None" +#~ msgstr "None" + +#~ msgctxt "Default" +#~ msgid "Notifications" +#~ msgstr "Notifications" + +#~ msgctxt "Default" +#~ msgid "Number" +#~ msgstr "Number" + +#~ msgctxt "Default" +#~ msgid "Number of users:" +#~ msgstr "Number of users:" + +#~ msgid "OK" +#~ msgstr "OK" + +#~ msgid "Old to new" +#~ msgstr "Old to new" + +#~ msgid "Operating system" +#~ msgstr "Operating system" + +#~ msgctxt "Default" +#~ msgid "Organization" +#~ msgstr "Organization" + +#~ msgid "" +#~ "Organization administrators cannot access the messages of private users." +#~ msgstr "" +#~ "Organization administrators cannot access the messages of private users." + +#~ msgctxt "Default" +#~ msgid "Organization history" +#~ msgstr "Organization history" + +#~ msgctxt "Default" +#~ msgid "Organization name" +#~ msgstr "Organization name" + +#~ msgid "Organization recovery password" +#~ msgstr "Organization recovery password" + +#~ msgctxt "Default" +#~ msgid "Organization storage:" +#~ msgstr "Organization storage:" + +#~ msgctxt "Default" +#~ msgid "Organization updated" +#~ msgstr "Organization updated" + +#~ msgctxt "Default" +#~ msgid "Orphan" +#~ msgstr "Orphan" + +#~ msgctxt "Default" +#~ msgid "Other" +#~ msgstr "Other" + +#~ msgctxt "Default" +#~ msgid "Others identities" +#~ msgstr "Others identities" + +#~ msgctxt "Default" +#~ msgid "Our secure email requires a modern web browser." +#~ msgstr "Our secure email requires a modern web browser." + +#~ msgctxt "Default" +#~ msgid "Overview" +#~ msgstr "Overview" + +#~ msgctxt "Default" +#~ msgid "Paid" +#~ msgstr "Paid" + +#~ msgid "Password hint (optional)" +#~ msgstr "Password hint (optional)" + +#~ msgctxt "Default" +#~ msgid "Passwords don't match" +#~ msgstr "Passwords don't match" + +#~ msgctxt "Default" +#~ msgid "Passwords don't match." +#~ msgstr "Passwords don't match." + +#~ msgctxt "Default" +#~ msgid "Pay" +#~ msgstr "Pay" + +#~ msgid "Pay invoice" +#~ msgstr "Pay invoice" + +#~ msgid "Payment" +#~ msgstr "Payment" + +#~ msgid "Payment details" +#~ msgstr "Payment details" + +#~ msgctxt "Default" +#~ msgid "Payment method deleted" +#~ msgstr "Payment method deleted" + +#~ msgctxt "Default" +#~ msgid "Payment method updated" +#~ msgstr "Payment method updated" + +#~ msgctxt "Default" +#~ msgid "Payment methods" +#~ msgstr "Payment methods" + +#~ msgctxt "Default" +#~ msgid "Payment:" +#~ msgstr "Payment:" + +#~ msgid "Payments" +#~ msgstr "Payments" + +#~ msgctxt "Default" +#~ msgid "Payments" +#~ msgstr "Payments" + +#~ msgid "Personalize your layout" +#~ msgstr "Personalize your layout" + +#~ msgctxt "Default" +#~ msgid "Plan subscription" +#~ msgstr "Plan subscription" + +#~ msgctxt "Default" +#~ msgid "Plan:" +#~ msgstr "Plan:" + +#~ msgctxt "Default" +#~ msgid "Plans and prices" +#~ msgstr "Plans and prices" + +#~ msgid "" +#~ "Please add the following MX record. Note, DNS records can take several " +#~ "hours to update." +#~ msgstr "" +#~ "Please add the following MX record. Note, DNS records can take several " +#~ "hours to update." + +#~ msgid "Please add the following TXT record:" +#~ msgstr "Please add the following TXT record:" + +#~ msgid "" +#~ "Please add the following TXT record. Note, DNS records can take several " +#~ "hours to update." +#~ msgstr "" +#~ "Please add the following TXT record. Note, DNS records can take several " +#~ "hours to update." + +#~ msgctxt "Default" +#~ msgid "Please check your email and enter the code below:" +#~ msgstr "Please check your email and enter the code below:" + +#~ msgid "Please tell us why you are leaving:" +#~ msgstr "Please tell us why you are leaving:" + +#~ msgctxt "Default" +#~ msgid "Popup" +#~ msgstr "Popup" + +#~ msgid "Price" +#~ msgstr "Price" + +#~ msgctxt "Default" +#~ msgid "Price" +#~ msgstr "Price" + +#~ msgctxt "Default" +#~ msgid "Primary" +#~ msgstr "Primary" + +#~ msgid "Print" +#~ msgstr "Print" + +#~ msgctxt "Default" +#~ msgid "Priority support" +#~ msgstr "Priority support" + +#~ msgctxt "Default" +#~ msgid "Private key" +#~ msgstr "Private key" + +#~ msgid "Private user" +#~ msgstr "Private user" + +#~ msgid "" +#~ "ProtonMail address can never be deleted (only disabled). This means that " +#~ "once you create an address it will always count towards your address " +#~ "limit. Learn more about addresses here." +#~ msgstr "" +#~ "ProtonMail address can never be deleted (only disabled). This means that " +#~ "once you create an address it will always count towards your address " +#~ "limit. Learn more about addresses here." + +#~ msgctxt "Default" +#~ msgid "ProtonMail addresses" +#~ msgstr "ProtonMail addresses" + +#~ msgctxt "Default" +#~ msgid "ProtonMail aliases" +#~ msgstr "ProtonMail aliases" + +#~ msgid "" +#~ "ProtonMail allows you to fully customize your inbox experience. By " +#~ "clicking (1) you can quickly switch between two possible " +#~ "layouts. You can set a default layout, set your composer style, adjust " +#~ "button layouts, and even switch themes under Settings --> " +#~ "Appearance (2)" +#~ msgstr "" +#~ "ProtonMail allows you to fully customize your inbox experience. By " +#~ "clicking (1) you can quickly switch between two possible " +#~ "layouts. You can set a default layout, set your composer style, adjust " +#~ "button layouts, and even switch themes under Settings —> " +#~ "Appearance (2)" + +#~ msgctxt "Default" +#~ msgid "" +#~ "ProtonMail business accounts can create subaccounts which are used by " +#~ "other members of your organization." +#~ msgstr "" +#~ "ProtonMail business accounts can create subaccounts which are used by " +#~ "other members of your organization." + +#~ msgid "" +#~ "ProtonMail is open source software that protects your privacy and doesn't " +#~ "have ads. Your support is essential for keeping the service running." +#~ msgstr "" +#~ "ProtonMail is open source software that protects your privacy and doesn't " +#~ "have ads. Your support is essential for keeping the service running." + +#~ msgctxt "Default" +#~ msgid "" +#~ "ProtonMail supports both column and row layouts for the inbox. Using this " +#~ "setting, it is possible to change between the two layouts." +#~ msgstr "" +#~ "ProtonMail supports both column and row layouts for the inbox. Using this " +#~ "setting, it is possible to change between the two layouts." + +#~ msgctxt "Default" +#~ msgid "Public key" +#~ msgstr "Public key" + +#~ msgctxt "Default" +#~ msgid "Quota updated" +#~ msgstr "Quota updated" + +#~ msgctxt "Default" +#~ msgid "Re:" +#~ msgstr "Re:" + +#~ msgid "Reactivate key pair" +#~ msgstr "Reactivate key pair" + +#~ msgctxt "Default" +#~ msgid "reCaptcha verification" +#~ msgstr "reCaptcha verification" + +#~ msgid "Recipient" +#~ msgstr "Recipient" + +#~ msgid "Recipients" +#~ msgstr "Recipients" + +#~ msgctxt "Default" +#~ msgid "Recovery email" +#~ msgstr "Recovery email" + +#~ msgctxt "Default" +#~ msgid "Redirecting" +#~ msgstr "Redirecting" + +#~ msgctxt "Default" +#~ msgid "Refresh domain status" +#~ msgstr "Refresh domain status" + +#~ msgid "Remove link" +#~ msgstr "Remove link" + +#~ msgctxt "Default" +#~ msgid "Remove member" +#~ msgstr "Remove member" + +#~ msgctxt "Default" +#~ msgid "Remove user" +#~ msgstr "Remove user" + +#~ msgctxt "Default" +#~ msgid "Reply securely" +#~ msgstr "Reply securely" + +#~ msgid "Report a bug" +#~ msgstr "Report a bug" + +#~ msgid "Report bug" +#~ msgstr "Report bug" + +#~ msgctxt "Default" +#~ msgid "Reset" +#~ msgstr "Reset" + +#~ msgctxt "Default" +#~ msgid "Reset login password" +#~ msgstr "Reset login password" + +#~ msgctxt "Default" +#~ msgid "Reset mailbox" +#~ msgstr "Reset mailbox" + +#~ msgctxt "Default" +#~ msgid "Reset now" +#~ msgstr "Reset now" + +#~ msgid "Reset password" +#~ msgstr "Reset password" + +#~ msgctxt "Default" +#~ msgid "Role" +#~ msgstr "Role" + +#~ msgctxt "Default" +#~ msgid "Role updated" +#~ msgstr "Role updated" + +#~ msgctxt "Default" +#~ msgid "Row" +#~ msgstr "Row" + +#~ msgctxt "Default" +#~ msgid "" +#~ "Safari doesn't support downloading of keys. We are working on a fix for " +#~ "this." +#~ msgstr "" +#~ "Safari doesn't support downloading of keys. We are working on a fix for " +#~ "this." + +#~ msgctxt "Default" +#~ msgid "Save" +#~ msgstr "Save" + +#~ msgid "Saved at" +#~ msgstr "Saved at" + +#~ msgid "Saving" +#~ msgstr "Saving" + +#~ msgctxt "Default" +#~ msgid "Saving encrypted keys" +#~ msgstr "Saving encrypted keys" + +#~ msgid "Search" +#~ msgstr "Search" + +#~ msgctxt "Default" +#~ msgid "Seconds" +#~ msgstr "Seconds" + +#~ msgid "Security" +#~ msgstr "Security" + +#~ msgctxt "Default" +#~ msgid "Security" +#~ msgstr "Security" + +#~ msgid "Select domain" +#~ msgstr "Select domain" + +#~ msgid "Select payment method" +#~ msgstr "Select payment method" + +#~ msgid "Select payment method:" +#~ msgstr "Select payment method:" + +#~ msgid "Send" +#~ msgstr "Send" + +#~ msgctxt "Default" +#~ msgid "Send" +#~ msgstr "Send" + +#~ msgctxt "Default" +#~ msgid "Send new code" +#~ msgstr "Send new code" + +#~ msgid "Send new code" +#~ msgstr "Send new code" + +#~ msgid "Sender" +#~ msgstr "Sender" + +#~ msgid "Sending" +#~ msgstr "Sending" + +#~ msgctxt "Noun" +#~ msgid "Sent" +#~ msgstr "Sent" + +#~ msgctxt "Default" +#~ msgid "Sent" +#~ msgstr "Sent" + +#~ msgid "Settings" +#~ msgstr "Settings" + +#~ msgid "Show" +#~ msgstr "Show" + +#~ msgid "Show details" +#~ msgstr "Show details" + +#~ msgid "Show images" +#~ msgstr "Show images" + +#~ msgctxt "Default" +#~ msgid "Show images" +#~ msgstr "Show images" + +#~ msgctxt "Default" +#~ msgid "Show previous message" +#~ msgstr "Show previous message" + +#~ msgid "Show read" +#~ msgstr "Show read" + +#~ msgid "Show unread" +#~ msgstr "Show unread" + +#~ msgctxt "Default" +#~ msgid "Sign up failed" +#~ msgstr "Sign up failed" + +#~ msgctxt "Default" +#~ msgid "Sign up for free" +#~ msgstr "Sign up for free" + +#~ msgid "Sign up for free" +#~ msgstr "Sign up for free" + +#~ msgid "Signature" +#~ msgstr "Signature" + +#~ msgctxt "Default" +#~ msgid "Signature" +#~ msgstr "Signature" + +#~ msgid "Size" +#~ msgstr "Size" + +#~ msgid "Small to large" +#~ msgstr "Small to large" + +#~ msgctxt "Default" +#~ msgid "SMS verification" +#~ msgstr "SMS verification" + +#~ msgctxt "Default" +#~ msgid "Sorry, this message does not exist or has already expired" +#~ msgstr "Sorry, this message does not exist or has already expired" + +#~ msgctxt "Default" +#~ msgid "Space" +#~ msgstr "Space" + +#~ msgctxt "Default" +#~ msgid "Spam" +#~ msgstr "Spam" + +#~ msgctxt "Noun" +#~ msgid "Spam" +#~ msgstr "Spam" + +#~ msgid "" +#~ "SPF is used to specify who is allowed to send email for the domain so we " +#~ "strongly recommend including ProtonMail in your SPF record. Please add " +#~ "the following TXT record into your DNS. This can typically be done in the " +#~ "control panel of your domain name registrar." +#~ msgstr "" +#~ "SPF is used to specify who is allowed to send email for the domain so we " +#~ "strongly recommend including ProtonMail in your SPF record. Please add " +#~ "the following TXT record into your DNS. This can typically be done in the " +#~ "control panel of your domain name registrar." + +#~ msgid "Star" +#~ msgstr "Star" + +#~ msgctxt "Default" +#~ msgid "Starred" +#~ msgstr "Starred" + +#~ msgctxt "Noun" +#~ msgid "Starred" +#~ msgstr "Starred" + +#~ msgid "Starred" +#~ msgstr "Starred" + +#~ msgid "Start date" +#~ msgstr "Start date" + +#~ msgid "Status" +#~ msgstr "Status" + +#~ msgctxt "Default" +#~ msgid "Status" +#~ msgstr "Status" + +#~ msgctxt "Default" +#~ msgid "Storage" +#~ msgstr "Storage" + +#~ msgctxt "Default" +#~ msgid "Storage:" +#~ msgstr "Storage:" + +#~ msgctxt "Default" +#~ msgid "Stored encrypted" +#~ msgstr "Stored encrypted" + +#~ msgctxt "Default" +#~ msgid "Sub" +#~ msgstr "Sub" + +#~ msgid "Submit" +#~ msgstr "Submit" + +#~ msgctxt "Default" +#~ msgid "Subscription" +#~ msgstr "Subscription" + +#~ msgctxt "Default" +#~ msgid "Support" +#~ msgstr "Support" + +#~ msgctxt "Default" +#~ msgid "Support ProtonMail" +#~ msgstr "Support ProtonMail" + +#~ msgid "Support ProtonMail by upgrading to a paid account" +#~ msgstr "Support ProtonMail by upgrading to a paid account" + +#~ msgctxt "Default" +#~ msgid "" +#~ "Take back your privacy! Creating your free secure email account takes " +#~ "less than 2 minutes in most cases." +#~ msgstr "" +#~ "Take back your privacy! Creating your free secure email account takes " +#~ "less than 2 minutes in most cases." + +#~ msgid "Thank you for your subscription." +#~ msgstr "Thank you for your subscription." + +#~ msgctxt "Default" +#~ msgid "Theme saved" +#~ msgstr "Theme saved" + +#~ msgctxt "Default" +#~ msgid "" +#~ "This can take a few seconds or a few minutes depending on your device." +#~ msgstr "" +#~ "This can take a few seconds or a few minutes depending on your device." + +#~ msgctxt "Default" +#~ msgid "This cannot be undone." +#~ msgstr "This cannot be undone." + +#~ msgid "This conversation contains non-trashed messages." +#~ msgstr "This conversation contains non-trashed messages." + +#~ msgid "This is the 'From' name that people will see when you email them." +#~ msgstr "This is the ‘From’ name that people will see when you email them." + +#~ msgctxt "Default" +#~ msgid "" +#~ "This is used to encrypt and decrypt your messages. This is private and " +#~ "only you know it." +#~ msgstr "" +#~ "This is used to encrypt and decrypt your messages. This is private and " +#~ "only you know it." + +#~ msgctxt "Default" +#~ msgid "This is used to log you into our system." +#~ msgstr "This is used to log you into our system." + +#~ msgctxt "Default" +#~ msgid "" +#~ "This is used to recover your account if you get locked out or forget your " +#~ "login password." +#~ msgstr "" +#~ "This is used to recover your account if you get locked out or forget your " +#~ "login password." + +#~ msgctxt "Default" +#~ msgid "" +#~ "This page is only available on larger resolution devices. If you are on " +#~ "a phone, try landscape mode, or visit on a computer instead." +#~ msgstr "" +#~ "This page is only available on larger resolution devices. If you are on " +#~ "a phone, try landscape mode, or visit on a computer instead." + +#~ msgctxt "Default" +#~ msgid "" +#~ "This sets the default composer size. Two sizes are available, a smaller " +#~ "popup composer, and a bigger full screen composer. Learn more" +#~ msgstr "" +#~ "This sets the default composer size. Two sizes are available, a smaller " +#~ "popup composer, and a bigger full screen composer. Learn more" + +#~ msgid "" +#~ "This short tutorial will show you the main features of your new " +#~ "ProtonMail account. For more information, you can also check out the " +#~ "Welcome email we have sent you. If you ever want to view this tutorial " +#~ "again, you can access it by clicking your username in the upper right " +#~ "corner." +#~ msgstr "" +#~ "This short tutorial will show you the main features of your new " +#~ "ProtonMail account. For more information, you can also check out the " +#~ "Welcome email we have sent you. If you ever want to view this tutorial " +#~ "again, you can access it by clicking your username in the upper right " +#~ "corner." + +#~ msgid "This will be a new address you can send and receive emails with." +#~ msgstr "This will be a new address you can send and receive emails with." + +#~ msgctxt "Default" +#~ msgid "" +#~ "This will be your email address. Select the drop down to choose your " +#~ "domain." +#~ msgstr "" +#~ "This will be your email address. Select the drop down to choose your " +#~ "domain." + +#~ msgctxt "Default" +#~ msgid "" +#~ "This will downgrade your account to a free account.

Please " +#~ "disable all additional addresses prior to downgrading your account. You " +#~ "can manage that inside the addresses tab.

ProtonMail is free " +#~ "software that is supported by donations and paid accounts. Please " +#~ "consider making a donation so we can continue to offer the service for free." +#~ msgstr "" +#~ "This will downgrade your account to a free account.

Please " +#~ "disable all additional addresses prior to downgrading your account. You " +#~ "can manage that inside the addresses tab.

ProtonMail is free " +#~ "software that is supported by donations and paid accounts. Please " +#~ "consider making a donation so we can continue to offer the service for free." + +#~ msgctxt "Default" +#~ msgid "Time" +#~ msgstr "Time" + +#~ msgctxt "Default" +#~ msgid "" +#~ "To add more addresses to your account, or to use your own domain, upgrade " +#~ "your account." +#~ msgstr "" +#~ "To add more addresses to your account, or to use your own domain, upgrade " +#~ "your account." + +#~ msgctxt "Default" +#~ msgid "To continue, type 'DANGER' below:" +#~ msgstr "To continue, type 'DANGER' below:" + +#~ msgid "" +#~ "To pay via Bitcoin or Cash, please email us at contact@protonmail." +#~ "ch for instructions." +#~ msgstr "" +#~ "To pay via Bitcoin or Cash, please email us at contact@protonmail." +#~ "ch for instructions." + +#~ msgctxt "Default" +#~ msgid "Toolbar" +#~ msgstr "Toolbar" + +#~ msgctxt "Default" +#~ msgid "Total price:" +#~ msgstr "Total price:" + +#~ msgctxt "Default" +#~ msgid "Trash" +#~ msgstr "Trash" + +#~ msgctxt "Noun" +#~ msgid "Trash" +#~ msgstr "Trash" + +#~ msgid "Tutorial" +#~ msgstr "Tutorial" + +#~ msgctxt "Default" +#~ msgid "Type" +#~ msgstr "Type" + +#~ msgctxt "Default" +#~ msgid "Unencrypted message" +#~ msgstr "Unencrypted message" + +#~ msgctxt "Default" +#~ msgid "Unlimited labels" +#~ msgstr "Unlimited labels" + +#~ msgctxt "Default" +#~ msgid "Unlimited sending" +#~ msgstr "Unlimited sending" + +#~ msgctxt "Default" +#~ msgid "Unlink address" +#~ msgstr "Unlink address" + +#~ msgctxt "Default" +#~ msgid "Unlock" +#~ msgstr "Unlock" + +#~ msgctxt "Default" +#~ msgid "Unpaid" +#~ msgstr "Unpaid" + +#~ msgid "Update link" +#~ msgstr "Update link" + +#~ msgctxt "Default" +#~ msgid "Update Plus" +#~ msgstr "Update Plus" + +#~ msgctxt "Default" +#~ msgid "Update Visionary" +#~ msgstr "Update Visionary" + +#~ msgctxt "Default" +#~ msgid "Upgrade" +#~ msgstr "Upgrade" + +#~ msgid "Upgrade" +#~ msgstr "Upgrade" + +#~ msgid "Upgrade account" +#~ msgstr "Upgrade account" + +#~ msgctxt "Default" +#~ msgid "Upgrade to Plus" +#~ msgstr "Upgrade to Plus" + +#~ msgctxt "Default" +#~ msgid "Upgrade to Visionary" +#~ msgstr "Upgrade to Visionary" + +#~ msgid "Upgrade your account" +#~ msgstr "Upgrade your account" + +#~ msgctxt "Default" +#~ msgid "Upgrade your plan" +#~ msgstr "Upgrade your plan" + +#~ msgctxt "Default" +#~ msgid "" +#~ "Upgrading to a paid account is the best way to support ProtonMail, but " +#~ "you can also donate any amount." +#~ msgstr "" +#~ "Upgrading to a paid account is the best way to support ProtonMail, but " +#~ "you can also donate any amount." + +#~ msgid "Upload" +#~ msgstr "Upload" + +#~ msgid "Uploading" +#~ msgstr "Uploading" + +#~ msgctxt "Default" +#~ msgid "Use one of these browsers for the best experience during Beta:" +#~ msgstr "Use one of these browsers for the best experience during Beta:" + +#~ msgctxt "Default" +#~ msgid "User" +#~ msgstr "User" + +#~ msgctxt "Default" +#~ msgid "User history" +#~ msgstr "User history" + +#~ msgctxt "Default" +#~ msgid "User login" +#~ msgstr "User login" + +#~ msgid "User storage" +#~ msgstr "User storage" + +#~ msgctxt "Default" +#~ msgid "Username" +#~ msgstr "Username" + +#~ msgid "Username and domain" +#~ msgstr "Username and domain" + +#~ msgctxt "Default" +#~ msgid "Username is required." +#~ msgstr "Username is required." + +#~ msgctxt "Default" +#~ msgid "Username:" +#~ msgstr "Username:" + +#~ msgctxt "Default" +#~ msgid "Users" +#~ msgstr "Users" + +#~ msgctxt "Default" +#~ msgid "Verification code" +#~ msgstr "Verification code" + +#~ msgctxt "Default" +#~ msgid "Verification code sent" +#~ msgstr "Verification code sent" + +#~ msgid "Verify" +#~ msgstr "Verify" + +#~ msgctxt "Default" +#~ msgid "Version" +#~ msgstr "Version" + +#~ msgid "View headers" +#~ msgstr "View headers" + +#~ msgid "View original" +#~ msgstr "View original" + +#~ msgid "View rendered HTML" +#~ msgstr "View rendered HTML" + +#~ msgid "View source code" +#~ msgstr "View source code" + +#~ msgctxt "Default" +#~ msgid "Void" +#~ msgstr "Void" + +#~ msgctxt "Default" +#~ msgid "Warning" +#~ msgstr "Warning" + +#~ msgid "WARNING: DELETION IS PERMANENT" +#~ msgstr "WARNING: DELETION IS PERMANENT" + +#~ msgid "" +#~ "We are now generating encryption keys for your account, this may take " +#~ "several minutes and temporarily freeze your browser." +#~ msgstr "" +#~ "We are now generating encryption keys for your account, this may take " +#~ "several minutes and temporarily freeze your browser." + +#~ msgid "We are sorry to see you go!" +#~ msgstr "We are sorry to see you go!" + +#~ msgid "" +#~ "We only accept PayPal for annual subscriptions, click the link to switch " +#~ "to an annual subscription." +#~ msgstr "" +#~ "We only accept PayPal for annual subscriptions, click the link to switch " +#~ "to an annual subscription." + +#~ msgid "" +#~ "We only accept PayPal for annual subscriptions. PayPal is also only " +#~ "accepted for US Dollar plans. Click here to switch to an annual US Dollar " +#~ "subscription." +#~ msgstr "" +#~ "We only accept PayPal for annual subscriptions. PayPal is also only " +#~ "accepted for US Dollar plans. Click here to switch to an annual US Dollar " +#~ "subscription." + +#~ msgctxt "Default" +#~ msgid "" +#~ "We will send a code to your Recovery email to reset your Recovery email to reset your Recovery email
. " +#~ "Enter it below to continue." +#~ msgstr "" +#~ "We've sent a verification code to your Recovery email. " +#~ "Enter it below to continue." + +#~ msgctxt "Default" +#~ msgid "" +#~ "We've sent a Verification Token to your Recovery Email. Please enter it " +#~ "below:" +#~ msgstr "" +#~ "We've sent a Verification Token to your Recovery Email. Please enter it " +#~ "below:" + +#~ msgid "Welcome" +#~ msgstr "Welcome" + +#~ msgid "Welcome to ProtonMail" +#~ msgstr "Welcome to ProtonMail" + +#~ msgid "Welcome to your new encrypted email account" +#~ msgstr "Welcome to your new encrypted email account" + +#~ msgid "What do you think of ProtonMail version 3.0?" +#~ msgstr "What do you think of ProtonMail version 3.0?" + +#~ msgid "What happened?" +#~ msgstr "What happened?" + +#~ msgctxt "Default" +#~ msgid "Wipe" +#~ msgstr "Wipe" + +#~ msgctxt "Default" +#~ msgid "Year" +#~ msgstr "Year" + +#~ msgctxt "Default" +#~ msgid "You can drag and drop addresses to order them." +#~ msgstr "You can drag and drop addresses to order them." + +#~ msgid "" +#~ "You can enable authentication logging to see who and when your account is " +#~ "accessed. We will record the IP address that accesses the account and the " +#~ "time, as well as failed attempts." +#~ msgstr "" +#~ "You can enable authentication logging to see who and when your account is " +#~ "accessed. We will record the IP address that accesses the account and the " +#~ "time, as well as failed attempts." + +#~ msgctxt "Default" +#~ msgid "" +#~ "You have no contacts, you can add contact with the above button 'ADD " +#~ "CONTACT'." +#~ msgstr "" +#~ "You have no contacts, you can add contact with the above button 'ADD " +#~ "CONTACT'." + +#~ msgctxt "Default" +#~ msgid "You have no invoices." +#~ msgstr "You have no invoices." + +#~ msgctxt "Default" +#~ msgid "" +#~ "You have no labels, you can add label with the above button 'ADD LABEL'." +#~ msgstr "" +#~ "You have no labels, you can add label with the above button 'ADD LABEL'." + +#~ msgctxt "Default" +#~ msgid "" +#~ "You have no saved payment methods, you can add a payment method by " +#~ "clicking 'ADD'." +#~ msgstr "" +#~ "You have no saved payment methods, you can add a payment method by " +#~ "clicking 'ADD'." + +#~ msgctxt "Default" +#~ msgid "You have successfully unsubscribed" +#~ msgstr "You have successfully unsubscribed" + +#~ msgctxt "Default" +#~ msgid "You must unsubscribe before requesting deletion of your account." +#~ msgstr "You must unsubscribe before requesting deletion of your account." + +#~ msgid "" +#~ "You now have an encrypted email account! Below are optional settings you " +#~ "can use to customize your account. You can always find these on your " +#~ "Settings page." +#~ msgstr "" +#~ "You now have an encrypted email account! Below are optional settings you " +#~ "can use to customize your account. You can always find these on your " +#~ "Settings page." + +#~ msgid "" +#~ "You will need to login to your PayPal account to complete this " +#~ "transaction. We will open a new tab with PayPal for you. If you use any " +#~ "pop-up blockers, please disable them to continue." +#~ msgstr "" +#~ "You will need to login to your PayPal account to complete this " +#~ "transaction. We will open a new tab with PayPal for you. If you use any " +#~ "pop-up blockers, please disable them to continue." + +#~ msgid "" +#~ "You're upgrading your account. Once we successfully process payment, " +#~ "we'll immediately upgrade your account. Thanks for choosing to become a " +#~ "paying customer!" +#~ msgstr "" +#~ "You're upgrading your account. Once we successfully process payment, " +#~ "we'll immediately upgrade your account. Thanks for choosing to become a " +#~ "paying customer!" + +#~ msgctxt "Default" +#~ msgid "" +#~ "Your account currently has an overdue invoice. Please pay all unpaid " +#~ "invoices." +#~ msgstr "" +#~ "Your account currently has an overdue invoice. Please pay all unpaid " +#~ "invoices." + +#~ msgctxt "Error" +#~ msgid "" +#~ "Your account currently has an overdue invoice. Please pay all unpaid " +#~ "invoices." +#~ msgstr "" +#~ "Your account currently has an overdue invoice. Please pay all unpaid " +#~ "invoices." + +#~ msgid "Your account is being updated, this may take up to 30 seconds." +#~ msgstr "Your account is being updated, this may take up to 30 seconds." + +#~ msgid "" +#~ "Your attachments are secure and encrypted, but to download them requires " +#~ "extra work. We recommend using a different web browser such as Chrome or " +#~ "Firefox for a better user experience." +#~ msgstr "" +#~ "Your attachments are secure and encrypted, but to download them requires " +#~ "extra work. We recommend using a different web browser such as Chrome or " +#~ "Firefox for a better user experience." + +#~ msgctxt "Default" +#~ msgid "" +#~ "Your donation helps us support more users and continue to develop " +#~ "ProtonMail as free and open source software." +#~ msgstr "" +#~ "Your donation helps us support more users and continue to develop " +#~ "ProtonMail as free and open source software." + +#~ msgctxt "Default" +#~ msgid "BCC:" +#~ msgstr "BCC:" + +#~ msgctxt "Default" +#~ msgid "CC:" +#~ msgstr "CC:" + +#~ msgctxt "Default" +#~ msgid "Finish" +#~ msgstr "Finish" + +#~ msgid "From:" +#~ msgstr "From:" + +#~ msgctxt "Default" +#~ msgid "From:" +#~ msgstr "From:" + +#~ msgid "Next tip" +#~ msgstr "Next tip" + +#~ msgctxt "Default" +#~ msgid "Received:" +#~ msgstr "Received:" + +#~ msgctxt "Default" +#~ msgid "Sent:" +#~ msgstr "Sent:" + +#~ msgctxt "Default" +#~ msgid "To:" +#~ msgstr "To:" + +#~ msgid "Create new label" +#~ msgstr "Create new label" + +#~ msgid "Edit" +#~ msgstr "Edit" + +#~ msgid "Edit address" +#~ msgstr "Edit address" + +#~ msgid "Edit label" +#~ msgstr "Edit label" + +#~ msgctxt "Error" +#~ msgid "Error during Deletion" +#~ msgstr "Error during Deletion" + +#~ msgid "Expiration" +#~ msgstr "Expiration" + +#~ msgid "Already subscribed" +#~ msgstr "Already subscribed" + +#~ msgid "Are you sure you want to delete all your contacts?" +#~ msgstr "Are you sure you want to delete all your contacts?" + +#~ msgid "Are you sure you want to delete this address?" +#~ msgstr "Are you sure you want to delete this address?" + +#~ msgid "Are you sure you want to delete this label?" +#~ msgstr "Are you sure you want to delete this label?" + +#~ msgid "Are you sure you want to delete this payment method?" +#~ msgstr "Are you sure you want to delete this payment method?" + +#~ msgid "Delete domain" +#~ msgstr "Delete domain" + +#~ msgid "Delete label" +#~ msgstr "Delete label" + +#~ msgid "Delete payment method" +#~ msgstr "Delete payment method" + +#~ msgid "Disable" +#~ msgstr "Disable" + +#~ msgctxt "Title" +#~ msgid "" +#~ "Display name " +#~ msgstr "" +#~ "Display name " + +#~ msgid "DKIM" +#~ msgstr "DKIM" + +#~ msgctxt "Title" +#~ msgid "Domains:" +#~ msgstr "Domains:" + +#~ msgid "Downgrade to Free" +#~ msgstr "Downgrade to Free" + +#~ msgid "Downgrade to Plus" +#~ msgstr "Downgrade to Plus" + +#~ msgid "Drop a file here to upload" +#~ msgstr "Drop a file here to upload" + +#~ msgctxt "Title" +#~ msgid "Storage:" +#~ msgstr "Storage:" + +#~ msgid "Update Plus" +#~ msgstr "Update Plus" + +#~ msgid "Update Visionary" +#~ msgstr "Update Visionary" + +#~ msgid "Upgrade to Plus" +#~ msgstr "Upgrade to Plus" + +#~ msgid "Upgrade to Visionary" +#~ msgstr "Upgrade to Visionary" + +#~ msgctxt "title" +#~ msgid "Username:" +#~ msgstr "Username:" + +#~ msgid "Delete address" +#~ msgstr "Delete address" + +#~ msgid "Decrypting..." +#~ msgstr "Decrypting..." + +#~ msgctxt "Info" +#~ msgid "Cancel" +#~ msgstr "Cancel" + +#~ msgid "Card number'" +#~ msgstr "Card number'" + +#~ msgid "Card Validation Code" +#~ msgstr "Card Validation Code" + +#~ msgid "Choose a display name
*Optional" +#~ msgstr "Choose a display name
*Optional" + +#~ msgid "Clear" +#~ msgstr "Clear" + +#~ msgid "Compose mode saved" +#~ msgstr "Compose mode saved" + +#~ msgid "Confirm downgrade" +#~ msgstr "Confirm downgrade" + +#~ msgid "Contact exists for this email address" +#~ msgstr "Contact exists for this email address" + +#~ msgctxt "Title" +#~ msgid "Credit:" +#~ msgstr "Credit:" + +#~ msgctxt "Title" +#~ msgid "Custom addresses" +#~ msgstr "Custom addresses" + +#~ msgid "" +#~ "This will downgrade your account to a free account.

Please " +#~ "disable all additional addresses prior to downgrading your account. You " +#~ "can manage that inside the addresses tab.

ProtonMail is free " +#~ "software that is supported by donations and paid accounts. Please " +#~ "consider making a donation so we can continue to offer the service for free." +#~ msgstr "" +#~ "This will downgrade your account to a free account.

Please " +#~ "disable all additional addresses prior to downgrading your account. You " +#~ "can manage that inside the addresses tab.

ProtonMail is free " +#~ "software that is supported by donations and paid accounts. Please " +#~ "consider making a donation so we can continue to offer the service for free." + +#~ msgctxt "Action" +#~ msgid "Add domain" +#~ msgstr "Add domain" + +#~ msgctxt "Action" +#~ msgid "Add ProtonMail address" +#~ msgstr "Add ProtonMail address" + +#~ msgctxt "Title" +#~ msgid "Addresses:" +#~ msgstr "Addresses:" + +#~ msgctxt "Title" +#~ msgid "Autosave contact list" +#~ msgstr "Autosave contact list" + +#~ msgctxt "Title" +#~ msgid "Autosave contacts" +#~ msgstr "Autosave contacts" + +#~ msgid "Domains used." +#~ msgstr "Domains used." + +#~ msgid "'No" +#~ msgstr "'No" + +#~ msgid "(Optional)" +#~ msgstr "(Optional)" + +#~ msgid "(Required)" +#~ msgstr "(Required)" + +#~ msgid "{{ 'Mark as read / Mark as unread" +#~ msgstr "{{ 'Mark as read / Mark as unread" + +#~ msgid "{{ 'Mark as unread / Mark as read" +#~ msgstr "{{ 'Mark as unread / Mark as read" + +#~ msgid "{{ 'Organization name" +#~ msgstr "{{ 'Organization name" + +#~ msgid "*Optional" +#~ msgstr "*Optional" + +#~ msgid "Choose a display name
*Optional" +#~ msgstr "Choose a display name
*Optional" + +#~ msgid "Login" +#~ msgstr "Login" + +#~ msgid "Users" +#~ msgstr "Users" + +#~ msgid "snackies" +#~ msgstr "meow" + +#~ msgctxt "Default" +#~ msgid "Create new label" +#~ msgstr "Create new label" + +#~ msgctxt "Default" +#~ msgid "Delete label" +#~ msgstr "Delete label" + +#~ msgctxt "Default" +#~ msgid "Edit address" +#~ msgstr "Edit address" + +#~ msgctxt "Default" +#~ msgid "Edit label" +#~ msgstr "Edit label" + +#~ msgid "Email our aupport team" +#~ msgstr "Email our support team" + +#~ msgid "" +#~ "Add a domain that you own to your ProtonMail account.' | translate }}" +#~ msgstr "" +#~ "Add a domain that you own to your ProtonMail account.’ | translate }}" + +#~ msgctxt "Default" +#~ msgid "(Required)" +#~ msgstr "(Required)" + +#~ msgctxt "Default" +#~ msgid "{{ key.bitSize }} Bit" +#~ msgstr "{{ key.bitSize }} Bit" + +#~ msgctxt "Default" +#~ msgid "{{ organization.UsedAddresses }} of {{ organization.MaxAddresses }}" +#~ msgstr "{{ organization.UsedAddresses }} of {{ organization.MaxAddresses }}" + +#~ msgctxt "Default" +#~ msgid "{{ organization.UsedDomains }} of {{ organization.MaxDomains }}" +#~ msgstr "{{ organization.UsedDomains }} of {{ organization.MaxDomains }}" + +#~ msgctxt "Default" +#~ msgid "{{ organization.UsedMembers }} of {{ organization.MaxMembers }} Used" +#~ msgstr "" +#~ "{{ organization.UsedMembers }} of {{ organization.MaxMembers }} Used" + +#~ msgctxt "Default" +#~ msgid "" +#~ "{{ organization.UsedSpace | humanSize }} of {{ organization.MaxSpace | " +#~ "humanSize }}" +#~ msgstr "" +#~ "{{ organization.UsedSpace | humanSize }} of {{ organization.MaxSpace | " +#~ "humanSize }}" + +#~ msgctxt "Default" +#~ msgid "{{ user.UsedSpace | humanSize }} of {{ user.MaxSpace | humanSize }}" +#~ msgstr "{{ user.UsedSpace | humanSize }} of {{ user.MaxSpace | humanSize }}" + +#~ msgctxt "Default" +#~ msgid "5GB Storage (instead of 500MB)" +#~ msgstr "5GB Storage (instead of 500MB)" + +#~ msgctxt "Default" +#~ msgid "" +#~ "Add a domain that you own to your ProtonMail account.' | translate }}" +#~ msgstr "" +#~ "Add a domain that you own to your ProtonMail account.' | translate }}" + +#~ msgctxt "Default" +#~ msgid "Also archive" +#~ msgstr "Also archive" + +#~ msgctxt "Default" +#~ msgid "Creating new user" +#~ msgstr "Creating new user" + +#~ msgctxt "Default" +#~ msgid "Done" +#~ msgstr "Done" + +#~ msgctxt "Default" +#~ msgid "Draft" +#~ msgstr "Draft" + +#~ msgctxt "Default" +#~ msgid "Generating keys" +#~ msgstr "Generating keys" + +#~ msgctxt "Default" +#~ msgid "Higher message sending limits" +#~ msgstr "Higher message sending limits" + +#~ msgctxt "Default" +#~ msgid "Host name" +#~ msgstr "Host name" + +#~ msgctxt "Default" +#~ msgid "Loading new account" +#~ msgstr "Loading new account" + +#~ msgctxt "Default" +#~ msgid "Not set" +#~ msgstr "Not set" + +#~ msgctxt "Default" +#~ msgid "Not set properly" +#~ msgstr "Not set properly" + +#~ msgctxt "Default" +#~ msgid "Off" +#~ msgstr "Off" + +#~ msgctxt "Default" +#~ msgid "On" +#~ msgstr "On" + +#~ msgctxt "Default" +#~ msgid "Optional, advanced" +#~ msgstr "Optional, advanced" + +#~ msgctxt "Default" +#~ msgid "Page" +#~ msgstr "Page" + +#~ msgctxt "Default" +#~ msgid "" +#~ "Please add the follow TXT record. Note, DNS records can take several " +#~ "hours to update." +#~ msgstr "" +#~ "Please add the follow TXT record. Note, DNS records can take several " +#~ "hours to update." + +#~ msgctxt "Default" +#~ msgid "Priority customer support" +#~ msgstr "Priority customer support" + +#~ msgctxt "Default" +#~ msgid "" +#~ "ProtonMail supports DKIM signing for custom domains! To use DKIM " +#~ "authentication, please add the following TXT record into your DNS for " +#~ "this domain. This can typically be done in the control panel of your " +#~ "domain name registrar." +#~ msgstr "" +#~ "ProtonMail supports DKIM signing for custom domains! To use DKIM " +#~ "authentication, please add the following TXT record into your DNS for " +#~ "this domain. This can typically be done in the control panel of your " +#~ "domain name registrar." + +#~ msgctxt "Default" +#~ msgid "Set" +#~ msgstr "Set" + +#~ msgctxt "Default" +#~ msgid "Support for custom domains and aliases" +#~ msgstr "Support for custom domains and aliases" + +#~ msgctxt "Default" +#~ msgid "To send and receive email with this domain, please add all addresses" +#~ msgstr "" +#~ "To send and receive email with this domain, please add all addresses" + +#~ msgctxt "Default" +#~ msgid "Value / Data / Points to" +#~ msgstr "Value / Data / Points to" + +#~ msgctxt "Default" +#~ msgid "Verifying encryption keys" +#~ msgstr "Verifying encryption keys" + +#~ msgctxt "Default" +#~ msgid "Verifying invite link..." +#~ msgstr "Verifying invite link…" + +#~ msgctxt "Default" +#~ msgid "Verifying new account" +#~ msgstr "Verifying new account" + +#~ msgctxt "Default" +#~ msgid "Email verification" +#~ msgstr "Email verification" + +#~ msgctxt "Default" +#~ msgid "French" +#~ msgstr "French" + +#~ msgctxt "Default" +#~ msgid "Default language changed" +#~ msgstr "Default language changed" + +#~ msgid "Absolute security" +#~ msgstr "Absolute security" + +#~ msgid "Actions" +#~ msgstr "Actions" + +#~ msgid "Active addresses" +#~ msgstr "Active addresses" + +#~ msgid "Add custom domain" +#~ msgstr "Add custom domain" + +#~ msgid "Add custom domain address" +#~ msgstr "Add custom domain address" + +#~ msgid "Add new contact" +#~ msgstr "Add new contact" + +#~ msgid "Add ProtonMail address" +#~ msgstr "Add ProtonMail address" + +#~ msgid "Additional themes (experimental)" +#~ msgstr "Additional themes (experimental)" + +#~ msgid "Address created failed" +#~ msgstr "Address created failed" + +#~ msgid "Addresses:" +#~ msgstr "Addresses:" + +#~ msgid "Advanced" +#~ msgstr "Advanced" + +#~ msgid "ALL OF YOUR DATA WILL BE LOST FOREVER!" +#~ msgstr "ALL OF YOUR DATA WILL BE LOST FOREVER!" + +#~ msgid "Already have an account?" +#~ msgstr "Already have an account?" + +#~ msgid "Also used to reset a forgotten password." +#~ msgstr "Also used to reset a forgotten password." + +#~ msgid "Amount is different" +#~ msgstr "Amount is different" + +#~ msgid "" +#~ "An error occured while trying to create your account. To see common " +#~ "problems and solutions click " +#~ "here." +#~ msgstr "" +#~ "An error occurred while trying to create your account. To see common " +#~ "problems and solutions click " +#~ "here." + +#~ msgid "Authentication Logs" +#~ msgstr "Authentication Logs" + +#~ msgid "Auto" +#~ msgstr "Auto" + +#~ msgid "Autosave contact list" +#~ msgstr "Autosave contact list" + +#~ msgid "Autosave contacts" +#~ msgstr "Autosave contacts" + +#~ msgid "Basic" +#~ msgstr "Basic" + +#~ msgid "Billing cycle" +#~ msgstr "Billing cycle" + +#~ msgid "Bit" +#~ msgstr "Bit" + +#~ msgid "Card number invalid" +#~ msgstr "Card number invalid" + +#~ msgid "Check your email" +#~ msgstr "Check your email" + +#~ msgid "" +#~ "Choose your prefered button order for marking messages as read / unread." +#~ msgstr "" +#~ "Choose your prefered button order for marking messages as read / unread." + +#~ msgid "Composer" +#~ msgstr "Composer" + +#~ msgid "Coupon invalid" +#~ msgstr "Coupon invalid" + +#~ msgid "Create account" +#~ msgstr "Create account" + +#~ msgid "Create time" +#~ msgstr "Create time" + +#~ msgid "Creating new mailbox" +#~ msgstr "Creating new mailbox" + +#~ msgid "Credit:" +#~ msgstr "Credit:" + +#~ msgid "Current status" +#~ msgstr "Current status" + +#~ msgid "Custom addresses" +#~ msgstr "Custom addresses" + +#~ msgid "Custom theme" +#~ msgstr "Custom theme" + +#~ msgid "" +#~ "Custom themes from third-parties can potentially betray your privacy. " +#~ "Only use themes from trusted sources." +#~ msgstr "" +#~ "Custom themes from third-parties can potentially betray your privacy. " +#~ "Only use themes from trusted sources." + +#~ msgid "Customize" +#~ msgstr "Customize" + +#~ msgid "CVC invalid" +#~ msgstr "CVC invalid" + +#~ msgid "Daily email notifications" +#~ msgstr "Daily email notifications" + +#~ msgid "Decrypt message" +#~ msgstr "Decrypt message" + +#~ msgid "Default language changed" +#~ msgstr "Default language changed" + +#~ msgid "Delete your account" +#~ msgstr "Delete your account" + +#~ msgid "Display invoice" +#~ msgstr "Display invoice" + +#~ msgid "" +#~ "Display name " +#~ msgstr "" +#~ "Display name " + +#~ msgid "Domain not found" +#~ msgstr "Domain not found" + +#~ msgid "Domains:" +#~ msgstr "Domains:" + +#~ msgid "" +#~ "Download your PGP Keys for use with other PGP compatible services. Only " +#~ "incoming messages in inline OpenPGP format are currently supported." +#~ msgstr "" +#~ "Download your PGP Keys for use with other PGP compatible services. Only " +#~ "incoming messages in inline OpenPGP format are currently supported." + +#~ msgid "Edit identity" +#~ msgstr "Edit identity" + +#~ msgid "Email already taken" +#~ msgstr "Email already taken" + +#~ msgid "Email images" +#~ msgstr "Email images" + +#~ msgid "Enable" +#~ msgstr "Enable" + +#~ msgid "Error during creation" +#~ msgstr "Error during creation" + +#~ msgid "Error during deletion" +#~ msgstr "Error during deletion" + +#~ msgid "Error during Deletion" +#~ msgstr "Error during Deletion" + +#~ msgid "Error during disable request" +#~ msgstr "Error during disable request" + +#~ msgid "Error during enable request" +#~ msgstr "Error during enable request" + +#~ msgid "Error during label request" +#~ msgstr "Error during label request" + +#~ msgid "Error during organization request" +#~ msgstr "Error during organization request" + +#~ msgid "Error during the encryption" +#~ msgstr "Error during the encryption" + +#~ msgid "Error during the initialization of logs" +#~ msgstr "Error during the initialization of logs" + +#~ msgid "Error during the reply process" +#~ msgstr "Error during the reply process" + +#~ msgid "Error during updating" +#~ msgstr "Error during updating" + +#~ msgid "Error processing payment." +#~ msgstr "Error processing payment." + +#~ msgid "Error while processing donation." +#~ msgstr "Error while processing donation." + +#~ msgid "Event" +#~ msgstr "Event" + +#~ msgid "Expiry invalid" +#~ msgstr "Expiry invalid" + +#~ msgid "Field required" +#~ msgstr "Field required" + +#~ msgid "Fingerprint" +#~ msgstr "Fingerprint" + +#~ msgid "Forgot password?" +#~ msgstr "Forgot password?" + +#~ msgid "French" +#~ msgstr "French" + +#~ msgid "Generate missing keys" +#~ msgstr "Generate missing keys" + +#~ msgid "Having trouble? Use the old version (v2)" +#~ msgstr "Having trouble? Use the old version (v2)" + +#~ msgid "How does this work?" +#~ msgstr "How does this work?" + +#~ msgid "" +#~ "If you forget your mailbox password, you can reset your account but..." +#~ msgstr "" +#~ "If you forget your mailbox password, you can reset your account but..." + +#~ msgid "" +#~ "If you lose your mailbox password, you won't be able to read your emails, " +#~ "we cannot recover this password for you." +#~ msgstr "" +#~ "If you lose your mailbox password, you won't be able to read your emails, " +#~ "we cannot recover this password for you." + +#~ msgid "Inactive addresses" +#~ msgstr "Inactive addresses" + +#~ msgid "Internationalization" +#~ msgstr "Internationalization" + +#~ msgid "Invalid email." +#~ msgstr "Invalid email." + +#~ msgid "Invalid file type" +#~ msgstr "Invalid file type" + +#~ msgid "Invalid recovery email." +#~ msgstr "Invalid recovery email." + +#~ msgid "Invoice" +#~ msgstr "Invoice" + +#~ msgid "Keep this password safe - it cannot be recovered." +#~ msgstr "Keep this password safe - it cannot be recovered." + +#~ msgid "Key size" +#~ msgstr "Key size" + +#~ msgid "Layout" +#~ msgstr "Layout" + +#~ msgid "Load classic theme" +#~ msgstr "Load classic theme" + +#~ msgid "Load edison theme" +#~ msgstr "Load edison theme" + +#~ msgid "Loading themes will override your current theme!" +#~ msgstr "Loading themes will override your current theme!" + +#~ msgid "Login failed" +#~ msgstr "Login failed" + +#~ msgid "Login password is required." +#~ msgstr "Login password is required." + +#~ msgid "Mailbox password is required." +#~ msgstr "Mailbox password is required." + +#~ msgid "Make default" +#~ msgstr "Make default" + +#~ msgid "Make primary" +#~ msgstr "Make primary" + +#~ msgid "Manage" +#~ msgstr "Manage" + +#~ msgid "Manage password" +#~ msgstr "Manage password" + +#~ msgid "Manual" +#~ msgstr "Manual" + +#~ msgid "Maximum composer reached" +#~ msgstr "Maximum composer reached" + +#~ msgid "Members" +#~ msgstr "Members" + +#~ msgid "My subscription" +#~ msgstr "My subscription" + +#~ msgid "Need help?" +#~ msgstr "Need help?" + +#~ msgid "No files were selected" +#~ msgstr "No files were selected" + +#~ msgid "No results for this search in your contacts list." +#~ msgstr "No results for this search in your contacts list." + +#~ msgid "" +#~ "Non-original @protonmail addresses can never be deleted " +#~ "(only disabled). This means that once you create an address it will " +#~ "always count towards your address limit. Custom domain addresses must be " +#~ "disabled before they can be deleted. Custom domain addresses can only be " +#~ "deleted if all messages associated with that address are deleted. Learn more about addresses here." +#~ msgstr "" +#~ "Non-original @protonmail addresses can never be deleted " +#~ "(only disabled). This means that once you create an address it will " +#~ "always count towards your address limit. Custom domain addresses must be " +#~ "disabled before they can be deleted. Custom domain addresses can only be " +#~ "deleted if all messages associated with that address are deleted. Learn more about addresses here." + +#~ msgid "None" +#~ msgstr "None" + +#~ msgid "Number" +#~ msgstr "Number" + +#~ msgid "Number of users:" +#~ msgstr "Number of users:" + +#~ msgid "of" +#~ msgstr "of" + +#~ msgid "Organization" +#~ msgstr "Organization" + +#~ msgid "Organization history" +#~ msgstr "Organization history" + +#~ msgid "Organization storage:" +#~ msgstr "Organization storage:" + +#~ msgid "Others identities" +#~ msgstr "Others identities" + +#~ msgid "Our secure email requires a modern web browser." +#~ msgstr "Our secure email requires a modern web browser." + +#~ msgid "Overview" +#~ msgstr "Overview" + +#~ msgid "Passwords don't match" +#~ msgstr "Passwords don't match" + +#~ msgid "Passwords don't match." +#~ msgstr "Passwords don't match." + +#~ msgid "Pay" +#~ msgstr "Pay" + +#~ msgid "Payment methods" +#~ msgstr "Payment methods" + +#~ msgid "Payment:" +#~ msgstr "Payment:" + +#~ msgid "Plan:" +#~ msgstr "Plan:" + +#~ msgid "Please add a payment method first" +#~ msgstr "Please add a payment method first" + +#~ msgid "Please check your email and enter the code below:" +#~ msgstr "Please check your email and enter the code below:" + +#~ msgid "Private key" +#~ msgstr "Private key" + +#~ msgid "ProtonMail addresses" +#~ msgstr "ProtonMail addresses" + +#~ msgid "ProtonMail aliases" +#~ msgstr "ProtonMail aliases" + +#~ msgid "" +#~ "ProtonMail business accounts can create subaccounts which are used by " +#~ "other members of your organization." +#~ msgstr "" +#~ "ProtonMail business accounts can create subaccounts which are used by " +#~ "other members of your organization." + +#~ msgid "" +#~ "ProtonMail supports both column and row layouts for the inbox. Using this " +#~ "setting, it is possible to change between the two layouts." +#~ msgstr "" +#~ "ProtonMail supports both column and row layouts for the inbox. Using this " +#~ "setting, it is possible to change between the two layouts." + +#~ msgid "Public key" +#~ msgstr "Public key" + +#~ msgid "reCaptcha verification" +#~ msgstr "reCaptcha verification" + +#~ msgid "Refresh domain status" +#~ msgstr "Refresh domain status" + +#~ msgid "Remove user" +#~ msgstr "Remove user" + +#~ msgid "Reply securely" +#~ msgstr "Reply securely" + +#~ msgid "Reset" +#~ msgstr "Reset" + +#~ msgid "Reset login password" +#~ msgstr "Reset login password" + +#~ msgid "Reset mailbox" +#~ msgstr "Reset mailbox" + +#~ msgid "Reset now" +#~ msgstr "Reset now" + +#~ msgid "Role" +#~ msgstr "Role" + +#~ msgid "" +#~ "Safari doesn't support downloading of keys. We are working on a fix for " +#~ "this." +#~ msgstr "" +#~ "Safari doesn't support downloading of keys. We are working on a fix for " +#~ "this." + +#~ msgid "Sign up failed" +#~ msgstr "Sign up failed" + +#~ msgid "SMS verification" +#~ msgstr "SMS verification" + +#~ msgid "Sorry, this message does not exist or has already expired" +#~ msgstr "Sorry, this message does not exist or has already expired" + +#~ msgid "Space" +#~ msgstr "Space" + +#~ msgid "Storage:" +#~ msgstr "Storage:" + +#~ msgid "" +#~ "Take back your privacy! Creating your free secure email account takes " +#~ "less than 2 minutes in most cases." +#~ msgstr "" +#~ "Take back your privacy! Creating your free secure email account takes " +#~ "less than 2 minutes in most cases." + +#~ msgid "" +#~ "This can take a few seconds or a few minutes depending on your device." +#~ msgstr "" +#~ "This can take a few seconds or a few minutes depending on your device." + +#~ msgid "" +#~ "This is used to encrypt and decrypt your messages. This is private and " +#~ "only you know it." +#~ msgstr "" +#~ "This is used to encrypt and decrypt your messages. This is private and " +#~ "only you know it." + +#~ msgid "This is used to log you into our system." +#~ msgstr "This is used to log you into our system." + +#~ msgid "" +#~ "This is used to recover your account if you get locked out or forget your " +#~ "login password." +#~ msgstr "" +#~ "This is used to recover your account if you get locked out or forget your " +#~ "login password." + +#~ msgid "" +#~ "This page is only available on larger resolution devices. If you are on " +#~ "a phone, try landscape mode, or visit on a computer instead." +#~ msgstr "" +#~ "This page is only available on larger resolution devices. If you are on " +#~ "a phone, try landscape mode, or visit on a computer instead." + +#~ msgid "" +#~ "This sets the default composer size. Two sizes are available, a smaller " +#~ "popup composer, and a bigger full screen composer. Learn more" +#~ msgstr "" +#~ "This sets the default composer size. Two sizes are available, a smaller " +#~ "popup composer, and a bigger full screen composer. Learn more" + +#~ msgid "" +#~ "This will be your email address. Select the drop down to choose your " +#~ "domain." +#~ msgstr "" +#~ "This will be your email address. Select the drop down to choose your " +#~ "domain." + +#~ msgid "Time" +#~ msgstr "Time" + +#~ msgid "" +#~ "To add more addresses to your account, or to use your own domain, upgrade " +#~ "your account." +#~ msgstr "" +#~ "To add more addresses to your account, or to use your own domain, upgrade " +#~ "your account." + +#~ msgid "To continue, type 'DANGER' below:" +#~ msgstr "To continue, type ‘DANGER’ below:" + +#~ msgid "Toolbar" +#~ msgstr "Toolbar" + +#~ msgid "Total price:" +#~ msgstr "Total price:" + +#~ msgid "Unable to save your changes, please try again." +#~ msgstr "Unable to save your changes, please try again." + +#~ msgid "Unable to upload" +#~ msgstr "Unable to upload" + +#~ msgid "Unlock" +#~ msgstr "Unlock" + +#~ msgid "Upgrade your plan" +#~ msgstr "Upgrade your plan" + +#~ msgid "Use one of these browsers for the best experience during Beta:" +#~ msgstr "Use one of these browsers for the best experience during Beta:" + +#~ msgid "Used" +#~ msgstr "Used" + +#~ msgid "User" +#~ msgstr "User" + +#~ msgid "User history" +#~ msgstr "User history" + +#~ msgid "User login" +#~ msgstr "User login" + +#~ msgid "Username is required." +#~ msgstr "Username is required." + +#~ msgid "Username:" +#~ msgstr "Username:" + +#~ msgid "Verification code sent" +#~ msgstr "Verification code sent" + +#~ msgid "Verification did not succeed, please try again in an hour." +#~ msgstr "Verification did not succeed, please try again in an hour." + +#~ msgid "Warning" +#~ msgstr "Warning" + +#~ msgid "" +#~ "We will send a code to your Recovery email to reset your Recovery email
. " +#~ "Enter it below to continue." +#~ msgstr "" +#~ "We’ve sent a verification code to your Recovery email. " +#~ "Enter it below to continue." + +#~ msgid "" +#~ "We've sent a Verification Token to your Recovery Email. Please enter it " +#~ "below:" +#~ msgstr "" +#~ "We’ve sent a Verification Token to your Recovery Email. Please enter it " +#~ "below:" + +#~ msgid "Wipe" +#~ msgstr "Wipe" + +#~ msgid "" +#~ "Wrong verification code. Please make sure you copied the verification " +#~ "code correctly and try again. It can take up to 1 hour for changes to " +#~ "take affect." +#~ msgstr "" +#~ "Wrong verification code. Please make sure you copied the verification " +#~ "code correctly and try again. It can take up to 1 hour for changes to " +#~ "take affect." + +#~ msgid "You can drag and drop addresses to order them." +#~ msgstr "You can drag and drop addresses to order them." + +#~ msgid "" +#~ "You have no contacts, you can add contact with the above button 'ADD " +#~ "CONTACT'." +#~ msgstr "" +#~ "You have no contacts, you can add contact with the above button ‘ADD " +#~ "CONTACT’." + +#~ msgid "You have no invoices." +#~ msgstr "You have no invoices." + +#~ msgid "" +#~ "You have no labels, you can add label with the above button 'ADD LABEL'." +#~ msgstr "" +#~ "You have no labels, you can add label with the above button ‘ADD LABEL’." + +#~ msgid "" +#~ "You have no saved payment methods, you can add a payment method by " +#~ "clicking 'ADD'." +#~ msgstr "" +#~ "You have no saved payment methods, you can add a payment method by " +#~ "clicking ‘ADD’." + +#~ msgid "You must unsubscribe before requesting deletion of your account." +#~ msgstr "You must unsubscribe before requesting deletion of your account." + +#~ msgid "" +#~ "Your account currently has an overdue invoice. Please pay all unpaid " +#~ "invoices." +#~ msgstr "" +#~ "Your account currently has an overdue invoice. Please pay all unpaid " +#~ "invoices." + +#, fuzzy +#~ msgid "Conversation selected" +#~ msgid_plural "Conversations selected" +#~ msgstr[0] "Conversation selected" +#~ msgstr[1] "Conversation selected" + +#~ msgid "Email already taken." +#~ msgstr "Email already taken." + +#~ msgid "Email available!" +#~ msgstr "Email available!" + +#~ msgid "" +#~ "We will send a code to your Recovery Email to reset your Recovery Email to reset your our support page to find " +#~ "troubleshooting guides and contact our support team. If you find a bug in " +#~ "ProtonMail, please let us know! You can send us a bug report by clicking " +#~ "Report Bugs (1)" +#~ msgstr "" +#~ "If you have questions or need help, please visit our support page to find " +#~ "troubleshooting guides and contact our support team. If you find a bug in " +#~ "ProtonMail, please let us know! You can send us a bug report by clicking " +#~ "Report Bugs (1)" + +#~ msgid "" +#~ "Labels are a powerful tool to manage your inbox. You can add and remove " +#~ "labels from selected emails by clicking the Label button (1). You can also add, delete, and edit labels by clicking on " +#~ "Label Settings (2)." +#~ msgstr "" +#~ "Labels are a powerful tool to manage your inbox. You can add and remove " +#~ "labels from selected emails by clicking the Label button (1). You can also add, delete, and edit labels by clicking on " +#~ "Label Settings (2)." + +#~ msgid "" +#~ "We've sent a verification code to your Recovery Email. " +#~ "Enter it below to continue." +#~ msgstr "" +#~ "We've sent a verification code to your Recovery Email. " +#~ "Enter it below to continue." + +#~ msgid "Conversations selected" +#~ msgstr "Conversations selected" + +#~ msgid "" +#~ "Verification Code Sent
Please check your email and " +#~ "enter the code below:" +#~ msgstr "" +#~ "Verification Code Sent
Please check your email and " +#~ "enter the code below:" + +#~ msgid "Are you Human?" +#~ msgstr "Are you Human?" + +#~ msgid "Choose a Mailbox Password" +#~ msgstr "Choose a Mailbox Password" + +#~ msgid "" +#~ "ProtonMail supports both column and row layouts for the inbox. Using this " +#~ "setting, it is possible to change between the two layouts. Learn more" +#~ msgstr "" +#~ "ProtonMail supports both column and row layouts for the inbox. Using this " +#~ "setting, it is possible to change between the two layouts. Learn more" + +#~ msgid "Additional Themes (Experimental)" +#~ msgstr "Additional Themes (Experimental)" + +#~ msgid "Choose a Login Password" +#~ msgstr "Choose a Login Password" + +#~ msgid "Choose Username" +#~ msgstr "Choose Username" diff --git a/po/template.pot b/po/template.pot new file mode 100644 index 0000000..10751e8 --- /dev/null +++ b/po/template.pot @@ -0,0 +1,4873 @@ +msgid "" +msgstr "" +"Content-Type: text/plain; charset=UTF-8\n" +"Content-Transfer-Encoding: 8bit\n" +"Project-Id-Version: \n" + +#. placeholder showing unread conversations +#: src/app/templates/partials/conversation-placeholder.tpl.html:43 +msgctxt "Title" +msgid "{{ $count }} conversation selected" +msgid_plural "{{ $count }} conversations selected" +msgstr[0] "" +msgstr[1] "" + +#. keys page to show the key size for an address +#: src/app/templates/views/keys.tpl.html:135 +#: src/app/templates/views/keys.tpl.html:39 +#: src/app/templates/views/keys.tpl.html:86 +msgid "{{ key.bitSize }} Bit" +msgstr "" + +#: src/app/templates/views/keys.tpl.html:37 +#: src/app/templates/views/keys.tpl.html:84 +msgid "{{ key.created | date }} - {{ key.fingerprint }}" +msgstr "" + +#: src/app/templates/views/keys.tpl.html:132 +#: src/app/templates/views/keys.tpl.html:133 +msgid "{{ key.fingerprint }} ({{ key.created | date }})" +msgstr "" + +#. space used out of total space allowed for a member +#: src/app/templates/views/members.tpl.html:91 +msgid "{{ member.UsedSpace | humanSize }} of {{ member.MaxSpace | humanSize }} Used" +msgstr "" + +#: src/app/templates/partials/composer.tpl.html:191 +msgid "{{ message.Attachments.length }} Files attached ({{ getAttachmentsSize(message) | humanSize }})" +msgstr "" + +#. addresses page. how many addresses are in use +#: src/app/templates/views/addresses.tpl.html:8 +msgid "{{ organization.MaxAddresses }} addresses used." +msgstr "" + +#. dashboard page. how many addresses exist for an organization as well as the total number allowed. +#: src/app/templates/views/dashboard.tpl.html:32 +msgid "{{ organization.UsedAddresses }} of {{ organization.MaxAddresses }}" +msgstr "" + +#: src/app/templates/views/domains.tpl.html:14 +msgid "{{ organization.UsedDomains }} / {{ organization.MaxDomains }} Domains used." +msgstr "" + +#. dashboard page. how many domains exist for an organization as well as the total number allowed. +#: src/app/templates/views/dashboard.tpl.html:21 +msgid "{{ organization.UsedDomains }} of {{ organization.MaxDomains }}" +msgstr "" + +#. members page. how many members exist for an organization as well as the total number allowed. +#: src/app/templates/views/members.tpl.html:31 +msgid "{{ organization.UsedMembers }} of {{ organization.MaxMembers }} Used" +msgstr "" + +#. show used storage for an account +#: src/app/templates/views/dashboard.tpl.html:43 +msgid "{{ organization.UsedSpace | humanSize }} of {{ organization.MaxSpace | humanSize }}" +msgstr "" + +#. show used storage for an account +#: src/app/templates/views/dashboard.tpl.html:44 +msgid "{{ user.UsedSpace | humanSize }} of {{ user.MaxSpace | humanSize }}" +msgstr "" + +#. price per month for a plan +#: src/app/templates/views/dashboard.tpl.html:217 +#: src/app/templates/views/dashboard.tpl.html:234 +msgid "/Month" +msgstr "" + +#. copyright footer +#: src/app/templates/layout/login.tpl.html:8 +#: src/app/templates/layout/outside.tpl.html:9 +#: src/app/templates/views/step1.tpl.html:214 +msgid "© 2016 ProtonMail.com - Made globally, hosted in Switzerland." +msgstr "" + +#: src/app/templates/partials/conversation-list-columns.tpl.html:79 +#: src/app/templates/partials/conversation-list-rows.tpl.html:77 +msgid "+{{ (conversation.LabelIDs | labels).length - 4 }} More labels" +msgstr "" + +#: src/app/templates/partials/message.tpl.html:55 +msgid "+{{ (message.LabelIDs | labels).length - 4 }} More labels" +msgstr "" + +#. feature for upgrading from a free account to a paid account +#: src/app/templates/modals/monetize.tpl.html:36 +msgid "5GB Storage (instead of 500MB)" +msgstr "" + +#: src/app/controllers/contacts.js:207 +msgid "A contact already exists for this email address." +msgstr "" + +#. Explain privacy issues for using img.ur to do screenshot uploading +#: src/app/templates/modals/bug.tpl.html:70 +msgctxt "Info" +msgid "A screenshot of your current page will be sent to us automatically, so we can help debug your problem! Screenshots are hosted using a 3rd party, public service [imgur]." +msgstr "" + +#. upgrade page title +#: src/app/templates/views/upgrade.tpl.html:3 +msgctxt "Title" +msgid "Absolute security" +msgstr "" + +#. custom domain menu +#. custom domain menu select dropdown +#: src/app/templates/partials/menu.settings.tpl.html:30 +#: src/app/templates/partials/menu.settings.tpl.html:6 +msgctxt "Nav" +msgid "Account" +msgstr "" + +#: src/app/controllers/secured.js:226 +#: src/app/controllers/secured.js:31 +msgctxt "Title" +msgid "Account" +msgstr "" + +#. table heading +#. Table heading +#: src/app/templates/views/contacts.tpl.html:35 +#: src/app/templates/views/domains.tpl.html:139 +#: src/app/templates/views/domains.tpl.html:29 +#: src/app/templates/views/invoices.tpl.html:18 +#: src/app/templates/views/invoices.tpl.html:46 +#: src/app/templates/views/keys.tpl.html:121 +#: src/app/templates/views/keys.tpl.html:26 +#: src/app/templates/views/keys.tpl.html:73 +#: src/app/templates/views/members.tpl.html:74 +#: src/app/templates/views/payments.tpl.html:110 +#: src/app/templates/views/payments.tpl.html:18 +msgctxt "Title" +msgid "Actions" +msgstr "" + +#. heading for active addresses listing +#: src/app/templates/views/addresses.tpl.html:18 +msgctxt "Title" +msgid "Active addresses" +msgstr "" + +#. Tooltip +#: src/app/templates/partials/message.tpl.html:154 +msgid "Add" +msgstr "" + +#. button +#. contacts toolbar menu option +#: src/app/templates/modals/domain/address.tpl.html:30 +#: src/app/templates/modals/user/address.tpl.html:28 +#: src/app/templates/partials/toolbar-contacts.tpl.html:17 +#: src/app/templates/views/labels.tpl.html:5 +#: src/app/templates/views/payments.tpl.html:8 +msgctxt "Action" +msgid "Add" +msgstr "" + +#. label for adding a new custom domain +#: src/app/templates/modals/domain/domain.tpl.html:11 +msgid "Add a domain that you own to your ProtonMail account." +msgstr "" + +#. add address button on members page +#. add address button on the domains page +#: src/app/templates/views/domains.tpl.html:130 +#: src/app/templates/views/members.tpl.html:98 +msgctxt "Action" +msgid "Add address" +msgstr "" + +#. label for adding new address form +#: src/app/templates/modals/user/address.tpl.html:21 +msgctxt "Title" +msgid "Add address" +msgstr "" + +#. payment modal add coupon button +#: src/app/templates/modals/payment/payment.tpl.html:159 +msgctxt "Action" +msgid "Add coupon" +msgstr "" + +#. button to add custom domains +#: src/app/templates/views/domains.tpl.html:21 +#: src/app/templates/views/members.tpl.html:65 +msgctxt "Action" +msgid "Add custom domain" +msgstr "" + +#. addresses page +#: src/app/templates/views/addresses.tpl.html:13 +msgctxt "Action" +msgid "Add custom domain address" +msgstr "" + +#: src/app/templates/modals/customizeInvoice.tpl.html:6 +msgctxt "Title" +msgid "Add invoice details" +msgstr "" + +#: src/app/controllers/contacts.js:203 +msgctxt "Action" +msgid "Add new contact" +msgstr "" + +#: src/app/templates/directives/labels.tpl.html:35 +msgid "Add new label" +msgstr "" + +#. addresses page +#: src/app/templates/views/addresses.tpl.html:12 +msgctxt "Action" +msgid "Add new ProtonMail address" +msgstr "" + +#. heading for alias modal +#: src/app/templates/modals/alias.tpl.html:6 +msgctxt "Title" +msgid "Add new ProtonMail address" +msgstr "" + +#: src/app/templates/modals/user/address.tpl.html:3 +#: src/app/templates/modals/user/member.tpl.html:3 +msgctxt "Title" +msgid "Add user" +msgstr "" + +#: src/app/templates/views/members.tpl.html:64 +msgctxt "Action" +msgid "Add user" +msgstr "" + +#: src/app/templates/modals/customizeInvoice.tpl.html:7 +msgctxt "Info" +msgid "Add your name (or company name) and address to your invoices." +msgstr "" + +#. added addesses table label / heading +#: src/app/templates/modals/domain/address.tpl.html:34 +msgctxt "Title" +msgid "Added addresses" +msgstr "" + +#. legend / form heading for adding custom CSS theme code +#: src/app/templates/views/appearance.tpl.html:99 +msgctxt "Title" +msgid "Additional themes (experimental)" +msgstr "" + +#. table heading +#. table heading for the domains page table listing of addresses +#: src/app/templates/modals/domain/address.tpl.html:38 +#: src/app/templates/modals/generate.tpl.html:28 +#: src/app/templates/partials/searchForm.tpl.html:57 +#: src/app/templates/views/domains.tpl.html:137 +msgctxt "Title" +msgid "Address" +msgstr "" + +#: src/app/templates/modals/alias.tpl.html:11 +#: src/app/templates/modals/domain/address.tpl.html:24 +#: src/app/templates/modals/payment/payment.tpl.html:21 +#: src/app/templates/modals/user/address.tpl.html:24 +#: src/app/templates/views/dashboard.tpl.html:185 +msgid "Address" +msgid_plural "Addresses" +msgstr[0] "" +msgstr[1] "" + +#: src/app/services/modal.js:1058 +msgid "Address added" +msgstr "" + +#: src/app/services/modal.js:1066 +#: src/app/services/modal.js:1069 +msgctxt "Error" +msgid "Address creation failed" +msgstr "" + +#: src/app/controllers/settings/addresses.js:173 +#: src/app/controllers/settings/domains.js:249 +msgid "Address deleted" +msgstr "" + +#: src/app/controllers/settings/addresses.js:103 +#: src/app/controllers/settings/domains.js:298 +#: src/app/controllers/settings/members.js:181 +msgid "Address disabled" +msgstr "" + +#: src/app/controllers/settings/addresses.js:80 +#: src/app/controllers/settings/domains.js:275 +msgid "Address enabled" +msgstr "" + +#: src/app/controllers/settings/addresses.js:239 +msgid "Address order saved" +msgstr "" + +#: src/app/controllers/settings/addresses.js:140 +msgid "Address updated" +msgstr "" + +#. page heading +#. table heading +#: src/app/templates/modals/domain/address.tpl.html:7 +#: src/app/templates/modals/user/address.tpl.html:39 +#: src/app/templates/views/addresses.tpl.html:9 +#: src/app/templates/views/dashboard.tpl.html:30 +#: src/app/templates/views/dashboard.tpl.html:77 +#: src/app/templates/views/members.tpl.html:73 +msgctxt "Title" +msgid "Addresses" +msgstr "" + +#: src/app/templates/views/domains.tpl.html:51 +msgctxt "Action" +msgid "Addresses" +msgstr "" + +#. custom domain menu +#: src/app/templates/modals/domain/menu.tpl.html:18 +#: src/app/templates/partials/menu.settings.tpl.html:21 +msgctxt "Nav" +msgid "Addresses" +msgstr "" + +#: src/app/templates/modals/user/address.tpl.html:33 +msgctxt "Title" +msgid "Addresses added" +msgstr "" + +#: src/app/templates/views/domains.tpl.html:120 +msgid "Addresses used." +msgstr "" + +#. DMARC status badge +#: src/app/templates/modals/domain/dmarc.tpl.html:9 +msgid "advanced" +msgstr "" + +#: src/app/templates/views/security.tpl.html:18 +msgctxt "Action" +msgid "Advanced" +msgstr "" + +#: src/app/templates/partials/searchForm.tpl.html:3 +msgctxt "Action" +msgid "Advanced search" +msgstr "" + +#: src/app/templates/directives/squire.tpl.html:37 +msgctxt "Action" +msgid "Align center" +msgstr "" + +#: src/app/templates/directives/squire.tpl.html:32 +msgctxt "Action" +msgid "Align left" +msgstr "" + +#: src/app/templates/directives/squire.tpl.html:42 +msgctxt "Action" +msgid "Align right" +msgstr "" + +#. form option +#: src/app/controllers/header.js:160 +#: src/app/controllers/header.js:21 +#: src/app/controllers/header.js:35 +#: src/app/controllers/settings/invoices.js:20 +#: src/app/templates/partials/searchForm.tpl.html:68 +msgid "All" +msgstr "" + +#. reset warning 2/3 +#: src/app/templates/views/reset-mailbox-password.tpl.html:6 +msgctxt "Info" +msgid "ALL OF YOUR DATA WILL BE LOST FOREVER!" +msgstr "" + +#: src/app/templates/modals/payment/payment.tpl.html:143 +msgctxt "Info" +msgid "All PayPal orders are charged in US Dollar, click the link to change your subscription to US Dollar." +msgstr "" + +#: src/app/templates/modals/dropzone.tpl.html:9 +msgctxt "Info" +msgid "Allowed formats (UTF-8 encoding): .vcf, .csvNeed help?" +msgstr "" + +#. link to login +#: src/app/templates/views/step1.tpl.html:74 +msgctxt "Action" +msgid "Already have an account?" +msgstr "" + +#: src/app/controllers/settings/dashboard.js:264 +msgctxt "Info" +msgid "Already subscribed" +msgstr "" + +#. Form checkbox option +#: src/app/templates/directives/labels.tpl.html:31 +msgid "Also archive" +msgstr "" + +#: src/app/templates/views/account.tpl.html:58 +msgctxt "Info" +msgid "Also used to reset a forgotten password." +msgstr "" + +#: src/app/templates/modals/donate.tpl.html:12 +msgid "Amount" +msgstr "" + +#: src/app/templates/modals/pay.tpl.html:12 +msgctxt "Title" +msgid "Amount" +msgstr "" + +#. invoice heading +#: src/app/templates/modals/pay.tpl.html:20 +#: src/app/templates/views/invoice.print.tpl.html:89 +msgctxt "Title" +msgid "Amount due" +msgstr "" + +#: src/app/templates/modals/payment/payment.tpl.html:50 +msgid "Amount due" +msgstr "" + +#: src/app/controllers/settings/dashboard.js:469 +msgctxt "Error" +msgid "Amount is different" +msgstr "" + +#: src/app/templates/views/payments.tpl.html:106 +msgctxt "Title" +msgid "Amount Paid / Due" +msgstr "" + +#: src/app/templates/views/step1.tpl.html:179 +msgctxt "Error" +msgid "An error occured while trying to create your account. To see common problems and solutions click here." +msgstr "" + +#. select dropdown options +#: src/app/templates/modals/bug.tpl.html:19 +msgid "Android" +msgstr "" + +#: src/app/templates/views/dashboard.tpl.html:83 +msgctxt "Title" +msgid "Annually" +msgstr "" + +#: src/app/templates/views/invoices.tpl.html:27 +#: src/app/templates/views/invoices.tpl.html:55 +msgid "Annually" +msgstr "" + +#. custom domain menu +#. custom domain menu select dropdown +#: src/app/templates/partials/menu.settings.tpl.html:15 +#: src/app/templates/partials/menu.settings.tpl.html:33 +msgctxt "Nav" +msgid "Appearance" +msgstr "" + +#: src/app/controllers/secured.js:235 +#: src/app/controllers/secured.js:35 +msgctxt "Title" +msgid "Appearance" +msgstr "" + +#: src/app/templates/directives/labels.tpl.html:38 +#: src/app/templates/modals/payment/payment.tpl.html:169 +#: src/app/templates/modals/storage.tpl.html:24 +msgctxt "Action" +msgid "Apply" +msgstr "" + +#. Folder name +#: src/app/templates/partials/sidebar-responsive.tpl.html:44 +#: src/app/templates/partials/sidebar.tpl.html:45 +msgctxt "Nav" +msgid "Archive" +msgstr "" + +#. location tag +#: src/app/directives/move.js:22 +#: src/app/templates/directives/location-tag.tpl.html:7 +msgid "Archive" +msgstr "" + +#. no results heading +#: src/app/controllers/secured.js:202 +#: src/app/templates/partials/no-results.tpl.html:21 +msgctxt "Title" +msgid "Archive" +msgstr "" + +#. Antispam section of account creation +#: src/app/templates/views/step1.tpl.html:81 +msgctxt "Title" +msgid "Are you human?" +msgstr "" + +#: src/app/controllers/settings/security.js:98 +msgid "Are you sure you want to clear all your logs?" +msgstr "" + +#: src/app/controllers/settings/security.js:46 +msgctxt "Info" +msgid "Are you sure you want to clear all your logs?" +msgstr "" + +#: src/app/controllers/contacts.js:133 +msgctxt "Info" +msgid "Are you sure you want to delete all your contacts?" +msgstr "" + +#: src/app/controllers/settings/addresses.js:169 +#: src/app/controllers/settings/domains.js:171 +#: src/app/controllers/settings/domains.js:245 +msgctxt "Info" +msgid "Are you sure you want to delete this address?" +msgstr "" + +#: src/app/controllers/settings/labels.js:134 +msgctxt "Info" +msgid "Are you sure you want to delete this label?" +msgstr "" + +#: src/app/controllers/settings/payments.js:97 +msgctxt "Info" +msgid "Are you sure you want to delete this payment method?" +msgstr "" + +#: src/app/controllers/settings/addresses.js:98 +#: src/app/controllers/settings/domains.js:294 +msgid "Are you sure you want to disable this address?" +msgstr "" + +#: src/app/controllers/settings/members.js:222 +msgid "Are you sure you want to remove this member?" +msgstr "" + +#: src/app/controllers/settings/members.js:170 +msgid "Are you sure you want to unlink this address?" +msgstr "" + +#: src/app/controllers/conversations.js:891 +msgid "Are you sure?" +msgstr "" + +#. but report form heading label +#: src/app/templates/modals/bug.tpl.html:66 +msgctxt "Title" +msgid "Attach screenshot" +msgstr "" + +#: src/app/templates/partials/attachments.tpl.html:5 +#: src/app/templates/views/message.print.tpl.html:54 +msgid "Attachment" +msgid_plural "Attachments" +msgstr[0] "" +msgstr[1] "" + +#: src/app/templates/partials/composer.tpl.html:194 +#: src/app/templates/views/outside.reply.tpl.html:37 +msgid "Attachments" +msgstr "" + +#. Search form option heading +#: src/app/templates/partials/searchForm.tpl.html:64 +msgctxt "Title" +msgid "Attachments" +msgstr "" + +#. logs page heading +#: src/app/templates/views/security.tpl.html:7 +msgctxt "Title" +msgid "Authentication Logs" +msgstr "" + +#. form option +#: src/app/templates/views/account.tpl.html:241 +msgctxt "Action" +msgid "Auto" +msgstr "" + +#. Section heading +#. Settings/Account page form heading for enabling or disabling autosave contacts +#: src/app/templates/views/account.tpl.html:206 +#: src/app/templates/views/account.tpl.html:209 +msgctxt "Title" +msgid "Automatically save contacts" +msgstr "" + +#: src/app/templates/partials/header-auth-simple.tpl.html:10 +msgctxt "Action" +msgid "Back to inbox" +msgstr "" + +#: src/app/templates/partials/toolbar-desktop.tpl.html:3 +#: src/app/templates/partials/toolbar-list-rows-responsive.tpl.html:4 +#: src/app/templates/partials/toolbar-list-rows.tpl.html:18 +#: src/app/templates/partials/toolbar-mobile.tpl.html:8 +msgctxt "Action" +msgid "Back to list" +msgstr "" + +#: src/app/templates/partials/header-no-auth.tpl.html:10 +msgctxt "Action" +msgid "Back to protonmail.com" +msgstr "" + +#: src/app/templates/views/security.tpl.html:17 +msgctxt "Action" +msgid "Basic" +msgstr "" + +#. printed message info +#: src/app/controllers/compose.js:1564 +#: src/app/templates/partials/message.tpl.html:117 +#: src/app/templates/views/message.print.tpl.html:46 +msgid "BCC" +msgstr "" + +#: src/app/templates/partials/composer.tpl.html:153 +msgctxt "Title" +msgid "BCC" +msgstr "" + +#: src/app/templates/modals/domain/mx.tpl.html:13 +msgctxt "Info" +msgid "Before you can receive emails for your custom domain addresses at ProtonMail, you need to add the following MX record to your DNS. This can typically be done in the control panel of your domain name registrar." +msgstr "" + +#. payment status badge +#: src/app/templates/views/payments.tpl.html:133 +#: src/app/templates/views/payments.tpl.html:86 +msgid "Billed" +msgstr "" + +#. invoice heading +#: src/app/templates/views/invoice.print.tpl.html:81 +msgctxt "Title" +msgid "Billing cycle" +msgstr "" + +#: src/app/templates/directives/squire.tpl.html:5 +msgctxt "Action" +msgid "Bold" +msgstr "" + +#: src/app/templates/modals/bug.tpl.html:39 +#: src/app/templates/views/upgrade.tpl.html:41 +msgid "Browser" +msgstr "" + +#: src/app/templates/modals/bug.tpl.html:36 +msgctxt "Title" +msgid "Browser" +msgstr "" + +#: src/app/templates/modals/bug.tpl.html:45 +msgid "Browser version" +msgstr "" + +#: src/app/templates/modals/bug.tpl.html:42 +msgctxt "Title" +msgid "Browser version" +msgstr "" + +#: src/app/templates/modals/bug.tpl.html:71 +msgctxt "Info" +msgid "Bug reports are not end-to-end encrypted, please do not send any sensitive information." +msgstr "" + +#: src/app/controllers/settings/appearance.js:120 +msgid "Buttons position saved" +msgstr "" + +#: src/app/templates/modals/payment/payment.tpl.html:172 +#: src/app/templates/views/step1.tpl.html:71 +msgctxt "Info" +msgid "By clicking Create Account, you agree to abide by ProtonMail's Terms and Conditions." +msgstr "" + +#: src/app/controllers/compose.js:93 +#: src/app/routes.js:462 +msgid "By leaving now, you will lose what you have written in this email. You can save a draft if you want to come back to it later on." +msgstr "" + +#. back to login page +#. cancel reset process +#: src/app/templates/modals/alias.tpl.html:23 +#: src/app/templates/modals/bug.tpl.html:78 +#: src/app/templates/modals/card.tpl.html:56 +#: src/app/templates/modals/confirm.tpl.html:13 +#: src/app/templates/modals/contact.tpl.html:29 +#: src/app/templates/modals/customizeInvoice.tpl.html:16 +#: src/app/templates/modals/deleteAccount.tpl.html:26 +#: src/app/templates/modals/dropzone.tpl.html:20 +#: src/app/templates/modals/generate.tpl.html:54 +#: src/app/templates/modals/identity.tpl.html:49 +#: src/app/templates/modals/label.tpl.html:34 +#: src/app/templates/modals/loginHelp.tpl.html:24 +#: src/app/templates/modals/loginPassword.tpl.html:14 +#: src/app/templates/modals/organizationRecovery.tpl.html:14 +#: src/app/templates/modals/pay.tpl.html:61 +#: src/app/templates/modals/payment/payment.tpl.html:178 +#: src/app/templates/modals/reactivate.tpl.html:16 +#: src/app/templates/modals/storage.tpl.html:23 +#: src/app/templates/modals/user/address.tpl.html:55 +#: src/app/templates/modals/user/member.tpl.html:53 +#: src/app/templates/partials/composer.tpl.html:120 +#: src/app/templates/partials/composer.tpl.html:87 +#: src/app/templates/views/outside.reply.tpl.html:36 +#: src/app/templates/views/reset-mailbox-password.tpl.html:11 +#: src/app/templates/views/reset-mailbox-password.tpl.html:50 +msgctxt "Action" +msgid "Cancel" +msgstr "" + +#. payment type badge +#: src/app/templates/views/payments.tpl.html:125 +#: src/app/templates/views/payments.tpl.html:68 +msgid "Cancellation" +msgstr "" + +#: src/app/templates/modals/card.tpl.html:29 +#: src/app/templates/modals/donate.tpl.html:45 +#: src/app/templates/modals/payment/payment.tpl.html:101 +msgid "Card number" +msgstr "" + +#: src/app/models/payments.js:264 +msgctxt "Error" +msgid "Card number invalid" +msgstr "" + +#: src/app/templates/modals/card.tpl.html:47 +#: src/app/templates/modals/donate.tpl.html:63 +#: src/app/templates/modals/payment/payment.tpl.html:119 +msgid "Card validation code" +msgstr "" + +#: src/app/templates/partials/composer.tpl.html:149 +msgctxt "Title" +msgid "CC" +msgstr "" + +#. message metadata +#. printed message info +#: src/app/controllers/compose.js:1554 +#: src/app/templates/partials/message.tpl.html:103 +#: src/app/templates/views/message.print.tpl.html:39 +#: src/app/templates/views/outside.message.tpl.html:34 +msgid "CC" +msgstr "" + +#: src/app/templates/partials/composer.tpl.html:137 +#: src/app/templates/partials/composer.tpl.html:144 +msgid "CC BCC" +msgstr "" + +#: src/app/templates/partials/toolbar-desktop.tpl.html:90 +#: src/app/templates/partials/toolbar-desktop.tpl.html:93 +#: src/app/templates/partials/toolbar-list-rows.tpl.html:5 +msgid "Change layout" +msgstr "" + +#: src/app/templates/modals/payment/payment.tpl.html:136 +#: src/app/templates/modals/payment/payment.tpl.html:140 +#: src/app/templates/modals/payment/payment.tpl.html:144 +msgctxt "Action" +msgid "Change subscription" +msgstr "" + +#: src/app/templates/views/reset-mailbox-password.tpl.html:19 +msgctxt "Title" +msgid "Check your email" +msgstr "" + +#. select dropdown options +#: src/app/templates/modals/bug.tpl.html:16 +msgid "Choose" +msgstr "" + +#: src/app/templates/modals/welcome.tpl.html:15 +msgid "Choose a display name" +msgstr "" + +#: src/app/templates/views/step1.tpl.html:37 +msgid "Choose a login password" +msgstr "" + +#: src/app/templates/views/step1.tpl.html:50 +msgid "Choose a mailbox password" +msgstr "" + +#: src/app/templates/modals/alias.tpl.html:9 +msgctxt "Title" +msgid "Choose address" +msgstr "" + +#: src/app/templates/views/step1.tpl.html:22 +msgid "Choose username" +msgstr "" + +#: src/app/templates/views/appearance.tpl.html:56 +msgctxt "Info" +msgid "Choose your prefered button order for marking messages as read / unread." +msgstr "" + +#: src/app/templates/views/appearance.tpl.html:94 +msgctxt "Action" +msgid "Clear" +msgstr "" + +#: src/app/controllers/settings/security.js:45 +msgctxt "Title" +msgid "Clear" +msgstr "" + +#. safari attachment instructions +#: src/app/templates/partials/safari.attachment.warning.tpl.html:16 +#: src/app/templates/partials/safari.warning.tpl.html:16 +msgid "Click your attachment once to decrypt it. Once decryption finishes you will see a download arrow icon appear." +msgstr "" + +#: src/app/templates/modals/alert.tpl.html:3 +#: src/app/templates/modals/alias.tpl.html:3 +#: src/app/templates/modals/bug.tpl.html:3 +#: src/app/templates/modals/card.tpl.html:4 +#: src/app/templates/modals/confirm.tpl.html:3 +#: src/app/templates/modals/contact.tpl.html:3 +#: src/app/templates/modals/customizeInvoice.tpl.html:3 +#: src/app/templates/modals/deleteAccount.tpl.html:3 +#: src/app/templates/modals/domain/address.tpl.html:3 +#: src/app/templates/modals/domain/address.tpl.html:53 +#: src/app/templates/modals/domain/dkim.tpl.html:3 +#: src/app/templates/modals/domain/dkim.tpl.html:50 +#: src/app/templates/modals/domain/dmarc.tpl.html:3 +#: src/app/templates/modals/domain/dmarc.tpl.html:47 +#: src/app/templates/modals/domain/domain.tpl.html:17 +#: src/app/templates/modals/domain/domain.tpl.html:3 +#: src/app/templates/modals/domain/mx.tpl.html:3 +#: src/app/templates/modals/domain/mx.tpl.html:56 +#: src/app/templates/modals/domain/spf.tpl.html:3 +#: src/app/templates/modals/domain/spf.tpl.html:48 +#: src/app/templates/modals/domain/verification.tpl.html:3 +#: src/app/templates/modals/domain/verification.tpl.html:52 +#: src/app/templates/modals/donate.tpl.html:3 +#: src/app/templates/modals/dropzone.tpl.html:3 +#: src/app/templates/modals/feedback.tpl.html:15 +#: src/app/templates/modals/feedback.tpl.html:3 +#: src/app/templates/modals/generate.tpl.html:3 +#: src/app/templates/modals/identity.tpl.html:3 +#: src/app/templates/modals/label.tpl.html:3 +#: src/app/templates/modals/loginHelp.tpl.html:3 +#: src/app/templates/modals/loginPassword.tpl.html:3 +#: src/app/templates/modals/monetize.tpl.html:3 +#: src/app/templates/modals/monetize.tpl.html:49 +#: src/app/templates/modals/organizationRecovery.tpl.html:3 +#: src/app/templates/modals/pay.tpl.html:3 +#: src/app/templates/modals/payment/modal.tpl.html:3 +#: src/app/templates/modals/payment/thanks.tpl.html:8 +#: src/app/templates/modals/reactivate.tpl.html:3 +#: src/app/templates/modals/storage.tpl.html:3 +#: src/app/templates/modals/support.tpl.html:14 +#: src/app/templates/modals/support.tpl.html:3 +#: src/app/templates/modals/user/modal.tpl.html:3 +#: src/app/templates/modals/welcome.tpl.html:3 +#: src/app/templates/partials/composer.tpl.html:40 +#: src/app/templates/partials/safari.attachment.warning.tpl.html:24 +#: src/app/templates/partials/safari.attachment.warning.tpl.html:6 +#: src/app/templates/partials/safari.attachment.warning.tpl.html:7 +#: src/app/templates/partials/safari.warning.tpl.html:24 +#: src/app/templates/partials/safari.warning.tpl.html:6 +#: src/app/templates/partials/safari.warning.tpl.html:7 +#: src/app/templates/partials/wizard.tpl.html:4 +msgctxt "Action" +msgid "Close" +msgstr "" + +#: src/app/templates/views/step1.tpl.html:144 +msgid "Code verification" +msgstr "" + +#: src/app/templates/modals/label.tpl.html:19 +msgctxt "Title" +msgid "Color" +msgstr "" + +#. form option +#: src/app/templates/views/appearance.tpl.html:35 +msgid "Column" +msgstr "" + +#: src/app/templates/modals/loginHelp.tpl.html:16 +msgctxt "Action" +msgid "Common login problems" +msgstr "" + +#: src/app/templates/views/step1.tpl.html:160 +msgctxt "Action" +msgid "Complete setup" +msgstr "" + +#. compose button in sidebar +#. contacts toolbar menu option +#: src/app/templates/partials/sidebar.tpl.html:5 +#: src/app/templates/partials/toolbar-contacts.tpl.html:23 +msgctxt "Action" +msgid "Compose" +msgstr "" + +#: src/app/controllers/settings/appearance.js:74 +msgctxt "Info" +msgid "Compose mode saved" +msgstr "" + +#: src/app/templates/partials/message.tpl.html:110 +#: src/app/templates/partials/message.tpl.html:124 +#: src/app/templates/partials/message.tpl.html:32 +#: src/app/templates/partials/message.tpl.html:96 +msgid "Compose to" +msgstr "" + +#: src/app/templates/views/appearance.tpl.html:10 +msgctxt "Title" +msgid "Composer" +msgstr "" + +#: src/app/templates/modals/confirm.tpl.html:14 +#: src/app/templates/modals/identity.tpl.html:50 +msgctxt "Action" +msgid "Confirm" +msgstr "" + +#: src/app/controllers/settings/dashboard.js:314 +msgctxt "Title" +msgid "Confirm downgrade" +msgstr "" + +#: src/app/templates/modals/user/member.tpl.html:20 +#: src/app/templates/views/step1.tpl.html:41 +msgid "Confirm login password" +msgstr "" + +#: src/app/templates/views/reset-mailbox-password.tpl.html:42 +#: src/app/templates/views/step1.tpl.html:54 +msgid "Confirm mailbox password" +msgstr "" + +#: src/app/templates/partials/composer.tpl.html:65 +msgctxt "Title" +msgid "Confirm message password" +msgstr "" + +#: src/app/templates/views/account.tpl.html:178 +msgid "Confirm new mailbox password" +msgstr "" + +#. form label / heading for confirming new login password +#: src/app/templates/views/account.tpl.html:119 +msgctxt "Title" +msgid "Confirm new password" +msgstr "" + +#: src/app/templates/views/account.tpl.html:122 +msgid "Confirm new password" +msgstr "" + +#: src/app/templates/partials/composer.tpl.html:68 +#: src/app/templates/views/reset-login-password.tpl.html:47 +msgid "Confirm password" +msgstr "" + +#: src/app/controllers/conversations.js:890 +msgid "Confirmation" +msgstr "" + +#: src/app/controllers/contacts.js:221 +msgid "Contact added" +msgstr "" + +#: src/app/controllers/contacts.js:247 +msgid "Contact edited" +msgstr "" + +#: src/app/templates/modals/contact.tpl.html:23 +msgid "Contact email" +msgstr "" + +#: src/app/controllers/contacts.js:413 +msgid "Contact imported" +msgstr "" + +#: src/app/templates/modals/contact.tpl.html:15 +msgid "Contact name" +msgstr "" + +#: src/app/templates/modals/support.tpl.html:6 +msgctxt "Title" +msgid "Contact us" +msgstr "" + +#: src/app/templates/modals/bug.tpl.html:72 +msgctxt "Info" +msgid "Contact us at security@protonmail.com for critical security issues." +msgstr "" + +#: src/app/controllers/secured.js:220 +msgctxt "Title" +msgid "Contacts" +msgstr "" + +#. Folder name +#: src/app/templates/partials/sidebar-responsive.tpl.html:66 +msgctxt "Nav" +msgid "Contacts" +msgstr "" + +#: src/app/templates/partials/header-auth-desktop.tpl.html:38 +msgctxt "Action" +msgid "Contacts" +msgstr "" + +#: src/app/controllers/contacts.js:142 +#: src/app/controllers/contacts.js:186 +msgid "Contacts deleted" +msgstr "" + +#: src/app/controllers/contacts.js:415 +msgid "Contacts imported" +msgstr "" + +#: src/app/controllers/login.js:68 +msgctxt "Error" +msgid "" +"Cookies are disabled.\n" +"Please activate it and then reload the page.\n" +"More information here." +msgstr "" + +#: src/app/templates/modals/payment/payment.tpl.html:165 +#: src/app/templates/modals/payment/payment.tpl.html:42 +msgid "Coupon" +msgstr "" + +#: src/app/services/modal.js:866 +msgid "Coupon accepted" +msgstr "" + +#: src/app/templates/views/step1.tpl.html:72 +msgctxt "Action" +msgid "Create account" +msgstr "" + +#: src/app/controllers/settings/labels.js:60 +msgctxt "Title" +msgid "Create new label" +msgstr "" + +#: src/app/templates/views/payments.tpl.html:109 +msgctxt "Title" +msgid "Create time" +msgstr "" + +#: src/app/templates/views/step1.tpl.html:9 +msgctxt "Title" +msgid "Create your account" +msgstr "" + +#: src/app/templates/views/step1.tpl.html:176 +msgid "Creating account" +msgstr "" + +#: src/app/templates/views/reset-mailbox-password.tpl.html:56 +msgctxt "Title" +msgid "Creating new mailbox" +msgstr "" + +#: src/app/templates/views/step1.tpl.html:188 +msgid "Creating new user" +msgstr "" + +#: src/app/templates/modals/pay.tpl.html:16 +#: src/app/templates/views/dashboard.tpl.html:88 +msgctxt "Title" +msgid "Credit" +msgstr "" + +#. payment type badge +#: src/app/templates/modals/payment/payment.tpl.html:46 +#: src/app/templates/views/payments.tpl.html:126 +#: src/app/templates/views/payments.tpl.html:71 +msgid "Credit" +msgstr "" + +#: src/app/services/modal.js:600 +#: src/app/services/modal.js:605 +#: src/app/templates/modals/pay.tpl.html:30 +msgid "Credit card" +msgstr "" + +#: src/app/templates/views/dashboard.tpl.html:98 +msgctxt "Title" +msgid "Credit card" +msgstr "" + +#: src/app/templates/views/dashboard.tpl.html:126 +msgid "Currency" +msgstr "" + +#: src/app/templates/views/account.tpl.html:145 +#: src/app/templates/views/account.tpl.html:49 +msgid "Current login password" +msgstr "" + +#. form heading for current login password +#. form label for entering current login password +#: src/app/templates/views/account.tpl.html:142 +#: src/app/templates/views/account.tpl.html:46 +msgctxt "Title" +msgid "Current login password" +msgstr "" + +#: src/app/templates/views/account.tpl.html:156 +msgid "Current mailbox password" +msgstr "" + +#. form heading for current mailbox password +#: src/app/templates/views/account.tpl.html:153 +msgctxt "Title" +msgid "Current mailbox password" +msgstr "" + +#. current login password for heading for changing login password +#: src/app/templates/views/account.tpl.html:97 +msgctxt "Title" +msgid "Current password" +msgstr "" + +#: src/app/templates/views/account.tpl.html:100 +msgid "Current password" +msgstr "" + +#: src/app/templates/views/domains.tpl.html:28 +msgctxt "Title" +msgid "Current status" +msgstr "" + +#. form label +#: src/app/templates/modals/identity.tpl.html:18 +msgctxt "Title" +msgid "Custom" +msgstr "" + +#: src/app/templates/modals/payment/payment.tpl.html:20 +#: src/app/templates/views/dashboard.tpl.html:174 +msgid "Custom domain" +msgid_plural "Custom domains" +msgstr[0] "" +msgstr[1] "" + +#: src/app/templates/views/keys.tpl.html:101 +msgctxt "Title" +msgid "Custom domain addresses" +msgstr "" + +#: src/app/templates/views/domains.tpl.html:123 +msgid "Custom domain addresses" +msgstr "" + +#: src/app/templates/views/appearance.tpl.html:88 +msgctxt "Title" +msgid "Custom theme" +msgstr "" + +#: src/app/templates/views/appearance.tpl.html:90 +msgctxt "Info" +msgid "Custom themes from third-parties can potentially betray your privacy. Only use themes from trusted sources." +msgstr "" + +#: src/app/templates/views/payments.tpl.html:41 +msgctxt "Action" +msgid "Customize" +msgstr "" + +#: src/app/templates/modals/customizeInvoice.tpl.html:10 +msgctxt "Title" +msgid "Customize invoices" +msgstr "" + +#: src/app/templates/modals/card.tpl.html:47 +#: src/app/templates/modals/donate.tpl.html:63 +#: src/app/templates/modals/payment/payment.tpl.html:119 +msgid "CVC" +msgstr "" + +#: src/app/models/payments.js:286 +msgctxt "Error" +msgid "CVC invalid" +msgstr "" + +#. form heading for changing notification settings +#: src/app/templates/views/account.tpl.html:66 +msgctxt "Title" +msgid "Daily email notifications" +msgstr "" + +#. custom domain menu +#. custom domain menu select dropdown +#: src/app/templates/partials/menu.settings.tpl.html:29 +#: src/app/templates/partials/menu.settings.tpl.html:3 +msgctxt "Nav" +msgid "Dashboard" +msgstr "" + +#: src/app/controllers/secured.js:223 +#: src/app/controllers/secured.js:30 +#: src/app/controllers/secured.js:34 +msgctxt "Title" +msgid "Dashboard" +msgstr "" + +#. Table heading +#: src/app/templates/views/invoices.tpl.html:15 +#: src/app/templates/views/invoices.tpl.html:43 +msgctxt "Title" +msgid "Date" +msgstr "" + +#: src/app/templates/partials/toolbar-desktop.tpl.html:68 +#: src/app/templates/partials/toolbar-list-rows-responsive.tpl.html:110 +#: src/app/templates/partials/toolbar-list-rows.tpl.html:75 +msgctxt "Action" +msgid "Date: New to old" +msgstr "" + +#: src/app/templates/partials/toolbar-desktop.tpl.html:72 +#: src/app/templates/partials/toolbar-list-rows-responsive.tpl.html:114 +#: src/app/templates/partials/toolbar-list-rows.tpl.html:79 +msgctxt "Action" +msgid "Date: Old to new" +msgstr "" + +#: src/app/filters/filters.js:33 +#: src/app/templates/partials/composer.tpl.html:112 +msgid "Days" +msgstr "" + +#: src/app/templates/views/outside.unlock.tpl.html:22 +msgid "Decrypt" +msgstr "" + +#: src/app/templates/views/unlock.tpl.html:8 +msgctxt "Title" +msgid "Decrypt mailbox" +msgstr "" + +#: src/app/templates/views/outside.unlock.tpl.html:7 +msgctxt "Title" +msgid "Decrypt message" +msgstr "" + +#: src/app/templates/views/outside.unlock.tpl.html:23 +#: src/app/templates/views/unlock.tpl.html:27 +msgid "Decrypting" +msgstr "" + +#: src/app/templates/partials/message.tpl.html:248 +#: src/app/templates/views/outside.reply.tpl.html:28 +msgctxt "Error" +msgid "Decryption error" +msgstr "" + +#: src/app/templates/partials/message.tpl.html:249 +#: src/app/templates/views/outside.reply.tpl.html:29 +msgctxt "Error" +msgid "Decryption of this message's encryption content failed." +msgstr "" + +#: src/app/templates/views/addresses.tpl.html:29 +#: src/app/templates/views/members.tpl.html:95 +#: src/app/templates/views/payments.tpl.html:27 +msgid "Default" +msgstr "" + +#. form label +#: src/app/templates/modals/identity.tpl.html:13 +msgctxt "Title" +msgid "Default" +msgstr "" + +#. Account page heading +#: src/app/templates/views/account.tpl.html:10 +msgid "Default identity" +msgstr "" + +#: src/app/controllers/contacts.js:162 +#: src/app/controllers/contacts.js:165 +msgctxt "Title" +msgid "Delete" +msgstr "" + +#. contacts toolbar menu option +#: src/app/templates/modals/deleteAccount.tpl.html:25 +#: src/app/templates/partials/message.tpl.html:193 +#: src/app/templates/partials/toolbar-contacts.tpl.html:20 +#: src/app/templates/partials/toolbar-desktop.tpl.html:23 +#: src/app/templates/partials/toolbar-list-rows-responsive.tpl.html:25 +#: src/app/templates/partials/toolbar-list-rows-responsive.tpl.html:76 +#: src/app/templates/partials/toolbar-list-rows.tpl.html:38 +#: src/app/templates/partials/toolbar-mobile.tpl.html:54 +#: src/app/templates/views/addresses.tpl.html:58 +#: src/app/templates/views/contacts.tpl.html:53 +#: src/app/templates/views/domains.tpl.html:95 +#: src/app/templates/views/labels.tpl.html:17 +#: src/app/templates/views/payments.tpl.html:32 +msgctxt "Action" +msgid "Delete" +msgstr "" + +#: src/app/templates/modals/deleteAccount.tpl.html:6 +#: src/app/templates/views/account.tpl.html:262 +msgctxt "Title" +msgid "Delete account" +msgstr "" + +#: src/app/controllers/settings/addresses.js:168 +#: src/app/controllers/settings/domains.js:244 +msgctxt "Title" +msgid "Delete address" +msgstr "" + +#: src/app/controllers/contacts.js:132 +msgctxt "Title" +msgid "Delete all" +msgstr "" + +#. contacts toolbar menu option +#: src/app/templates/partials/toolbar-contacts.tpl.html:7 +msgctxt "Action" +msgid "Delete all" +msgstr "" + +#: src/app/templates/modals/domain/mx.tpl.html:49 +msgctxt "Info" +msgid "Delete any other MX records or make sure ProtonMail's Priority is the lowest number." +msgstr "" + +#: src/app/controllers/settings/domains.js:170 +msgctxt "Title" +msgid "Delete domain" +msgstr "" + +#: src/app/templates/partials/composer.tpl.html:236 +msgid "Delete draft" +msgstr "" + +#: src/app/controllers/settings/labels.js:133 +msgctxt "Title" +msgid "Delete label" +msgstr "" + +#: src/app/controllers/settings/payments.js:96 +msgctxt "Title" +msgid "Delete payment method" +msgstr "" + +#: src/app/templates/views/account.tpl.html:263 +msgctxt "Action" +msgid "Delete your account" +msgstr "" + +#: src/app/templates/partials/conversation-placeholder.tpl.html:44 +msgctxt "Action" +msgid "Deselect all" +msgstr "" + +#. logging page +#: src/app/controllers/settings/security.js:119 +#: src/app/controllers/settings/security.js:20 +#: src/app/templates/views/addresses.tpl.html:33 +#: src/app/templates/views/addresses.tpl.html:57 +msgctxt "Action" +msgid "Disable" +msgstr "" + +#: src/app/controllers/settings/addresses.js:97 +#: src/app/controllers/settings/domains.js:293 +msgid "Disable address" +msgstr "" + +#. address state badge +#. form option +#: src/app/controllers/settings/security.js:105 +#: src/app/templates/views/account.tpl.html:221 +#: src/app/templates/views/addresses.tpl.html:49 +#: src/app/templates/views/domains.tpl.html:147 +#: src/app/templates/views/keys.tpl.html:16 +msgid "Disabled" +msgstr "" + +#. notification settings option +#: src/app/templates/views/account.tpl.html:76 +#: src/app/templates/views/keys.tpl.html:63 +msgctxt "Action" +msgid "Disabled" +msgstr "" + +#: src/app/templates/partials/composer.tpl.html:238 +msgctxt "Action" +msgid "Discard" +msgstr "" + +#. displays invoice details as a PDF in new tab +#: src/app/templates/views/invoices.tpl.html:33 +#: src/app/templates/views/invoices.tpl.html:61 +msgctxt "Action" +msgid "Display invoice" +msgstr "" + +#. display name heading on account page +#: src/app/templates/modals/identity.tpl.html:24 +#: src/app/templates/modals/identity.tpl.html:38 +#: src/app/templates/views/account.tpl.html:15 +msgctxt "Title" +msgid "Display name" +msgstr "" + +#: src/app/templates/modals/welcome.tpl.html:21 +msgid "Display name" +msgstr "" + +#: src/app/templates/modals/domain/menu.tpl.html:36 +msgctxt "Nav" +msgid "DKIM" +msgstr "" + +#: src/app/templates/modals/domain/dkim.tpl.html:11 +msgctxt "Title" +msgid "DKIM" +msgstr "" + +#: src/app/templates/modals/domain/menu.tpl.html:42 +msgctxt "Nav" +msgid "DMARC" +msgstr "" + +#: src/app/templates/modals/domain/domain.tpl.html:8 +#: src/app/templates/views/domains.tpl.html:27 +msgctxt "Title" +msgid "Domain" +msgstr "" + +#: src/app/templates/modals/domain/menu.tpl.html:6 +msgctxt "Nav" +msgid "Domain" +msgstr "" + +#: src/app/controllers/settings/domains.js:328 +msgid "Domain created" +msgstr "" + +#: src/app/controllers/settings/domains.js:175 +msgid "Domain deleted" +msgstr "" + +#: src/app/templates/modals/domain/domain.tpl.html:12 +msgid "Domain name" +msgstr "" + +#: src/app/services/modal.js:1062 +msgctxt "Error" +msgid "Domain not found" +msgstr "" + +#: src/app/controllers/settings/domains.js:390 +msgid "Domain verified" +msgstr "" + +#. invoice heading +#: src/app/controllers/secured.js:238 +#: src/app/controllers/secured.js:36 +#: src/app/templates/views/dashboard.tpl.html:19 +#: src/app/templates/views/dashboard.tpl.html:73 +#: src/app/templates/views/domains.tpl.html:17 +#: src/app/templates/views/invoice.print.tpl.html:61 +msgctxt "Title" +msgid "Domains" +msgstr "" + +#. custom domain menu +#: src/app/templates/partials/menu.settings.tpl.html:18 +msgctxt "Nav" +msgid "Domains" +msgstr "" + +#: src/app/templates/modals/donate.tpl.html:6 +#: src/app/templates/views/dashboard.tpl.html:108 +msgctxt "Title" +msgid "Donate" +msgstr "" + +#: src/app/templates/modals/donate.tpl.html:72 +#: src/app/templates/modals/monetize.tpl.html:27 +#: src/app/templates/views/dashboard.tpl.html:113 +msgctxt "Action" +msgid "Donate" +msgstr "" + +#: src/app/templates/modals/monetize.tpl.html:11 +msgctxt "Title" +msgid "Donate to ProtonMail" +msgstr "" + +#. payment type badge +#: src/app/templates/views/payments.tpl.html:127 +#: src/app/templates/views/payments.tpl.html:74 +msgid "Donation" +msgstr "" + +#. key generation progrss +#: src/app/templates/modals/generate.tpl.html:38 +#: src/app/templates/views/step1.tpl.html:204 +msgid "Done" +msgstr "" + +#: src/app/controllers/settings/dashboard.js:266 +msgctxt "Action" +msgid "Downgrade to Free" +msgstr "" + +#: src/app/controllers/settings/dashboard.js:274 +msgctxt "Action" +msgid "Downgrade to Plus" +msgstr "" + +#: src/app/templates/partials/attachments.tpl.html:10 +msgid "Download" +msgstr "" + +#. contacts toolbar menu option +#: src/app/templates/partials/toolbar-contacts.tpl.html:10 +#: src/app/templates/views/payments.tpl.html:138 +#: src/app/templates/views/payments.tpl.html:95 +#: src/app/templates/views/security.tpl.html:10 +msgctxt "Action" +msgid "Download" +msgstr "" + +#. table heading +#: src/app/controllers/contacts.js:444 +#: src/app/controllers/message.js:280 +#: src/app/templates/views/keys.tpl.html:120 +#: src/app/templates/views/keys.tpl.html:25 +#: src/app/templates/views/keys.tpl.html:72 +msgctxt "Title" +msgid "Download" +msgstr "" + +#: src/app/templates/views/keys.tpl.html:6 +msgctxt "Info" +msgid "Download your PGP Keys for use with other PGP compatible services. Only incoming messages in inline OpenPGP format are currently supported." +msgstr "" + +#: src/app/templates/partials/safari.attachment.warning.tpl.html:9 +#: src/app/templates/partials/safari.warning.tpl.html:9 +msgctxt "Title" +msgid "Downloading" +msgstr "" + +#. location tag +#: src/app/templates/directives/location-tag.tpl.html:3 +#: src/app/templates/partials/message.tpl.html:135 +#: src/app/templates/partials/message.tpl.html:40 +msgid "Draft" +msgstr "" + +#. Folder name +#: src/app/templates/partials/sidebar-responsive.tpl.html:23 +#: src/app/templates/partials/sidebar.tpl.html:21 +msgctxt "Nav" +msgid "Drafts" +msgstr "" + +#. no results heading +#: src/app/controllers/secured.js:193 +#: src/app/templates/partials/no-results.tpl.html:16 +msgctxt "Title" +msgid "Drafts" +msgstr "" + +#: src/app/controllers/compose.js:305 +msgctxt "Info" +msgid "Drop a file here to upload" +msgstr "" + +#: src/app/controllers/contacts.js:238 +#: src/app/templates/views/contacts.tpl.html:52 +#: src/app/templates/views/labels.tpl.html:16 +#: src/app/templates/views/payments.tpl.html:31 +msgctxt "Action" +msgid "Edit" +msgstr "" + +#: src/app/controllers/settings/addresses.js:127 +msgctxt "Title" +msgid "Edit address" +msgstr "" + +#: src/app/templates/views/addresses.tpl.html:32 +msgctxt "Action" +msgid "Edit identity" +msgstr "" + +#: src/app/controllers/settings/labels.js:91 +msgctxt "Title" +msgid "Edit label" +msgstr "" + +#: src/app/templates/modals/contact.tpl.html:20 +#: src/app/templates/views/step1.tpl.html:87 +msgctxt "Title" +msgid "Email" +msgstr "" + +#. table heading / link to sort table +#: src/app/templates/views/contacts.tpl.html:27 +msgctxt "Action" +msgid "Email" +msgstr "" + +#: src/app/templates/modals/bug.tpl.html:50 +msgctxt "Title" +msgid "Email address" +msgstr "" + +#: src/app/templates/views/step1.tpl.html:30 +msgctxt "Error" +msgid "Email already taken" +msgstr "" + +#: src/app/templates/views/step1.tpl.html:31 +msgid "Email available" +msgstr "" + +#: src/app/templates/views/account.tpl.html:232 +msgctxt "Title" +msgid "Email images" +msgstr "" + +#: src/app/templates/modals/loginHelp.tpl.html:19 +msgctxt "Action" +msgid "Email our aupport team" +msgstr "" + +#: src/app/templates/views/step1.tpl.html:105 +msgctxt "Title" +msgid "Email verification" +msgstr "" + +#: src/app/templates/views/step1.tpl.html:108 +msgid "Email verification" +msgstr "" + +#: src/app/templates/partials/toolbar-desktop.tpl.html:48 +#: src/app/templates/partials/toolbar-list-rows-responsive.tpl.html:90 +#: src/app/templates/partials/toolbar-list-rows.tpl.html:55 +msgctxt "Action" +msgid "Empty drafts" +msgstr "" + +#: src/app/templates/partials/toolbar-desktop.tpl.html:52 +#: src/app/templates/partials/toolbar-list-rows-responsive.tpl.html:94 +#: src/app/templates/partials/toolbar-list-rows.tpl.html:59 +msgctxt "Action" +msgid "Empty spam" +msgstr "" + +#: src/app/templates/partials/toolbar-desktop.tpl.html:56 +#: src/app/templates/partials/toolbar-list-rows-responsive.tpl.html:98 +#: src/app/templates/partials/toolbar-list-rows.tpl.html:63 +msgctxt "Action" +msgid "Empty trash" +msgstr "" + +#: src/app/templates/views/addresses.tpl.html:56 +#: src/app/templates/views/keys.tpl.html:142 +#: src/app/templates/views/keys.tpl.html:46 +#: src/app/templates/views/keys.tpl.html:93 +msgctxt "Action" +msgid "Enable" +msgstr "" + +#. notification settings option +#: src/app/templates/views/account.tpl.html:71 +#: src/app/templates/views/keys.tpl.html:62 +msgctxt "Action" +msgid "Enabled" +msgstr "" + +#. form option +#: src/app/templates/views/account.tpl.html:215 +#: src/app/templates/views/addresses.tpl.html:28 +#: src/app/templates/views/domains.tpl.html:146 +#: src/app/templates/views/keys.tpl.html:15 +msgid "Enabled" +msgstr "" + +#: src/app/templates/partials/composer.tpl.html:49 +msgctxt "Title" +msgid "Encrypt for non-ProtonMail users" +msgstr "" + +#: src/app/templates/partials/composer.tpl.html:83 +msgctxt "Info" +msgid "Encrypted messages to non-ProtonMail recipients will expire in 28 days unless a shorter expiration time is set." +msgstr "" + +#: src/app/templates/partials/composer.tpl.html:248 +msgctxt "Action" +msgid "Encrypting" +msgstr "" + +#: src/app/templates/partials/composer.tpl.html:206 +msgid "Encryption" +msgstr "" + +#: src/app/templates/partials/composer.tpl.html:218 +msgctxt "Title" +msgid "Encryption" +msgstr "" + +#: src/app/templates/partials/searchForm.tpl.html:48 +msgctxt "Title" +msgid "End date" +msgstr "" + +#: src/app/models/message.js:137 +msgid "End to end encrypted for outside" +msgstr "" + +#: src/app/models/message.js:140 +msgid "End to end encrypted for outside reply" +msgstr "" + +#: src/app/models/message.js:135 +msgid "End to end encrypted internal message" +msgstr "" + +#: src/app/models/message.js:141 +msgid "End to end encrypted using PGP" +msgstr "" + +#: src/app/models/message.js:142 +msgid "End to end encrypted using PGP/MIME" +msgstr "" + +#: src/app/controllers/settings/appearance.js:17 +msgid "English" +msgstr "" + +#: src/app/templates/views/members.tpl.html:112 +msgid "Enter mailbox" +msgstr "" + +#: src/app/templates/views/members.tpl.html:113 +msgctxt "Action" +msgid "Enter mailbox" +msgstr "" + +#: src/app/templates/modals/reactivate.tpl.html:11 +msgid "Enter the key password:" +msgstr "" + +#: src/app/templates/views/reset-mailbox-password.tpl.html:9 +msgid "Enter the word 'DANGER' here." +msgstr "" + +#: src/app/templates/modals/deleteAccount.tpl.html:19 +msgctxt "Title" +msgid "Enter your login password to confirm your identity:" +msgstr "" + +#: src/app/templates/modals/loginPassword.tpl.html:9 +#: src/app/templates/modals/reactivate.tpl.html:9 +msgid "Enter your login password:" +msgstr "" + +#. key generation progrss +#: src/app/templates/modals/generate.tpl.html:40 +msgctxt "Error" +msgid "Error" +msgstr "" + +#: src/app/templates/views/outside.unlock.tpl.html:30 +msgctxt "Title" +msgid "Error" +msgstr "" + +#: src/app/templates/modals/payment/payment.tpl.html:131 +msgctxt "Error" +msgid "Error connecting to PayPal." +msgstr "" + +#: src/app/controllers/settings/domains.js:337 +#: src/app/controllers/settings/domains.js:340 +msgctxt "Error" +msgid "Error during creation" +msgstr "" + +#: src/app/controllers/settings/addresses.js:179 +#: src/app/controllers/settings/addresses.js:182 +#: src/app/controllers/settings/domains.js:182 +#: src/app/controllers/settings/domains.js:185 +#: src/app/controllers/settings/domains.js:256 +#: src/app/controllers/settings/domains.js:259 +#: src/app/controllers/settings/members.js:238 +#: src/app/controllers/settings/members.js:241 +msgctxt "Error" +msgid "Error during deletion" +msgstr "" + +#: src/app/controllers/settings/addresses.js:108 +#: src/app/controllers/settings/addresses.js:111 +#: src/app/controllers/settings/domains.js:304 +#: src/app/controllers/settings/domains.js:307 +msgctxt "Error" +msgid "Error during disable request" +msgstr "" + +#: src/app/controllers/settings/addresses.js:84 +#: src/app/controllers/settings/addresses.js:87 +#: src/app/controllers/settings/domains.js:280 +#: src/app/controllers/settings/domains.js:283 +msgctxt "Error" +msgid "Error during enable request" +msgstr "" + +#: src/app/controllers/settings/labels.js:115 +#: src/app/controllers/settings/labels.js:152 +#: src/app/controllers/settings/labels.js:156 +#: src/app/controllers/settings/labels.js:181 +#: src/app/controllers/settings/labels.js:185 +#: src/app/controllers/settings/labels.js:206 +#: src/app/controllers/settings/labels.js:210 +msgctxt "Error" +msgid "Error during label request" +msgstr "" + +#: src/app/controllers/settings/dashboard.js:332 +#: src/app/services/modal.js:692 +#: src/app/services/modal.js:695 +msgctxt "Error" +msgid "Error during organization request" +msgstr "" + +#: src/app/controllers/conversations.js:330 +msgctxt "Error" +msgid "Error during quering conversations" +msgstr "" + +#: src/app/controllers/message.js:207 +msgctxt "Error" +msgid "Error during the decryption of the message" +msgstr "" + +#: src/app/controllers/outside.js:154 +msgctxt "Error" +msgid "Error during the encryption" +msgstr "" + +#: src/app/controllers/message.js:211 +msgctxt "Error" +msgid "Error during the getting message" +msgstr "" + +#: src/app/controllers/settings/security.js:37 +msgctxt "Error" +msgid "Error during the initialization of logs" +msgstr "" + +#: src/app/controllers/outside.js:148 +msgctxt "Error" +msgid "Error during the reply process" +msgstr "" + +#: src/app/controllers/settings/addresses.js:145 +#: src/app/controllers/settings/addresses.js:148 +#: src/app/controllers/settings/members.js:135 +#: src/app/controllers/settings/members.js:138 +#: src/app/controllers/settings/members.js:156 +#: src/app/controllers/settings/members.js:159 +msgctxt "Error" +msgid "Error during updating" +msgstr "" + +#: src/app/controllers/settings/dashboard.js:349 +msgctxt "Error" +msgid "Error processing payment." +msgstr "" + +#: src/app/services/modal.js:1571 +msgctxt "Error" +msgid "Error while processing donation." +msgstr "" + +#. Table heading +#: src/app/templates/views/invoices.tpl.html:16 +#: src/app/templates/views/invoices.tpl.html:44 +#: src/app/templates/views/security.tpl.html:33 +msgctxt "Title" +msgid "Event" +msgstr "" + +#: src/app/templates/modals/user/member.tpl.html:11 +msgid "ex: Thomas Anderson" +msgstr "" + +#: src/app/templates/partials/composer.tpl.html:37 +msgctxt "Action" +msgid "Exit fullscreen" +msgstr "" + +#: src/app/templates/partials/composer.tpl.html:31 +msgctxt "Action" +msgid "Expand" +msgstr "" + +#: src/app/templates/views/payments.tpl.html:16 +msgctxt "Title" +msgid "Expiration" +msgstr "" + +#: src/app/templates/partials/composer.tpl.html:232 +msgctxt "Action" +msgid "Expiration" +msgstr "" + +#: src/app/models/payments.js:275 +msgctxt "Error" +msgid "Expiration date invalid" +msgstr "" + +#: src/app/templates/partials/composer.tpl.html:95 +msgctxt "Title" +msgid "Expiration time" +msgstr "" + +#: src/app/templates/partials/composer.tpl.html:220 +msgctxt "Action" +msgid "Expiration time" +msgstr "" + +#: src/app/templates/views/outside.message.tpl.html:3 +msgid "Expiring in" +msgstr "" + +#: src/app/models/message.js:136 +#: src/app/models/message.js:138 +msgid "External message stored encrypted" +msgstr "" + +#: src/app/templates/modals/deleteAccount.tpl.html:16 +msgid "Feedback" +msgstr "" + +#: src/app/templates/modals/feedback.tpl.html:6 +msgctxt "Title" +msgid "Feedback form" +msgstr "" + +#: src/app/templates/views/account.tpl.html:102 +#: src/app/templates/views/account.tpl.html:113 +#: src/app/templates/views/account.tpl.html:124 +#: src/app/templates/views/account.tpl.html:147 +#: src/app/templates/views/account.tpl.html:158 +msgctxt "Error" +msgid "Field required" +msgstr "" + +#: src/app/templates/directives/move.tpl.html:2 +msgid "Filter" +msgstr "" + +#: src/app/templates/directives/labels.tpl.html:6 +msgid "Filter labels" +msgstr "" + +#. table heading +#: src/app/templates/views/keys.tpl.html:118 +#: src/app/templates/views/keys.tpl.html:23 +#: src/app/templates/views/keys.tpl.html:70 +msgctxt "Title" +msgid "Fingerprint" +msgstr "" + +#: src/app/templates/modals/domain/dmarc.tpl.html:46 +#: src/app/templates/partials/wizard.tpl.html:41 +#: src/app/templates/views/reset-mailbox-password.tpl.html:45 +msgctxt "Action" +msgid "Finish" +msgstr "" + +#: src/app/controllers/conversations.js:918 +msgid "Folder emptied" +msgstr "" + +#: src/app/templates/modals/support.tpl.html:9 +msgid "For a custom solution, contact our knowledgable entrprise sales team for a quote." +msgstr "" + +#: src/app/templates/partials/safari.attachment.warning.tpl.html:21 +#: src/app/templates/partials/safari.warning.tpl.html:21 +msgctxt "Info" +msgid "For more help please contact us directly: support@protonmail.com" +msgstr "" + +#: src/app/templates/modals/domain/verification.tpl.html:14 +msgctxt "Info" +msgid "For security reasons, we need to verify that you are the owner of your domain. Please add the following code into your DNS. Do not remove it even after successful verification. This can typically be done in the control panel of your domain name registrar." +msgstr "" + +#. link to reset mailbox +#: src/app/templates/views/unlock.tpl.html:18 +msgctxt "Action" +msgid "Forgot password?" +msgstr "" + +#: src/app/templates/modals/loginHelp.tpl.html:13 +msgctxt "Action" +msgid "Forgot username?" +msgstr "" + +#: src/app/templates/partials/message.tpl.html:168 +msgctxt "Action" +msgid "Forward" +msgstr "" + +#: src/app/templates/views/dashboard.tpl.html:205 +msgid "Free" +msgstr "" + +#: src/app/templates/partials/composer.tpl.html:127 +msgctxt "Title" +msgid "From" +msgstr "" + +#. message metadata +#. printed message info +#: src/app/templates/partials/message.tpl.html:28 +#: src/app/templates/partials/searchForm.tpl.html:32 +#: src/app/templates/views/message.print.tpl.html:27 +#: src/app/templates/views/outside.message.tpl.html:23 +#: src/app/templates/views/outside.reply.tpl.html:14 +msgid "From" +msgstr "" + +#: src/app/templates/partials/composer.tpl.html:34 +msgctxt "Action" +msgid "Fullscreen" +msgstr "" + +#: src/app/controllers/message.js:686 +msgid "Fw:" +msgstr "" + +#: src/app/controllers/settings/addresses.js:199 +#: src/app/controllers/settings/domains.js:223 +msgid "Generate key pair" +msgstr "" + +#: src/app/templates/modals/generate.tpl.html:55 +#: src/app/templates/views/members.tpl.html:107 +#: src/app/templates/views/members.tpl.html:108 +msgctxt "Action" +msgid "Generate keys" +msgstr "" + +#: src/app/templates/views/addresses.tpl.html:54 +msgctxt "Action" +msgid "Generate missing keys" +msgstr "" + +#: src/app/templates/views/keys.tpl.html:12 +msgid "Generate new key pair" +msgstr "" + +#. link to generate new keys +#: src/app/templates/views/keys.tpl.html:107 +#: src/app/templates/views/keys.tpl.html:59 +msgctxt "Action" +msgid "Generate new key pair" +msgstr "" + +#: src/app/templates/modals/generate.tpl.html:24 +msgctxt "Info" +msgid "Generating 4096-bit encryption keys may crash or freeze your browser. 4096-bit keys are only recommended for high performance computers - not recommended for tablet and mobile devices." +msgstr "" + +#: src/app/templates/views/step1.tpl.html:184 +msgid "Generating keys" +msgstr "" + +#: src/app/templates/views/step1.tpl.html:168 +msgid "Generating keys..." +msgstr "" + +#: src/app/templates/views/reset-mailbox-password.tpl.html:63 +msgid "Generating new key pair" +msgstr "" + +#. MX status badge +#. SPF status badge +#. Verification status badge +#: src/app/templates/modals/domain/mx.tpl.html:9 +#: src/app/templates/modals/domain/spf.tpl.html:9 +#: src/app/templates/modals/domain/verification.tpl.html:9 +msgid "Good" +msgstr "" + +#. link for v2 +#: src/app/templates/views/login.tpl.html:31 +msgctxt "Action" +msgid "Having trouble? Use the old version (v2)" +msgstr "" + +#: src/app/templates/modals/loginHelp.tpl.html:6 +msgctxt "Title" +msgid "Help" +msgstr "" + +#: src/app/templates/partials/header-auth-desktop.tpl.html:79 +msgctxt "Action" +msgid "Help & answers" +msgstr "" + +#: src/app/templates/partials/wizard.tpl.html:33 +msgctxt "Title" +msgid "Help and support" +msgstr "" + +#: src/app/templates/modals/monetize.tpl.html:6 +msgctxt "Title" +msgid "Help us protect online privacy" +msgstr "" + +#: src/app/templates/modals/domain/dmarc.tpl.html:13 +msgctxt "Info" +msgid "Here is a basic DMARC record that does nothing except email you reports." +msgstr "" + +#: src/app/templates/partials/composer.tpl.html:189 +msgctxt "Action" +msgid "Hide" +msgstr "" + +#: src/app/templates/partials/message.tpl.html:223 +msgctxt "Action" +msgid "Hide details" +msgstr "" + +#. form option heading +#: src/app/templates/modals/generate.tpl.html:14 +msgctxt "Title" +msgid "High security" +msgstr "" + +#. feature for upgrading from a free account to a paid account +#: src/app/templates/modals/monetize.tpl.html:37 +msgid "Higher message sending limits" +msgstr "" + +#. form option heading +#: src/app/templates/modals/generate.tpl.html:20 +msgctxt "Title" +msgid "Highest security" +msgstr "" + +#: src/app/templates/partials/composer.tpl.html:78 +msgid "Hint" +msgstr "" + +#: src/app/templates/modals/domain/dkim.tpl.html:20 +#: src/app/templates/modals/domain/dkim.tpl.html:36 +#: src/app/templates/modals/domain/dmarc.tpl.html:17 +#: src/app/templates/modals/domain/dmarc.tpl.html:33 +#: src/app/templates/modals/domain/mx.tpl.html:19 +#: src/app/templates/modals/domain/mx.tpl.html:37 +#: src/app/templates/modals/domain/spf.tpl.html:19 +#: src/app/templates/modals/domain/spf.tpl.html:35 +#: src/app/templates/modals/domain/verification.tpl.html:20 +#: src/app/templates/modals/domain/verification.tpl.html:36 +msgctxt "Title" +msgid "Host name" +msgstr "" + +#: src/app/filters/filters.js:33 +#: src/app/templates/partials/composer.tpl.html:117 +msgid "Hours" +msgstr "" + +#. link to learn more +#. link to learn more about changing your mailbox password +#: src/app/templates/views/account.tpl.html:194 +#: src/app/templates/views/account.tpl.html:250 +#: src/app/templates/views/account.tpl.html:80 +msgctxt "Action" +msgid "How does this work?" +msgstr "" + +#: src/app/templates/partials/header-auth-desktop.tpl.html:52 +msgctxt "Action" +msgid "I have a question" +msgstr "" + +#: src/app/templates/views/payments.tpl.html:105 +msgctxt "Title" +msgid "ID" +msgstr "" + +#: src/app/templates/modals/identity.tpl.html:6 +msgctxt "Title" +msgid "Identity" +msgstr "" + +#: src/app/templates/views/addresses.tpl.html:55 +msgctxt "Action" +msgid "Identity" +msgstr "" + +#: src/app/templates/modals/domain/mx.tpl.html:50 +msgctxt "Info" +msgid "If this domain is currently actively receiving emails, create all used email addresses in Step 3 before changing MX record to ensure a smooth transition." +msgstr "" + +#. reset warning 1/3 +#: src/app/templates/views/reset-mailbox-password.tpl.html:5 +msgctxt "Info" +msgid "If you forget your mailbox password, you can reset your account but..." +msgstr "" + +#: src/app/templates/partials/wizard.tpl.html:35 +msgctxt "Info" +msgid "If you have questions or need help, please visit our support page to find troubleshooting guides and contact our support team. If you find a bug in ProtonMail, please let us know! You can send us a bug report by clicking Report bugs (1)" +msgstr "" + +#: src/app/templates/modals/domain/dmarc.tpl.html:12 +msgctxt "Info" +msgid "If you have set both SPF and DKIM, DMARC allows you to specify how other email services should deliver email for your domain if both SPF and DKIM checks have failed. This can make it harder for spammers pretending to be you but may also cause delivery issues if not done properly. Feel free to ignore and skip DMARC unless you really want strict policies such as p=quarantine or p=reject. Learn more" +msgstr "" + +#: src/app/templates/views/step1.tpl.html:58 +msgctxt "Info" +msgid "If you lose your mailbox password, you won't be able to read your emails, we cannot recover this password for you." +msgstr "" + +#: src/app/templates/modals/domain/spf.tpl.html:43 +msgctxt "Info" +msgid "If you want to keep an existing SPF record, you can just add include:_spf.protonmail.ch to it after the v=spf1. Do not create multiple SPF records." +msgstr "" + +#: src/app/templates/modals/deleteAccount.tpl.html:11 +msgctxt "Info" +msgid "If you wish to delete in order to combine this account with another one, do NOT delete your account. You need to instead follow the procedure here." +msgstr "" + +#. message label +#: src/app/templates/partials/message.tpl.html:132 +#: src/app/templates/partials/message.tpl.html:37 +msgid "In archive" +msgstr "" + +#. message label +#: src/app/templates/partials/message.tpl.html:134 +#: src/app/templates/partials/message.tpl.html:39 +msgid "In spam" +msgstr "" + +#. message label +#: src/app/templates/partials/message.tpl.html:133 +#: src/app/templates/partials/message.tpl.html:38 +msgid "In trash" +msgstr "" + +#: src/app/templates/views/addresses.tpl.html:41 +msgctxt "Title" +msgid "Inactive addresses" +msgstr "" + +#. location tag +#: src/app/directives/move.js:21 +#: src/app/templates/directives/location-tag.tpl.html:2 +msgid "Inbox" +msgstr "" + +#. no results heading +#: src/app/controllers/secured.js:190 +#: src/app/templates/partials/no-results.tpl.html:15 +msgctxt "Title" +msgid "Inbox" +msgstr "" + +#. Folder name +#: src/app/templates/partials/sidebar-responsive.tpl.html:16 +#: src/app/templates/partials/sidebar.tpl.html:13 +msgctxt "Nav" +msgid "Inbox" +msgstr "" + +#: src/app/templates/directives/squire.tpl.html:53 +#: src/app/templates/directives/squire.tpl.html:75 +msgctxt "Action" +msgid "Insert image" +msgstr "" + +#: src/app/templates/directives/squire.tpl.html:48 +msgctxt "Action" +msgid "Insert link" +msgstr "" + +#: src/app/templates/directives/squire.tpl.html:66 +msgid "Insert link" +msgstr "" + +#: src/app/services/modal.js:863 +msgctxt "Error" +msgid "Invalid coupon" +msgstr "" + +#: src/app/templates/views/account.tpl.html:84 +#: src/app/templates/views/reset-login-password.tpl.html:9 +msgctxt "Error" +msgid "Invalid email." +msgstr "" + +#: src/app/controllers/contacts.js:390 +msgctxt "Error" +msgid "Invalid file type" +msgstr "" + +#: src/app/templates/views/step1.tpl.html:67 +msgctxt "Error" +msgid "Invalid recovery email." +msgstr "" + +#: src/app/controllers/secured.js:244 +#: src/app/controllers/settings/invoices.js:16 +#: src/app/templates/views/payments.tpl.html:39 +msgctxt "Title" +msgid "Invoices" +msgstr "" + +#. select dropdown options +#: src/app/templates/modals/bug.tpl.html:18 +msgid "iOS" +msgstr "" + +#: src/app/templates/views/security.tpl.html:34 +msgctxt "Title" +msgid "IP" +msgstr "" + +#: src/app/templates/modals/domain/verification.tpl.html:45 +msgctxt "Info" +msgid "It can take up to a day for DNS changes to update." +msgstr "" + +#: src/app/templates/modals/donate.tpl.html:68 +msgctxt "Info" +msgid "It's also possible to donate with PayPal or Bitcoin." +msgstr "" + +#: src/app/templates/directives/squire.tpl.html:10 +msgctxt "Action" +msgid "Italic" +msgstr "" + +#: src/app/templates/views/reset-mailbox-password.tpl.html:44 +msgctxt "Info" +msgid "Keep this password safe - it cannot be recovered." +msgstr "" + +#: src/app/templates/modals/domain/dkim.tpl.html:45 +msgctxt "Info" +msgid "Keep this record in your DNS for as long as you want to use DKIM. You can change its Value to off to disable DKIM" +msgstr "" + +#: src/app/templates/modals/reactivate.tpl.html:12 +msgid "Key password" +msgstr "" + +#. table heading +#: src/app/templates/views/keys.tpl.html:119 +#: src/app/templates/views/keys.tpl.html:24 +#: src/app/templates/views/keys.tpl.html:71 +msgctxt "Title" +msgid "Key size" +msgstr "" + +#: src/app/templates/partials/searchForm.tpl.html:19 +msgid "Keywords" +msgstr "" + +#: src/app/templates/partials/searchForm.tpl.html:18 +msgctxt "Title" +msgid "Keywords" +msgstr "" + +#. no results heading +#: src/app/controllers/secured.js:216 +#: src/app/templates/partials/no-results.tpl.html:23 +msgctxt "Title" +msgid "Label" +msgstr "" + +#: src/app/controllers/settings/labels.js:71 +msgid "Label created" +msgstr "" + +#: src/app/controllers/settings/labels.js:145 +msgid "Label deleted" +msgstr "" + +#: src/app/controllers/settings/labels.js:107 +#: src/app/controllers/settings/labels.js:201 +msgid "Label edited" +msgstr "" + +#: src/app/templates/modals/label.tpl.html:14 +msgid "Label name" +msgstr "" + +#: src/app/controllers/settings/labels.js:176 +msgid "Label order saved" +msgstr "" + +#: src/app/templates/partials/sidebar.tpl.html:71 +msgctxt "Action" +msgid "Label settings" +msgstr "" + +#: src/app/models/payments.js:91 +#: src/app/models/payments.js:98 +#: src/app/templates/partials/menu.settings.tpl.html:31 +#: src/app/templates/partials/toolbar-desktop.tpl.html:31 +#: src/app/templates/partials/toolbar-list-rows.tpl.html:42 +#: src/app/templates/partials/toolbar-mobile.tpl.html:64 +msgid "Labels" +msgstr "" + +#: src/app/controllers/secured.js:229 +#: src/app/controllers/secured.js:32 +msgctxt "Title" +msgid "Labels" +msgstr "" + +#. custom domain menu +#: src/app/templates/partials/menu.settings.tpl.html:9 +msgctxt "Nav" +msgid "Labels" +msgstr "" + +#: src/app/templates/partials/wizard.tpl.html:27 +msgctxt "Info" +msgid "Labels are a powerful tool to manage your inbox. You can add and remove labels from selected emails by clicking the Label button (1). You can also add, delete, and edit labels by clicking on Label settings (2)." +msgstr "" + +#: src/app/services/actions.js:109 +#: src/app/services/actions.js:552 +msgid "Labels saved" +msgstr "" + +#: src/app/templates/views/appearance.tpl.html:30 +msgctxt "Title" +msgid "Layout" +msgstr "" + +#: src/app/controllers/conversations.js:632 +#: src/app/controllers/settings/appearance.js:97 +msgid "Layout saved" +msgstr "" + +#. learn more link +#: src/app/templates/modals/domain/dkim.tpl.html:16 +#: src/app/templates/modals/domain/dmarc.tpl.html:12 +#: src/app/templates/modals/domain/domain.tpl.html:11 +#: src/app/templates/modals/domain/mx.tpl.html:15 +#: src/app/templates/modals/domain/spf.tpl.html:15 +#: src/app/templates/modals/domain/verification.tpl.html:16 +#: src/app/templates/views/appearance.tpl.html:11 +#: src/app/templates/views/appearance.tpl.html:31 +#: src/app/templates/views/dashboard.tpl.html:124 +msgctxt "Action" +msgid "Learn more" +msgstr "" + +#: src/app/models/payments.js:92 +msgid "Limited support" +msgstr "" + +#: src/app/templates/directives/squire.tpl.html:62 +msgid "Link URL" +msgstr "" + +#. select dropdown options +#: src/app/templates/modals/bug.tpl.html:21 +msgid "Linux" +msgstr "" + +#: src/app/templates/views/appearance.tpl.html:104 +msgctxt "Action" +msgid "Load classic theme" +msgstr "" + +#: src/app/templates/views/appearance.tpl.html:105 +msgctxt "Action" +msgid "Load edison theme" +msgstr "" + +#: src/app/templates/views/step1.tpl.html:200 +msgid "Loading new account" +msgstr "" + +#: src/app/templates/views/appearance.tpl.html:101 +msgctxt "Info" +msgid "Loading themes will override your current theme!" +msgstr "" + +#: src/app/templates/modals/pay.tpl.html:48 +#: src/app/templates/modals/payment/payment.tpl.html:128 +#: src/app/templates/views/step1.tpl.html:155 +msgid "Loading..." +msgstr "" + +#: src/app/templates/partials/searchForm.tpl.html:22 +msgctxt "Title" +msgid "Location" +msgstr "" + +#: src/app/templates/partials/header-auth-simple.tpl.html:6 +#: src/app/templates/partials/header-no-auth.tpl.html:7 +#: src/app/templates/partials/sidebar-responsive.tpl.html:90 +msgctxt "Action" +msgid "Log out" +msgstr "" + +#. auth log entry +#: src/app/templates/views/security.tpl.html:48 +msgid "Log out" +msgstr "" + +#: src/app/controllers/settings/security.js:103 +#: src/app/controllers/settings/security.js:116 +msgid "Logging preference updated" +msgstr "" + +#: src/app/controllers/secured.js:247 +msgctxt "Title" +msgid "Login" +msgstr "" + +#: src/app/templates/views/login.tpl.html:17 +msgctxt "Action" +msgid "Login" +msgstr "" + +#. authentication log record +#: src/app/templates/views/security.tpl.html:42 +msgctxt "Info" +msgid "Login failed" +msgstr "" + +#: src/app/templates/modals/deleteAccount.tpl.html:20 +#: src/app/templates/modals/loginPassword.tpl.html:10 +#: src/app/templates/modals/reactivate.tpl.html:10 +#: src/app/templates/modals/user/member.tpl.html:19 +msgid "Login password" +msgstr "" + +#. change login password heading +#: src/app/templates/modals/user/member.tpl.html:16 +#: src/app/templates/views/account.tpl.html:93 +#: src/app/templates/views/step1.tpl.html:34 +msgctxt "Title" +msgid "Login password" +msgstr "" + +#: src/app/templates/views/reset-login-password.tpl.html:38 +#: src/app/templates/views/step1.tpl.html:39 +msgctxt "Error" +msgid "Login password is required." +msgstr "" + +#: src/app/templates/modals/loginPassword.tpl.html:6 +msgctxt "Title" +msgid "Login password required" +msgstr "" + +#. auth log entry +#: src/app/templates/views/security.tpl.html:45 +msgid "Login success" +msgstr "" + +#: src/app/templates/partials/header-auth-desktop.tpl.html:81 +msgctxt "Action" +msgid "Logout" +msgstr "" + +#: src/app/controllers/settings/security.js:58 +msgid "Logs cleared" +msgstr "" + +#. select dropdown options +#: src/app/templates/modals/bug.tpl.html:17 +msgid "Mac OSX" +msgstr "" + +#: src/app/templates/views/unlock.tpl.html:15 +msgid "Mailbox password" +msgstr "" + +#. form heading for changing mailbox password +#: src/app/templates/views/account.tpl.html:138 +#: src/app/templates/views/step1.tpl.html:47 +msgctxt "Title" +msgid "Mailbox password" +msgstr "" + +#: src/app/templates/views/step1.tpl.html:52 +msgctxt "Error" +msgid "Mailbox password is required." +msgstr "" + +#: src/app/templates/views/payments.tpl.html:30 +msgctxt "Action" +msgid "Make default" +msgstr "" + +#: src/app/templates/views/keys.tpl.html:141 +#: src/app/templates/views/keys.tpl.html:45 +#: src/app/templates/views/keys.tpl.html:92 +msgctxt "Action" +msgid "Make primary" +msgstr "" + +#. Form checkbox option +#: src/app/templates/modals/user/member.tpl.html:45 +msgctxt "Action" +msgid "Make user private" +msgstr "" + +#: src/app/templates/views/dashboard.tpl.html:101 +#: src/app/templates/views/dashboard.tpl.html:25 +#: src/app/templates/views/dashboard.tpl.html:36 +#: src/app/templates/views/domains.tpl.html:151 +msgctxt "Action" +msgid "Manage" +msgstr "" + +#: src/app/templates/views/members.tpl.html:102 +#: src/app/templates/views/members.tpl.html:103 +msgctxt "Action" +msgid "Manage passwords" +msgstr "" + +#: src/app/templates/modals/storage.tpl.html:6 +msgctxt "Title" +msgid "Manage storage" +msgstr "" + +#: src/app/templates/partials/wizard.tpl.html:25 +msgctxt "Title" +msgid "Manage your email with labels" +msgstr "" + +#. form option +#: src/app/templates/views/account.tpl.html:246 +msgctxt "Action" +msgid "Manual" +msgstr "" + +#: src/app/templates/partials/toolbar-desktop.tpl.html:12 +#: src/app/templates/partials/toolbar-desktop.tpl.html:15 +#: src/app/templates/partials/toolbar-list-rows-responsive.tpl.html:11 +#: src/app/templates/partials/toolbar-list-rows-responsive.tpl.html:17 +#: src/app/templates/partials/toolbar-list-rows-responsive.tpl.html:38 +#: src/app/templates/partials/toolbar-list-rows.tpl.html:26 +#: src/app/templates/partials/toolbar-list-rows.tpl.html:31 +#: src/app/templates/partials/toolbar-mobile.tpl.html:25 +msgctxt "Action" +msgid "Mark as read" +msgstr "" + +#: src/app/templates/partials/toolbar-list-rows-responsive.tpl.html:37 +msgid "Mark as read" +msgstr "" + +#: src/app/templates/views/appearance.tpl.html:59 +msgctxt "Action" +msgid "Mark as read / Mark as unread" +msgstr "" + +#: src/app/templates/partials/message.tpl.html:189 +#: src/app/templates/partials/toolbar-list-rows-responsive.tpl.html:24 +#: src/app/templates/partials/toolbar-list-rows-responsive.tpl.html:72 +msgctxt "Action" +msgid "Mark as spam" +msgstr "" + +#: src/app/templates/partials/message.tpl.html:185 +#: src/app/templates/partials/toolbar-desktop.tpl.html:11 +#: src/app/templates/partials/toolbar-desktop.tpl.html:16 +#: src/app/templates/partials/toolbar-list-rows-responsive.tpl.html:12 +#: src/app/templates/partials/toolbar-list-rows-responsive.tpl.html:16 +#: src/app/templates/partials/toolbar-list-rows-responsive.tpl.html:35 +#: src/app/templates/partials/toolbar-list-rows.tpl.html:27 +#: src/app/templates/partials/toolbar-list-rows.tpl.html:30 +#: src/app/templates/partials/toolbar-mobile.tpl.html:21 +msgctxt "Action" +msgid "Mark as unread" +msgstr "" + +#: src/app/templates/partials/toolbar-list-rows-responsive.tpl.html:34 +msgid "Mark as unread" +msgstr "" + +#: src/app/templates/views/appearance.tpl.html:66 +msgctxt "Action" +msgid "Mark as unread / Mark as read" +msgstr "" + +#: src/app/controllers/settings/members.js:24 +#: src/app/templates/views/members.tpl.html:83 +msgid "Master" +msgstr "" + +#. form option +#: src/app/templates/views/appearance.tpl.html:23 +msgid "Maximized" +msgstr "" + +#: src/app/controllers/compose.js:140 +#: src/app/controllers/compose.js:562 +msgctxt "Error" +msgid "Maximum composer reached" +msgstr "" + +#. if an email is sent to you, we replace the email with this string +#: src/app/filters/filters.js:268 +msgid "Me" +msgstr "" + +#: src/app/controllers/settings/members.js:234 +msgid "Member removed" +msgstr "" + +#. invoice heading +#: src/app/templates/views/invoice.print.tpl.html:69 +msgctxt "Title" +msgid "Members" +msgstr "" + +#: src/app/controllers/compose.js:1530 +msgid "Message discarded" +msgstr "" + +#: src/app/templates/partials/composer.tpl.html:57 +msgctxt "Title" +msgid "Message password" +msgstr "" + +#: src/app/templates/views/outside.unlock.tpl.html:14 +msgid "Message password" +msgstr "" + +#: src/app/controllers/compose.js:1166 +msgid "Message saved" +msgstr "" + +#: src/app/controllers/compose.js:1384 +#: src/app/controllers/outside.js:144 +msgid "Message sent" +msgstr "" + +#: src/app/models/payments.js:90 +#: src/app/models/payments.js:97 +msgid "Messages per day" +msgstr "" + +#: src/app/templates/partials/composer.tpl.html:28 +msgctxt "Action" +msgid "Minimize" +msgstr "" + +#: src/app/filters/filters.js:33 +msgid "Minutes" +msgstr "" + +#. address state badge +#: src/app/templates/views/addresses.tpl.html:50 +#: src/app/templates/views/domains.tpl.html:148 +msgid "Missing keys" +msgstr "" + +#: src/app/templates/modals/card.tpl.html:35 +#: src/app/templates/modals/donate.tpl.html:51 +#: src/app/templates/modals/payment/payment.tpl.html:107 +msgid "MM" +msgstr "" + +#: src/app/templates/partials/searchForm.tpl.html:44 +#: src/app/templates/partials/searchForm.tpl.html:51 +msgid "MM/DD/YYYY" +msgstr "" + +#: src/app/templates/modals/card.tpl.html:35 +#: src/app/templates/modals/donate.tpl.html:51 +#: src/app/templates/modals/monetize.tpl.html:33 +#: src/app/templates/modals/payment/payment.tpl.html:107 +#: src/app/templates/views/invoice.print.tpl.html:84 +msgid "Month" +msgid_plural "Months" +msgstr[0] "" +msgstr[1] "" + +#: src/app/templates/views/invoices.tpl.html:27 +#: src/app/templates/views/invoices.tpl.html:55 +msgid "Monthly" +msgstr "" + +#: src/app/templates/views/dashboard.tpl.html:82 +msgctxt "Title" +msgid "Monthly" +msgstr "" + +#: src/app/templates/partials/toolbar-desktop.tpl.html:44 +#: src/app/templates/partials/toolbar-list-rows-responsive.tpl.html:85 +#: src/app/templates/partials/toolbar-list-rows.tpl.html:51 +msgid "More" +msgstr "" + +#: src/app/templates/partials/message.tpl.html:171 +msgctxt "Action" +msgid "More" +msgstr "" + +#: src/app/templates/partials/toolbar-desktop.tpl.html:21 +#: src/app/templates/partials/toolbar-list-rows-responsive.tpl.html:23 +#: src/app/templates/partials/toolbar-list-rows-responsive.tpl.html:68 +#: src/app/templates/partials/toolbar-list-rows.tpl.html:36 +#: src/app/templates/partials/toolbar-mobile.tpl.html:46 +msgctxt "Action" +msgid "Move to archive" +msgstr "" + +#: src/app/templates/partials/message.tpl.html:177 +#: src/app/templates/partials/toolbar-desktop.tpl.html:20 +#: src/app/templates/partials/toolbar-list-rows-responsive.tpl.html:22 +#: src/app/templates/partials/toolbar-list-rows-responsive.tpl.html:64 +#: src/app/templates/partials/toolbar-list-rows.tpl.html:35 +#: src/app/templates/partials/toolbar-mobile.tpl.html:42 +msgctxt "Action" +msgid "Move to inbox" +msgstr "" + +#: src/app/templates/partials/toolbar-desktop.tpl.html:22 +#: src/app/templates/partials/toolbar-list-rows.tpl.html:37 +#: src/app/templates/partials/toolbar-mobile.tpl.html:50 +msgctxt "Action" +msgid "Move to spam" +msgstr "" + +#: src/app/templates/partials/message.tpl.html:181 +#: src/app/templates/partials/toolbar-desktop.tpl.html:19 +#: src/app/templates/partials/toolbar-list-rows-responsive.tpl.html:21 +#: src/app/templates/partials/toolbar-list-rows-responsive.tpl.html:60 +#: src/app/templates/partials/toolbar-list-rows.tpl.html:34 +#: src/app/templates/partials/toolbar-mobile.tpl.html:38 +msgctxt "Action" +msgid "Move to trash" +msgstr "" + +#: src/app/templates/modals/domain/menu.tpl.html:24 +msgctxt "Nav" +msgid "MX" +msgstr "" + +#: src/app/templates/modals/domain/mx.tpl.html:10 +msgctxt "Title" +msgid "MX Record" +msgstr "" + +#: src/app/services/modal.js:635 +msgctxt "Title" +msgid "My organization" +msgstr "" + +#: src/app/templates/views/dashboard.tpl.html:56 +msgctxt "Title" +msgid "My subscription" +msgstr "" + +#. table heading / link to sort table +#: src/app/templates/views/contacts.tpl.html:17 +msgctxt "Action" +msgid "Name" +msgstr "" + +#: src/app/templates/modals/contact.tpl.html:12 +#: src/app/templates/modals/label.tpl.html:11 +#: src/app/templates/modals/user/member.tpl.html:8 +msgctxt "Title" +msgid "Name" +msgstr "" + +#: src/app/templates/directives/labels.tpl.html:23 +msgid "Name" +msgstr "" + +#: src/app/templates/modals/card.tpl.html:14 +#: src/app/templates/modals/donate.tpl.html:30 +#: src/app/templates/modals/payment/payment.tpl.html:86 +msgid "Name on card" +msgstr "" + +#. safari attachment instructions +#: src/app/templates/partials/safari.attachment.warning.tpl.html:19 +#: src/app/templates/partials/safari.warning.tpl.html:19 +msgid "Name your attachment from 'unknown' to the correct name, including the file extension." +msgstr "" + +#. link for login help +#. link to support portal +#: src/app/templates/views/login.tpl.html:16 +#: src/app/templates/views/outside.unlock.tpl.html:19 +msgctxt "Action" +msgid "Need help?" +msgstr "" + +#: src/app/templates/views/account.tpl.html:164 +msgctxt "Title" +msgid "New mailbox password" +msgstr "" + +#: src/app/templates/views/account.tpl.html:167 +#: src/app/templates/views/reset-mailbox-password.tpl.html:39 +msgid "New mailbox password" +msgstr "" + +#: src/app/controllers/compose.js:1219 +msgctxt "Title" +msgid "New message" +msgstr "" + +#. form heading for new login password +#: src/app/templates/views/account.tpl.html:108 +msgctxt "Title" +msgid "New password" +msgstr "" + +#: src/app/templates/views/account.tpl.html:111 +msgid "New password" +msgstr "" + +#: src/app/templates/partials/toolbar-desktop.tpl.html:101 +#: src/app/templates/partials/toolbar-list-rows.tpl.html:12 +msgid "Next" +msgstr "" + +#: src/app/templates/directives/paginator.tpl.html:16 +#: src/app/templates/modals/domain/address.tpl.html:52 +#: src/app/templates/modals/domain/dkim.tpl.html:49 +#: src/app/templates/modals/domain/domain.tpl.html:18 +#: src/app/templates/modals/domain/domain.tpl.html:19 +#: src/app/templates/modals/domain/mx.tpl.html:55 +#: src/app/templates/modals/domain/spf.tpl.html:47 +#: src/app/templates/modals/domain/verification.tpl.html:51 +#: src/app/templates/modals/user/member.tpl.html:54 +#: src/app/templates/modals/welcome.tpl.html:29 +msgctxt "Action" +msgid "Next" +msgstr "" + +#: src/app/templates/partials/wizard.tpl.html:40 +msgctxt "Action" +msgid "Next tip" +msgstr "" + +#. form option +#: src/app/templates/partials/searchForm.tpl.html:76 +msgid "No" +msgstr "" + +#: src/app/templates/partials/no-results.tpl.html:25 +msgctxt "Title" +msgid "No conversations" +msgstr "" + +#: src/app/templates/views/domains.tpl.html:110 +#: src/app/templates/views/domains.tpl.html:159 +msgid "No custom domain found" +msgstr "" + +#: src/app/controllers/contacts.js:332 +msgctxt "Error" +msgid "No files were selected" +msgstr "" + +#: src/app/templates/directives/labels.tpl.html:3 +msgctxt "Info" +msgid "No labels" +msgstr "" + +#: src/app/templates/views/security.tpl.html:28 +msgid "No logs yet" +msgstr "" + +#: src/app/templates/partials/no-results.tpl.html:24 +msgctxt "Title" +msgid "No messages" +msgstr "" + +#: src/app/templates/views/contacts.tpl.html:8 +msgctxt "Info" +msgid "No results for this search in your contacts list." +msgstr "" + +#: src/app/controllers/compose.js:1229 +msgctxt "Title" +msgid "No subject" +msgstr "" + +#: src/app/controllers/compose.js:1230 +msgctxt "Info" +msgid "No subject, send anyway?" +msgstr "" + +#. informs the user about permanance of custom addresses +#: src/app/templates/views/addresses.tpl.html:15 +msgctxt "Info" +msgid "Non-original @protonmail addresses can never be deleted (only disabled). This means that once you create an address it will always count towards your address limit. Custom domain addresses must be disabled before they can be deleted. Custom domain addresses can only be deleted if all messages associated with that address are deleted. Learn more about addresses here." +msgstr "" + +#: src/app/templates/views/dashboard.tpl.html:97 +msgctxt "Title" +msgid "None" +msgstr "" + +#. DMARC status badge +#. MX status badge +#. SPF status badge +#. Verification status badge +#: src/app/templates/modals/domain/dkim.tpl.html:7 +#: src/app/templates/modals/domain/dmarc.tpl.html:7 +#: src/app/templates/modals/domain/mx.tpl.html:7 +#: src/app/templates/modals/domain/spf.tpl.html:7 +#: src/app/templates/modals/domain/verification.tpl.html:7 +msgid "Not set" +msgstr "" + +#. dkim status badge +#. MX status badge +#. SPF status badge +#. Verification status badge +#: src/app/templates/modals/domain/dkim.tpl.html:8 +#: src/app/templates/modals/domain/mx.tpl.html:8 +#: src/app/templates/modals/domain/spf.tpl.html:8 +#: src/app/templates/modals/domain/verification.tpl.html:8 +msgid "Not set properly" +msgstr "" + +#: src/app/templates/partials/toolbar-desktop.tpl.html:24 +#: src/app/templates/partials/toolbar-list-rows.tpl.html:39 +#: src/app/templates/partials/toolbar-mobile.tpl.html:58 +msgctxt "Action" +msgid "Not spam" +msgstr "" + +#: src/app/templates/views/account.tpl.html:57 +msgid "Notification email" +msgstr "" + +#. notifications heading on account page +#: src/app/templates/views/account.tpl.html:42 +msgid "Notifications" +msgstr "" + +#: src/app/templates/views/payments.tpl.html:15 +msgctxt "Title" +msgid "Number" +msgstr "" + +#: src/app/templates/partials/conversation-placeholder.tpl.html:3 +msgid "Number of unread conversations" +msgstr "" + +#: src/app/templates/views/members.tpl.html:29 +msgctxt "Title" +msgid "Number of users:" +msgstr "" + +#. dkim status badge +#: src/app/templates/modals/domain/dkim.tpl.html:10 +msgid "Off" +msgstr "" + +#: src/app/templates/directives/labels.tpl.html:26 +#: src/app/templates/modals/alert.tpl.html:13 +msgctxt "Action" +msgid "OK" +msgstr "" + +#. dkim status badge +#: src/app/templates/modals/domain/dkim.tpl.html:9 +msgid "On" +msgstr "" + +#: src/app/templates/modals/bug.tpl.html:11 +msgctxt "Title" +msgid "Operating system" +msgstr "" + +#: src/app/templates/modals/welcome.tpl.html:17 +#: src/app/templates/views/step1.tpl.html:62 +msgid "Optional" +msgstr "" + +#. DMARC status badge +#: src/app/templates/modals/domain/dmarc.tpl.html:9 +msgid "Optional, advanced" +msgstr "" + +#: src/app/templates/directives/squire.tpl.html:26 +msgctxt "Action" +msgid "Ordered list" +msgstr "" + +#. invoice heading +#: src/app/templates/views/invoice.print.tpl.html:57 +#: src/app/templates/views/members.tpl.html:8 +msgctxt "Title" +msgid "Organization" +msgstr "" + +#: src/app/templates/modals/user/member.tpl.html:47 +msgctxt "Info" +msgid "Organization administrators cannot access the messages of private users." +msgstr "" + +#: src/app/templates/views/invoices.tpl.html:11 +msgctxt "Title" +msgid "Organization history" +msgstr "" + +#: src/app/templates/views/members.tpl.html:17 +msgid "Organization name" +msgstr "" + +#: src/app/templates/views/members.tpl.html:13 +msgctxt "Title" +msgid "Organization name" +msgstr "" + +#: src/app/templates/modals/organizationRecovery.tpl.html:6 +msgctxt "Title" +msgid "Organization recovery password" +msgstr "" + +#: src/app/templates/views/members.tpl.html:40 +msgctxt "Title" +msgid "Organization storage:" +msgstr "" + +#: src/app/controllers/settings/members.js:152 +msgid "Organization updated" +msgstr "" + +#. address state badge +#: src/app/templates/views/addresses.tpl.html:51 +msgid "Orphan" +msgstr "" + +#: src/app/templates/modals/bug.tpl.html:31 +msgid "OS version" +msgstr "" + +#: src/app/templates/modals/bug.tpl.html:28 +msgctxt "Title" +msgid "OS version" +msgstr "" + +#. payment type badge +#. select dropdown options +#: src/app/templates/modals/bug.tpl.html:22 +#: src/app/templates/views/payments.tpl.html:123 +#: src/app/templates/views/payments.tpl.html:62 +msgid "Other" +msgstr "" + +#: src/app/templates/modals/monetize.tpl.html:18 +msgid "Other amount" +msgstr "" + +#. link to addresses page +#: src/app/templates/views/account.tpl.html:34 +msgctxt "Action" +msgid "Other identities" +msgstr "" + +#: src/app/templates/views/upgrade.tpl.html:6 +msgctxt "Info" +msgid "Our secure email requires a modern web browser." +msgstr "" + +#: src/app/templates/views/dashboard.tpl.html:8 +msgctxt "Title" +msgid "Overview" +msgstr "" + +#. current page dropdown in paginator +#: src/app/templates/directives/paginator.tpl.html:12 +msgid "Page" +msgstr "" + +#: src/app/templates/directives/paginator.tpl.html:6 +msgctxt "Action" +msgid "Page number" +msgstr "" + +#. payment status badge +#: src/app/templates/views/payments.tpl.html:131 +#: src/app/templates/views/payments.tpl.html:80 +msgid "Paid" +msgstr "" + +#: src/app/templates/partials/composer.tpl.html:60 +#: src/app/templates/views/login.tpl.html:13 +#: src/app/templates/views/reset-login-password.tpl.html:44 +msgid "Password" +msgstr "" + +#: src/app/templates/partials/composer.tpl.html:74 +msgctxt "Title" +msgid "Password hint" +msgstr "" + +#: src/app/controllers/login.js:120 +msgctxt "Error" +msgid "Passwords are limited to characters." +msgstr "" + +#: src/app/templates/views/reset-login-password.tpl.html:41 +#: src/app/templates/views/step1.tpl.html:43 +#: src/app/templates/views/step1.tpl.html:56 +msgctxt "Error" +msgid "Passwords don't match." +msgstr "" + +#: src/app/templates/views/appearance.tpl.html:91 +msgid "Paste your CSS code here (limited to 200,000 characters)" +msgstr "" + +#: src/app/templates/views/payments.tpl.html:137 +#: src/app/templates/views/payments.tpl.html:92 +msgctxt "Action" +msgid "Pay" +msgstr "" + +#: src/app/templates/modals/payment/payment.tpl.html:60 +msgctxt "Action" +msgid "Pay annually" +msgstr "" + +#. form option +#: src/app/templates/views/dashboard.tpl.html:228 +msgid "Pay annually" +msgstr "" + +#: src/app/templates/modals/pay.tpl.html:6 +msgctxt "Title" +msgid "Pay invoice" +msgstr "" + +#. form option +#: src/app/templates/views/dashboard.tpl.html:211 +msgid "Pay monthly" +msgstr "" + +#: src/app/templates/modals/payment/payment.tpl.html:3 +#: src/app/templates/modals/payment/process.tpl.html:3 +#: src/app/templates/views/dashboard.tpl.html:94 +msgctxt "Title" +msgid "Payment" +msgstr "" + +#: src/app/templates/modals/card.tpl.html:7 +msgctxt "Title" +msgid "Payment details" +msgstr "" + +#: src/app/controllers/settings/payments.js:110 +msgid "Payment method deleted" +msgstr "" + +#: src/app/controllers/settings/payments.js:84 +msgid "Payment method updated" +msgstr "" + +#: src/app/templates/views/payments.tpl.html:6 +msgctxt "Title" +msgid "Payment methods" +msgstr "" + +#: src/app/controllers/secured.js:38 +msgctxt "Title" +msgid "Payments" +msgstr "" + +#. custom domain menu +#. custom domain menu select dropdown +#: src/app/templates/partials/menu.settings.tpl.html:24 +#: src/app/templates/partials/menu.settings.tpl.html:34 +msgctxt "Nav" +msgid "Payments" +msgstr "" + +#: src/app/templates/partials/wizard.tpl.html:17 +msgctxt "Title" +msgid "Personalize your layout" +msgstr "" + +#. table heading +#: src/app/templates/modals/payment/payment.tpl.html:11 +#: src/app/templates/modals/payment/payment.tpl.html:18 +msgctxt "Title" +msgid "Plan" +msgstr "" + +#: src/app/templates/views/invoices.tpl.html:27 +#: src/app/templates/views/invoices.tpl.html:55 +msgid "Plan subscription" +msgstr "" + +#: src/app/templates/views/dashboard.tpl.html:60 +msgctxt "Title" +msgid "Plan:" +msgstr "" + +#: src/app/templates/views/dashboard.tpl.html:122 +msgid "Plans and prices" +msgstr "" + +#: src/app/templates/modals/domain/dkim.tpl.html:15 +msgid "Please add the follow TXT record. Note, DNS records can take several hours to update." +msgstr "" + +#: src/app/templates/modals/domain/mx.tpl.html:14 +msgctxt "Info" +msgid "Please add the following MX record. Note, DNS records can take several hours to update." +msgstr "" + +#: src/app/templates/modals/domain/verification.tpl.html:15 +msgctxt "Info" +msgid "Please add the following TXT record:" +msgstr "" + +#: src/app/templates/modals/domain/spf.tpl.html:14 +msgctxt "Info" +msgid "Please add the following TXT record. Note, DNS records can take several hours to update." +msgstr "" + +#: src/app/templates/views/step1.tpl.html:116 +msgctxt "Info" +msgid "Please check your email and enter the code below:" +msgstr "" + +#: src/app/templates/modals/bug.tpl.html:61 +msgid "Please describe the problem and include any error messages" +msgstr "" + +#: src/app/templates/modals/organizationRecovery.tpl.html:9 +msgid "Please enter your organization recovery password:" +msgstr "" + +#: src/app/controllers/login.js:110 +msgctxt "Error" +msgid "Please enter your username and password." +msgstr "" + +#: src/app/templates/modals/bug.tpl.html:53 +msgid "Please make sure to give us a way to contact you" +msgstr "" + +#: src/app/templates/modals/deleteAccount.tpl.html:15 +msgctxt "Title" +msgid "Please tell us why you are leaving:" +msgstr "" + +#: src/app/templates/views/appearance.tpl.html:15 +msgid "Popup" +msgstr "" + +#: src/app/templates/directives/paginator.tpl.html:2 +#: src/app/templates/partials/toolbar-desktop.tpl.html:98 +#: src/app/templates/partials/toolbar-list-rows.tpl.html:9 +msgctxt "Action" +msgid "Previous" +msgstr "" + +#. invoice heading +#. table heading +#. Table heading +#: src/app/templates/modals/payment/payment.tpl.html:12 +#: src/app/templates/views/invoice.print.tpl.html:73 +#: src/app/templates/views/invoices.tpl.html:17 +#: src/app/templates/views/invoices.tpl.html:45 +msgctxt "Title" +msgid "Price" +msgstr "" + +#: src/app/templates/views/keys.tpl.html:129 +#: src/app/templates/views/keys.tpl.html:34 +#: src/app/templates/views/keys.tpl.html:81 +msgid "Primary" +msgstr "" + +#: src/app/templates/partials/message.tpl.html:215 +msgctxt "Action" +msgid "Print" +msgstr "" + +#: src/app/templates/modals/domain/mx.tpl.html:21 +#: src/app/templates/modals/domain/mx.tpl.html:45 +msgctxt "Title" +msgid "Priority" +msgstr "" + +#. feature for upgrading from a free account to a paid account +#: src/app/templates/modals/monetize.tpl.html:38 +msgid "Priority customer support" +msgstr "" + +#: src/app/models/payments.js:113 +msgid "Priority support" +msgstr "" + +#. link to download key +#: src/app/templates/views/keys.tpl.html:138 +#: src/app/templates/views/keys.tpl.html:42 +#: src/app/templates/views/keys.tpl.html:89 +msgctxt "Action" +msgid "Private key" +msgstr "" + +#: src/app/templates/modals/user/member.tpl.html:40 +msgctxt "Title" +msgid "Private user" +msgstr "" + +#: src/app/templates/modals/payment/payment.tpl.html:38 +msgid "Proration" +msgstr "" + +#: src/app/templates/modals/alias.tpl.html:19 +msgctxt "Info" +msgid "ProtonMail address can never be deleted (only disabled). This means that once you create an address it will always count towards your address limit. Learn more about addresses here." +msgstr "" + +#: src/app/templates/views/keys.tpl.html:7 +msgctxt "Title" +msgid "ProtonMail addresses" +msgstr "" + +#: src/app/templates/views/keys.tpl.html:54 +msgctxt "Title" +msgid "ProtonMail aliases" +msgstr "" + +#: src/app/templates/partials/wizard.tpl.html:19 +msgctxt "Info" +msgid "ProtonMail allows you to fully customize your inbox experience. By clicking (1) you can quickly switch between two possible layouts. You can set a default layout, set your composer style, adjust button layouts, and even switch themes under Settings --> Appearance (2)" +msgstr "" + +#: src/app/templates/views/members.tpl.html:53 +msgctxt "Info" +msgid "ProtonMail business accounts can create subaccounts which are used by other members of your organization." +msgstr "" + +#: src/app/templates/modals/monetize.tpl.html:10 +msgctxt "Info" +msgid "ProtonMail is open source software that protects your privacy and doesn't have ads. Your support is essential for keeping the service running." +msgstr "" + +#: src/app/templates/views/appearance.tpl.html:31 +msgctxt "Info" +msgid "ProtonMail supports both column and row layouts for the inbox. Using this setting, it is possible to change between the two layouts." +msgstr "" + +#: src/app/templates/modals/domain/dkim.tpl.html:14 +msgid "ProtonMail supports DKIM signing for custom domains! To use DKIM authentication, please add the following TXT record into your DNS for this domain. This can typically be done in the control panel of your domain name registrar." +msgstr "" + +#: src/app/templates/views/outside.message.tpl.html:25 +msgid "ProtonMail Verified" +msgstr "" + +#. link to download key +#: src/app/templates/views/keys.tpl.html:137 +#: src/app/templates/views/keys.tpl.html:41 +#: src/app/templates/views/keys.tpl.html:88 +msgctxt "Action" +msgid "Public key" +msgstr "" + +#. key generation progrss +#: src/app/templates/modals/generate.tpl.html:36 +msgid "Queued" +msgstr "" + +#: src/app/controllers/settings/members.js:265 +msgid "Quota updated" +msgstr "" + +#: src/app/controllers/message.js:685 +msgid "Re:" +msgstr "" + +#: src/app/templates/modals/reactivate.tpl.html:6 +msgctxt "Title" +msgid "Reactivate key pair" +msgstr "" + +#: src/app/templates/views/step1.tpl.html:154 +msgctxt "Title" +msgid "reCAPTCHA verification" +msgstr "" + +#. printed message info +#: src/app/templates/views/message.print.tpl.html:13 +msgid "Received" +msgstr "" + +#: src/app/templates/partials/searchForm.tpl.html:35 +msgctxt "Title" +msgid "Recipient" +msgstr "" + +#: src/app/templates/partials/composer.tpl.html:135 +msgctxt "Title" +msgid "Recipients" +msgstr "" + +#: src/app/templates/modals/domain/dkim.tpl.html:11 +#: src/app/templates/modals/domain/spf.tpl.html:10 +msgid "Recommended" +msgstr "" + +#: src/app/templates/views/reset-login-password.tpl.html:15 +#: src/app/templates/views/step1.tpl.html:65 +msgid "Recovery email" +msgstr "" + +#. form label for setting recovery email +#: src/app/templates/views/account.tpl.html:54 +#: src/app/templates/views/step1.tpl.html:61 +msgctxt "Title" +msgid "Recovery email" +msgstr "" + +#: src/app/templates/views/reset-mailbox-password.tpl.html:73 +#: src/app/templates/views/step1.tpl.html:208 +msgid "Redirecting" +msgstr "" + +#: src/app/templates/views/domains.tpl.html:22 +msgctxt "Action" +msgid "Refresh domain status" +msgstr "" + +#: src/app/templates/directives/autocomplete.tpl.html:6 +msgctxt "Action" +msgid "Remove" +msgstr "" + +#: src/app/templates/partials/composer.tpl.html:132 +msgid "Remove Attachments to change your From address." +msgstr "" + +#: src/app/templates/directives/squire.tpl.html:64 +msgctxt "Action" +msgid "Remove link" +msgstr "" + +#: src/app/controllers/settings/members.js:221 +msgctxt "Title" +msgid "Remove member" +msgstr "" + +#: src/app/templates/views/members.tpl.html:118 +msgctxt "Action" +msgid "Remove user" +msgstr "" + +#: src/app/templates/partials/message.tpl.html:162 +msgctxt "Action" +msgid "Reply" +msgstr "" + +#: src/app/templates/partials/message.tpl.html:165 +msgctxt "Action" +msgid "Reply all" +msgstr "" + +#: src/app/templates/views/outside.message.tpl.html:11 +msgctxt "Action" +msgid "Reply securely" +msgstr "" + +#: src/app/templates/partials/header-auth-desktop.tpl.html:56 +msgctxt "Action" +msgid "Report a bug" +msgstr "" + +#: src/app/templates/partials/header-auth-desktop.tpl.html:47 +#: src/app/templates/partials/header-auth-simple.tpl.html:4 +#: src/app/templates/partials/header-no-auth.tpl.html:4 +#: src/app/templates/partials/sidebar-responsive.tpl.html:84 +msgctxt "Action" +msgid "Report bug" +msgstr "" + +#: src/app/templates/modals/bug.tpl.html:6 +msgctxt "Title" +msgid "Report bug" +msgstr "" + +#: src/app/templates/modals/domain/address.tpl.html:7 +#: src/app/templates/modals/domain/mx.tpl.html:10 +#: src/app/templates/modals/domain/verification.tpl.html:10 +msgid "Required" +msgstr "" + +#: src/app/templates/views/reset-mailbox-password.tpl.html:13 +msgctxt "Action" +msgid "Reset" +msgstr "" + +#: src/app/templates/views/reset-login-password.tpl.html:4 +msgctxt "Info" +msgid "Reset login password" +msgstr "" + +#. button to reset login password +#: src/app/templates/views/reset-login-password.tpl.html:17 +#: src/app/templates/views/reset-login-password.tpl.html:29 +#: src/app/templates/views/reset-login-password.tpl.html:49 +msgctxt "Action" +msgid "Reset login password" +msgstr "" + +#: src/app/templates/views/reset-login-password.tpl.html:24 +#: src/app/templates/views/reset-login-password.tpl.html:36 +msgctxt "Title" +msgid "Reset login password" +msgstr "" + +#: src/app/templates/views/reset-mailbox-password.tpl.html:34 +msgctxt "Title" +msgid "Reset mailbox" +msgstr "" + +#: src/app/templates/views/reset-mailbox-password.tpl.html:27 +msgctxt "Action" +msgid "Reset mailbox" +msgstr "" + +#: src/app/templates/views/reset-mailbox-password.tpl.html:14 +msgctxt "Action" +msgid "Reset now" +msgstr "" + +#: src/app/templates/modals/loginHelp.tpl.html:10 +msgctxt "Action" +msgid "Reset password" +msgstr "" + +#. safari attachment instructions +#: src/app/templates/partials/safari.attachment.warning.tpl.html:17 +#: src/app/templates/partials/safari.warning.tpl.html:17 +msgid "Right-click on your attachment and choose 'Download linked file as...'" +msgstr "" + +#. table heading +#: src/app/templates/views/members.tpl.html:71 +msgctxt "Title" +msgid "Role" +msgstr "" + +#: src/app/controllers/settings/members.js:131 +msgid "Role updated" +msgstr "" + +#. form option +#: src/app/templates/views/appearance.tpl.html:43 +msgid "Row" +msgstr "" + +#: src/app/controllers/contacts.js:446 +#: src/app/controllers/message.js:282 +msgctxt "Error" +msgid "Safari does not fully support downloading contacts.

Please login with a different browser to download contacts." +msgstr "" + +#: src/app/templates/partials/safari.attachment.warning.tpl.html:12 +#: src/app/templates/partials/safari.warning.tpl.html:12 +msgctxt "Info" +msgid "Safari does not fully support downloading encrypted attachments." +msgstr "" + +#: src/app/templates/views/keys.tpl.html:5 +msgctxt "Error" +msgid "Safari doesn't support downloading of keys. We are working on a fix for this." +msgstr "" + +#. save button for saving notification email +#. Save button for updating default identity on account page +#: src/app/templates/modals/contact.tpl.html:30 +#: src/app/templates/modals/label.tpl.html:35 +#: src/app/templates/partials/composer.tpl.html:240 +#: src/app/templates/partials/composer.tpl.html:242 +#: src/app/templates/views/account.tpl.html:131 +#: src/app/templates/views/account.tpl.html:187 +#: src/app/templates/views/account.tpl.html:35 +#: src/app/templates/views/account.tpl.html:60 +#: src/app/templates/views/appearance.tpl.html:95 +#: src/app/templates/views/members.tpl.html:20 +msgctxt "Action" +msgid "Save" +msgstr "" + +#: src/app/templates/modals/payment/payment.tpl.html:57 +msgid "Save 20% with the annual plan!" +msgstr "" + +#. key generation progrss +#: src/app/templates/modals/generate.tpl.html:39 +msgid "Saved" +msgstr "" + +#: src/app/templates/partials/composer.tpl.html:234 +msgid "Saved at {{ message.Time | date : \"shortTime\" }}" +msgstr "" + +#: src/app/templates/partials/composer.tpl.html:249 +msgctxt "Action" +msgid "Saving" +msgstr "" + +#: src/app/templates/views/reset-mailbox-password.tpl.html:68 +msgid "Saving encrypted keys" +msgstr "" + +#. no results heading +#: src/app/templates/partials/no-results.tpl.html:22 +msgctxt "Title" +msgid "Search" +msgstr "" + +#: src/app/templates/partials/searchForm.tpl.html:86 +msgctxt "Action" +msgid "Search" +msgstr "" + +#: src/app/templates/partials/header-auth-desktop.tpl.html:10 +msgid "Search contacts" +msgstr "" + +#: src/app/templates/partials/searchForm.tpl.html:6 +msgid "Search messages" +msgstr "" + +#: src/app/filters/filters.js:33 +msgid "Seconds" +msgstr "" + +#. custom domain menu +#. custom domain menu select dropdown +#: src/app/templates/partials/menu.settings.tpl.html:12 +#: src/app/templates/partials/menu.settings.tpl.html:32 +msgctxt "Nav" +msgid "Security" +msgstr "" + +#: src/app/controllers/secured.js:232 +#: src/app/controllers/secured.js:33 +msgctxt "Title" +msgid "Security" +msgstr "" + +#: src/app/templates/partials/toolbar-desktop.tpl.html:8 +#: src/app/templates/partials/toolbar-list-rows-responsive.tpl.html:8 +#: src/app/templates/partials/toolbar-list-rows.tpl.html:23 +#: src/app/templates/partials/toolbar-mobile.tpl.html:4 +msgctxt "Action" +msgid "Select all messages" +msgstr "" + +#: src/app/templates/modals/user/address.tpl.html:8 +msgctxt "Title" +msgid "Select domain" +msgstr "" + +#. form label +#: src/app/templates/modals/payment/payment.tpl.html:68 +msgctxt "Title" +msgid "Select payment method:" +msgstr "" + +#: src/app/templates/modals/feedback.tpl.html:16 +#: src/app/templates/partials/composer.tpl.html:245 +#: src/app/templates/views/outside.reply.tpl.html:38 +#: src/app/templates/views/step1.tpl.html:111 +#: src/app/templates/views/step1.tpl.html:135 +msgctxt "Action" +msgid "Send" +msgstr "" + +#: src/app/templates/views/step1.tpl.html:121 +#: src/app/templates/views/step1.tpl.html:147 +msgctxt "Action" +msgid "Send new code" +msgstr "" + +#: src/app/templates/partials/searchForm.tpl.html:31 +msgctxt "Title" +msgid "Sender" +msgstr "" + +#: src/app/templates/partials/composer.tpl.html:247 +msgctxt "Action" +msgid "Sending" +msgstr "" + +#. location tag +#. printed message info +#: src/app/templates/directives/location-tag.tpl.html:4 +#: src/app/templates/partials/message.tpl.html:136 +#: src/app/templates/partials/message.tpl.html:41 +#: src/app/templates/views/message.print.tpl.html:14 +msgid "Sent" +msgstr "" + +#. Folder name +#: src/app/templates/partials/sidebar-responsive.tpl.html:30 +#: src/app/templates/partials/sidebar.tpl.html:29 +msgctxt "Nav" +msgid "Sent" +msgstr "" + +#. no results heading +#: src/app/controllers/secured.js:196 +#: src/app/templates/partials/no-results.tpl.html:17 +msgctxt "Title" +msgid "Sent" +msgstr "" + +#: src/app/templates/partials/composer.tpl.html:121 +#: src/app/templates/partials/composer.tpl.html:88 +msgctxt "Action" +msgid "Set" +msgstr "" + +#. DMARC status badge +#: src/app/templates/modals/domain/dmarc.tpl.html:8 +#: src/app/templates/modals/domain/domain.tpl.html:7 +msgid "Set" +msgstr "" + +#: src/app/templates/modals/storage.tpl.html:9 +msgctxt "Title" +msgid "Set user storage" +msgstr "" + +#. Folder name +#: src/app/templates/partials/sidebar-responsive.tpl.html:78 +msgctxt "Nav" +msgid "Settings" +msgstr "" + +#: src/app/templates/partials/header-auth-desktop.tpl.html:30 +msgctxt "Action" +msgid "Settings" +msgstr "" + +#: src/app/templates/partials/composer.tpl.html:190 +msgctxt "Action" +msgid "Show" +msgstr "" + +#: src/app/templates/partials/toolbar-desktop.tpl.html:74 +#: src/app/templates/partials/toolbar-desktop.tpl.html:76 +#: src/app/templates/partials/toolbar-list-rows.tpl.html:83 +msgctxt "Action" +msgid "Show all" +msgstr "" + +#: src/app/templates/partials/message.tpl.html:222 +msgctxt "Action" +msgid "Show details" +msgstr "" + +#. show images in an email button +#: src/app/templates/partials/message.tpl.html:239 +#: src/app/templates/views/outside.message.tpl.html:42 +msgctxt "Action" +msgid "Show images" +msgstr "" + +#: src/app/templates/views/account.tpl.html:236 +msgctxt "Title" +msgid "Show images" +msgstr "" + +#: src/app/directives/transformation.js:47 +msgctxt "Title" +msgid "Show previous message" +msgstr "" + +#: src/app/templates/partials/toolbar-desktop.tpl.html:84 +#: src/app/templates/partials/toolbar-list-rows.tpl.html:91 +msgctxt "Action" +msgid "Show read" +msgstr "" + +#: src/app/templates/partials/toolbar-desktop.tpl.html:80 +#: src/app/templates/partials/toolbar-list-rows.tpl.html:87 +msgctxt "Action" +msgid "Show unread" +msgstr "" + +#: src/app/templates/views/step1.tpl.html:177 +msgctxt "Error" +msgid "Sign up failed" +msgstr "" + +#. link for account creation +#: src/app/templates/partials/header-no-auth.tpl.html:6 +#: src/app/templates/views/login.tpl.html:23 +msgctxt "Action" +msgid "Sign up for free" +msgstr "" + +#. Signature heading on account page +#: src/app/templates/modals/identity.tpl.html:30 +#: src/app/templates/modals/identity.tpl.html:42 +#: src/app/templates/views/account.tpl.html:25 +msgctxt "Title" +msgid "Signature" +msgstr "" + +#: src/app/templates/partials/toolbar-desktop.tpl.html:64 +#: src/app/templates/partials/toolbar-list-rows-responsive.tpl.html:106 +#: src/app/templates/partials/toolbar-list-rows.tpl.html:71 +msgctxt "Action" +msgid "Size: Large to small" +msgstr "" + +#: src/app/templates/partials/toolbar-desktop.tpl.html:60 +#: src/app/templates/partials/toolbar-list-rows-responsive.tpl.html:102 +#: src/app/templates/partials/toolbar-list-rows.tpl.html:67 +msgctxt "Action" +msgid "Size: Small to large" +msgstr "" + +#: src/app/templates/views/step1.tpl.html:99 +msgctxt "Title" +msgid "SMS" +msgstr "" + +#: src/app/templates/views/step1.tpl.html:129 +msgctxt "Title" +msgid "SMS verification" +msgstr "" + +#: src/app/controllers/signup.js:216 +msgctxt "Error" +msgid "Something went wrong" +msgstr "" + +#: src/app/templates/views/outside.unlock.tpl.html:31 +msgctxt "Error" +msgid "Sorry, this message does not exist or has already expired" +msgstr "" + +#. invoice heading +#: src/app/templates/views/invoice.print.tpl.html:65 +msgctxt "Title" +msgid "Space" +msgstr "" + +#. location tag +#: src/app/directives/move.js:23 +#: src/app/templates/directives/location-tag.tpl.html:6 +msgid "Spam" +msgstr "" + +#. Folder name +#: src/app/templates/partials/sidebar-responsive.tpl.html:51 +#: src/app/templates/partials/sidebar.tpl.html:53 +msgctxt "Nav" +msgid "Spam" +msgstr "" + +#. no results heading +#: src/app/controllers/secured.js:205 +#: src/app/templates/partials/no-results.tpl.html:19 +msgctxt "Title" +msgid "Spam" +msgstr "" + +#: src/app/templates/modals/domain/menu.tpl.html:30 +msgctxt "Nav" +msgid "SPF" +msgstr "" + +#: src/app/templates/modals/domain/spf.tpl.html:10 +msgctxt "Title" +msgid "SPF" +msgstr "" + +#: src/app/templates/modals/domain/spf.tpl.html:13 +msgctxt "Info" +msgid "SPF is used to specify who is allowed to send email for the domain so we strongly recommend including ProtonMail in your SPF record. Please add the following TXT record into your DNS. This can typically be done in the control panel of your domain name registrar." +msgstr "" + +#. no results heading +#: src/app/templates/partials/no-results.tpl.html:20 +msgctxt "Title" +msgid "Star" +msgstr "" + +#: src/app/templates/partials/conversation.tpl.html:3 +msgid "Star conversation" +msgstr "" + +#: src/app/controllers/secured.js:199 +msgctxt "Title" +msgid "Starred" +msgstr "" + +#. Folder name +#: src/app/templates/partials/sidebar-responsive.tpl.html:37 +#: src/app/templates/partials/sidebar.tpl.html:37 +msgctxt "Nav" +msgid "Starred" +msgstr "" + +#: src/app/templates/partials/searchForm.tpl.html:41 +msgctxt "Title" +msgid "Start date" +msgstr "" + +#. table heading +#. table heading for the domains page table listing of addresses +#: src/app/templates/modals/generate.tpl.html:29 +#: src/app/templates/views/domains.tpl.html:138 +#: src/app/templates/views/keys.tpl.html:117 +#: src/app/templates/views/keys.tpl.html:22 +#: src/app/templates/views/keys.tpl.html:69 +#: src/app/templates/views/payments.tpl.html:108 +msgctxt "Title" +msgid "Status" +msgstr "" + +#: src/app/templates/modals/payment/payment.tpl.html:19 +#: src/app/templates/views/dashboard.tpl.html:162 +msgid "Storage" +msgstr "" + +#. table heading +#: src/app/templates/modals/storage.tpl.html:12 +#: src/app/templates/views/dashboard.tpl.html:41 +#: src/app/templates/views/dashboard.tpl.html:69 +#: src/app/templates/views/members.tpl.html:72 +msgctxt "Title" +msgid "Storage" +msgstr "" + +#: src/app/templates/modals/user/member.tpl.html:28 +msgid "Storage as MB" +msgstr "" + +#: src/app/models/message.js:139 +msgid "Stored encrypted" +msgstr "" + +#: src/app/controllers/settings/members.js:25 +msgid "Sub" +msgstr "" + +#: src/app/templates/partials/composer.tpl.html:157 +msgid "Subject" +msgstr "" + +#: src/app/templates/modals/pay.tpl.html:62 +msgctxt "Info" +msgid "Submit" +msgstr "" + +#: src/app/templates/modals/alias.tpl.html:24 +#: src/app/templates/modals/bug.tpl.html:79 +#: src/app/templates/modals/card.tpl.html:57 +#: src/app/templates/modals/customizeInvoice.tpl.html:15 +#: src/app/templates/modals/loginPassword.tpl.html:15 +#: src/app/templates/modals/organizationRecovery.tpl.html:15 +#: src/app/templates/modals/payment/payment.tpl.html:179 +#: src/app/templates/modals/reactivate.tpl.html:17 +#: src/app/templates/modals/user/address.tpl.html:56 +msgctxt "Action" +msgid "Submit" +msgstr "" + +#. payment type badge +#: src/app/templates/views/payments.tpl.html:124 +#: src/app/templates/views/payments.tpl.html:65 +msgid "Subscription" +msgstr "" + +#: src/app/models/payments.js:99 +msgid "Support" +msgstr "" + +#. feature for upgrading from a free account to a paid account +#: src/app/templates/modals/monetize.tpl.html:35 +msgid "Support for custom domains and aliases" +msgstr "" + +#: src/app/templates/views/dashboard.tpl.html:147 +msgid "Support ProtonMail" +msgstr "" + +#: src/app/templates/modals/monetize.tpl.html:32 +msgctxt "Title" +msgid "Support ProtonMail by upgrading to a paid account" +msgstr "" + +#: src/app/templates/views/step1.tpl.html:14 +msgctxt "Info" +msgid "Take back your privacy! Creating your free secure email account takes less than 2 minutes in most cases." +msgstr "" + +#: src/app/templates/modals/payment/thanks.tpl.html:3 +msgctxt "Title" +msgid "Thank you for your subscription." +msgstr "" + +#: src/app/controllers/settings/appearance.js:40 +msgid "Theme saved" +msgstr "" + +#: src/app/templates/views/step1.tpl.html:170 +msgctxt "Info" +msgid "This can take a few seconds or a few minutes depending on your device." +msgstr "" + +#: src/app/controllers/conversations.js:891 +msgid "This cannot be undone." +msgstr "" + +#: src/app/templates/partials/conversation.tpl.html:15 +msgctxt "Info" +msgid "This conversation contains non-trashed messages." +msgstr "" + +#: src/app/templates/partials/conversation.tpl.html:22 +msgctxt "Info" +msgid "This conversation contains trashed messages." +msgstr "" + +#: src/app/templates/modals/welcome.tpl.html:22 +msgctxt "Info" +msgid "This is the 'From' name that people will see when you email them." +msgstr "" + +#: src/app/templates/views/step1.tpl.html:49 +msgctxt "Info" +msgid "This is used to encrypt and decrypt your messages. This is private and only you know it." +msgstr "" + +#: src/app/templates/views/step1.tpl.html:36 +msgctxt "Info" +msgid "This is used to log you into our system." +msgstr "" + +#: src/app/templates/views/step1.tpl.html:64 +msgctxt "Info" +msgid "This is used to recover your account if you get locked out or forget your login password." +msgstr "" + +#: src/app/templates/partials/composer.tpl.html:101 +#: src/app/templates/partials/message.tpl.html:232 +msgid "This message will expire in" +msgstr "" + +#. responsiveness info +#: src/app/templates/views/addresses.tpl.html:4 +msgctxt "Info" +msgid "This page is only available on larger resolution devices. If you are on a phone, try landscape mode, or visit on a computer instead." +msgstr "" + +#: src/app/templates/views/appearance.tpl.html:11 +msgctxt "Info" +msgid "This sets the default composer size. Two sizes are available, a smaller popup composer, and a bigger full screen composer." +msgstr "" + +#: src/app/templates/partials/wizard.tpl.html:11 +msgctxt "Info" +msgid "This short tutorial will show you the main features of your new ProtonMail account. For more information, you can also check out the Welcome email we have sent you. If you ever want to view this tutorial again, you can access it by clicking your username in the upper right corner." +msgstr "" + +#: src/app/templates/modals/alias.tpl.html:18 +msgctxt "Info" +msgid "This will be a new address you can send and receive emails with." +msgstr "" + +#: src/app/templates/views/step1.tpl.html:20 +msgctxt "Info" +msgid "This will be your email address. Select the drop down to choose your domain." +msgstr "" + +#: src/app/controllers/settings/dashboard.js:315 +msgctxt "Info" +msgid "This will downgrade your account to a free account.

Please disable all additional addresses prior to downgrading your account. You can manage that inside the addresses tab.

ProtonMail is free software that is supported by donations and paid accounts. Please consider making a donation so we can continue to offer the service for free." +msgstr "" + +#. invoice heading +#: src/app/templates/views/invoice.print.tpl.html:77 +#: src/app/templates/views/security.tpl.html:35 +msgctxt "Title" +msgid "Time" +msgstr "" + +#. message metadata +#. printed message info +#: src/app/controllers/compose.js:1544 +#: src/app/templates/partials/message.tpl.html:80 +#: src/app/templates/partials/message.tpl.html:89 +#: src/app/templates/partials/searchForm.tpl.html:36 +#: src/app/templates/views/message.print.tpl.html:32 +#: src/app/templates/views/outside.message.tpl.html:28 +#: src/app/templates/views/outside.reply.tpl.html:18 +msgid "To" +msgstr "" + +#: src/app/templates/partials/composer.tpl.html:142 +msgctxt "Title" +msgid "To" +msgstr "" + +#: src/app/templates/views/addresses.tpl.html:64 +msgctxt "Info" +msgid "To add more addresses to your account, or to use your own domain, upgrade your account." +msgstr "" + +#. reset warning 3/3 +#: src/app/templates/views/reset-mailbox-password.tpl.html:7 +msgctxt "Info" +msgid "To continue, type 'DANGER' below:" +msgstr "" + +#: src/app/templates/partials/safari.attachment.warning.tpl.html:14 +#: src/app/templates/partials/safari.warning.tpl.html:14 +msgid "To download attachments in Safari:" +msgstr "" + +#: src/app/templates/modals/payment/payment.tpl.html:154 +msgctxt "Info" +msgid "To pay via Bitcoin or Cash, please email us at contact@protonmail.ch for instructions." +msgstr "" + +#: src/app/templates/modals/domain/address.tpl.html:10 +msgid "To send and receive email with this domain, please add all addresses" +msgstr "" + +#: src/app/templates/views/appearance.tpl.html:55 +msgctxt "Title" +msgid "Toolbar" +msgstr "" + +#: src/app/templates/modals/payment/payment.tpl.html:31 +msgid "Total per year (incl. taxes)" +msgstr "" + +#: src/app/templates/views/dashboard.tpl.html:80 +msgctxt "Title" +msgid "Total price:" +msgstr "" + +#. location tag +#: src/app/directives/move.js:24 +#: src/app/templates/directives/location-tag.tpl.html:5 +msgid "Trash" +msgstr "" + +#. Folder name +#: src/app/templates/partials/sidebar-responsive.tpl.html:58 +#: src/app/templates/partials/sidebar.tpl.html:61 +msgctxt "Nav" +msgid "Trash" +msgstr "" + +#. no results heading +#: src/app/controllers/secured.js:208 +#: src/app/templates/partials/no-results.tpl.html:18 +msgctxt "Title" +msgid "Trash" +msgstr "" + +#: src/app/templates/partials/header-auth-desktop.tpl.html:75 +msgctxt "Action" +msgid "Tutorial" +msgstr "" + +#: src/app/templates/modals/domain/dkim.tpl.html:19 +#: src/app/templates/modals/domain/dkim.tpl.html:32 +#: src/app/templates/modals/domain/dmarc.tpl.html:16 +#: src/app/templates/modals/domain/dmarc.tpl.html:29 +#: src/app/templates/modals/domain/mx.tpl.html:18 +#: src/app/templates/modals/domain/mx.tpl.html:33 +#: src/app/templates/modals/domain/spf.tpl.html:18 +#: src/app/templates/modals/domain/spf.tpl.html:31 +#: src/app/templates/modals/domain/verification.tpl.html:19 +#: src/app/templates/modals/domain/verification.tpl.html:32 +#: src/app/templates/views/payments.tpl.html:107 +#: src/app/templates/views/payments.tpl.html:17 +msgctxt "Title" +msgid "Type" +msgstr "" + +#: src/app/controllers/settings/addresses.js:243 +#: src/app/controllers/settings/appearance.js:46 +#: src/app/controllers/settings/labels.js:118 +#: src/app/controllers/settings/members.js:269 +#: src/app/controllers/settings/members.js:272 +#: src/app/controllers/settings/payments.js:88 +#: src/app/controllers/settings/payments.js:91 +#: src/app/controllers/settings/security.js:61 +msgctxt "Error" +msgid "Unable to save your changes, please try again." +msgstr "" + +#: src/app/services/attachments.js:107 +#: src/app/services/attachments.js:99 +msgctxt "Error" +msgid "Unable to upload file. Please try again" +msgstr "" + +#: src/app/templates/directives/squire.tpl.html:15 +msgctxt "Action" +msgid "Underline" +msgstr "" + +#: src/app/models/message.js:134 +msgid "Unencrypted message" +msgstr "" + +#: src/app/models/payments.js:112 +msgid "Unlimited labels" +msgstr "" + +#: src/app/models/payments.js:111 +msgid "Unlimited sending" +msgstr "" + +#: src/app/controllers/settings/members.js:169 +#: src/app/templates/views/members.tpl.html:96 +msgid "Unlink address" +msgstr "" + +#: src/app/templates/views/unlock.tpl.html:19 +msgctxt "Action" +msgid "Unlock" +msgstr "" + +#: src/app/templates/directives/squire.tpl.html:21 +msgctxt "Action" +msgid "Unordered list" +msgstr "" + +#. payment status badge +#: src/app/templates/views/payments.tpl.html:130 +#: src/app/templates/views/payments.tpl.html:77 +msgid "Unpaid" +msgstr "" + +#: src/app/templates/directives/squire.tpl.html:65 +msgctxt "Action" +msgid "Update link" +msgstr "" + +#: src/app/controllers/settings/dashboard.js:270 +msgctxt "Action" +msgid "Update Plus" +msgstr "" + +#: src/app/controllers/settings/dashboard.js:278 +msgctxt "Action" +msgid "Update Visionary" +msgstr "" + +#. Folder name +#: src/app/templates/partials/sidebar-responsive.tpl.html:72 +msgctxt "Nav" +msgid "Upgrade" +msgstr "" + +#. link to dashboard +#: src/app/templates/modals/monetize.tpl.html:40 +#: src/app/templates/partials/header-auth-desktop.tpl.html:22 +#: src/app/templates/views/dashboard.tpl.html:26 +#: src/app/templates/views/dashboard.tpl.html:37 +#: src/app/templates/views/members.tpl.html:35 +#: src/app/templates/views/members.tpl.html:46 +msgctxt "Action" +msgid "Upgrade" +msgstr "" + +#: src/app/templates/partials/conversation-placeholder.tpl.html:20 +msgctxt "Action" +msgid "Upgrade account" +msgstr "" + +#: src/app/templates/partials/sidebar.tpl.html:94 +msgctxt "Action" +msgid "Upgrade storage" +msgstr "" + +#: src/app/controllers/settings/dashboard.js:272 +msgctxt "Action" +msgid "Upgrade to Plus" +msgstr "" + +#: src/app/controllers/settings/dashboard.js:280 +msgctxt "Action" +msgid "Upgrade to Visionary" +msgstr "" + +#. link to dashboard +#. link to dashboard page +#: src/app/templates/views/addresses.tpl.html:8 +#: src/app/templates/views/domains.tpl.html:121 +#: src/app/templates/views/domains.tpl.html:15 +msgctxt "Action" +msgid "Upgrade your plan" +msgstr "" + +#: src/app/templates/views/dashboard.tpl.html:110 +msgid "Upgrading to a paid account is the best way to support ProtonMail, but you can also donate any amount." +msgstr "" + +#: src/app/templates/modals/dropzone.tpl.html:6 +msgctxt "Title" +msgid "Upload" +msgstr "" + +#. contacts toolbar menu option +#: src/app/templates/modals/dropzone.tpl.html:21 +#: src/app/templates/partials/toolbar-contacts.tpl.html:13 +msgctxt "Action" +msgid "Upload" +msgstr "" + +#: src/app/templates/partials/composer.tpl.html:246 +msgctxt "Action" +msgid "Uploading" +msgstr "" + +#: src/app/templates/directives/squire.tpl.html:73 +msgid "URL to image" +msgstr "" + +#: src/app/templates/views/upgrade.tpl.html:31 +msgctxt "Info" +msgid "Use one of these browsers for the best experience during Beta:" +msgstr "" + +#. invoice heading +#: src/app/templates/views/invoice.print.tpl.html:53 +msgctxt "Title" +msgid "User" +msgstr "" + +#: src/app/templates/views/invoices.tpl.html:39 +msgctxt "Title" +msgid "User history" +msgstr "" + +#: src/app/templates/views/login.tpl.html:6 +msgctxt "Title" +msgid "User login" +msgstr "" + +#: src/app/templates/modals/user/member.tpl.html:25 +msgctxt "Title" +msgid "User storage" +msgstr "" + +#: src/app/templates/views/login.tpl.html:11 +#: src/app/templates/views/reset-login-password.tpl.html:12 +msgid "Username" +msgstr "" + +#. table heading +#: src/app/templates/views/dashboard.tpl.html:12 +#: src/app/templates/views/members.tpl.html:70 +msgctxt "Title" +msgid "Username" +msgstr "" + +#: src/app/templates/views/step1.tpl.html:17 +msgctxt "Title" +msgid "Username and domain" +msgstr "" + +#: src/app/templates/views/reset-login-password.tpl.html:6 +msgctxt "Error" +msgid "Username is required." +msgstr "" + +#: src/app/controllers/secured.js:241 +#: src/app/controllers/secured.js:37 +#: src/app/templates/views/members.tpl.html:62 +msgctxt "Title" +msgid "Users" +msgstr "" + +#: src/app/templates/modals/domain/dkim.tpl.html:21 +#: src/app/templates/modals/domain/dkim.tpl.html:40 +#: src/app/templates/modals/domain/dmarc.tpl.html:18 +#: src/app/templates/modals/domain/dmarc.tpl.html:37 +#: src/app/templates/modals/domain/mx.tpl.html:20 +#: src/app/templates/modals/domain/mx.tpl.html:41 +#: src/app/templates/modals/domain/spf.tpl.html:20 +#: src/app/templates/modals/domain/spf.tpl.html:39 +#: src/app/templates/modals/domain/verification.tpl.html:21 +#: src/app/templates/modals/domain/verification.tpl.html:40 +msgctxt "Title" +msgid "Value / Data / Points to" +msgstr "" + +#: src/app/templates/views/domains.tpl.html:48 +msgid "Verification" +msgstr "" + +#: src/app/templates/views/step1.tpl.html:118 +msgid "Verification code" +msgstr "" + +#: src/app/templates/views/reset-login-password.tpl.html:26 +#: src/app/templates/views/reset-mailbox-password.tpl.html:23 +msgctxt "Title" +msgid "Verification code" +msgstr "" + +#: src/app/templates/views/step1.tpl.html:116 +msgctxt "Info" +msgid "Verification code sent" +msgstr "" + +#: src/app/controllers/settings/domains.js:384 +#: src/app/controllers/settings/domains.js:402 +#: src/app/controllers/settings/domains.js:405 +#: src/app/controllers/settings/domains.js:527 +#: src/app/controllers/settings/domains.js:530 +msgctxt "Error" +msgid "Verification did not succeed, please try again in an hour." +msgstr "" + +#: src/app/templates/modals/domain/verification.tpl.html:50 +msgctxt "Action" +msgid "Verify" +msgstr "" + +#: src/app/templates/modals/domain/verification.tpl.html:10 +msgctxt "Title" +msgid "Verify" +msgstr "" + +#: src/app/templates/modals/domain/menu.tpl.html:12 +msgctxt "Nav" +msgid "Verify" +msgstr "" + +#: src/app/templates/views/step1.tpl.html:196 +msgid "Verifying encryption keys" +msgstr "" + +#: src/app/templates/layout/pre.tpl.html:7 +msgid "Verifying invite link..." +msgstr "" + +#: src/app/templates/views/step1.tpl.html:192 +msgid "Verifying new account" +msgstr "" + +#: src/app/templates/views/upgrade.tpl.html:42 +msgid "Version" +msgstr "" + +#: src/app/templates/partials/message.tpl.html:207 +msgctxt "Action" +msgid "View headers" +msgstr "" + +#: src/app/templates/partials/message.tpl.html:211 +msgctxt "Action" +msgid "View original" +msgstr "" + +#: src/app/templates/partials/message.tpl.html:202 +msgctxt "Action" +msgid "View rendered HTML" +msgstr "" + +#: src/app/templates/partials/message.tpl.html:198 +msgctxt "Action" +msgid "View source code" +msgstr "" + +#. payment status badge +#: src/app/templates/views/payments.tpl.html:132 +#: src/app/templates/views/payments.tpl.html:83 +msgid "Void" +msgstr "" + +#: src/app/templates/views/reset-mailbox-password.tpl.html:4 +msgctxt "Title" +msgid "Warning" +msgstr "" + +#. account deletion warning +#: src/app/templates/modals/deleteAccount.tpl.html:10 +msgctxt "Info" +msgid "WARNING: DELETION IS PERMANENT" +msgstr "" + +#: src/app/templates/modals/generate.tpl.html:48 +msgctxt "Info" +msgid "We are now generating encryption keys for your account, this may take several minutes and temporarily freeze your browser." +msgstr "" + +#: src/app/templates/modals/deleteAccount.tpl.html:14 +msgctxt "Title" +msgid "We are sorry to see you go!" +msgstr "" + +#: src/app/templates/modals/payment/payment.tpl.html:135 +msgctxt "Info" +msgid "We only accept PayPal for annual subscriptions, click the link to switch to an annual subscription." +msgstr "" + +#: src/app/templates/modals/payment/payment.tpl.html:139 +msgctxt "Info" +msgid "We only accept PayPal for annual subscriptions. PayPal is also only accepted for US Dollar plans. Click here to switch to an annual US Dollar subscription." +msgstr "" + +#: src/app/templates/views/reset-login-password.tpl.html:2 +msgctxt "Info" +msgid "We will send a code to your Recovery email to reset your Recovery email
. Enter it below to continue." +msgstr "" + +#: src/app/templates/partials/composer.tpl.html:107 +msgid "Weeks" +msgstr "" + +#: src/app/templates/partials/conversation-placeholder.tpl.html:2 +msgctxt "Title" +msgid "Welcome" +msgstr "" + +#: src/app/templates/modals/welcome.tpl.html:6 +msgctxt "Title" +msgid "Welcome to ProtonMail" +msgstr "" + +#: src/app/templates/partials/wizard.tpl.html:9 +msgctxt "Title" +msgid "Welcome to your new encrypted email account" +msgstr "" + +#: src/app/templates/modals/feedback.tpl.html:9 +msgctxt "Info" +msgid "What do you think of ProtonMail version 3.0?" +msgstr "" + +#: src/app/templates/modals/bug.tpl.html:58 +msgctxt "Title" +msgid "What happened?" +msgstr "" + +#. select dropdown options +#: src/app/templates/modals/bug.tpl.html:20 +msgid "Windows" +msgstr "" + +#: src/app/templates/views/security.tpl.html:9 +msgctxt "Action" +msgid "Wipe" +msgstr "" + +#: src/app/templates/views/domains.tpl.html:92 +msgid "Wizard" +msgstr "" + +#: src/app/controllers/settings/domains.js:387 +msgctxt "Error" +msgid "Wrong verification code. Please make sure you copied the verification code correctly and try again. It can take up to 1 hour for changes to take affect." +msgstr "" + +#: src/app/templates/modals/card.tpl.html:41 +#: src/app/templates/modals/donate.tpl.html:57 +#: src/app/templates/modals/monetize.tpl.html:33 +#: src/app/templates/modals/payment/payment.tpl.html:113 +#: src/app/templates/views/invoice.print.tpl.html:85 +msgid "Year" +msgstr "" + +#. form option +#: src/app/templates/partials/searchForm.tpl.html:72 +msgid "Yes" +msgstr "" + +#: src/app/controllers/login.js:63 +msgctxt "Error" +msgid "" +"You are in Private Mode or have Session Storage disabled.\n" +"Please deactivate Private Mode and then reload the page.\n" +"More information here." +msgstr "" + +#: src/app/templates/views/addresses.tpl.html:17 +msgctxt "Info" +msgid "You can drag and drop addresses to order them." +msgstr "" + +#: src/app/templates/views/security.tpl.html:25 +msgctxt "Info" +msgid "You can enable authentication logging to see who and when your account is accessed. We will record the IP address that accesses the account and the time, as well as failed attempts." +msgstr "" + +#: src/app/templates/views/contacts.tpl.html:7 +msgctxt "Info" +msgid "You have no contacts, you can add contact with the above button 'ADD CONTACT'." +msgstr "" + +#: src/app/templates/views/payments.tpl.html:44 +msgctxt "Info" +msgid "You have no invoices." +msgstr "" + +#: src/app/templates/views/labels.tpl.html:7 +msgctxt "Info" +msgid "You have no labels, you can add label with the above button 'ADD LABEL'." +msgstr "" + +#: src/app/templates/views/payments.tpl.html:10 +msgctxt "Info" +msgid "You have no saved payment methods, you can add a payment method by clicking 'ADD'." +msgstr "" + +#: src/app/controllers/settings/dashboard.js:359 +msgid "You have successfully unsubscribed" +msgstr "" + +#: src/app/templates/modals/pay.tpl.html:26 +msgctxt "Info" +msgid "You need to add a credit card before to pay with it." +msgstr "" + +#: src/app/templates/modals/welcome.tpl.html:9 +msgctxt "Info" +msgid "You now have an encrypted email account! Below are optional settings you can use to customize your account. You can always find these on your Settings page." +msgstr "" + +#. safari attachment instructions +#: src/app/templates/partials/safari.attachment.warning.tpl.html:18 +#: src/app/templates/partials/safari.warning.tpl.html:18 +msgid "You will be prompted to save the attachment." +msgstr "" + +#: src/app/templates/modals/pay.tpl.html:50 +#: src/app/templates/modals/payment/payment.tpl.html:146 +msgctxt "Info" +msgid "You will need to login to your PayPal account to complete this transaction. We will open a new tab with PayPal for you. If you use any pop-up blockers, please disable them to continue." +msgstr "" + +#: src/app/templates/modals/payment/process.tpl.html:7 +msgctxt "Info" +msgid "You're upgrading your account. Once we successfully process payment, we'll immediately upgrade your account. Thanks for choosing to become a paying customer!" +msgstr "" + +#: src/app/controllers/compose.js:548 +#: src/app/routes.js:551 +#: src/app/routes.js:841 +#: src/app/templates/views/payments.tpl.html:43 +msgctxt "Info" +msgid "Your account currently has an overdue invoice. Please pay all unpaid invoices." +msgstr "" + +#: src/app/templates/modals/payment/process.tpl.html:9 +msgctxt "Info" +msgid "Your account is being updated, this may take up to 30 seconds." +msgstr "" + +#: src/app/templates/partials/safari.attachment.warning.tpl.html:13 +#: src/app/templates/partials/safari.warning.tpl.html:13 +msgctxt "Info" +msgid "Your attachments are secure and encrypted, but to download them requires extra work. We recommend using a different web browser such as Chrome or Firefox for a better user experience." +msgstr "" + +#: src/app/templates/views/dashboard.tpl.html:111 +msgid "Your donation helps us support more users and continue to develop ProtonMail as free and open source software." +msgstr "" + +#: src/app/templates/modals/payment/thanks.tpl.html:4 +msgid "Your new features are now available." +msgstr "" + +#: src/app/templates/modals/feedback.tpl.html:10 +msgid "Your thoughts..." +msgstr "" + +#: src/app/templates/modals/card.tpl.html:41 +#: src/app/templates/modals/donate.tpl.html:57 +#: src/app/templates/modals/payment/payment.tpl.html:113 +msgid "YY" +msgstr "" + +#: src/app/templates/modals/card.tpl.html:24 +#: src/app/templates/modals/donate.tpl.html:40 +#: src/app/templates/modals/payment/payment.tpl.html:96 +msgid "ZIP code" +msgstr "" diff --git a/postman.json b/postman.json old mode 100755 new mode 100644 diff --git a/protractor_conf.js b/protractor_conf.js old mode 100755 new mode 100644 index 5665147..fc03b03 --- a/protractor_conf.js +++ b/protractor_conf.js @@ -1,21 +1,41 @@ // An example configuration file. exports.config = { - seleniumAddress: 'http://localhost:4444/wd/hub', + seleniumAddress: 'http://localhost:4444/wd/hub', // Where to talk to the Selenium Server instance that is running on your machine. This can be verified by checking the logs in the terminal window that is running the server. + getPageTimeout: 60000, // Time to wait for the page to load + allScriptsTimeout: 500000, // Time to wait for page to synchronize. More information on timeouts can be found in Protractor’s + baseUrl: 'http://localhost:8080', // Main URL to hit for testing. This is helpful if there is only one, root URL. + framework: 'jasmine', // Where you specify the type of framework to use with Protractor - // Capabilities to be passed to the webdriver instance. - capabilities: { - 'browserName': 'chrome' - }, + // Capabilities to be passed to the webdriver instance. + multiCapabilities: [ + // {browserName: 'firefox'}, + {browserName: 'chrome'} + ], - baseUrl: 'http://localhost:8080', + // The params object will be passed directly to the Protractor instance, + // and can be accessed from your test as browser.params. It is an arbitrary + // object and can contain anything you may need in your test. + // This can be changed via the command line as: + // --params.login.user "Joe" + params: { + login: '', + password1: '', + password2: '', + sleep: 2000 + }, - // Spec patterns are relative to the current working directly when - // protractor is called. - specs: ['test/e2e/**/*.spec.js'], + // Spec patterns are relative to the current working directly when + // protractor is called. + specs: ['test/e2e/**/*.spec.js'], - // Options to be passed to Jasmine-node. - jasmineNodeOpts: { - showColors: true, - defaultTimeoutInterval: 30000 - } + // Alternatively, suites may be used. When run without a command line + // parameter, all suites will run. If run with --suite=smoke or + // --suite=smoke,full only the patterns matched by the specified suites will + // run. + suites: { + login: 'test/e2e/login/login.spec.js', + unlock: 'test/e2e/unlock/unlock.spec.js', + contact: 'test/e2e/contact/contact.spec.js', + dashboard: 'test/e2e/dashboard/dashboard.spec.js', + } }; diff --git a/src/.htaccess b/src/.htaccess old mode 100755 new mode 100644 index b46f93d..206f3e9 --- a/src/.htaccess +++ b/src/.htaccess @@ -1,17 +1,17 @@ RewriteEngine On + RewriteCond %{HTTPS} !=on RewriteRule ^ https://%{HTTP_HOST}%{REQUEST_URI} [L,R=301] -RewriteEngine On -RewriteCond %{REQUEST_FILENAME} !-f -RewriteRule ^([^\.]+)$ $1.html [NC,L] +# Redirect nothing to app +RewriteRule ^$ /app.html [NC,L] -Redirect 301 /create-account /invite -Redirect 301 /pages/join-us /pages/careers +# Hide .git stuff +RewriteRule ^.*?\.git.* /app.html [NC,L] RewriteCond %{REQUEST_FILENAME} -s [OR] RewriteCond %{REQUEST_FILENAME} -l [OR] RewriteCond %{REQUEST_FILENAME} -d RewriteRule ^.*$ - [NC,L] -RewriteRule ^(.*) /app.html [NC,L] \ No newline at end of file +RewriteRule ^(.*) /app.html [NC,L] diff --git a/src/app.html b/src/app.html old mode 100755 new mode 100644 index 5abc1d8..98aa226 --- a/src/app.html +++ b/src/app.html @@ -1,39 +1,133 @@ - - + + - + - Codestin Search App - - - - - - - + Codestin Search App + + + + + + + + + + + + + + + + + + + + - - + + + + <% styles.forEach(function (file) { %> <% }); %> + + + - -
- - + + +
+ +
Loading ProtonMail...
+ +
+
+ +
+ +
+ +
+ +

LOGGING OUT...

+
+
<% scripts.forEach(function (file) { %> <% }); %> + + - \ No newline at end of file + diff --git a/src/app/app.js b/src/app/app.js old mode 100755 new mode 100644 index bc396db..4f3ab84 --- a/src/app/app.js +++ b/src/app/app.js @@ -1,97 +1,143 @@ -angular.module("proton", [ - // "ngAnimate", // We can't use the `ngAnimate`, it causes delays on application and also a problem with the iframe sandbox. - "ngSanitize", - "ngResource", - "ngCookies", - "btford.markdown", - "ngFileUpload", - "cgNotify", - "pikaday", - "toggle-switch", - "pascalprecht.translate", - "ui.bootstrap", - "ngDragDrop", +angular.module('proton', [ + 'gettext', + 'as.sortable', + 'cgNotify', + 'ngCookies', + 'ngIcal', + 'ngMessages', + 'ngResource', + 'ngRoute', + 'ngSanitize', + 'pikaday', + // 'SmoothScrollbar', + 'ui.router', // Constant - "proton.constants", + 'proton.constants', // templates - "templates-app", - "templates-common", + 'templates-app', // App - "proton.routes", + 'proton.routes', // Models - "proton.models", - "proton.models.label", - "proton.models.message", - "proton.models.contact", - "proton.models.user", - "proton.models.reset", - "proton.models.bug", - "proton.models.setting", - "proton.models.attachment", - "proton.models.eo", - "proton.models.logs", - "proton.models.events", + 'proton.models.keys', + 'proton.models.addresses', + 'proton.models.attachment', + 'proton.models.bug', + 'proton.models.contact', + 'proton.models.conversations', + 'proton.models.domains', + 'proton.models.eo', + 'proton.models.events', + 'proton.models.label', + 'proton.models.logs', + 'proton.models.memberKeys', + 'proton.models.members', + 'proton.models.message', + 'proton.models.organization', + 'proton.models.payments', + 'proton.models.reset', + 'proton.models.setting', + 'proton.models.user', + 'proton.models', // Config - "proton.config", + 'proton.config', // Services - "proton.authentication", - "proton.pmcw", - "proton.errorReporter", - "proton.networkActivity", - "proton.messages", - "proton.messages.counts", - "proton.modals", - "proton.attachments", - "proton.tools", - "proton.contacts", - "proton.event", + 'proton.actions', + 'proton.attachments', + 'proton.authentication', + 'proton.cache', + 'proton.errorReporter', + 'proton.event', + 'proton.modals', + 'proton.networkActivity', + 'proton.pmcw', + 'proton.tools', // Directives - "proton.tooltip", - "proton.emailField", - "proton.enter", - "proton.delayedPassword", - "proton.fieldMatch", - "proton.fieldFocus", - "proton.squire", - "proton.locationTag", - "proton.dropzone", - "proton.labels", - "proton.countdown", + 'proton.autocomplete', + 'proton.card', + 'proton.drag', + 'proton.dropdown', + 'proton.dropzone', + 'proton.enter', + 'proton.height', + 'proton.heightOutside', + 'proton.labelHeight', + 'proton.labels', + 'proton.loaderTag', + 'proton.locationTag', + 'proton.maxComposerHeight', + 'proton.move', + 'proton.phone', + 'proton.responsiveComposer', + 'proton.sidebarHeight', + 'proton.squire', + 'proton.time', + 'proton.toggle', + 'proton.tooltip', + 'proton.transformation', + 'proton.translate', + 'proton.wizard', // Filters - "proton.filters.strings", + 'proton.filters', // Controllers - "proton.controllers.Account", - "proton.controllers.Admin", - "proton.controllers.Auth", - "proton.controllers.Bug", - "proton.controllers.Contacts", - "proton.controllers.Header", - "proton.controllers.Messages", - "proton.controllers.Messages.List", - "proton.controllers.Messages.View", - "proton.controllers.Messages.Compose", - "proton.controllers.Outside", - "proton.controllers.Search", - "proton.controllers.Settings", - "proton.controllers.Sidebar", - "proton.controllers.Signup", - "proton.controllers.Support", - "proton.controllers.Upgrade", - "proton.controllers.Wizard", - - // Translations - "proton.translations" + 'proton.controllers.Setup', + 'proton.controllers.Auth', + 'proton.controllers.Contacts', + 'proton.controllers.Header', + 'proton.controllers.Conversation', + 'proton.controllers.Conversations', + 'proton.controllers.Message', + 'proton.controllers.Compose', + 'proton.controllers.Outside', + 'proton.controllers.Secured', + 'proton.controllers.Settings', + 'proton.controllers.Sidebar', + 'proton.controllers.Signup', + 'proton.controllers.Support', + 'proton.controllers.Upgrade' ]) +/** + * Check if the current browser owns some requirements + */ +.config(function() { + var is_good_prng_available = function() { + if (typeof window !== 'undefined' && window.crypto && window.crypto.getRandomValues) { + return true; + } else if (typeof window !== 'undefined' && typeof window.msCrypto === 'object' && typeof window.msCrypto.getRandomValues === 'function') { + return true; + } else { + return false; + } + }; + + var isSessionStorage_available = function() { + return (typeof(sessionStorage) !== 'undefined'); + }; + + if(isSessionStorage_available() === false) { + alert('Error: sessionStorage is required to use ProtonMail.'); + setTimeout( function() { + window.location = 'https://protonmail.com/support/knowledge-base/sessionstorage/'; + }, 1000); + } + + if(is_good_prng_available() === false) { + alert('Error: a PRNG is required to use ProtonMail.'); + setTimeout( function() { + window.location = 'https://protonmail.com/support/knowledge-base/prng/'; + }, 1000); + } +}) + // Set base url from grunt config .provider('url', function urlProvider() { var base; @@ -113,59 +159,115 @@ angular.module("proton", [ urlProvider.setBaseUrl(CONFIG.apiUrl); }) +.run(function (CONFIG, gettextCatalog) { + var locale = window.navigator.userLanguage || window.navigator.language; + + gettextCatalog.setCurrentLanguage('en_US'); + gettextCatalog.debug = CONFIG.debug || false; + moment.locale(locale); +}) + +.run(function(CONSTANTS) { + // This function clears junk from session storage. Should not be needed forever + try { + var whitelist = [ + CONSTANTS.EVENT_ID, + CONSTANTS.MAILBOX_PASSWORD_KEY, + CONSTANTS.OAUTH_KEY + ':SessionToken', + CONSTANTS.OAUTH_KEY + ':Uid', + CONSTANTS.OAUTH_KEY + ':AccessToken', + CONSTANTS.OAUTH_KEY + ':RefreshToken', + 'proton:decrypted_token', + 'proton:encrypted_password' + ]; + + var data = {}; + + for(var i = 0; i < whitelist.length; i++) { + var item = window.sessionStorage.getItem(whitelist[i]); + + if( angular.isString(item) ) { + data[whitelist[i]] = item; + } + } + + window.sessionStorage.clear(); + + for (var key in data) { + window.sessionStorage.setItem(key, data[key]); + } + } + catch(err) { + // Do nothing, session storage support checked for elsewhere + } +}) .run(function( $document, $rootScope, + $state, + $timeout, + $window, + authentication, networkActivityTracker, + CONSTANTS, notify, - $state, - tools, - authentication + tools ) { - $(window).bind('resize load', function() { - $rootScope.isMobile = (/Android|webOS|iPhone|iPad|iPod|BlackBerry|IEMobile|Opera Mini/i.test(navigator.userAgent) || $(window).width() < 500) ? true : false; - }); - $(window).bind('load', function() { - if (window.location.hash==='#spin') { - $('body').append(''); + angular.element($window).bind('load', function() { + // Enable FastClick + FastClick.attach(document.body); + + if (window.location.hash==='#spin-me-right-round') { + $('body').append(''); } }); - $rootScope.firstNameOnly = function() { - var firstNameOnly; - - if(authentication.user) { - firstNameOnly = authentication.user.DisplayName; - } else { - firstNameOnly = $rootScope.tempUser.username; + // Less than 1030 / Tablet Mode + // can pass in show (true/false) to explicity show/hide + $rootScope.$on('sidebarMobileToggle', function(event, show) { + if (typeof show !== "undefined") { + $rootScope.showSidebar = show; } + else { + $rootScope.showSidebar = !$rootScope.showSidebar; + } + }); - return firstNameOnly; - }; - - $rootScope.browser = tools.getBrowser; + $rootScope.mobileMode = false; + $rootScope.sidebarMode = true; + $rootScope.showWelcome = true; + $rootScope.welcome = false; + $rootScope.browser = tools.getBrowser(); $rootScope.terminal = false; - $rootScope.updateMessage = false; - - var pageTitleTemplate = _.template( - "<% if (pageName) { %>" + - "${ _.string.capitalize(pageName) }" + - "<% if (unreadCount) { %>" + - " ( ${unreadCount} )" + - "<% } %> " + - "· " + - "<% } %>" + - "ProtonMail" - ); - $rootScope.$watchGroup(["pageName", "unreadCount"], function(values) { - $document.find("title").html(pageTitleTemplate({ - pageName: values[0], - unreadCount: values[1] - })); + //$rootScope.updateMessage = false; + $rootScope.showSidebar = false; + $rootScope.themeJason = false; + $rootScope.isLoggedIn = authentication.isLoggedIn(); + $rootScope.isLocked = authentication.isLocked(); + $rootScope.isSecure = authentication.isSecured(); + + // SVG Polyfill for Edge + svg4everybody(); + svgeezy.init(false, 'png'); + + // Set new relative time thresholds + moment.relativeTimeThreshold('s', 59); // s seconds least number of seconds to be considered a minute + moment.relativeTimeThreshold('m', 59); // m minutes least number of minutes to be considered an hour + moment.relativeTimeThreshold('h', 23); // h hours least number of hours to be considered a day + + // Manage page title + $rootScope.$watch('pageName', function(newVal, oldVal) { + if(newVal) { + $document.find("title").text(newVal + ' | ProtonMail'); + } else { + $document.find("title").text('ProtonMail'); + } }); + $rootScope.networkActivity = networkActivityTracker; $rootScope.toggleSidebar = false; + // notification service config // https://github.com/cgross/angular-notify notify.config({ @@ -174,82 +276,168 @@ angular.module("proton", [ position: 'center', maximumOpen: 5 }); + + $rootScope.mobileResponsive = function() { + var bodyWidth = $('body').outerWidth(); + + // Force Mobile + if ( bodyWidth > CONSTANTS.MOBILE_BREAKPOINT ) { + $rootScope.mobileMode = false; + if (authentication.user && authentication.user.ViewLayout===0 && $rootScope.rowMode) { + $rootScope.rowMode = false; + $rootScope.layoutMode = 'columns'; + } + else if (authentication.user && authentication.user.ViewLayout===1) { + $rootScope.rowMode = true; + $rootScope.layoutMode = 'rows'; + } + } + else if ( bodyWidth <= CONSTANTS.MOBILE_BREAKPOINT ) { + $rootScope.mobileMode = true; + $rootScope.rowMode = false; + $rootScope.layoutMode = 'columns'; + $rootScope.$broadcast('tourEnd'); + } + }; + + angular.element($window).bind('resize', $window._.debounce(function() { + $rootScope.mobileResponsive(); + }, 30)); + angular.element($window).bind('orientationchange', $rootScope.mobileResponsive()); + + $rootScope.mobileResponsive(); + }) // // Redirection if not authentified // .factory('authHttpResponseInterceptor', function($q, $injector, $rootScope) { + var notification = false; + var upgrade_notification = false; + return { response: function(response) { - if (response.data.Code!==undefined) { + // Close notification if Internet wake up + if (notification) { + notification.close(); + notification = false; + } + + if (angular.isDefined(response.data) && angular.isDefined(response.data.Code)) { // app update needd - if (response.data.Code===5003) { - if ($rootScope.updateMessage===false) { - $rootScope.updateMessage = true; - $injector.get('notify')({ - classes: 'notification-info', - message: 'A new version of ProtonMail is available. Logout and log back in to automatically update.', - duration: 10000 - }); - setTimeout( function() { - $rootScope.updateMessage = false; - }, 11000); + if (response.data.Code === 5003) { + if ( upgrade_notification ) { + upgrade_notification.close(); } + + upgrade_notification = $injector.get('notify')({ + classes: 'notification-info noclose', + message: 'A new version of ProtonMail is available. Please refresh this page and then logout and log back in to automatically update.', + duration: '0' + }); } - else if(response.data.Code===5004) { + else if(response.data.Code === 5004) { $injector.get('notify')({ classes: 'notification-danger', message: 'Non-integer API version requested.' }); } // unsupported api - else if (response.data.Code===5005) { + else if (response.data.Code === 5005) { $injector.get('notify')({ classes: 'notification-danger', message: 'Unsupported API version.' }); } // site offline - else if (response.data.Code===7001) { + else if (response.data.Code === 7001) { $injector.get('notify')({ classes: 'notification-info', message: 'The ProtonMail API is offline: '+response.data.ErrorDescription }); } } + return response || $q.when(response); }, responseError: function(rejection) { - // console.log(rejection); - // console.log(rejection.config); - if (rejection.status === 401) { - if ($rootScope.doRefresh===true) { + if(rejection.status === 0 || rejection.status === -1) { + if(navigator.onLine === true) { + notification = $injector.get('notify')({ + message: 'Could not connect to server.', + classes: 'notification-danger' + }); + } else { + notification = $injector.get('notify')({ + message: 'Not connected to Internet.', + classes: 'notification-danger' + }); + } + } else if (rejection.status === 401) { + if ($rootScope.doRefresh === true) { $rootScope.doRefresh = false; $injector.get('authentication').getRefreshCookie() .then( function() { var $http = $injector.get('$http'); - // console.log(rejection.config); - // rejection.config.headers.common['x-pm-session'] + _.extend(rejection.config.headers, $http.defaults.headers.common); return $http(rejection.config); }, function() { - $injector.get('authentication').logout(); - $injector.get('$state').go('login'); + $injector.get('authentication').logout(true, false); } ); + } else { + $injector.get('authentication').logout(true, false); } - else { - $injector.get('authentication').logout(); - $injector.get('$state').go('login'); - } + } else if (rejection.status === 403) { + var $http = $injector.get('$http'); + var loginPasswordModal = $injector.get('loginPasswordModal'); + var User = $injector.get('User'); + var notify = $injector.get('notify'); + var eventManager = $injector.get('eventManager'); + var deferred = $q.defer(); + + // Open the open to enter login password because this request require lock scope + loginPasswordModal.activate({ + params: { + submit: function(loginPassword) { + // Send request to unlock the current session for administrator privileges + User.unlock({Password: loginPassword}) + .then(function(result) { + if (result.data && result.data.Code === 1000) { + // Close the modal + loginPasswordModal.deactivate(); + // Resend request now + deferred.resolve($http(rejection.config)); + } else if (result.data && result.data.Error) { + notify({message: result.data.Error, classes: 'notification-danger'}); + deferred.reject(); + } + }); + }, + cancel: function() { + loginPasswordModal.deactivate(); + deferred.reject(); + } + } + }); + + return deferred.promise; + } else if (rejection.status === 504) { // Time-out + notification = $injector.get('notify')({ + message: 'Please retry.', + classes: 'notification-danger' + }); } + return $q.reject(rejection); } }; }) + .config(function($httpProvider, CONFIG) { //Http Intercpetor to check auth failures for xhr requests $httpProvider.interceptors.push('authHttpResponseInterceptor'); @@ -267,34 +455,25 @@ angular.module("proton", [ $httpProvider.defaults.headers.get['Cache-Control'] = 'no-cache'; $httpProvider.defaults.headers.get.Pragma = 'no-cache'; }) -.run(function($rootScope, $location, $state, authentication, $log) { +.run(function($rootScope, $location, $state, authentication, $log, $timeout, networkActivityTracker) { $rootScope.$on('$stateChangeStart', function(event, toState, toParams, fromState, fromParams) { + + networkActivityTracker.clear(); + var isLogin = (toState.name === "login"); var isUpgrade = (toState.name === "upgrade"); - var isSupport = (toState.name.includes("support.")); + var isSupport = (toState.name.includes("support")); var isAccount = (toState.name === "account"); var isSignup = (toState.name === "signup" || toState.name === "step1" || toState.name === "step2" || toState.name === "pre-invite"); var isUnlock = (toState.name === "login.unlock"); var isOutside = (toState.name.includes("eo")); var isReset = (toState.name.includes("reset")); - $log.debug(toState.name); - $log.debug('isLoggedIn',$rootScope.isLoggedIn); - $log.debug('isLocked',$rootScope.isLocked); - if (isUnlock && $rootScope.isLoggedIn) { $log.debug('appjs:(isUnlock && $rootScope.isLoggedIn)'); return; } - // If already logged in and on the login page: redirect to unlock page - else if ($rootScope.isLoggedIn && isLogin) { - $log.debug('appjs:($rootScope.isLoggedIn && isLogin)'); - event.preventDefault(); - $state.go('secured.inbox'); - return; - } - // If already logged in and unlocked and on the unlock page: redirect to inbox else if ($rootScope.isLoggedIn && !$rootScope.isLocked && isUnlock) { $log.debug('appjs:($rootScope.isLoggedIn && !$rootScope.isLocked && isUnlock)'); @@ -317,6 +496,9 @@ angular.module("proton", [ }); $rootScope.$on('$stateChangeSuccess', function(event, toState, toParams, fromState, fromParams) { + // Change page name + $rootScope.$broadcast('updatePageName'); + // Hide all the tooltip $('.tooltip').not(this).hide(); @@ -324,15 +506,14 @@ angular.module("proton", [ $(".navbar-toggle").click(); $rootScope.toState = toState.name.replace(".", "-"); - if ($rootScope.scrollToBottom===true) { - setTimeout(function() { - $('#content').animate({ - scrollTop: $("#pageBottom").offset().top - }, 1); - }, 10); - $rootScope.scrollToBottom = false; - } - $('#loading').remove(); + + $('#loading_pm, #pm_slow, #pm_slow2').remove(); + + $timeout( function() { + $rootScope.mobileResponsive(); + $rootScope.showSidebar = false; + }, 30); + }); }) @@ -359,53 +540,7 @@ angular.module("proton", [ .run(function($log) { $log.info('Find a security bug? security@protonmail.ch'); - $log.info('We\'re hiring! https://protonmail.ch/pages/join-us.html'); -}) - -// -// Setup keyboard bindings -// - -.run(function( - $state, - $stateParams -) { - // Mousetrap.bind(["ctrl+n", "c"], function() { - // if ($state.includes("secured.**")) { - // $state.go("secured.compose"); - // } - // }); - // Mousetrap.bind(["i"], function() { - // if ($state.includes("secured.**")) { - // $state.go("secured.inbox"); - // } - // }); - // Mousetrap.bind(["s"], function() { - // if ($state.includes("secured.**")) { - // $state.go("secured.starred"); - // } - // }); - // Mousetrap.bind(["d"], function() { - // if ($state.includes("secured.**")) { - // $state.go("secured.drafts"); - // } - // }); - // Mousetrap.bind("r", function() { - // if ($state.includes("secured.*.message")) { - // $state.go("secured.reply", { - // action: 'reply', - // id: $stateParams.ID - // }); - // } - // }); - // Mousetrap.bind("f", function() { - // if ($state.includes("secured.*.message")) { - // $state.go("secured.reply", { - // action: 'forward', - // id: $stateParams.ID - // }); - // } - // }); + $log.info('We\'re hiring! https://protonmail.com/careers'); }) // @@ -413,8 +548,17 @@ angular.module("proton", [ // .config(['pikadayConfigProvider', function(pikaday) { + var format; + var language = window.navigator.userLanguage || window.navigator.language; + + if(language === 'en-US') { + format = 'MM/DD/YYYY'; + } else { + format = 'DD/MM/YYYY'; + } + pikaday.setConfig({ - format: "MM/DD/YYYY" + format: format }); }]) @@ -438,24 +582,67 @@ angular.module("proton", [ $logProvider.debugEnabled(debugInfo); }) -.run(function($rootScope) { - // Set build config - $rootScope.build = { - "version":"2.0", - "notes":"http://protonmail.dev/blog/", - "date":"17 Apr. 2015" - }; +.run(function($rootScope, CONFIG) { + $rootScope.app_version = CONFIG.app_version; + $rootScope.date_version = CONFIG.date_version; + $rootScope.isFileSaverSupported = !!(('download' in document.createElement('a')) || navigator.msSaveOrOpenBlob); }) // // Handle some application exceptions // -.factory('$exceptionHandler', function($injector) { +.factory('$exceptionHandler', function($log, $injector, CONFIG) { // function($injector, $log) { + var n_reports = 0; return function(exception, cause) { - var errorReporter = $injector.get("errorReporter"); - if (exception.message.indexOf("$sanitize:badparse") >= 0) { - errorReporter.notify("There was an error while trying to display this message.", exception); + n_reports++; + $log.error( exception ); + + if ( n_reports < 6 ) { + var debug; + if ( exception instanceof Error ) { + debug = { 'message': exception.message, 'stack': exception.stack }; + } + else if ( angular.isString( exception ) ) { + debug = exception; + } + else { + try { + var json = angular.toJson( exception ); + if ( $.isEmptyObject( json ) ) { + debug = exception.toString(); + } + else { + debug = exception; + } + } + catch(err) { + debug = err.message; + } + } + + try { + var url = $injector.get("url"); + var $http = $injector.get("$http"); + var tools = $injector.get("tools"); + var $state = $injector.get("$state"); + var crashData = { + OS: tools.getOs, + OSVersion: '', + Browser: tools.getBrowser, + BrowserVersion: tools.getBrowserVersion, + Client: 'Angular', + ClientVersion: CONFIG.app_version, + Debug: { 'state': $state.$current.name, 'error': debug }, + }; + crashPromise = $http.post( url.get() + '/bugs/crash', crashData ) + .catch(function(err) { + // Do nothing + }); + } + catch(err) { + // Do nothing + } } }; }); diff --git a/src/app/config.js b/src/app/config.js old mode 100755 new mode 100644 index 50aa55e..11f19c6 --- a/src/app/config.js +++ b/src/app/config.js @@ -1,5 +1,5 @@ angular.module('proton.config', []) -.constant('CONFIG', {debug:true,apiUrl:'https://dev.protonmail.ch/api',app_version:'2.0.5',api_version:'1',clientID:'Angular',clientSecret:'00a11965ac0b47782ec7359c5af4dd79'}) +.constant('CONFIG', {debug:true,apiUrl:'https://dev.protonmail.com/api',app_version:'3.1.7',api_version:'1',date_version:'Fri Apr 15 2016',clientID:'Angular',clientSecret:'00a11965ac0b47782ec7359c5af4dd79'}) ; \ No newline at end of file diff --git a/src/app/constants.js b/src/app/constants.js old mode 100755 new mode 100644 index f325d59..5a6dc3d --- a/src/app/constants.js +++ b/src/app/constants.js @@ -4,39 +4,50 @@ angular.module('proton.constants', []) // Constants definition // .constant('CONSTANTS', { + TIMEOUT: 30 * 1000, // timeout in milliseconds + BASE_SIZE: 1024, // define the base used for byte MAILBOX_PASSWORD_KEY: "proton:mailbox_pwd", OAUTH_KEY: "proton:oauth", EVENT_ID: "proton:eventid", - ATTACHMENT_SIZE_LIMIT: 15, // MB - ATTACHMENT_NUMBER_LIMIT: 50, - MAX_TITLE_LENGTH: 250, + FREE_USER: 0, + PAID_MEMBER: 1, + PAID_ADMIN: 2, + ATTACHMENT_SIZE_LIMIT: 25, // MB + ATTACHMENT_NUMBER_LIMIT: 100, + MAX_TITLE_LENGTH: 255, MAX_NUMBER_COMPOSER: 3, - NUMBER_OF_MESSAGES_PRELOADING: 5, + MESSAGE_LIMIT: 100, + CONVERSATION_LIMIT: 100, ENC_NONE: 0, ENC_INTERNAL: 1, // all within ProtonMail ENC_EXTERNAL: 2, // encrypted from outside ENC_OUT_ENC: 3, // encrypted for outside ENC_OUT_PLAIN: 4, // sent plain but stored enc ENC_STORED_ENC: 5, // such as draft - INTERVAL_EVENT_TIMER: 15000, // time between querying the event log + INTERVAL_EVENT_TIMER: 30 * 1000, // time between querying the event log (every 30 seconds) TIMEOUT_PRELOAD_MESSAGE: 500, // milliseconds - UPLOAD_GRADIENT_DARK: '134, 132, 191', // dark rgb color for upload progress bar - UPLOAD_GRADIENT_LIGHT: '147, 145, 209', // light rgb color for upload progress bar + UPLOAD_GRADIENT_DARK: '147, 145, 209', // dark rgb color for upload progress bar + UPLOAD_GRADIENT_LIGHT: '255, 255, 255', // light rgb color for upload progress bar ENC_OUT_ENC_REPLY: 6, // encrypted for outside SAVE_TIMEOUT_TIME: 2000, // 2 seconds MAX_EXPIRATION_TIME: 672, // hours - MESSAGES_PER_PAGE: 50, + ELEMENTS_PER_PAGE: 50, COUNT_UNREAD_INTERVAL_TIME: 20000, // 20 seconds - LOGIN_PW_MAX_LEN: 250, + LOGIN_PW_MAX_LEN: 500, + HD_BREAKPOINT: 1920, + DESKTOP_BREAKPOINT: 1200, + ROW_BREAKPOINT: 960, + MOBILE_BREAKPOINT: 800, + WIZARD_ENABLED: true, // true / false MAILBOX_IDENTIFIERS: { - "inbox": 0, - "drafts": 1, - "sent": 2, // outbox - "trash": 3, - "spam": 4, - "starred": 5, - "archive": 6, - "search": 7, - "label": 8 + inbox: '0', + drafts: '1', + sent: '2', // outbox + trash: '3', + spam: '4', + starred: '10', + archive: '6', + search: '7', + label: '8' } }); diff --git a/src/app/controllers/account.js b/src/app/controllers/account.js deleted file mode 100755 index a138ba1..0000000 --- a/src/app/controllers/account.js +++ /dev/null @@ -1,307 +0,0 @@ -angular.module("proton.controllers.Account", ["proton.tools"]) - -.controller("AccountController", function( - $scope, - $rootScope, - $state, - $stateParams, - $log, - $translate, - $q, - $timeout, - $http, - CONSTANTS, - authentication, - networkActivityTracker, - User, - Reset, - pmcw, - tools, - notify, - token -) { - var mellt = new Mellt(); - - $scope.initialization = function() { - $log.debug('AccountController:initialization'); - // Variables - $scope.tools = tools; - $scope.compatibility = tools.isCompatible(); - - $scope.creating = false; - $scope.genNewKeys = false; - $scope.createUser = false; - $scope.logUserIn = false; - $scope.decryptAccessToken = false; - $scope.mailboxLogin = false; - $scope.getUserInfo = false; - $scope.finishCreation = false; - - $scope.account = []; - $scope.resetMailboxToken = $rootScope.resetMailboxToken; - $scope.showForm = ($scope.resetMailboxToken!==undefined) ? true : false; - if ($rootScope.tempUser===undefined) { - $rootScope.tempUser = []; - } - - if(angular.isDefined(token) && angular.isDefined(token.data)) { - $scope.resetToken = token.data.AccessToken; - $scope.resetUID = token.data.Uid; - } - }; - - // --------------------------------------------------- - // --------------------------------------------------- - // Reset Functions - // --------------------------------------------------- - // --------------------------------------------------- - - $scope.generateNewKeys = function() { - $log.debug('generateNewKeys'); - $scope.genNewKeys = true; - var mbpw; - if ($scope.account.mailboxPasswordConfirm!==undefined) { - mbpw = $scope.account.mailboxPasswordConfirm; - } - else if ($scope.account.mailboxPassword!==undefined) { - mbpw = $scope.account.mailboxPassword; - } - return $scope.generateKeys('UserID', mbpw); - }; - - $scope.generateKeys = function(userID, pass) { - var deferred = $q.defer(); - - $log.debug('generateKeys'); - - pmcw.generateKeysRSA(userID, pass).then( - function(response) { - $log.debug(response); - $scope.account.PublicKey = response.publicKeyArmored; - $scope.account.PrivateKey = response.privateKeyArmored; - $log.debug('pmcw.generateKeysRSA:resolved'); - deferred.resolve(response); - }, - function(err) { - $log.error(err); - $scope.error = err; - deferred.reject(err); - } - ); - - return deferred.promise; - }; - - $scope.resetMailbox = function(form) { - $log.debug('resetMailbox'); - if (form.$valid) { - $log.debug('resetMailbox:formvalid'); - if ( - $rootScope.resetMailboxToken===undefined && - $scope.resetMailboxToken===undefined - ) { - notify({ - classes: "notification-danger", - message: 'Missing reset token.' - }); - return; - } - networkActivityTracker.track( - $scope.generateNewKeys() - .then( $scope.newMailbox ) - .then( $scope.resetMailboxTokenResponse ) - .then( $scope.doLogUserIn ) - .then( $scope.doDecryptAccessToken ) - .then( $scope.doMailboxLogin ) - .then( $scope.finishRedirect ) - .catch( function(err) { - $log.error(err); - notify({ - classes: "notification-danger", - message: errr - }); - }) - ); - } - }; - - $scope.doLogUserIn = function(response) { - $log.debug('doLogUserIn', response); - $log.debug( - $rootScope.tempUser.username, - $rootScope.tempUser.password - ); - return authentication.loginWithCredentials({ - Username: $rootScope.tempUser.username, - Password: $rootScope.tempUser.password - }); - }; - - $scope.doDecryptAccessToken = function(response) { - $log.debug('doDecryptAccessToken', response); - $scope.authResponse = response.data; - $scope.decryptAccessToken = true; - return pmcw.decryptPrivateKey( - $scope.authResponse.EncPrivateKey, - $scope.account.mailboxPassword - ); - }; - - $scope.doMailboxLogin = function() { - $log.debug('doMailboxLogin'); - $scope.mailboxLogin = true; - return authentication.unlockWithPassword( - $scope.authResponse.EncPrivateKey, - $scope.account.mailboxPassword, - $scope.authResponse.AccessToken, - $scope.authResponse - ).then( - function(response) { - $log.debug('doMailboxLogin:unlockWithPassword:',response); - return authentication.setAuthCookie() - .then( - function(resp) { - $log.debug('setAuthCookie:resp'+resp); - window.sessionStorage.setItem(CONSTANTS.MAILBOX_PASSWORD_KEY, pmcw.encode_utf8_base64($scope.account.mailboxPassword)); - $state.go("secured.inbox"); - } - ); - } - ); - }; - - $scope.finishRedirect = function() { - $log.debug('finishRedirect'); - var deferred = $q.defer(); - $scope.finishCreation = true; - $rootScope.isLoggedIn = true; - window.sessionStorage.setItem( - CONSTANTS.MAILBOX_PASSWORD_KEY, - pmcw.encode_utf8_base64($scope.account.mailboxPassword) - ); - // delete $rootScope.tempUser; - // TODO: not all promises are resolved, so we simply refresh. - $state.go('secured.inbox'); - deferred.resolve(200); - return deferred.promise; - }; - - $scope.verifyResetCode = function(form) { - $log.debug('verifyResetCode'); - if ( - angular.isUndefined($scope.account.resetMbCode) || - $scope.account.resetMbCode.length === 0 - ) { - notify('Verification Code required'); - } - else { - Reset.validateResetToken({ - username: $rootScope.tempUser.username, - token: $scope.account.resetMbCode - }) - .then( function(response) { - if (response.data.Code!==1000) { - notify({ - classes: 'notification-danger', - message: 'Invalid Verification Code.' - }); - } - else { - $scope.resetMailboxToken = $scope.account.resetMbCode; - $scope.showForm = true; - $scope.showEmailMessage = false; - } - }); - } - }; - - $scope.resetMailboxInit = function() { - $log.debug('resetMailboxInit'); - $log.info(token); - $http.defaults.headers.common.Authorization = "Bearer " + token.data.AccessToken; - $http.defaults.headers.common["x-pm-uid"] = token.data.Uid; - - var getMBToken = function() { - $log.debug('getMBToken'); - return Reset.getMailboxResetToken({}); - }; - var tokenResponse = function(response) { - $log.debug('tokenResponse', response); - var deferred = $q.defer(); - if (response.data.Error || response.data.Code !== 1000) { - notify(response); - $log.error(response); - deferred.reject(response.data.Error); - } - else { - if (response.data.Token) { - $log.debug('No reset email. token received.'); - $scope.resetMailboxToken = response.data.Token; - $scope.showForm = true; - deferred.resolve(200); - } - else { - $log.debug('Check email for token..'); - $scope.showEmailMessage = true; - deferred.resolve(200); - } - } - return deferred.promise; - }; - networkActivityTracker.track( - getMBToken() - .then( tokenResponse ) - ); - }; - - $scope.newMailbox = function() { - $log.debug('newMailbox'); - var resetMBtoken; - if ($rootScope.resetMailboxToken!==undefined) { - resetMBtoken = $rootScope.resetMailboxToken; - } - if ($scope.resetMailboxToken!==undefined) { - resetMBtoken = $scope.resetMailboxToken; - } - var params = { - "PublicKey": $scope.account.PublicKey, - "PrivateKey": $scope.account.PrivateKey, - "Token": resetMBtoken - }; - return Reset.resetMailbox(params); - }; - - $scope.resetMailboxTokenResponse = function(response) { - $log.debug('resetMailboxTokenResponse'); - var promise = $q.defer(); - if (response.status !== 200) { - notify({ - classes: "notification-danger", - message: 'Error, try again in a few minutes.' - }); - $scope.startGen = false; - promise.reject('Error, try again in a few minutes.'); - } - else if (response.data.Error) { - if (response.data.ErrorDescription!=='') { - notify(response.data.ErrorDescription); - $log.error(response); - $scope.startGen = false; - promise.reject(response.data.ErrorDescription); - } - else { - notify(response); - $log.error(response); - $scope.startGen = false; - promise.reject(response); - } - } - else { - promise.resolve(200); - } - return promise; - }; - - $scope.initialization(); - -}); diff --git a/src/app/controllers/admin.js b/src/app/controllers/admin.js deleted file mode 100755 index 072ed3a..0000000 --- a/src/app/controllers/admin.js +++ /dev/null @@ -1,150 +0,0 @@ -// UNUSED. TODO: clean these up as they are a separate repository now - -angular.module("proton.controllers.Admin", [ - "proton.modals" -]) - -.controller("AdminController", function( - $scope, - alertModal -) { - $scope.formData = {}; - - $scope.inputType = function(input) { - if ((input % 1) === 0) { - return "userID"; - } else if (input.indexOf("@") > (-1)) { - return "email"; - } else { - return "username"; - } - }; - - $scope.adminLookup = function(inputType) { - var input = $scope.formData.userLookup; - - switch (inputType) { - case "userID": - alert("You entered UserID " + input); - break; - case "email": - alert("You entered notification email " + input); - break; - case "username": - alert("You entered username " + input); - break; - } - - $scope.formData.userLookup = ""; - }; - - $scope.adminDelete = function(inputType) { - var input = $scope.formData.userDelete; - - switch (inputType) { - case "userID": - alert("You deleted UserID " + input); - break; - case "email": - alert("You deleted notification email " + input); - break; - case "username": - alert("You deleted username " + input); - break; - } - - $scope.formData.userDelete = ""; - }; - - $scope.adminPwdReset = function(inputType) { - var input = $scope.formData.userReset; - - switch (inputType) { - case "userID": - alert("You entered UserID " + input); - break; - case "email": - alert("You entered notification email " + input); - break; - case "username": - alert("You entered username " + input); - break; - } - - $scope.formData.userReset = ""; - }; - - $scope.inviteLookup = function(inputType) { - var input = $scope.formData.inviteLookup; - - switch (inputType) { - case "userID": - alert("You entered UserID " + input); - break; - case "email": - alert("You entered notification email " + input); - break; - case "username": - alert("You entered username " + input); - break; - } - - $scope.formData.inviteLookup = ""; - }; - - $scope.inviteUnsend = function(inputType) { - var input = $scope.formData.userUnsend; - - switch (inputType) { - case "userID": - alert("You entered UserID " + input); - break; - case "email": - alert("You entered notification email " + input); - break; - case "username": - alert("You entered username " + input); - break; - } - - $scope.formData.userUnsend = ""; - }; - - $scope.inviteUpdateEmail = function(inputType) { - var input = $scope.formData.userUpdated; - - switch (inputType) { - case "userID": - alert("You entered UserID " + input); - break; - case "email": - alert("You entered notification email " + input); - break; - case "username": - alert("You entered username " + input); - break; - } - - $scope.formData.userUpdated = ""; - $scope.formData.notification_email = null; - }; - - $scope.inviteUser = function(inputType) { - var input = $scope.formData.userInvite; - - switch (inputType) { - case "userID": - alert("You invited UserID " + input); - break; - case "email": - alert("You invited notification email " + input); - break; - case "username": - alert("You invited username " + input); - break; - } - - $scope.formData.userInvite = ""; - this.userInvite = ""; - }; -}); diff --git a/src/app/controllers/bug.js b/src/app/controllers/bug.js deleted file mode 100755 index 20b1b01..0000000 --- a/src/app/controllers/bug.js +++ /dev/null @@ -1,79 +0,0 @@ -angular.module("proton.controllers.Bug", []) - -.controller("BugController", function( - $scope, - $rootScope, - $state, - $log, - $translate, - authentication, - tools, - Bug, - networkActivityTracker, - notify, - CONFIG -) { - var modalId = 'bugForm'; - - $scope.initialization = function() { - // $log.debug($state); - var Username = (!$rootScope.isLocked && authentication.user !== undefined && authentication.user.Name !== undefined) ? authentication.user.Name : ''; - $scope.useragent = angular.element('html').attr('class'); - $scope.bug = { - OS: tools.getOs, - OSVersion: '', - Browser: tools.getBrowser, - BrowserVersion: tools.getBrowserVersion, - Client: 'Angular', - ClientVersion: CONFIG.app_version, - Title: '[Angular] Bug ['+$state.$current.name+ ']', - Description: '', - Username: Username, - Email: '' - }; - // $log.debug($scope.bug); - }; - - $scope.open = function() { - $scope.initialization(); - $('#' + modalId).modal('show'); - $('#bug_os').focus(); - }; - - $scope.close = function() { - $('#' + modalId).modal('hide'); - }; - - $scope.sendBugReport = function(form) { - - $log.debug('sendBugReport'); - - $log.info($scope.bug); - - var bugPromise = Bug.report($scope.bug); - - $log.debug('sendBugReport'); - - bugPromise.then( - function(response) { - $log.debug(response); - if(angular.isUndefined(response.data.Error)) { - $scope.close(); - notify($translate.instant('BUG_REPORTED')); - } - return response; - }, - function(err) { - $log.error(err); - } - ); - - networkActivityTracker.track(bugPromise); - }; - - $scope.$on('openReportModal', function() { - $log.debug('openReportModal:open'); - $scope.open(); - }); - -}); diff --git a/src/app/controllers/compose.js b/src/app/controllers/compose.js new file mode 100644 index 0000000..6ca4758 --- /dev/null +++ b/src/app/controllers/compose.js @@ -0,0 +1,1601 @@ +angular.module("proton.controllers.Compose", ["proton.constants"]) + +.controller("ComposeMessageController", function( + $filter, + $interval, + $log, + $q, + $rootScope, + $scope, + $state, + $stateParams, + $timeout, + gettextCatalog, + action, + Attachment, + attachments, + authentication, + cache, + confirmModal, + CONSTANTS, + Contact, + Message, + networkActivityTracker, + notify, + pmcw, + tools, + User +) { + // Variables + var promiseComposerStyle; + var timeoutStyle; + var dropzone; + + $scope.addresses = authentication.user.Addresses; + $scope.messages = []; + $scope.isOver = false; + $scope.queuedSave = false; + $scope.preventDropbox = false; + $scope.maxExpiration = CONSTANTS.MAX_EXPIRATION_TIME; + $scope.uid = 1; + $scope.isAppleDevice = navigator.userAgent.match(/(iPod|iPhone|iPad)/); // Determine if user navigated from Apple device + $scope.oldProperties = ['Subject', 'ToList', 'CCList', 'BCCList', 'Body', 'PasswordHint', 'IsEncrypted', 'Attachments', 'ExpirationTime']; + $scope.numTags = []; + $scope.weekOptions = [ + {label: '0', value: 0}, + {label: '1', value: 1}, + {label: '2', value: 2}, + {label: '3', value: 3}, + {label: '4', value: 4} + ]; + $scope.dayOptions = [ + {label: '0', value: 0}, + {label: '1', value: 1}, + {label: '2', value: 2}, + {label: '3', value: 3}, + {label: '4', value: 4}, + {label: '5', value: 5}, + {label: '6', value: 6} + + ]; + $scope.hourOptions = [ + {label: '0', value: 0}, + {label: '1', value: 1}, + {label: '2', value: 2}, + {label: '3', value: 3}, + {label: '4', value: 4}, + {label: '5', value: 5}, + {label: '6', value: 6}, + {label: '7', value: 7}, + {label: '8', value: 8}, + {label: '9', value: 9}, + {label: '10', value: 10}, + {label: '11', value: 11}, + {label: '12', value: 12}, + {label: '13', value: 13}, + {label: '14', value: 14}, + {label: '15', value: 15}, + {label: '16', value: 16}, + {label: '17', value: 17}, + {label: '18', value: 18}, + {label: '19', value: 19}, + {label: '20', value: 20}, + {label: '21', value: 21}, + {label: '22', value: 22}, + {label: '23', value: 23} + ]; + + // Listeners + $scope.$watch('messages.length', function(newValue, oldValue) { + if ($scope.messages.length > 0) { + $rootScope.activeComposer = true; + window.onbeforeunload = function() { + return gettextCatalog.getString('By leaving now, you will lose what you have written in this email. You can save a draft if you want to come back to it later on.', null); + }; + } else { + $rootScope.activeComposer = false; + window.onbeforeunload = undefined; + } + }); + + $scope.$on('updateUser', function(event) { + $scope.addresses = authentication.user.Addresses; + }); + + $scope.$on('onDrag', function() { + _.each($scope.messages, function(message) { + $scope.togglePanel(message, 'attachments'); + }); + }); + + // When the user delete a conversation and a message is a part of this conversation + $scope.$on('deleteConversation', function(event, ID) { + _.each($scope.messages, function(message) { + if(ID === message.ID) { + // Close the composer + $scope.close(message, false, false); + } + }); + }); + + // When a message is updated we try to update the message + $scope.$on('refreshMessage', function(event) { + _.each($scope.messages, function(message) { + if(angular.isDefined(message.ID)) { + var messageCached = cache.getMessageCached(message.ID); + + if(angular.isDefined(messageCached)) { + message.Time = messageCached.Time; + message.ConversationID = messageCached.ConversationID; + } + } + }); + }); + + $scope.$on('newMessage', function() { + if( + ($scope.messages.length >= CONSTANTS.MAX_NUMBER_COMPOSER) || + ($scope.messages.length === 1 && $rootScope.mobileMode === true) + ) { + notify({message: gettextCatalog.getString('Maximum composer reached', null, 'Error'), classes: 'notification-danger'}); + } else { + var message = new Message(); + $scope.initMessage(message, false); + } + }); + + $scope.$on('loadMessage', function(event, message, save) { + var current = _.findWhere($scope.messages, {ID: message.ID}); + var mess = new Message(_.pick(message, 'ID', 'AddressID', 'Subject', 'Body', 'From', 'ToList', 'CCList', 'BCCList', 'Attachments', 'Action', 'ParentID', 'IsRead', 'LabelIDs')); + + if(mess.NumAttachments > 0) { + mess.attachmentsToggle = true; + } else { + mess.attachmentsToggle = false; + } + + if(angular.isUndefined(current)) { + $scope.initMessage(mess, save); + } + }); + + $scope.$on('editorLoaded', function(event, element, editor) { + var composer = $(element).parents('.composer'); + var index = $('.composer').index(composer); + var message = $scope.messages[index]; + + if (message) { + message.editor = editor; + $scope.listenEditor(message); + $scope.focusComposer(message); + } + }); + + $scope.$on('editorFocussed', function(event, element, editor) { + var composer = $(element).parents('.composer'); + var index = $('.composer').index(composer); + var message = $scope.messages[index]; + + if(angular.isDefined(message) && message.editor === editor) { + $scope.focusComposer(message); + } + + $rootScope.$broadcast('composerModeChange'); + }); + + function onResize() { + $timeout.cancel(timeoutStyle); + + timeoutStyle = $timeout(function() { + $scope.composerStyle(); + }, 50); + } + + function onOrientationChange() { + _.each($scope.messages, function(message) { + $scope.focusComposer(message); + }); + } + + function onDragOver(event) { + event.preventDefault(); + $interval.cancel($scope.intervalComposer); + $interval.cancel($scope.intervalDropzone); + + $scope.intervalComposer = $interval(function() { + $scope.isOver = false; + $interval.cancel($scope.intervalComposer); + }, 100); + + if ($scope.isOver === false) { + $scope.isOver = true; + } + } + + function onDragEnter(event) { + $scope.isOver = true; + $scope.$apply(); + } + + function onDragStart(event) { + $scope.preventDropbox = true; + } + + function onMouseOver(event) { + if($scope.isOver === true) { + $scope.isOver = false; + } + } + + function onDragEnd(event) { + event.preventDefault(); + $scope.preventDropbox = false; + $scope.isOver = false; + } + + $(window).on('resize', onResize); + $(window).on('orientationchange', onOrientationChange); + $(window).on('dragover', onDragOver); + $(window).on('dragstart', onDragStart); + $(window).on('dragend', onDragEnd); + // $(window).on('mouseover', onMouseOver); + + $scope.$on('$destroy', function() { + $(window).off('resize', onResize); + $(window).off('dragover', onDragOver); + // $(window).off('mouseover', onMouseOver); + $interval.cancel($scope.intervalComposer); + $interval.cancel($scope.intervalDropzone); + window.onbeforeunload = undefined; + }); + + // Function used for dragover listener on the dropzones + var dragover = function(e) { + e.preventDefault(); + $interval.cancel($scope.intervalComposer); + $interval.cancel($scope.intervalDropzone); + + $scope.intervalDropzone = $interval(function() { + $scope.isOver = false; + $interval.cancel($scope.intervalDropzone); + }, 100); + + if ($scope.isOver === false) { + $scope.isOver = true; + } + }; + + // Functions + $scope.setDefaults = function(message) { + var enabledAddresses = _.chain(authentication.user.Addresses) + .where({Status: 1}) + .sortBy('Send') + .value(); + var sender = enabledAddresses[0]; + + if (angular.isDefined(message.AddressID)) { + var originalAddress = _.findWhere(enabledAddresses, {ID: message.AddressID}); + + if (angular.isDefined(originalAddress)) { + sender = originalAddress; + } + } + + _.defaults(message, { + ToList: [], + CCList: [], + BCCList: [], + Subject: '', + PasswordHint: '', + Attachments: [], + IsEncrypted: 0, + Body: message.Body, + From: sender + }); + }; + + $scope.slideDown = function(message) { + message.attachmentsToggle = !!!message.attachmentsToggle; + }; + + $scope.dropzoneConfig = function(message) { + return { + options: { + addRemoveLinks: false, + dictDefaultMessage: gettextCatalog.getString('Drop a file here to upload', null, 'Info'), + url: "/file/post", + autoProcessQueue: false, + paramName: "file", // The name that will be used to transfer the file + previewTemplate: '
', + previewsContainer: '.previews', + accept: function(file, done) { + var totalSize = $scope.getAttachmentsSize(message); + var sizeLimit = CONSTANTS.ATTACHMENT_SIZE_LIMIT; + + totalSize += angular.isDefined(message.queuedFilesSize) ? message.queuedFilesSize : 0; + totalSize += file.size; + $scope.isOver = false; + dropzone = this; + + var total_num = angular.isDefined(message.Attachments) ? message.Attachments.length : 0; + total_num += angular.isDefined(message.queuedFiles) ? message.queuedFiles : 0; + + if(total_num === CONSTANTS.ATTACHMENT_NUMBER_LIMIT) { + dropzone.removeFile(file); + done('Messages are limited to ' + CONSTANTS.ATTACHMENT_NUMBER_LIMIT + ' attachments'); + notify({message: 'Messages are limited to ' + CONSTANTS.ATTACHMENT_NUMBER_LIMIT + ' attachments', classes: 'notification-danger'}); + } else if(totalSize >= (sizeLimit * CONSTANTS.BASE_SIZE * CONSTANTS.BASE_SIZE)) { + dropzone.removeFile(file); + done('Attachments are limited to ' + sizeLimit + ' MB. Total attached would be: ' + Math.round(10*totalSize/CONSTANTS.BASE_SIZE/CONSTANTS.BASE_SIZE)/10 + ' MB.'); + notify({message: 'Attachments are limited to ' + sizeLimit + ' MB. Total attached would be: ' + Math.round(10*totalSize/CONSTANTS.BASE_SIZE/CONSTANTS.BASE_SIZE)/10 + ' MB.', classes: 'notification-danger'}); + } else { + if ( angular.isUndefined( message.queuedFiles ) ) { + message.queuedFiles = 0; + message.queuedFilesSize = 0; + } + message.queuedFiles++; + message.queuedFilesSize += file.size; + + var process = function() { + message.queuedFiles--; + message.queuedFilesSize -= file.size; + $scope.addAttachment(file, message).finally(function () { + dropzone.removeFile(file); + }); + }; + + if(angular.isUndefined(message.ID)) { + if (angular.isUndefined(message.savePromise)) { + $scope.save(message, false, false, false); // message, forward, notification + } + + message.savePromise.then(process); + } else { + process(); + } + + done(); + } + }, + init: function(event) { + var dropzone = this; + + _.forEach(message.Attachments, function (attachment) { + var mockFile = { name: attachment.Name, size: attachment.Size, type: attachment.MIMEType, ID: attachment.ID }; + + dropzone.options.addedfile.call(dropzone, mockFile); + }); + } + }, + eventHandlers: { + drop: function(event) { + event.preventDefault(); + + $scope.isOver = false; + $scope.$apply(); + }, + error: function(event) { + var sizeLimit = CONSTANTS.ATTACHMENT_SIZE_LIMIT; + + if(event.size > sizeLimit * CONSTANTS.BASE_SIZE * CONSTANTS.BASE_SIZE) { + notify({message: 'Attachments are limited to ' + sizeLimit + ' MB.', classes: 'notification-danger'}); + } + } + } + }; + }; + + $scope.getAttachmentsSize = function(message) { + var size = 0; + + angular.forEach(message.Attachments, function(attachment) { + if (angular.isDefined(attachment.Size)) { + size += parseInt(attachment.Size); + } + }); + return size; + }; + + $scope.decryptAttachments = function(message) { + var removeAttachments = []; + var promises = []; + + if(message.Attachments && message.Attachments.length > 0) { + + var keys = authentication.getPrivateKeys(message.From.ID); + + _.each(message.Attachments, function(attachment) { + + try { + // decode key packets + var keyPackets = pmcw.binaryStringToArray(pmcw.decode_base64(attachment.KeyPackets)); + + var promise = pmcw.decryptSessionKey(keyPackets, keys).then(function(sessionKey) { + attachment.sessionKey = sessionKey; + }, function(error) { + notify({message: 'Error during decryption of the session key', classes: 'notification-danger'}); + $log.error(error); + removeAttachments.push(attachment); + }); + + promises.push(promise); + } catch(error) { + removeAttachments.push(attachment); + } + }); + } + + $q.all(promises).finally(function() { + if(removeAttachments.length > 0) { + _.each(removeAttachments, function(attachment) { + notify({classes: 'notification-danger', message: 'Decryption of attachment ' + attachment.Name + ' failed. It has been removed from this draft.'}); + $scope.removeAttachment(attachment, message); + }); + } + }); + }; + + $scope.initAttachment = function(tempPacket, index) { + if (tempPacket.uploading) { + var id = 'attachment' + index; + + $timeout(function() { + tempPacket.elem = document.getElementById(id); + tempPacket.elem.removeAttribute('id'); + + attachments.uploadProgress(1, tempPacket.elem); + }); + } + }; + + $scope.cancelAttachment = function(attachment, message) { + // Cancel the request + attachment.cancel(); // Also remove the attachment in the UI + // FIXME Reload message/attachments from the server when this happens. + // A late cancel might succeed on the back-end but not be reflected on the front-end + // Need to be careful if there are currently-uploading attachments, an do autosave first + }; + + $scope.addAttachment = function(file, message) { + var tempPacket = {}; + + tempPacket.filename = file.name; + tempPacket.uploading = true; + tempPacket.Size = file.size; + + message.uploading++; + message.Attachments.push(tempPacket); + message.attachmentsToggle = true; + + $scope.composerStyle(); + $rootScope.$broadcast('composerModeChange'); + + var cleanup = function( result ) { + var index = message.Attachments.indexOf(tempPacket); + + if ( angular.isDefined( result ) && angular.isDefined( result.AttachmentID ) ) { + message.Attachments.splice(index, 1, result); + } + else { + message.Attachments.splice(index, 1); + } + + message.uploading--; + onResize(); + }; + + return attachments.load(file, message.From.Keys[0].PublicKey).then( + function(packets) { + return attachments.upload(packets, message, tempPacket).then( + function(result) { + cleanup( result ); + }, + function(error) { + cleanup(); + notify({message: 'Error during file upload', classes: 'notification-danger'}); + $log.error(error); + } + ); + }, + function(error) { + cleanup(); + notify({message: 'Error encrypting attachment', classes: 'notification-danger'}); + $log.error(error); + } + ); + }; + + $scope.removeAttachment = function(attachment, message) { + var index = message.Attachments.indexOf(attachment); + + // Remove attachment in UI + message.Attachments.splice(index, 1); + + Attachment.remove({ + "MessageID": message.ID, + "AttachmentID": attachment.AttachmentID || attachment.ID + }).then(function(result) { + var data = result.data; + + if(angular.isDefined(data) && data.Code === 1000) { + // Attachment removed + } else if (angular.isDefined(data) && angular.isDefined(data.Error)) { + var mockFile = { name: attachment.Name, size: attachment.Size, type: attachment.MIMEType, ID: attachment.ID }; + + message.Attachments.push(attachment); + dropzone.options.addedfile.call(dropzone, mockFile); + notify({message: data.Error, classes: 'notification-danger'}); + } else { + notify({message: 'Error during the remove request', classes: 'notification-danger'}); + $log.error(result); + } + }, function(error) { + notify({message: 'Error during the remove request', classes: 'notification-danger'}); + $log.error(error); + }); + }; + + /** + * Add message in composer list + * @param {Object} message + * @param {Boolean} save + */ + $scope.initMessage = function(message, save) { + if (authentication.user.Delinquent < 3) { + // Not in the delinquent state + } else { + // In delinquent state + notify({message: gettextCatalog.getString('Your account currently has an overdue invoice. Please pay all unpaid invoices.', null, 'Info'), classes: 'notification-danger'}); + return false; + } + + if (authentication.user.ComposerMode === 1) { + message.maximized = true; + $rootScope.maximizedComposer = true; + } + + // if tablet we maximize by default + if (tools.findBootstrapEnvironment() === 'sm') { + message.maximized = true; + if ($scope.messages.length > 0) { + notify.closeAll(); + notify({message: gettextCatalog.getString('Maximum composer reached', null, 'Error'), classes: 'notification-danger'}); + return; + } + } + + message.uid = $scope.uid++; + message.numTags = []; + message.recipientFields = []; + message.uploading = 0; + $scope.messages.unshift(message); + $scope.setDefaults(message); + $scope.insertSignature(message); + $scope.sanitizeBody(message); + $scope.decryptAttachments(message); + + $scope.isOver = false; + + // This timeout is really important to load the structure of Squire + $timeout(function() { + $rootScope.$broadcast('squireHeightChanged'); + $scope.composerStyle(); + // forward case: we need to save to get the attachments + if(save === true) { + $scope.save(message, true, false).then(function() { // message, forward, notification + $scope.decryptAttachments(message); + $scope.composerStyle(); + }, function(error) { + $log.error(error); + }); + } + }); + }; + + $scope.addFile = function(message) { + $('#uid' + message.uid + ' .dropzone').click(); + }; + + $scope.sanitizeBody = function(message) { + message.Body = DOMPurify.sanitize(message.Body, { + ADD_ATTR: ['target'], + FORBID_TAGS: ['style', 'input', 'form'] + }); + }; + + $scope.composerStyle = function() { + var composers = $('.composer'); + var composerWidth = $('.composer').eq(0).outerWidth(); + + _.each(composers, function(composer, index) { + + var margin = 20; + var reverseIndex = $scope.messages.length - index; + var message = $scope.messages[index]; + var styles = {}; + var widthWindow = $('body').outerWidth(); + var windowHeight = $(window).height() - margin; + var composerHeight = $(composer).outerHeight(); + + if ($('html').hasClass('ua-windows_nt')) { + margin = 40; + } + + if (tools.findBootstrapEnvironment() === 'xs') { + var marginTop = 80; // px + var top = marginTop; + + styles.top = top + 'px'; + } else { + var marginRight = margin; // px + var widthComposer = composerWidth; // px + + if (Math.ceil(widthWindow / $scope.messages.length) > (widthComposer + marginRight)) { + right = (index * (widthComposer + marginRight)) + marginRight; + } else { + widthWindow -= margin; // margin left + var overlap = (((widthComposer * $scope.messages.length) - widthWindow) / ($scope.messages.length - 1)); + right = index * (widthComposer - ( overlap + margin )); + } + + if (reverseIndex === $scope.messages.length) { + right = marginRight; + index = $scope.messages.length; + } + + styles.top = ''; + styles.right = right + 'px'; + styles.opacity = 1; + } + + // Height - depreciated. pure css solution - Jason + // if(windowHeight < composerHeight) { + // styles.height = windowHeight + 'px'; + // } else { + // styles.height = 'auto'; + // } + + $(composer).css(styles); + + }); + }; + + /** + * Insert signature in the message body + * @param {Object} message + */ + $scope.insertSignature = function(message) { + if (angular.isUndefined(message.Body)) { + var content; + var space = '

'; + + if (message.From.Signature === null) { + content = authentication.user.Signature; + } else { + content = message.From.Signature; + } + + var signature = DOMPurify.sanitize('
' + tools.replaceLineBreaks(content) + '
', { + ADD_ATTR: ['target'], + FORBID_TAGS: ['style', 'input', 'form'] + }); + + if ($(signature).text().length === 0 && $(signature).find('img').length === 0) { + message.Body = space; + } else { + message.Body = space + signature; + } + } + }; + + $scope.focusComposer = function(message) { + $scope.selected = message; + + if (!!!message.focussed) { + // calculate z-index + var index = $scope.messages.indexOf(message); + var reverseIndex = $scope.messages.length - index; + + if (tools.findBootstrapEnvironment() === 'xs') { + + _.each($scope.messages, function(element, iteratee) { + if (iteratee > index) { + $(element).css('z-index', ($scope.messages.length + (iteratee - index))*100); + } else { + $(element).css('z-index', ($scope.messages.length)*100); + } + }); + + var bottom = $('.composer').eq($('.composer').length-1); + var bottomTop = bottom.css('top'); + var bottomZ = bottom.css('zIndex'); + var clicked = $('.composer').eq(index); + var clickedTop = clicked.css('top'); + var clickedZ = clicked.css('zIndex'); + + if (clickedZ==='auto') { + clickedZ = 100; // fix for mobile safari issue + } + + // TODO: swap ??? + bottom.css({ + top: clickedTop, + zIndex: clickedZ + }); + clicked.css({ + top: bottomTop, + zIndex: bottomZ + }); + } else { + _.each($scope.messages, function(element, iteratee) { + if (iteratee > index) { + element.zIndex = ($scope.messages.length - (iteratee - index))*100; + } else { + element.zIndex = ($scope.messages.length)*100; + } + }); + } + + // focus correct field + var composer = $('#uid' + message.uid); + + if (message.ToList.length === 0) { + $scope.focusTo(message); + } else if (message.Subject.length === 0) { + $(composer).find('.subject').focus(); + } else if (message.editor) { + message.editor.focus(); + } + + _.each($scope.messages, function(m) { + m.focussed = false; + }); + + message.focussed = true; + } + }; + + $scope.listenEditor = function(message) { + if(message.editor) { + var dropzone = $('#uid' + message.uid + ' .composer-dropzone')[0]; + + message.editor.addEventListener('focus', function() { + $timeout(function() { + message.fields = false; + message.ccbcc = false; + $('.typeahead-container').scrollTop(0); + $scope.$apply(); + }); + }); + + message.editor.addEventListener('input', function() { + $scope.saveLater(message); + }); + + message.editor.addEventListener('dragstart', onDragStart); + message.editor.addEventListener('dragend', onDragEnd); + message.editor.addEventListener('dragenter', onDragEnter); + message.editor.addEventListener('dragover', onDragOver); + + dropzone.addEventListener('dragover', dragover); + + $scope.saveOld(message); + } + }; + + $scope.attToggle = function(message) { + message.attachmentsToggle = !!!message.attachmentsToggle; + $rootScope.$broadcast('composerModeChange'); + }; + + $scope.attHide = function(message) { + message.attachmentsToggle = false; + $rootScope.$broadcast('composerModeChange'); + }; + + $scope.toggleCcBcc = function(message) { + message.ccbcc = !!!message.ccbcc; + + if(message.ccbcc === true) { + message.fields = true; + } + + $scope.composerStyle(); + }; + + $scope.showFields = function(message) { + message.fields = true; + }; + + $scope.hideFields = function(message) { + message.fields = false; + message.ccbcc = false; + }; + + $scope.togglePanel = function(message, panelName) { + message.displayPanel = !!!message.displayPanel; + message.panelName = panelName; + }; + + $scope.openPanel = function(message, panelName) { + message.displayPanel = true; + message.panelName = panelName; + }; + + $scope.closePanel = function(message) { + message.displayPanel = false; + message.panelName = ''; + }; + + $scope.setEncrypt = function(message, params, form) { + if (params.password.length === 0) { + notify({message: 'Please enter a password for this email.', classes: 'notification-danger'}); + return false; + } + + if (params.password !== params.confirm) { + notify({message: 'Message passwords do not match.', classes: 'notification-danger'}); + return false; + } + + message.IsEncrypted = 1; + message.Password = params.password; + message.PasswordHint = params.hint; + $scope.closePanel(message); + }; + + $scope.clearEncrypt = function(message, params, form) { + params.password = ''; + params.confirm = ''; + params.hint = ''; + form.$setUntouched(); + delete message.PasswordHint; + message.IsEncrypted = 0; + $scope.closePanel(message); + }; + + /** + * Intialize the expiration panel + * @param {Object} message + * @param {Object} params + */ + $scope.initExpiration = function(message, params) { + var hours = 0; + var days = 0; + var weeks = 0; + + if(angular.isDefined(message.ExpirationTime)) { + hours = message.ExpirationTime / 3600; + days = Math.floor(hours / 24); + hours = hours % 24; + weeks = Math.floor(days / 7); + days = days % 7; + } + + params.expirationWeeks = _.findWhere($scope.weekOptions, {value: weeks}); + params.expirationDays = _.findWhere($scope.dayOptions, {value: days}); + params.expirationHours = _.findWhere($scope.hourOptions, {value: hours}); + }; + + /** + * Set expiration time if valid value + * @param {Object} message + * @param {Object} params + */ + $scope.setExpiration = function(message, params) { + var hours = params.expirationHours.value + params.expirationDays.value * 24 + params.expirationWeeks.value * 24 * 7; + var error = false; + + if (parseInt(hours) > CONSTANTS.MAX_EXPIRATION_TIME) { // How can we enter in this situation? + notify({message: 'The maximum expiration is 4 weeks.', classes: 'notification-danger'}); + error = true; + } + + if (isNaN(hours)) { + notify({message: 'Invalid expiration time.', classes: 'notification-danger'}); + error = true; + } + + if(error === false) { + message.ExpirationTime = hours * 3600; // seconds + } + }; + + /** + * Remove expiration time value + * @param {Object} message + */ + $scope.clearExpiration = function(message) { + delete message.ExpirationTime; + $scope.closePanel(message); + }; + + $scope.saveOld = function(message) { + message.old = _.pick(message, $scope.oldProperties); + + _.defaults(message.old, { + ToList: [], + BCCList: [], + CCList: [], + Attachments: [], + PasswordHint: "", + Subject: "" + }); + }; + + /** + * Determine if we need to save the message + */ + $scope.needToSave = function(message) { + if(angular.isDefined(message.old)) { + var currentMessage = _.pick(message, $scope.oldProperties); + var oldMessage = _.pick(message.old, $scope.oldProperties); + + return JSON.stringify(oldMessage) !== JSON.stringify(currentMessage); + } else { + return true; + } + }; + + /** + * Delay the saving + * @param {Object} message + */ + $scope.saveLater = function(message) { + if(angular.isDefined(message.timeoutSaving)) { + $timeout.cancel(message.timeoutSaving); + } + + message.timeoutSaving = $timeout(function() { + if($scope.needToSave(message)) { + $scope.save(message, false, false, true); // message, forward, notification, autosaving + } + }, CONSTANTS.SAVE_TIMEOUT_TIME); // 3 seconds + }; + + $scope.validate = function(message) { + var deferred = $q.defer(); + + // We delay the validation to let the time for the autocomplete + $timeout(function() { + // set msgBody input element to editor content + message.setMsgBody(); + + // Check if there is an attachment uploading + if (message.uploading === true) { + deferred.reject('Wait for attachment to finish uploading or cancel upload.'); + return false; + } + + // Check all emails to make sure they are valid + var invalidEmails = []; + var allEmails = _.map(message.ToList.concat(message.CCList).concat(message.BCCList), function(email) { return email.Address.trim(); }); + + _.each(allEmails, function(email) { + if(!tools.validEmail(email)) { + invalidEmails.push(email); + } + }); + + if (invalidEmails.length > 0) { + deferred.reject('Invalid email(s): ' + invalidEmails.join(',') + '.'); + return false; + } + + // MAX 25 to, cc, bcc + if ((message.ToList.length + message.BCCList.length + message.CCList.length) > 25) { + deferred.reject('The maximum number (25) of Recipients is 25.'); + return false; + } + + if (message.ToList.length === 0 && message.BCCList.length === 0 && message.CCList.length === 0) { + deferred.reject('Please enter at least one recipient.'); + return false; + } + + // Check title length + if (message.Subject && message.Subject.length > CONSTANTS.MAX_TITLE_LENGTH) { + deferred.reject('The maximum length of the subject is ' + CONSTANTS.MAX_TITLE_LENGTH + '.'); + return false; + } + + // Check body length + if (message.Body.length > 16000000) { + deferred.reject('The maximum length of the message body is 16,000,000 characters.'); + return false; + } + + deferred.resolve(); + }, 250); + + return deferred.promise; + }; + + /** + * Call when the user change the FROM + * @param {Resource} message - Message to save + */ + $scope.changeFrom = function(message) { + var currentBody = $.parseHTML(message.Body); + var tempDOM = $('
').append(currentBody); + var signature = tempDOM.find('.protonmail_signature_block').first().html(); + var content = (message.From.Signature === null)?authentication.user.Signature:message.From.Signature; + + if (signature && signature.length > 0) { + tempDOM.find('.protonmail_signature_block').html(content); + } else { + tempDOM.append(content); + } + + message.Body = tempDOM.html(); + + // save when DOM is updated + $scope.save(message, false, false, true); + }; + + /** + * Save the Message + * @param {Resource} message - Message to save + * @param {Boolean} forward - Forward case + * @param {Boolean} notification - Add a notification when the saving is complete + * @param {Boolean} autosaving + */ + $scope.save = function(message, forward, notification, autosaving) { + // Variables + var deferred = $q.defer(); + var parameters = { + Message: _.pick(message, 'ToList', 'CCList', 'BCCList', 'Subject', 'IsRead') + }; + + // Functions + // Schedule this save after the in-progress one completes + var nextSave = function(result) { + return $scope.save(message, forward, notification); + }; + + if(angular.isDefined(message.timeoutSaving)) { + $timeout.cancel(message.timeoutSaving); + } + + if(message.saving === true && message.savePromise) { + message.savePromise = message.savePromise.then(nextSave, nextSave); + deferred.resolve(message.savePromise); + } else { + message.saving = true; + message.autosaving = autosaving || false; + + if(angular.isUndefined(parameters.Message.Subject)) { + parameters.Message.Subject = ''; + } + + if(angular.isString(parameters.Message.ToList)) { + parameters.Message.ToList = []; + } + + if(angular.isString(parameters.Message.CCList)) { + parameters.Message.CCList = []; + } + + if(angular.isString(parameters.Message.BCCList)) { + parameters.Message.BCCList = []; + } + + if(angular.isDefined(message.ParentID)) { + parameters.ParentID = message.ParentID; + parameters.Action = message.Action; + } + + if (angular.isDefined(message.ID)) { + parameters.id = message.ID; + } else { + parameters.Message.IsRead = 1; + } + + if (autosaving === false) { + parameters.Message.IsRead = 1; + } + + parameters.Message.AddressID = message.From.ID; + + // Encrypt message body with the first public key for the From address + message.encryptBody(message.From.Keys[0].PublicKey) + .then(function(result) { + var draftPromise; + var CREATE = 1; + var UPDATE = 2; + + // Set encrypted body + parameters.Message.Body = result; + + if(angular.isDefined(message.ID)) { + draftPromise = Message.updateDraft(parameters).$promise; + actionType = UPDATE; + } else { + draftPromise = Message.createDraft(parameters).$promise; + actionType = CREATE; + } + + // Save draft before to send + draftPromise + .then(function(result) { + if(angular.isDefined(result) && result.Code === 1000) { + var events = []; + var conversation = cache.getConversationCached(result.Message.ConversationID); + var numUnread = angular.isDefined(conversation) ? conversation.NumUnread : 0; + var numMessages; + + if (actionType === CREATE) { + numMessages = angular.isDefined(conversation) ? (conversation.NumMessages + 1) : 1; + } else if (actionType === UPDATE) { + numMessages = angular.isDefined(conversation) ? conversation.NumMessages : 1; + } + + message.ID = result.Message.ID; + message.IsRead = result.Message.IsRead; + message.Time = result.Message.Time; + + if(forward === true && result.Message.Attachments.length > 0) { + message.Attachments = result.Message.Attachments; + message.attachmentsToggle = true; + } + + result.Message.Senders = [result.Message.Sender]; // The back-end doesn't return Senders so need a trick + result.Message.Recipients = _.uniq(result.Message.ToList.concat(result.Message.CCList).concat(result.Message.BCCList)); // The back-end doesn't return Recipients + + $scope.saveOld(message); + + // Update draft in message list + events.push({Action: actionType, ID: result.Message.ID, Message: result.Message}); + + // Generate conversation event + events.push({Action: 3, ID: result.Message.ConversationID, Conversation: { + NumAttachments: result.Message.Attachments.length, + NumMessages: numMessages, + NumUnread: numUnread, + Recipients: result.Message.Recipients, + Senders: result.Message.Senders, + Subject: result.Message.Subject, + ID: result.Message.ConversationID, + LabelIDsAdded: [CONSTANTS.MAILBOX_IDENTIFIERS.drafts] + }}); + + // Send events + cache.events(events); + + if(notification === true) { + notify({message: gettextCatalog.getString('Message saved', null), classes: 'notification-success'}); + } + + message.saving = false; + message.autosaving = false; + + deferred.resolve(result); + } else if (angular.isDefined(result) && result.Code === 15033) { + // Case where the user delete draft in an other terminal + delete message.ID; + message.saving = false; + message.autosaving = false; + deferred.resolve($scope.save(message, forward, notification)); + } else if (angular.isDefined(result) && result.Error) { + // Errors from backend + message.saving = false; + message.autosaving = false; + deferred.reject(result.Error); + } else { + message.saving = false; + message.autosaving = false; + deferred.reject(result); + } + }, function(error) { + message.saving = false; + message.autosaving = false; + error.message = 'Error during the draft request'; + deferred.reject(error); + }); + }, function(error) { + message.saving = false; + message.autosaving = false; + error.message = 'Error encrypting message'; + deferred.reject(error); + }); + + message.savePromise = deferred.promise.finally(function() { + message.saving = false; + message.autosaving = false; + }); + } + + if (autosaving === false) { + networkActivityTracker.track(deferred.promise); + } + + return deferred.promise; + }; + + /** + * Return the subject title of the composer + */ + $scope.subject = function(message) { + return message.Subject || gettextCatalog.getString('New message', null, 'Title'); + }; + + /** + * Check if the subject of this message is empty + * And ask the user to send anyway + * @param {Object} message + */ + $scope.checkSubject = function(message) { + var deferred = $q.defer(); + var title = gettextCatalog.getString('No subject', null, 'Title'); + var text = gettextCatalog.getString('No subject, send anyway?', null, 'Info'); + + if(angular.isUndefined(message.Subject) || message.Subject.length === 0) { + message.Subject = ''; + confirmModal.activate({ + params: { + title: title, + message: text, + confirm: function() { + confirmModal.deactivate(); + deferred.resolve(); + }, + cancel: function() { + confirmModal.deactivate(); + deferred.reject(); + } + } + }); + } else { + deferred.resolve(); + } + + return deferred.promise; + }; + + /** + * Try to send message specified + * @param {Object} message + */ + $scope.send = function(message) { + var deferred = $q.defer(); + $scope.validate(message) + .then(function() { + $scope.save(message, false, false, false) + .then(function() { + $scope.checkSubject(message).then(function() { + message.encrypting = true; + var parameters = {}; + var emails = message.emailsToString(); + + parameters.id = message.ID; + parameters.ExpirationTime = message.ExpirationTime; + message.getPublicKeys(emails) + .then(function(result) { + if (result.data && result.data.Code === 1000) { + var keys = result.data; // Save result in keys variables + var outsiders = false; // Initialize to false a Boolean variable to know if there are outsiders email in recipients list + var promises = []; + + parameters.Packages = []; + + _.each(emails, function(email) { + // Inside user + if(keys && keys[email].length > 0) { + var key = keys[email]; + + // Encrypt content body in with the public key user + promises.push(message.encryptBody(key).then(function(result) { + var body = result; + + // Encrypt attachments with the public key + return message.encryptPackets(key).then(function(keyPackets) { + return parameters.Packages.push({Address: email, Type: 1, Body: body, KeyPackets: keyPackets}); + }); + })); + } + // Outside user + else { + outsiders = true; + + if(message.IsEncrypted === 1) { + var replyToken = message.generateReplyToken(); + var replyTokenPromise = pmcw.encryptMessage(replyToken, [], message.Password); + + promises.push(replyTokenPromise.then(function(encryptedToken) { + return pmcw.encryptMessage(message.Body, [], message.Password).then(function(result) { + var body = result; + + return message.encryptPackets('', message.Password).then(function(result) { + var keyPackets = result; + + return parameters.Packages.push({Address: email, Type: 2, Body: body, KeyPackets: keyPackets, PasswordHint: message.PasswordHint, Token: replyToken, EncToken: encryptedToken}); + }, function(error) { + message.encrypting = false; + $log.error(error); + }); + }, function(error) { + message.encrypting = false; + $log.error(error); + }); + }, function(error) { + message.encrypting = false; + $log.error(error); + })); + } + } + }); + + // If there are some outsiders + if(outsiders === true && message.IsEncrypted === 0) { + parameters.AttachmentKeys = []; + parameters.ClearBody = message.Body; // Add a clear body in parameter + + if(message.Attachments.length > 0) { + // Add clear attachments packet in parameter + promises.push(message.clearPackets().then(function(packets) { + parameters.AttachmentKeys = packets; + }, function(error) { + $log.error(error); + })); + } + } + + // When all promises are complete + $q.all(promises).then(function() { + if (outsiders === true && message.IsEncrypted === 0 && message.ExpirationTime) { + $log.error(message); + message.encrypting = false; + deferred.reject(new Error('Expiring emails to non-ProtonMail recipients require a message password to be set. For more information, click here.')); + } else { + message.encrypting = false; + message.sending = true; + Message.send(parameters).$promise.then(function(result) { + if(angular.isDefined(result.Error)) { + message.sending = false; + deferred.reject(new Error(result.Error)); + } else { + var events = []; + var messages = cache.queryMessagesCached(result.Sent.ConversationID); + var conversation = cache.getConversationCached(result.Sent.ConversationID); + var numMessages = angular.isDefined(conversation) ? conversation.NumMessages : 1; + var numUnread = angular.isDefined(conversation) ? conversation.NumUnread : 0; + + message.sending = false; // Change status + result.Sent.Senders = [result.Sent.Sender]; // The back-end doesn't return Senders so need a trick + result.Sent.Recipients = _.uniq(message.ToList.concat(message.CCList).concat(message.BCCList)); // The back-end doesn't return Recipients + events.push({Action: 3, ID: result.Sent.ID, Message: result.Sent}); // Generate event for this message + + if (result.Parent) { + events.push({Action: 3, ID: result.Parent.ID, Message: result.Parent}); + } + + events.push({Action: 3, ID: result.Sent.ConversationID, Conversation: { + NumMessages: numMessages, + NumUnread: numUnread, + Recipients: result.Sent.Recipients, + Senders: result.Sent.Senders, + Subject: result.Sent.Subject, + ID: result.Sent.ConversationID, + LabelIDsAdded: [CONSTANTS.MAILBOX_IDENTIFIERS.sent], + LabelIDsRemoved: [CONSTANTS.MAILBOX_IDENTIFIERS.drafts] + }}); + + cache.events(events); // Send events to the cache manager + notify({message: gettextCatalog.getString('Message sent', null), classes: 'notification-success'}); // Notify the user + $scope.close(message, false, false); // Close the composer window + + $timeout(function() { + $stateParams.message = result.Sent.ID; // Define target ID + $rootScope.$broadcast('initMessage', result.Sent.ID, true); // Scroll and open the message sent + }, 500); + + deferred.resolve(result); // Resolve finally the promise + } + }, function(error) { + message.sending = false; + error.message = 'There was a problem sending your message. Please try again.'; + deferred.reject(error); + }); + } + }, function(error) { + message.encrypting = false; + error.message = 'Error during the promise preparation'; + deferred.reject(error); + }); + } else { + message.encrypting = false; + error.message = 'Error during get public keys user request'; + deferred.reject(error); + } + }, function(error) { + message.encrypting = false; + error.message = 'Error getting the public key'; + deferred.reject(error); + }); + }, function(error) { + deferred.reject(); + }); + }, function(error) { + deferred.reject(); // Don't add parameter in the rejection because $scope.save already do that. + }); + }, function(error) { + deferred.reject(error); + }); + + networkActivityTracker.track(deferred.promise); + + return deferred.promise; + }; + + $scope.minimize = function(message) { + message.minimized = true; + message.previousMaximized = message.maximized; + message.maximized = false; + $rootScope.maximizedComposer = false; + // Hide all the tooltip + $('.tooltip').not(this).hide(); + $rootScope.$broadcast('composerModeChange'); + }; + + $scope.unminimize = function(message) { + message.minimized = false; + message.maximized = message.previousMaximized; + // Hide all the tooltip + $('.tooltip').not(this).hide(); + $rootScope.$broadcast('composerModeChange'); + }; + + $scope.maximize = function(message) { + message.maximized = true; + $rootScope.maximizedComposer = true; + $rootScope.$broadcast('composerModeChange'); + }; + + $scope.normalize = function(message) { + message.minimized = false; + message.maximized = false; + $rootScope.maximizedComposer = false; + $rootScope.$broadcast('composerModeChange'); + }; + + $scope.openCloseModal = function(message, save) { + var dropzones = $('#uid' + message.uid + ' .composer-dropzone'); + + message.editor.removeEventListener('input', function() { + $scope.saveLater(message); + }); + + message.editor.removeEventListener('dragenter', onDragEnter); + message.editor.removeEventListener('dragover', onDragOver); + message.editor.removeEventListener('dragstart', onDragStart); + message.editor.removeEventListener('dragend', onDragEnd); + + // We need to manage step by step the dropzone in the case where the composer is collapsed + if(angular.isDefined(dropzones) && angular.isDefined(_.first(dropzones))) { + _.first(dropzones).removeEventListener('dragover', dragover); + } + + $scope.close(message, false, true); + }; + + /** + * Close the composer window + * @param {Object} message + * @param {Boolean} discard + * @param {Boolean} save + */ + $scope.close = function(message, discard, save) { + var index = $scope.messages.indexOf(message); + var messageFocussed = !!message.focussed; + + if(discard === true && angular.isDefined(message.ID)) { + $scope.discard(message); + } + + $rootScope.activeComposer = false; + $rootScope.maximizedComposer = false; + + if (save === true) { + $scope.save(message, true, false, false); + } + + message.close(); + + // Remove message in composer controller + $scope.messages.splice(index, 1); + + // Hide all the tooltip + $('.tooltip').not(this).hide(); + + // Message closed and focussed? + if(messageFocussed && $scope.messages.length > 0) { + // Focus the first message + $scope.focusComposer(_.first($scope.messages)); + } + + $timeout(function () { + $scope.composerStyle(); + }, 250); + }; + + /** + * Move draft message to trash + * @param {Object} message + * @return {Promise} + */ + $scope.discard = function(message) { + action.discardMessage(message); + + // Notification + notify({message: gettextCatalog.getString('Message discarded', null), classes: 'notification-success'}); + }; + + /** + * Transform the recipients list to a string + * @param {Object} message + * @return {String} + */ + $scope.recipients = function(message) { + var recipients = []; + + if(message.ToList.length > 0) { + recipients = recipients.concat(_.map(message.ToList, function(contact, index) { + if(index === 0) { + return gettextCatalog.getString('To', null) + ': ' + $filter('contact')(contact, 'Name'); + } else { + return $filter('contact')(contact, 'Name'); + } + })); + } + + if(message.CCList.length > 0) { + recipients = recipients.concat(_.map(message.CCList, function(contact, index) { + if(index === 0) { + return gettextCatalog.getString('CC', null) + ': ' + $filter('contact')(contact, 'Name'); + } else { + return $filter('contact')(contact, 'Name'); + } + })); + } + + if(message.BCCList.length > 0) { + recipients = recipients.concat(_.map(message.BCCList, function(contact, index) { + if(index === 0) { + return gettextCatalog.getString('BCC', null) + ': ' + $filter('contact')(contact, 'Name'); + } else { + return $filter('contact')(contact, 'Name'); + } + })); + } + + return recipients.join(', '); + }; + + /** + * Display fields (To, Cc, Bcc) and focus the input in the To field. + * @param {Object} message + */ + $scope.focusTo = function(message) { + message.fields = true; + $rootScope.$broadcast('squireHeightChanged'); + $scope.composerStyle(); + // Focus input + $timeout(function() { + $('#uid' + message.uid + ' .toRow input.new-value-email').focus(); + }); + }; + + $scope.focusNextInput = function(event) { + angular.element(event.target).parent().find('input.new-value-email:first').focus(); + }; + + /** + * Give the focus inside the content editor + * @param {Object} message + * @param {Object} event + */ + $scope.focusEditor = function(message, event) { + event.preventDefault(); + message.editor.focus(); + }; +}); diff --git a/src/app/controllers/contacts.js b/src/app/controllers/contacts.js old mode 100755 new mode 100644 index 6021b0a..57e689f --- a/src/app/controllers/contacts.js +++ b/src/app/controllers/contacts.js @@ -7,77 +7,109 @@ angular.module("proton.controllers.Contacts", [ $scope, $state, $log, - $translate, + gettextCatalog, $stateParams, $filter, tools, authentication, - contacts, Contact, confirmModal, contactModal, + alertModal, dropzoneModal, + eventManager, Message, networkActivityTracker, notify ) { - $scope.params = { - searchContactInput: '' - }; + // Variables + var lastChecked = null; - $rootScope.pageName = "Contacts"; - authentication.user.Contacts = contacts.data.Contacts; - $scope.editing = false; + $rootScope.pageName = 'Contacts'; $scope.currentPage = 1; + $scope.params = { searchContactInput: ''}; + $scope.editing = false; $scope.numPerPage = 40; $scope.sortBy = 'Name'; + // Listeners + $scope.$on('deleteContact', function(event, ID) { + $scope.updateContacts(); + }); + + $scope.$on('createContact', function(event, ID, contact) { + $scope.updateContacts(); + }); + + $scope.$on('updateContact', function(event, ID, contact) { + $scope.updateContacts(); + }); + + $scope.$on('updateContacts', function(event) { + $scope.updateContacts(); + }); + + $scope.$on('searchContacts', function(event, keyword) { + $scope.params.searchContactInput = keyword; + $scope.refreshContacts(true); + }); + + // Methods + $scope.initialization = function() { + $scope.updateContacts(); + }; + $scope.contactsFiltered = function(searching) { var contacts = authentication.user.Contacts; - - function pagination(contacts) { + var pagination = function (contacts) { var begin, end; begin = ($scope.currentPage - 1) * $scope.numPerPage; end = begin + $scope.numPerPage; return contacts.slice(begin, end); - } + }; - function orderBy(contacts) { + var orderBy = function(contacts) { var result = $filter('orderBy')(contacts, $scope.sortBy); $scope.totalItems = result.length; return result; - } + }; - function search(contacts) { + var search = function(contacts) { var byName = $filter('filter')(contacts, {Name: $scope.params.searchContactInput}); var byEmail = $filter('filter')(contacts, {Email: $scope.params.searchContactInput}); return _.union(byName, byEmail); - } + }; - if(searching === true) { + if (searching === true) { $scope.currentPage = 1; } - return pagination(orderBy(search(authentication.user.Contacts))); + return pagination(orderBy(search(contacts))); }; - $scope.contacts = $scope.contactsFiltered(); - - $scope.$on('updateContacts', function() {$scope.updateContacts();}); - $scope.updateContacts = function (){ + $scope.updateContacts = function() { $scope.contacts = $scope.contactsFiltered(); }; + $scope.selectPage = function(page) { + $scope.currentPage = page; + $scope.refreshContacts(); + }; + $scope.refreshContacts = function(searching) { $scope.contacts = $scope.contactsFiltered(searching); }; $scope.setSortBy = function(sort) { + if($scope.sortBy.charAt(0) !== '-') { + sort = '-' + sort; + } + $scope.sortBy = sort; $scope.refreshContacts(); }; @@ -97,21 +129,18 @@ angular.module("proton.controllers.Contacts", [ } $scope.deleteAllContacts = function() { - var title = $translate.instant('DELETE_ALL_CONTACTS'); - var message = 'Are you sure you want to delete all the contacts?'; + var title = gettextCatalog.getString('Delete all', null, 'Title'); + var message = gettextCatalog.getString('Are you sure you want to delete all your contacts?', null, 'Info'); confirmModal.activate({ params: { title: title, message: message, confirm: function() { - authentication.user.Contacts = []; - $scope.contacts = $scope.contactsFiltered(); - networkActivityTracker.track( Contact.clear().then(function(response) { - notify($translate.instant('CONTACTS_DELETED')); - Contact.index.updateWith($scope.contacts); + notify({message: gettextCatalog.getString('Contacts deleted', null), classes: 'notification-success'}); + eventManager.call(); }, function(response) { $log.error(response); }) @@ -125,16 +154,16 @@ angular.module("proton.controllers.Contacts", [ }); }; - $scope.deleteContacts = function(contact) { + $scope.deleteContact = function(contact) { var contactsSelected = contact ? [contact] : $scope.contactsSelected(); var message, title; if (contactsSelected.length === 1) { - title = $translate.instant('DELETE_CONTACT'); + title = gettextCatalog.getString('Delete', null, 'Title'); message = 'Are you sure you want to delete this contact?'; } else { - title = $translate.instant('DELETE_CONTACTS'); - message = 'Are you sure you want to delete contacts selected?'; + title = gettextCatalog.getString('Delete', null, 'Title'); + message = 'Are you sure you want to delete the selected contacts?'; } confirmModal.activate({ @@ -142,33 +171,26 @@ angular.module("proton.controllers.Contacts", [ title: title, message: message, confirm: function() { - deletedIDs = []; - deletedContacts = []; + var deletedIDs = []; + var deletedContacts = []; + _.forEach(contactsSelected, function(contact) { deletedIDs.push(contact.ID.toString()); deletedContacts.push(contact); }); - authentication.user.Contacts = _.difference(authentication.user.Contacts, deletedContacts); - $scope.contacts = $scope.contactsFiltered(); - networkActivityTracker.track( Contact.delete({ - "IDs" : deletedIDs + IDs : deletedIDs }).then(function(response) { - _.forEach(response.data.Responses, function(d, i) { - if(d.Response.Code !== 1000) { - notify(deletedContacts[i].Email +' Not Deleted'); - authentication.user.Contacts.push(deletedContacts[i]); - } - }); - notify($translate.instant('CONTACTS_DELETED')); - Contact.index.updateWith($scope.contacts); - }, function(response) { - $log.error(response); + notify({message: gettextCatalog.getString('Contacts deleted', null), classes: 'notification-success'}); + confirmModal.deactivate(); + eventManager.call(); + }, function(error) { + notify({message: error, classes: 'notification-danger'}); + $log.error(error); }) ); - confirmModal.deactivate(); }, cancel: function() { confirmModal.deactivate(); @@ -178,14 +200,13 @@ angular.module("proton.controllers.Contacts", [ }; $scope.addContact = function() { - openContactModal('Add New Contact', '', '', function(name, email) { + openContactModal(gettextCatalog.getString('Add new contact', null, 'Action'), '', '', function(name, email) { var match = _.findWhere(authentication.user.Contacts, {Email: email}); if (match) { - notify("Contact exists for this email address"); + notify({message: gettextCatalog.getString('A contact already exists for this email address.', null), classes: 'notification-danger'}); contactModal.deactivate(); - } - else { + } else { var newContact = { Name: name, Email: email @@ -197,16 +218,16 @@ angular.module("proton.controllers.Contacts", [ Contacts : contactList }).then(function(response) { if(response.data.Code === 1001) { - authentication.user.Contacts.push(response.data.Responses[0].Response.Contact); - $scope.contacts = $scope.contactsFiltered(); - notify($translate.instant('CONTACT_ADDED')); + notify({message: gettextCatalog.getString('Contact added', null), classes: 'notification-success'}); contactModal.deactivate(); - Contact.index.updateWith(authentication.user.Contacts); + eventManager.call(); } else { - notify(response.data.Responses[0].Error); + notify({message: response.data.Responses[0].Error, classes: 'notification-danger'}); + $log.error(response); } - }, function(response) { - $log.error(response); + }, function(error) { + notify({message: error, classes: 'notification-danger'}); + $log.error(error); }) ); } @@ -214,49 +235,42 @@ angular.module("proton.controllers.Contacts", [ }; $scope.editContact = function(contact) { - openContactModal('Edit Contact', contact.Name, contact.Email, function(name, email) { - var match = _.findWhere(authentication.user.Contacts, {Email: email}); - - if (match && email !== contact.Email) { - notify("Contact exists for this email address"); - contactModal.deactivate(); - } - else { - contact.Name = name; - contact.Email = email; - networkActivityTracker.track( - Contact.edit({ - "Name": name, - "Email": email, - "id": contact.ID - }).then(function(response) { - if(response.data.Code === 1000) { - contactModal.deactivate(); - notify($translate.instant('CONTACT_EDITED')); - Contact.index.updateWith(authentication.user.Contacts); - } else { - notify(response.data.Response[0].Error); - } - }, function(response) { - notify('Error'); - $log.error(response); - }) - ); - } - + openContactModal(gettextCatalog.getString('Edit', null, 'Action'), contact.Name, contact.Email, function(name, email) { + networkActivityTracker.track( + Contact.edit({ + id: contact.ID, + Name: name, + Email: email + }).then(function(response) { + if(response.data.Code === 1000) { + contactModal.deactivate(); + notify({message: gettextCatalog.getString('Contact edited', null), classes: 'notification-success'}); + eventManager.call(); + } else { + notify({message: response.data.Error, classes: 'notification-danger'}); + } + }, function(response) { + notify({message: response, classes: 'notification-danger'}); + $log.error(response); + }) + ); }); }; $scope.onSelectContact = function(event, contact) { - var contactsSelected = $scope.contactsSelected(); - - if (event.shiftKey) { - var start = authentication.user.Contacts.indexOf(_.first(contactsSelected)); - var end = authentication.user.Contacts.indexOf(_.last(contactsSelected)); + if (!lastChecked) { + lastChecked = contact; + } else { + if (event.shiftKey) { + var start = _.indexOf($scope.contacts, contact); + var end = _.indexOf($scope.contacts, lastChecked); - for (var i = start; i < end; i++) { - authentication.user.Contacts[i].selected = true; + _.each($scope.contacts.slice(Math.min(start, end), Math.max(start, end) + 1), function(contact) { + contact.selected = lastChecked.selected; + }); } + + lastChecked = contact; } }; @@ -281,37 +295,64 @@ angular.module("proton.controllers.Contacts", [ $rootScope.$broadcast('loadMessage', message); }; + $scope.composeContacts = function() { + var contactsSelected = $scope.contactsSelected(); + var message = new Message(); + var ToList = []; + + _.each(contactsSelected, function(contact) { + ToList.push({ + Address: contact.Email, + Name: contact.Name + }); + }); + + _.defaults(message, { + ToList: ToList, + CCList: [], + BCCList: [], + Subject: '', + PasswordHint: '', + Attachments: [] + }); + + $rootScope.$broadcast('loadMessage', message); + }; + $scope.uploadContacts = function() { dropzoneModal.activate({ params: { - title: 'Upload Contacts', - message: 'Allowed format(s): .vcf, .csvNeed help?', import: function(files) { var contactArray = []; - var extension = files[0].name.slice(-4); - + var extension = ''; var reader = new FileReader(); - reader.onload = function(e) { - var text = unescape(encodeURIComponent(reader.result)); + var importContacts; - if (extension === '.vcf') { + if( angular.isUndefined(files) || files.length === 0 ) { + notify({message: gettextCatalog.getString('No files were selected', null, 'Error'), classes: 'notification-danger'}); //TODO translate + return; + } - var vcardData = vCard.parse(text); + extension = files[0].name.slice(-4); - _.forEach(vcardData, function(d, i) { - if (d.fn && d.email) { - contactArray.push({'Name' : d.fn.value, 'Email' : d.email.value}); - } - else if(d.email) { - contactArray.push({'Name' : d.email.value, 'Email' : d.email.value}); - } - }); + reader.onload = function(e) { + var text = reader.result; - importContacts(contactArray); - } - else if(extension === '.csv') { + if(extension === '.vcf') { + var vcardData = vCard.parse(text); + + _.forEach(vcardData, function(d, i) { + if (d.fn && d.email) { + contactArray.push({'Name' : String(d.fn.value), 'Email' : String(d.email.value)}); + } else if(d.email) { + contactArray.push({'Name' : String(d.email.value), 'Email' : String(d.email.value)}); + } + }); + + importContacts(contactArray); + } else if(extension === '.csv') { Papa.parse(text, { - complete: function(results) { + complete: function(results) { var csv = results.data; var nameKeys = ['Name', 'First Name']; var emailKeys = ['E-mail 1 - Value', 'E-mail Address', 'Email Address', 'E-mail', 'Email']; @@ -327,50 +368,60 @@ angular.module("proton.controllers.Contacts", [ nameIndex = csv[0].indexOf(nameKey); emailIndex = csv[0].indexOf(emailKey); lastNameIndex = (nameKey === 'First Name' ? csv[0].indexOf('Last Name') : undefined); + _.forEach(csv, function(d, i) { - if (i > 0 && typeof(d[emailIndex]) !== 'undefined' && d[emailIndex] !== '') { - if (d[nameIndex] !== '') { - contactArray.push({'Name' : d[nameIndex], 'Email' : d[emailIndex]}); + if (i > 0 && typeof(d[emailIndex]) !== 'undefined' && d[emailIndex] !== '') { + if (d[nameIndex] !== '') { + var name = String(d[nameIndex]); + if ( lastNameIndex !== undefined ) { + name = name + ' ' + String(d[lastNameIndex]); + } + contactArray.push({'Name' : name, 'Email' : String(d[emailIndex])}); + } else { + contactArray.push({'Name' : String(d[emailIndex]), 'Email' : String(d[emailIndex])}); + } } - else { - contactArray.push({'Name' : d[emailIndex], 'Email' : d[emailIndex]}); - } - } }); + importContacts(contactArray); - } + } }); - } - else { - notify('Invalid file type'); + } else { + notify({message: gettextCatalog.getString('Invalid file type', null, 'Error'), classes: 'notification-danger'}); } }; - reader.readAsBinaryString(files[0]); + reader.readAsText(files[0], 'utf-8'); importContacts = function(contactArray) { networkActivityTracker.track( - Contact.save({ - "Contacts": contactArray - }).then(function(response) { - added = 0; - duplicates = 0; - _.forEach(response.data.Responses, function(d) { - if (d.Response.Contact) { - authentication.user.Contacts.push(d.Response.Contact); + Contact.save({Contacts: contactArray}) + .then(function(result) { + var added = 0; + var errors = []; + + _.forEach(result.data.Responses, function(response) { + if (response.Response.Code === 1000) { added++; - } - else { - duplicates++; + authentication.user.Contacts.push(response.Response.Contact); + } else if(angular.isDefined(response.Response.Error)) { + errors[response.Response.Code] = response.Response.Error; } }); - added = added === 1 ? added + ' contact' : added + ' contacts'; - duplicates = duplicates === 1 ? duplicates + ' contact was' : duplicates + ' contacts were'; - notify(added + ' imported, ' + duplicates + ' already in your contact list'); + + if(added === 1) { + notify({message: added + ' ' + gettextCatalog.getString('Contact imported', null), classes: 'notification-success'}); + } else if(added > 1) { + notify({message: added + ' ' + gettextCatalog.getString('Contacts imported', null), classes: 'notification-success'}); + } + + _.each(Object.keys(errors), function(key) { + notify({message: errors[key], classes: 'notification-danger'}); + }); + $scope.contacts = $scope.contactsFiltered(); - Contact.index.updateWith(authentication.user.Contacts); - }, function(response) { - $log.error(response); + }, function(error) { + $log.error(error); }) ); }; @@ -384,36 +435,62 @@ angular.module("proton.controllers.Contacts", [ }); }; + /** + * Open modal to alert the user that he cannot download + */ $scope.openSafariWarning = function() { - $('#safariContactsModal').modal('show'); + alertModal.activate({ + params: { + title: gettextCatalog.getString('Download', null, 'Title'), + alert: 'alert-warning', + message: gettextCatalog.getString('Safari does not fully support downloading contacts.

Please login with a different browser to download contacts.', null, 'Error', 'Info'), + ok: function() { + alertModal.deactivate(); + } + } + }); }; $scope.downloadContacts = function() { - if (tools.getBrowser==='Safari') { + if (tools.getBrowser() === 'Safari') { $scope.openSafariWarning(); } else { var contactsArray = [['Name', 'Email']]; var csvRows = []; var filename = 'contacts.csv'; + var escape_for_csv = function(str) { + + var escape = false; + if ( str.indexOf(',') !== -1 || str.indexOf('\n') !== -1 ) { + escape = true; + } + if ( str.indexOf('"') !== -1 ) { + str = str.replace(/"/g,'""'); + escape = true; + } + + if ( escape ) { + str = '"'+str+'"'; + } + + return str; + }; + _.forEach(authentication.user.Contacts, function(contact) { - contactsArray.push([contact.Name, contact.Email]); + contactsArray.push([escape_for_csv(contact.Name), escape_for_csv(contact.Email)]); }); - for(var i=0, l=contactsArray.length; i 0) { + var latest = _.last(messages); + + if($state.is('secured.sent.view')) { // If we open a conversation in the sent folder + var sents = _.where(messages, { AddressID: authentication.user.Addresses[0].ID }); + + if(sents.length > 0) { + // We try to open the last sent message + $state.go('.', {message: _.last(sents).ID}); + } else { + // Or the last message + $state.go('.', {message: _.last(messages).ID}); + } + } else if ($state.is('secured.search.view') || $state.is('secured.drafts.view')) { + // Do nothing, target initialized by click + } else if ($state.is('secured.starred.view')) { + // Select the last message starred + var lastStarred = _.chain(messages).filter(function(message) { + return message.LabelIDs.indexOf(CONSTANTS.MAILBOX_IDENTIFIERS.starred) !== -1; + }).last().value(); + + $state.go('.', {message: lastStarred.ID}); + } else if ($state.is('secured.label.view')) { + // Select the last message with this label + var lastLabel = _.chain(messages).filter(function(message) { + return message.LabelIDs.indexOf($stateParams.label) !== -1; + }).last().value(); + + $state.go('.', {message: lastLabel.ID}); + } else { + // If the latest message is read, we open it + if(latest.IsRead === 1) { + $state.go('.', {message: latest.ID}); + } else { + // Else we open the first message unread beginning to the end list + var loop = true; + var index = messages.length - 1; + + while(loop === true && index > 0) { + index--; + + if(messages[index].IsRead === 1) { // Is read + loop = false; + index++; + } + } + + if (loop === true) { // No message read found + index = 0; + } + + $state.go('.', {message: messages[index].ID}); + } + } + + $scope.messages = messages; + } else { + $scope.back(); + } + } else { + $scope.back(); + } + }; + + $scope.refreshConversation = function() { + var conversation = cache.getConversationCached($stateParams.id); + var messages = cache.queryMessagesCached($stateParams.id); + var loc = tools.currentLocation(); + + if(angular.isDefined(conversation)) { + var labels = conversation.LabelIDs; + + if(labels.indexOf(loc) !== -1 || loc === CONSTANTS.MAILBOX_IDENTIFIERS.search) { + _.extend($scope.conversation, conversation); + } else { + return $scope.back(); + } + } else { + return $scope.back(); + } + + if(angular.isArray(messages) && messages.length > 0) { + var toAdd = []; + var toRemove = []; + var index, message, found, ref; + var find = function(messages, ID) { + return _.find(messages, function(m) { return m.ID === ID; }); + }; + + if($state.is('secured.starred.view') === false && $state.is('secured.label.view') === false && $state.is('secured.search.view') === false) { + // Remove trashed message + if ($state.is('secured.trash.view') === false && $scope.showTrashed === false) { + messages = _.reject(messages, function(message) { return message.LabelIDs.indexOf(CONSTANTS.MAILBOX_IDENTIFIERS.trash) !== -1; }); + } + + // Remove non trashed message + if ($state.is('secured.trash.view') === true && $scope.showNonTrashed === false) { + messages = _.reject(messages, function(message) { return message.LabelIDs.indexOf(CONSTANTS.MAILBOX_IDENTIFIERS.trash) === -1; }); + } + } + + // Sort by time + messages = cache.orderMessage(messages).reverse(); + + for (index = 0; index < messages.length; index++) { + found = find($scope.messages, messages[index].ID); + + if (angular.isUndefined(found)) { + toAdd.push({index: index, message: messages[index]}); + } + } + + for (index = 0; index < toAdd.length; index++) { + ref = toAdd[index]; + + // Insert new message + $scope.messages.splice(ref.index, 0, ref.message); + } + + for (index = 0; index < $scope.messages.length; index++) { + found = find(messages, $scope.messages[index].ID); + + if (angular.isUndefined(found)) { + toRemove.push({index: index}); + } + } + + for (index = toRemove.length - 1; index >= 0; index--) { + ref = toRemove[index]; + + // Remove message deleted + $scope.messages.splice(ref.index, 1); + } + } else { + $scope.back(); + } + }; + + /** + * Return if there are trashed message inside this conversation + * @return {Boolean} + */ + $scope.trashed = function() { + return $scope.conversation.LabelIDs.indexOf(CONSTANTS.MAILBOX_IDENTIFIERS.trash) !== -1; + }; + + /** + * Return if there are non trashed message inside this conversation + * @return {Boolean} + */ + $scope.nonTrashed = function() { + var result = false; + var locations = [ + CONSTANTS.MAILBOX_IDENTIFIERS.inbox, + CONSTANTS.MAILBOX_IDENTIFIERS.drafts, + CONSTANTS.MAILBOX_IDENTIFIERS.sent, + CONSTANTS.MAILBOX_IDENTIFIERS.spam, + CONSTANTS.MAILBOX_IDENTIFIERS.starred, + CONSTANTS.MAILBOX_IDENTIFIERS.archive + ]; + + _.each($scope.conversation.LabelIDs, function(labelID) { + if (locations.indexOf(labelID) !== -1) { + result = true; + } + }); + + return result; + }; + + /** + * Toggle trashed messages + */ + $scope.toggleTrashed = function() { + $scope.showTrashed = !$scope.showTrashed; + $scope.refreshConversation(); + }; + + /** + * Toggle non trashed messages + */ + $scope.toggleNonTrashed = function() { + $scope.showNonTrashed = !$scope.showNonTrashed; + $scope.refreshConversation(); + }; + + /** + * Return messages data for dropdown labels + */ + $scope.getMessages = function() { + return $scope.messages; + }; + + /** + * Mark current conversation as read + * @param {Boolean} back + */ + $scope.read = function() { + var ids = [$scope.conversation.ID]; + + action.readConversation(ids); + }; + + /** + * Mark current conversation as unread + */ + $scope.unread = function() { + var ids = [$scope.conversation.ID]; + + action.unreadConversation(ids); + + $scope.back(); + }; + + /** + * Delete current conversation + */ + $scope.delete = function() { + var ids = [$scope.conversation.ID]; + + action.deleteConversation(ids); + }; + + /** + * Move current conversation to a specific location + */ + $scope.move = function(mailbox) { + var ids = [$scope.conversation.ID]; + + action.moveConversation(ids, mailbox); + }; + + /** + * Apply labels for the current conversation + * @return {Promise} + */ + $scope.saveLabels = function(labels, alsoArchive) { + var ids = [$scope.conversation.ID]; + + action.labelConversation(ids, labels, alsoArchive); + }; + + /** + * Scroll to the message specified + * @param {String} ID + */ + $scope.scrollToMessage = function(ID) { + $timeout.cancel(scrollPromise); + var index = _.findIndex($scope.messages, {ID: ID}); + var id = '#message' + index; + + scrollPromise = $timeout(function() { + var element = angular.element(id); + + if(angular.isElement(element) && angular.isDefined(element.offset())) { + var headerOffset = $('#conversationHeader').offset().top + $('#conversationHeader').outerHeight(); + var amountScrolled = $('#pm_thread').scrollTop(); + var paddingTop = parseInt($('#pm_thread').css('padding-top').replace('px', '')); + var value = element.offset().top + amountScrolled - headerOffset - paddingTop; + + if (index === 0) { + // Do nothing + } else if (index === 1) { + value -= 15; + } else if (index > 1) { + value -= 68; + } + + $('#pm_thread').animate({ + scrollTop: value + }, 200); + } + }, 100); + }; + + /** + * Toggle star status for current conversation + */ + $scope.toggleStar = function() { + if($scope.starred() === true) { + $scope.unstar(); + } else { + $scope.star(); + } + }; + + /** + * Star the current conversation + */ + $scope.star = function() { + action.starConversation($scope.conversation.ID); + }; + + /** + * Unstar the current conversation + */ + $scope.unstar = function() { + action.unstarConversation($scope.conversation.ID); + }; + + /** + * Return status of the star conversation + * @return {Boolean} + */ + $scope.starred = function() { + return $scope.conversation.LabelIDs.indexOf(CONSTANTS.MAILBOX_IDENTIFIERS.starred) !== -1; + }; + + // Call initialization + $scope.initialization(); + +}); diff --git a/src/app/controllers/conversations.js b/src/app/controllers/conversations.js new file mode 100644 index 0000000..ea87962 --- /dev/null +++ b/src/app/controllers/conversations.js @@ -0,0 +1,937 @@ +angular.module("proton.controllers.Conversations", ["proton.constants"]) + +.controller('ConversationsController', function( + $q, + $log, + $rootScope, + $scope, + $state, + $stateParams, + $timeout, + gettextCatalog, + $filter, + $window, + $cookies, + action, + CONSTANTS, + Conversation, + Message, + eventManager, + Label, + regexEmail, + authentication, + cache, + confirmModal, + Setting, + cacheCounters, + networkActivityTracker, + notify, + tools +) { + var lastChecked = null; + var unbindWatcherElements; + var firstLoad = true; // Variable used to determine if it's the first load to force the cache to call back-end result + + /** + * Method called at the initialization of this controller + */ + $scope.initialization = function() { + // Variables + $scope.mailbox = tools.currentMailbox(); + $scope.conversationsPerPage = authentication.user.NumMessagePerPage; + $scope.labels = authentication.user.Labels; + $scope.messageButtons = authentication.user.MessageButtons; + $scope.Math = window.Math; + $scope.elementPerPage = CONSTANTS.ELEMENTS_PER_PAGE; + $scope.selectedFilter = $stateParams.filter; + $scope.selectedOrder = $stateParams.sort || "-date"; + $scope.page = parseInt($stateParams.page || 1); + $scope.startWatchingEvent(); + $scope.refreshConversations().then(function() { + $timeout($scope.actionsDelayed); // If we don't use the timeout, messages seems not available (to unselect for example) + // I consider this trick like a bug in the angular application + }, function(error) { + $log.error(error); + }); + $scope.setTimeWidths(); + + }; + + $scope.setTimeWidths = function() { + + // Dec 28, 2888 - longest possible width + var time = '29000668525'; + + // initalize to zero + var width = 0; + + // convert timestamp to readabile, LOCALIZED time format + time = $filter('readableTime')(time); + + // append to DOM: + $('body').append(' diff --git a/src/app/templates/directives/card-icon.tpl.html b/src/app/templates/directives/card-icon.tpl.html new file mode 100644 index 0000000..5e174fb --- /dev/null +++ b/src/app/templates/directives/card-icon.tpl.html @@ -0,0 +1 @@ + diff --git a/src/app/templates/directives/labels.tpl.html b/src/app/templates/directives/labels.tpl.html new file mode 100644 index 0000000..9879f75 --- /dev/null +++ b/src/app/templates/directives/labels.tpl.html @@ -0,0 +1,41 @@ +
+
+

No labels

+
+ + +
+
+
    +
  • + +
  • +
+
+
+
+
+ +
+
+ +
+
+
+ +
+ + +
+
+
diff --git a/src/app/templates/directives/loader-tag.tpl.html b/src/app/templates/directives/loader-tag.tpl.html new file mode 100644 index 0000000..41ff658 --- /dev/null +++ b/src/app/templates/directives/loader-tag.tpl.html @@ -0,0 +1 @@ +
\ No newline at end of file diff --git a/src/app/templates/directives/location-tag.tpl.html b/src/app/templates/directives/location-tag.tpl.html old mode 100755 new mode 100644 index fa3fb9d..845fbfe --- a/src/app/templates/directives/location-tag.tpl.html +++ b/src/app/templates/directives/location-tag.tpl.html @@ -1,47 +1,8 @@ - - {{ 'INBOX' | translate }} + + Inbox + Draft + Sent + Trash + Spam + Archive - - - {{ 'DRAFTS' | translate }} - - - - {{ 'SENT' | translate }} - - - - {{ 'ARCHIVE' | translate }} - - - - {{ 'SPAM' | translate }} - - - - {{ 'TRASH' | translate }} - \ No newline at end of file diff --git a/src/app/templates/directives/move.tpl.html b/src/app/templates/directives/move.tpl.html new file mode 100644 index 0000000..6d23c60 --- /dev/null +++ b/src/app/templates/directives/move.tpl.html @@ -0,0 +1,16 @@ +
+ + +
diff --git a/src/app/templates/directives/paginator.tpl.html b/src/app/templates/directives/paginator.tpl.html new file mode 100644 index 0000000..16ba36a --- /dev/null +++ b/src/app/templates/directives/paginator.tpl.html @@ -0,0 +1,19 @@ + + + + + + + {{ page }} + + + + + Page {{ p }} + + + + + + + diff --git a/src/app/templates/directives/selector.tpl.html b/src/app/templates/directives/selector.tpl.html new file mode 100644 index 0000000..edb1f26 --- /dev/null +++ b/src/app/templates/directives/selector.tpl.html @@ -0,0 +1,8 @@ + + + + + + + + diff --git a/src/app/templates/directives/squire.tpl.html b/src/app/templates/directives/squire.tpl.html old mode 100755 new mode 100644 index 02b3a5d..df249e1 --- a/src/app/templates/directives/squire.tpl.html +++ b/src/app/templates/directives/squire.tpl.html @@ -1,74 +1,80 @@
-
    -
  • - + + +
    diff --git a/src/app/templates/directives/toggle.tpl.html b/src/app/templates/directives/toggle.tpl.html new file mode 100644 index 0000000..d2ef303 --- /dev/null +++ b/src/app/templates/directives/toggle.tpl.html @@ -0,0 +1,5 @@ +
    + {{ on }} + {{ off }} + +
    diff --git a/src/app/templates/layout/account.tpl.html b/src/app/templates/layout/account.tpl.html deleted file mode 100755 index 755eeb9..0000000 --- a/src/app/templates/layout/account.tpl.html +++ /dev/null @@ -1,13 +0,0 @@ - - -
    - -
    -
    -
    -
    -
    - -
    - - diff --git a/src/app/templates/layout/admin.tpl.html b/src/app/templates/layout/admin.tpl.html deleted file mode 100755 index 66f455a..0000000 --- a/src/app/templates/layout/admin.tpl.html +++ /dev/null @@ -1,7 +0,0 @@ - - -
    -
    -
    - - diff --git a/src/app/templates/layout/auth.tpl.html b/src/app/templates/layout/auth.tpl.html old mode 100755 new mode 100644 index c2e5be3..acffe8f --- a/src/app/templates/layout/auth.tpl.html +++ b/src/app/templates/layout/auth.tpl.html @@ -1,4 +1,5 @@ - + +
    @@ -7,5 +8,3 @@
- - diff --git a/src/app/templates/layout/login.tpl.html b/src/app/templates/layout/login.tpl.html old mode 100755 new mode 100644 index c41f7b7..72a006a --- a/src/app/templates/layout/login.tpl.html +++ b/src/app/templates/layout/login.tpl.html @@ -1,17 +1,9 @@ - - -
- -
-

Decrypting Mailbox

- -
- -
-
-
-

v{{ app_version }}

+ +
+
- \ No newline at end of file + diff --git a/src/app/templates/layout/outside.tpl.html b/src/app/templates/layout/outside.tpl.html old mode 100755 new mode 100644 index 3b77a44..1cb3628 --- a/src/app/templates/layout/outside.tpl.html +++ b/src/app/templates/layout/outside.tpl.html @@ -1,11 +1,10 @@ - - -
- -
-
-
+ + +
+
- + diff --git a/src/app/templates/layout/pre.tpl.html b/src/app/templates/layout/pre.tpl.html old mode 100755 new mode 100644 index 301034a..2a1cfaf --- a/src/app/templates/layout/pre.tpl.html +++ b/src/app/templates/layout/pre.tpl.html @@ -1,7 +1,8 @@ - + + -
-Verifying Invite Link... -
+

 

- \ No newline at end of file +
+

Verifying invite link...

+
diff --git a/src/app/templates/layout/secured.tpl.html b/src/app/templates/layout/secured.tpl.html old mode 100755 new mode 100644 index 316791c..874d7d0 --- a/src/app/templates/layout/secured.tpl.html +++ b/src/app/templates/layout/secured.tpl.html @@ -1,14 +1,12 @@ - - -
- - - - - - -
+ + + + + +
+ + + + + + diff --git a/src/app/templates/modals/alert.tpl.html b/src/app/templates/modals/alert.tpl.html old mode 100755 new mode 100644 index 5727c68..47a38b4 --- a/src/app/templates/modals/alert.tpl.html +++ b/src/app/templates/modals/alert.tpl.html @@ -1,12 +1,17 @@ -