diff --git a/Gruntfile.js b/Gruntfile.js
new file mode 100644
index 00000000..83879ed2
--- /dev/null
+++ b/Gruntfile.js
@@ -0,0 +1,360 @@
+module.exports = function(grunt) {
+
+ const version = grunt.option('release');
+ const fs = require('fs');
+
+ // Project configuration.
+ const dev = !!grunt.option('dev');
+ const compat = !!grunt.option('compat');
+ const lightweight = !!grunt.option('lightweight');
+ const plugins = compat ? [
+ "transform-async-to-generator",
+ "syntax-async-functions",
+ "transform-regenerator",
+ "transform-runtime"
+ ] : [];
+ const presets = [[require.resolve('babel-preset-env'), {
+ targets: {
+ browsers: compat ? [
+ 'IE >= 11',
+ 'Safari >= 9',
+ 'Last 2 Chrome versions',
+ 'Last 2 Firefox versions',
+ 'Last 2 Edge versions'
+ ] : [
+ 'Last 2 Chrome versions',
+ 'Last 2 Firefox versions',
+ 'Last 2 Safari versions',
+ 'Last 2 Edge versions'
+ ]
+ }
+ }]];
+ grunt.initConfig({
+ pkg: grunt.file.readJSON('package.json'),
+ browserify: {
+ openpgp: {
+ files: {
+ 'dist/openpgp.js': ['./src/index.js']
+ },
+ options: {
+ browserifyOptions: {
+ fullPaths: dev,
+ debug: dev,
+ standalone: 'openpgp'
+ },
+ cacheFile: 'browserify-cache' + (compat ? '-compat' : '') + (lightweight ? '-lightweight' : '') + '.json',
+ // Don't bundle these packages with openpgp.js
+ external: ['crypto', 'zlib', 'node-localstorage', 'node-fetch', 'asn1.js', 'stream', 'buffer'].concat(
+ compat ? [] : [
+ 'whatwg-fetch',
+ 'core-js/fn/array/fill',
+ 'core-js/fn/array/find',
+ 'core-js/fn/array/includes',
+ 'core-js/fn/array/from',
+ 'core-js/fn/promise',
+ 'core-js/fn/typed/uint8-array',
+ 'core-js/fn/string/repeat',
+ 'core-js/fn/symbol',
+ 'core-js/fn/object/assign'
+ ],
+ lightweight ? [
+ 'elliptic',
+ 'elliptic.min.js'
+ ] : []
+ ),
+ transform: [
+ ["babelify", {
+ global: true,
+ // Only babelify web-streams-polyfill, web-stream-tools, asmcrypto, email-addresses and seek-bzip in node_modules
+ only: /^(?:.*\/node_modules\/@mattiasbuelens\/web-streams-polyfill\/|.*\/node_modules\/web-stream-tools\/|.*\/node_modules\/asmcrypto\.js\/|.*\/node_modules\/email-addresses\/|.*\/node_modules\/seek-bzip\/|(?!.*\/node_modules\/)).*$/,
+ ignore: ['*.min.js'],
+ plugins,
+ presets
+ }]
+ ],
+ plugin: ['browserify-derequire']
+ }
+ },
+ worker: {
+ files: {
+ 'dist/openpgp.worker.js': ['./src/worker/worker.js']
+ },
+ options: {
+ cacheFile: 'browserify-cache-worker.json'
+ }
+ },
+ unittests: {
+ files: {
+ 'test/lib/unittests-bundle.js': ['./test/unittests.js']
+ },
+ options: {
+ cacheFile: 'browserify-cache-unittests.json',
+ external: ['buffer', 'openpgp', '../../dist/openpgp', '../../../dist/openpgp'],
+ transform: [
+ ["babelify", {
+ global: true,
+ // Only babelify chai-as-promised in node_modules
+ only: /^(?:.*\/node_modules\/chai-as-promised\/|(?!.*\/node_modules\/)).*$/,
+ ignore: ['*.min.js'],
+ plugins,
+ presets
+ }]
+ ]
+ }
+ }
+ },
+ nyc: {
+ cover: {
+ options: {
+ include: ['dist/**'],
+ reporter: ['text-summary'],
+ reportDir: 'coverage'
+ },
+ cmd: false,
+ args: ['grunt', 'mochaTest'],
+ sourceMap: true
+ },
+ report: {
+ options: {
+ reporter: 'text'
+ }
+ }
+ },
+ replace: {
+ openpgp: {
+ src: ['dist/openpgp.js'],
+ dest: ['dist/openpgp.js'],
+ replacements: [{
+ from: /OpenPGP.js VERSION/g,
+ to: 'OpenPGP.js v<%= pkg.version %>'
+ }]
+ },
+ openpgp_min: {
+ src: ['dist/openpgp.min.js'],
+ dest: ['dist/openpgp.min.js'],
+ replacements: [{
+ from: "openpgp.worker.js",
+ to: "openpgp.worker.min.js"
+ }]
+ },
+ worker_min: {
+ src: ['dist/openpgp.worker.min.js'],
+ dest: ['dist/openpgp.worker.min.js'],
+ replacements: [{
+ from: "openpgp.js",
+ to: "openpgp.min.js"
+ }]
+ },
+ lightweight_build: {
+ src: ['dist/openpgp.js'],
+ overwrite: true,
+ replacements: [
+ {
+ from: "external_indutny_elliptic: false",
+ to: "external_indutny_elliptic: true"
+ }
+ ]
+ },
+ indutny_global: {
+ src: ['dist/elliptic.min.js'],
+ overwrite: true,
+ replacements: [
+ {
+ from: 'b.elliptic=a()',
+ to: 'b.openpgp.elliptic=a()'
+ }
+ ]
+ }
+ },
+ terser: {
+ openpgp: {
+ files: {
+ 'dist/openpgp.min.js' : ['dist/openpgp.js'],
+ 'dist/openpgp.worker.min.js' : ['dist/openpgp.worker.js']
+ },
+ options: {
+ output: {
+ comments: `/^!/`
+ },
+ sourceMap: dev ? {
+ content: 'inline',
+ url: 'inline'
+ } : {},
+ safari10: true
+ }
+ }
+ },
+ header: {
+ openpgp: {
+ options: {
+ text: '/*! OpenPGP.js v<%= pkg.version %> - ' +
+ '<%= grunt.template.today("yyyy-mm-dd") %> - ' +
+ 'this is LGPL licensed code, see LICENSE/our website <%= pkg.homepage %> for more information. */'
+ },
+ files: {
+ 'dist/openpgp.js': 'dist/openpgp.js',
+ 'dist/openpgp.worker.js': 'dist/openpgp.worker.js'
+ }
+ }
+ },
+ jsbeautifier: {
+ files: ['src/**/*.js'],
+ options: {
+ indent_size: 2,
+ preserve_newlines: true,
+ keep_array_indentation: false,
+ keep_function_indentation: false,
+ wrap_line_length: 120
+ }
+ },
+ eslint: {
+ target: ['src/**/*.js', './Gruntfile.js', './eslintrc.js', 'test/crypto/**/*.js'],
+ options: {
+ configFile: '.eslintrc.js',
+ fix: !!grunt.option('fix')
+ }
+ },
+ jsdoc: {
+ dist: {
+ src: ['README.md', 'src'],
+ options: {
+ configure: '.jsdocrc.js',
+ destination: 'doc',
+ recurse: true
+ }
+ }
+ },
+ mochaTest: {
+ unittests: {
+ options: {
+ reporter: 'spec',
+ timeout: 120000,
+ grep: lightweight ? 'lightweight' : undefined
+ },
+ src: ['test/unittests.js']
+ }
+ },
+ copy: {
+ browsertest: {
+ expand: true,
+ flatten: true,
+ cwd: 'node_modules/',
+ src: ['mocha/mocha.css', 'mocha/mocha.js'],
+ dest: 'test/lib/'
+ },
+ openpgp_compat: {
+ expand: true,
+ cwd: 'dist/',
+ src: ['*.js'],
+ dest: 'dist/compat/'
+ },
+ openpgp_lightweight: {
+ expand: true,
+ cwd: 'dist/',
+ src: ['*.js'],
+ dest: 'dist/lightweight/'
+ },
+ indutny_elliptic: {
+ expand: true,
+ flatten: true,
+ src: ['./node_modules/elliptic/dist/elliptic.min.js'],
+ dest: 'dist/'
+ }
+ },
+ clean: {
+ dist: ['dist/'],
+ js: ['dist/*.js']
+ },
+ connect: {
+ dev: {
+ options: {
+ port: 3001,
+ base: '.',
+ keepalive: true
+ }
+ },
+ test: {
+ options: {
+ port: 3000,
+ base: '.'
+ }
+ }
+ },
+ watch: {
+ src: {
+ files: ['src/**/*.js'],
+ tasks: lightweight ? ['browserify:openpgp', 'browserify:worker', 'replace:lightweight_build'] : ['browserify:openpgp', 'browserify:worker']
+ },
+ test: {
+ files: ['test/*.js', 'test/crypto/**/*.js', 'test/general/**/*.js', 'test/worker/**/*.js'],
+ tasks: ['browserify:unittests']
+ }
+ }
+ });
+
+ // Load the plugin(s)
+ grunt.loadNpmTasks('grunt-browserify');
+ grunt.loadNpmTasks('grunt-terser');
+ grunt.loadNpmTasks('grunt-header');
+ grunt.loadNpmTasks('grunt-text-replace');
+ grunt.loadNpmTasks('grunt-jsbeautifier');
+ grunt.loadNpmTasks('grunt-jsdoc');
+ grunt.loadNpmTasks('gruntify-eslint');
+ grunt.loadNpmTasks('grunt-mocha-test');
+ grunt.loadNpmTasks('grunt-contrib-copy');
+ grunt.loadNpmTasks('grunt-contrib-clean');
+ grunt.loadNpmTasks('grunt-contrib-connect');
+ grunt.loadNpmTasks('grunt-contrib-watch');
+ grunt.loadNpmTasks('grunt-simple-nyc');
+
+ grunt.registerTask('set_version', function() {
+ if (!version) {
+ throw new Error('You must specify the version: "--release=1.0.0"');
+ }
+
+ patchFile({
+ fileName: 'package.json',
+ version: version
+ });
+
+ patchFile({
+ fileName: 'package-lock.json',
+ version: version
+ });
+
+ patchFile({
+ fileName: 'bower.json',
+ version: version
+ });
+ });
+
+ function patchFile(options) {
+ const path = './' + options.fileName;
+ //eslint-disable-next-line
+ const file = require(path);
+
+ if (options.version) {
+ file.version = options.version;
+ }
+ //eslint-disable-next-line
+ fs.writeFileSync(path, JSON.stringify(file, null, 2) + '\n');
+ }
+
+ // Build tasks
+ grunt.registerTask('version', ['replace:openpgp']);
+ grunt.registerTask('replace_min', ['replace:openpgp_min', 'replace:worker_min']);
+ grunt.registerTask('build', function() {
+ if (lightweight) {
+ grunt.task.run(['copy:indutny_elliptic', 'browserify:openpgp', 'browserify:worker', 'replace:lightweight_build', 'replace:indutny_global', 'version', 'header', 'terser', 'replace_min']);
+ return;
+ }
+ grunt.task.run(['browserify:openpgp', 'browserify:worker', 'version', 'header', 'terser', 'replace_min']);
+ }
+ );
+ grunt.registerTask('documentation', ['jsdoc']);
+ grunt.registerTask('default', ['build']);
+ // Test/Dev tasks
+ grunt.registerTask('test', ['eslint', 'mochaTest']);
+ grunt.registerTask('coverage', ['nyc']);
+ grunt.registerTask('browsertest', ['build', 'browserify:unittests', 'copy:browsertest', 'connect:test', 'watch']);
+};
diff --git a/README.md b/README.md
index 953b2aca..7dfa559e 100644
--- a/README.md
+++ b/README.md
@@ -1,3 +1,601 @@
-# tEnvoy
+OpenPGP.js [![Build Status](https://travis-ci.org/openpgpjs/openpgpjs.svg?branch=master)](https://travis-ci.org/openpgpjs/openpgpjs) [![BrowserStack Status](https://automate.browserstack.com/badge.svg?badge_key=eEkxVVM1TytwOGJNWEdnTjk4Y0VNUUNyR3pXcEtJUGRXOVFBRjVNT1JpUT0tLTZYUlZaMWdtQWs4Z0ROS3grRXc2bFE9PQ==--4a9cac0d6ea009d81aff66de0dbb239edd1aef3c)](https://automate.browserstack.com/public-build/eEkxVVM1TytwOGJNWEdnTjk4Y0VNUUNyR3pXcEtJUGRXOVFBRjVNT1JpUT0tLTZYUlZaMWdtQWs4Z0ROS3grRXc2bFE9PQ==--4a9cac0d6ea009d81aff66de0dbb239edd1aef3c) [![Join the chat on Gitter](https://badges.gitter.im/Join%20Chat.svg)](https://gitter.im/openpgpjs/openpgpjs?utm_source=badge&utm_medium=badge&utm_campaign=pr-badge&utm_content=badge)
+==========
-More details coming soon...
+[OpenPGP.js](https://openpgpjs.org/) is a JavaScript implementation of the OpenPGP protocol. This is defined in [RFC 4880](https://tools.ietf.org/html/rfc4880).
+
+
+**Table of Contents**
+
+- [OpenPGP.js](#openpgpjs)
+ - [Platform Support](#platform-support)
+ - [Performance](#performance)
+ - [Getting started](#getting-started)
+ - [Npm](#npm)
+ - [Bower](#bower)
+ - [Examples](#examples)
+ - [Set up](#set-up)
+ - [Encrypt and decrypt *Uint8Array* data with a password](#encrypt-and-decrypt-uint8array-data-with-a-password)
+ - [Encrypt and decrypt *String* data with PGP keys](#encrypt-and-decrypt-string-data-with-pgp-keys)
+ - [Encrypt with compression](#encrypt-with-compression)
+ - [Streaming encrypt *Uint8Array* data with a password](#streaming-encrypt-uint8array-data-with-a-password)
+ - [Streaming encrypt and decrypt *String* data with PGP keys](#streaming-encrypt-and-decrypt-string-data-with-pgp-keys)
+ - [Generate new key pair](#generate-new-key-pair)
+ - [Revoke a key](#revoke-a-key)
+ - [Lookup public key on HKP server](#lookup-public-key-on-hkp-server)
+ - [Upload public key to HKP server](#upload-public-key-to-hkp-server)
+ - [Sign and verify cleartext messages](#sign-and-verify-cleartext-messages)
+ - [Create and verify *detached* signatures](#create-and-verify-detached-signatures)
+ - [Streaming sign and verify *Uint8Array* data](#streaming-sign-and-verify-uint8array-data)
+ - [Documentation](#documentation)
+ - [Security Audit](#security-audit)
+ - [Security recommendations](#security-recommendations)
+ - [Development](#development)
+ - [How do I get involved?](#how-do-i-get-involved)
+ - [License](#license)
+ - [Resources](#resources)
+
+
+
+### Platform Support
+
+* The `dist/openpgp.min.js` bundle works well with recent versions of Chrome, Firefox, Safari and Edge. It also works in Node.js 8+.
+
+* The `dist/compat/openpgp.min.js` bundle also works with Internet Explorer 11 and old versions of Safari. Please note that this bundle overwrites the global `Promise` with a polyfill version even in some cases where it already exists, which may cause issues. It also adds some built-in prototype functions if they don't exist, such as `Array.prototype.includes`.
+
+* If you wish, you could even load one or the other depending on which browser the user is using. However, if you're using the Web Worker, keep in mind that you also need to pass `{ path: 'compat/openpgp.worker.min.js' }` to `initWorker` whenever you load `compat/openpgp.min.js`.
+
+* Currently, Chrome, Safari and Edge have partial implementations of the
+[Streams specification](https://streams.spec.whatwg.org/), and Firefox
+has a partial implementation behind feature flags. Chrome is the only
+browser that implements `TransformStream`s, which we need, so we include
+a [polyfill](https://github.com/MattiasBuelens/web-streams-polyfill) for
+all other browsers. Please note that in those browsers, the global
+`ReadableStream` property gets overwritten with the polyfill version if
+it exists. In some edge cases, you might need to use the native
+`ReadableStream` (for example when using it to create a `Response`
+object), in which case you should store a reference to it before loading
+OpenPGP.js. There is also the
+[web-streams-adapter](https://github.com/MattiasBuelens/web-streams-adapter)
+library to convert back and forth between them.
+
+### Performance
+
+* Version 3.0.0 of the library introduces support for public-key cryptography using [elliptic curves](https://wiki.gnupg.org/ECC). We use native implementations on browsers and Node.js when available or [Elliptic](https://github.com/indutny/elliptic) otherwise. Elliptic curve cryptography provides stronger security per bits of key, which allows for much faster operations. Currently the following curves are supported (* = when available):
+
+
+ | Curve | Encryption | Signature | Elliptic | NodeCrypto | WebCrypto |
+ |:--------------- |:----------:|:---------:|:--------:|:----------:|:---------:|
+ | p256 | ECDH | ECDSA | Yes | Yes* | Yes* |
+ | p384 | ECDH | ECDSA | Yes | Yes* | Yes* |
+ | p521 | ECDH | ECDSA | Yes | Yes* | Yes* |
+ | secp256k1 | ECDH | ECDSA | Yes | Yes* | No |
+ | brainpoolP256r1 | ECDH | ECDSA | Yes | Yes* | No |
+ | brainpoolP384r1 | ECDH | ECDSA | Yes | Yes* | No |
+ | brainpoolP512r1 | ECDH | ECDSA | Yes | Yes* | No |
+ | curve25519 | ECDH | N/A | Yes | No | No |
+ | ed25519 | N/A | EdDSA | Yes | No | No |
+
+* Version 2.x of the library has been built from the ground up with Uint8Arrays. This allows for much better performance and memory usage than strings.
+
+* If the user's browser supports [native WebCrypto](https://caniuse.com/#feat=cryptography) via the `window.crypto.subtle` API, this will be used. Under Node.js the native [crypto module](https://nodejs.org/api/crypto.html#crypto_crypto) is used. This can be deactivated by setting `openpgp.config.use_native = false`.
+
+* The library implements the [IETF proposal](https://tools.ietf.org/html/draft-ietf-openpgp-rfc4880bis-07) for authenticated encryption using native AES-EAX, OCB, or GCM. This makes symmetric encryption up to 30x faster on supported platforms. Since the specification has not been finalized and other OpenPGP implementations haven't adopted it yet, the feature is currently behind a flag. **Note: activating this setting can break compatibility with other OpenPGP implementations, and also with future versions of OpenPGP.js. Don't use it with messages you want to store on disk or in a database.** You can enable it by setting `openpgp.config.aead_protect = true`.
+
+ You can change the AEAD mode by setting one of the following options:
+
+ ```
+ openpgp.config.aead_mode = openpgp.enums.aead.eax // Default, native
+ openpgp.config.aead_mode = openpgp.enums.aead.ocb // Non-native
+ openpgp.config.aead_mode = openpgp.enums.aead.experimental_gcm // **Non-standard**, fastest
+ ```
+
+* For environments that don't provide native crypto, the library falls back to [asm.js](https://caniuse.com/#feat=asmjs) implementations of AES, SHA-1, and SHA-256. We use [Rusha](https://github.com/srijs/rusha) and [asmCrypto Lite](https://github.com/openpgpjs/asmcrypto-lite) (a minimal subset of asmCrypto.js built specifically for OpenPGP.js).
+
+
+### Getting started
+
+#### Npm
+
+ npm install --save openpgp
+
+#### Bower
+
+ bower install --save openpgp
+
+Or just fetch a minified build under [dist](https://github.com/openpgpjs/openpgpjs/tree/master/dist).
+
+
+### Examples
+
+Here are some examples of how to use the v2.x+ API. For more elaborate examples and working code, please check out the [public API unit tests](https://github.com/openpgpjs/openpgpjs/blob/master/test/general/openpgp.js). If you're upgrading from v1.x it might help to check out the [documentation](https://github.com/openpgpjs/openpgpjs#documentation).
+
+#### Set up
+
+##### Node.js
+
+```js
+const openpgp = require('openpgp');
+```
+
+##### Browser
+
+Copy `dist/openpgp.min.js` or `dist/compat/openpgp.min.js` (depending on the browser support you need, see [Platform Support](#platform-support)) to your project folder, and load it in a script tag:
+
+```html
+
+```
+
+If you want to use the built-in Web Worker, to offload cryptographic operations off the main thread:
+
+```js
+await openpgp.initWorker({ path: 'openpgp.worker.js' }); // set the relative web worker path
+```
+
+On logout, be sure to destroy the worker again, to clear private keys from memory:
+
+```js
+await openpgp.destroyWorker();
+```
+
+Alternatively, you can also implement a Web Worker in your application and load OpenPGP.js from there. This can be more performant if you store or fetch keys and messages directly inside the Worker, so that they don't have to be `postMessage`d there.
+
+If you want to use the lightweight build (which is smaller, and lazily loads non-default curves on demand), copy `dist/lightweight/openpgp.min.js` and `dist/lightweight/elliptic.min.js`, load the former in a script tag, and point `openpgp.config.indutny_elliptic_path` to the latter:
+
+```html
+
+
+```
+
+To test whether the lazy loading works, try:
+
+```js
+await openpgp.generateKey({ curve: 'brainpoolP512r1', userIds: [{ name: 'Test', email: 'test@test.com' }] });
+```
+
+For more examples of how to generate a key, see [Generate new key pair](#generate-new-key-pair). It is recommended to use `curve25519` instead of `brainpoolP512r1` by default.
+
+#### Encrypt and decrypt *Uint8Array* data with a password
+
+Encryption will use the algorithm specified in config.encryption_cipher (defaults to aes256), and decryption will use the algorithm used for encryption.
+
+```js
+(async () => {
+ const { message } = await openpgp.encrypt({
+ message: openpgp.message.fromBinary(new Uint8Array([0x01, 0x01, 0x01])), // input as Message object
+ passwords: ['secret stuff'], // multiple passwords possible
+ armor: false // don't ASCII armor (for Uint8Array output)
+ });
+ const encrypted = message.packets.write(); // get raw encrypted packets as Uint8Array
+
+ const { data: decrypted } = await openpgp.decrypt({
+ message: await openpgp.message.read(encrypted), // parse encrypted bytes
+ passwords: ['secret stuff'], // decrypt with password
+ format: 'binary' // output as Uint8Array
+ });
+ console.log(decrypted); // Uint8Array([0x01, 0x01, 0x01])
+})();
+```
+
+#### Encrypt and decrypt *String* data with PGP keys
+
+Encryption will use the algorithm preferred by the public key (defaults to aes256 for keys generated in OpenPGP.js), and decryption will use the algorithm used for encryption.
+
+```js
+const openpgp = require('openpgp'); // use as CommonJS, AMD, ES6 module or via window.openpgp
+
+(async () => {
+ await openpgp.initWorker({ path: 'openpgp.worker.js' }); // set the relative web worker path
+
+ // put keys in backtick (``) to avoid errors caused by spaces or tabs
+ const publicKeyArmored = `-----BEGIN PGP PUBLIC KEY BLOCK-----
+...
+-----END PGP PUBLIC KEY BLOCK-----`;
+ const privateKeyArmored = `-----BEGIN PGP PRIVATE KEY BLOCK-----
+...
+-----END PGP PRIVATE KEY BLOCK-----`; // encrypted private key
+ const passphrase = `yourPassphrase`; // what the private key is encrypted with
+
+ const { keys: [privateKey] } = await openpgp.key.readArmored(privateKeyArmored);
+ await privateKey.decrypt(passphrase);
+
+ const { data: encrypted } = await openpgp.encrypt({
+ message: openpgp.message.fromText('Hello, World!'), // input as Message object
+ publicKeys: (await openpgp.key.readArmored(publicKeyArmored)).keys, // for encryption
+ privateKeys: [privateKey] // for signing (optional)
+ });
+ console.log(encrypted); // '-----BEGIN PGP MESSAGE ... END PGP MESSAGE-----'
+ const { data: decrypted } = await openpgp.decrypt({
+ message: await openpgp.message.readArmored(encrypted), // parse armored message
+ publicKeys: (await openpgp.key.readArmored(publicKeyArmored)).keys, // for verification (optional)
+ privateKeys: [privateKey] // for decryption
+ });
+ console.log(decrypted); // 'Hello, World!'
+})();
+```
+
+Encrypt with multiple public keys:
+
+```js
+(async () => {
+ const publicKeysArmored = [
+ `-----BEGIN PGP PUBLIC KEY BLOCK-----
+...
+-----END PGP PUBLIC KEY BLOCK-----`,
+ `-----BEGIN PGP PUBLIC KEY BLOCK-----
+...
+-----END PGP PUBLIC KEY BLOCK-----`
+ ];
+ const privateKeyArmored = `-----BEGIN PGP PRIVATE KEY BLOCK-----
+...
+-----END PGP PRIVATE KEY BLOCK-----`; // encrypted private key
+ const passphrase = `yourPassphrase`; // what the private key is encrypted with
+ const message = 'Hello, World!';
+
+ const { keys: [privateKey] } = await openpgp.key.readArmored(privateKeyArmored);
+ await privateKey.decrypt(passphrase)
+
+ const publicKeys = await Promise.all(publicKeysArmored.map(async (key) => {
+ return (await openpgp.key.readArmored(key)).keys[0];
+ }));
+
+ const { data: encrypted } = await openpgp.encrypt({
+ message: openpgp.message.fromText(message), // input as Message object
+ publicKeys, // for encryption
+ privateKeys: [privateKey] // for signing (optional)
+ });
+ console.log(encrypted); // '-----BEGIN PGP MESSAGE ... END PGP MESSAGE-----'
+})();
+```
+
+#### Encrypt with compression
+
+By default, `encrypt` will not use any compression. It's possible to override that behavior in two ways:
+
+Either set the `compression` parameter in the options object when calling `encrypt`.
+
+```js
+(async () => {
+ const encrypted = await openpgp.encrypt({
+ message: openpgp.message.fromBinary(new Uint8Array([0x01, 0x02, 0x03])), // or .fromText('string')
+ passwords: ['secret stuff'], // multiple passwords possible
+ compression: openpgp.enums.compression.zip // compress the data with zip
+ });
+})();
+```
+
+Or, override the config to enable compression:
+
+```js
+openpgp.config.compression = openpgp.enums.compression.zlib;
+```
+
+Where the value can be any of:
+ * `openpgp.enums.compression.zip`
+ * `openpgp.enums.compression.zlib`
+
+
+#### Streaming encrypt *Uint8Array* data with a password
+
+```js
+(async () => {
+ const readableStream = new ReadableStream({
+ start(controller) {
+ controller.enqueue(new Uint8Array([0x01, 0x02, 0x03]));
+ controller.close();
+ }
+ });
+
+ const { message } = await openpgp.encrypt({
+ message: openpgp.message.fromBinary(readableStream), // input as Message object
+ passwords: ['secret stuff'], // multiple passwords possible
+ armor: false // don't ASCII armor (for Uint8Array output)
+ });
+ const encrypted = message.packets.write(); // get raw encrypted packets as ReadableStream
+
+ // Either pipe the above stream somewhere, pass it to another function,
+ // or read it manually as follows:
+ const reader = openpgp.stream.getReader(encrypted);
+ while (true) {
+ const { done, value } = await reader.read();
+ if (done) break;
+ console.log('new chunk:', value); // Uint8Array
+ }
+
+ // Or, in Node.js, you can pipe the above stream as follows:
+ const nodeStream = openpgp.stream.webToNode(encrypted);
+ nodeStream.pipe(nodeWritableStream);
+})();
+```
+
+For more information on creating ReadableStreams, see [the MDN Documentation on `new
+ReadableStream()`](https://developer.mozilla.org/docs/Web/API/ReadableStream/ReadableStream).
+For more information on reading streams using `openpgp.stream`, see the documentation of
+[the web-stream-tools dependency](https://openpgpjs.org/web-stream-tools/), particularly
+its [Reader class](https://openpgpjs.org/web-stream-tools/Reader.html).
+
+
+#### Streaming encrypt and decrypt *String* data with PGP keys
+
+```js
+(async () => {
+ const publicKeyArmored = `-----BEGIN PGP PUBLIC KEY BLOCK-----
+...
+-----END PGP PUBLIC KEY BLOCK-----`; // Public key
+ const [privateKeyArmored] = `-----BEGIN PGP PRIVATE KEY BLOCK-----
+...
+-----END PGP PRIVATE KEY BLOCK-----`; // Encrypted private key
+ const passphrase = `yourPassphrase`; // Password that private key is encrypted with
+
+ const privateKey = (await openpgp.key.readArmored([privateKeyArmored])).keys[0];
+ await privateKey.decrypt(passphrase);
+
+ const readableStream = new ReadableStream({
+ start(controller) {
+ controller.enqueue('Hello, world!');
+ controller.close();
+ }
+ });
+
+ const encrypted = await openpgp.encrypt({
+ message: openpgp.message.fromText(readableStream), // input as Message object
+ publicKeys: (await openpgp.key.readArmored(publicKeyArmored)).keys, // for encryption
+ privateKeys: [privateKey] // for signing (optional)
+ });
+ const ciphertext = encrypted.data; // ReadableStream containing '-----BEGIN PGP MESSAGE ... END PGP MESSAGE-----'
+
+ const decrypted = await openpgp.decrypt({
+ message: await openpgp.message.readArmored(ciphertext), // parse armored message
+ publicKeys: (await openpgp.key.readArmored(publicKeyArmored)).keys, // for verification (optional)
+ privateKeys: [privateKey] // for decryption
+ });
+ const plaintext = await openpgp.stream.readToEnd(decrypted.data); // 'Hello, World!'
+})();
+```
+
+
+#### Generate new key pair
+
+ECC keys:
+
+Possible values for `curve` are: `curve25519`, `ed25519`, `p256`, `p384`, `p521`, `secp256k1`,
+`brainpoolP256r1`, `brainpoolP384r1`, or `brainpoolP512r1`.
+Note that both the `curve25519` and `ed25519` options generate a primary key for signing using Ed25519
+and a subkey for encryption using Curve25519.
+
+```js
+(async () => {
+ const { privateKeyArmored, publicKeyArmored, revocationCertificate } = await openpgp.generateKey({
+ userIds: [{ name: 'Jon Smith', email: 'jon@example.com' }], // you can pass multiple user IDs
+ curve: 'ed25519', // ECC curve name
+ passphrase: 'super long and hard to guess secret' // protects the private key
+ });
+
+ console.log(privateKeyArmored); // '-----BEGIN PGP PRIVATE KEY BLOCK ... '
+ console.log(publicKeyArmored); // '-----BEGIN PGP PUBLIC KEY BLOCK ... '
+ console.log(revocationCertificate); // '-----BEGIN PGP PUBLIC KEY BLOCK ... '
+})();
+```
+
+RSA keys:
+
+```js
+(async () => {
+ const key = await openpgp.generateKey({
+ userIds: [{ name: 'Jon Smith', email: 'jon@example.com' }], // you can pass multiple user IDs
+ rsaBits: 4096, // RSA key size
+ passphrase: 'super long and hard to guess secret' // protects the private key
+ });
+})();
+```
+
+#### Revoke a key
+
+Using a revocation certificate:
+```js
+(async () => {
+ const { publicKeyArmored: revokedKeyArmored } = await openpgp.revokeKey({
+ key: (await openpgp.key.readArmored(publicKeyArmored)).keys[0],
+ revocationCertificate
+ });
+ console.log(revokedKeyArmored); // '-----BEGIN PGP PUBLIC KEY BLOCK ... '
+})();
+```
+
+Using the private key:
+```js
+(async () => {
+ const { publicKeyArmored, publicKey } = await openpgp.revokeKey({
+ key: (await openpgp.key.readArmored(privateKeyArmored)).keys[0]
+ });
+})();
+```
+
+#### Lookup public key on HKP server
+
+```js
+(async () => {
+ var hkp = new openpgp.HKP(); // Defaults to https://keyserver.ubuntu.com, or pass another keyserver URL as a string
+
+ let publicKeyArmored = await hkp.lookup({
+ query: 'alice@example.com'
+ });
+ var { keys: [publicKey] } = await openpgp.key.readArmored(publicKeyArmored);
+})();
+```
+
+#### Upload public key to HKP server
+
+```js
+(async () => {
+ var hkp = new openpgp.HKP('https://pgp.mit.edu');
+
+ var publicKeyArmored = `-----BEGIN PGP PUBLIC KEY BLOCK-----
+...
+-----END PGP PUBLIC KEY BLOCK-----`;
+
+ await hkp.upload(publicKeyArmored);
+})();
+```
+
+#### Sign and verify cleartext messages
+
+```js
+(async () => {
+ const publicKeyArmored = `-----BEGIN PGP PUBLIC KEY BLOCK-----
+...
+-----END PGP PUBLIC KEY BLOCK-----`;
+ const privateKeyArmored = `-----BEGIN PGP PRIVATE KEY BLOCK-----
+...
+-----END PGP PRIVATE KEY BLOCK-----`; // encrypted private key
+ const passphrase = `yourPassphrase`; // what the private key is encrypted with
+
+ const { keys: [privateKey] } = await openpgp.key.readArmored(privateKeyArmored);
+ await privateKey.decrypt(passphrase);
+
+ const { data: cleartext } = await openpgp.sign({
+ message: openpgp.cleartext.fromText('Hello, World!'), // CleartextMessage or Message object
+ privateKeys: [privateKey] // for signing
+ });
+ console.log(cleartext); // '-----BEGIN PGP SIGNED MESSAGE ... END PGP SIGNATURE-----'
+
+ const verified = await openpgp.verify({
+ message: await openpgp.cleartext.readArmored(cleartext), // parse armored message
+ publicKeys: (await openpgp.key.readArmored(publicKeyArmored)).keys // for verification
+ });
+ const { valid } = verified.signatures[0];
+ if (valid) {
+ console.log('signed by key id ' + verified.signatures[0].keyid.toHex());
+ } else {
+ throw new Error('signature could not be verified');
+ }
+})();
+```
+
+#### Create and verify *detached* signatures
+
+```js
+(async () => {
+ const publicKeyArmored = `-----BEGIN PGP PUBLIC KEY BLOCK-----
+...
+-----END PGP PUBLIC KEY BLOCK-----`;
+ const privateKeyArmored = `-----BEGIN PGP PRIVATE KEY BLOCK-----
+...
+-----END PGP PRIVATE KEY BLOCK-----`; // encrypted private key
+ const passphrase = `yourPassphrase`; // what the private key is encrypted with
+
+ const { keys: [privateKey] } = await openpgp.key.readArmored(privateKeyArmored);
+ await privateKey.decrypt(passphrase);
+
+ const { signature: detachedSignature } = await openpgp.sign({
+ message: openpgp.cleartext.fromText('Hello, World!'), // CleartextMessage or Message object
+ privateKeys: [privateKey], // for signing
+ detached: true
+ });
+ console.log(detachedSignature);
+
+ const verified = await openpgp.verify({
+ message: openpgp.cleartext.fromText('Hello, World!'), // CleartextMessage or Message object
+ signature: await openpgp.signature.readArmored(detachedSignature), // parse detached signature
+ publicKeys: (await openpgp.key.readArmored(publicKeyArmored)).keys // for verification
+ });
+ const { valid } = verified.signatures[0];
+ if (valid) {
+ console.log('signed by key id ' + verified.signatures[0].keyid.toHex());
+ } else {
+ throw new Error('signature could not be verified');
+ }
+})();
+```
+
+#### Streaming sign and verify *Uint8Array* data
+
+```js
+(async () => {
+ var readableStream = new ReadableStream({
+ start(controller) {
+ controller.enqueue(new Uint8Array([0x01, 0x02, 0x03]));
+ controller.close();
+ }
+ });
+
+ const publicKeyArmored = `-----BEGIN PGP PUBLIC KEY BLOCK-----
+...
+-----END PGP PUBLIC KEY BLOCK-----`;
+ const privateKeyArmored = `-----BEGIN PGP PRIVATE KEY BLOCK-----
+...
+-----END PGP PRIVATE KEY BLOCK-----`; // encrypted private key
+ const passphrase = `yourPassphrase`; // what the private key is encrypted with
+
+ const { keys: [privateKey] } = await openpgp.key.readArmored(privateKeyArmored);
+ await privateKey.decrypt(passphrase);
+
+ const { data: signatureArmored } = await openpgp.sign({
+ message: openpgp.message.fromBinary(readableStream), // or .fromText(readableStream: ReadableStream)
+ privateKeys: [privateKey] // for signing
+ });
+ console.log(signatureArmored); // ReadableStream containing '-----BEGIN PGP MESSAGE ... END PGP MESSAGE-----'
+
+ const verified = await openpgp.verify({
+ message: await openpgp.message.readArmored(signatureArmored), // parse armored signature
+ publicKeys: (await openpgp.key.readArmored(publicKeyArmored)).keys // for verification
+ });
+
+ await openpgp.stream.readToEnd(verified.data);
+ // Note: you *have* to read `verified.data` in some way or other,
+ // even if you don't need it, as that is what triggers the
+ // verification of the data.
+
+ const { valid } = verified.signatures[0];
+ if (valid) {
+ console.log('signed by key id ' + verified.signatures[0].keyid.toHex());
+ } else {
+ throw new Error('signature could not be verified');
+ }
+})();
+```
+
+### Documentation
+
+A jsdoc build of our code comments is available at [doc/index.html](https://openpgpjs.org/openpgpjs/doc/index.html). Public calls should generally be made through the OpenPGP object [doc/openpgp.html](https://openpgpjs.org/openpgpjs/doc/module-openpgp.html).
+
+For the documentation of `openpgp.stream`, see the documentation of [the web-stream-tools dependency](https://openpgpjs.org/web-stream-tools/).
+
+### Security Audit
+
+To date the OpenPGP.js code base has undergone two complete security audits from [Cure53](https://cure53.de). The first audit's report has been published [here](https://github.com/openpgpjs/openpgpjs/wiki/Cure53-security-audit).
+
+### Security recommendations
+
+It should be noted that js crypto apps deployed via regular web hosting (a.k.a. [**host-based security**](https://www.schneier.com/blog/archives/2012/08/cryptocat.html)) provide users with less security than installable apps with auditable static versions. Installable apps can be deployed as a [Firefox](https://developer.mozilla.org/en-US/Marketplace/Options/Packaged_apps) or [Chrome](https://developer.chrome.com/apps/about_apps.html) packaged app. These apps are basically signed zip files and their runtimes typically enforce a strict [Content Security Policy (CSP)](https://www.html5rocks.com/en/tutorials/security/content-security-policy/) to protect users against [XSS](https://en.wikipedia.org/wiki/Cross-site_scripting). This [blogpost](https://tankredhase.com/2014/04/13/heartbleed-and-javascript-crypto/) explains the trust model of the web quite well.
+
+It is also recommended to set a strong passphrase that protects the user's private key on disk.
+
+### Development
+
+To create your own build of the library, just run the following command after cloning the git repo. This will download all dependencies, run the tests and create a minified bundle under `dist/openpgp.min.js` to use in your project:
+
+ npm install && npm test
+
+For debugging browser errors, you can open `test/unittests.html` in a browser or, after running the following command, open [`http://localhost:3000/test/unittests.html`](http://localhost:3000/test/unittests.html):
+
+ grunt browsertest
+
+### How do I get involved?
+
+You want to help, great! It's probably best to send us a message on [Gitter](https://gitter.im/openpgpjs/openpgpjs) before you start your undertaking, to make sure nobody else is working on it, and so we can discuss the best course of action. Other than that, just go ahead and fork our repo, make your changes and send us a pull request! :)
+
+### License
+
+[GNU Lesser General Public License](https://www.gnu.org/licenses/lgpl-3.0.en.html) (3.0 or any later version). Please take a look at the [LICENSE](LICENSE) file for more information.
+
+### Resources
+
+Below is a collection of resources, many of these were projects that were in someway a precursor to the current OpenPGP.js project. If you'd like to add your link here, please do so in a pull request or email to the list.
+
+* [https://www.hanewin.net/encrypt/](https://www.hanewin.net/encrypt/)
+* [https://github.com/seancolyer/gmail-crypt](https://github.com/seancolyer/gmail-crypt)
+* [https://github.com/mete0r/jspg](https://github.com/mete0r/jspg)
+* [https://github.com/GPGTools/Mobile/wiki/Introduction](https://github.com/GPGTools/Mobile/wiki/Introduction)
+* [https://github.com/gmontalvoriv/mailock](https://github.com/gmontalvoriv/mailock)
diff --git a/bower.json b/bower.json
new file mode 100644
index 00000000..af9cf5a3
--- /dev/null
+++ b/bower.json
@@ -0,0 +1,37 @@
+{
+ "name": "openpgp",
+ "version": "4.10.10",
+ "license": "LGPL-3.0+",
+ "homepage": "https://openpgpjs.org/",
+ "authors": [
+ "OpenPGP Development Team (https://github.com/openpgpjs/openpgpjs/graphs/contributors)"
+ ],
+ "description": "OpenPGP.js is a Javascript implementation of the OpenPGP protocol. This is defined in RFC 4880.",
+ "main": [
+ "dist/openpgp.js",
+ "dist/openpgp.worker.js"
+ ],
+ "moduleType": [
+ "amd",
+ "es6",
+ "globals",
+ "node"
+ ],
+ "keywords": [
+ "crypto",
+ "gpg",
+ "pgp",
+ "openpgp",
+ "encryption"
+ ],
+ "ignore": [
+ "**/.*",
+ "dist/*.tgz",
+ "dist/*_debug.js",
+ "node_modules",
+ "bower_components",
+ "test",
+ "tests",
+ "doc"
+ ]
+}
diff --git a/package-lock.json b/package-lock.json
index 98cdbc1a..c974d79a 100644
--- a/package-lock.json
+++ b/package-lock.json
@@ -14,26 +14,34 @@
}
},
"@babel/generator": {
- "version": "7.9.6",
- "resolved": "https://registry.npmjs.org/@babel/generator/-/generator-7.9.6.tgz",
- "integrity": "sha512-+htwWKJbH2bL72HRluF8zumBxzuX0ZZUFl3JLNyoUjM/Ho8wnVpPXM6aUz8cfKDqQ/h7zHqKt4xzJteUosckqQ==",
+ "version": "7.8.8",
+ "resolved": "https://registry.npmjs.org/@babel/generator/-/generator-7.8.8.tgz",
+ "integrity": "sha512-HKyUVu69cZoclptr8t8U5b6sx6zoWjh8jiUhnuj3MpZuKT2dJ8zPTuiy31luq32swhI0SpwItCIlU8XW7BZeJg==",
"dev": true,
"requires": {
- "@babel/types": "^7.9.6",
+ "@babel/types": "^7.8.7",
"jsesc": "^2.5.1",
"lodash": "^4.17.13",
"source-map": "^0.5.0"
+ },
+ "dependencies": {
+ "jsesc": {
+ "version": "2.5.2",
+ "resolved": "https://registry.npmjs.org/jsesc/-/jsesc-2.5.2.tgz",
+ "integrity": "sha512-OYu7XEzjkCQ3C5Ps3QIZsQfNpqoJyZZA99wd9aWd05NCtC5pWOkShK2mkL6HXQR6/Cy2lbNdPlZBpuQHXE63gA==",
+ "dev": true
+ }
}
},
"@babel/helper-function-name": {
- "version": "7.9.5",
- "resolved": "https://registry.npmjs.org/@babel/helper-function-name/-/helper-function-name-7.9.5.tgz",
- "integrity": "sha512-JVcQZeXM59Cd1qanDUxv9fgJpt3NeKUaqBqUEvfmQ+BCOKq2xUgaWZW2hr0dkbyJgezYuplEoh5knmrnS68efw==",
+ "version": "7.8.3",
+ "resolved": "https://registry.npmjs.org/@babel/helper-function-name/-/helper-function-name-7.8.3.tgz",
+ "integrity": "sha512-BCxgX1BC2hD/oBlIFUgOCQDOPV8nSINxCwM3o93xP4P9Fq6aV5sgv2cOOITDMtCfQ+3PvHp3l689XZvAM9QyOA==",
"dev": true,
"requires": {
"@babel/helper-get-function-arity": "^7.8.3",
"@babel/template": "^7.8.3",
- "@babel/types": "^7.9.5"
+ "@babel/types": "^7.8.3"
}
},
"@babel/helper-get-function-arity": {
@@ -54,12 +62,6 @@
"@babel/types": "^7.8.3"
}
},
- "@babel/helper-validator-identifier": {
- "version": "7.9.5",
- "resolved": "https://registry.npmjs.org/@babel/helper-validator-identifier/-/helper-validator-identifier-7.9.5.tgz",
- "integrity": "sha512-/8arLKUFq882w4tWGj9JYzRpAlZgiWUJ+dtteNTDqrRBz9Iguck9Rn3ykuBDoUwh2TO4tSAJlrxDUOXWklJe4g==",
- "dev": true
- },
"@babel/highlight": {
"version": "7.8.3",
"resolved": "https://registry.npmjs.org/@babel/highlight/-/highlight-7.8.3.tgz",
@@ -109,9 +111,9 @@
}
},
"@babel/parser": {
- "version": "7.9.6",
- "resolved": "https://registry.npmjs.org/@babel/parser/-/parser-7.9.6.tgz",
- "integrity": "sha512-AoeIEJn8vt+d/6+PXDRPaksYhnlbMIiejioBZvvMQsOjW/JYK6k/0dKnvvP3EhK5GfMBWDPtrxRtegWdAcdq9Q==",
+ "version": "7.8.8",
+ "resolved": "https://registry.npmjs.org/@babel/parser/-/parser-7.8.8.tgz",
+ "integrity": "sha512-mO5GWzBPsPf6865iIbzNE0AvkKF3NE+2S3eRUpE+FE07BOAkXh6G+GW/Pj01hhXjve1WScbaIO4UlY1JKeqCcA==",
"dev": true
},
"@babel/template": {
@@ -126,17 +128,17 @@
}
},
"@babel/traverse": {
- "version": "7.9.6",
- "resolved": "https://registry.npmjs.org/@babel/traverse/-/traverse-7.9.6.tgz",
- "integrity": "sha512-b3rAHSjbxy6VEAvlxM8OV/0X4XrG72zoxme6q1MOoe2vd0bEc+TwayhuC1+Dfgqh1QEG+pj7atQqvUprHIccsg==",
+ "version": "7.8.6",
+ "resolved": "https://registry.npmjs.org/@babel/traverse/-/traverse-7.8.6.tgz",
+ "integrity": "sha512-2B8l0db/DPi8iinITKuo7cbPznLCEk0kCxDoB9/N6gGNg/gxOXiR/IcymAFPiBwk5w6TtQ27w4wpElgp9btR9A==",
"dev": true,
"requires": {
"@babel/code-frame": "^7.8.3",
- "@babel/generator": "^7.9.6",
- "@babel/helper-function-name": "^7.9.5",
+ "@babel/generator": "^7.8.6",
+ "@babel/helper-function-name": "^7.8.3",
"@babel/helper-split-export-declaration": "^7.8.3",
- "@babel/parser": "^7.9.6",
- "@babel/types": "^7.9.6",
+ "@babel/parser": "^7.8.6",
+ "@babel/types": "^7.8.6",
"debug": "^4.1.0",
"globals": "^11.1.0",
"lodash": "^4.17.13"
@@ -151,6 +153,12 @@
"ms": "^2.1.1"
}
},
+ "globals": {
+ "version": "11.12.0",
+ "resolved": "https://registry.npmjs.org/globals/-/globals-11.12.0.tgz",
+ "integrity": "sha512-WOBp/EEGUiIsJSp7wcv/y6MO+lV9UoncWqxuFfm8eBwzWNgyfBd6Gz+IeKQ9jCmyhoH99g15M3T+QaVHFjizVA==",
+ "dev": true
+ },
"ms": {
"version": "2.1.2",
"resolved": "https://registry.npmjs.org/ms/-/ms-2.1.2.tgz",
@@ -160,124 +168,29 @@
}
},
"@babel/types": {
- "version": "7.9.6",
- "resolved": "https://registry.npmjs.org/@babel/types/-/types-7.9.6.tgz",
- "integrity": "sha512-qxXzvBO//jO9ZnoasKF1uJzHd2+M6Q2ZPIVfnFps8JJvXy0ZBbwbNOmE6SGIY5XOY6d1Bo5lb9d9RJ8nv3WSeA==",
+ "version": "7.8.7",
+ "resolved": "https://registry.npmjs.org/@babel/types/-/types-7.8.7.tgz",
+ "integrity": "sha512-k2TreEHxFA4CjGkL+GYjRyx35W0Mr7DP5+9q6WMkyKXB+904bYmG40syjMFV0oLlhhFCwWl0vA0DyzTDkwAiJw==",
"dev": true,
"requires": {
- "@babel/helper-validator-identifier": "^7.9.5",
+ "esutils": "^2.0.2",
"lodash": "^4.17.13",
"to-fast-properties": "^2.0.0"
- }
- },
- "@mattiasbuelens/web-streams-adapter": {
- "version": "0.1.0-alpha.5",
- "resolved": "https://registry.npmjs.org/@mattiasbuelens/web-streams-adapter/-/web-streams-adapter-0.1.0-alpha.5.tgz",
- "integrity": "sha512-OIfunNt/fTjIgDtUqXhBYOKtgaxm30ZWkMWegI9iS3xUHy2/A3AXki6/k+z40+BywNMi+spON/jSE0FF9WmUKA==",
- "dev": true
- },
- "@rollup/plugin-commonjs": {
- "version": "11.1.0",
- "resolved": "https://registry.npmjs.org/@rollup/plugin-commonjs/-/plugin-commonjs-11.1.0.tgz",
- "integrity": "sha512-Ycr12N3ZPN96Fw2STurD21jMqzKwL9QuFhms3SD7KKRK7oaXUsBU9Zt0jL/rOPHiPYisI21/rXGO3jr9BnLHUA==",
- "dev": true,
- "requires": {
- "@rollup/pluginutils": "^3.0.8",
- "commondir": "^1.0.1",
- "estree-walker": "^1.0.1",
- "glob": "^7.1.2",
- "is-reference": "^1.1.2",
- "magic-string": "^0.25.2",
- "resolve": "^1.11.0"
- },
- "dependencies": {
- "glob": {
- "version": "7.1.6",
- "resolved": "https://registry.npmjs.org/glob/-/glob-7.1.6.tgz",
- "integrity": "sha512-LwaxwyZ72Lk7vZINtNNrywX0ZuLyStrdDtabefZKAY5ZGJhVtgdznluResxNmPitE0SAO+O26sWTHeKSI2wMBA==",
- "dev": true,
- "requires": {
- "fs.realpath": "^1.0.0",
- "inflight": "^1.0.4",
- "inherits": "2",
- "minimatch": "^3.0.4",
- "once": "^1.3.0",
- "path-is-absolute": "^1.0.0"
- }
- },
- "path-parse": {
- "version": "1.0.6",
- "resolved": "https://registry.npmjs.org/path-parse/-/path-parse-1.0.6.tgz",
- "integrity": "sha512-GSmOT2EbHrINBf9SR7CDELwlJ8AENk3Qn7OikK4nFYAu3Ote2+JYNVvkpAEQm3/TLNEJFD/xZJjzyxg3KBWOzw==",
- "dev": true
- },
- "resolve": {
- "version": "1.17.0",
- "resolved": "https://registry.npmjs.org/resolve/-/resolve-1.17.0.tgz",
- "integrity": "sha512-ic+7JYiV8Vi2yzQGFWOkiZD5Z9z7O2Zhm9XMaTxdJExKasieFCr+yXZ/WmXsckHiKl12ar0y6XiXDx3m4RHn1w==",
- "dev": true,
- "requires": {
- "path-parse": "^1.0.6"
- }
- }
- }
- },
- "@rollup/plugin-node-resolve": {
- "version": "7.1.3",
- "resolved": "https://registry.npmjs.org/@rollup/plugin-node-resolve/-/plugin-node-resolve-7.1.3.tgz",
- "integrity": "sha512-RxtSL3XmdTAE2byxekYLnx+98kEUOrPHF/KRVjLH+DEIHy6kjIw7YINQzn+NXiH/NTrQLAwYs0GWB+csWygA9Q==",
- "dev": true,
- "requires": {
- "@rollup/pluginutils": "^3.0.8",
- "@types/resolve": "0.0.8",
- "builtin-modules": "^3.1.0",
- "is-module": "^1.0.0",
- "resolve": "^1.14.2"
},
"dependencies": {
- "builtin-modules": {
- "version": "3.1.0",
- "resolved": "https://registry.npmjs.org/builtin-modules/-/builtin-modules-3.1.0.tgz",
- "integrity": "sha512-k0KL0aWZuBt2lrxrcASWDfwOLMnodeQjodT/1SxEQAXsHANgo6ZC/VEaSEHCXt7aSTZ4/4H5LKa+tBXmW7Vtvw==",
- "dev": true
- },
- "path-parse": {
- "version": "1.0.6",
- "resolved": "https://registry.npmjs.org/path-parse/-/path-parse-1.0.6.tgz",
- "integrity": "sha512-GSmOT2EbHrINBf9SR7CDELwlJ8AENk3Qn7OikK4nFYAu3Ote2+JYNVvkpAEQm3/TLNEJFD/xZJjzyxg3KBWOzw==",
+ "to-fast-properties": {
+ "version": "2.0.0",
+ "resolved": "https://registry.npmjs.org/to-fast-properties/-/to-fast-properties-2.0.0.tgz",
+ "integrity": "sha1-3F5pjL0HkmW8c+A3doGk5Og/YW4=",
"dev": true
- },
- "resolve": {
- "version": "1.17.0",
- "resolved": "https://registry.npmjs.org/resolve/-/resolve-1.17.0.tgz",
- "integrity": "sha512-ic+7JYiV8Vi2yzQGFWOkiZD5Z9z7O2Zhm9XMaTxdJExKasieFCr+yXZ/WmXsckHiKl12ar0y6XiXDx3m4RHn1w==",
- "dev": true,
- "requires": {
- "path-parse": "^1.0.6"
- }
}
}
},
- "@rollup/plugin-replace": {
- "version": "2.3.2",
- "resolved": "https://registry.npmjs.org/@rollup/plugin-replace/-/plugin-replace-2.3.2.tgz",
- "integrity": "sha512-KEEL7V2tMNOsbAoNMKg91l1sNXBDoiP31GFlqXVOuV5691VQKzKBh91+OKKOG4uQWYqcFskcjFyh1d5YnZd0Zw==",
- "dev": true,
- "requires": {
- "@rollup/pluginutils": "^3.0.8",
- "magic-string": "^0.25.5"
- }
- },
- "@rollup/pluginutils": {
- "version": "3.0.9",
- "resolved": "https://registry.npmjs.org/@rollup/pluginutils/-/pluginutils-3.0.9.tgz",
- "integrity": "sha512-TLZavlfPAZYI7v33wQh4mTP6zojne14yok3DNSLcjoG/Hirxfkonn6icP5rrNWRn8nZsirJBFFpijVOJzkUHDg==",
- "dev": true,
- "requires": {
- "@types/estree": "0.0.39",
- "estree-walker": "^1.0.1",
- "micromatch": "^4.0.2"
- }
+ "@mattiasbuelens/web-streams-polyfill": {
+ "version": "0.3.1",
+ "resolved": "https://registry.npmjs.org/@mattiasbuelens/web-streams-polyfill/-/web-streams-polyfill-0.3.1.tgz",
+ "integrity": "sha512-IW+tCurEH2NL2tA3KKFAMXa90WWmTJMZksnQWMABe3bMijV7hEiOLthy4tKGTnUTV8qVf8WTCApiGmKb75Bxkg==",
+ "dev": true
},
"@sinonjs/commons": {
"version": "1.7.1",
@@ -322,31 +235,53 @@
"integrity": "sha512-+iTbntw2IZPb/anVDbypzfQa+ay64MW0Zo8aJ8gZPWMMK6/OubMVb6lUPMagqjOPnmtauXnFCACVl3O7ogjeqQ==",
"dev": true
},
- "@types/chai": {
- "version": "4.2.14",
- "resolved": "https://registry.npmjs.org/@types/chai/-/chai-4.2.14.tgz",
- "integrity": "sha512-G+ITQPXkwTrslfG5L/BksmbLUA0M1iybEsmCWPqzSxsRRhJZimBKJkoMi8fr/CPygPTj4zO5pJH7I2/cm9M7SQ==",
- "dev": true
+ "JSONStream": {
+ "version": "1.3.3",
+ "resolved": "https://registry.npmjs.org/JSONStream/-/JSONStream-1.3.3.tgz",
+ "integrity": "sha512-3Sp6WZZ/lXl+nTDoGpGWHEpTnnC6X5fnkolYZR6nwIfzbxxvA8utPWe1gCt7i0m9uVGsSz2IS8K8mJ7HmlduMg==",
+ "dev": true,
+ "requires": {
+ "jsonparse": "^1.2.0",
+ "through": ">=2.2.7 <3"
+ }
},
- "@types/estree": {
- "version": "0.0.39",
- "resolved": "https://registry.npmjs.org/@types/estree/-/estree-0.0.39.tgz",
- "integrity": "sha512-EYNwp3bU+98cpU4lAWYYL7Zz+2gryWH1qbdDTidVd6hkiR6weksdbMadyXKXNPEkQFhXM+hVO9ZygomHXp+AIw==",
+ "abbrev": {
+ "version": "1.1.1",
+ "resolved": "https://registry.npmjs.org/abbrev/-/abbrev-1.1.1.tgz",
+ "integrity": "sha512-nne9/IiQ/hzIhY6pdDnbBtz7DjPTKrY00P/zvPSm5pOFkl6xuGrGnXn/VtTNNfNtAfZ9/1RtehkszU9qcTii0Q==",
"dev": true
},
- "@types/node": {
- "version": "13.13.2",
- "resolved": "https://registry.npmjs.org/@types/node/-/node-13.13.2.tgz",
- "integrity": "sha512-LB2R1Oyhpg8gu4SON/mfforE525+Hi/M1ineICEDftqNVTyFg1aRIeGuTvXAoWHc4nbrFncWtJgMmoyRvuGh7A==",
+ "accepts": {
+ "version": "1.3.4",
+ "resolved": "https://registry.npmjs.org/accepts/-/accepts-1.3.4.tgz",
+ "integrity": "sha1-hiRnWMfdbSGmR0/whKR0DsBesh8=",
+ "dev": true,
+ "requires": {
+ "mime-types": "~2.1.16",
+ "negotiator": "0.6.1"
+ }
+ },
+ "acorn": {
+ "version": "4.0.13",
+ "resolved": "https://registry.npmjs.org/acorn/-/acorn-4.0.13.tgz",
+ "integrity": "sha1-EFSVrlNh1pe9GVyCUZLhrX8lN4c=",
"dev": true
},
- "@types/resolve": {
- "version": "0.0.8",
- "resolved": "https://registry.npmjs.org/@types/resolve/-/resolve-0.0.8.tgz",
- "integrity": "sha512-auApPaJf3NPfe18hSoJkp8EbZzer2ISk7o8mCC3M9he/a04+gbMF97NkpD2S8riMGvm4BMRI59/SZQSaLTKpsQ==",
+ "acorn-dynamic-import": {
+ "version": "3.0.0",
+ "resolved": "https://registry.npmjs.org/acorn-dynamic-import/-/acorn-dynamic-import-3.0.0.tgz",
+ "integrity": "sha512-zVWV8Z8lislJoOKKqdNMOB+s6+XV5WERty8MnKBeFgwA+19XJjJHs2RP5dzM57FftIs+jQnRToLiWazKr6sSWg==",
"dev": true,
"requires": {
- "@types/node": "*"
+ "acorn": "^5.0.0"
+ },
+ "dependencies": {
+ "acorn": {
+ "version": "5.7.4",
+ "resolved": "https://registry.npmjs.org/acorn/-/acorn-5.7.4.tgz",
+ "integrity": "sha512-1D++VG7BhrtvQpNbBzovKNc1FLGGEE/oGe7b9xJm/RFHMBeUaUGpluV9RLjZa47YFdPcDAenEYuq9pQPcMdLJg==",
+ "dev": true
+ }
}
},
"acorn-jsx": {
@@ -366,6 +301,25 @@
}
}
},
+ "acorn-node": {
+ "version": "1.5.2",
+ "resolved": "https://registry.npmjs.org/acorn-node/-/acorn-node-1.5.2.tgz",
+ "integrity": "sha512-krFKvw/d1F17AN3XZbybIUzEY4YEPNiGo05AfP3dBlfVKrMHETKpgjpuZkSF8qDNt9UkQcqj7am8yJLseklCMg==",
+ "dev": true,
+ "requires": {
+ "acorn": "^5.7.1",
+ "acorn-dynamic-import": "^3.0.0",
+ "xtend": "^4.0.1"
+ },
+ "dependencies": {
+ "acorn": {
+ "version": "5.7.4",
+ "resolved": "https://registry.npmjs.org/acorn/-/acorn-5.7.4.tgz",
+ "integrity": "sha512-1D++VG7BhrtvQpNbBzovKNc1FLGGEE/oGe7b9xJm/RFHMBeUaUGpluV9RLjZa47YFdPcDAenEYuq9pQPcMdLJg==",
+ "dev": true
+ }
+ }
+ },
"ajv": {
"version": "5.5.0",
"resolved": "https://registry.npmjs.org/ajv/-/ajv-5.5.0.tgz",
@@ -426,12 +380,48 @@
"sprintf-js": "~1.0.2"
}
},
+ "arr-flatten": {
+ "version": "1.1.0",
+ "resolved": "https://registry.npmjs.org/arr-flatten/-/arr-flatten-1.1.0.tgz",
+ "integrity": "sha512-L3hKV5R/p5o81R7O02IGnwpDmkp6E982XhtbuwSe3O4qOtMMMtodicASA1Cny2U+aCXcNpml+m4dPsvsJ3jatg==",
+ "dev": true
+ },
+ "arr-union": {
+ "version": "3.1.0",
+ "resolved": "https://registry.npmjs.org/arr-union/-/arr-union-3.1.0.tgz",
+ "integrity": "sha1-45sJrqne+Gao8gbiiK9jkZuuOcQ=",
+ "dev": true
+ },
+ "array-filter": {
+ "version": "0.0.1",
+ "resolved": "https://registry.npmjs.org/array-filter/-/array-filter-0.0.1.tgz",
+ "integrity": "sha1-fajPLiZijtcygDWB/SH2fKzS7uw=",
+ "dev": true
+ },
+ "array-find-index": {
+ "version": "1.0.2",
+ "resolved": "https://registry.npmjs.org/array-find-index/-/array-find-index-1.0.2.tgz",
+ "integrity": "sha1-3wEKoSh+Fku9pvlyOwqWoexBh6E=",
+ "dev": true
+ },
"array-from": {
"version": "2.1.1",
"resolved": "https://registry.npmjs.org/array-from/-/array-from-2.1.1.tgz",
"integrity": "sha1-z+nYwmYoudxa7MYqn12PHzUsEZU=",
"dev": true
},
+ "array-map": {
+ "version": "0.0.0",
+ "resolved": "https://registry.npmjs.org/array-map/-/array-map-0.0.0.tgz",
+ "integrity": "sha1-iKK6tz0c97zVwbEYoAP2b2ZfpmI=",
+ "dev": true
+ },
+ "array-reduce": {
+ "version": "0.0.0",
+ "resolved": "https://registry.npmjs.org/array-reduce/-/array-reduce-0.0.0.tgz",
+ "integrity": "sha1-FziZ0//Rx9k4PkR5Ul2+J4yrXys=",
+ "dev": true
+ },
"array-union": {
"version": "1.0.2",
"resolved": "https://registry.npmjs.org/array-union/-/array-union-1.0.2.tgz",
@@ -454,8 +444,8 @@
"dev": true
},
"asmcrypto.js": {
- "version": "github:openpgpjs/asmcrypto#5b994303a9d3e27e0915f72a10b6c2c51535a4dc",
- "from": "github:openpgpjs/asmcrypto#5b994303a9d3e27e0915f72a10b6c2c51535a4dc",
+ "version": "github:openpgpjs/asmcrypto#475cffa5ccb2cf2556427056679414acf3610d1b",
+ "from": "github:openpgpjs/asmcrypto#475cffa5ccb2cf2556427056679414acf3610d1b",
"dev": true
},
"asn1.js": {
@@ -468,12 +458,62 @@
"minimalistic-assert": "^1.0.0"
}
},
+ "assert": {
+ "version": "1.4.1",
+ "resolved": "https://registry.npmjs.org/assert/-/assert-1.4.1.tgz",
+ "integrity": "sha1-mZEtWRg2tab1s0XA8H7vwI/GXZE=",
+ "dev": true,
+ "requires": {
+ "util": "0.10.3"
+ },
+ "dependencies": {
+ "inherits": {
+ "version": "2.0.1",
+ "resolved": "https://registry.npmjs.org/inherits/-/inherits-2.0.1.tgz",
+ "integrity": "sha1-sX0I0ya0Qj5Wjv9xn5GwscvfafE=",
+ "dev": true
+ },
+ "util": {
+ "version": "0.10.3",
+ "resolved": "https://registry.npmjs.org/util/-/util-0.10.3.tgz",
+ "integrity": "sha1-evsa/lCAUkZInj23/g7TeTNqwPk=",
+ "dev": true,
+ "requires": {
+ "inherits": "2.0.1"
+ }
+ }
+ }
+ },
"assertion-error": {
"version": "1.1.0",
"resolved": "https://registry.npmjs.org/assertion-error/-/assertion-error-1.1.0.tgz",
"integrity": "sha512-jgsaNduz+ndvGyFt3uSuWqvy4lCnIJiovtouQN5JZHOKCS2QuhEdbcQHFhVksz2N2U9hXJo8odG7ETyWlEeuDw==",
"dev": true
},
+ "assign-symbols": {
+ "version": "1.0.0",
+ "resolved": "https://registry.npmjs.org/assign-symbols/-/assign-symbols-1.0.0.tgz",
+ "integrity": "sha1-WWZ/QfrdTyDMvCu5a41Pf3jsA2c=",
+ "dev": true
+ },
+ "async": {
+ "version": "1.5.2",
+ "resolved": "https://registry.npmjs.org/async/-/async-1.5.2.tgz",
+ "integrity": "sha1-7GphrlZIDAw8skHJVhjiCJL5Zyo=",
+ "dev": true
+ },
+ "async-each": {
+ "version": "1.0.1",
+ "resolved": "https://registry.npmjs.org/async-each/-/async-each-1.0.1.tgz",
+ "integrity": "sha1-GdOGodntxufByF04iu28xW0zYC0=",
+ "dev": true
+ },
+ "atob": {
+ "version": "2.1.2",
+ "resolved": "https://registry.npmjs.org/atob/-/atob-2.1.2.tgz",
+ "integrity": "sha512-Wm6ukoaOGJi/73p/cl2GvLjTI5JM1k/O14isD73YML8StrH/7/lRFgmg8nICZgD3bZZvjwCGxtMOD3wWNAu8cg==",
+ "dev": true
+ },
"babel-code-frame": {
"version": "6.26.0",
"resolved": "https://registry.npmjs.org/babel-code-frame/-/babel-code-frame-6.26.0.tgz",
@@ -485,1184 +525,4010 @@
"js-tokens": "^3.0.2"
}
},
- "babel-eslint": {
- "version": "10.1.0",
- "resolved": "https://registry.npmjs.org/babel-eslint/-/babel-eslint-10.1.0.tgz",
- "integrity": "sha512-ifWaTHQ0ce+448CYop8AdrQiBsGrnC+bMgfyKFdi6EsPLTAWG+QfyDeM6OH+FmWnKvEq5NnBMLvlBUPKQZoDSg==",
+ "babel-core": {
+ "version": "6.26.3",
+ "resolved": "https://registry.npmjs.org/babel-core/-/babel-core-6.26.3.tgz",
+ "integrity": "sha512-6jyFLuDmeidKmUEb3NM+/yawG0M2bDZ9Z1qbZP59cyHLz8kYGKYwpJP0UwUKKUiTRNvxfLesJnTedqczP7cTDA==",
"dev": true,
"requires": {
- "@babel/code-frame": "^7.0.0",
- "@babel/parser": "^7.7.0",
- "@babel/traverse": "^7.7.0",
- "@babel/types": "^7.7.0",
- "eslint-visitor-keys": "^1.0.0",
- "resolve": "^1.12.0"
+ "babel-code-frame": "^6.26.0",
+ "babel-generator": "^6.26.0",
+ "babel-helpers": "^6.24.1",
+ "babel-messages": "^6.23.0",
+ "babel-register": "^6.26.0",
+ "babel-runtime": "^6.26.0",
+ "babel-template": "^6.26.0",
+ "babel-traverse": "^6.26.0",
+ "babel-types": "^6.26.0",
+ "babylon": "^6.18.0",
+ "convert-source-map": "^1.5.1",
+ "debug": "^2.6.9",
+ "json5": "^0.5.1",
+ "lodash": "^4.17.4",
+ "minimatch": "^3.0.4",
+ "path-is-absolute": "^1.0.1",
+ "private": "^0.1.8",
+ "slash": "^1.0.0",
+ "source-map": "^0.5.7"
}
},
- "balanced-match": {
- "version": "1.0.0",
- "resolved": "https://registry.npmjs.org/balanced-match/-/balanced-match-1.0.0.tgz",
- "integrity": "sha1-ibTRmasr7kneFk6gK4nORi1xt2c=",
- "dev": true
- },
- "base64-js": {
- "version": "1.2.1",
- "resolved": "https://registry.npmjs.org/base64-js/-/base64-js-1.2.1.tgz",
- "integrity": "sha512-dwVUVIXsBZXwTuwnXI9RK8sBmgq09NDHzyR9SAph9eqk76gKK2JSQmZARC2zRC81JC2QTtxD0ARU5qTS25gIGw==",
- "dev": true
- },
- "bn.js": {
- "version": "4.11.8",
- "resolved": "https://registry.npmjs.org/bn.js/-/bn.js-4.11.8.tgz",
- "integrity": "sha512-ItfYfPLkWHUjckQCk8xC+LwxgK8NYcXywGigJgSwOP8Y2iyWT4f2vsZnoOXTTbo+o5yXmIUJ4gn5538SO5S3gA=="
- },
- "brace-expansion": {
- "version": "1.1.8",
- "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.8.tgz",
- "integrity": "sha1-wHshHHyVLsH479Uad+8NHTmQopI=",
+ "babel-generator": {
+ "version": "6.26.1",
+ "resolved": "https://registry.npmjs.org/babel-generator/-/babel-generator-6.26.1.tgz",
+ "integrity": "sha512-HyfwY6ApZj7BYTcJURpM5tznulaBvyio7/0d4zFOeMPUmfxkCjHocCuoLa2SAGzBI8AREcH3eP3758F672DppA==",
"dev": true,
"requires": {
- "balanced-match": "^1.0.0",
- "concat-map": "0.0.1"
+ "babel-messages": "^6.23.0",
+ "babel-runtime": "^6.26.0",
+ "babel-types": "^6.26.0",
+ "detect-indent": "^4.0.0",
+ "jsesc": "^1.3.0",
+ "lodash": "^4.17.4",
+ "source-map": "^0.5.7",
+ "trim-right": "^1.0.1"
}
},
- "braces": {
- "version": "3.0.2",
- "resolved": "https://registry.npmjs.org/braces/-/braces-3.0.2.tgz",
- "integrity": "sha512-b8um+L1RzM3WDSzvhm6gIz1yfTbBt6YTlcEKAvsmqCZZFw46z626lVj9j1yEPW33H5H+lBQpZMP1k8l+78Ha0A==",
+ "babel-helper-builder-binary-assignment-operator-visitor": {
+ "version": "6.24.1",
+ "resolved": "https://registry.npmjs.org/babel-helper-builder-binary-assignment-operator-visitor/-/babel-helper-builder-binary-assignment-operator-visitor-6.24.1.tgz",
+ "integrity": "sha1-zORReto1b0IgvK6KAsKzRvmlZmQ=",
"dev": true,
"requires": {
- "fill-range": "^7.0.1"
+ "babel-helper-explode-assignable-expression": "^6.24.1",
+ "babel-runtime": "^6.22.0",
+ "babel-types": "^6.24.1"
}
},
- "brorand": {
- "version": "1.1.0",
- "resolved": "https://registry.npmjs.org/brorand/-/brorand-1.1.0.tgz",
- "integrity": "sha1-EsJe/kCkXjwyPrhnWgoM5XsiNx8=",
- "dev": true
- },
- "browser-stdout": {
- "version": "1.3.0",
- "resolved": "https://registry.npmjs.org/browser-stdout/-/browser-stdout-1.3.0.tgz",
- "integrity": "sha1-81HTKWnTL6XXpVZxVCY9korjvR8=",
- "dev": true
- },
- "buffer": {
- "version": "5.0.8",
- "resolved": "https://registry.npmjs.org/buffer/-/buffer-5.0.8.tgz",
- "integrity": "sha512-xXvjQhVNz50v2nPeoOsNqWCLGfiv4ji/gXZM28jnVwdLJxH4mFyqgqCKfaK9zf1KUbG6zTkjLOy7ou+jSMarGA==",
+ "babel-helper-call-delegate": {
+ "version": "6.24.1",
+ "resolved": "https://registry.npmjs.org/babel-helper-call-delegate/-/babel-helper-call-delegate-6.24.1.tgz",
+ "integrity": "sha1-7Oaqzdx25Bw0YfiL/Fdb0Nqi340=",
"dev": true,
"requires": {
- "base64-js": "^1.0.2",
- "ieee754": "^1.1.4"
+ "babel-helper-hoist-variables": "^6.24.1",
+ "babel-runtime": "^6.22.0",
+ "babel-traverse": "^6.24.1",
+ "babel-types": "^6.24.1"
}
},
- "buffer-from": {
- "version": "1.1.1",
- "resolved": "https://registry.npmjs.org/buffer-from/-/buffer-from-1.1.1.tgz",
- "integrity": "sha512-MQcXEUbCKtEo7bhqEs6560Hyd4XaovZlO/k9V3hjVUF/zwW7KBVdSK4gIt/bzwS9MbR5qob+F5jusZsb0YQK2A==",
- "dev": true
- },
- "builtin-modules": {
- "version": "1.1.1",
- "resolved": "https://registry.npmjs.org/builtin-modules/-/builtin-modules-1.1.1.tgz",
- "integrity": "sha1-Jw8HbFpywC9bZaR9+Uxf46J4iS8=",
- "dev": true
- },
- "caching-transform": {
- "version": "3.0.2",
- "resolved": "https://registry.npmjs.org/caching-transform/-/caching-transform-3.0.2.tgz",
- "integrity": "sha512-Mtgcv3lh3U0zRii/6qVgQODdPA4G3zhG+jtbCWj39RXuUFTMzH0vcdMtaJS1jPowd+It2Pqr6y3NJMQqOqCE2w==",
+ "babel-helper-define-map": {
+ "version": "6.26.0",
+ "resolved": "https://registry.npmjs.org/babel-helper-define-map/-/babel-helper-define-map-6.26.0.tgz",
+ "integrity": "sha1-pfVtq0GiX5fstJjH66ypgZ+Vvl8=",
"dev": true,
"requires": {
- "hasha": "^3.0.0",
- "make-dir": "^2.0.0",
- "package-hash": "^3.0.0",
- "write-file-atomic": "^2.4.2"
- },
- "dependencies": {
- "write-file-atomic": {
- "version": "2.4.3",
- "resolved": "https://registry.npmjs.org/write-file-atomic/-/write-file-atomic-2.4.3.tgz",
- "integrity": "sha512-GaETH5wwsX+GcnzhPgKcKjJ6M2Cq3/iZp1WyY/X1CSqrW+jVNM9Y7D8EC2sM4ZG/V8wZlSniJnCKWPmBYAucRQ==",
- "dev": true,
- "requires": {
- "graceful-fs": "^4.1.11",
- "imurmurhash": "^0.1.4",
- "signal-exit": "^3.0.2"
- }
- }
+ "babel-helper-function-name": "^6.24.1",
+ "babel-runtime": "^6.26.0",
+ "babel-types": "^6.26.0",
+ "lodash": "^4.17.4"
}
},
- "caller-path": {
- "version": "0.1.0",
- "resolved": "https://registry.npmjs.org/caller-path/-/caller-path-0.1.0.tgz",
- "integrity": "sha1-lAhe9jWB7NPaqSREqP6U6CV3dR8=",
+ "babel-helper-explode-assignable-expression": {
+ "version": "6.24.1",
+ "resolved": "https://registry.npmjs.org/babel-helper-explode-assignable-expression/-/babel-helper-explode-assignable-expression-6.24.1.tgz",
+ "integrity": "sha1-8luCz33BBDPFX3BZLVdGQArCLKo=",
"dev": true,
"requires": {
- "callsites": "^0.2.0"
+ "babel-runtime": "^6.22.0",
+ "babel-traverse": "^6.24.1",
+ "babel-types": "^6.24.1"
}
},
- "callsites": {
- "version": "0.2.0",
- "resolved": "https://registry.npmjs.org/callsites/-/callsites-0.2.0.tgz",
- "integrity": "sha1-r6uWJikQp/M8GaV3WCXGnzTjUMo=",
- "dev": true
- },
- "camelcase": {
- "version": "5.3.1",
- "resolved": "https://registry.npmjs.org/camelcase/-/camelcase-5.3.1.tgz",
- "integrity": "sha512-L28STB170nwWS63UjtlEOE3dldQApaJXZkOI1uMFfzf3rRuPegHaHesyee+YxQ+W6SvRDQV6UrdOdRiR153wJg==",
- "dev": true
- },
- "catharsis": {
- "version": "0.8.11",
- "resolved": "https://registry.npmjs.org/catharsis/-/catharsis-0.8.11.tgz",
- "integrity": "sha512-a+xUyMV7hD1BrDQA/3iPV7oc+6W26BgVJO05PGEoatMyIuPScQKsde6i3YorWX1qs+AZjnJ18NqdKoCtKiNh1g==",
+ "babel-helper-function-name": {
+ "version": "6.24.1",
+ "resolved": "https://registry.npmjs.org/babel-helper-function-name/-/babel-helper-function-name-6.24.1.tgz",
+ "integrity": "sha1-00dbjAPtmCQqJbSDUasYOZ01gKk=",
"dev": true,
"requires": {
- "lodash": "^4.17.14"
+ "babel-helper-get-function-arity": "^6.24.1",
+ "babel-runtime": "^6.22.0",
+ "babel-template": "^6.24.1",
+ "babel-traverse": "^6.24.1",
+ "babel-types": "^6.24.1"
}
},
- "chai": {
- "version": "4.1.2",
- "resolved": "https://registry.npmjs.org/chai/-/chai-4.1.2.tgz",
- "integrity": "sha1-D2RYS6ZC8PKs4oBiefTwbKI61zw=",
+ "babel-helper-get-function-arity": {
+ "version": "6.24.1",
+ "resolved": "https://registry.npmjs.org/babel-helper-get-function-arity/-/babel-helper-get-function-arity-6.24.1.tgz",
+ "integrity": "sha1-j3eCqpNAfEHTqlCQj4mwMbG2hT0=",
"dev": true,
"requires": {
- "assertion-error": "^1.0.1",
- "check-error": "^1.0.1",
- "deep-eql": "^3.0.0",
- "get-func-name": "^2.0.0",
- "pathval": "^1.0.0",
- "type-detect": "^4.0.0"
+ "babel-runtime": "^6.22.0",
+ "babel-types": "^6.24.1"
}
},
- "chai-as-promised": {
- "version": "7.1.1",
- "resolved": "https://registry.npmjs.org/chai-as-promised/-/chai-as-promised-7.1.1.tgz",
- "integrity": "sha512-azL6xMoi+uxu6z4rhWQ1jbdUhOMhis2PvscD/xjLqNMkv3BPPp2JyyuTHOrf9BOosGpNQ11v6BKv/g57RXbiaA==",
+ "babel-helper-hoist-variables": {
+ "version": "6.24.1",
+ "resolved": "https://registry.npmjs.org/babel-helper-hoist-variables/-/babel-helper-hoist-variables-6.24.1.tgz",
+ "integrity": "sha1-HssnaJydJVE+rbyZFKc/VAi+enY=",
"dev": true,
"requires": {
- "check-error": "^1.0.2"
+ "babel-runtime": "^6.22.0",
+ "babel-types": "^6.24.1"
}
},
- "chalk": {
- "version": "1.1.3",
- "resolved": "https://registry.npmjs.org/chalk/-/chalk-1.1.3.tgz",
- "integrity": "sha1-qBFcVeSnAv5NFQq9OHKCKn4J/Jg=",
+ "babel-helper-optimise-call-expression": {
+ "version": "6.24.1",
+ "resolved": "https://registry.npmjs.org/babel-helper-optimise-call-expression/-/babel-helper-optimise-call-expression-6.24.1.tgz",
+ "integrity": "sha1-96E0J7qfc/j0+pk8VKl4gtEkQlc=",
"dev": true,
"requires": {
- "ansi-styles": "^2.2.1",
- "escape-string-regexp": "^1.0.2",
- "has-ansi": "^2.0.0",
- "strip-ansi": "^3.0.0",
- "supports-color": "^2.0.0"
+ "babel-runtime": "^6.22.0",
+ "babel-types": "^6.24.1"
}
},
- "chardet": {
- "version": "0.4.2",
- "resolved": "https://registry.npmjs.org/chardet/-/chardet-0.4.2.tgz",
- "integrity": "sha1-tUc7M9yXxCTl2Y3IfVXU2KKci/I=",
- "dev": true
- },
- "check-error": {
- "version": "1.0.2",
- "resolved": "https://registry.npmjs.org/check-error/-/check-error-1.0.2.tgz",
- "integrity": "sha1-V00xLt2Iu13YkS6Sht1sCu1KrII=",
- "dev": true
- },
- "circular-json": {
- "version": "0.3.3",
- "resolved": "https://registry.npmjs.org/circular-json/-/circular-json-0.3.3.tgz",
- "integrity": "sha512-UZK3NBx2Mca+b5LsG7bY183pHWt5Y1xts4P3Pz7ENTwGVnJOUWbRb3ocjvX7hx9tq/yTAdclXm9sZ38gNuem4A==",
- "dev": true
- },
- "cli-cursor": {
- "version": "2.1.0",
- "resolved": "https://registry.npmjs.org/cli-cursor/-/cli-cursor-2.1.0.tgz",
- "integrity": "sha1-s12sN2R5+sw+lHR9QdDQ9SOP/LU=",
+ "babel-helper-regex": {
+ "version": "6.26.0",
+ "resolved": "https://registry.npmjs.org/babel-helper-regex/-/babel-helper-regex-6.26.0.tgz",
+ "integrity": "sha1-MlxZ+QL4LyS3T6zu0DY5VPZJXnI=",
"dev": true,
"requires": {
- "restore-cursor": "^2.0.0"
+ "babel-runtime": "^6.26.0",
+ "babel-types": "^6.26.0",
+ "lodash": "^4.17.4"
}
},
- "cli-width": {
- "version": "2.2.0",
- "resolved": "https://registry.npmjs.org/cli-width/-/cli-width-2.2.0.tgz",
- "integrity": "sha1-/xnt6Kml5XkyQUewwR8PvLq+1jk=",
- "dev": true
- },
- "cliui": {
- "version": "5.0.0",
- "resolved": "https://registry.npmjs.org/cliui/-/cliui-5.0.0.tgz",
- "integrity": "sha512-PYeGSEmmHM6zvoef2w8TPzlrnNpXIjTipYK780YswmIP9vjxmd6Y2a3CB2Ks6/AU8NHjZugXvo8w3oWM2qnwXA==",
+ "babel-helper-remap-async-to-generator": {
+ "version": "6.24.1",
+ "resolved": "https://registry.npmjs.org/babel-helper-remap-async-to-generator/-/babel-helper-remap-async-to-generator-6.24.1.tgz",
+ "integrity": "sha1-XsWBgnrXI/7N04HxySg5BnbkVRs=",
"dev": true,
"requires": {
- "string-width": "^3.1.0",
- "strip-ansi": "^5.2.0",
- "wrap-ansi": "^5.1.0"
- },
- "dependencies": {
- "ansi-regex": {
- "version": "4.1.0",
- "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-4.1.0.tgz",
- "integrity": "sha512-1apePfXM1UOSqw0o9IiFAovVz9M5S1Dg+4TrDwfMewQ6p/rmMueb7tWZjQ1rx4Loy1ArBggoqGpfqqdI4rondg==",
- "dev": true
- },
- "strip-ansi": {
- "version": "5.2.0",
- "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-5.2.0.tgz",
- "integrity": "sha512-DuRs1gKbBqsMKIZlrffwlug8MHkcnpjs5VPmL1PAh+mA30U0DTotfDZ0d2UUsXpPmPmMMJ6W773MaA3J+lbiWA==",
- "dev": true,
- "requires": {
- "ansi-regex": "^4.1.0"
- }
- }
+ "babel-helper-function-name": "^6.24.1",
+ "babel-runtime": "^6.22.0",
+ "babel-template": "^6.24.1",
+ "babel-traverse": "^6.24.1",
+ "babel-types": "^6.24.1"
}
},
- "co": {
- "version": "4.6.0",
- "resolved": "https://registry.npmjs.org/co/-/co-4.6.0.tgz",
- "integrity": "sha1-bqa989hTrlTMuOR7+gvz+QMfsYQ=",
- "dev": true
+ "babel-helper-replace-supers": {
+ "version": "6.24.1",
+ "resolved": "https://registry.npmjs.org/babel-helper-replace-supers/-/babel-helper-replace-supers-6.24.1.tgz",
+ "integrity": "sha1-v22/5Dk40XNpohPKiov3S2qQqxo=",
+ "dev": true,
+ "requires": {
+ "babel-helper-optimise-call-expression": "^6.24.1",
+ "babel-messages": "^6.23.0",
+ "babel-runtime": "^6.22.0",
+ "babel-template": "^6.24.1",
+ "babel-traverse": "^6.24.1",
+ "babel-types": "^6.24.1"
+ }
},
- "color-convert": {
- "version": "1.9.1",
- "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-1.9.1.tgz",
- "integrity": "sha512-mjGanIiwQJskCC18rPR6OmrZ6fm2Lc7PeGFYwCmy5J34wC6F1PzdGL6xeMfmgicfYcNLGuVFA3WzXtIDCQSZxQ==",
+ "babel-helpers": {
+ "version": "6.24.1",
+ "resolved": "https://registry.npmjs.org/babel-helpers/-/babel-helpers-6.24.1.tgz",
+ "integrity": "sha1-NHHenK7DiOXIUOWX5Yom3fN2ArI=",
"dev": true,
"requires": {
- "color-name": "^1.1.1"
+ "babel-runtime": "^6.22.0",
+ "babel-template": "^6.24.1"
}
},
- "color-name": {
- "version": "1.1.3",
- "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.3.tgz",
- "integrity": "sha1-p9BVi9icQveV3UIyj3QIMcpTvCU=",
- "dev": true
+ "babel-messages": {
+ "version": "6.23.0",
+ "resolved": "https://registry.npmjs.org/babel-messages/-/babel-messages-6.23.0.tgz",
+ "integrity": "sha1-8830cDhYA1sqKVHG7F7fbGLyYw4=",
+ "dev": true,
+ "requires": {
+ "babel-runtime": "^6.22.0"
+ }
},
- "commander": {
- "version": "2.8.1",
- "resolved": "https://registry.npmjs.org/commander/-/commander-2.8.1.tgz",
- "integrity": "sha1-Br42f+v9oMMwqh4qBy09yXYkJdQ=",
+ "babel-plugin-check-es2015-constants": {
+ "version": "6.22.0",
+ "resolved": "https://registry.npmjs.org/babel-plugin-check-es2015-constants/-/babel-plugin-check-es2015-constants-6.22.0.tgz",
+ "integrity": "sha1-NRV7EBQm/S/9PaP3XH0ekYNbv4o=",
"dev": true,
"requires": {
- "graceful-readlink": ">= 1.0.0"
+ "babel-runtime": "^6.22.0"
}
},
- "commondir": {
- "version": "1.0.1",
- "resolved": "https://registry.npmjs.org/commondir/-/commondir-1.0.1.tgz",
- "integrity": "sha1-3dgA2gxmEnOTzKWVDqloo6rxJTs=",
+ "babel-plugin-syntax-async-functions": {
+ "version": "6.13.0",
+ "resolved": "https://registry.npmjs.org/babel-plugin-syntax-async-functions/-/babel-plugin-syntax-async-functions-6.13.0.tgz",
+ "integrity": "sha1-ytnK0RkbWtY0vzCuCHI5HgZHvpU=",
"dev": true
},
- "concat-map": {
- "version": "0.0.1",
- "resolved": "https://registry.npmjs.org/concat-map/-/concat-map-0.0.1.tgz",
- "integrity": "sha1-2Klr13/Wjfd5OnMDajug1UBdR3s=",
+ "babel-plugin-syntax-exponentiation-operator": {
+ "version": "6.13.0",
+ "resolved": "https://registry.npmjs.org/babel-plugin-syntax-exponentiation-operator/-/babel-plugin-syntax-exponentiation-operator-6.13.0.tgz",
+ "integrity": "sha1-nufoM3KQ2pUoggGmpX9BcDF4MN4=",
"dev": true
},
- "concat-stream": {
- "version": "1.6.0",
- "resolved": "https://registry.npmjs.org/concat-stream/-/concat-stream-1.6.0.tgz",
- "integrity": "sha1-CqxmL9Ur54lk1VMvaUeE5wEQrPc=",
+ "babel-plugin-syntax-trailing-function-commas": {
+ "version": "6.22.0",
+ "resolved": "https://registry.npmjs.org/babel-plugin-syntax-trailing-function-commas/-/babel-plugin-syntax-trailing-function-commas-6.22.0.tgz",
+ "integrity": "sha1-ugNgk3+NBuQBgKQ/4NVhb/9TLPM=",
+ "dev": true
+ },
+ "babel-plugin-transform-async-to-generator": {
+ "version": "6.24.1",
+ "resolved": "https://registry.npmjs.org/babel-plugin-transform-async-to-generator/-/babel-plugin-transform-async-to-generator-6.24.1.tgz",
+ "integrity": "sha1-ZTbjeK/2yx1VF6wOQOs+n8jQh2E=",
"dev": true,
"requires": {
- "inherits": "^2.0.3",
- "readable-stream": "^2.2.2",
- "typedarray": "^0.0.6"
+ "babel-helper-remap-async-to-generator": "^6.24.1",
+ "babel-plugin-syntax-async-functions": "^6.8.0",
+ "babel-runtime": "^6.22.0"
}
},
- "contains-path": {
- "version": "0.1.0",
- "resolved": "https://registry.npmjs.org/contains-path/-/contains-path-0.1.0.tgz",
- "integrity": "sha1-/ozxhP9mcLa67wGp1IYaXL7EEgo=",
- "dev": true
- },
- "convert-source-map": {
- "version": "1.7.0",
- "resolved": "https://registry.npmjs.org/convert-source-map/-/convert-source-map-1.7.0.tgz",
- "integrity": "sha512-4FJkXzKXEDB1snCFZlLP4gpC3JILicCpGbzG9f9G7tGqGCzETQ2hWPrcinA9oU4wtf2biUaEH5065UnMeR33oA==",
+ "babel-plugin-transform-es2015-arrow-functions": {
+ "version": "6.22.0",
+ "resolved": "https://registry.npmjs.org/babel-plugin-transform-es2015-arrow-functions/-/babel-plugin-transform-es2015-arrow-functions-6.22.0.tgz",
+ "integrity": "sha1-RSaSy3EdX3ncf4XkQM5BufJE0iE=",
"dev": true,
"requires": {
- "safe-buffer": "~5.1.1"
+ "babel-runtime": "^6.22.0"
}
},
- "core-util-is": {
- "version": "1.0.2",
- "resolved": "https://registry.npmjs.org/core-util-is/-/core-util-is-1.0.2.tgz",
- "integrity": "sha1-tf1UIgqivFq1eqtxQMlAdUUDwac=",
- "dev": true
- },
- "corser": {
- "version": "2.0.1",
- "resolved": "https://registry.npmjs.org/corser/-/corser-2.0.1.tgz",
- "integrity": "sha1-jtolLsqrWEDc2XXOuQ2TcMgZ/4c=",
- "dev": true
- },
- "cp-file": {
- "version": "6.2.0",
- "resolved": "https://registry.npmjs.org/cp-file/-/cp-file-6.2.0.tgz",
- "integrity": "sha512-fmvV4caBnofhPe8kOcitBwSn2f39QLjnAnGq3gO9dfd75mUytzKNZB1hde6QHunW2Rt+OwuBOMc3i1tNElbszA==",
+ "babel-plugin-transform-es2015-block-scoped-functions": {
+ "version": "6.22.0",
+ "resolved": "https://registry.npmjs.org/babel-plugin-transform-es2015-block-scoped-functions/-/babel-plugin-transform-es2015-block-scoped-functions-6.22.0.tgz",
+ "integrity": "sha1-u8UbSflk1wy42OC5ToICRs46YUE=",
"dev": true,
"requires": {
- "graceful-fs": "^4.1.2",
- "make-dir": "^2.0.0",
- "nested-error-stacks": "^2.0.0",
- "pify": "^4.0.1",
- "safe-buffer": "^5.0.1"
- },
- "dependencies": {
- "pify": {
- "version": "4.0.1",
- "resolved": "https://registry.npmjs.org/pify/-/pify-4.0.1.tgz",
- "integrity": "sha512-uB80kBFb/tfd68bVleG9T5GGsGPjJrLAUpR5PZIrhBnIaRTQRjqdJSsIKkOP6OAIFbj7GOrcudc5pNjZ+geV2g==",
- "dev": true
- }
+ "babel-runtime": "^6.22.0"
}
},
- "cross-spawn": {
- "version": "5.1.0",
- "resolved": "https://registry.npmjs.org/cross-spawn/-/cross-spawn-5.1.0.tgz",
- "integrity": "sha1-6L0O/uWPz/b4+UUQoKVUu/ojVEk=",
+ "babel-plugin-transform-es2015-block-scoping": {
+ "version": "6.26.0",
+ "resolved": "https://registry.npmjs.org/babel-plugin-transform-es2015-block-scoping/-/babel-plugin-transform-es2015-block-scoping-6.26.0.tgz",
+ "integrity": "sha1-1w9SmcEwjQXBL0Y4E7CgnnOxiV8=",
"dev": true,
"requires": {
- "lru-cache": "^4.0.1",
- "shebang-command": "^1.2.0",
- "which": "^1.2.9"
- },
- "dependencies": {
- "lru-cache": {
- "version": "4.1.1",
- "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-4.1.1.tgz",
- "integrity": "sha512-q4spe4KTfsAS1SUHLO0wz8Qiyf1+vMIAgpRYioFYDMNqKfHQbg+AVDH3i4fvpl71/P1L0dBl+fQi+P37UYf0ew==",
- "dev": true,
- "requires": {
- "pseudomap": "^1.0.2",
- "yallist": "^2.1.2"
- }
- }
+ "babel-runtime": "^6.26.0",
+ "babel-template": "^6.26.0",
+ "babel-traverse": "^6.26.0",
+ "babel-types": "^6.26.0",
+ "lodash": "^4.17.4"
}
},
- "debug": {
- "version": "2.6.9",
- "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz",
- "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==",
+ "babel-plugin-transform-es2015-classes": {
+ "version": "6.24.1",
+ "resolved": "https://registry.npmjs.org/babel-plugin-transform-es2015-classes/-/babel-plugin-transform-es2015-classes-6.24.1.tgz",
+ "integrity": "sha1-WkxYpQyclGHlZLSyo7+ryXolhNs=",
"dev": true,
"requires": {
- "ms": "2.0.0"
+ "babel-helper-define-map": "^6.24.1",
+ "babel-helper-function-name": "^6.24.1",
+ "babel-helper-optimise-call-expression": "^6.24.1",
+ "babel-helper-replace-supers": "^6.24.1",
+ "babel-messages": "^6.23.0",
+ "babel-runtime": "^6.22.0",
+ "babel-template": "^6.24.1",
+ "babel-traverse": "^6.24.1",
+ "babel-types": "^6.24.1"
}
},
- "decamelize": {
- "version": "1.2.0",
- "resolved": "https://registry.npmjs.org/decamelize/-/decamelize-1.2.0.tgz",
- "integrity": "sha1-9lNNFRSCabIDUue+4m9QH5oZEpA=",
- "dev": true
+ "babel-plugin-transform-es2015-computed-properties": {
+ "version": "6.24.1",
+ "resolved": "https://registry.npmjs.org/babel-plugin-transform-es2015-computed-properties/-/babel-plugin-transform-es2015-computed-properties-6.24.1.tgz",
+ "integrity": "sha1-b+Ko0WiV1WNPTNmZttNICjCBWbM=",
+ "dev": true,
+ "requires": {
+ "babel-runtime": "^6.22.0",
+ "babel-template": "^6.24.1"
+ }
},
- "deep-eql": {
- "version": "3.0.1",
- "resolved": "https://registry.npmjs.org/deep-eql/-/deep-eql-3.0.1.tgz",
- "integrity": "sha512-+QeIQyN5ZuO+3Uk5DYh6/1eKO0m0YmJFGNmFHGACpf1ClL1nmlV/p4gNgbl2pJGxgXb4faqo6UE+M5ACEMyVcw==",
+ "babel-plugin-transform-es2015-destructuring": {
+ "version": "6.23.0",
+ "resolved": "https://registry.npmjs.org/babel-plugin-transform-es2015-destructuring/-/babel-plugin-transform-es2015-destructuring-6.23.0.tgz",
+ "integrity": "sha1-mXux8auWf2gtKwh2/jWNYOdlxW0=",
"dev": true,
"requires": {
- "type-detect": "^4.0.0"
+ "babel-runtime": "^6.22.0"
}
},
- "deep-is": {
- "version": "0.1.3",
- "resolved": "https://registry.npmjs.org/deep-is/-/deep-is-0.1.3.tgz",
- "integrity": "sha1-s2nW+128E+7PUk+RsHD+7cNXzzQ=",
- "dev": true
+ "babel-plugin-transform-es2015-duplicate-keys": {
+ "version": "6.24.1",
+ "resolved": "https://registry.npmjs.org/babel-plugin-transform-es2015-duplicate-keys/-/babel-plugin-transform-es2015-duplicate-keys-6.24.1.tgz",
+ "integrity": "sha1-c+s9MQypaePvnskcU3QabxV2Qj4=",
+ "dev": true,
+ "requires": {
+ "babel-runtime": "^6.22.0",
+ "babel-types": "^6.24.1"
+ }
},
- "default-require-extensions": {
- "version": "2.0.0",
- "resolved": "https://registry.npmjs.org/default-require-extensions/-/default-require-extensions-2.0.0.tgz",
- "integrity": "sha1-9fj7sYp9bVCyH2QfZJ67Uiz+JPc=",
+ "babel-plugin-transform-es2015-for-of": {
+ "version": "6.23.0",
+ "resolved": "https://registry.npmjs.org/babel-plugin-transform-es2015-for-of/-/babel-plugin-transform-es2015-for-of-6.23.0.tgz",
+ "integrity": "sha1-9HyVsrYT3x0+zC/bdXNiPHUkhpE=",
"dev": true,
"requires": {
- "strip-bom": "^3.0.0"
- },
- "dependencies": {
- "strip-bom": {
- "version": "3.0.0",
- "resolved": "https://registry.npmjs.org/strip-bom/-/strip-bom-3.0.0.tgz",
- "integrity": "sha1-IzTBjpx1n3vdVv3vfprj1YjmjtM=",
- "dev": true
- }
+ "babel-runtime": "^6.22.0"
}
},
- "del": {
- "version": "2.2.2",
- "resolved": "https://registry.npmjs.org/del/-/del-2.2.2.tgz",
- "integrity": "sha1-wSyYHQZ4RshLyvhiz/kw2Qf/0ag=",
+ "babel-plugin-transform-es2015-function-name": {
+ "version": "6.24.1",
+ "resolved": "https://registry.npmjs.org/babel-plugin-transform-es2015-function-name/-/babel-plugin-transform-es2015-function-name-6.24.1.tgz",
+ "integrity": "sha1-g0yJhTvDaxrw86TF26qU/Y6sqos=",
"dev": true,
"requires": {
- "globby": "^5.0.0",
- "is-path-cwd": "^1.0.0",
- "is-path-in-cwd": "^1.0.0",
- "object-assign": "^4.0.1",
- "pify": "^2.0.0",
- "pinkie-promise": "^2.0.0",
- "rimraf": "^2.2.8"
+ "babel-helper-function-name": "^6.24.1",
+ "babel-runtime": "^6.22.0",
+ "babel-types": "^6.24.1"
}
},
- "diff": {
- "version": "3.3.1",
- "resolved": "https://registry.npmjs.org/diff/-/diff-3.3.1.tgz",
- "integrity": "sha512-MKPHZDMB0o6yHyDryUOScqZibp914ksXwAMYMTHj6KO8UeKsRYNJD3oNCKjTqZon+V488P7N/HzXF8t7ZR95ww==",
- "dev": true
+ "babel-plugin-transform-es2015-literals": {
+ "version": "6.22.0",
+ "resolved": "https://registry.npmjs.org/babel-plugin-transform-es2015-literals/-/babel-plugin-transform-es2015-literals-6.22.0.tgz",
+ "integrity": "sha1-T1SgLWzWbPkVKAAZox0xklN3yi4=",
+ "dev": true,
+ "requires": {
+ "babel-runtime": "^6.22.0"
+ }
},
- "doctrine": {
- "version": "2.1.0",
- "resolved": "https://registry.npmjs.org/doctrine/-/doctrine-2.1.0.tgz",
- "integrity": "sha512-35mSku4ZXK0vfCuHEDAwt55dg2jNajHZ1odvF+8SSr82EsZY4QmXfuWso8oEd8zRhVObSN18aM0CjSdoBX7zIw==",
+ "babel-plugin-transform-es2015-modules-amd": {
+ "version": "6.24.1",
+ "resolved": "https://registry.npmjs.org/babel-plugin-transform-es2015-modules-amd/-/babel-plugin-transform-es2015-modules-amd-6.24.1.tgz",
+ "integrity": "sha1-Oz5UAXI5hC1tGcMBHEvS8AoA0VQ=",
"dev": true,
"requires": {
- "esutils": "^2.0.2"
+ "babel-plugin-transform-es2015-modules-commonjs": "^6.24.1",
+ "babel-runtime": "^6.22.0",
+ "babel-template": "^6.24.1"
}
},
- "ecstatic": {
- "version": "3.3.2",
- "resolved": "https://registry.npmjs.org/ecstatic/-/ecstatic-3.3.2.tgz",
- "integrity": "sha512-fLf9l1hnwrHI2xn9mEDT7KIi22UDqA2jaCwyCbSUJh9a1V+LEUSL/JO/6TIz/QyuBURWUHrFL5Kg2TtO1bkkog==",
+ "babel-plugin-transform-es2015-modules-commonjs": {
+ "version": "6.26.2",
+ "resolved": "https://registry.npmjs.org/babel-plugin-transform-es2015-modules-commonjs/-/babel-plugin-transform-es2015-modules-commonjs-6.26.2.tgz",
+ "integrity": "sha512-CV9ROOHEdrjcwhIaJNBGMBCodN+1cfkwtM1SbUHmvyy35KGT7fohbpOxkE2uLz1o6odKK2Ck/tz47z+VqQfi9Q==",
"dev": true,
"requires": {
- "he": "^1.1.1",
- "mime": "^1.6.0",
- "minimist": "^1.1.0",
- "url-join": "^2.0.5"
- },
- "dependencies": {
- "mime": {
- "version": "1.6.0",
- "resolved": "https://registry.npmjs.org/mime/-/mime-1.6.0.tgz",
- "integrity": "sha512-x0Vn8spI+wuJ1O6S7gnbaQg8Pxh4NNHb7KSINmEWKiPE4RKOplvijn+NkmYmmRgP68mc70j2EbeTFRsrswaQeg==",
- "dev": true
- },
- "minimist": {
- "version": "1.2.5",
- "resolved": "https://registry.npmjs.org/minimist/-/minimist-1.2.5.tgz",
- "integrity": "sha512-FM9nNUYrRBAELZQT3xeZQ7fmMOBg6nWNmJKTcgsJeaLstP/UODVpGsr5OhXhhXg6f+qtJ8uiZ+PUxkDWcgIXLw==",
- "dev": true
- }
+ "babel-plugin-transform-strict-mode": "^6.24.1",
+ "babel-runtime": "^6.26.0",
+ "babel-template": "^6.26.0",
+ "babel-types": "^6.26.0"
}
},
- "elliptic": {
- "version": "github:openpgpjs/elliptic#ab7d8268c60b6abeb175841c578c224ac5b2d279",
- "from": "github:openpgpjs/elliptic#ab7d8268c60b6abeb175841c578c224ac5b2d279",
+ "babel-plugin-transform-es2015-modules-systemjs": {
+ "version": "6.24.1",
+ "resolved": "https://registry.npmjs.org/babel-plugin-transform-es2015-modules-systemjs/-/babel-plugin-transform-es2015-modules-systemjs-6.24.1.tgz",
+ "integrity": "sha1-/4mhQrkRmpBhlfXxBuzzBdlAfSM=",
"dev": true,
"requires": {
- "bn.js": "^4.4.0",
- "brorand": "^1.0.1",
- "hash.js": "^1.0.0",
- "hmac-drbg": "^1.0.0",
- "inherits": "^2.0.1",
- "minimalistic-assert": "^1.0.0",
- "minimalistic-crypto-utils": "^1.0.0"
+ "babel-helper-hoist-variables": "^6.24.1",
+ "babel-runtime": "^6.22.0",
+ "babel-template": "^6.24.1"
}
},
- "email-addresses": {
- "version": "3.1.0",
- "resolved": "https://registry.npmjs.org/email-addresses/-/email-addresses-3.1.0.tgz",
- "integrity": "sha512-k0/r7GrWVL32kZlGwfPNgB2Y/mMXVTq/decgLczm/j34whdaspNrZO8CnXPf1laaHxI6ptUlsnAxN+UAPw+fzg==",
- "dev": true
+ "babel-plugin-transform-es2015-modules-umd": {
+ "version": "6.24.1",
+ "resolved": "https://registry.npmjs.org/babel-plugin-transform-es2015-modules-umd/-/babel-plugin-transform-es2015-modules-umd-6.24.1.tgz",
+ "integrity": "sha1-rJl+YoXNGO1hdq22B9YCNErThGg=",
+ "dev": true,
+ "requires": {
+ "babel-plugin-transform-es2015-modules-amd": "^6.24.1",
+ "babel-runtime": "^6.22.0",
+ "babel-template": "^6.24.1"
+ }
},
- "emoji-regex": {
- "version": "7.0.3",
- "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-7.0.3.tgz",
- "integrity": "sha512-CwBLREIQ7LvYFB0WyRvwhq5N5qPhc6PMjD6bYggFlI5YyDgl+0vxq5VHbMOFqLg7hfWzmu8T5Z1QofhmTIhItA==",
- "dev": true
+ "babel-plugin-transform-es2015-object-super": {
+ "version": "6.24.1",
+ "resolved": "https://registry.npmjs.org/babel-plugin-transform-es2015-object-super/-/babel-plugin-transform-es2015-object-super-6.24.1.tgz",
+ "integrity": "sha1-JM72muIcuDp/hgPa0CH1cusnj40=",
+ "dev": true,
+ "requires": {
+ "babel-helper-replace-supers": "^6.24.1",
+ "babel-runtime": "^6.22.0"
+ }
},
- "entities": {
- "version": "2.0.0",
- "resolved": "https://registry.npmjs.org/entities/-/entities-2.0.0.tgz",
- "integrity": "sha512-D9f7V0JSRwIxlRI2mjMqufDrRDnx8p+eEOz7aUM9SuvF8gsBzra0/6tbjl1m8eQHrZlYj6PxqE00hZ1SAIKPLw==",
- "dev": true
+ "babel-plugin-transform-es2015-parameters": {
+ "version": "6.24.1",
+ "resolved": "https://registry.npmjs.org/babel-plugin-transform-es2015-parameters/-/babel-plugin-transform-es2015-parameters-6.24.1.tgz",
+ "integrity": "sha1-V6w1GrScrxSpfNE7CfZv3wpiXys=",
+ "dev": true,
+ "requires": {
+ "babel-helper-call-delegate": "^6.24.1",
+ "babel-helper-get-function-arity": "^6.24.1",
+ "babel-runtime": "^6.22.0",
+ "babel-template": "^6.24.1",
+ "babel-traverse": "^6.24.1",
+ "babel-types": "^6.24.1"
+ }
},
- "error-ex": {
- "version": "1.3.1",
- "resolved": "https://registry.npmjs.org/error-ex/-/error-ex-1.3.1.tgz",
- "integrity": "sha1-+FWobOYa3E6GIcPNoh56dhLDqNw=",
+ "babel-plugin-transform-es2015-shorthand-properties": {
+ "version": "6.24.1",
+ "resolved": "https://registry.npmjs.org/babel-plugin-transform-es2015-shorthand-properties/-/babel-plugin-transform-es2015-shorthand-properties-6.24.1.tgz",
+ "integrity": "sha1-JPh11nIch2YbvZmkYi5R8U3jiqA=",
"dev": true,
"requires": {
- "is-arrayish": "^0.2.1"
+ "babel-runtime": "^6.22.0",
+ "babel-types": "^6.24.1"
}
},
- "es6-error": {
- "version": "4.1.1",
- "resolved": "https://registry.npmjs.org/es6-error/-/es6-error-4.1.1.tgz",
- "integrity": "sha512-Um/+FxMr9CISWh0bi5Zv0iOD+4cFh5qLeks1qhAopKVAJw3drgKbKySikp7wGhDL0HPeaja0P5ULZrxLkniUVg==",
- "dev": true
+ "babel-plugin-transform-es2015-spread": {
+ "version": "6.22.0",
+ "resolved": "https://registry.npmjs.org/babel-plugin-transform-es2015-spread/-/babel-plugin-transform-es2015-spread-6.22.0.tgz",
+ "integrity": "sha1-1taKmfia7cRTbIGlQujdnxdG+NE=",
+ "dev": true,
+ "requires": {
+ "babel-runtime": "^6.22.0"
+ }
},
- "escape-string-regexp": {
- "version": "1.0.5",
- "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-1.0.5.tgz",
- "integrity": "sha1-G2HAViGQqN/2rjuyzwIAyhMLhtQ=",
+ "babel-plugin-transform-es2015-sticky-regex": {
+ "version": "6.24.1",
+ "resolved": "https://registry.npmjs.org/babel-plugin-transform-es2015-sticky-regex/-/babel-plugin-transform-es2015-sticky-regex-6.24.1.tgz",
+ "integrity": "sha1-AMHNsaynERLN8M9hJsLta0V8zbw=",
+ "dev": true,
+ "requires": {
+ "babel-helper-regex": "^6.24.1",
+ "babel-runtime": "^6.22.0",
+ "babel-types": "^6.24.1"
+ }
+ },
+ "babel-plugin-transform-es2015-template-literals": {
+ "version": "6.22.0",
+ "resolved": "https://registry.npmjs.org/babel-plugin-transform-es2015-template-literals/-/babel-plugin-transform-es2015-template-literals-6.22.0.tgz",
+ "integrity": "sha1-qEs0UPfp+PH2g51taH2oS7EjbY0=",
+ "dev": true,
+ "requires": {
+ "babel-runtime": "^6.22.0"
+ }
+ },
+ "babel-plugin-transform-es2015-typeof-symbol": {
+ "version": "6.23.0",
+ "resolved": "https://registry.npmjs.org/babel-plugin-transform-es2015-typeof-symbol/-/babel-plugin-transform-es2015-typeof-symbol-6.23.0.tgz",
+ "integrity": "sha1-3sCfHN3/lLUqxz1QXITfWdzOs3I=",
+ "dev": true,
+ "requires": {
+ "babel-runtime": "^6.22.0"
+ }
+ },
+ "babel-plugin-transform-es2015-unicode-regex": {
+ "version": "6.24.1",
+ "resolved": "https://registry.npmjs.org/babel-plugin-transform-es2015-unicode-regex/-/babel-plugin-transform-es2015-unicode-regex-6.24.1.tgz",
+ "integrity": "sha1-04sS9C6nMj9yk4fxinxa4frrNek=",
+ "dev": true,
+ "requires": {
+ "babel-helper-regex": "^6.24.1",
+ "babel-runtime": "^6.22.0",
+ "regexpu-core": "^2.0.0"
+ }
+ },
+ "babel-plugin-transform-es3-member-expression-literals": {
+ "version": "6.22.0",
+ "resolved": "https://registry.npmjs.org/babel-plugin-transform-es3-member-expression-literals/-/babel-plugin-transform-es3-member-expression-literals-6.22.0.tgz",
+ "integrity": "sha1-cz00RPPsxBvvjtGmpOCWV7iWnrs=",
+ "dev": true,
+ "requires": {
+ "babel-runtime": "^6.22.0"
+ }
+ },
+ "babel-plugin-transform-es3-property-literals": {
+ "version": "6.22.0",
+ "resolved": "https://registry.npmjs.org/babel-plugin-transform-es3-property-literals/-/babel-plugin-transform-es3-property-literals-6.22.0.tgz",
+ "integrity": "sha1-sgeNWELiKr9A9z6M3pzTcRq9V1g=",
+ "dev": true,
+ "requires": {
+ "babel-runtime": "^6.22.0"
+ }
+ },
+ "babel-plugin-transform-exponentiation-operator": {
+ "version": "6.24.1",
+ "resolved": "https://registry.npmjs.org/babel-plugin-transform-exponentiation-operator/-/babel-plugin-transform-exponentiation-operator-6.24.1.tgz",
+ "integrity": "sha1-KrDJx/MJj6SJB3cruBP+QejeOg4=",
+ "dev": true,
+ "requires": {
+ "babel-helper-builder-binary-assignment-operator-visitor": "^6.24.1",
+ "babel-plugin-syntax-exponentiation-operator": "^6.8.0",
+ "babel-runtime": "^6.22.0"
+ }
+ },
+ "babel-plugin-transform-regenerator": {
+ "version": "6.26.0",
+ "resolved": "https://registry.npmjs.org/babel-plugin-transform-regenerator/-/babel-plugin-transform-regenerator-6.26.0.tgz",
+ "integrity": "sha1-4HA2lvveJ/Cj78rPi03KL3s6jy8=",
+ "dev": true,
+ "requires": {
+ "regenerator-transform": "^0.10.0"
+ }
+ },
+ "babel-plugin-transform-remove-strict-mode": {
+ "version": "0.0.2",
+ "resolved": "https://registry.npmjs.org/babel-plugin-transform-remove-strict-mode/-/babel-plugin-transform-remove-strict-mode-0.0.2.tgz",
+ "integrity": "sha1-kTaFqrlUOfOg7YjliPvV6ZeJBXk=",
"dev": true
},
- "eslint": {
- "version": "4.19.1",
- "resolved": "https://registry.npmjs.org/eslint/-/eslint-4.19.1.tgz",
- "integrity": "sha512-bT3/1x1EbZB7phzYu7vCr1v3ONuzDtX8WjuM9c0iYxe+cq+pwcKEoQjl7zd3RpC6YOLgnSy3cTN58M2jcoPDIQ==",
+ "babel-plugin-transform-runtime": {
+ "version": "6.23.0",
+ "resolved": "https://registry.npmjs.org/babel-plugin-transform-runtime/-/babel-plugin-transform-runtime-6.23.0.tgz",
+ "integrity": "sha1-iEkNRGUC6puOfvsP4J7E2ZR5se4=",
"dev": true,
"requires": {
- "ajv": "^5.3.0",
- "babel-code-frame": "^6.22.0",
- "chalk": "^2.1.0",
- "concat-stream": "^1.6.0",
- "cross-spawn": "^5.1.0",
- "debug": "^3.1.0",
- "doctrine": "^2.1.0",
- "eslint-scope": "^3.7.1",
- "eslint-visitor-keys": "^1.0.0",
- "espree": "^3.5.4",
- "esquery": "^1.0.0",
- "esutils": "^2.0.2",
- "file-entry-cache": "^2.0.0",
- "functional-red-black-tree": "^1.0.1",
- "glob": "^7.1.2",
- "globals": "^11.0.1",
- "ignore": "^3.3.3",
- "imurmurhash": "^0.1.4",
- "inquirer": "^3.0.6",
- "is-resolvable": "^1.0.0",
- "js-yaml": "^3.9.1",
- "json-stable-stringify-without-jsonify": "^1.0.1",
- "levn": "^0.3.0",
+ "babel-runtime": "^6.22.0"
+ }
+ },
+ "babel-plugin-transform-strict-mode": {
+ "version": "6.24.1",
+ "resolved": "https://registry.npmjs.org/babel-plugin-transform-strict-mode/-/babel-plugin-transform-strict-mode-6.24.1.tgz",
+ "integrity": "sha1-1fr3qleKZbvlkc9e2uBKDGcCB1g=",
+ "dev": true,
+ "requires": {
+ "babel-runtime": "^6.22.0",
+ "babel-types": "^6.24.1"
+ }
+ },
+ "babel-polyfill": {
+ "version": "6.26.0",
+ "resolved": "https://registry.npmjs.org/babel-polyfill/-/babel-polyfill-6.26.0.tgz",
+ "integrity": "sha1-N5k3q8Z9eJWXCtxiHyhM2WbPIVM=",
+ "dev": true,
+ "requires": {
+ "babel-runtime": "^6.26.0",
+ "core-js": "^2.5.0",
+ "regenerator-runtime": "^0.10.5"
+ },
+ "dependencies": {
+ "regenerator-runtime": {
+ "version": "0.10.5",
+ "resolved": "https://registry.npmjs.org/regenerator-runtime/-/regenerator-runtime-0.10.5.tgz",
+ "integrity": "sha1-M2w+/BIgrc7dosn6tntaeVWjNlg=",
+ "dev": true
+ }
+ }
+ },
+ "babel-preset-env": {
+ "version": "1.7.0",
+ "resolved": "https://registry.npmjs.org/babel-preset-env/-/babel-preset-env-1.7.0.tgz",
+ "integrity": "sha512-9OR2afuKDneX2/q2EurSftUYM0xGu4O2D9adAhVfADDhrYDaxXV0rBbevVYoY9n6nyX1PmQW/0jtpJvUNr9CHg==",
+ "dev": true,
+ "requires": {
+ "babel-plugin-check-es2015-constants": "^6.22.0",
+ "babel-plugin-syntax-trailing-function-commas": "^6.22.0",
+ "babel-plugin-transform-async-to-generator": "^6.22.0",
+ "babel-plugin-transform-es2015-arrow-functions": "^6.22.0",
+ "babel-plugin-transform-es2015-block-scoped-functions": "^6.22.0",
+ "babel-plugin-transform-es2015-block-scoping": "^6.23.0",
+ "babel-plugin-transform-es2015-classes": "^6.23.0",
+ "babel-plugin-transform-es2015-computed-properties": "^6.22.0",
+ "babel-plugin-transform-es2015-destructuring": "^6.23.0",
+ "babel-plugin-transform-es2015-duplicate-keys": "^6.22.0",
+ "babel-plugin-transform-es2015-for-of": "^6.23.0",
+ "babel-plugin-transform-es2015-function-name": "^6.22.0",
+ "babel-plugin-transform-es2015-literals": "^6.22.0",
+ "babel-plugin-transform-es2015-modules-amd": "^6.22.0",
+ "babel-plugin-transform-es2015-modules-commonjs": "^6.23.0",
+ "babel-plugin-transform-es2015-modules-systemjs": "^6.23.0",
+ "babel-plugin-transform-es2015-modules-umd": "^6.23.0",
+ "babel-plugin-transform-es2015-object-super": "^6.22.0",
+ "babel-plugin-transform-es2015-parameters": "^6.23.0",
+ "babel-plugin-transform-es2015-shorthand-properties": "^6.22.0",
+ "babel-plugin-transform-es2015-spread": "^6.22.0",
+ "babel-plugin-transform-es2015-sticky-regex": "^6.22.0",
+ "babel-plugin-transform-es2015-template-literals": "^6.22.0",
+ "babel-plugin-transform-es2015-typeof-symbol": "^6.23.0",
+ "babel-plugin-transform-es2015-unicode-regex": "^6.22.0",
+ "babel-plugin-transform-exponentiation-operator": "^6.22.0",
+ "babel-plugin-transform-regenerator": "^6.22.0",
+ "browserslist": "^3.2.6",
+ "invariant": "^2.2.2",
+ "semver": "^5.3.0"
+ }
+ },
+ "babel-preset-es2015": {
+ "version": "6.6.0",
+ "resolved": "https://registry.npmjs.org/babel-preset-es2015/-/babel-preset-es2015-6.6.0.tgz",
+ "integrity": "sha1-iLM+WP7JTG695Y3GXs5dFODsJWg=",
+ "dev": true,
+ "requires": {
+ "babel-plugin-check-es2015-constants": "^6.3.13",
+ "babel-plugin-transform-es2015-arrow-functions": "^6.3.13",
+ "babel-plugin-transform-es2015-block-scoped-functions": "^6.3.13",
+ "babel-plugin-transform-es2015-block-scoping": "^6.6.0",
+ "babel-plugin-transform-es2015-classes": "^6.6.0",
+ "babel-plugin-transform-es2015-computed-properties": "^6.3.13",
+ "babel-plugin-transform-es2015-destructuring": "^6.6.0",
+ "babel-plugin-transform-es2015-duplicate-keys": "^6.6.0",
+ "babel-plugin-transform-es2015-for-of": "^6.6.0",
+ "babel-plugin-transform-es2015-function-name": "^6.3.13",
+ "babel-plugin-transform-es2015-literals": "^6.3.13",
+ "babel-plugin-transform-es2015-modules-commonjs": "^6.6.0",
+ "babel-plugin-transform-es2015-object-super": "^6.3.13",
+ "babel-plugin-transform-es2015-parameters": "^6.6.0",
+ "babel-plugin-transform-es2015-shorthand-properties": "^6.3.13",
+ "babel-plugin-transform-es2015-spread": "^6.3.13",
+ "babel-plugin-transform-es2015-sticky-regex": "^6.3.13",
+ "babel-plugin-transform-es2015-template-literals": "^6.6.0",
+ "babel-plugin-transform-es2015-typeof-symbol": "^6.6.0",
+ "babel-plugin-transform-es2015-unicode-regex": "^6.3.13",
+ "babel-plugin-transform-regenerator": "^6.6.0"
+ }
+ },
+ "babel-preset-es2015-mod": {
+ "version": "6.6.0",
+ "resolved": "https://registry.npmjs.org/babel-preset-es2015-mod/-/babel-preset-es2015-mod-6.6.0.tgz",
+ "integrity": "sha1-4QW2LrfBABCQq4YiUpiQTPkMHo4=",
+ "dev": true,
+ "requires": {
+ "babel-plugin-transform-es2015-modules-commonjs": "6.7.7",
+ "babel-plugin-transform-regenerator": "6.6.5",
+ "babel-preset-es2015": "6.6.0",
+ "modify-babel-preset": "2.0.2"
+ },
+ "dependencies": {
+ "babel-plugin-transform-es2015-modules-commonjs": {
+ "version": "6.7.7",
+ "resolved": "https://registry.npmjs.org/babel-plugin-transform-es2015-modules-commonjs/-/babel-plugin-transform-es2015-modules-commonjs-6.7.7.tgz",
+ "integrity": "sha1-+lyiAWYXxNcSEj2M/BV4f8qoPzM=",
+ "dev": true,
+ "requires": {
+ "babel-plugin-transform-strict-mode": "^6.6.5",
+ "babel-runtime": "^5.0.0",
+ "babel-template": "^6.7.0",
+ "babel-types": "^6.7.7"
+ }
+ },
+ "babel-plugin-transform-regenerator": {
+ "version": "6.6.5",
+ "resolved": "https://registry.npmjs.org/babel-plugin-transform-regenerator/-/babel-plugin-transform-regenerator-6.6.5.tgz",
+ "integrity": "sha1-B5qYK9VuIjXjHuOxetVK66iY1Oc=",
+ "dev": true,
+ "requires": {
+ "babel-core": "^6.6.5",
+ "babel-plugin-syntax-async-functions": "^6.3.13",
+ "babel-plugin-transform-es2015-block-scoping": "^6.6.5",
+ "babel-plugin-transform-es2015-for-of": "^6.6.0",
+ "babel-runtime": "^5.0.0",
+ "babel-traverse": "^6.6.5",
+ "babel-types": "^6.6.5",
+ "babylon": "^6.6.5",
+ "private": "~0.1.5"
+ }
+ },
+ "babel-runtime": {
+ "version": "5.8.38",
+ "resolved": "https://registry.npmjs.org/babel-runtime/-/babel-runtime-5.8.38.tgz",
+ "integrity": "sha1-HAsC62MxL18If/IEUIJ7QlydTBk=",
+ "dev": true,
+ "requires": {
+ "core-js": "^1.0.0"
+ }
+ },
+ "core-js": {
+ "version": "1.2.7",
+ "resolved": "https://registry.npmjs.org/core-js/-/core-js-1.2.7.tgz",
+ "integrity": "sha1-ZSKUwUZR2yj6k70tX/KYOk8IxjY=",
+ "dev": true
+ }
+ }
+ },
+ "babel-preset-es3": {
+ "version": "1.0.1",
+ "resolved": "https://registry.npmjs.org/babel-preset-es3/-/babel-preset-es3-1.0.1.tgz",
+ "integrity": "sha1-4I3ZUKFnDauLUKvOqpuT09mszR4=",
+ "dev": true,
+ "requires": {
+ "babel-plugin-transform-es3-member-expression-literals": "^6.8.0",
+ "babel-plugin-transform-es3-property-literals": "^6.8.0"
+ }
+ },
+ "babel-register": {
+ "version": "6.26.0",
+ "resolved": "https://registry.npmjs.org/babel-register/-/babel-register-6.26.0.tgz",
+ "integrity": "sha1-btAhFz4vy0htestFxgCahW9kcHE=",
+ "dev": true,
+ "requires": {
+ "babel-core": "^6.26.0",
+ "babel-runtime": "^6.26.0",
+ "core-js": "^2.5.0",
+ "home-or-tmp": "^2.0.0",
"lodash": "^4.17.4",
- "minimatch": "^3.0.2",
"mkdirp": "^0.5.1",
- "natural-compare": "^1.4.0",
- "optionator": "^0.8.2",
- "path-is-inside": "^1.0.2",
- "pluralize": "^7.0.0",
- "progress": "^2.0.0",
- "regexpp": "^1.0.1",
- "require-uncached": "^1.0.3",
- "semver": "^5.3.0",
- "strip-ansi": "^4.0.0",
- "strip-json-comments": "~2.0.1",
- "table": "4.0.2",
- "text-table": "~0.2.0"
+ "source-map-support": "^0.4.15"
+ }
+ },
+ "babel-runtime": {
+ "version": "6.26.0",
+ "resolved": "https://registry.npmjs.org/babel-runtime/-/babel-runtime-6.26.0.tgz",
+ "integrity": "sha1-llxwWGaOgrVde/4E/yM3vItWR/4=",
+ "dev": true,
+ "requires": {
+ "core-js": "^2.4.0",
+ "regenerator-runtime": "^0.11.0"
+ }
+ },
+ "babel-template": {
+ "version": "6.26.0",
+ "resolved": "https://registry.npmjs.org/babel-template/-/babel-template-6.26.0.tgz",
+ "integrity": "sha1-3gPi0WOWsGn0bdn/+FIfsaDjXgI=",
+ "dev": true,
+ "requires": {
+ "babel-runtime": "^6.26.0",
+ "babel-traverse": "^6.26.0",
+ "babel-types": "^6.26.0",
+ "babylon": "^6.18.0",
+ "lodash": "^4.17.4"
+ }
+ },
+ "babel-traverse": {
+ "version": "6.26.0",
+ "resolved": "https://registry.npmjs.org/babel-traverse/-/babel-traverse-6.26.0.tgz",
+ "integrity": "sha1-RqnL1+3MYsjlwGTi0tjQ9ANXZu4=",
+ "dev": true,
+ "requires": {
+ "babel-code-frame": "^6.26.0",
+ "babel-messages": "^6.23.0",
+ "babel-runtime": "^6.26.0",
+ "babel-types": "^6.26.0",
+ "babylon": "^6.18.0",
+ "debug": "^2.6.8",
+ "globals": "^9.18.0",
+ "invariant": "^2.2.2",
+ "lodash": "^4.17.4"
+ }
+ },
+ "babel-types": {
+ "version": "6.26.0",
+ "resolved": "https://registry.npmjs.org/babel-types/-/babel-types-6.26.0.tgz",
+ "integrity": "sha1-o7Bz+Uq0nrb6Vc1lInozQ4BjJJc=",
+ "dev": true,
+ "requires": {
+ "babel-runtime": "^6.26.0",
+ "esutils": "^2.0.2",
+ "lodash": "^4.17.4",
+ "to-fast-properties": "^1.0.3"
+ }
+ },
+ "babelify": {
+ "version": "8.0.0",
+ "resolved": "https://registry.npmjs.org/babelify/-/babelify-8.0.0.tgz",
+ "integrity": "sha512-xVr63fKEvMWUrrIbqlHYsMcc5Zdw4FSVesAHgkgajyCE1W8gbm9rbMakqavhxKvikGYMhEcqxTwB/gQmQ6lBtw==",
+ "dev": true
+ },
+ "babylon": {
+ "version": "6.18.0",
+ "resolved": "https://registry.npmjs.org/babylon/-/babylon-6.18.0.tgz",
+ "integrity": "sha512-q/UEjfGJ2Cm3oKV71DJz9d25TPnq5rhBVL2Q4fA5wcC3jcrdn7+SssEybFIxwAvvP+YCsCYNKughoF33GxgycQ==",
+ "dev": true
+ },
+ "balanced-match": {
+ "version": "1.0.0",
+ "resolved": "https://registry.npmjs.org/balanced-match/-/balanced-match-1.0.0.tgz",
+ "integrity": "sha1-ibTRmasr7kneFk6gK4nORi1xt2c=",
+ "dev": true
+ },
+ "base": {
+ "version": "0.11.2",
+ "resolved": "https://registry.npmjs.org/base/-/base-0.11.2.tgz",
+ "integrity": "sha512-5T6P4xPgpp0YDFvSWwEZ4NoE3aM4QBQXDzmVbraCkFj8zHM+mba8SyqB5DbZWyR7mYHo6Y7BdQo3MoA4m0TeQg==",
+ "dev": true,
+ "requires": {
+ "cache-base": "^1.0.1",
+ "class-utils": "^0.3.5",
+ "component-emitter": "^1.2.1",
+ "define-property": "^1.0.0",
+ "isobject": "^3.0.1",
+ "mixin-deep": "^1.2.0",
+ "pascalcase": "^0.1.1"
},
"dependencies": {
- "acorn": {
- "version": "5.7.4",
- "resolved": "https://registry.npmjs.org/acorn/-/acorn-5.7.4.tgz",
- "integrity": "sha512-1D++VG7BhrtvQpNbBzovKNc1FLGGEE/oGe7b9xJm/RFHMBeUaUGpluV9RLjZa47YFdPcDAenEYuq9pQPcMdLJg==",
+ "define-property": {
+ "version": "1.0.0",
+ "resolved": "https://registry.npmjs.org/define-property/-/define-property-1.0.0.tgz",
+ "integrity": "sha1-dp66rz9KY6rTr56NMEybvnm/sOY=",
+ "dev": true,
+ "requires": {
+ "is-descriptor": "^1.0.0"
+ }
+ },
+ "is-accessor-descriptor": {
+ "version": "1.0.0",
+ "resolved": "https://registry.npmjs.org/is-accessor-descriptor/-/is-accessor-descriptor-1.0.0.tgz",
+ "integrity": "sha512-m5hnHTkcVsPfqx3AKlyttIPb7J+XykHvJP2B9bZDjlhLIoEq4XoK64Vg7boZlVWYK6LUY94dYPEE7Lh0ZkZKcQ==",
+ "dev": true,
+ "requires": {
+ "kind-of": "^6.0.0"
+ }
+ },
+ "is-data-descriptor": {
+ "version": "1.0.0",
+ "resolved": "https://registry.npmjs.org/is-data-descriptor/-/is-data-descriptor-1.0.0.tgz",
+ "integrity": "sha512-jbRXy1FmtAoCjQkVmIVYwuuqDFUbaOeDjmed1tOGPrsMhtJA4rD9tkgA0F1qJ3gRFRXcHYVkdeaP50Q5rE/jLQ==",
+ "dev": true,
+ "requires": {
+ "kind-of": "^6.0.0"
+ }
+ },
+ "is-descriptor": {
+ "version": "1.0.2",
+ "resolved": "https://registry.npmjs.org/is-descriptor/-/is-descriptor-1.0.2.tgz",
+ "integrity": "sha512-2eis5WqQGV7peooDyLmNEPUrps9+SXX5c9pL3xEB+4e9HnGuDa7mB7kHxHw4CbqS9k1T2hOH3miL8n8WtiYVtg==",
+ "dev": true,
+ "requires": {
+ "is-accessor-descriptor": "^1.0.0",
+ "is-data-descriptor": "^1.0.0",
+ "kind-of": "^6.0.2"
+ }
+ },
+ "isobject": {
+ "version": "3.0.1",
+ "resolved": "https://registry.npmjs.org/isobject/-/isobject-3.0.1.tgz",
+ "integrity": "sha1-TkMekrEalzFjaqH5yNHMvP2reN8=",
+ "dev": true
+ },
+ "kind-of": {
+ "version": "6.0.3",
+ "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-6.0.3.tgz",
+ "integrity": "sha512-dcS1ul+9tmeD95T+x28/ehLgd9mENa3LsvDTtzm3vyBEO7RPptvAD+t44WVXaUjTBRcrpFeFlC8WCruUR456hw==",
"dev": true
+ }
+ }
+ },
+ "base64-js": {
+ "version": "1.2.1",
+ "resolved": "https://registry.npmjs.org/base64-js/-/base64-js-1.2.1.tgz",
+ "integrity": "sha512-dwVUVIXsBZXwTuwnXI9RK8sBmgq09NDHzyR9SAph9eqk76gKK2JSQmZARC2zRC81JC2QTtxD0ARU5qTS25gIGw==",
+ "dev": true
+ },
+ "basic-auth": {
+ "version": "2.0.0",
+ "resolved": "https://registry.npmjs.org/basic-auth/-/basic-auth-2.0.0.tgz",
+ "integrity": "sha1-AV2z81PgLlY3d1X5YnQuiYHnu7o=",
+ "dev": true,
+ "requires": {
+ "safe-buffer": "5.1.1"
+ }
+ },
+ "batch": {
+ "version": "0.6.1",
+ "resolved": "https://registry.npmjs.org/batch/-/batch-0.6.1.tgz",
+ "integrity": "sha1-3DQxT05nkxgJP8dgJyUl+UvyXBY=",
+ "dev": true
+ },
+ "binary-extensions": {
+ "version": "1.11.0",
+ "resolved": "https://registry.npmjs.org/binary-extensions/-/binary-extensions-1.11.0.tgz",
+ "integrity": "sha1-RqoXUftqL5PuXmibsQh9SxTGwgU=",
+ "dev": true
+ },
+ "bindings": {
+ "version": "1.5.0",
+ "resolved": "https://registry.npmjs.org/bindings/-/bindings-1.5.0.tgz",
+ "integrity": "sha512-p2q/t/mhvuOj/UeLlV6566GD/guowlr0hHxClI0W9m7MWYkL1F0hLo+0Aexs9HSPCtR1SXQ0TD3MMKrXZajbiQ==",
+ "dev": true,
+ "optional": true,
+ "requires": {
+ "file-uri-to-path": "1.0.0"
+ }
+ },
+ "bluebird": {
+ "version": "3.5.1",
+ "resolved": "https://registry.npmjs.org/bluebird/-/bluebird-3.5.1.tgz",
+ "integrity": "sha512-MKiLiV+I1AA596t9w1sQJ8jkiSr5+ZKi0WKrYGUn6d1Fx+Ij4tIj+m2WMQSGczs5jZVxV339chE8iwk6F64wjA==",
+ "dev": true
+ },
+ "bn.js": {
+ "version": "4.11.8",
+ "resolved": "https://registry.npmjs.org/bn.js/-/bn.js-4.11.8.tgz",
+ "integrity": "sha512-ItfYfPLkWHUjckQCk8xC+LwxgK8NYcXywGigJgSwOP8Y2iyWT4f2vsZnoOXTTbo+o5yXmIUJ4gn5538SO5S3gA=="
+ },
+ "body": {
+ "version": "5.1.0",
+ "resolved": "https://registry.npmjs.org/body/-/body-5.1.0.tgz",
+ "integrity": "sha1-5LoM5BCkaTYyM2dgnstOZVMSUGk=",
+ "dev": true,
+ "requires": {
+ "continuable-cache": "^0.3.1",
+ "error": "^7.0.0",
+ "raw-body": "~1.1.0",
+ "safe-json-parse": "~1.0.1"
+ }
+ },
+ "brace-expansion": {
+ "version": "1.1.8",
+ "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.8.tgz",
+ "integrity": "sha1-wHshHHyVLsH479Uad+8NHTmQopI=",
+ "dev": true,
+ "requires": {
+ "balanced-match": "^1.0.0",
+ "concat-map": "0.0.1"
+ }
+ },
+ "brorand": {
+ "version": "1.1.0",
+ "resolved": "https://registry.npmjs.org/brorand/-/brorand-1.1.0.tgz",
+ "integrity": "sha1-EsJe/kCkXjwyPrhnWgoM5XsiNx8=",
+ "dev": true
+ },
+ "browser-pack": {
+ "version": "6.1.0",
+ "resolved": "https://registry.npmjs.org/browser-pack/-/browser-pack-6.1.0.tgz",
+ "integrity": "sha512-erYug8XoqzU3IfcU8fUgyHqyOXqIE4tUTTQ+7mqUjQlvnXkOO6OlT9c/ZoJVHYoAaqGxr09CN53G7XIsO4KtWA==",
+ "dev": true,
+ "requires": {
+ "JSONStream": "^1.0.3",
+ "combine-source-map": "~0.8.0",
+ "defined": "^1.0.0",
+ "safe-buffer": "^5.1.1",
+ "through2": "^2.0.0",
+ "umd": "^3.0.0"
+ },
+ "dependencies": {
+ "through2": {
+ "version": "2.0.3",
+ "resolved": "https://registry.npmjs.org/through2/-/through2-2.0.3.tgz",
+ "integrity": "sha1-AARWmzfHx0ujnEPzzteNGtlBQL4=",
+ "dev": true,
+ "requires": {
+ "readable-stream": "^2.1.5",
+ "xtend": "~4.0.1"
+ }
+ }
+ }
+ },
+ "browser-resolve": {
+ "version": "1.11.3",
+ "resolved": "https://registry.npmjs.org/browser-resolve/-/browser-resolve-1.11.3.tgz",
+ "integrity": "sha512-exDi1BYWB/6raKHmDTCicQfTkqwN5fioMFV4j8BsfMU4R2DK/QfZfK7kOVkmWCNANf0snkBzqGqAJBao9gZMdQ==",
+ "dev": true,
+ "requires": {
+ "resolve": "1.1.7"
+ }
+ },
+ "browser-stdout": {
+ "version": "1.3.0",
+ "resolved": "https://registry.npmjs.org/browser-stdout/-/browser-stdout-1.3.0.tgz",
+ "integrity": "sha1-81HTKWnTL6XXpVZxVCY9korjvR8=",
+ "dev": true
+ },
+ "browserify": {
+ "version": "16.2.2",
+ "resolved": "https://registry.npmjs.org/browserify/-/browserify-16.2.2.tgz",
+ "integrity": "sha512-fMES05wq1Oukts6ksGUU2TMVHHp06LyQt0SIwbXIHm7waSrQmNBZePsU0iM/4f94zbvb/wHma+D1YrdzWYnF/A==",
+ "dev": true,
+ "requires": {
+ "JSONStream": "^1.0.3",
+ "assert": "^1.4.0",
+ "browser-pack": "^6.0.1",
+ "browser-resolve": "^1.11.0",
+ "browserify-zlib": "~0.2.0",
+ "buffer": "^5.0.2",
+ "cached-path-relative": "^1.0.0",
+ "concat-stream": "^1.6.0",
+ "console-browserify": "^1.1.0",
+ "constants-browserify": "~1.0.0",
+ "crypto-browserify": "^3.0.0",
+ "defined": "^1.0.0",
+ "deps-sort": "^2.0.0",
+ "domain-browser": "^1.2.0",
+ "duplexer2": "~0.1.2",
+ "events": "^2.0.0",
+ "glob": "^7.1.0",
+ "has": "^1.0.0",
+ "htmlescape": "^1.1.0",
+ "https-browserify": "^1.0.0",
+ "inherits": "~2.0.1",
+ "insert-module-globals": "^7.0.0",
+ "labeled-stream-splicer": "^2.0.0",
+ "mkdirp": "^0.5.0",
+ "module-deps": "^6.0.0",
+ "os-browserify": "~0.3.0",
+ "parents": "^1.0.1",
+ "path-browserify": "~0.0.0",
+ "process": "~0.11.0",
+ "punycode": "^1.3.2",
+ "querystring-es3": "~0.2.0",
+ "read-only-stream": "^2.0.0",
+ "readable-stream": "^2.0.2",
+ "resolve": "^1.1.4",
+ "shasum": "^1.0.0",
+ "shell-quote": "^1.6.1",
+ "stream-browserify": "^2.0.0",
+ "stream-http": "^2.0.0",
+ "string_decoder": "^1.1.1",
+ "subarg": "^1.0.0",
+ "syntax-error": "^1.1.1",
+ "through2": "^2.0.0",
+ "timers-browserify": "^1.0.1",
+ "tty-browserify": "0.0.1",
+ "url": "~0.11.0",
+ "util": "~0.10.1",
+ "vm-browserify": "^1.0.0",
+ "xtend": "^4.0.0"
+ },
+ "dependencies": {
+ "glob": {
+ "version": "7.1.2",
+ "resolved": "https://registry.npmjs.org/glob/-/glob-7.1.2.tgz",
+ "integrity": "sha512-MJTUg1kjuLeQCJ+ccE4Vpa6kKVXkPYJ2mOCQyUuKLcLQsdrMCpBPUi8qVE6+YuaJkozeA9NusTAw3hLr8Xe5EQ==",
+ "dev": true,
+ "requires": {
+ "fs.realpath": "^1.0.0",
+ "inflight": "^1.0.4",
+ "inherits": "2",
+ "minimatch": "^3.0.4",
+ "once": "^1.3.0",
+ "path-is-absolute": "^1.0.0"
+ }
+ },
+ "string_decoder": {
+ "version": "1.1.1",
+ "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-1.1.1.tgz",
+ "integrity": "sha512-n/ShnvDi6FHbbVfviro+WojiFzv+s8MPMHBczVePfUpDJLwoLT0ht1l4YwBCbi8pJAveEEdnkHyPyTP/mzRfwg==",
+ "dev": true,
+ "requires": {
+ "safe-buffer": "~5.1.0"
+ }
+ },
+ "through2": {
+ "version": "2.0.3",
+ "resolved": "https://registry.npmjs.org/through2/-/through2-2.0.3.tgz",
+ "integrity": "sha1-AARWmzfHx0ujnEPzzteNGtlBQL4=",
+ "dev": true,
+ "requires": {
+ "readable-stream": "^2.1.5",
+ "xtend": "~4.0.1"
+ }
+ }
+ }
+ },
+ "browserify-aes": {
+ "version": "1.2.0",
+ "resolved": "https://registry.npmjs.org/browserify-aes/-/browserify-aes-1.2.0.tgz",
+ "integrity": "sha512-+7CHXqGuspUn/Sl5aO7Ea0xWGAtETPXNSAjHo48JfLdPWcMng33Xe4znFvQweqc/uzk5zSOI3H52CYnjCfb5hA==",
+ "dev": true,
+ "requires": {
+ "buffer-xor": "^1.0.3",
+ "cipher-base": "^1.0.0",
+ "create-hash": "^1.1.0",
+ "evp_bytestokey": "^1.0.3",
+ "inherits": "^2.0.1",
+ "safe-buffer": "^5.0.1"
+ }
+ },
+ "browserify-cache-api": {
+ "version": "3.0.1",
+ "resolved": "https://registry.npmjs.org/browserify-cache-api/-/browserify-cache-api-3.0.1.tgz",
+ "integrity": "sha1-liR+hT8Gj9bg1FzHPwuyzZd47wI=",
+ "dev": true,
+ "requires": {
+ "async": "^1.5.2",
+ "through2": "^2.0.0",
+ "xtend": "^4.0.0"
+ },
+ "dependencies": {
+ "through2": {
+ "version": "2.0.3",
+ "resolved": "https://registry.npmjs.org/through2/-/through2-2.0.3.tgz",
+ "integrity": "sha1-AARWmzfHx0ujnEPzzteNGtlBQL4=",
+ "dev": true,
+ "requires": {
+ "readable-stream": "^2.1.5",
+ "xtend": "~4.0.1"
+ }
+ }
+ }
+ },
+ "browserify-cipher": {
+ "version": "1.0.1",
+ "resolved": "https://registry.npmjs.org/browserify-cipher/-/browserify-cipher-1.0.1.tgz",
+ "integrity": "sha512-sPhkz0ARKbf4rRQt2hTpAHqn47X3llLkUGn+xEJzLjwY8LRs2p0v7ljvI5EyoRO/mexrNunNECisZs+gw2zz1w==",
+ "dev": true,
+ "requires": {
+ "browserify-aes": "^1.0.4",
+ "browserify-des": "^1.0.0",
+ "evp_bytestokey": "^1.0.0"
+ }
+ },
+ "browserify-derequire": {
+ "version": "0.9.4",
+ "resolved": "https://registry.npmjs.org/browserify-derequire/-/browserify-derequire-0.9.4.tgz",
+ "integrity": "sha1-ZNYeVs/f8LjxdP2MV/i0Az4oeJU=",
+ "dev": true,
+ "requires": {
+ "derequire": "^2.0.0",
+ "through2": "^1.1.1"
+ }
+ },
+ "browserify-des": {
+ "version": "1.0.2",
+ "resolved": "https://registry.npmjs.org/browserify-des/-/browserify-des-1.0.2.tgz",
+ "integrity": "sha512-BioO1xf3hFwz4kc6iBhI3ieDFompMhrMlnDFC4/0/vd5MokpuAc3R+LYbwTA9A5Yc9pq9UYPqffKpW2ObuwX5A==",
+ "dev": true,
+ "requires": {
+ "cipher-base": "^1.0.1",
+ "des.js": "^1.0.0",
+ "inherits": "^2.0.1",
+ "safe-buffer": "^5.1.2"
+ },
+ "dependencies": {
+ "safe-buffer": {
+ "version": "5.1.2",
+ "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.1.2.tgz",
+ "integrity": "sha512-Gd2UZBJDkXlY7GbJxfsE8/nvKkUEU1G38c1siN6QP6a9PT9MmHB8GnpscSmMJSoF8LOIrt8ud/wPtojys4G6+g==",
+ "dev": true
+ }
+ }
+ },
+ "browserify-incremental": {
+ "version": "3.1.1",
+ "resolved": "https://registry.npmjs.org/browserify-incremental/-/browserify-incremental-3.1.1.tgz",
+ "integrity": "sha1-BxPLdYckemMqnwjPG9FpuHi2Koo=",
+ "dev": true,
+ "requires": {
+ "JSONStream": "^0.10.0",
+ "browserify-cache-api": "^3.0.0",
+ "through2": "^2.0.0",
+ "xtend": "^4.0.0"
+ },
+ "dependencies": {
+ "JSONStream": {
+ "version": "0.10.0",
+ "resolved": "https://registry.npmjs.org/JSONStream/-/JSONStream-0.10.0.tgz",
+ "integrity": "sha1-dDSdDYlSK3HzDwoD/5vSDKbxKsA=",
+ "dev": true,
+ "requires": {
+ "jsonparse": "0.0.5",
+ "through": ">=2.2.7 <3"
+ }
+ },
+ "jsonparse": {
+ "version": "0.0.5",
+ "resolved": "https://registry.npmjs.org/jsonparse/-/jsonparse-0.0.5.tgz",
+ "integrity": "sha1-MwVCrT8KZUZlt3jz6y2an6UHrGQ=",
+ "dev": true
+ },
+ "through2": {
+ "version": "2.0.3",
+ "resolved": "https://registry.npmjs.org/through2/-/through2-2.0.3.tgz",
+ "integrity": "sha1-AARWmzfHx0ujnEPzzteNGtlBQL4=",
+ "dev": true,
+ "requires": {
+ "readable-stream": "^2.1.5",
+ "xtend": "~4.0.1"
+ }
+ }
+ }
+ },
+ "browserify-rsa": {
+ "version": "4.0.1",
+ "resolved": "https://registry.npmjs.org/browserify-rsa/-/browserify-rsa-4.0.1.tgz",
+ "integrity": "sha1-IeCr+vbyApzy+vsTNWenAdQTVSQ=",
+ "dev": true,
+ "requires": {
+ "bn.js": "^4.1.0",
+ "randombytes": "^2.0.1"
+ }
+ },
+ "browserify-sign": {
+ "version": "4.0.4",
+ "resolved": "https://registry.npmjs.org/browserify-sign/-/browserify-sign-4.0.4.tgz",
+ "integrity": "sha1-qk62jl17ZYuqa/alfmMMvXqT0pg=",
+ "dev": true,
+ "requires": {
+ "bn.js": "^4.1.1",
+ "browserify-rsa": "^4.0.0",
+ "create-hash": "^1.1.0",
+ "create-hmac": "^1.1.2",
+ "elliptic": "^6.0.0",
+ "inherits": "^2.0.1",
+ "parse-asn1": "^5.0.0"
+ },
+ "dependencies": {
+ "elliptic": {
+ "version": "6.4.0",
+ "resolved": "https://registry.npmjs.org/elliptic/-/elliptic-6.4.0.tgz",
+ "integrity": "sha1-ysmvh2LIWDYYcAPI3+GT5eLq5d8=",
+ "dev": true,
+ "requires": {
+ "bn.js": "^4.4.0",
+ "brorand": "^1.0.1",
+ "hash.js": "^1.0.0",
+ "hmac-drbg": "^1.0.0",
+ "inherits": "^2.0.1",
+ "minimalistic-assert": "^1.0.0",
+ "minimalistic-crypto-utils": "^1.0.0"
+ }
+ }
+ }
+ },
+ "browserify-zlib": {
+ "version": "0.2.0",
+ "resolved": "https://registry.npmjs.org/browserify-zlib/-/browserify-zlib-0.2.0.tgz",
+ "integrity": "sha512-Z942RysHXmJrhqk88FmKBVq/v5tqmSkDz7p54G/MGyjMnCFFnC79XWNbg+Vta8W6Wb2qtSZTSxIGkJrRpCFEiA==",
+ "dev": true,
+ "requires": {
+ "pako": "~1.0.5"
+ }
+ },
+ "browserslist": {
+ "version": "3.2.8",
+ "resolved": "https://registry.npmjs.org/browserslist/-/browserslist-3.2.8.tgz",
+ "integrity": "sha512-WHVocJYavUwVgVViC0ORikPHQquXwVh939TaelZ4WDqpWgTX/FsGhl/+P4qBUAGcRvtOgDgC+xftNWWp2RUTAQ==",
+ "dev": true,
+ "requires": {
+ "caniuse-lite": "^1.0.30000844",
+ "electron-to-chromium": "^1.3.47"
+ }
+ },
+ "buffer": {
+ "version": "5.0.8",
+ "resolved": "https://registry.npmjs.org/buffer/-/buffer-5.0.8.tgz",
+ "integrity": "sha512-xXvjQhVNz50v2nPeoOsNqWCLGfiv4ji/gXZM28jnVwdLJxH4mFyqgqCKfaK9zf1KUbG6zTkjLOy7ou+jSMarGA==",
+ "dev": true,
+ "requires": {
+ "base64-js": "^1.0.2",
+ "ieee754": "^1.1.4"
+ }
+ },
+ "buffer-from": {
+ "version": "1.1.0",
+ "resolved": "https://registry.npmjs.org/buffer-from/-/buffer-from-1.1.0.tgz",
+ "integrity": "sha512-c5mRlguI/Pe2dSZmpER62rSCu0ryKmWddzRYsuXc50U2/g8jMOulc31VZMa4mYx31U5xsmSOpDCgH88Vl9cDGQ==",
+ "dev": true
+ },
+ "buffer-xor": {
+ "version": "1.0.3",
+ "resolved": "https://registry.npmjs.org/buffer-xor/-/buffer-xor-1.0.3.tgz",
+ "integrity": "sha1-JuYe0UIvtw3ULm42cp7VHYVf6Nk=",
+ "dev": true
+ },
+ "builtin-modules": {
+ "version": "1.1.1",
+ "resolved": "https://registry.npmjs.org/builtin-modules/-/builtin-modules-1.1.1.tgz",
+ "integrity": "sha1-Jw8HbFpywC9bZaR9+Uxf46J4iS8=",
+ "dev": true
+ },
+ "builtin-status-codes": {
+ "version": "3.0.0",
+ "resolved": "https://registry.npmjs.org/builtin-status-codes/-/builtin-status-codes-3.0.0.tgz",
+ "integrity": "sha1-hZgoeOIbmOHGZCXgPQF0eI9Wnug=",
+ "dev": true
+ },
+ "bytes": {
+ "version": "1.0.0",
+ "resolved": "https://registry.npmjs.org/bytes/-/bytes-1.0.0.tgz",
+ "integrity": "sha1-NWnt6Lo0MV+rmcPpLLBMciDeH6g=",
+ "dev": true
+ },
+ "cache-base": {
+ "version": "1.0.1",
+ "resolved": "https://registry.npmjs.org/cache-base/-/cache-base-1.0.1.tgz",
+ "integrity": "sha512-AKcdTnFSWATd5/GCPRxr2ChwIJ85CeyrEyjRHlKxQ56d4XJMGym0uAiKn0xbLOGOl3+yRpOTi484dVCEc5AUzQ==",
+ "dev": true,
+ "requires": {
+ "collection-visit": "^1.0.0",
+ "component-emitter": "^1.2.1",
+ "get-value": "^2.0.6",
+ "has-value": "^1.0.0",
+ "isobject": "^3.0.1",
+ "set-value": "^2.0.0",
+ "to-object-path": "^0.3.0",
+ "union-value": "^1.0.0",
+ "unset-value": "^1.0.0"
+ },
+ "dependencies": {
+ "isobject": {
+ "version": "3.0.1",
+ "resolved": "https://registry.npmjs.org/isobject/-/isobject-3.0.1.tgz",
+ "integrity": "sha1-TkMekrEalzFjaqH5yNHMvP2reN8=",
+ "dev": true
+ }
+ }
+ },
+ "cached-path-relative": {
+ "version": "1.0.2",
+ "resolved": "https://registry.npmjs.org/cached-path-relative/-/cached-path-relative-1.0.2.tgz",
+ "integrity": "sha512-5r2GqsoEb4qMTTN9J+WzXfjov+hjxT+j3u5K+kIVNIwAd99DLCJE9pBIMP1qVeybV6JiijL385Oz0DcYxfbOIg==",
+ "dev": true
+ },
+ "caching-transform": {
+ "version": "3.0.2",
+ "resolved": "https://registry.npmjs.org/caching-transform/-/caching-transform-3.0.2.tgz",
+ "integrity": "sha512-Mtgcv3lh3U0zRii/6qVgQODdPA4G3zhG+jtbCWj39RXuUFTMzH0vcdMtaJS1jPowd+It2Pqr6y3NJMQqOqCE2w==",
+ "dev": true,
+ "requires": {
+ "hasha": "^3.0.0",
+ "make-dir": "^2.0.0",
+ "package-hash": "^3.0.0",
+ "write-file-atomic": "^2.4.2"
+ },
+ "dependencies": {
+ "write-file-atomic": {
+ "version": "2.4.3",
+ "resolved": "https://registry.npmjs.org/write-file-atomic/-/write-file-atomic-2.4.3.tgz",
+ "integrity": "sha512-GaETH5wwsX+GcnzhPgKcKjJ6M2Cq3/iZp1WyY/X1CSqrW+jVNM9Y7D8EC2sM4ZG/V8wZlSniJnCKWPmBYAucRQ==",
+ "dev": true,
+ "requires": {
+ "graceful-fs": "^4.1.11",
+ "imurmurhash": "^0.1.4",
+ "signal-exit": "^3.0.2"
+ }
+ }
+ }
+ },
+ "caller-path": {
+ "version": "0.1.0",
+ "resolved": "https://registry.npmjs.org/caller-path/-/caller-path-0.1.0.tgz",
+ "integrity": "sha1-lAhe9jWB7NPaqSREqP6U6CV3dR8=",
+ "dev": true,
+ "requires": {
+ "callsites": "^0.2.0"
+ }
+ },
+ "callsites": {
+ "version": "0.2.0",
+ "resolved": "https://registry.npmjs.org/callsites/-/callsites-0.2.0.tgz",
+ "integrity": "sha1-r6uWJikQp/M8GaV3WCXGnzTjUMo=",
+ "dev": true
+ },
+ "camelcase": {
+ "version": "3.0.0",
+ "resolved": "https://registry.npmjs.org/camelcase/-/camelcase-3.0.0.tgz",
+ "integrity": "sha1-MvxLn82vhF/N9+c7uXysImHwqwo=",
+ "dev": true
+ },
+ "camelcase-keys": {
+ "version": "2.1.0",
+ "resolved": "https://registry.npmjs.org/camelcase-keys/-/camelcase-keys-2.1.0.tgz",
+ "integrity": "sha1-MIvur/3ygRkFHvodkyITyRuPkuc=",
+ "dev": true,
+ "requires": {
+ "camelcase": "^2.0.0",
+ "map-obj": "^1.0.0"
+ },
+ "dependencies": {
+ "camelcase": {
+ "version": "2.1.1",
+ "resolved": "https://registry.npmjs.org/camelcase/-/camelcase-2.1.1.tgz",
+ "integrity": "sha1-fB0W1nmhu+WcoCys7PsBHiAfWh8=",
+ "dev": true
+ }
+ }
+ },
+ "caniuse-lite": {
+ "version": "1.0.30000865",
+ "resolved": "https://registry.npmjs.org/caniuse-lite/-/caniuse-lite-1.0.30000865.tgz",
+ "integrity": "sha512-vs79o1mOSKRGv/1pSkp4EXgl4ZviWeYReXw60XfacPU64uQWZwJT6vZNmxRF9O+6zu71sJwMxLK5JXxbzuVrLw==",
+ "dev": true
+ },
+ "catharsis": {
+ "version": "0.8.9",
+ "resolved": "https://registry.npmjs.org/catharsis/-/catharsis-0.8.9.tgz",
+ "integrity": "sha1-mMyJDKZS3S7w5ws3klMQ/56Q/Is=",
+ "dev": true,
+ "requires": {
+ "underscore-contrib": "~0.3.0"
+ }
+ },
+ "chai": {
+ "version": "4.1.2",
+ "resolved": "https://registry.npmjs.org/chai/-/chai-4.1.2.tgz",
+ "integrity": "sha1-D2RYS6ZC8PKs4oBiefTwbKI61zw=",
+ "dev": true,
+ "requires": {
+ "assertion-error": "^1.0.1",
+ "check-error": "^1.0.1",
+ "deep-eql": "^3.0.0",
+ "get-func-name": "^2.0.0",
+ "pathval": "^1.0.0",
+ "type-detect": "^4.0.0"
+ }
+ },
+ "chai-as-promised": {
+ "version": "7.1.1",
+ "resolved": "https://registry.npmjs.org/chai-as-promised/-/chai-as-promised-7.1.1.tgz",
+ "integrity": "sha512-azL6xMoi+uxu6z4rhWQ1jbdUhOMhis2PvscD/xjLqNMkv3BPPp2JyyuTHOrf9BOosGpNQ11v6BKv/g57RXbiaA==",
+ "dev": true,
+ "requires": {
+ "check-error": "^1.0.2"
+ }
+ },
+ "chalk": {
+ "version": "1.1.3",
+ "resolved": "https://registry.npmjs.org/chalk/-/chalk-1.1.3.tgz",
+ "integrity": "sha1-qBFcVeSnAv5NFQq9OHKCKn4J/Jg=",
+ "dev": true,
+ "requires": {
+ "ansi-styles": "^2.2.1",
+ "escape-string-regexp": "^1.0.2",
+ "has-ansi": "^2.0.0",
+ "strip-ansi": "^3.0.0",
+ "supports-color": "^2.0.0"
+ }
+ },
+ "chardet": {
+ "version": "0.4.2",
+ "resolved": "https://registry.npmjs.org/chardet/-/chardet-0.4.2.tgz",
+ "integrity": "sha1-tUc7M9yXxCTl2Y3IfVXU2KKci/I=",
+ "dev": true
+ },
+ "check-error": {
+ "version": "1.0.2",
+ "resolved": "https://registry.npmjs.org/check-error/-/check-error-1.0.2.tgz",
+ "integrity": "sha1-V00xLt2Iu13YkS6Sht1sCu1KrII=",
+ "dev": true
+ },
+ "cipher-base": {
+ "version": "1.0.4",
+ "resolved": "https://registry.npmjs.org/cipher-base/-/cipher-base-1.0.4.tgz",
+ "integrity": "sha512-Kkht5ye6ZGmwv40uUDZztayT2ThLQGfnj/T71N/XzeZeo3nf8foyW7zGTsPYkEya3m5f3cAypH+qe7YOrM1U2Q==",
+ "dev": true,
+ "requires": {
+ "inherits": "^2.0.1",
+ "safe-buffer": "^5.0.1"
+ }
+ },
+ "circular-json": {
+ "version": "0.3.3",
+ "resolved": "https://registry.npmjs.org/circular-json/-/circular-json-0.3.3.tgz",
+ "integrity": "sha512-UZK3NBx2Mca+b5LsG7bY183pHWt5Y1xts4P3Pz7ENTwGVnJOUWbRb3ocjvX7hx9tq/yTAdclXm9sZ38gNuem4A==",
+ "dev": true
+ },
+ "class-utils": {
+ "version": "0.3.6",
+ "resolved": "https://registry.npmjs.org/class-utils/-/class-utils-0.3.6.tgz",
+ "integrity": "sha512-qOhPa/Fj7s6TY8H8esGu5QNpMMQxz79h+urzrNYN6mn+9BnxlDGf5QZ+XeCDsxSjPqsSR56XOZOJmpeurnLMeg==",
+ "dev": true,
+ "requires": {
+ "arr-union": "^3.1.0",
+ "define-property": "^0.2.5",
+ "isobject": "^3.0.0",
+ "static-extend": "^0.1.1"
+ },
+ "dependencies": {
+ "define-property": {
+ "version": "0.2.5",
+ "resolved": "https://registry.npmjs.org/define-property/-/define-property-0.2.5.tgz",
+ "integrity": "sha1-w1se+RjsPJkPmlvFe+BKrOxcgRY=",
+ "dev": true,
+ "requires": {
+ "is-descriptor": "^0.1.0"
+ }
+ },
+ "isobject": {
+ "version": "3.0.1",
+ "resolved": "https://registry.npmjs.org/isobject/-/isobject-3.0.1.tgz",
+ "integrity": "sha1-TkMekrEalzFjaqH5yNHMvP2reN8=",
+ "dev": true
+ }
+ }
+ },
+ "cli-cursor": {
+ "version": "2.1.0",
+ "resolved": "https://registry.npmjs.org/cli-cursor/-/cli-cursor-2.1.0.tgz",
+ "integrity": "sha1-s12sN2R5+sw+lHR9QdDQ9SOP/LU=",
+ "dev": true,
+ "requires": {
+ "restore-cursor": "^2.0.0"
+ }
+ },
+ "cli-width": {
+ "version": "2.2.0",
+ "resolved": "https://registry.npmjs.org/cli-width/-/cli-width-2.2.0.tgz",
+ "integrity": "sha1-/xnt6Kml5XkyQUewwR8PvLq+1jk=",
+ "dev": true
+ },
+ "cliui": {
+ "version": "3.2.0",
+ "resolved": "https://registry.npmjs.org/cliui/-/cliui-3.2.0.tgz",
+ "integrity": "sha1-EgYBU3qRbSmUD5NNo7SNWFo5IT0=",
+ "dev": true,
+ "requires": {
+ "string-width": "^1.0.1",
+ "strip-ansi": "^3.0.1",
+ "wrap-ansi": "^2.0.0"
+ }
+ },
+ "co": {
+ "version": "4.6.0",
+ "resolved": "https://registry.npmjs.org/co/-/co-4.6.0.tgz",
+ "integrity": "sha1-bqa989hTrlTMuOR7+gvz+QMfsYQ=",
+ "dev": true
+ },
+ "code-point-at": {
+ "version": "1.1.0",
+ "resolved": "https://registry.npmjs.org/code-point-at/-/code-point-at-1.1.0.tgz",
+ "integrity": "sha1-DQcLTQQ6W+ozovGkDi7bPZpMz3c=",
+ "dev": true
+ },
+ "coffeescript": {
+ "version": "1.10.0",
+ "resolved": "https://registry.npmjs.org/coffeescript/-/coffeescript-1.10.0.tgz",
+ "integrity": "sha1-56qDAZF+9iGzXYo580jc3R234z4=",
+ "dev": true
+ },
+ "collection-visit": {
+ "version": "1.0.0",
+ "resolved": "https://registry.npmjs.org/collection-visit/-/collection-visit-1.0.0.tgz",
+ "integrity": "sha1-S8A3PBZLwykbTTaMgpzxqApZ3KA=",
+ "dev": true,
+ "requires": {
+ "map-visit": "^1.0.0",
+ "object-visit": "^1.0.0"
+ }
+ },
+ "color-convert": {
+ "version": "1.9.1",
+ "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-1.9.1.tgz",
+ "integrity": "sha512-mjGanIiwQJskCC18rPR6OmrZ6fm2Lc7PeGFYwCmy5J34wC6F1PzdGL6xeMfmgicfYcNLGuVFA3WzXtIDCQSZxQ==",
+ "dev": true,
+ "requires": {
+ "color-name": "^1.1.1"
+ }
+ },
+ "color-name": {
+ "version": "1.1.3",
+ "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.3.tgz",
+ "integrity": "sha1-p9BVi9icQveV3UIyj3QIMcpTvCU=",
+ "dev": true
+ },
+ "colors": {
+ "version": "1.1.2",
+ "resolved": "https://registry.npmjs.org/colors/-/colors-1.1.2.tgz",
+ "integrity": "sha1-FopHAXVran9RoSzgyXv6KMCE7WM=",
+ "dev": true
+ },
+ "combine-source-map": {
+ "version": "0.8.0",
+ "resolved": "https://registry.npmjs.org/combine-source-map/-/combine-source-map-0.8.0.tgz",
+ "integrity": "sha1-pY0N8ELBhvz4IqjoAV9UUNLXmos=",
+ "dev": true,
+ "requires": {
+ "convert-source-map": "~1.1.0",
+ "inline-source-map": "~0.6.0",
+ "lodash.memoize": "~3.0.3",
+ "source-map": "~0.5.3"
+ },
+ "dependencies": {
+ "convert-source-map": {
+ "version": "1.1.3",
+ "resolved": "https://registry.npmjs.org/convert-source-map/-/convert-source-map-1.1.3.tgz",
+ "integrity": "sha1-SCnId+n+SbMWHzvzZziI4gRpmGA=",
+ "dev": true
+ }
+ }
+ },
+ "commander": {
+ "version": "2.12.2",
+ "resolved": "https://registry.npmjs.org/commander/-/commander-2.12.2.tgz",
+ "integrity": "sha512-BFnaq5ZOGcDN7FlrtBT4xxkgIToalIIxwjxLWVJ8bGTpe1LroqMiqQXdA7ygc7CRvaYS+9zfPGFnJqFSayx+AA==",
+ "dev": true
+ },
+ "commondir": {
+ "version": "1.0.1",
+ "resolved": "https://registry.npmjs.org/commondir/-/commondir-1.0.1.tgz",
+ "integrity": "sha1-3dgA2gxmEnOTzKWVDqloo6rxJTs=",
+ "dev": true
+ },
+ "component-emitter": {
+ "version": "1.3.0",
+ "resolved": "https://registry.npmjs.org/component-emitter/-/component-emitter-1.3.0.tgz",
+ "integrity": "sha512-Rd3se6QB+sO1TwqZjscQrurpEPIfO0/yYnSin6Q/rD3mOutHvUrCAhJub3r90uNb+SESBuE0QYoB90YdfatsRg==",
+ "dev": true
+ },
+ "concat-map": {
+ "version": "0.0.1",
+ "resolved": "https://registry.npmjs.org/concat-map/-/concat-map-0.0.1.tgz",
+ "integrity": "sha1-2Klr13/Wjfd5OnMDajug1UBdR3s=",
+ "dev": true
+ },
+ "concat-stream": {
+ "version": "1.6.0",
+ "resolved": "https://registry.npmjs.org/concat-stream/-/concat-stream-1.6.0.tgz",
+ "integrity": "sha1-CqxmL9Ur54lk1VMvaUeE5wEQrPc=",
+ "dev": true,
+ "requires": {
+ "inherits": "^2.0.3",
+ "readable-stream": "^2.2.2",
+ "typedarray": "^0.0.6"
+ }
+ },
+ "config-chain": {
+ "version": "1.1.11",
+ "resolved": "https://registry.npmjs.org/config-chain/-/config-chain-1.1.11.tgz",
+ "integrity": "sha1-q6CXR9++TD5w52am5BWG4YWfxvI=",
+ "dev": true,
+ "requires": {
+ "ini": "^1.3.4",
+ "proto-list": "~1.2.1"
+ }
+ },
+ "connect": {
+ "version": "3.6.5",
+ "resolved": "https://registry.npmjs.org/connect/-/connect-3.6.5.tgz",
+ "integrity": "sha1-+43ee6B2OHfQ7J352sC0tA5yx9o=",
+ "dev": true,
+ "requires": {
+ "debug": "2.6.9",
+ "finalhandler": "1.0.6",
+ "parseurl": "~1.3.2",
+ "utils-merge": "1.0.1"
+ }
+ },
+ "connect-livereload": {
+ "version": "0.5.4",
+ "resolved": "https://registry.npmjs.org/connect-livereload/-/connect-livereload-0.5.4.tgz",
+ "integrity": "sha1-gBV9E3HJ83zBQDmrGJWXDRGdw7w=",
+ "dev": true
+ },
+ "console-browserify": {
+ "version": "1.1.0",
+ "resolved": "https://registry.npmjs.org/console-browserify/-/console-browserify-1.1.0.tgz",
+ "integrity": "sha1-8CQcRXMKn8YyOyBtvzjtx0HQuxA=",
+ "dev": true,
+ "requires": {
+ "date-now": "^0.1.4"
+ }
+ },
+ "constants-browserify": {
+ "version": "1.0.0",
+ "resolved": "https://registry.npmjs.org/constants-browserify/-/constants-browserify-1.0.0.tgz",
+ "integrity": "sha1-wguW2MYXdIqvHBYCF2DNJ/y4y3U=",
+ "dev": true
+ },
+ "contains-path": {
+ "version": "0.1.0",
+ "resolved": "https://registry.npmjs.org/contains-path/-/contains-path-0.1.0.tgz",
+ "integrity": "sha1-/ozxhP9mcLa67wGp1IYaXL7EEgo=",
+ "dev": true
+ },
+ "continuable-cache": {
+ "version": "0.3.1",
+ "resolved": "https://registry.npmjs.org/continuable-cache/-/continuable-cache-0.3.1.tgz",
+ "integrity": "sha1-vXJ6f67XfnH/OYWskzUakSczrQ8=",
+ "dev": true
+ },
+ "convert-source-map": {
+ "version": "1.5.1",
+ "resolved": "https://registry.npmjs.org/convert-source-map/-/convert-source-map-1.5.1.tgz",
+ "integrity": "sha1-uCeAl7m8IpNl3lxiz1/K7YtVmeU=",
+ "dev": true
+ },
+ "copy-descriptor": {
+ "version": "0.1.1",
+ "resolved": "https://registry.npmjs.org/copy-descriptor/-/copy-descriptor-0.1.1.tgz",
+ "integrity": "sha1-Z29us8OZl8LuGsOpJP1hJHSPV40=",
+ "dev": true
+ },
+ "core-js": {
+ "version": "2.5.3",
+ "resolved": "https://registry.npmjs.org/core-js/-/core-js-2.5.3.tgz",
+ "integrity": "sha1-isw4NFgk8W2DZbfJtCWRaOjtYD4=",
+ "dev": true
+ },
+ "core-util-is": {
+ "version": "1.0.2",
+ "resolved": "https://registry.npmjs.org/core-util-is/-/core-util-is-1.0.2.tgz",
+ "integrity": "sha1-tf1UIgqivFq1eqtxQMlAdUUDwac=",
+ "dev": true
+ },
+ "cp-file": {
+ "version": "6.2.0",
+ "resolved": "https://registry.npmjs.org/cp-file/-/cp-file-6.2.0.tgz",
+ "integrity": "sha512-fmvV4caBnofhPe8kOcitBwSn2f39QLjnAnGq3gO9dfd75mUytzKNZB1hde6QHunW2Rt+OwuBOMc3i1tNElbszA==",
+ "dev": true,
+ "requires": {
+ "graceful-fs": "^4.1.2",
+ "make-dir": "^2.0.0",
+ "nested-error-stacks": "^2.0.0",
+ "pify": "^4.0.1",
+ "safe-buffer": "^5.0.1"
+ },
+ "dependencies": {
+ "pify": {
+ "version": "4.0.1",
+ "resolved": "https://registry.npmjs.org/pify/-/pify-4.0.1.tgz",
+ "integrity": "sha512-uB80kBFb/tfd68bVleG9T5GGsGPjJrLAUpR5PZIrhBnIaRTQRjqdJSsIKkOP6OAIFbj7GOrcudc5pNjZ+geV2g==",
+ "dev": true
+ }
+ }
+ },
+ "create-ecdh": {
+ "version": "4.0.3",
+ "resolved": "https://registry.npmjs.org/create-ecdh/-/create-ecdh-4.0.3.tgz",
+ "integrity": "sha512-GbEHQPMOswGpKXM9kCWVrremUcBmjteUaQ01T9rkKCPDXfUHX0IoP9LpHYo2NPFampa4e+/pFDc3jQdxrxQLaw==",
+ "dev": true,
+ "requires": {
+ "bn.js": "^4.1.0",
+ "elliptic": "^6.0.0"
+ },
+ "dependencies": {
+ "elliptic": {
+ "version": "6.4.0",
+ "resolved": "https://registry.npmjs.org/elliptic/-/elliptic-6.4.0.tgz",
+ "integrity": "sha1-ysmvh2LIWDYYcAPI3+GT5eLq5d8=",
+ "dev": true,
+ "requires": {
+ "bn.js": "^4.4.0",
+ "brorand": "^1.0.1",
+ "hash.js": "^1.0.0",
+ "hmac-drbg": "^1.0.0",
+ "inherits": "^2.0.1",
+ "minimalistic-assert": "^1.0.0",
+ "minimalistic-crypto-utils": "^1.0.0"
+ }
+ }
+ }
+ },
+ "create-hash": {
+ "version": "1.2.0",
+ "resolved": "https://registry.npmjs.org/create-hash/-/create-hash-1.2.0.tgz",
+ "integrity": "sha512-z00bCGNHDG8mHAkP7CtT1qVu+bFQUPjYq/4Iv3C3kWjTFV10zIjfSoeqXo9Asws8gwSHDGj/hl2u4OGIjapeCg==",
+ "dev": true,
+ "requires": {
+ "cipher-base": "^1.0.1",
+ "inherits": "^2.0.1",
+ "md5.js": "^1.3.4",
+ "ripemd160": "^2.0.1",
+ "sha.js": "^2.4.0"
+ }
+ },
+ "create-hmac": {
+ "version": "1.1.7",
+ "resolved": "https://registry.npmjs.org/create-hmac/-/create-hmac-1.1.7.tgz",
+ "integrity": "sha512-MJG9liiZ+ogc4TzUwuvbER1JRdgvUFSB5+VR/g5h82fGaIRWMWddtKBHi7/sVhfjQZ6SehlyhvQYrcYkaUIpLg==",
+ "dev": true,
+ "requires": {
+ "cipher-base": "^1.0.3",
+ "create-hash": "^1.1.0",
+ "inherits": "^2.0.1",
+ "ripemd160": "^2.0.0",
+ "safe-buffer": "^5.0.1",
+ "sha.js": "^2.4.8"
+ }
+ },
+ "cross-spawn": {
+ "version": "5.1.0",
+ "resolved": "https://registry.npmjs.org/cross-spawn/-/cross-spawn-5.1.0.tgz",
+ "integrity": "sha1-6L0O/uWPz/b4+UUQoKVUu/ojVEk=",
+ "dev": true,
+ "requires": {
+ "lru-cache": "^4.0.1",
+ "shebang-command": "^1.2.0",
+ "which": "^1.2.9"
+ },
+ "dependencies": {
+ "lru-cache": {
+ "version": "4.1.1",
+ "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-4.1.1.tgz",
+ "integrity": "sha512-q4spe4KTfsAS1SUHLO0wz8Qiyf1+vMIAgpRYioFYDMNqKfHQbg+AVDH3i4fvpl71/P1L0dBl+fQi+P37UYf0ew==",
+ "dev": true,
+ "requires": {
+ "pseudomap": "^1.0.2",
+ "yallist": "^2.1.2"
+ }
+ }
+ }
+ },
+ "crypto-browserify": {
+ "version": "3.12.0",
+ "resolved": "https://registry.npmjs.org/crypto-browserify/-/crypto-browserify-3.12.0.tgz",
+ "integrity": "sha512-fz4spIh+znjO2VjL+IdhEpRJ3YN6sMzITSBijk6FK2UvTqruSQW+/cCZTSNsMiZNvUeq0CqurF+dAbyiGOY6Wg==",
+ "dev": true,
+ "requires": {
+ "browserify-cipher": "^1.0.0",
+ "browserify-sign": "^4.0.0",
+ "create-ecdh": "^4.0.0",
+ "create-hash": "^1.1.0",
+ "create-hmac": "^1.1.0",
+ "diffie-hellman": "^5.0.0",
+ "inherits": "^2.0.1",
+ "pbkdf2": "^3.0.3",
+ "public-encrypt": "^4.0.0",
+ "randombytes": "^2.0.0",
+ "randomfill": "^1.0.3"
+ }
+ },
+ "currently-unhandled": {
+ "version": "0.4.1",
+ "resolved": "https://registry.npmjs.org/currently-unhandled/-/currently-unhandled-0.4.1.tgz",
+ "integrity": "sha1-mI3zP+qxke95mmE2nddsF635V+o=",
+ "dev": true,
+ "requires": {
+ "array-find-index": "^1.0.1"
+ }
+ },
+ "d": {
+ "version": "1.0.0",
+ "resolved": "https://registry.npmjs.org/d/-/d-1.0.0.tgz",
+ "integrity": "sha1-dUu1v+VUUdpppYuU1F9MWwRi1Y8=",
+ "dev": true,
+ "requires": {
+ "es5-ext": "^0.10.9"
+ }
+ },
+ "date-now": {
+ "version": "0.1.4",
+ "resolved": "https://registry.npmjs.org/date-now/-/date-now-0.1.4.tgz",
+ "integrity": "sha1-6vQ5/U1ISK105cx9vvIAZyueNFs=",
+ "dev": true
+ },
+ "dateformat": {
+ "version": "1.0.12",
+ "resolved": "https://registry.npmjs.org/dateformat/-/dateformat-1.0.12.tgz",
+ "integrity": "sha1-nxJLZ1lMk3/3BpMuSmQsyo27/uk=",
+ "dev": true,
+ "requires": {
+ "get-stdin": "^4.0.1",
+ "meow": "^3.3.0"
+ }
+ },
+ "debug": {
+ "version": "2.6.9",
+ "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz",
+ "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==",
+ "dev": true,
+ "requires": {
+ "ms": "2.0.0"
+ }
+ },
+ "decamelize": {
+ "version": "1.2.0",
+ "resolved": "https://registry.npmjs.org/decamelize/-/decamelize-1.2.0.tgz",
+ "integrity": "sha1-9lNNFRSCabIDUue+4m9QH5oZEpA=",
+ "dev": true
+ },
+ "decode-uri-component": {
+ "version": "0.2.0",
+ "resolved": "https://registry.npmjs.org/decode-uri-component/-/decode-uri-component-0.2.0.tgz",
+ "integrity": "sha1-6zkTMzRYd1y4TNGh+uBiEGu4dUU=",
+ "dev": true
+ },
+ "deep-eql": {
+ "version": "3.0.1",
+ "resolved": "https://registry.npmjs.org/deep-eql/-/deep-eql-3.0.1.tgz",
+ "integrity": "sha512-+QeIQyN5ZuO+3Uk5DYh6/1eKO0m0YmJFGNmFHGACpf1ClL1nmlV/p4gNgbl2pJGxgXb4faqo6UE+M5ACEMyVcw==",
+ "dev": true,
+ "requires": {
+ "type-detect": "^4.0.0"
+ }
+ },
+ "deep-is": {
+ "version": "0.1.3",
+ "resolved": "https://registry.npmjs.org/deep-is/-/deep-is-0.1.3.tgz",
+ "integrity": "sha1-s2nW+128E+7PUk+RsHD+7cNXzzQ=",
+ "dev": true
+ },
+ "default-require-extensions": {
+ "version": "2.0.0",
+ "resolved": "https://registry.npmjs.org/default-require-extensions/-/default-require-extensions-2.0.0.tgz",
+ "integrity": "sha1-9fj7sYp9bVCyH2QfZJ67Uiz+JPc=",
+ "dev": true,
+ "requires": {
+ "strip-bom": "^3.0.0"
+ },
+ "dependencies": {
+ "strip-bom": {
+ "version": "3.0.0",
+ "resolved": "https://registry.npmjs.org/strip-bom/-/strip-bom-3.0.0.tgz",
+ "integrity": "sha1-IzTBjpx1n3vdVv3vfprj1YjmjtM=",
+ "dev": true
+ }
+ }
+ },
+ "define-property": {
+ "version": "2.0.2",
+ "resolved": "https://registry.npmjs.org/define-property/-/define-property-2.0.2.tgz",
+ "integrity": "sha512-jwK2UV4cnPpbcG7+VRARKTZPUWowwXA8bzH5NP6ud0oeAxyYPuGZUAC7hMugpCdz4BeSZl2Dl9k66CHJ/46ZYQ==",
+ "dev": true,
+ "requires": {
+ "is-descriptor": "^1.0.2",
+ "isobject": "^3.0.1"
+ },
+ "dependencies": {
+ "is-accessor-descriptor": {
+ "version": "1.0.0",
+ "resolved": "https://registry.npmjs.org/is-accessor-descriptor/-/is-accessor-descriptor-1.0.0.tgz",
+ "integrity": "sha512-m5hnHTkcVsPfqx3AKlyttIPb7J+XykHvJP2B9bZDjlhLIoEq4XoK64Vg7boZlVWYK6LUY94dYPEE7Lh0ZkZKcQ==",
+ "dev": true,
+ "requires": {
+ "kind-of": "^6.0.0"
+ }
+ },
+ "is-data-descriptor": {
+ "version": "1.0.0",
+ "resolved": "https://registry.npmjs.org/is-data-descriptor/-/is-data-descriptor-1.0.0.tgz",
+ "integrity": "sha512-jbRXy1FmtAoCjQkVmIVYwuuqDFUbaOeDjmed1tOGPrsMhtJA4rD9tkgA0F1qJ3gRFRXcHYVkdeaP50Q5rE/jLQ==",
+ "dev": true,
+ "requires": {
+ "kind-of": "^6.0.0"
+ }
+ },
+ "is-descriptor": {
+ "version": "1.0.2",
+ "resolved": "https://registry.npmjs.org/is-descriptor/-/is-descriptor-1.0.2.tgz",
+ "integrity": "sha512-2eis5WqQGV7peooDyLmNEPUrps9+SXX5c9pL3xEB+4e9HnGuDa7mB7kHxHw4CbqS9k1T2hOH3miL8n8WtiYVtg==",
+ "dev": true,
+ "requires": {
+ "is-accessor-descriptor": "^1.0.0",
+ "is-data-descriptor": "^1.0.0",
+ "kind-of": "^6.0.2"
+ }
+ },
+ "isobject": {
+ "version": "3.0.1",
+ "resolved": "https://registry.npmjs.org/isobject/-/isobject-3.0.1.tgz",
+ "integrity": "sha1-TkMekrEalzFjaqH5yNHMvP2reN8=",
+ "dev": true
+ },
+ "kind-of": {
+ "version": "6.0.3",
+ "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-6.0.3.tgz",
+ "integrity": "sha512-dcS1ul+9tmeD95T+x28/ehLgd9mENa3LsvDTtzm3vyBEO7RPptvAD+t44WVXaUjTBRcrpFeFlC8WCruUR456hw==",
+ "dev": true
+ }
+ }
+ },
+ "defined": {
+ "version": "1.0.0",
+ "resolved": "https://registry.npmjs.org/defined/-/defined-1.0.0.tgz",
+ "integrity": "sha1-yY2bzvdWdBiOEQlpFRGZ45sfppM=",
+ "dev": true
+ },
+ "del": {
+ "version": "2.2.2",
+ "resolved": "https://registry.npmjs.org/del/-/del-2.2.2.tgz",
+ "integrity": "sha1-wSyYHQZ4RshLyvhiz/kw2Qf/0ag=",
+ "dev": true,
+ "requires": {
+ "globby": "^5.0.0",
+ "is-path-cwd": "^1.0.0",
+ "is-path-in-cwd": "^1.0.0",
+ "object-assign": "^4.0.1",
+ "pify": "^2.0.0",
+ "pinkie-promise": "^2.0.0",
+ "rimraf": "^2.2.8"
+ }
+ },
+ "depd": {
+ "version": "1.1.1",
+ "resolved": "https://registry.npmjs.org/depd/-/depd-1.1.1.tgz",
+ "integrity": "sha1-V4O04cRZ8G+lyif5kfPQbnoxA1k=",
+ "dev": true
+ },
+ "deps-sort": {
+ "version": "2.0.0",
+ "resolved": "https://registry.npmjs.org/deps-sort/-/deps-sort-2.0.0.tgz",
+ "integrity": "sha1-CRckkC6EZYJg65EHSMzNGvbiH7U=",
+ "dev": true,
+ "requires": {
+ "JSONStream": "^1.0.3",
+ "shasum": "^1.0.0",
+ "subarg": "^1.0.0",
+ "through2": "^2.0.0"
+ },
+ "dependencies": {
+ "through2": {
+ "version": "2.0.3",
+ "resolved": "https://registry.npmjs.org/through2/-/through2-2.0.3.tgz",
+ "integrity": "sha1-AARWmzfHx0ujnEPzzteNGtlBQL4=",
+ "dev": true,
+ "requires": {
+ "readable-stream": "^2.1.5",
+ "xtend": "~4.0.1"
+ }
+ }
+ }
+ },
+ "derequire": {
+ "version": "2.0.6",
+ "resolved": "https://registry.npmjs.org/derequire/-/derequire-2.0.6.tgz",
+ "integrity": "sha1-MaQUu3yhdiOfp4sRZjbvd9UX52g=",
+ "dev": true,
+ "requires": {
+ "acorn": "^4.0.3",
+ "concat-stream": "^1.4.6",
+ "escope": "^3.6.0",
+ "through2": "^2.0.0",
+ "yargs": "^6.5.0"
+ },
+ "dependencies": {
+ "through2": {
+ "version": "2.0.3",
+ "resolved": "https://registry.npmjs.org/through2/-/through2-2.0.3.tgz",
+ "integrity": "sha1-AARWmzfHx0ujnEPzzteNGtlBQL4=",
+ "dev": true,
+ "requires": {
+ "readable-stream": "^2.1.5",
+ "xtend": "~4.0.1"
+ }
+ }
+ }
+ },
+ "des.js": {
+ "version": "1.0.0",
+ "resolved": "https://registry.npmjs.org/des.js/-/des.js-1.0.0.tgz",
+ "integrity": "sha1-wHTS4qpqipoH29YfmhXCzYPsjsw=",
+ "dev": true,
+ "requires": {
+ "inherits": "^2.0.1",
+ "minimalistic-assert": "^1.0.0"
+ }
+ },
+ "destroy": {
+ "version": "1.0.4",
+ "resolved": "https://registry.npmjs.org/destroy/-/destroy-1.0.4.tgz",
+ "integrity": "sha1-l4hXRCxEdJ5CBmE+N5RiBYJqvYA=",
+ "dev": true
+ },
+ "detect-indent": {
+ "version": "4.0.0",
+ "resolved": "https://registry.npmjs.org/detect-indent/-/detect-indent-4.0.0.tgz",
+ "integrity": "sha1-920GQ1LN9Docts5hnE7jqUdd4gg=",
+ "dev": true,
+ "requires": {
+ "repeating": "^2.0.0"
+ }
+ },
+ "detect-newline": {
+ "version": "2.1.0",
+ "resolved": "https://registry.npmjs.org/detect-newline/-/detect-newline-2.1.0.tgz",
+ "integrity": "sha1-9B8cEL5LAOh7XxPaaAdZ8sW/0+I=",
+ "dev": true
+ },
+ "detective": {
+ "version": "5.1.0",
+ "resolved": "https://registry.npmjs.org/detective/-/detective-5.1.0.tgz",
+ "integrity": "sha512-TFHMqfOvxlgrfVzTEkNBSh9SvSNX/HfF4OFI2QFGCyPm02EsyILqnUeb5P6q7JZ3SFNTBL5t2sePRgrN4epUWQ==",
+ "dev": true,
+ "requires": {
+ "acorn-node": "^1.3.0",
+ "defined": "^1.0.0",
+ "minimist": "^1.1.1"
+ },
+ "dependencies": {
+ "minimist": {
+ "version": "1.2.5",
+ "resolved": "https://registry.npmjs.org/minimist/-/minimist-1.2.5.tgz",
+ "integrity": "sha512-FM9nNUYrRBAELZQT3xeZQ7fmMOBg6nWNmJKTcgsJeaLstP/UODVpGsr5OhXhhXg6f+qtJ8uiZ+PUxkDWcgIXLw==",
+ "dev": true
+ }
+ }
+ },
+ "diff": {
+ "version": "3.3.1",
+ "resolved": "https://registry.npmjs.org/diff/-/diff-3.3.1.tgz",
+ "integrity": "sha512-MKPHZDMB0o6yHyDryUOScqZibp914ksXwAMYMTHj6KO8UeKsRYNJD3oNCKjTqZon+V488P7N/HzXF8t7ZR95ww==",
+ "dev": true
+ },
+ "diffie-hellman": {
+ "version": "5.0.3",
+ "resolved": "https://registry.npmjs.org/diffie-hellman/-/diffie-hellman-5.0.3.tgz",
+ "integrity": "sha512-kqag/Nl+f3GwyK25fhUMYj81BUOrZ9IuJsjIcDE5icNM9FJHAVm3VcUDxdLPoQtTuUylWm6ZIknYJwwaPxsUzg==",
+ "dev": true,
+ "requires": {
+ "bn.js": "^4.1.0",
+ "miller-rabin": "^4.0.0",
+ "randombytes": "^2.0.0"
+ }
+ },
+ "doctrine": {
+ "version": "2.1.0",
+ "resolved": "https://registry.npmjs.org/doctrine/-/doctrine-2.1.0.tgz",
+ "integrity": "sha512-35mSku4ZXK0vfCuHEDAwt55dg2jNajHZ1odvF+8SSr82EsZY4QmXfuWso8oEd8zRhVObSN18aM0CjSdoBX7zIw==",
+ "dev": true,
+ "requires": {
+ "esutils": "^2.0.2"
+ }
+ },
+ "domain-browser": {
+ "version": "1.2.0",
+ "resolved": "https://registry.npmjs.org/domain-browser/-/domain-browser-1.2.0.tgz",
+ "integrity": "sha512-jnjyiM6eRyZl2H+W8Q/zLMA481hzi0eszAaBUzIVnmYVDBbnLxVNnfu1HgEBvCbL+71FrxMl3E6lpKH7Ge3OXA==",
+ "dev": true
+ },
+ "duplexer2": {
+ "version": "0.1.4",
+ "resolved": "https://registry.npmjs.org/duplexer2/-/duplexer2-0.1.4.tgz",
+ "integrity": "sha1-ixLauHjA1p4+eJEFFmKjL8a93ME=",
+ "dev": true,
+ "requires": {
+ "readable-stream": "^2.0.2"
+ }
+ },
+ "editorconfig": {
+ "version": "0.13.3",
+ "resolved": "https://registry.npmjs.org/editorconfig/-/editorconfig-0.13.3.tgz",
+ "integrity": "sha512-WkjsUNVCu+ITKDj73QDvi0trvpdDWdkDyHybDGSXPfekLCqwmpD7CP7iPbvBgosNuLcI96XTDwNa75JyFl7tEQ==",
+ "dev": true,
+ "requires": {
+ "bluebird": "^3.0.5",
+ "commander": "^2.9.0",
+ "lru-cache": "^3.2.0",
+ "semver": "^5.1.0",
+ "sigmund": "^1.0.1"
+ }
+ },
+ "ee-first": {
+ "version": "1.1.1",
+ "resolved": "https://registry.npmjs.org/ee-first/-/ee-first-1.1.1.tgz",
+ "integrity": "sha1-WQxhFWsK4vTwJVcyoViyZrxWsh0=",
+ "dev": true
+ },
+ "electron-to-chromium": {
+ "version": "1.3.52",
+ "resolved": "https://registry.npmjs.org/electron-to-chromium/-/electron-to-chromium-1.3.52.tgz",
+ "integrity": "sha1-0tnxJwuko7lnuDHEDvcftNmrXOA=",
+ "dev": true
+ },
+ "elliptic": {
+ "version": "github:openpgpjs/elliptic#ab7d8268c60b6abeb175841c578c224ac5b2d279",
+ "from": "github:openpgpjs/elliptic#ab7d8268c60b6abeb175841c578c224ac5b2d279",
+ "dev": true,
+ "requires": {
+ "bn.js": "^4.4.0",
+ "brorand": "^1.0.1",
+ "hash.js": "^1.0.0",
+ "hmac-drbg": "^1.0.0",
+ "inherits": "^2.0.1",
+ "minimalistic-assert": "^1.0.0",
+ "minimalistic-crypto-utils": "^1.0.0"
+ }
+ },
+ "email-addresses": {
+ "version": "3.1.0",
+ "resolved": "https://registry.npmjs.org/email-addresses/-/email-addresses-3.1.0.tgz",
+ "integrity": "sha512-k0/r7GrWVL32kZlGwfPNgB2Y/mMXVTq/decgLczm/j34whdaspNrZO8CnXPf1laaHxI6ptUlsnAxN+UAPw+fzg==",
+ "dev": true
+ },
+ "emoji-regex": {
+ "version": "7.0.3",
+ "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-7.0.3.tgz",
+ "integrity": "sha512-CwBLREIQ7LvYFB0WyRvwhq5N5qPhc6PMjD6bYggFlI5YyDgl+0vxq5VHbMOFqLg7hfWzmu8T5Z1QofhmTIhItA==",
+ "dev": true
+ },
+ "encodeurl": {
+ "version": "1.0.1",
+ "resolved": "https://registry.npmjs.org/encodeurl/-/encodeurl-1.0.1.tgz",
+ "integrity": "sha1-eePVhlU0aQn+bw9Fpd5oEDspTSA=",
+ "dev": true
+ },
+ "error": {
+ "version": "7.0.2",
+ "resolved": "https://registry.npmjs.org/error/-/error-7.0.2.tgz",
+ "integrity": "sha1-pfdf/02ZJhJt2sDqXcOOaJFTywI=",
+ "dev": true,
+ "requires": {
+ "string-template": "~0.2.1",
+ "xtend": "~4.0.0"
+ }
+ },
+ "error-ex": {
+ "version": "1.3.1",
+ "resolved": "https://registry.npmjs.org/error-ex/-/error-ex-1.3.1.tgz",
+ "integrity": "sha1-+FWobOYa3E6GIcPNoh56dhLDqNw=",
+ "dev": true,
+ "requires": {
+ "is-arrayish": "^0.2.1"
+ }
+ },
+ "es5-ext": {
+ "version": "0.10.37",
+ "resolved": "https://registry.npmjs.org/es5-ext/-/es5-ext-0.10.37.tgz",
+ "integrity": "sha1-DudB0Ui4AGm6J9AgOTdWryV978M=",
+ "dev": true,
+ "requires": {
+ "es6-iterator": "~2.0.1",
+ "es6-symbol": "~3.1.1"
+ }
+ },
+ "es6-error": {
+ "version": "4.1.1",
+ "resolved": "https://registry.npmjs.org/es6-error/-/es6-error-4.1.1.tgz",
+ "integrity": "sha512-Um/+FxMr9CISWh0bi5Zv0iOD+4cFh5qLeks1qhAopKVAJw3drgKbKySikp7wGhDL0HPeaja0P5ULZrxLkniUVg==",
+ "dev": true
+ },
+ "es6-iterator": {
+ "version": "2.0.3",
+ "resolved": "https://registry.npmjs.org/es6-iterator/-/es6-iterator-2.0.3.tgz",
+ "integrity": "sha1-p96IkUGgWpSwhUQDstCg+/qY87c=",
+ "dev": true,
+ "requires": {
+ "d": "1",
+ "es5-ext": "^0.10.35",
+ "es6-symbol": "^3.1.1"
+ }
+ },
+ "es6-map": {
+ "version": "0.1.5",
+ "resolved": "https://registry.npmjs.org/es6-map/-/es6-map-0.1.5.tgz",
+ "integrity": "sha1-kTbgUD3MBqMBaQ8LsU/042TpSfA=",
+ "dev": true,
+ "requires": {
+ "d": "1",
+ "es5-ext": "~0.10.14",
+ "es6-iterator": "~2.0.1",
+ "es6-set": "~0.1.5",
+ "es6-symbol": "~3.1.1",
+ "event-emitter": "~0.3.5"
+ }
+ },
+ "es6-set": {
+ "version": "0.1.5",
+ "resolved": "https://registry.npmjs.org/es6-set/-/es6-set-0.1.5.tgz",
+ "integrity": "sha1-0rPsXU2ADO2BjbU40ol02wpzzLE=",
+ "dev": true,
+ "requires": {
+ "d": "1",
+ "es5-ext": "~0.10.14",
+ "es6-iterator": "~2.0.1",
+ "es6-symbol": "3.1.1",
+ "event-emitter": "~0.3.5"
+ }
+ },
+ "es6-symbol": {
+ "version": "3.1.1",
+ "resolved": "https://registry.npmjs.org/es6-symbol/-/es6-symbol-3.1.1.tgz",
+ "integrity": "sha1-vwDvT9q2uhtG7Le2KbTH7VcVzHc=",
+ "dev": true,
+ "requires": {
+ "d": "1",
+ "es5-ext": "~0.10.14"
+ }
+ },
+ "es6-weak-map": {
+ "version": "2.0.2",
+ "resolved": "https://registry.npmjs.org/es6-weak-map/-/es6-weak-map-2.0.2.tgz",
+ "integrity": "sha1-XjqzIlH/0VOKH45f+hNXdy+S2W8=",
+ "dev": true,
+ "requires": {
+ "d": "1",
+ "es5-ext": "^0.10.14",
+ "es6-iterator": "^2.0.1",
+ "es6-symbol": "^3.1.1"
+ }
+ },
+ "escape-html": {
+ "version": "1.0.3",
+ "resolved": "https://registry.npmjs.org/escape-html/-/escape-html-1.0.3.tgz",
+ "integrity": "sha1-Aljq5NPQwJdN4cFpGI7wBR0dGYg=",
+ "dev": true
+ },
+ "escape-string-regexp": {
+ "version": "1.0.5",
+ "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-1.0.5.tgz",
+ "integrity": "sha1-G2HAViGQqN/2rjuyzwIAyhMLhtQ=",
+ "dev": true
+ },
+ "escope": {
+ "version": "3.6.0",
+ "resolved": "https://registry.npmjs.org/escope/-/escope-3.6.0.tgz",
+ "integrity": "sha1-4Bl16BJ4GhY6ba392AOY3GTIicM=",
+ "dev": true,
+ "requires": {
+ "es6-map": "^0.1.3",
+ "es6-weak-map": "^2.0.1",
+ "esrecurse": "^4.1.0",
+ "estraverse": "^4.1.1"
+ }
+ },
+ "eslint": {
+ "version": "4.19.1",
+ "resolved": "https://registry.npmjs.org/eslint/-/eslint-4.19.1.tgz",
+ "integrity": "sha512-bT3/1x1EbZB7phzYu7vCr1v3ONuzDtX8WjuM9c0iYxe+cq+pwcKEoQjl7zd3RpC6YOLgnSy3cTN58M2jcoPDIQ==",
+ "dev": true,
+ "requires": {
+ "ajv": "^5.3.0",
+ "babel-code-frame": "^6.22.0",
+ "chalk": "^2.1.0",
+ "concat-stream": "^1.6.0",
+ "cross-spawn": "^5.1.0",
+ "debug": "^3.1.0",
+ "doctrine": "^2.1.0",
+ "eslint-scope": "^3.7.1",
+ "eslint-visitor-keys": "^1.0.0",
+ "espree": "^3.5.4",
+ "esquery": "^1.0.0",
+ "esutils": "^2.0.2",
+ "file-entry-cache": "^2.0.0",
+ "functional-red-black-tree": "^1.0.1",
+ "glob": "^7.1.2",
+ "globals": "^11.0.1",
+ "ignore": "^3.3.3",
+ "imurmurhash": "^0.1.4",
+ "inquirer": "^3.0.6",
+ "is-resolvable": "^1.0.0",
+ "js-yaml": "^3.9.1",
+ "json-stable-stringify-without-jsonify": "^1.0.1",
+ "levn": "^0.3.0",
+ "lodash": "^4.17.4",
+ "minimatch": "^3.0.2",
+ "mkdirp": "^0.5.1",
+ "natural-compare": "^1.4.0",
+ "optionator": "^0.8.2",
+ "path-is-inside": "^1.0.2",
+ "pluralize": "^7.0.0",
+ "progress": "^2.0.0",
+ "regexpp": "^1.0.1",
+ "require-uncached": "^1.0.3",
+ "semver": "^5.3.0",
+ "strip-ansi": "^4.0.0",
+ "strip-json-comments": "~2.0.1",
+ "table": "4.0.2",
+ "text-table": "~0.2.0"
+ },
+ "dependencies": {
+ "acorn": {
+ "version": "5.7.4",
+ "resolved": "https://registry.npmjs.org/acorn/-/acorn-5.7.4.tgz",
+ "integrity": "sha512-1D++VG7BhrtvQpNbBzovKNc1FLGGEE/oGe7b9xJm/RFHMBeUaUGpluV9RLjZa47YFdPcDAenEYuq9pQPcMdLJg==",
+ "dev": true
+ },
+ "ansi-regex": {
+ "version": "3.0.0",
+ "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-3.0.0.tgz",
+ "integrity": "sha1-7QMXwyIGT3lGbAKWa922Bas32Zg=",
+ "dev": true
+ },
+ "ansi-styles": {
+ "version": "3.2.1",
+ "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-3.2.1.tgz",
+ "integrity": "sha512-VT0ZI6kZRdTh8YyJw3SMbYm/u+NqfsAxEpWO0Pf9sq8/e94WxxOpPKx9FR1FlyCtOVDNOQ+8ntlqFxiRc+r5qA==",
+ "dev": true,
+ "requires": {
+ "color-convert": "^1.9.0"
+ }
+ },
+ "chalk": {
+ "version": "2.4.1",
+ "resolved": "https://registry.npmjs.org/chalk/-/chalk-2.4.1.tgz",
+ "integrity": "sha512-ObN6h1v2fTJSmUXoS3nMQ92LbDK9be4TV+6G+omQlGJFdcUX5heKi1LZ1YnRMIgwTLEj3E24bT6tYni50rlCfQ==",
+ "dev": true,
+ "requires": {
+ "ansi-styles": "^3.2.1",
+ "escape-string-regexp": "^1.0.5",
+ "supports-color": "^5.3.0"
+ }
+ },
+ "debug": {
+ "version": "3.1.0",
+ "resolved": "https://registry.npmjs.org/debug/-/debug-3.1.0.tgz",
+ "integrity": "sha512-OX8XqP7/1a9cqkxYw2yXss15f26NKWBpDXQd0/uK/KPqdQhxbPa994hnzjcE2VqQpDslf55723cKPUOGSmMY3g==",
+ "dev": true,
+ "requires": {
+ "ms": "2.0.0"
+ }
+ },
+ "espree": {
+ "version": "3.5.4",
+ "resolved": "https://registry.npmjs.org/espree/-/espree-3.5.4.tgz",
+ "integrity": "sha512-yAcIQxtmMiB/jL32dzEp2enBeidsB7xWPLNiw3IIkpVds1P+h7qF9YwJq1yUNzp2OKXgAprs4F61ih66UsoD1A==",
+ "dev": true,
+ "requires": {
+ "acorn": "^5.5.0",
+ "acorn-jsx": "^3.0.0"
+ }
+ },
+ "glob": {
+ "version": "7.1.2",
+ "resolved": "https://registry.npmjs.org/glob/-/glob-7.1.2.tgz",
+ "integrity": "sha512-MJTUg1kjuLeQCJ+ccE4Vpa6kKVXkPYJ2mOCQyUuKLcLQsdrMCpBPUi8qVE6+YuaJkozeA9NusTAw3hLr8Xe5EQ==",
+ "dev": true,
+ "requires": {
+ "fs.realpath": "^1.0.0",
+ "inflight": "^1.0.4",
+ "inherits": "2",
+ "minimatch": "^3.0.4",
+ "once": "^1.3.0",
+ "path-is-absolute": "^1.0.0"
+ }
+ },
+ "globals": {
+ "version": "11.7.0",
+ "resolved": "https://registry.npmjs.org/globals/-/globals-11.7.0.tgz",
+ "integrity": "sha512-K8BNSPySfeShBQXsahYB/AbbWruVOTyVpgoIDnl8odPpeSfP2J5QO2oLFFdl2j7GfDCtZj2bMKar2T49itTPCg==",
+ "dev": true
+ },
+ "has-flag": {
+ "version": "3.0.0",
+ "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-3.0.0.tgz",
+ "integrity": "sha1-tdRU3CGZriJWmfNGfloH87lVuv0=",
+ "dev": true
+ },
+ "js-yaml": {
+ "version": "3.13.1",
+ "resolved": "https://registry.npmjs.org/js-yaml/-/js-yaml-3.13.1.tgz",
+ "integrity": "sha512-YfbcO7jXDdyj0DGxYVSlSeQNHbD7XPWvrVWeVUujrQEoZzWJIRrCPoyk6kL6IAjAG2IolMK4T0hNUe0HOUs5Jw==",
+ "dev": true,
+ "requires": {
+ "argparse": "^1.0.7",
+ "esprima": "^4.0.0"
+ }
+ },
+ "strip-ansi": {
+ "version": "4.0.0",
+ "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-4.0.0.tgz",
+ "integrity": "sha1-qEeQIusaw2iocTibY1JixQXuNo8=",
+ "dev": true,
+ "requires": {
+ "ansi-regex": "^3.0.0"
+ }
+ },
+ "supports-color": {
+ "version": "5.4.0",
+ "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-5.4.0.tgz",
+ "integrity": "sha512-zjaXglF5nnWpsq470jSv6P9DwPvgLkuapYmfDm3JWOm0vkNTVF2tI4UrN2r6jH1qM/uc/WtxYY1hYoA2dOKj5w==",
+ "dev": true,
+ "requires": {
+ "has-flag": "^3.0.0"
+ }
+ }
+ }
+ },
+ "eslint-config-airbnb": {
+ "version": "16.1.0",
+ "resolved": "https://registry.npmjs.org/eslint-config-airbnb/-/eslint-config-airbnb-16.1.0.tgz",
+ "integrity": "sha512-zLyOhVWhzB/jwbz7IPSbkUuj7X2ox4PHXTcZkEmDqTvd0baJmJyuxlFPDlZOE/Y5bC+HQRaEkT3FoHo9wIdRiw==",
+ "dev": true,
+ "requires": {
+ "eslint-config-airbnb-base": "^12.1.0"
+ }
+ },
+ "eslint-config-airbnb-base": {
+ "version": "12.1.0",
+ "resolved": "https://registry.npmjs.org/eslint-config-airbnb-base/-/eslint-config-airbnb-base-12.1.0.tgz",
+ "integrity": "sha512-/vjm0Px5ZCpmJqnjIzcFb9TKZrKWz0gnuG/7Gfkt0Db1ELJR51xkZth+t14rYdqWgX836XbuxtArbIHlVhbLBA==",
+ "dev": true,
+ "requires": {
+ "eslint-restricted-globals": "^0.1.1"
+ }
+ },
+ "eslint-import-resolver-node": {
+ "version": "0.3.2",
+ "resolved": "https://registry.npmjs.org/eslint-import-resolver-node/-/eslint-import-resolver-node-0.3.2.tgz",
+ "integrity": "sha512-sfmTqJfPSizWu4aymbPr4Iidp5yKm8yDkHp+Ir3YiTHiiDfxh69mOUsmiqW6RZ9zRXFaF64GtYmN7e+8GHBv6Q==",
+ "dev": true,
+ "requires": {
+ "debug": "^2.6.9",
+ "resolve": "^1.5.0"
+ },
+ "dependencies": {
+ "resolve": {
+ "version": "1.5.0",
+ "resolved": "https://registry.npmjs.org/resolve/-/resolve-1.5.0.tgz",
+ "integrity": "sha512-hgoSGrc3pjzAPHNBg+KnFcK2HwlHTs/YrAGUr6qgTVUZmXv1UEXXl0bZNBKMA9fud6lRYFdPGz0xXxycPzmmiw==",
+ "dev": true,
+ "requires": {
+ "path-parse": "^1.0.5"
+ }
+ }
+ }
+ },
+ "eslint-module-utils": {
+ "version": "2.1.1",
+ "resolved": "https://registry.npmjs.org/eslint-module-utils/-/eslint-module-utils-2.1.1.tgz",
+ "integrity": "sha512-jDI/X5l/6D1rRD/3T43q8Qgbls2nq5km5KSqiwlyUbGo5+04fXhMKdCPhjwbqAa6HXWaMxj8Q4hQDIh7IadJQw==",
+ "dev": true,
+ "requires": {
+ "debug": "^2.6.8",
+ "pkg-dir": "^1.0.0"
+ }
+ },
+ "eslint-plugin-chai-friendly": {
+ "version": "0.5.0",
+ "resolved": "https://registry.npmjs.org/eslint-plugin-chai-friendly/-/eslint-plugin-chai-friendly-0.5.0.tgz",
+ "integrity": "sha512-Pxe6z8C9fP0pn2X2nGFU/b3GBOCM/5FVus1hsMwJsXP3R7RiXFl7g0ksJbsc0GxiLyidTW4mEFk77qsNn7Tk7g==",
+ "dev": true
+ },
+ "eslint-plugin-import": {
+ "version": "2.8.0",
+ "resolved": "https://registry.npmjs.org/eslint-plugin-import/-/eslint-plugin-import-2.8.0.tgz",
+ "integrity": "sha512-Rf7dfKJxZ16QuTgVv1OYNxkZcsu/hULFnC+e+w0Gzi6jMC3guQoWQgxYxc54IDRinlb6/0v5z/PxxIKmVctN+g==",
+ "dev": true,
+ "requires": {
+ "builtin-modules": "^1.1.1",
+ "contains-path": "^0.1.0",
+ "debug": "^2.6.8",
+ "doctrine": "1.5.0",
+ "eslint-import-resolver-node": "^0.3.1",
+ "eslint-module-utils": "^2.1.1",
+ "has": "^1.0.1",
+ "lodash.cond": "^4.3.0",
+ "minimatch": "^3.0.3",
+ "read-pkg-up": "^2.0.0"
+ },
+ "dependencies": {
+ "doctrine": {
+ "version": "1.5.0",
+ "resolved": "https://registry.npmjs.org/doctrine/-/doctrine-1.5.0.tgz",
+ "integrity": "sha1-N53Ocw9hZvds76TmcHoVmwLFpvo=",
+ "dev": true,
+ "requires": {
+ "esutils": "^2.0.2",
+ "isarray": "^1.0.0"
+ }
+ },
+ "find-up": {
+ "version": "2.1.0",
+ "resolved": "https://registry.npmjs.org/find-up/-/find-up-2.1.0.tgz",
+ "integrity": "sha1-RdG35QbHF93UgndaK3eSCjwMV6c=",
+ "dev": true,
+ "requires": {
+ "locate-path": "^2.0.0"
+ }
+ },
+ "load-json-file": {
+ "version": "2.0.0",
+ "resolved": "https://registry.npmjs.org/load-json-file/-/load-json-file-2.0.0.tgz",
+ "integrity": "sha1-eUfkIUmvgNaWy/eXvKq8/h/inKg=",
+ "dev": true,
+ "requires": {
+ "graceful-fs": "^4.1.2",
+ "parse-json": "^2.2.0",
+ "pify": "^2.0.0",
+ "strip-bom": "^3.0.0"
+ }
+ },
+ "path-type": {
+ "version": "2.0.0",
+ "resolved": "https://registry.npmjs.org/path-type/-/path-type-2.0.0.tgz",
+ "integrity": "sha1-8BLMuEFbcJb8LaoQVMPXI4lZTHM=",
+ "dev": true,
+ "requires": {
+ "pify": "^2.0.0"
+ }
+ },
+ "read-pkg": {
+ "version": "2.0.0",
+ "resolved": "https://registry.npmjs.org/read-pkg/-/read-pkg-2.0.0.tgz",
+ "integrity": "sha1-jvHAYjxqbbDcZxPEv6xGMysjaPg=",
+ "dev": true,
+ "requires": {
+ "load-json-file": "^2.0.0",
+ "normalize-package-data": "^2.3.2",
+ "path-type": "^2.0.0"
+ }
+ },
+ "read-pkg-up": {
+ "version": "2.0.0",
+ "resolved": "https://registry.npmjs.org/read-pkg-up/-/read-pkg-up-2.0.0.tgz",
+ "integrity": "sha1-a3KoBImE4MQeeVEP1en6mbO1Sb4=",
+ "dev": true,
+ "requires": {
+ "find-up": "^2.0.0",
+ "read-pkg": "^2.0.0"
+ }
+ },
+ "strip-bom": {
+ "version": "3.0.0",
+ "resolved": "https://registry.npmjs.org/strip-bom/-/strip-bom-3.0.0.tgz",
+ "integrity": "sha1-IzTBjpx1n3vdVv3vfprj1YjmjtM=",
+ "dev": true
+ }
+ }
+ },
+ "eslint-restricted-globals": {
+ "version": "0.1.1",
+ "resolved": "https://registry.npmjs.org/eslint-restricted-globals/-/eslint-restricted-globals-0.1.1.tgz",
+ "integrity": "sha1-NfDVy8ZMLj7WLpO0saevBbp+1Nc=",
+ "dev": true
+ },
+ "eslint-scope": {
+ "version": "3.7.1",
+ "resolved": "https://registry.npmjs.org/eslint-scope/-/eslint-scope-3.7.1.tgz",
+ "integrity": "sha1-PWPD7f2gLgbgGkUq2IyqzHzctug=",
+ "dev": true,
+ "requires": {
+ "esrecurse": "^4.1.0",
+ "estraverse": "^4.1.1"
+ }
+ },
+ "eslint-visitor-keys": {
+ "version": "1.0.0",
+ "resolved": "https://registry.npmjs.org/eslint-visitor-keys/-/eslint-visitor-keys-1.0.0.tgz",
+ "integrity": "sha512-qzm/XxIbxm/FHyH341ZrbnMUpe+5Bocte9xkmFMzPMjRaZMcXww+MpBptFvtU+79L362nqiLhekCxCxDPaUMBQ==",
+ "dev": true
+ },
+ "esprima": {
+ "version": "4.0.1",
+ "resolved": "https://registry.npmjs.org/esprima/-/esprima-4.0.1.tgz",
+ "integrity": "sha512-eGuFFw7Upda+g4p+QHvnW0RyTX/SVeJBDM/gCtMARO0cLuT2HcEKnTPvhjV6aGeqrCB/sbNop0Kszm0jsaWU4A==",
+ "dev": true
+ },
+ "esquery": {
+ "version": "1.0.0",
+ "resolved": "https://registry.npmjs.org/esquery/-/esquery-1.0.0.tgz",
+ "integrity": "sha1-z7qLV9f7qT8XKYqKAGoEzaE9gPo=",
+ "dev": true,
+ "requires": {
+ "estraverse": "^4.0.0"
+ }
+ },
+ "esrecurse": {
+ "version": "4.2.0",
+ "resolved": "https://registry.npmjs.org/esrecurse/-/esrecurse-4.2.0.tgz",
+ "integrity": "sha1-+pVo2Y04I/mkHZHpAtyrnqblsWM=",
+ "dev": true,
+ "requires": {
+ "estraverse": "^4.1.0",
+ "object-assign": "^4.0.1"
+ }
+ },
+ "estraverse": {
+ "version": "4.2.0",
+ "resolved": "https://registry.npmjs.org/estraverse/-/estraverse-4.2.0.tgz",
+ "integrity": "sha1-De4/7TH81GlhjOc0IJn8GvoL2xM=",
+ "dev": true
+ },
+ "esutils": {
+ "version": "2.0.2",
+ "resolved": "https://registry.npmjs.org/esutils/-/esutils-2.0.2.tgz",
+ "integrity": "sha1-Cr9PHKpbyx96nYrMbepPqqBLrJs=",
+ "dev": true
+ },
+ "etag": {
+ "version": "1.8.1",
+ "resolved": "https://registry.npmjs.org/etag/-/etag-1.8.1.tgz",
+ "integrity": "sha1-Qa4u62XvpiJorr/qg6x9eSmbCIc=",
+ "dev": true
+ },
+ "event-emitter": {
+ "version": "0.3.5",
+ "resolved": "https://registry.npmjs.org/event-emitter/-/event-emitter-0.3.5.tgz",
+ "integrity": "sha1-34xp7vFkeSPHFXuc6DhAYQsCzDk=",
+ "dev": true,
+ "requires": {
+ "d": "1",
+ "es5-ext": "~0.10.14"
+ }
+ },
+ "eventemitter2": {
+ "version": "0.4.14",
+ "resolved": "https://registry.npmjs.org/eventemitter2/-/eventemitter2-0.4.14.tgz",
+ "integrity": "sha1-j2G3XN4BKy6esoTUVFWDtWQ7Yas=",
+ "dev": true
+ },
+ "events": {
+ "version": "2.1.0",
+ "resolved": "https://registry.npmjs.org/events/-/events-2.1.0.tgz",
+ "integrity": "sha512-3Zmiobend8P9DjmKAty0Era4jV8oJ0yGYe2nJJAxgymF9+N8F2m0hhZiMoWtcfepExzNKZumFU3ksdQbInGWCg==",
+ "dev": true
+ },
+ "evp_bytestokey": {
+ "version": "1.0.3",
+ "resolved": "https://registry.npmjs.org/evp_bytestokey/-/evp_bytestokey-1.0.3.tgz",
+ "integrity": "sha512-/f2Go4TognH/KvCISP7OUsHn85hT9nUkxxA9BEWxFn+Oj9o8ZNLm/40hdlgSLyuOimsrTKLUMEorQexp/aPQeA==",
+ "dev": true,
+ "requires": {
+ "md5.js": "^1.3.4",
+ "safe-buffer": "^5.1.1"
+ }
+ },
+ "exit": {
+ "version": "0.1.2",
+ "resolved": "https://registry.npmjs.org/exit/-/exit-0.1.2.tgz",
+ "integrity": "sha1-BjJjj42HfMghB9MKD/8aF8uhzQw=",
+ "dev": true
+ },
+ "extend-shallow": {
+ "version": "3.0.2",
+ "resolved": "https://registry.npmjs.org/extend-shallow/-/extend-shallow-3.0.2.tgz",
+ "integrity": "sha1-Jqcarwc7OfshJxcnRhMcJwQCjbg=",
+ "dev": true,
+ "requires": {
+ "assign-symbols": "^1.0.0",
+ "is-extendable": "^1.0.1"
+ },
+ "dependencies": {
+ "is-extendable": {
+ "version": "1.0.1",
+ "resolved": "https://registry.npmjs.org/is-extendable/-/is-extendable-1.0.1.tgz",
+ "integrity": "sha512-arnXMxT1hhoKo9k1LZdmlNyJdDDfy2v0fXjFlmok4+i8ul/6WlbVge9bhM74OpNPQPMGUToDtz+KXa1PneJxOA==",
+ "dev": true,
+ "requires": {
+ "is-plain-object": "^2.0.4"
+ }
+ }
+ }
+ },
+ "external-editor": {
+ "version": "2.1.0",
+ "resolved": "https://registry.npmjs.org/external-editor/-/external-editor-2.1.0.tgz",
+ "integrity": "sha512-E44iT5QVOUJBKij4IIV3uvxuNlbKS38Tw1HiupxEIHPv9qtC2PrDYohbXV5U+1jnfIXttny8gUhj+oZvflFlzA==",
+ "dev": true,
+ "requires": {
+ "chardet": "^0.4.0",
+ "iconv-lite": "^0.4.17",
+ "tmp": "^0.0.33"
+ }
+ },
+ "fast-deep-equal": {
+ "version": "1.0.0",
+ "resolved": "https://registry.npmjs.org/fast-deep-equal/-/fast-deep-equal-1.0.0.tgz",
+ "integrity": "sha1-liVqO8l1WV6zbYLpkp0GDYk0Of8=",
+ "dev": true
+ },
+ "fast-json-stable-stringify": {
+ "version": "2.0.0",
+ "resolved": "https://registry.npmjs.org/fast-json-stable-stringify/-/fast-json-stable-stringify-2.0.0.tgz",
+ "integrity": "sha1-1RQsDK7msRifh9OnYREGT4bIu/I=",
+ "dev": true
+ },
+ "fast-levenshtein": {
+ "version": "2.0.6",
+ "resolved": "https://registry.npmjs.org/fast-levenshtein/-/fast-levenshtein-2.0.6.tgz",
+ "integrity": "sha1-PYpcZog6FqMMqGQ+hR8Zuqd5eRc=",
+ "dev": true
+ },
+ "faye-websocket": {
+ "version": "0.10.0",
+ "resolved": "https://registry.npmjs.org/faye-websocket/-/faye-websocket-0.10.0.tgz",
+ "integrity": "sha1-TkkvjQTftviQA1B/btvy1QHnxvQ=",
+ "dev": true,
+ "requires": {
+ "websocket-driver": ">=0.5.1"
+ }
+ },
+ "file-entry-cache": {
+ "version": "2.0.0",
+ "resolved": "https://registry.npmjs.org/file-entry-cache/-/file-entry-cache-2.0.0.tgz",
+ "integrity": "sha1-w5KZDD5oR4PYOLjISkXYoEhFg2E=",
+ "dev": true,
+ "requires": {
+ "flat-cache": "^1.2.1",
+ "object-assign": "^4.0.1"
+ }
+ },
+ "file-sync-cmp": {
+ "version": "0.1.1",
+ "resolved": "https://registry.npmjs.org/file-sync-cmp/-/file-sync-cmp-0.1.1.tgz",
+ "integrity": "sha1-peeo/7+kk7Q7kju9TKiaU7Y7YSs=",
+ "dev": true
+ },
+ "file-uri-to-path": {
+ "version": "1.0.0",
+ "resolved": "https://registry.npmjs.org/file-uri-to-path/-/file-uri-to-path-1.0.0.tgz",
+ "integrity": "sha512-0Zt+s3L7Vf1biwWZ29aARiVYLx7iMGnEUl9x33fbB/j3jR81u/O2LbqK+Bm1CDSNDKVtJ/YjwY7TUd5SkeLQLw==",
+ "dev": true,
+ "optional": true
+ },
+ "finalhandler": {
+ "version": "1.0.6",
+ "resolved": "https://registry.npmjs.org/finalhandler/-/finalhandler-1.0.6.tgz",
+ "integrity": "sha1-AHrqM9Gk0+QgF/YkhIrVjSEvgU8=",
+ "dev": true,
+ "requires": {
+ "debug": "2.6.9",
+ "encodeurl": "~1.0.1",
+ "escape-html": "~1.0.3",
+ "on-finished": "~2.3.0",
+ "parseurl": "~1.3.2",
+ "statuses": "~1.3.1",
+ "unpipe": "~1.0.0"
+ }
+ },
+ "find-cache-dir": {
+ "version": "2.1.0",
+ "resolved": "https://registry.npmjs.org/find-cache-dir/-/find-cache-dir-2.1.0.tgz",
+ "integrity": "sha512-Tq6PixE0w/VMFfCgbONnkiQIVol/JJL7nRMi20fqzA4NRs9AfeqMGeRdPi3wIhYkxjeBaWh2rxwapn5Tu3IqOQ==",
+ "dev": true,
+ "requires": {
+ "commondir": "^1.0.1",
+ "make-dir": "^2.0.0",
+ "pkg-dir": "^3.0.0"
+ },
+ "dependencies": {
+ "find-up": {
+ "version": "3.0.0",
+ "resolved": "https://registry.npmjs.org/find-up/-/find-up-3.0.0.tgz",
+ "integrity": "sha512-1yD6RmLI1XBfxugvORwlck6f75tYL+iR0jqwsOrOxMZyGYqUuDhJ0l4AXdO1iX/FTs9cBAMEk1gWSEx1kSbylg==",
+ "dev": true,
+ "requires": {
+ "locate-path": "^3.0.0"
+ }
+ },
+ "locate-path": {
+ "version": "3.0.0",
+ "resolved": "https://registry.npmjs.org/locate-path/-/locate-path-3.0.0.tgz",
+ "integrity": "sha512-7AO748wWnIhNqAuaty2ZWHkQHRSNfPVIsPIfwEOWO22AmaoVrWavlOcMR5nzTLNYvp36X220/maaRsrec1G65A==",
+ "dev": true,
+ "requires": {
+ "p-locate": "^3.0.0",
+ "path-exists": "^3.0.0"
+ }
+ },
+ "p-limit": {
+ "version": "2.2.2",
+ "resolved": "https://registry.npmjs.org/p-limit/-/p-limit-2.2.2.tgz",
+ "integrity": "sha512-WGR+xHecKTr7EbUEhyLSh5Dube9JtdiG78ufaeLxTgpudf/20KqyMioIUZJAezlTIi6evxuoUs9YXc11cU+yzQ==",
+ "dev": true,
+ "requires": {
+ "p-try": "^2.0.0"
+ }
+ },
+ "p-locate": {
+ "version": "3.0.0",
+ "resolved": "https://registry.npmjs.org/p-locate/-/p-locate-3.0.0.tgz",
+ "integrity": "sha512-x+12w/To+4GFfgJhBEpiDcLozRJGegY+Ei7/z0tSLkMmxGZNybVMSfWj9aJn8Z5Fc7dBUNJOOVgPv2H7IwulSQ==",
+ "dev": true,
+ "requires": {
+ "p-limit": "^2.0.0"
+ }
+ },
+ "p-try": {
+ "version": "2.2.0",
+ "resolved": "https://registry.npmjs.org/p-try/-/p-try-2.2.0.tgz",
+ "integrity": "sha512-R4nPAVTAU0B9D35/Gk3uJf/7XYbQcyohSKdvAxIRSNghFl4e71hVoGnBNQz9cWaXxO2I10KTC+3jMdvvoKw6dQ==",
+ "dev": true
+ },
+ "path-exists": {
+ "version": "3.0.0",
+ "resolved": "https://registry.npmjs.org/path-exists/-/path-exists-3.0.0.tgz",
+ "integrity": "sha1-zg6+ql94yxiSXqfYENe1mwEP1RU=",
+ "dev": true
+ },
+ "pkg-dir": {
+ "version": "3.0.0",
+ "resolved": "https://registry.npmjs.org/pkg-dir/-/pkg-dir-3.0.0.tgz",
+ "integrity": "sha512-/E57AYkoeQ25qkxMj5PBOVgF8Kiu/h7cYS30Z5+R7WaiCCBfLq58ZI/dSeaEKb9WVJV5n/03QwrN3IeWIFllvw==",
+ "dev": true,
+ "requires": {
+ "find-up": "^3.0.0"
+ }
+ }
+ }
+ },
+ "find-up": {
+ "version": "1.1.2",
+ "resolved": "https://registry.npmjs.org/find-up/-/find-up-1.1.2.tgz",
+ "integrity": "sha1-ay6YIrGizgpgq2TWEOzK1TyyTQ8=",
+ "dev": true,
+ "requires": {
+ "path-exists": "^2.0.0",
+ "pinkie-promise": "^2.0.0"
+ }
+ },
+ "findup-sync": {
+ "version": "0.3.0",
+ "resolved": "https://registry.npmjs.org/findup-sync/-/findup-sync-0.3.0.tgz",
+ "integrity": "sha1-N5MKpdgWt3fANEXhlmzGeQpMCxY=",
+ "dev": true,
+ "requires": {
+ "glob": "~5.0.0"
+ },
+ "dependencies": {
+ "glob": {
+ "version": "5.0.15",
+ "resolved": "https://registry.npmjs.org/glob/-/glob-5.0.15.tgz",
+ "integrity": "sha1-G8k2ueAvSmA/zCIuz3Yz0wuLk7E=",
+ "dev": true,
+ "requires": {
+ "inflight": "^1.0.4",
+ "inherits": "2",
+ "minimatch": "2 || 3",
+ "once": "^1.3.0",
+ "path-is-absolute": "^1.0.0"
+ }
+ }
+ }
+ },
+ "flat-cache": {
+ "version": "1.3.0",
+ "resolved": "https://registry.npmjs.org/flat-cache/-/flat-cache-1.3.0.tgz",
+ "integrity": "sha1-0wMLMrOBVPTjt+nHCfSQ9++XxIE=",
+ "dev": true,
+ "requires": {
+ "circular-json": "^0.3.1",
+ "del": "^2.0.2",
+ "graceful-fs": "^4.1.2",
+ "write": "^0.2.1"
+ }
+ },
+ "for-in": {
+ "version": "1.0.2",
+ "resolved": "https://registry.npmjs.org/for-in/-/for-in-1.0.2.tgz",
+ "integrity": "sha1-gQaNKVqBQuwKxybG4iAMMPttXoA=",
+ "dev": true
+ },
+ "foreground-child": {
+ "version": "1.5.6",
+ "resolved": "https://registry.npmjs.org/foreground-child/-/foreground-child-1.5.6.tgz",
+ "integrity": "sha1-T9ca0t/elnibmApcCilZN8svXOk=",
+ "dev": true,
+ "requires": {
+ "cross-spawn": "^4",
+ "signal-exit": "^3.0.0"
+ },
+ "dependencies": {
+ "cross-spawn": {
+ "version": "4.0.2",
+ "resolved": "https://registry.npmjs.org/cross-spawn/-/cross-spawn-4.0.2.tgz",
+ "integrity": "sha1-e5JHYhwjrf3ThWAEqCPL45dCTUE=",
+ "dev": true,
+ "requires": {
+ "lru-cache": "^4.0.1",
+ "which": "^1.2.9"
+ }
+ },
+ "lru-cache": {
+ "version": "4.1.5",
+ "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-4.1.5.tgz",
+ "integrity": "sha512-sWZlbEP2OsHNkXrMl5GYk/jKk70MBng6UU4YI/qGDYbgf6YbP4EvmqISbXCoJiRKs+1bSpFHVgQxvJ17F2li5g==",
+ "dev": true,
+ "requires": {
+ "pseudomap": "^1.0.2",
+ "yallist": "^2.1.2"
+ }
+ }
+ }
+ },
+ "fragment-cache": {
+ "version": "0.2.1",
+ "resolved": "https://registry.npmjs.org/fragment-cache/-/fragment-cache-0.2.1.tgz",
+ "integrity": "sha1-QpD60n8T6Jvn8zeZxrxaCr//DRk=",
+ "dev": true,
+ "requires": {
+ "map-cache": "^0.2.2"
+ }
+ },
+ "fresh": {
+ "version": "0.5.2",
+ "resolved": "https://registry.npmjs.org/fresh/-/fresh-0.5.2.tgz",
+ "integrity": "sha1-PYyt2Q2XZWn6g1qx+OSyOhBWBac=",
+ "dev": true
+ },
+ "fs.realpath": {
+ "version": "1.0.0",
+ "resolved": "https://registry.npmjs.org/fs.realpath/-/fs.realpath-1.0.0.tgz",
+ "integrity": "sha1-FQStJSMVjKpA20onh8sBQRmU6k8=",
+ "dev": true
+ },
+ "fsevents": {
+ "version": "1.2.12",
+ "resolved": "https://registry.npmjs.org/fsevents/-/fsevents-1.2.12.tgz",
+ "integrity": "sha512-Ggd/Ktt7E7I8pxZRbGIs7vwqAPscSESMrCSkx2FtWeqmheJgCo2R74fTsZFCifr0VTPwqRpPv17+6b8Zp7th0Q==",
+ "dev": true,
+ "optional": true,
+ "requires": {
+ "bindings": "^1.5.0",
+ "nan": "^2.12.1",
+ "node-pre-gyp": "*"
+ },
+ "dependencies": {
+ "abbrev": {
+ "version": "1.1.1",
+ "bundled": true,
+ "dev": true,
+ "optional": true
+ },
+ "ansi-regex": {
+ "version": "2.1.1",
+ "bundled": true,
+ "dev": true,
+ "optional": true
+ },
+ "aproba": {
+ "version": "1.2.0",
+ "bundled": true,
+ "dev": true,
+ "optional": true
+ },
+ "are-we-there-yet": {
+ "version": "1.1.5",
+ "bundled": true,
+ "dev": true,
+ "optional": true,
+ "requires": {
+ "delegates": "^1.0.0",
+ "readable-stream": "^2.0.6"
+ }
+ },
+ "balanced-match": {
+ "version": "1.0.0",
+ "bundled": true,
+ "dev": true,
+ "optional": true
+ },
+ "brace-expansion": {
+ "version": "1.1.11",
+ "bundled": true,
+ "dev": true,
+ "optional": true,
+ "requires": {
+ "balanced-match": "^1.0.0",
+ "concat-map": "0.0.1"
+ }
+ },
+ "chownr": {
+ "version": "1.1.4",
+ "bundled": true,
+ "dev": true,
+ "optional": true
+ },
+ "code-point-at": {
+ "version": "1.1.0",
+ "bundled": true,
+ "dev": true,
+ "optional": true
+ },
+ "concat-map": {
+ "version": "0.0.1",
+ "bundled": true,
+ "dev": true,
+ "optional": true
+ },
+ "console-control-strings": {
+ "version": "1.1.0",
+ "bundled": true,
+ "dev": true,
+ "optional": true
+ },
+ "core-util-is": {
+ "version": "1.0.2",
+ "bundled": true,
+ "dev": true,
+ "optional": true
+ },
+ "debug": {
+ "version": "3.2.6",
+ "bundled": true,
+ "dev": true,
+ "optional": true,
+ "requires": {
+ "ms": "^2.1.1"
+ }
+ },
+ "deep-extend": {
+ "version": "0.6.0",
+ "bundled": true,
+ "dev": true,
+ "optional": true
+ },
+ "delegates": {
+ "version": "1.0.0",
+ "bundled": true,
+ "dev": true,
+ "optional": true
+ },
+ "detect-libc": {
+ "version": "1.0.3",
+ "bundled": true,
+ "dev": true,
+ "optional": true
+ },
+ "fs-minipass": {
+ "version": "1.2.7",
+ "bundled": true,
+ "dev": true,
+ "optional": true,
+ "requires": {
+ "minipass": "^2.6.0"
+ }
+ },
+ "fs.realpath": {
+ "version": "1.0.0",
+ "bundled": true,
+ "dev": true,
+ "optional": true
+ },
+ "gauge": {
+ "version": "2.7.4",
+ "bundled": true,
+ "dev": true,
+ "optional": true,
+ "requires": {
+ "aproba": "^1.0.3",
+ "console-control-strings": "^1.0.0",
+ "has-unicode": "^2.0.0",
+ "object-assign": "^4.1.0",
+ "signal-exit": "^3.0.0",
+ "string-width": "^1.0.1",
+ "strip-ansi": "^3.0.1",
+ "wide-align": "^1.1.0"
+ }
+ },
+ "glob": {
+ "version": "7.1.6",
+ "bundled": true,
+ "dev": true,
+ "optional": true,
+ "requires": {
+ "fs.realpath": "^1.0.0",
+ "inflight": "^1.0.4",
+ "inherits": "2",
+ "minimatch": "^3.0.4",
+ "once": "^1.3.0",
+ "path-is-absolute": "^1.0.0"
+ }
+ },
+ "has-unicode": {
+ "version": "2.0.1",
+ "bundled": true,
+ "dev": true,
+ "optional": true
+ },
+ "iconv-lite": {
+ "version": "0.4.24",
+ "bundled": true,
+ "dev": true,
+ "optional": true,
+ "requires": {
+ "safer-buffer": ">= 2.1.2 < 3"
+ }
+ },
+ "ignore-walk": {
+ "version": "3.0.3",
+ "bundled": true,
+ "dev": true,
+ "optional": true,
+ "requires": {
+ "minimatch": "^3.0.4"
+ }
+ },
+ "inflight": {
+ "version": "1.0.6",
+ "bundled": true,
+ "dev": true,
+ "optional": true,
+ "requires": {
+ "once": "^1.3.0",
+ "wrappy": "1"
+ }
+ },
+ "inherits": {
+ "version": "2.0.4",
+ "bundled": true,
+ "dev": true,
+ "optional": true
+ },
+ "ini": {
+ "version": "1.3.5",
+ "bundled": true,
+ "dev": true,
+ "optional": true
+ },
+ "is-fullwidth-code-point": {
+ "version": "1.0.0",
+ "bundled": true,
+ "dev": true,
+ "optional": true,
+ "requires": {
+ "number-is-nan": "^1.0.0"
+ }
+ },
+ "isarray": {
+ "version": "1.0.0",
+ "bundled": true,
+ "dev": true,
+ "optional": true
+ },
+ "minimatch": {
+ "version": "3.0.4",
+ "bundled": true,
+ "dev": true,
+ "optional": true,
+ "requires": {
+ "brace-expansion": "^1.1.7"
+ }
+ },
+ "minimist": {
+ "version": "1.2.5",
+ "bundled": true,
+ "dev": true,
+ "optional": true
+ },
+ "minipass": {
+ "version": "2.9.0",
+ "bundled": true,
+ "dev": true,
+ "optional": true,
+ "requires": {
+ "safe-buffer": "^5.1.2",
+ "yallist": "^3.0.0"
+ }
+ },
+ "minizlib": {
+ "version": "1.3.3",
+ "bundled": true,
+ "dev": true,
+ "optional": true,
+ "requires": {
+ "minipass": "^2.9.0"
+ }
+ },
+ "mkdirp": {
+ "version": "0.5.3",
+ "bundled": true,
+ "dev": true,
+ "optional": true,
+ "requires": {
+ "minimist": "^1.2.5"
+ }
+ },
+ "ms": {
+ "version": "2.1.2",
+ "bundled": true,
+ "dev": true,
+ "optional": true
+ },
+ "needle": {
+ "version": "2.3.3",
+ "bundled": true,
+ "dev": true,
+ "optional": true,
+ "requires": {
+ "debug": "^3.2.6",
+ "iconv-lite": "^0.4.4",
+ "sax": "^1.2.4"
+ }
+ },
+ "node-pre-gyp": {
+ "version": "0.14.0",
+ "bundled": true,
+ "dev": true,
+ "optional": true,
+ "requires": {
+ "detect-libc": "^1.0.2",
+ "mkdirp": "^0.5.1",
+ "needle": "^2.2.1",
+ "nopt": "^4.0.1",
+ "npm-packlist": "^1.1.6",
+ "npmlog": "^4.0.2",
+ "rc": "^1.2.7",
+ "rimraf": "^2.6.1",
+ "semver": "^5.3.0",
+ "tar": "^4.4.2"
+ }
+ },
+ "nopt": {
+ "version": "4.0.3",
+ "bundled": true,
+ "dev": true,
+ "optional": true,
+ "requires": {
+ "abbrev": "1",
+ "osenv": "^0.1.4"
+ }
+ },
+ "npm-bundled": {
+ "version": "1.1.1",
+ "bundled": true,
+ "dev": true,
+ "optional": true,
+ "requires": {
+ "npm-normalize-package-bin": "^1.0.1"
+ }
+ },
+ "npm-normalize-package-bin": {
+ "version": "1.0.1",
+ "bundled": true,
+ "dev": true,
+ "optional": true
+ },
+ "npm-packlist": {
+ "version": "1.4.8",
+ "bundled": true,
+ "dev": true,
+ "optional": true,
+ "requires": {
+ "ignore-walk": "^3.0.1",
+ "npm-bundled": "^1.0.1",
+ "npm-normalize-package-bin": "^1.0.1"
+ }
+ },
+ "npmlog": {
+ "version": "4.1.2",
+ "bundled": true,
+ "dev": true,
+ "optional": true,
+ "requires": {
+ "are-we-there-yet": "~1.1.2",
+ "console-control-strings": "~1.1.0",
+ "gauge": "~2.7.3",
+ "set-blocking": "~2.0.0"
+ }
+ },
+ "number-is-nan": {
+ "version": "1.0.1",
+ "bundled": true,
+ "dev": true,
+ "optional": true
+ },
+ "object-assign": {
+ "version": "4.1.1",
+ "bundled": true,
+ "dev": true,
+ "optional": true
+ },
+ "once": {
+ "version": "1.4.0",
+ "bundled": true,
+ "dev": true,
+ "optional": true,
+ "requires": {
+ "wrappy": "1"
+ }
+ },
+ "os-homedir": {
+ "version": "1.0.2",
+ "bundled": true,
+ "dev": true,
+ "optional": true
+ },
+ "os-tmpdir": {
+ "version": "1.0.2",
+ "bundled": true,
+ "dev": true,
+ "optional": true
+ },
+ "osenv": {
+ "version": "0.1.5",
+ "bundled": true,
+ "dev": true,
+ "optional": true,
+ "requires": {
+ "os-homedir": "^1.0.0",
+ "os-tmpdir": "^1.0.0"
+ }
+ },
+ "path-is-absolute": {
+ "version": "1.0.1",
+ "bundled": true,
+ "dev": true,
+ "optional": true
+ },
+ "process-nextick-args": {
+ "version": "2.0.1",
+ "bundled": true,
+ "dev": true,
+ "optional": true
+ },
+ "rc": {
+ "version": "1.2.8",
+ "bundled": true,
+ "dev": true,
+ "optional": true,
+ "requires": {
+ "deep-extend": "^0.6.0",
+ "ini": "~1.3.0",
+ "minimist": "^1.2.0",
+ "strip-json-comments": "~2.0.1"
+ }
+ },
+ "readable-stream": {
+ "version": "2.3.7",
+ "bundled": true,
+ "dev": true,
+ "optional": true,
+ "requires": {
+ "core-util-is": "~1.0.0",
+ "inherits": "~2.0.3",
+ "isarray": "~1.0.0",
+ "process-nextick-args": "~2.0.0",
+ "safe-buffer": "~5.1.1",
+ "string_decoder": "~1.1.1",
+ "util-deprecate": "~1.0.1"
+ }
+ },
+ "rimraf": {
+ "version": "2.7.1",
+ "bundled": true,
+ "dev": true,
+ "optional": true,
+ "requires": {
+ "glob": "^7.1.3"
+ }
+ },
+ "safe-buffer": {
+ "version": "5.1.2",
+ "bundled": true,
+ "dev": true,
+ "optional": true
+ },
+ "safer-buffer": {
+ "version": "2.1.2",
+ "bundled": true,
+ "dev": true,
+ "optional": true
+ },
+ "sax": {
+ "version": "1.2.4",
+ "bundled": true,
+ "dev": true,
+ "optional": true
},
- "ansi-regex": {
- "version": "3.0.0",
- "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-3.0.0.tgz",
- "integrity": "sha1-7QMXwyIGT3lGbAKWa922Bas32Zg=",
- "dev": true
+ "semver": {
+ "version": "5.7.1",
+ "bundled": true,
+ "dev": true,
+ "optional": true
},
- "ansi-styles": {
- "version": "3.2.1",
- "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-3.2.1.tgz",
- "integrity": "sha512-VT0ZI6kZRdTh8YyJw3SMbYm/u+NqfsAxEpWO0Pf9sq8/e94WxxOpPKx9FR1FlyCtOVDNOQ+8ntlqFxiRc+r5qA==",
+ "set-blocking": {
+ "version": "2.0.0",
+ "bundled": true,
"dev": true,
- "requires": {
- "color-convert": "^1.9.0"
- }
+ "optional": true
},
- "chalk": {
- "version": "2.4.1",
- "resolved": "https://registry.npmjs.org/chalk/-/chalk-2.4.1.tgz",
- "integrity": "sha512-ObN6h1v2fTJSmUXoS3nMQ92LbDK9be4TV+6G+omQlGJFdcUX5heKi1LZ1YnRMIgwTLEj3E24bT6tYni50rlCfQ==",
+ "signal-exit": {
+ "version": "3.0.2",
+ "bundled": true,
"dev": true,
- "requires": {
- "ansi-styles": "^3.2.1",
- "escape-string-regexp": "^1.0.5",
- "supports-color": "^5.3.0"
- }
+ "optional": true
},
- "debug": {
- "version": "3.1.0",
- "resolved": "https://registry.npmjs.org/debug/-/debug-3.1.0.tgz",
- "integrity": "sha512-OX8XqP7/1a9cqkxYw2yXss15f26NKWBpDXQd0/uK/KPqdQhxbPa994hnzjcE2VqQpDslf55723cKPUOGSmMY3g==",
+ "string-width": {
+ "version": "1.0.2",
+ "bundled": true,
"dev": true,
+ "optional": true,
"requires": {
- "ms": "2.0.0"
+ "code-point-at": "^1.0.0",
+ "is-fullwidth-code-point": "^1.0.0",
+ "strip-ansi": "^3.0.0"
}
},
- "espree": {
- "version": "3.5.4",
- "resolved": "https://registry.npmjs.org/espree/-/espree-3.5.4.tgz",
- "integrity": "sha512-yAcIQxtmMiB/jL32dzEp2enBeidsB7xWPLNiw3IIkpVds1P+h7qF9YwJq1yUNzp2OKXgAprs4F61ih66UsoD1A==",
+ "string_decoder": {
+ "version": "1.1.1",
+ "bundled": true,
"dev": true,
+ "optional": true,
"requires": {
- "acorn": "^5.5.0",
- "acorn-jsx": "^3.0.0"
+ "safe-buffer": "~5.1.0"
}
},
- "glob": {
- "version": "7.1.2",
- "resolved": "https://registry.npmjs.org/glob/-/glob-7.1.2.tgz",
- "integrity": "sha512-MJTUg1kjuLeQCJ+ccE4Vpa6kKVXkPYJ2mOCQyUuKLcLQsdrMCpBPUi8qVE6+YuaJkozeA9NusTAw3hLr8Xe5EQ==",
+ "strip-ansi": {
+ "version": "3.0.1",
+ "bundled": true,
"dev": true,
+ "optional": true,
"requires": {
- "fs.realpath": "^1.0.0",
- "inflight": "^1.0.4",
- "inherits": "2",
- "minimatch": "^3.0.4",
- "once": "^1.3.0",
- "path-is-absolute": "^1.0.0"
+ "ansi-regex": "^2.0.0"
}
},
- "globals": {
- "version": "11.7.0",
- "resolved": "https://registry.npmjs.org/globals/-/globals-11.7.0.tgz",
- "integrity": "sha512-K8BNSPySfeShBQXsahYB/AbbWruVOTyVpgoIDnl8odPpeSfP2J5QO2oLFFdl2j7GfDCtZj2bMKar2T49itTPCg==",
- "dev": true
- },
- "has-flag": {
- "version": "3.0.0",
- "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-3.0.0.tgz",
- "integrity": "sha1-tdRU3CGZriJWmfNGfloH87lVuv0=",
- "dev": true
+ "strip-json-comments": {
+ "version": "2.0.1",
+ "bundled": true,
+ "dev": true,
+ "optional": true
},
- "js-yaml": {
- "version": "3.13.1",
- "resolved": "https://registry.npmjs.org/js-yaml/-/js-yaml-3.13.1.tgz",
- "integrity": "sha512-YfbcO7jXDdyj0DGxYVSlSeQNHbD7XPWvrVWeVUujrQEoZzWJIRrCPoyk6kL6IAjAG2IolMK4T0hNUe0HOUs5Jw==",
+ "tar": {
+ "version": "4.4.13",
+ "bundled": true,
"dev": true,
+ "optional": true,
"requires": {
- "argparse": "^1.0.7",
- "esprima": "^4.0.0"
+ "chownr": "^1.1.1",
+ "fs-minipass": "^1.2.5",
+ "minipass": "^2.8.6",
+ "minizlib": "^1.2.1",
+ "mkdirp": "^0.5.0",
+ "safe-buffer": "^5.1.2",
+ "yallist": "^3.0.3"
}
},
- "strip-ansi": {
- "version": "4.0.0",
- "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-4.0.0.tgz",
- "integrity": "sha1-qEeQIusaw2iocTibY1JixQXuNo8=",
+ "util-deprecate": {
+ "version": "1.0.2",
+ "bundled": true,
"dev": true,
- "requires": {
- "ansi-regex": "^3.0.0"
- }
+ "optional": true
},
- "supports-color": {
- "version": "5.4.0",
- "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-5.4.0.tgz",
- "integrity": "sha512-zjaXglF5nnWpsq470jSv6P9DwPvgLkuapYmfDm3JWOm0vkNTVF2tI4UrN2r6jH1qM/uc/WtxYY1hYoA2dOKj5w==",
+ "wide-align": {
+ "version": "1.1.3",
+ "bundled": true,
"dev": true,
+ "optional": true,
"requires": {
- "has-flag": "^3.0.0"
+ "string-width": "^1.0.2 || 2"
}
+ },
+ "wrappy": {
+ "version": "1.0.2",
+ "bundled": true,
+ "dev": true,
+ "optional": true
+ },
+ "yallist": {
+ "version": "3.1.1",
+ "bundled": true,
+ "dev": true,
+ "optional": true
}
}
},
- "eslint-config-airbnb": {
- "version": "16.1.0",
- "resolved": "https://registry.npmjs.org/eslint-config-airbnb/-/eslint-config-airbnb-16.1.0.tgz",
- "integrity": "sha512-zLyOhVWhzB/jwbz7IPSbkUuj7X2ox4PHXTcZkEmDqTvd0baJmJyuxlFPDlZOE/Y5bC+HQRaEkT3FoHo9wIdRiw==",
+ "function-bind": {
+ "version": "1.1.1",
+ "resolved": "https://registry.npmjs.org/function-bind/-/function-bind-1.1.1.tgz",
+ "integrity": "sha512-yIovAzMX49sF8Yl58fSCWJ5svSLuaibPxXQJFLmBObTuCr0Mf1KiPopGM9NiFjiYBCbfaa2Fh6breQ6ANVTI0A==",
+ "dev": true
+ },
+ "functional-red-black-tree": {
+ "version": "1.0.1",
+ "resolved": "https://registry.npmjs.org/functional-red-black-tree/-/functional-red-black-tree-1.0.1.tgz",
+ "integrity": "sha1-GwqzvVU7Kg1jmdKcDj6gslIHgyc=",
+ "dev": true
+ },
+ "gaze": {
+ "version": "1.1.3",
+ "resolved": "https://registry.npmjs.org/gaze/-/gaze-1.1.3.tgz",
+ "integrity": "sha512-BRdNm8hbWzFzWHERTrejLqwHDfS4GibPoq5wjTPIoJHoBtKGPg3xAFfxmM+9ztbXelxcf2hwQcaz1PtmFeue8g==",
"dev": true,
"requires": {
- "eslint-config-airbnb-base": "^12.1.0"
+ "globule": "^1.0.0"
}
},
- "eslint-config-airbnb-base": {
- "version": "12.1.0",
- "resolved": "https://registry.npmjs.org/eslint-config-airbnb-base/-/eslint-config-airbnb-base-12.1.0.tgz",
- "integrity": "sha512-/vjm0Px5ZCpmJqnjIzcFb9TKZrKWz0gnuG/7Gfkt0Db1ELJR51xkZth+t14rYdqWgX836XbuxtArbIHlVhbLBA==",
+ "get-assigned-identifiers": {
+ "version": "1.2.0",
+ "resolved": "https://registry.npmjs.org/get-assigned-identifiers/-/get-assigned-identifiers-1.2.0.tgz",
+ "integrity": "sha512-mBBwmeGTrxEMO4pMaaf/uUEFHnYtwr8FTe8Y/mer4rcV/bye0qGm6pw1bGZFGStxC5O76c5ZAVBGnqHmOaJpdQ==",
+ "dev": true
+ },
+ "get-caller-file": {
+ "version": "1.0.2",
+ "resolved": "https://registry.npmjs.org/get-caller-file/-/get-caller-file-1.0.2.tgz",
+ "integrity": "sha1-9wLmMSfn4jHBYKgMFVSstw1QR+U=",
+ "dev": true
+ },
+ "get-func-name": {
+ "version": "2.0.0",
+ "resolved": "https://registry.npmjs.org/get-func-name/-/get-func-name-2.0.0.tgz",
+ "integrity": "sha1-6td0q+5y4gQJQzoGY2YCPdaIekE=",
+ "dev": true
+ },
+ "get-stdin": {
+ "version": "4.0.1",
+ "resolved": "https://registry.npmjs.org/get-stdin/-/get-stdin-4.0.1.tgz",
+ "integrity": "sha1-uWjGsKBDhDJJAui/Gl3zJXmkUP4=",
+ "dev": true
+ },
+ "get-value": {
+ "version": "2.0.6",
+ "resolved": "https://registry.npmjs.org/get-value/-/get-value-2.0.6.tgz",
+ "integrity": "sha1-3BXKHGcjh8p2vTesCjlbogQqLCg=",
+ "dev": true
+ },
+ "getobject": {
+ "version": "0.1.0",
+ "resolved": "https://registry.npmjs.org/getobject/-/getobject-0.1.0.tgz",
+ "integrity": "sha1-BHpEl4n6Fg0Bj1SG7ZEyC27HiFw=",
+ "dev": true
+ },
+ "glob": {
+ "version": "7.0.6",
+ "resolved": "https://registry.npmjs.org/glob/-/glob-7.0.6.tgz",
+ "integrity": "sha1-IRuvr0nlJbjNkyYNFKsTYVKz9Xo=",
"dev": true,
"requires": {
- "eslint-restricted-globals": "^0.1.1"
+ "fs.realpath": "^1.0.0",
+ "inflight": "^1.0.4",
+ "inherits": "2",
+ "minimatch": "^3.0.2",
+ "once": "^1.3.0",
+ "path-is-absolute": "^1.0.0"
}
},
- "eslint-import-resolver-node": {
- "version": "0.3.2",
- "resolved": "https://registry.npmjs.org/eslint-import-resolver-node/-/eslint-import-resolver-node-0.3.2.tgz",
- "integrity": "sha512-sfmTqJfPSizWu4aymbPr4Iidp5yKm8yDkHp+Ir3YiTHiiDfxh69mOUsmiqW6RZ9zRXFaF64GtYmN7e+8GHBv6Q==",
+ "globals": {
+ "version": "9.18.0",
+ "resolved": "https://registry.npmjs.org/globals/-/globals-9.18.0.tgz",
+ "integrity": "sha512-S0nG3CLEQiY/ILxqtztTWH/3iRRdyBLw6KMDxnKMchrtbj2OFmehVh0WUCfW3DUrIgx/qFrJPICrq4Z4sTR9UQ==",
+ "dev": true
+ },
+ "globby": {
+ "version": "5.0.0",
+ "resolved": "https://registry.npmjs.org/globby/-/globby-5.0.0.tgz",
+ "integrity": "sha1-69hGZ8oNuzMLmbz8aOrCvFQ3Dg0=",
"dev": true,
"requires": {
- "debug": "^2.6.9",
- "resolve": "^1.5.0"
+ "array-union": "^1.0.1",
+ "arrify": "^1.0.0",
+ "glob": "^7.0.3",
+ "object-assign": "^4.0.1",
+ "pify": "^2.0.0",
+ "pinkie-promise": "^2.0.0"
+ }
+ },
+ "globule": {
+ "version": "1.2.1",
+ "resolved": "https://registry.npmjs.org/globule/-/globule-1.2.1.tgz",
+ "integrity": "sha512-g7QtgWF4uYSL5/dn71WxubOrS7JVGCnFPEnoeChJmBnyR9Mw8nGoEwOgJL/RC2Te0WhbsEUCejfH8SZNJ+adYQ==",
+ "dev": true,
+ "requires": {
+ "glob": "~7.1.1",
+ "lodash": "~4.17.10",
+ "minimatch": "~3.0.2"
},
"dependencies": {
- "resolve": {
- "version": "1.5.0",
- "resolved": "https://registry.npmjs.org/resolve/-/resolve-1.5.0.tgz",
- "integrity": "sha512-hgoSGrc3pjzAPHNBg+KnFcK2HwlHTs/YrAGUr6qgTVUZmXv1UEXXl0bZNBKMA9fud6lRYFdPGz0xXxycPzmmiw==",
+ "glob": {
+ "version": "7.1.2",
+ "resolved": "https://registry.npmjs.org/glob/-/glob-7.1.2.tgz",
+ "integrity": "sha512-MJTUg1kjuLeQCJ+ccE4Vpa6kKVXkPYJ2mOCQyUuKLcLQsdrMCpBPUi8qVE6+YuaJkozeA9NusTAw3hLr8Xe5EQ==",
"dev": true,
"requires": {
- "path-parse": "^1.0.5"
+ "fs.realpath": "^1.0.0",
+ "inflight": "^1.0.4",
+ "inherits": "2",
+ "minimatch": "^3.0.4",
+ "once": "^1.3.0",
+ "path-is-absolute": "^1.0.0"
}
}
}
},
- "eslint-module-utils": {
- "version": "2.1.1",
- "resolved": "https://registry.npmjs.org/eslint-module-utils/-/eslint-module-utils-2.1.1.tgz",
- "integrity": "sha512-jDI/X5l/6D1rRD/3T43q8Qgbls2nq5km5KSqiwlyUbGo5+04fXhMKdCPhjwbqAa6HXWaMxj8Q4hQDIh7IadJQw==",
- "dev": true,
- "requires": {
- "debug": "^2.6.8",
- "pkg-dir": "^1.0.0"
- }
+ "graceful-fs": {
+ "version": "4.1.11",
+ "resolved": "https://registry.npmjs.org/graceful-fs/-/graceful-fs-4.1.11.tgz",
+ "integrity": "sha1-Dovf5NHduIVNZOBOp8AOKgJuVlg="
},
- "eslint-plugin-chai-friendly": {
- "version": "0.5.0",
- "resolved": "https://registry.npmjs.org/eslint-plugin-chai-friendly/-/eslint-plugin-chai-friendly-0.5.0.tgz",
- "integrity": "sha512-Pxe6z8C9fP0pn2X2nGFU/b3GBOCM/5FVus1hsMwJsXP3R7RiXFl7g0ksJbsc0GxiLyidTW4mEFk77qsNn7Tk7g==",
+ "graceful-readlink": {
+ "version": "1.0.1",
+ "resolved": "https://registry.npmjs.org/graceful-readlink/-/graceful-readlink-1.0.1.tgz",
+ "integrity": "sha1-TK+tdrxi8C+gObL5Tpo906ORpyU=",
"dev": true
},
- "eslint-plugin-import": {
- "version": "2.8.0",
- "resolved": "https://registry.npmjs.org/eslint-plugin-import/-/eslint-plugin-import-2.8.0.tgz",
- "integrity": "sha512-Rf7dfKJxZ16QuTgVv1OYNxkZcsu/hULFnC+e+w0Gzi6jMC3guQoWQgxYxc54IDRinlb6/0v5z/PxxIKmVctN+g==",
- "dev": true,
- "requires": {
- "builtin-modules": "^1.1.1",
- "contains-path": "^0.1.0",
- "debug": "^2.6.8",
- "doctrine": "1.5.0",
- "eslint-import-resolver-node": "^0.3.1",
- "eslint-module-utils": "^2.1.1",
- "has": "^1.0.1",
- "lodash.cond": "^4.3.0",
- "minimatch": "^3.0.3",
- "read-pkg-up": "^2.0.0"
+ "growl": {
+ "version": "1.10.3",
+ "resolved": "https://registry.npmjs.org/growl/-/growl-1.10.3.tgz",
+ "integrity": "sha512-hKlsbA5Vu3xsh1Cg3J7jSmX/WaW6A5oBeqzM88oNbCRQFz+zUaXm6yxS4RVytp1scBoJzSYl4YAEOQIt6O8V1Q==",
+ "dev": true
+ },
+ "grunt": {
+ "version": "1.1.0",
+ "resolved": "https://registry.npmjs.org/grunt/-/grunt-1.1.0.tgz",
+ "integrity": "sha512-+NGod0grmviZ7Nzdi9am7vuRS/h76PcWDsV635mEXF0PEQMUV6Kb+OjTdsVxbi0PZmfQOjCMKb3w8CVZcqsn1g==",
+ "dev": true,
+ "requires": {
+ "coffeescript": "~1.10.0",
+ "dateformat": "~1.0.12",
+ "eventemitter2": "~0.4.13",
+ "exit": "~0.1.1",
+ "findup-sync": "~0.3.0",
+ "glob": "~7.0.0",
+ "grunt-cli": "~1.2.0",
+ "grunt-known-options": "~1.1.0",
+ "grunt-legacy-log": "~2.0.0",
+ "grunt-legacy-util": "~1.1.1",
+ "iconv-lite": "~0.4.13",
+ "js-yaml": "~3.13.1",
+ "minimatch": "~3.0.2",
+ "mkdirp": "~1.0.3",
+ "nopt": "~3.0.6",
+ "path-is-absolute": "~1.0.0",
+ "rimraf": "~2.6.2"
},
"dependencies": {
- "doctrine": {
- "version": "1.5.0",
- "resolved": "https://registry.npmjs.org/doctrine/-/doctrine-1.5.0.tgz",
- "integrity": "sha1-N53Ocw9hZvds76TmcHoVmwLFpvo=",
- "dev": true,
- "requires": {
- "esutils": "^2.0.2",
- "isarray": "^1.0.0"
- }
- },
- "find-up": {
- "version": "2.1.0",
- "resolved": "https://registry.npmjs.org/find-up/-/find-up-2.1.0.tgz",
- "integrity": "sha1-RdG35QbHF93UgndaK3eSCjwMV6c=",
+ "grunt-cli": {
+ "version": "1.2.0",
+ "resolved": "https://registry.npmjs.org/grunt-cli/-/grunt-cli-1.2.0.tgz",
+ "integrity": "sha1-VisRnrsGndtGSs4oRVAb6Xs1tqg=",
"dev": true,
"requires": {
- "locate-path": "^2.0.0"
+ "findup-sync": "~0.3.0",
+ "grunt-known-options": "~1.1.0",
+ "nopt": "~3.0.6",
+ "resolve": "~1.1.0"
}
},
- "load-json-file": {
- "version": "2.0.0",
- "resolved": "https://registry.npmjs.org/load-json-file/-/load-json-file-2.0.0.tgz",
- "integrity": "sha1-eUfkIUmvgNaWy/eXvKq8/h/inKg=",
- "dev": true,
- "requires": {
- "graceful-fs": "^4.1.2",
- "parse-json": "^2.2.0",
- "pify": "^2.0.0",
- "strip-bom": "^3.0.0"
- }
+ "mkdirp": {
+ "version": "1.0.3",
+ "resolved": "https://registry.npmjs.org/mkdirp/-/mkdirp-1.0.3.tgz",
+ "integrity": "sha512-6uCP4Qc0sWsgMLy1EOqqS/3rjDHOEnsStVr/4vtAIK2Y5i2kA7lFFejYrpIyiN9w0pYf4ckeCYT9f1r1P9KX5g==",
+ "dev": true
},
- "path-type": {
- "version": "2.0.0",
- "resolved": "https://registry.npmjs.org/path-type/-/path-type-2.0.0.tgz",
- "integrity": "sha1-8BLMuEFbcJb8LaoQVMPXI4lZTHM=",
+ "rimraf": {
+ "version": "2.6.3",
+ "resolved": "https://registry.npmjs.org/rimraf/-/rimraf-2.6.3.tgz",
+ "integrity": "sha512-mwqeW5XsA2qAejG46gYdENaxXjx9onRNCfn7L0duuP4hCuTIi/QO7PDK07KJfp1d+izWPrzEJDcSqBa0OZQriA==",
"dev": true,
"requires": {
- "pify": "^2.0.0"
+ "glob": "^7.1.3"
+ },
+ "dependencies": {
+ "glob": {
+ "version": "7.1.6",
+ "resolved": "https://registry.npmjs.org/glob/-/glob-7.1.6.tgz",
+ "integrity": "sha512-LwaxwyZ72Lk7vZINtNNrywX0ZuLyStrdDtabefZKAY5ZGJhVtgdznluResxNmPitE0SAO+O26sWTHeKSI2wMBA==",
+ "dev": true,
+ "requires": {
+ "fs.realpath": "^1.0.0",
+ "inflight": "^1.0.4",
+ "inherits": "2",
+ "minimatch": "^3.0.4",
+ "once": "^1.3.0",
+ "path-is-absolute": "^1.0.0"
+ }
+ }
}
- },
- "read-pkg": {
- "version": "2.0.0",
- "resolved": "https://registry.npmjs.org/read-pkg/-/read-pkg-2.0.0.tgz",
- "integrity": "sha1-jvHAYjxqbbDcZxPEv6xGMysjaPg=",
+ }
+ }
+ },
+ "grunt-browserify": {
+ "version": "5.3.0",
+ "resolved": "https://registry.npmjs.org/grunt-browserify/-/grunt-browserify-5.3.0.tgz",
+ "integrity": "sha1-R/2M+LrFj+LeaDr9xX9/OoDKeS0=",
+ "dev": true,
+ "requires": {
+ "async": "^2.5.0",
+ "browserify": "^16.0.0",
+ "browserify-incremental": "^3.1.1",
+ "glob": "^7.1.2",
+ "lodash": "^4.17.4",
+ "resolve": "^1.1.6",
+ "watchify": "^3.6.1"
+ },
+ "dependencies": {
+ "async": {
+ "version": "2.6.1",
+ "resolved": "https://registry.npmjs.org/async/-/async-2.6.1.tgz",
+ "integrity": "sha512-fNEiL2+AZt6AlAw/29Cr0UDe4sRAHCpEHh54WMz+Bb7QfNcFw4h3loofyJpLeQs4Yx7yuqu/2dLgM5hKOs6HlQ==",
"dev": true,
"requires": {
- "load-json-file": "^2.0.0",
- "normalize-package-data": "^2.3.2",
- "path-type": "^2.0.0"
+ "lodash": "^4.17.10"
}
},
- "read-pkg-up": {
- "version": "2.0.0",
- "resolved": "https://registry.npmjs.org/read-pkg-up/-/read-pkg-up-2.0.0.tgz",
- "integrity": "sha1-a3KoBImE4MQeeVEP1en6mbO1Sb4=",
+ "glob": {
+ "version": "7.1.2",
+ "resolved": "https://registry.npmjs.org/glob/-/glob-7.1.2.tgz",
+ "integrity": "sha512-MJTUg1kjuLeQCJ+ccE4Vpa6kKVXkPYJ2mOCQyUuKLcLQsdrMCpBPUi8qVE6+YuaJkozeA9NusTAw3hLr8Xe5EQ==",
"dev": true,
"requires": {
- "find-up": "^2.0.0",
- "read-pkg": "^2.0.0"
+ "fs.realpath": "^1.0.0",
+ "inflight": "^1.0.4",
+ "inherits": "2",
+ "minimatch": "^3.0.4",
+ "once": "^1.3.0",
+ "path-is-absolute": "^1.0.0"
}
- },
- "strip-bom": {
- "version": "3.0.0",
- "resolved": "https://registry.npmjs.org/strip-bom/-/strip-bom-3.0.0.tgz",
- "integrity": "sha1-IzTBjpx1n3vdVv3vfprj1YjmjtM=",
- "dev": true
}
}
},
- "eslint-restricted-globals": {
- "version": "0.1.1",
- "resolved": "https://registry.npmjs.org/eslint-restricted-globals/-/eslint-restricted-globals-0.1.1.tgz",
- "integrity": "sha1-NfDVy8ZMLj7WLpO0saevBbp+1Nc=",
- "dev": true
- },
- "eslint-scope": {
- "version": "3.7.1",
- "resolved": "https://registry.npmjs.org/eslint-scope/-/eslint-scope-3.7.1.tgz",
- "integrity": "sha1-PWPD7f2gLgbgGkUq2IyqzHzctug=",
+ "grunt-contrib-clean": {
+ "version": "1.1.0",
+ "resolved": "https://registry.npmjs.org/grunt-contrib-clean/-/grunt-contrib-clean-1.1.0.tgz",
+ "integrity": "sha1-Vkq/LQN4qYOhW54/MO51tzjEBjg=",
"dev": true,
"requires": {
- "esrecurse": "^4.1.0",
- "estraverse": "^4.1.1"
+ "async": "^1.5.2",
+ "rimraf": "^2.5.1"
+ },
+ "dependencies": {
+ "rimraf": {
+ "version": "2.6.2",
+ "resolved": "https://registry.npmjs.org/rimraf/-/rimraf-2.6.2.tgz",
+ "integrity": "sha512-lreewLK/BlghmxtfH36YYVg1i8IAce4TI7oao75I1g245+6BctqTVQiBP3YUJ9C6DQOXJmkYR9X9fCLtCOJc5w==",
+ "dev": true,
+ "requires": {
+ "glob": "^7.0.5"
+ }
+ }
}
},
- "eslint-visitor-keys": {
- "version": "1.0.0",
- "resolved": "https://registry.npmjs.org/eslint-visitor-keys/-/eslint-visitor-keys-1.0.0.tgz",
- "integrity": "sha512-qzm/XxIbxm/FHyH341ZrbnMUpe+5Bocte9xkmFMzPMjRaZMcXww+MpBptFvtU+79L362nqiLhekCxCxDPaUMBQ==",
- "dev": true
- },
- "esm": {
- "version": "3.2.25",
- "resolved": "https://registry.npmjs.org/esm/-/esm-3.2.25.tgz",
- "integrity": "sha512-U1suiZ2oDVWv4zPO56S0NcR5QriEahGtdN2OR6FiOG4WJvcjBVFB0qI4+eKoWFH483PKGuLuu6V8Z4T5g63UVA==",
- "dev": true
- },
- "esprima": {
- "version": "4.0.1",
- "resolved": "https://registry.npmjs.org/esprima/-/esprima-4.0.1.tgz",
- "integrity": "sha512-eGuFFw7Upda+g4p+QHvnW0RyTX/SVeJBDM/gCtMARO0cLuT2HcEKnTPvhjV6aGeqrCB/sbNop0Kszm0jsaWU4A==",
- "dev": true
- },
- "esquery": {
- "version": "1.0.0",
- "resolved": "https://registry.npmjs.org/esquery/-/esquery-1.0.0.tgz",
- "integrity": "sha1-z7qLV9f7qT8XKYqKAGoEzaE9gPo=",
+ "grunt-contrib-connect": {
+ "version": "1.0.2",
+ "resolved": "https://registry.npmjs.org/grunt-contrib-connect/-/grunt-contrib-connect-1.0.2.tgz",
+ "integrity": "sha1-XPkzuRpnOGBEJzwLJERgPNmIebo=",
"dev": true,
"requires": {
- "estraverse": "^4.0.0"
+ "async": "^1.5.2",
+ "connect": "^3.4.0",
+ "connect-livereload": "^0.5.0",
+ "http2": "^3.3.4",
+ "morgan": "^1.6.1",
+ "opn": "^4.0.0",
+ "portscanner": "^1.0.0",
+ "serve-index": "^1.7.1",
+ "serve-static": "^1.10.0"
}
},
- "esrecurse": {
- "version": "4.2.0",
- "resolved": "https://registry.npmjs.org/esrecurse/-/esrecurse-4.2.0.tgz",
- "integrity": "sha1-+pVo2Y04I/mkHZHpAtyrnqblsWM=",
+ "grunt-contrib-copy": {
+ "version": "1.0.0",
+ "resolved": "https://registry.npmjs.org/grunt-contrib-copy/-/grunt-contrib-copy-1.0.0.tgz",
+ "integrity": "sha1-cGDGWB6QS4qw0A8HbgqPbj58NXM=",
"dev": true,
"requires": {
- "estraverse": "^4.1.0",
- "object-assign": "^4.0.1"
+ "chalk": "^1.1.1",
+ "file-sync-cmp": "^0.1.0"
}
},
- "estraverse": {
- "version": "4.2.0",
- "resolved": "https://registry.npmjs.org/estraverse/-/estraverse-4.2.0.tgz",
- "integrity": "sha1-De4/7TH81GlhjOc0IJn8GvoL2xM=",
- "dev": true
- },
- "estree-walker": {
- "version": "1.0.1",
- "resolved": "https://registry.npmjs.org/estree-walker/-/estree-walker-1.0.1.tgz",
- "integrity": "sha512-1fMXF3YP4pZZVozF8j/ZLfvnR8NSIljt56UhbZ5PeeDmmGHpgpdwQt7ITlGvYaQukCvuBRMLEiKiYC+oeIg4cg==",
- "dev": true
- },
- "esutils": {
- "version": "2.0.2",
- "resolved": "https://registry.npmjs.org/esutils/-/esutils-2.0.2.tgz",
- "integrity": "sha1-Cr9PHKpbyx96nYrMbepPqqBLrJs=",
- "dev": true
- },
- "eventemitter3": {
- "version": "4.0.0",
- "resolved": "https://registry.npmjs.org/eventemitter3/-/eventemitter3-4.0.0.tgz",
- "integrity": "sha512-qerSRB0p+UDEssxTtm6EDKcE7W4OaoisfIMl4CngyEhjpYglocpNg6UEqCvemdGhosAsg4sO2dXJOdyBifPGCg==",
- "dev": true
- },
- "external-editor": {
- "version": "2.1.0",
- "resolved": "https://registry.npmjs.org/external-editor/-/external-editor-2.1.0.tgz",
- "integrity": "sha512-E44iT5QVOUJBKij4IIV3uvxuNlbKS38Tw1HiupxEIHPv9qtC2PrDYohbXV5U+1jnfIXttny8gUhj+oZvflFlzA==",
+ "grunt-contrib-watch": {
+ "version": "1.1.0",
+ "resolved": "https://registry.npmjs.org/grunt-contrib-watch/-/grunt-contrib-watch-1.1.0.tgz",
+ "integrity": "sha512-yGweN+0DW5yM+oo58fRu/XIRrPcn3r4tQx+nL7eMRwjpvk+rQY6R8o94BPK0i2UhTg9FN21hS+m8vR8v9vXfeg==",
"dev": true,
"requires": {
- "chardet": "^0.4.0",
- "iconv-lite": "^0.4.17",
- "tmp": "^0.0.33"
+ "async": "^2.6.0",
+ "gaze": "^1.1.0",
+ "lodash": "^4.17.10",
+ "tiny-lr": "^1.1.1"
+ },
+ "dependencies": {
+ "async": {
+ "version": "2.6.1",
+ "resolved": "https://registry.npmjs.org/async/-/async-2.6.1.tgz",
+ "integrity": "sha512-fNEiL2+AZt6AlAw/29Cr0UDe4sRAHCpEHh54WMz+Bb7QfNcFw4h3loofyJpLeQs4Yx7yuqu/2dLgM5hKOs6HlQ==",
+ "dev": true,
+ "requires": {
+ "lodash": "^4.17.10"
+ }
+ }
}
},
- "fast-deep-equal": {
- "version": "1.0.0",
- "resolved": "https://registry.npmjs.org/fast-deep-equal/-/fast-deep-equal-1.0.0.tgz",
- "integrity": "sha1-liVqO8l1WV6zbYLpkp0GDYk0Of8=",
- "dev": true
- },
- "fast-json-stable-stringify": {
- "version": "2.0.0",
- "resolved": "https://registry.npmjs.org/fast-json-stable-stringify/-/fast-json-stable-stringify-2.0.0.tgz",
- "integrity": "sha1-1RQsDK7msRifh9OnYREGT4bIu/I=",
- "dev": true
- },
- "fast-levenshtein": {
- "version": "2.0.6",
- "resolved": "https://registry.npmjs.org/fast-levenshtein/-/fast-levenshtein-2.0.6.tgz",
- "integrity": "sha1-PYpcZog6FqMMqGQ+hR8Zuqd5eRc=",
- "dev": true
- },
- "file-entry-cache": {
- "version": "2.0.0",
- "resolved": "https://registry.npmjs.org/file-entry-cache/-/file-entry-cache-2.0.0.tgz",
- "integrity": "sha1-w5KZDD5oR4PYOLjISkXYoEhFg2E=",
+ "grunt-header": {
+ "version": "1.1.0",
+ "resolved": "https://registry.npmjs.org/grunt-header/-/grunt-header-1.1.0.tgz",
+ "integrity": "sha1-E5OD3hANmJOc4WynnGc2luN1vss=",
"dev": true,
"requires": {
- "flat-cache": "^1.2.1",
- "object-assign": "^4.0.1"
+ "detect-newline": "^2.1.0"
}
},
- "fill-range": {
- "version": "7.0.1",
- "resolved": "https://registry.npmjs.org/fill-range/-/fill-range-7.0.1.tgz",
- "integrity": "sha512-qOo9F+dMUmC2Lcb4BbVvnKJxTPjCm+RRpe4gDuGrzkL7mEVl/djYSu2OdQ2Pa302N4oqkSg9ir6jaLWJ2USVpQ==",
+ "grunt-jsbeautifier": {
+ "version": "0.2.13",
+ "resolved": "https://registry.npmjs.org/grunt-jsbeautifier/-/grunt-jsbeautifier-0.2.13.tgz",
+ "integrity": "sha1-89QXOPy1+ZhO8pbVvuvEBIkQVkI=",
"dev": true,
"requires": {
- "to-regex-range": "^5.0.1"
+ "async": "^2.0.0-rc.3",
+ "grunt": ">=0.4.1",
+ "js-beautify": ">=1.4.2",
+ "lodash": ">=2.4.1",
+ "rc": ">=0.5.5",
+ "semver": ">=4.3.1",
+ "underscore.string": ">=2.3.3"
},
"dependencies": {
- "to-regex-range": {
- "version": "5.0.1",
- "resolved": "https://registry.npmjs.org/to-regex-range/-/to-regex-range-5.0.1.tgz",
- "integrity": "sha512-65P7iz6X5yEr1cwcgvQxbbIw7Uk3gOy5dIdtZ4rDveLqhrdJP+Li/Hx6tyK0NEb+2GCyneCMJiGqrADCSNk8sQ==",
+ "async": {
+ "version": "2.6.0",
+ "resolved": "https://registry.npmjs.org/async/-/async-2.6.0.tgz",
+ "integrity": "sha512-xAfGg1/NTLBBKlHFmnd7PlmUW9KhVQIUuSrYem9xzFUZy13ScvtyGGejaae9iAVRiRq9+Cx7DPFaAAhCpyxyPw==",
"dev": true,
"requires": {
- "is-number": "^7.0.0"
+ "lodash": "^4.14.0"
}
}
}
},
- "find-cache-dir": {
- "version": "2.1.0",
- "resolved": "https://registry.npmjs.org/find-cache-dir/-/find-cache-dir-2.1.0.tgz",
- "integrity": "sha512-Tq6PixE0w/VMFfCgbONnkiQIVol/JJL7nRMi20fqzA4NRs9AfeqMGeRdPi3wIhYkxjeBaWh2rxwapn5Tu3IqOQ==",
+ "grunt-jsdoc": {
+ "version": "2.2.1",
+ "resolved": "https://registry.npmjs.org/grunt-jsdoc/-/grunt-jsdoc-2.2.1.tgz",
+ "integrity": "sha512-33QZYBYjv2Ph3H2ygqXHn/o0ttfptw1f9QciOTgvzhzUeiPrnvzMNUApTPtw22T6zgReE5FZ1RR58U2wnK/l+w==",
"dev": true,
"requires": {
- "commondir": "^1.0.1",
- "make-dir": "^2.0.0",
- "pkg-dir": "^3.0.0"
+ "cross-spawn": "^3.0.1",
+ "jsdoc": "~3.5.5",
+ "marked": "^0.3.9"
},
"dependencies": {
- "find-up": {
- "version": "3.0.0",
- "resolved": "https://registry.npmjs.org/find-up/-/find-up-3.0.0.tgz",
- "integrity": "sha512-1yD6RmLI1XBfxugvORwlck6f75tYL+iR0jqwsOrOxMZyGYqUuDhJ0l4AXdO1iX/FTs9cBAMEk1gWSEx1kSbylg==",
- "dev": true,
- "requires": {
- "locate-path": "^3.0.0"
- }
- },
- "locate-path": {
- "version": "3.0.0",
- "resolved": "https://registry.npmjs.org/locate-path/-/locate-path-3.0.0.tgz",
- "integrity": "sha512-7AO748wWnIhNqAuaty2ZWHkQHRSNfPVIsPIfwEOWO22AmaoVrWavlOcMR5nzTLNYvp36X220/maaRsrec1G65A==",
- "dev": true,
- "requires": {
- "p-locate": "^3.0.0",
- "path-exists": "^3.0.0"
- }
- },
- "p-limit": {
- "version": "2.3.0",
- "resolved": "https://registry.npmjs.org/p-limit/-/p-limit-2.3.0.tgz",
- "integrity": "sha512-//88mFWSJx8lxCzwdAABTJL2MyWB12+eIY7MDL2SqLmAkeKU9qxRvWuSyTjm3FUmpBEMuFfckAIqEaVGUDxb6w==",
- "dev": true,
- "requires": {
- "p-try": "^2.0.0"
- }
- },
- "p-locate": {
- "version": "3.0.0",
- "resolved": "https://registry.npmjs.org/p-locate/-/p-locate-3.0.0.tgz",
- "integrity": "sha512-x+12w/To+4GFfgJhBEpiDcLozRJGegY+Ei7/z0tSLkMmxGZNybVMSfWj9aJn8Z5Fc7dBUNJOOVgPv2H7IwulSQ==",
+ "cross-spawn": {
+ "version": "3.0.1",
+ "resolved": "https://registry.npmjs.org/cross-spawn/-/cross-spawn-3.0.1.tgz",
+ "integrity": "sha1-ElYDfsufDF9549bvE14wdwGEuYI=",
"dev": true,
"requires": {
- "p-limit": "^2.0.0"
+ "lru-cache": "^4.0.1",
+ "which": "^1.2.9"
}
},
- "p-try": {
- "version": "2.2.0",
- "resolved": "https://registry.npmjs.org/p-try/-/p-try-2.2.0.tgz",
- "integrity": "sha512-R4nPAVTAU0B9D35/Gk3uJf/7XYbQcyohSKdvAxIRSNghFl4e71hVoGnBNQz9cWaXxO2I10KTC+3jMdvvoKw6dQ==",
- "dev": true
- },
- "path-exists": {
- "version": "3.0.0",
- "resolved": "https://registry.npmjs.org/path-exists/-/path-exists-3.0.0.tgz",
- "integrity": "sha1-zg6+ql94yxiSXqfYENe1mwEP1RU=",
- "dev": true
- },
- "pkg-dir": {
- "version": "3.0.0",
- "resolved": "https://registry.npmjs.org/pkg-dir/-/pkg-dir-3.0.0.tgz",
- "integrity": "sha512-/E57AYkoeQ25qkxMj5PBOVgF8Kiu/h7cYS30Z5+R7WaiCCBfLq58ZI/dSeaEKb9WVJV5n/03QwrN3IeWIFllvw==",
+ "lru-cache": {
+ "version": "4.1.1",
+ "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-4.1.1.tgz",
+ "integrity": "sha512-q4spe4KTfsAS1SUHLO0wz8Qiyf1+vMIAgpRYioFYDMNqKfHQbg+AVDH3i4fvpl71/P1L0dBl+fQi+P37UYf0ew==",
"dev": true,
"requires": {
- "find-up": "^3.0.0"
+ "pseudomap": "^1.0.2",
+ "yallist": "^2.1.2"
}
}
}
},
- "find-up": {
- "version": "1.1.2",
- "resolved": "https://registry.npmjs.org/find-up/-/find-up-1.1.2.tgz",
- "integrity": "sha1-ay6YIrGizgpgq2TWEOzK1TyyTQ8=",
- "dev": true,
- "requires": {
- "path-exists": "^2.0.0",
- "pinkie-promise": "^2.0.0"
- }
+ "grunt-known-options": {
+ "version": "1.1.1",
+ "resolved": "https://registry.npmjs.org/grunt-known-options/-/grunt-known-options-1.1.1.tgz",
+ "integrity": "sha512-cHwsLqoighpu7TuYj5RonnEuxGVFnztcUqTqp5rXFGYL4OuPFofwC4Ycg7n9fYwvK6F5WbYgeVOwph9Crs2fsQ==",
+ "dev": true
},
- "flat-cache": {
- "version": "1.3.0",
- "resolved": "https://registry.npmjs.org/flat-cache/-/flat-cache-1.3.0.tgz",
- "integrity": "sha1-0wMLMrOBVPTjt+nHCfSQ9++XxIE=",
+ "grunt-legacy-log": {
+ "version": "2.0.0",
+ "resolved": "https://registry.npmjs.org/grunt-legacy-log/-/grunt-legacy-log-2.0.0.tgz",
+ "integrity": "sha512-1m3+5QvDYfR1ltr8hjiaiNjddxGdQWcH0rw1iKKiQnF0+xtgTazirSTGu68RchPyh1OBng1bBUjLmX8q9NpoCw==",
"dev": true,
"requires": {
- "circular-json": "^0.3.1",
- "del": "^2.0.2",
- "graceful-fs": "^4.1.2",
- "write": "^0.2.1"
+ "colors": "~1.1.2",
+ "grunt-legacy-log-utils": "~2.0.0",
+ "hooker": "~0.2.3",
+ "lodash": "~4.17.5"
}
},
- "follow-redirects": {
- "version": "1.11.0",
- "resolved": "https://registry.npmjs.org/follow-redirects/-/follow-redirects-1.11.0.tgz",
- "integrity": "sha512-KZm0V+ll8PfBrKwMzdo5D13b1bur9Iq9Zd/RMmAoQQcl2PxxFml8cxXPaaPYVbV0RjNjq1CU7zIzAOqtUPudmA==",
+ "grunt-legacy-log-utils": {
+ "version": "2.0.1",
+ "resolved": "https://registry.npmjs.org/grunt-legacy-log-utils/-/grunt-legacy-log-utils-2.0.1.tgz",
+ "integrity": "sha512-o7uHyO/J+i2tXG8r2bZNlVk20vlIFJ9IEYyHMCQGfWYru8Jv3wTqKZzvV30YW9rWEjq0eP3cflQ1qWojIe9VFA==",
"dev": true,
"requires": {
- "debug": "^3.0.0"
+ "chalk": "~2.4.1",
+ "lodash": "~4.17.10"
},
"dependencies": {
- "debug": {
- "version": "3.2.6",
- "resolved": "https://registry.npmjs.org/debug/-/debug-3.2.6.tgz",
- "integrity": "sha512-mel+jf7nrtEl5Pn1Qx46zARXKDpBbvzezse7p7LqINmdoIk8PYP5SySaxEmYv6TZ0JyEKA1hsCId6DIhgITtWQ==",
+ "ansi-styles": {
+ "version": "3.2.1",
+ "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-3.2.1.tgz",
+ "integrity": "sha512-VT0ZI6kZRdTh8YyJw3SMbYm/u+NqfsAxEpWO0Pf9sq8/e94WxxOpPKx9FR1FlyCtOVDNOQ+8ntlqFxiRc+r5qA==",
+ "dev": true,
+ "requires": {
+ "color-convert": "^1.9.0"
+ }
+ },
+ "chalk": {
+ "version": "2.4.2",
+ "resolved": "https://registry.npmjs.org/chalk/-/chalk-2.4.2.tgz",
+ "integrity": "sha512-Mti+f9lpJNcwF4tWV8/OrTTtF1gZi+f8FqlyAdouralcFWFQWF2+NgCHShjkCb+IFBLq9buZwE1xckQU4peSuQ==",
"dev": true,
"requires": {
- "ms": "^2.1.1"
+ "ansi-styles": "^3.2.1",
+ "escape-string-regexp": "^1.0.5",
+ "supports-color": "^5.3.0"
}
},
- "ms": {
- "version": "2.1.2",
- "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.2.tgz",
- "integrity": "sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w==",
- "dev": true
+ "supports-color": {
+ "version": "5.5.0",
+ "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-5.5.0.tgz",
+ "integrity": "sha512-QjVjwdXIt408MIiAqCX4oUKsgU2EqAGzs2Ppkm4aQYbjm+ZEWEcW4SfFNTr4uMNZma0ey4f5lgLrkB0aX0QMow==",
+ "dev": true,
+ "requires": {
+ "has-flag": "^3.0.0"
+ }
}
}
},
- "foreground-child": {
- "version": "1.5.6",
- "resolved": "https://registry.npmjs.org/foreground-child/-/foreground-child-1.5.6.tgz",
- "integrity": "sha1-T9ca0t/elnibmApcCilZN8svXOk=",
+ "grunt-legacy-util": {
+ "version": "1.1.1",
+ "resolved": "https://registry.npmjs.org/grunt-legacy-util/-/grunt-legacy-util-1.1.1.tgz",
+ "integrity": "sha512-9zyA29w/fBe6BIfjGENndwoe1Uy31BIXxTH3s8mga0Z5Bz2Sp4UCjkeyv2tI449ymkx3x26B+46FV4fXEddl5A==",
"dev": true,
"requires": {
- "cross-spawn": "^4",
- "signal-exit": "^3.0.0"
+ "async": "~1.5.2",
+ "exit": "~0.1.1",
+ "getobject": "~0.1.0",
+ "hooker": "~0.2.3",
+ "lodash": "~4.17.10",
+ "underscore.string": "~3.3.4",
+ "which": "~1.3.0"
},
"dependencies": {
- "cross-spawn": {
- "version": "4.0.2",
- "resolved": "https://registry.npmjs.org/cross-spawn/-/cross-spawn-4.0.2.tgz",
- "integrity": "sha1-e5JHYhwjrf3ThWAEqCPL45dCTUE=",
- "dev": true,
- "requires": {
- "lru-cache": "^4.0.1",
- "which": "^1.2.9"
- }
- },
- "lru-cache": {
- "version": "4.1.5",
- "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-4.1.5.tgz",
- "integrity": "sha512-sWZlbEP2OsHNkXrMl5GYk/jKk70MBng6UU4YI/qGDYbgf6YbP4EvmqISbXCoJiRKs+1bSpFHVgQxvJ17F2li5g==",
+ "which": {
+ "version": "1.3.1",
+ "resolved": "https://registry.npmjs.org/which/-/which-1.3.1.tgz",
+ "integrity": "sha512-HxJdYWq1MTIQbJ3nw0cqssHoTNU267KlrDuGZ1WYlxDStUtKUhOaJmh112/TZmHxxUfuJqPXSOm7tDyas0OSIQ==",
"dev": true,
"requires": {
- "pseudomap": "^1.0.2",
- "yallist": "^2.1.2"
+ "isexe": "^2.0.0"
}
}
}
},
- "fs.realpath": {
- "version": "1.0.0",
- "resolved": "https://registry.npmjs.org/fs.realpath/-/fs.realpath-1.0.0.tgz",
- "integrity": "sha1-FQStJSMVjKpA20onh8sBQRmU6k8=",
- "dev": true
- },
- "function-bind": {
- "version": "1.1.1",
- "resolved": "https://registry.npmjs.org/function-bind/-/function-bind-1.1.1.tgz",
- "integrity": "sha512-yIovAzMX49sF8Yl58fSCWJ5svSLuaibPxXQJFLmBObTuCr0Mf1KiPopGM9NiFjiYBCbfaa2Fh6breQ6ANVTI0A==",
- "dev": true
- },
- "functional-red-black-tree": {
- "version": "1.0.1",
- "resolved": "https://registry.npmjs.org/functional-red-black-tree/-/functional-red-black-tree-1.0.1.tgz",
- "integrity": "sha1-GwqzvVU7Kg1jmdKcDj6gslIHgyc=",
- "dev": true
- },
- "get-caller-file": {
- "version": "2.0.5",
- "resolved": "https://registry.npmjs.org/get-caller-file/-/get-caller-file-2.0.5.tgz",
- "integrity": "sha512-DyFP3BM/3YHTQOCUL/w0OZHR0lpKeGrxotcHWcqNEdnltqFwXVfhEBQ94eIo34AfQpo0rGki4cyIiftY06h2Fg==",
- "dev": true
- },
- "get-func-name": {
- "version": "2.0.0",
- "resolved": "https://registry.npmjs.org/get-func-name/-/get-func-name-2.0.0.tgz",
- "integrity": "sha1-6td0q+5y4gQJQzoGY2YCPdaIekE=",
- "dev": true
- },
- "glob": {
- "version": "7.0.6",
- "resolved": "https://registry.npmjs.org/glob/-/glob-7.0.6.tgz",
- "integrity": "sha1-IRuvr0nlJbjNkyYNFKsTYVKz9Xo=",
+ "grunt-mocha-test": {
+ "version": "0.13.3",
+ "resolved": "https://registry.npmjs.org/grunt-mocha-test/-/grunt-mocha-test-0.13.3.tgz",
+ "integrity": "sha512-zQGEsi3d+ViPPi7/4jcj78afKKAKiAA5n61pknQYi25Ugik+aNOuRmiOkmb8mN2CeG8YxT+YdT1H1Q7B/eNkoQ==",
"dev": true,
"requires": {
- "fs.realpath": "^1.0.0",
- "inflight": "^1.0.4",
- "inherits": "2",
- "minimatch": "^3.0.2",
- "once": "^1.3.0",
- "path-is-absolute": "^1.0.0"
+ "hooker": "^0.2.3",
+ "mkdirp": "^0.5.0"
}
},
- "globals": {
- "version": "11.12.0",
- "resolved": "https://registry.npmjs.org/globals/-/globals-11.12.0.tgz",
- "integrity": "sha512-WOBp/EEGUiIsJSp7wcv/y6MO+lV9UoncWqxuFfm8eBwzWNgyfBd6Gz+IeKQ9jCmyhoH99g15M3T+QaVHFjizVA==",
- "dev": true
- },
- "globby": {
- "version": "5.0.0",
- "resolved": "https://registry.npmjs.org/globby/-/globby-5.0.0.tgz",
- "integrity": "sha1-69hGZ8oNuzMLmbz8aOrCvFQ3Dg0=",
+ "grunt-simple-nyc": {
+ "version": "3.0.1",
+ "resolved": "https://registry.npmjs.org/grunt-simple-nyc/-/grunt-simple-nyc-3.0.1.tgz",
+ "integrity": "sha512-/YLY+jNI6gBuVO3xu07zwvDN+orTAFS50W00yb/2ncvc2PFO4pR+oU7TyiHhe8a6O3KuQDHsyCE0iE+rqJagQg==",
"dev": true,
"requires": {
- "array-union": "^1.0.1",
- "arrify": "^1.0.0",
- "glob": "^7.0.3",
- "object-assign": "^4.0.1",
- "pify": "^2.0.0",
- "pinkie-promise": "^2.0.0"
+ "lodash": "^4.17.15",
+ "nyc": "^14.1.0",
+ "simple-cli": "^5.0.3"
}
},
- "graceful-fs": {
- "version": "4.1.11",
- "resolved": "https://registry.npmjs.org/graceful-fs/-/graceful-fs-4.1.11.tgz",
- "integrity": "sha1-Dovf5NHduIVNZOBOp8AOKgJuVlg="
+ "grunt-terser": {
+ "version": "0.1.0",
+ "resolved": "https://registry.npmjs.org/grunt-terser/-/grunt-terser-0.1.0.tgz",
+ "integrity": "sha1-l5pXHR7ZdkdzgZ2w9X3Ua8ipxdU=",
+ "dev": true,
+ "requires": {
+ "terser": "^3.8.0"
+ }
},
- "graceful-readlink": {
- "version": "1.0.1",
- "resolved": "https://registry.npmjs.org/graceful-readlink/-/graceful-readlink-1.0.1.tgz",
- "integrity": "sha1-TK+tdrxi8C+gObL5Tpo906ORpyU=",
+ "grunt-text-replace": {
+ "version": "0.4.0",
+ "resolved": "https://registry.npmjs.org/grunt-text-replace/-/grunt-text-replace-0.4.0.tgz",
+ "integrity": "sha1-252c5Z4v5J2id+nbwZXD4Rz7FsI=",
"dev": true
},
- "growl": {
- "version": "1.10.3",
- "resolved": "https://registry.npmjs.org/growl/-/growl-1.10.3.tgz",
- "integrity": "sha512-hKlsbA5Vu3xsh1Cg3J7jSmX/WaW6A5oBeqzM88oNbCRQFz+zUaXm6yxS4RVytp1scBoJzSYl4YAEOQIt6O8V1Q==",
- "dev": true
+ "gruntify-eslint": {
+ "version": "4.0.0",
+ "resolved": "https://registry.npmjs.org/gruntify-eslint/-/gruntify-eslint-4.0.0.tgz",
+ "integrity": "sha512-wEa2WjMGVDzQbq1QmOiDX51/CfaAIS5xx1oSKIjfWVLl/fYbV7PtfWsUhuaQrPIy1se4Crpg3kZFZndw02l16g==",
+ "dev": true,
+ "requires": {
+ "eslint": "^4.0.0"
+ }
},
"has": {
"version": "1.0.1",
@@ -1688,6 +4554,76 @@
"integrity": "sha1-tdRU3CGZriJWmfNGfloH87lVuv0=",
"dev": true
},
+ "has-value": {
+ "version": "1.0.0",
+ "resolved": "https://registry.npmjs.org/has-value/-/has-value-1.0.0.tgz",
+ "integrity": "sha1-GLKB2lhbHFxR3vJMkw7SmgvmsXc=",
+ "dev": true,
+ "requires": {
+ "get-value": "^2.0.6",
+ "has-values": "^1.0.0",
+ "isobject": "^3.0.0"
+ },
+ "dependencies": {
+ "isobject": {
+ "version": "3.0.1",
+ "resolved": "https://registry.npmjs.org/isobject/-/isobject-3.0.1.tgz",
+ "integrity": "sha1-TkMekrEalzFjaqH5yNHMvP2reN8=",
+ "dev": true
+ }
+ }
+ },
+ "has-values": {
+ "version": "1.0.0",
+ "resolved": "https://registry.npmjs.org/has-values/-/has-values-1.0.0.tgz",
+ "integrity": "sha1-lbC2P+whRmGab+V/51Yo1aOe/k8=",
+ "dev": true,
+ "requires": {
+ "is-number": "^3.0.0",
+ "kind-of": "^4.0.0"
+ },
+ "dependencies": {
+ "is-number": {
+ "version": "3.0.0",
+ "resolved": "https://registry.npmjs.org/is-number/-/is-number-3.0.0.tgz",
+ "integrity": "sha1-JP1iAaR4LPUFYcgQJ2r8fRLXEZU=",
+ "dev": true,
+ "requires": {
+ "kind-of": "^3.0.2"
+ },
+ "dependencies": {
+ "kind-of": {
+ "version": "3.2.2",
+ "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-3.2.2.tgz",
+ "integrity": "sha1-MeohpzS6ubuw8yRm2JOupR5KPGQ=",
+ "dev": true,
+ "requires": {
+ "is-buffer": "^1.1.5"
+ }
+ }
+ }
+ },
+ "kind-of": {
+ "version": "4.0.0",
+ "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-4.0.0.tgz",
+ "integrity": "sha1-IIE989cSkosgc3hpGkUGb65y3Vc=",
+ "dev": true,
+ "requires": {
+ "is-buffer": "^1.1.5"
+ }
+ }
+ }
+ },
+ "hash-base": {
+ "version": "3.0.4",
+ "resolved": "https://registry.npmjs.org/hash-base/-/hash-base-3.0.4.tgz",
+ "integrity": "sha1-X8hoaEfs1zSZQDMZprCj8/auSRg=",
+ "dev": true,
+ "requires": {
+ "inherits": "^2.0.1",
+ "safe-buffer": "^5.0.1"
+ }
+ },
"hash.js": {
"version": "1.1.3",
"resolved": "https://registry.npmjs.org/hash.js/-/hash.js-1.1.3.tgz",
@@ -1724,6 +4660,22 @@
"minimalistic-crypto-utils": "^1.0.1"
}
},
+ "home-or-tmp": {
+ "version": "2.0.0",
+ "resolved": "https://registry.npmjs.org/home-or-tmp/-/home-or-tmp-2.0.0.tgz",
+ "integrity": "sha1-42w/LSyufXRqhX440Y1fMqeILbg=",
+ "dev": true,
+ "requires": {
+ "os-homedir": "^1.0.0",
+ "os-tmpdir": "^1.0.1"
+ }
+ },
+ "hooker": {
+ "version": "0.2.3",
+ "resolved": "https://registry.npmjs.org/hooker/-/hooker-0.2.3.tgz",
+ "integrity": "sha1-uDT3I8xKJCqmWWNFnfbZhMXT2Vk=",
+ "dev": true
+ },
"hosted-git-info": {
"version": "2.5.0",
"resolved": "https://registry.npmjs.org/hosted-git-info/-/hosted-git-info-2.5.0.tgz",
@@ -1731,60 +4683,47 @@
"dev": true
},
"html-escaper": {
- "version": "2.0.2",
- "resolved": "https://registry.npmjs.org/html-escaper/-/html-escaper-2.0.2.tgz",
- "integrity": "sha512-H2iMtd0I4Mt5eYiapRdIDjp+XzelXQ0tFE4JS7YFwFevXXMmOp9myNrUvCg0D6ws8iqkRPBfKHgbwig1SmlLfg==",
+ "version": "2.0.0",
+ "resolved": "https://registry.npmjs.org/html-escaper/-/html-escaper-2.0.0.tgz",
+ "integrity": "sha512-a4u9BeERWGu/S8JiWEAQcdrg9v4QArtP9keViQjGMdff20fBdd8waotXaNmODqBe6uZ3Nafi7K/ho4gCQHV3Ig==",
"dev": true
},
- "http-proxy": {
- "version": "1.18.0",
- "resolved": "https://registry.npmjs.org/http-proxy/-/http-proxy-1.18.0.tgz",
- "integrity": "sha512-84I2iJM/n1d4Hdgc6y2+qY5mDaz2PUVjlg9znE9byl+q0uC3DeByqBGReQu5tpLK0TAqTIXScRUV+dg7+bUPpQ==",
- "dev": true,
- "requires": {
- "eventemitter3": "^4.0.0",
- "follow-redirects": "^1.0.0",
- "requires-port": "^1.0.0"
- }
+ "htmlescape": {
+ "version": "1.1.1",
+ "resolved": "https://registry.npmjs.org/htmlescape/-/htmlescape-1.1.1.tgz",
+ "integrity": "sha1-OgPtwiFLyjtmQko+eVk0lQnLA1E=",
+ "dev": true
},
- "http-server": {
- "version": "0.12.3",
- "resolved": "https://registry.npmjs.org/http-server/-/http-server-0.12.3.tgz",
- "integrity": "sha512-be0dKG6pni92bRjq0kvExtj/NrrAd28/8fCXkaI/4piTwQMSDSLMhWyW0NI1V+DBI3aa1HMlQu46/HjVLfmugA==",
+ "http-errors": {
+ "version": "1.6.2",
+ "resolved": "https://registry.npmjs.org/http-errors/-/http-errors-1.6.2.tgz",
+ "integrity": "sha1-CgAsyFcHGSp+eUbO7cERVfYOxzY=",
"dev": true,
"requires": {
- "basic-auth": "^1.0.3",
- "colors": "^1.4.0",
- "corser": "^2.0.1",
- "ecstatic": "^3.3.2",
- "http-proxy": "^1.18.0",
- "minimist": "^1.2.5",
- "opener": "^1.5.1",
- "portfinder": "^1.0.25",
- "secure-compare": "3.0.1",
- "union": "~0.5.0"
- },
- "dependencies": {
- "basic-auth": {
- "version": "1.1.0",
- "resolved": "https://registry.npmjs.org/basic-auth/-/basic-auth-1.1.0.tgz",
- "integrity": "sha1-RSIe5Cn37h5QNb4/UVM/HN/SmIQ=",
- "dev": true
- },
- "colors": {
- "version": "1.4.0",
- "resolved": "https://registry.npmjs.org/colors/-/colors-1.4.0.tgz",
- "integrity": "sha512-a+UqTh4kgZg/SlGvfbzDHpgRu7AAQOmmqRHJnxhRZICKFUT91brVhNNt58CMWU9PsBbv3PDCZUHbVxuDiH2mtA==",
- "dev": true
- },
- "minimist": {
- "version": "1.2.5",
- "resolved": "https://registry.npmjs.org/minimist/-/minimist-1.2.5.tgz",
- "integrity": "sha512-FM9nNUYrRBAELZQT3xeZQ7fmMOBg6nWNmJKTcgsJeaLstP/UODVpGsr5OhXhhXg6f+qtJ8uiZ+PUxkDWcgIXLw==",
- "dev": true
- }
+ "depd": "1.1.1",
+ "inherits": "2.0.3",
+ "setprototypeof": "1.0.3",
+ "statuses": ">= 1.3.1 < 2"
}
},
+ "http-parser-js": {
+ "version": "0.4.13",
+ "resolved": "https://registry.npmjs.org/http-parser-js/-/http-parser-js-0.4.13.tgz",
+ "integrity": "sha1-O9bW/ebjFyyTNMOzO2wZPYD+ETc=",
+ "dev": true
+ },
+ "http2": {
+ "version": "3.3.7",
+ "resolved": "https://registry.npmjs.org/http2/-/http2-3.3.7.tgz",
+ "integrity": "sha512-puSi8M8WNlFJm9Pk4c/Mbz9Gwparuj3gO9/RRO5zv6piQ0FY+9Qywp0PdWshYgsMJSalixFY7eC6oPu0zRxLAQ==",
+ "dev": true
+ },
+ "https-browserify": {
+ "version": "1.0.0",
+ "resolved": "https://registry.npmjs.org/https-browserify/-/https-browserify-1.0.0.tgz",
+ "integrity": "sha1-7AbBDgo0wPL68Zn3/X/Hj//QPHM=",
+ "dev": true
+ },
"iconv-lite": {
"version": "0.4.19",
"resolved": "https://registry.npmjs.org/iconv-lite/-/iconv-lite-0.4.19.tgz",
@@ -1808,6 +4747,15 @@
"resolved": "https://registry.npmjs.org/imurmurhash/-/imurmurhash-0.1.4.tgz",
"integrity": "sha1-khi5srkoojixPcT7a21XbyMUU+o="
},
+ "indent-string": {
+ "version": "2.1.0",
+ "resolved": "https://registry.npmjs.org/indent-string/-/indent-string-2.1.0.tgz",
+ "integrity": "sha1-ji1INIdCEhtKghi3oTfppSBJ3IA=",
+ "dev": true,
+ "requires": {
+ "repeating": "^2.0.0"
+ }
+ },
"inflight": {
"version": "1.0.6",
"resolved": "https://registry.npmjs.org/inflight/-/inflight-1.0.6.tgz",
@@ -1823,6 +4771,21 @@
"resolved": "https://registry.npmjs.org/inherits/-/inherits-2.0.3.tgz",
"integrity": "sha1-Yzwsg+PaQqUC9SRmAiSA9CCCYd4="
},
+ "ini": {
+ "version": "1.3.5",
+ "resolved": "https://registry.npmjs.org/ini/-/ini-1.3.5.tgz",
+ "integrity": "sha512-RZY5huIKCMRWDUqZlEi72f/lmXKMvuszcMBduliQ3nnWbx9X/ZBQO7DijMEYS9EhHBb2qacRUMtC7svLwe0lcw==",
+ "dev": true
+ },
+ "inline-source-map": {
+ "version": "0.6.2",
+ "resolved": "https://registry.npmjs.org/inline-source-map/-/inline-source-map-0.6.2.tgz",
+ "integrity": "sha1-+Tk0ccGKedFyT4Y/o4tYY3Ct4qU=",
+ "dev": true,
+ "requires": {
+ "source-map": "~0.5.3"
+ }
+ },
"inquirer": {
"version": "3.3.0",
"resolved": "https://registry.npmjs.org/inquirer/-/inquirer-3.3.0.tgz",
@@ -1922,38 +4885,153 @@
}
}
},
- "is-arrayish": {
- "version": "0.2.1",
- "resolved": "https://registry.npmjs.org/is-arrayish/-/is-arrayish-0.2.1.tgz",
- "integrity": "sha1-d8mYQFJ6qOyxqLppe4BkWnqSap0=",
+ "insert-module-globals": {
+ "version": "7.2.0",
+ "resolved": "https://registry.npmjs.org/insert-module-globals/-/insert-module-globals-7.2.0.tgz",
+ "integrity": "sha512-VE6NlW+WGn2/AeOMd496AHFYmE7eLKkUY6Ty31k4og5vmA3Fjuwe9v6ifH6Xx/Hz27QvdoMoviw1/pqWRB09Sw==",
+ "dev": true,
+ "requires": {
+ "JSONStream": "^1.0.3",
+ "acorn-node": "^1.5.2",
+ "combine-source-map": "^0.8.0",
+ "concat-stream": "^1.6.1",
+ "is-buffer": "^1.1.0",
+ "path-is-absolute": "^1.0.1",
+ "process": "~0.11.0",
+ "through2": "^2.0.0",
+ "undeclared-identifiers": "^1.1.2",
+ "xtend": "^4.0.0"
+ },
+ "dependencies": {
+ "concat-stream": {
+ "version": "1.6.2",
+ "resolved": "https://registry.npmjs.org/concat-stream/-/concat-stream-1.6.2.tgz",
+ "integrity": "sha512-27HBghJxjiZtIk3Ycvn/4kbJk/1uZuJFfuPEns6LaEvpvG1f0hTea8lilrouyo9mVc2GWdcEZ8OLoGmSADlrCw==",
+ "dev": true,
+ "requires": {
+ "buffer-from": "^1.0.0",
+ "inherits": "^2.0.3",
+ "readable-stream": "^2.2.2",
+ "typedarray": "^0.0.6"
+ }
+ },
+ "through2": {
+ "version": "2.0.3",
+ "resolved": "https://registry.npmjs.org/through2/-/through2-2.0.3.tgz",
+ "integrity": "sha1-AARWmzfHx0ujnEPzzteNGtlBQL4=",
+ "dev": true,
+ "requires": {
+ "readable-stream": "^2.1.5",
+ "xtend": "~4.0.1"
+ }
+ }
+ }
+ },
+ "invariant": {
+ "version": "2.2.2",
+ "resolved": "https://registry.npmjs.org/invariant/-/invariant-2.2.2.tgz",
+ "integrity": "sha1-nh9WrArNtr8wMwbzOL47IErmA2A=",
+ "dev": true,
+ "requires": {
+ "loose-envify": "^1.0.0"
+ }
+ },
+ "invert-kv": {
+ "version": "1.0.0",
+ "resolved": "https://registry.npmjs.org/invert-kv/-/invert-kv-1.0.0.tgz",
+ "integrity": "sha1-EEqOSqym09jNFXqO+L+rLXo//bY=",
+ "dev": true
+ },
+ "is-accessor-descriptor": {
+ "version": "0.1.6",
+ "resolved": "https://registry.npmjs.org/is-accessor-descriptor/-/is-accessor-descriptor-0.1.6.tgz",
+ "integrity": "sha1-qeEss66Nh2cn7u84Q/igiXtcmNY=",
+ "dev": true,
+ "requires": {
+ "kind-of": "^3.0.2"
+ }
+ },
+ "is-arrayish": {
+ "version": "0.2.1",
+ "resolved": "https://registry.npmjs.org/is-arrayish/-/is-arrayish-0.2.1.tgz",
+ "integrity": "sha1-d8mYQFJ6qOyxqLppe4BkWnqSap0=",
+ "dev": true
+ },
+ "is-binary-path": {
+ "version": "1.0.1",
+ "resolved": "https://registry.npmjs.org/is-binary-path/-/is-binary-path-1.0.1.tgz",
+ "integrity": "sha1-dfFmQrSA8YenEcgUFh/TpKdlWJg=",
+ "dev": true,
+ "requires": {
+ "binary-extensions": "^1.0.0"
+ }
+ },
+ "is-buffer": {
+ "version": "1.1.6",
+ "resolved": "https://registry.npmjs.org/is-buffer/-/is-buffer-1.1.6.tgz",
+ "integrity": "sha512-NcdALwpXkTm5Zvvbk7owOUSvVvBKDgKP5/ewfXEznmQFfs4ZRmanOeKBTjRVjka3QFoN6XJ+9F3USqfHqTaU5w==",
+ "dev": true
+ },
+ "is-builtin-module": {
+ "version": "1.0.0",
+ "resolved": "https://registry.npmjs.org/is-builtin-module/-/is-builtin-module-1.0.0.tgz",
+ "integrity": "sha1-VAVy0096wxGfj3bDDLwbHgN6/74=",
+ "dev": true,
+ "requires": {
+ "builtin-modules": "^1.0.0"
+ }
+ },
+ "is-data-descriptor": {
+ "version": "0.1.4",
+ "resolved": "https://registry.npmjs.org/is-data-descriptor/-/is-data-descriptor-0.1.4.tgz",
+ "integrity": "sha1-C17mSDiOLIYCgueT8YVv7D8wG1Y=",
+ "dev": true,
+ "requires": {
+ "kind-of": "^3.0.2"
+ }
+ },
+ "is-descriptor": {
+ "version": "0.1.6",
+ "resolved": "https://registry.npmjs.org/is-descriptor/-/is-descriptor-0.1.6.tgz",
+ "integrity": "sha512-avDYr0SB3DwO9zsMov0gKCESFYqCnE4hq/4z3TdUlukEy5t9C0YRq7HLrsN52NAcqXKaepeCD0n+B0arnVG3Hg==",
+ "dev": true,
+ "requires": {
+ "is-accessor-descriptor": "^0.1.6",
+ "is-data-descriptor": "^0.1.4",
+ "kind-of": "^5.0.0"
+ },
+ "dependencies": {
+ "kind-of": {
+ "version": "5.1.0",
+ "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-5.1.0.tgz",
+ "integrity": "sha512-NGEErnH6F2vUuXDh+OlbcKW7/wOcfdRHaZ7VWtqCztfHri/++YKmP51OdWeGPuqCOba6kk2OTe5d02VmTB80Pw==",
+ "dev": true
+ }
+ }
+ },
+ "is-extendable": {
+ "version": "0.1.1",
+ "resolved": "https://registry.npmjs.org/is-extendable/-/is-extendable-0.1.1.tgz",
+ "integrity": "sha1-YrEQ4omkcUGOPsNqYX1HLjAd/Ik=",
"dev": true
},
- "is-builtin-module": {
- "version": "1.0.0",
- "resolved": "https://registry.npmjs.org/is-builtin-module/-/is-builtin-module-1.0.0.tgz",
- "integrity": "sha1-VAVy0096wxGfj3bDDLwbHgN6/74=",
+ "is-finite": {
+ "version": "1.0.2",
+ "resolved": "https://registry.npmjs.org/is-finite/-/is-finite-1.0.2.tgz",
+ "integrity": "sha1-zGZ3aVYCvlUO8R6LSqYwU0K20Ko=",
"dev": true,
"requires": {
- "builtin-modules": "^1.0.0"
+ "number-is-nan": "^1.0.0"
}
},
"is-fullwidth-code-point": {
- "version": "2.0.0",
- "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-2.0.0.tgz",
- "integrity": "sha1-o7MKXE8ZkYMWeqq5O+764937ZU8=",
- "dev": true
- },
- "is-module": {
"version": "1.0.0",
- "resolved": "https://registry.npmjs.org/is-module/-/is-module-1.0.0.tgz",
- "integrity": "sha1-Mlj7afeMFNW4FdZkM2tM/7ZEFZE=",
- "dev": true
- },
- "is-number": {
- "version": "7.0.0",
- "resolved": "https://registry.npmjs.org/is-number/-/is-number-7.0.0.tgz",
- "integrity": "sha512-41Cifkg6e8TylSpdtTpeLVMqvSBEVzTttHvERD741+pnZ8ANv0004MRL43QKPDlK9cGvNp6NZWZUBlbGXYxxng==",
- "dev": true
+ "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-1.0.0.tgz",
+ "integrity": "sha1-754xOG8DGn8NZDr4L95QxFfvAMs=",
+ "dev": true,
+ "requires": {
+ "number-is-nan": "^1.0.0"
+ }
},
"is-path-cwd": {
"version": "1.0.0",
@@ -1979,21 +5057,29 @@
"path-is-inside": "^1.0.1"
}
},
+ "is-plain-object": {
+ "version": "2.0.4",
+ "resolved": "https://registry.npmjs.org/is-plain-object/-/is-plain-object-2.0.4.tgz",
+ "integrity": "sha512-h5PpgXkWitc38BBMYawTYMWJHFZJVnBquFE57xFpjB8pJFiF6gZ+bU+WyI/yqXiFR5mdLsgYNaPe8uao6Uv9Og==",
+ "dev": true,
+ "requires": {
+ "isobject": "^3.0.1"
+ },
+ "dependencies": {
+ "isobject": {
+ "version": "3.0.1",
+ "resolved": "https://registry.npmjs.org/isobject/-/isobject-3.0.1.tgz",
+ "integrity": "sha1-TkMekrEalzFjaqH5yNHMvP2reN8=",
+ "dev": true
+ }
+ }
+ },
"is-promise": {
"version": "2.1.0",
"resolved": "https://registry.npmjs.org/is-promise/-/is-promise-2.1.0.tgz",
"integrity": "sha1-eaKp7OfwlugPNtKy87wWwf9L8/o=",
"dev": true
},
- "is-reference": {
- "version": "1.1.4",
- "resolved": "https://registry.npmjs.org/is-reference/-/is-reference-1.1.4.tgz",
- "integrity": "sha512-uJA/CDPO3Tao3GTrxYn6AwkM4nUPJiGGYu5+cB8qbC7WGFlrKZbiRo7SFKxUAEpFUfiHofWCXBUNhvYJMh+6zw==",
- "dev": true,
- "requires": {
- "@types/estree": "0.0.39"
- }
- },
"is-resolvable": {
"version": "1.1.0",
"resolved": "https://registry.npmjs.org/is-resolvable/-/is-resolvable-1.1.0.tgz",
@@ -2006,6 +5092,18 @@
"integrity": "sha1-EtSj3U5o4Lec6428hBc66A2RykQ=",
"dev": true
},
+ "is-utf8": {
+ "version": "0.2.1",
+ "resolved": "https://registry.npmjs.org/is-utf8/-/is-utf8-0.2.1.tgz",
+ "integrity": "sha1-Sw2hRCEE0bM2NA6AeX6GXPOffXI=",
+ "dev": true
+ },
+ "is-windows": {
+ "version": "1.0.2",
+ "resolved": "https://registry.npmjs.org/is-windows/-/is-windows-1.0.2.tgz",
+ "integrity": "sha512-eXK1UInq2bPmjyX6e3VHIzMLobc4J94i4AWn+Hpq3OU5KkrRC96OAcR3PRJ/pGu6m8TRnBHP9dkXQVsT/COVIA==",
+ "dev": true
+ },
"isarray": {
"version": "1.0.0",
"resolved": "https://registry.npmjs.org/isarray/-/isarray-1.0.0.tgz",
@@ -2146,25 +5244,16 @@
"html-escaper": "^2.0.0"
}
},
- "jest-worker": {
- "version": "24.9.0",
- "resolved": "https://registry.npmjs.org/jest-worker/-/jest-worker-24.9.0.tgz",
- "integrity": "sha512-51PE4haMSXcHohnSMdM42anbvZANYTqMrr52tVKPqqsPJMzoP6FYYDVqahX/HrAoKEKz3uUPzSvKs9A3qR4iVw==",
+ "js-beautify": {
+ "version": "1.7.4",
+ "resolved": "https://registry.npmjs.org/js-beautify/-/js-beautify-1.7.4.tgz",
+ "integrity": "sha512-6YX1g+lIl0/JDxjFFbgj7fz6i0bWFa2Hdc7PfGqFhynaEiYe1NJ3R1nda0VGaRiGU82OllR+EGDoWFpGr3k5Kg==",
"dev": true,
"requires": {
- "merge-stream": "^2.0.0",
- "supports-color": "^6.1.0"
- },
- "dependencies": {
- "supports-color": {
- "version": "6.1.0",
- "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-6.1.0.tgz",
- "integrity": "sha512-qe1jfm1Mg7Nq/NSh6XE24gPXROEVsWHxC1LIx//XNlD9iw7YZQGjZNjYN7xGaEG6iKdA8EtNFW6R0gjnVXp+wQ==",
- "dev": true,
- "requires": {
- "has-flag": "^3.0.0"
- }
- }
+ "config-chain": "~1.1.5",
+ "editorconfig": "^0.13.2",
+ "mkdirp": "~0.5.0",
+ "nopt": "~3.0.1"
}
},
"js-tokens": {
@@ -2184,77 +5273,46 @@
}
},
"js2xmlparser": {
- "version": "4.0.1",
- "resolved": "https://registry.npmjs.org/js2xmlparser/-/js2xmlparser-4.0.1.tgz",
- "integrity": "sha512-KrPTolcw6RocpYjdC7pL7v62e55q7qOMHvLX1UCLc5AAS8qeJ6nukarEJAF2KL2PZxlbGueEbINqZR2bDe/gUw==",
+ "version": "3.0.0",
+ "resolved": "https://registry.npmjs.org/js2xmlparser/-/js2xmlparser-3.0.0.tgz",
+ "integrity": "sha1-P7YOqgicVED5MZ9RdgzNB+JJlzM=",
"dev": true,
"requires": {
- "xmlcreate": "^2.0.3"
+ "xmlcreate": "^1.0.1"
}
},
"jsdoc": {
- "version": "github:openpgpjs/jsdoc#0f1816eb4553856647b4ca9561b9307b11ec4f9e",
- "from": "github:openpgpjs/jsdoc#0f1816eb4553856647b4ca9561b9307b11ec4f9e",
- "dev": true,
- "requires": {
- "@babel/parser": "^7.9.4",
- "bluebird": "^3.7.2",
- "catharsis": "^0.8.11",
- "escape-string-regexp": "^2.0.0",
- "js2xmlparser": "^4.0.1",
- "klaw": "^3.0.0",
- "markdown-it": "^10.0.0",
- "markdown-it-anchor": "^5.2.7",
- "marked": "^0.8.2",
- "mkdirp": "^1.0.4",
- "requizzle": "^0.2.3",
- "strip-json-comments": "^3.1.0",
+ "version": "3.5.5",
+ "resolved": "https://registry.npmjs.org/jsdoc/-/jsdoc-3.5.5.tgz",
+ "integrity": "sha512-6PxB65TAU4WO0Wzyr/4/YhlGovXl0EVYfpKbpSroSj0qBxT4/xod/l40Opkm38dRHRdQgdeY836M0uVnJQG7kg==",
+ "dev": true,
+ "requires": {
+ "babylon": "7.0.0-beta.19",
+ "bluebird": "~3.5.0",
+ "catharsis": "~0.8.9",
+ "escape-string-regexp": "~1.0.5",
+ "js2xmlparser": "~3.0.0",
+ "klaw": "~2.0.0",
+ "marked": "~0.3.6",
+ "mkdirp": "~0.5.1",
+ "requizzle": "~0.2.1",
+ "strip-json-comments": "~2.0.1",
"taffydb": "2.6.2",
- "underscore": "~1.10.2"
+ "underscore": "~1.8.3"
},
"dependencies": {
- "@babel/parser": {
- "version": "7.9.6",
- "resolved": "https://registry.npmjs.org/@babel/parser/-/parser-7.9.6.tgz",
- "integrity": "sha512-AoeIEJn8vt+d/6+PXDRPaksYhnlbMIiejioBZvvMQsOjW/JYK6k/0dKnvvP3EhK5GfMBWDPtrxRtegWdAcdq9Q==",
- "dev": true
- },
- "bluebird": {
- "version": "3.7.2",
- "resolved": "https://registry.npmjs.org/bluebird/-/bluebird-3.7.2.tgz",
- "integrity": "sha512-XpNj6GDQzdfW+r2Wnn7xiSAd7TM3jzkxGXBGTtWKuSXv1xUV+azxAm8jdWZN06QTQk+2N2XB9jRDkvbmQmcRtg==",
- "dev": true
- },
- "escape-string-regexp": {
- "version": "2.0.0",
- "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-2.0.0.tgz",
- "integrity": "sha512-UpzcLCXolUWcNu5HtVMHYdXJjArjsF9C0aNnquZYY4uW/Vu0miy5YoWvbV345HauVvcAUnpRuhMMcqTcGOY2+w==",
- "dev": true
- },
- "marked": {
- "version": "0.8.2",
- "resolved": "https://registry.npmjs.org/marked/-/marked-0.8.2.tgz",
- "integrity": "sha512-EGwzEeCcLniFX51DhTpmTom+dSA/MG/OBUDjnWtHbEnjAH180VzUeAw+oE4+Zv+CoYBWyRlYOTR0N8SO9R1PVw==",
- "dev": true
- },
- "mkdirp": {
- "version": "1.0.4",
- "resolved": "https://registry.npmjs.org/mkdirp/-/mkdirp-1.0.4.tgz",
- "integrity": "sha512-vVqVZQyf3WLx2Shd0qJ9xuvqgAyKPLAiqITEtqW0oIUjzo3PePDd6fW9iFz30ef7Ysp/oiWqbhszeGWW2T6Gzw==",
- "dev": true
- },
- "strip-json-comments": {
- "version": "3.1.0",
- "resolved": "https://registry.npmjs.org/strip-json-comments/-/strip-json-comments-3.1.0.tgz",
- "integrity": "sha512-e6/d0eBu7gHtdCqFt0xJr642LdToM5/cN4Qb9DbHjVx1CP5RyeM+zH7pbecEmDv/lBqb0QH+6Uqq75rxFPkM0w==",
+ "babylon": {
+ "version": "7.0.0-beta.19",
+ "resolved": "https://registry.npmjs.org/babylon/-/babylon-7.0.0-beta.19.tgz",
+ "integrity": "sha512-Vg0C9s/REX6/WIXN37UKpv5ZhRi6A4pjHlpkE34+8/a6c2W1Q692n3hmc+SZG5lKRnaExLUbxtJ1SVT+KaCQ/A==",
"dev": true
}
}
},
"jsesc": {
- "version": "2.5.2",
- "resolved": "https://registry.npmjs.org/jsesc/-/jsesc-2.5.2.tgz",
- "integrity": "sha512-OYu7XEzjkCQ3C5Ps3QIZsQfNpqoJyZZA99wd9aWd05NCtC5pWOkShK2mkL6HXQR6/Cy2lbNdPlZBpuQHXE63gA==",
+ "version": "1.3.0",
+ "resolved": "https://registry.npmjs.org/jsesc/-/jsesc-1.3.0.tgz",
+ "integrity": "sha1-RsP+yMGJKxKwgz25vHYiF226s0s=",
"dev": true
},
"json-parse-better-errors": {
@@ -2269,21 +5327,91 @@
"integrity": "sha1-NJptRMU6Ud6JtAgFxdXlm0F9M0A=",
"dev": true
},
+ "json-stable-stringify": {
+ "version": "0.0.1",
+ "resolved": "https://registry.npmjs.org/json-stable-stringify/-/json-stable-stringify-0.0.1.tgz",
+ "integrity": "sha1-YRwj6BTbN1Un34URk9tZ3Sryf0U=",
+ "dev": true,
+ "requires": {
+ "jsonify": "~0.0.0"
+ }
+ },
"json-stable-stringify-without-jsonify": {
"version": "1.0.1",
"resolved": "https://registry.npmjs.org/json-stable-stringify-without-jsonify/-/json-stable-stringify-without-jsonify-1.0.1.tgz",
"integrity": "sha1-nbe1lJatPzz+8wp1FC0tkwrXJlE=",
"dev": true
},
+ "json5": {
+ "version": "0.5.1",
+ "resolved": "https://registry.npmjs.org/json5/-/json5-0.5.1.tgz",
+ "integrity": "sha1-Hq3nrMASA0rYTiOWdn6tn6VJWCE=",
+ "dev": true
+ },
+ "jsonify": {
+ "version": "0.0.0",
+ "resolved": "https://registry.npmjs.org/jsonify/-/jsonify-0.0.0.tgz",
+ "integrity": "sha1-LHS27kHZPKUbe1qu6PUDYx0lKnM=",
+ "dev": true
+ },
+ "jsonparse": {
+ "version": "1.3.1",
+ "resolved": "https://registry.npmjs.org/jsonparse/-/jsonparse-1.3.1.tgz",
+ "integrity": "sha1-P02uSpH6wxX3EGL4UhzCOfE2YoA=",
+ "dev": true
+ },
+ "key-list": {
+ "version": "0.1.4",
+ "resolved": "https://registry.npmjs.org/key-list/-/key-list-0.1.4.tgz",
+ "integrity": "sha512-DMGLZAmEoKRUHPlc772EW0i92P/WY12/oWYc2pQZb5MVGOSjYmF0BEQXbOLjbou1+/PqZ+CivwfyjaUwmyl4CQ==",
+ "dev": true
+ },
+ "kind-of": {
+ "version": "3.2.2",
+ "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-3.2.2.tgz",
+ "integrity": "sha1-MeohpzS6ubuw8yRm2JOupR5KPGQ=",
+ "dev": true,
+ "requires": {
+ "is-buffer": "^1.1.5"
+ }
+ },
"klaw": {
- "version": "3.0.0",
- "resolved": "https://registry.npmjs.org/klaw/-/klaw-3.0.0.tgz",
- "integrity": "sha512-0Fo5oir+O9jnXu5EefYbVK+mHMBeEVEy2cmctR1O1NECcCkPRreJKrS6Qt/j3KC2C148Dfo9i3pCmCMsdqGr0g==",
+ "version": "2.0.0",
+ "resolved": "https://registry.npmjs.org/klaw/-/klaw-2.0.0.tgz",
+ "integrity": "sha1-WcEo4Nxc5BAgEVEZTuucv4WGUPY=",
"dev": true,
"requires": {
"graceful-fs": "^4.1.9"
}
},
+ "labeled-stream-splicer": {
+ "version": "2.0.1",
+ "resolved": "https://registry.npmjs.org/labeled-stream-splicer/-/labeled-stream-splicer-2.0.1.tgz",
+ "integrity": "sha512-MC94mHZRvJ3LfykJlTUipBqenZz1pacOZEMhhQ8dMGcDHs0SBE5GbsavUXV7YtP3icBW17W0Zy1I0lfASmo9Pg==",
+ "dev": true,
+ "requires": {
+ "inherits": "^2.0.1",
+ "isarray": "^2.0.4",
+ "stream-splicer": "^2.0.0"
+ },
+ "dependencies": {
+ "isarray": {
+ "version": "2.0.4",
+ "resolved": "https://registry.npmjs.org/isarray/-/isarray-2.0.4.tgz",
+ "integrity": "sha512-GMxXOiUirWg1xTKRipM0Ek07rX+ubx4nNVElTJdNLYmNO/2YrDkgJGw9CljXn+r4EWiDQg/8lsRdHyg2PJuUaA==",
+ "dev": true
+ }
+ }
+ },
+ "lcid": {
+ "version": "1.0.0",
+ "resolved": "https://registry.npmjs.org/lcid/-/lcid-1.0.0.tgz",
+ "integrity": "sha1-MIrMr6C8SDo4Z7S28rlQYlHRuDU=",
+ "dev": true,
+ "requires": {
+ "invert-kv": "^1.0.0"
+ }
+ },
"levn": {
"version": "0.3.0",
"resolved": "https://registry.npmjs.org/levn/-/levn-0.3.0.tgz",
@@ -2294,13 +5422,23 @@
"type-check": "~0.3.2"
}
},
- "linkify-it": {
- "version": "2.2.0",
- "resolved": "https://registry.npmjs.org/linkify-it/-/linkify-it-2.2.0.tgz",
- "integrity": "sha512-GnAl/knGn+i1U/wjBz3akz2stz+HrHLsxMwHQGofCDfPvlf+gDKN58UtfmUquTY4/MXeE2x7k19KQmeoZi94Iw==",
+ "livereload-js": {
+ "version": "2.3.0",
+ "resolved": "https://registry.npmjs.org/livereload-js/-/livereload-js-2.3.0.tgz",
+ "integrity": "sha512-j1R0/FeGa64Y+NmqfZhyoVRzcFlOZ8sNlKzHjh4VvLULFACZhn68XrX5DFg2FhMvSMJmROuFxRSa560ECWKBMg==",
+ "dev": true
+ },
+ "load-json-file": {
+ "version": "1.1.0",
+ "resolved": "https://registry.npmjs.org/load-json-file/-/load-json-file-1.1.0.tgz",
+ "integrity": "sha1-lWkFcI1YtLq0wiYbBPWfMcmTdMA=",
"dev": true,
"requires": {
- "uc.micro": "^1.0.1"
+ "graceful-fs": "^4.1.2",
+ "parse-json": "^2.2.0",
+ "pify": "^2.0.0",
+ "pinkie-promise": "^2.0.0",
+ "strip-bom": "^2.0.0"
}
},
"locate-path": {
@@ -2345,19 +5483,44 @@
"integrity": "sha1-LRd/ZS+jHpObRDjVNBSZ36OCXpk=",
"dev": true
},
+ "lodash.memoize": {
+ "version": "3.0.4",
+ "resolved": "https://registry.npmjs.org/lodash.memoize/-/lodash.memoize-3.0.4.tgz",
+ "integrity": "sha1-LcvSwofLwKVcxCMovQxzYVDVPj8=",
+ "dev": true
+ },
"lolex": {
"version": "2.3.2",
"resolved": "https://registry.npmjs.org/lolex/-/lolex-2.3.2.tgz",
"integrity": "sha512-A5pN2tkFj7H0dGIAM6MFvHKMJcPnjZsOMvR7ujCjfgW5TbV6H9vb1PgxLtHvjqNZTHsUolz+6/WEO0N1xNx2ng==",
"dev": true
},
- "magic-string": {
- "version": "0.25.7",
- "resolved": "https://registry.npmjs.org/magic-string/-/magic-string-0.25.7.tgz",
- "integrity": "sha512-4CrMT5DOHTDk4HYDlzmwu4FVCcIYI8gauveasrdCu2IKIFOJ3f0v/8MDGJCDL9oD2ppz/Av1b0Nj345H9M+XIA==",
+ "loose-envify": {
+ "version": "1.3.1",
+ "resolved": "https://registry.npmjs.org/loose-envify/-/loose-envify-1.3.1.tgz",
+ "integrity": "sha1-0aitM/qc4OcT1l/dCsi3SNR4yEg=",
+ "dev": true,
+ "requires": {
+ "js-tokens": "^3.0.0"
+ }
+ },
+ "loud-rejection": {
+ "version": "1.6.0",
+ "resolved": "https://registry.npmjs.org/loud-rejection/-/loud-rejection-1.6.0.tgz",
+ "integrity": "sha1-W0b4AUft7leIcPCG0Eghz5mOVR8=",
+ "dev": true,
+ "requires": {
+ "currently-unhandled": "^0.4.1",
+ "signal-exit": "^3.0.0"
+ }
+ },
+ "lru-cache": {
+ "version": "3.2.0",
+ "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-3.2.0.tgz",
+ "integrity": "sha1-cXibO39Tmb7IVl3aOKow0qCX7+4=",
"dev": true,
"requires": {
- "sourcemap-codec": "^1.4.4"
+ "pseudomap": "^1.0.1"
}
},
"make-dir": {
@@ -2384,30 +5547,68 @@
}
}
},
- "markdown-it": {
- "version": "10.0.0",
- "resolved": "https://registry.npmjs.org/markdown-it/-/markdown-it-10.0.0.tgz",
- "integrity": "sha512-YWOP1j7UbDNz+TumYP1kpwnP0aEa711cJjrAQrzd0UXlbJfc5aAq0F/PZHjiioqDC1NKgvIMX+o+9Bk7yuM2dg==",
+ "map-cache": {
+ "version": "0.2.2",
+ "resolved": "https://registry.npmjs.org/map-cache/-/map-cache-0.2.2.tgz",
+ "integrity": "sha1-wyq9C9ZSXZsFFkW7TyasXcmKDb8=",
+ "dev": true
+ },
+ "map-obj": {
+ "version": "1.0.1",
+ "resolved": "https://registry.npmjs.org/map-obj/-/map-obj-1.0.1.tgz",
+ "integrity": "sha1-2TPOuSBdgr3PSIb2dCvcK03qFG0=",
+ "dev": true
+ },
+ "map-visit": {
+ "version": "1.0.0",
+ "resolved": "https://registry.npmjs.org/map-visit/-/map-visit-1.0.0.tgz",
+ "integrity": "sha1-7Nyo8TFE5mDxtb1B8S80edmN+48=",
"dev": true,
"requires": {
- "argparse": "^1.0.7",
- "entities": "~2.0.0",
- "linkify-it": "^2.0.0",
- "mdurl": "^1.0.1",
- "uc.micro": "^1.0.5"
+ "object-visit": "^1.0.0"
}
},
- "markdown-it-anchor": {
- "version": "5.2.7",
- "resolved": "https://registry.npmjs.org/markdown-it-anchor/-/markdown-it-anchor-5.2.7.tgz",
- "integrity": "sha512-REFmIaSS6szaD1bye80DMbp7ePwsPNvLTR5HunsUcZ0SG0rWJQ+Pz24R4UlTKtjKBPhxo0v0tOBDYjZQQknW8Q==",
+ "marked": {
+ "version": "0.3.12",
+ "resolved": "https://registry.npmjs.org/marked/-/marked-0.3.12.tgz",
+ "integrity": "sha512-k4NaW+vS7ytQn6MgJn3fYpQt20/mOgYM5Ft9BYMfQJDz2QT6yEeS9XJ8k2Nw8JTeWK/znPPW2n3UJGzyYEiMoA==",
"dev": true
},
- "mdurl": {
- "version": "1.0.1",
- "resolved": "https://registry.npmjs.org/mdurl/-/mdurl-1.0.1.tgz",
- "integrity": "sha1-/oWy7HWlkDfyrf7BAP1sYBdhFS4=",
- "dev": true
+ "md5.js": {
+ "version": "1.3.4",
+ "resolved": "https://registry.npmjs.org/md5.js/-/md5.js-1.3.4.tgz",
+ "integrity": "sha1-6b296UogpawYsENA/Fdk1bCdkB0=",
+ "dev": true,
+ "requires": {
+ "hash-base": "^3.0.0",
+ "inherits": "^2.0.1"
+ }
+ },
+ "meow": {
+ "version": "3.7.0",
+ "resolved": "https://registry.npmjs.org/meow/-/meow-3.7.0.tgz",
+ "integrity": "sha1-cstmi0JSKCkKu/qFaJJYcwioAfs=",
+ "dev": true,
+ "requires": {
+ "camelcase-keys": "^2.0.0",
+ "decamelize": "^1.1.2",
+ "loud-rejection": "^1.0.0",
+ "map-obj": "^1.0.1",
+ "minimist": "^1.1.3",
+ "normalize-package-data": "^2.3.4",
+ "object-assign": "^4.0.1",
+ "read-pkg-up": "^1.0.1",
+ "redent": "^1.0.0",
+ "trim-newlines": "^1.0.0"
+ },
+ "dependencies": {
+ "minimist": {
+ "version": "1.2.5",
+ "resolved": "https://registry.npmjs.org/minimist/-/minimist-1.2.5.tgz",
+ "integrity": "sha512-FM9nNUYrRBAELZQT3xeZQ7fmMOBg6nWNmJKTcgsJeaLstP/UODVpGsr5OhXhhXg6f+qtJ8uiZ+PUxkDWcgIXLw==",
+ "dev": true
+ }
+ }
},
"merge-source-map": {
"version": "1.1.0",
@@ -2426,20 +5627,35 @@
}
}
},
- "merge-stream": {
- "version": "2.0.0",
- "resolved": "https://registry.npmjs.org/merge-stream/-/merge-stream-2.0.0.tgz",
- "integrity": "sha512-abv/qOcuPfk3URPfDzmZU1LKmuw8kT+0nIHvKrKgFrwifol/doWcdA4ZqsWQ8ENrFKkd67Mfpo/LovbIUsbt3w==",
+ "miller-rabin": {
+ "version": "4.0.1",
+ "resolved": "https://registry.npmjs.org/miller-rabin/-/miller-rabin-4.0.1.tgz",
+ "integrity": "sha512-115fLhvZVqWwHPbClyntxEVfVDfl9DLLTuJvq3g2O/Oxi8AiNouAHvDSzHS0viUJc+V5vm3eq91Xwqn9dp4jRA==",
+ "dev": true,
+ "requires": {
+ "bn.js": "^4.0.0",
+ "brorand": "^1.0.1"
+ }
+ },
+ "mime": {
+ "version": "1.4.1",
+ "resolved": "https://registry.npmjs.org/mime/-/mime-1.4.1.tgz",
+ "integrity": "sha512-KI1+qOZu5DcW6wayYHSzR/tXKCDC5Om4s1z2QJjDULzLcmf3DvzS7oluY4HCTrc+9FiKmWUgeNLg7W3uIQvxtQ==",
"dev": true
},
- "micromatch": {
- "version": "4.0.2",
- "resolved": "https://registry.npmjs.org/micromatch/-/micromatch-4.0.2.tgz",
- "integrity": "sha512-y7FpHSbMUMoyPbYUSzO6PaZ6FyRnQOpHuKwbo1G+Knck95XVU4QAiKdGEnj5wwoS7PlOgthX/09u5iFJ+aYf5Q==",
+ "mime-db": {
+ "version": "1.30.0",
+ "resolved": "https://registry.npmjs.org/mime-db/-/mime-db-1.30.0.tgz",
+ "integrity": "sha1-dMZD2i3Z1qRTmZY0ZbJtXKfXHwE=",
+ "dev": true
+ },
+ "mime-types": {
+ "version": "2.1.17",
+ "resolved": "https://registry.npmjs.org/mime-types/-/mime-types-2.1.17.tgz",
+ "integrity": "sha1-Cdejk/A+mVp5+K+Fe3Cp4KsWVXo=",
"dev": true,
"requires": {
- "braces": "^3.0.1",
- "picomatch": "^2.0.5"
+ "mime-db": "~1.30.0"
}
},
"mimic-fn": {
@@ -2474,6 +5690,27 @@
"integrity": "sha1-hX/Kv8M5fSYluCKCYuhqp6ARsF0=",
"dev": true
},
+ "mixin-deep": {
+ "version": "1.3.2",
+ "resolved": "https://registry.npmjs.org/mixin-deep/-/mixin-deep-1.3.2.tgz",
+ "integrity": "sha512-WRoDn//mXBiJ1H40rqa3vH0toePwSsGb45iInWlTySa+Uu4k3tYUSxa2v1KqAiLtvlrSzaExqS1gtk96A9zvEA==",
+ "dev": true,
+ "requires": {
+ "for-in": "^1.0.2",
+ "is-extendable": "^1.0.1"
+ },
+ "dependencies": {
+ "is-extendable": {
+ "version": "1.0.1",
+ "resolved": "https://registry.npmjs.org/is-extendable/-/is-extendable-1.0.1.tgz",
+ "integrity": "sha512-arnXMxT1hhoKo9k1LZdmlNyJdDDfy2v0fXjFlmok4+i8ul/6WlbVge9bhM74OpNPQPMGUToDtz+KXa1PneJxOA==",
+ "dev": true,
+ "requires": {
+ "is-plain-object": "^2.0.4"
+ }
+ }
+ }
+ },
"mkdirp": {
"version": "0.5.1",
"resolved": "https://registry.npmjs.org/mkdirp/-/mkdirp-0.5.1.tgz",
@@ -2547,6 +5784,80 @@
}
}
},
+ "modify-babel-preset": {
+ "version": "2.0.2",
+ "resolved": "https://registry.npmjs.org/modify-babel-preset/-/modify-babel-preset-2.0.2.tgz",
+ "integrity": "sha1-v6UJZp/kn0IiwM4XG6RO0OgVUec=",
+ "dev": true,
+ "requires": {
+ "require-relative": "^0.8.7"
+ }
+ },
+ "module-deps": {
+ "version": "6.1.0",
+ "resolved": "https://registry.npmjs.org/module-deps/-/module-deps-6.1.0.tgz",
+ "integrity": "sha512-NPs5N511VD1rrVJihSso/LiBShRbJALYBKzDW91uZYy7BpjnO4bGnZL3HjZ9yKcFdZUWwaYjDz9zxbuP7vKMuQ==",
+ "dev": true,
+ "requires": {
+ "JSONStream": "^1.0.3",
+ "browser-resolve": "^1.7.0",
+ "cached-path-relative": "^1.0.0",
+ "concat-stream": "~1.6.0",
+ "defined": "^1.0.0",
+ "detective": "^5.0.2",
+ "duplexer2": "^0.1.2",
+ "inherits": "^2.0.1",
+ "parents": "^1.0.0",
+ "readable-stream": "^2.0.2",
+ "resolve": "^1.4.0",
+ "stream-combiner2": "^1.1.1",
+ "subarg": "^1.0.0",
+ "through2": "^2.0.0",
+ "xtend": "^4.0.0"
+ },
+ "dependencies": {
+ "resolve": {
+ "version": "1.8.1",
+ "resolved": "https://registry.npmjs.org/resolve/-/resolve-1.8.1.tgz",
+ "integrity": "sha512-AicPrAC7Qu1JxPCZ9ZgCZlY35QgFnNqc+0LtbRNxnVw4TXvjQ72wnuL9JQcEBgXkI9JM8MsT9kaQoHcpCRJOYA==",
+ "dev": true,
+ "requires": {
+ "path-parse": "^1.0.5"
+ }
+ },
+ "through2": {
+ "version": "2.0.3",
+ "resolved": "https://registry.npmjs.org/through2/-/through2-2.0.3.tgz",
+ "integrity": "sha1-AARWmzfHx0ujnEPzzteNGtlBQL4=",
+ "dev": true,
+ "requires": {
+ "readable-stream": "^2.1.5",
+ "xtend": "~4.0.1"
+ }
+ }
+ }
+ },
+ "morgan": {
+ "version": "1.9.1",
+ "resolved": "https://registry.npmjs.org/morgan/-/morgan-1.9.1.tgz",
+ "integrity": "sha512-HQStPIV4y3afTiCYVxirakhlCfGkI161c76kKFca7Fk1JusM//Qeo1ej2XaMniiNeaZklMVrh3vTtIzpzwbpmA==",
+ "dev": true,
+ "requires": {
+ "basic-auth": "~2.0.0",
+ "debug": "2.6.9",
+ "depd": "~1.1.2",
+ "on-finished": "~2.3.0",
+ "on-headers": "~1.0.1"
+ },
+ "dependencies": {
+ "depd": {
+ "version": "1.1.2",
+ "resolved": "https://registry.npmjs.org/depd/-/depd-1.1.2.tgz",
+ "integrity": "sha1-m81S4UwJd2PnSbJ0xDRu0uVgtak=",
+ "dev": true
+ }
+ }
+ },
"ms": {
"version": "2.0.0",
"resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz",
@@ -2559,12 +5870,64 @@
"integrity": "sha1-MHXOk7whuPq0PhvE2n6BFe0ee6s=",
"dev": true
},
+ "nan": {
+ "version": "2.14.0",
+ "resolved": "https://registry.npmjs.org/nan/-/nan-2.14.0.tgz",
+ "integrity": "sha512-INOFj37C7k3AfaNTtX8RhsTw7qRy7eLET14cROi9+5HAVbbHuIWUHEauBv5qT4Av2tWasiTY1Jw6puUNqRJXQg==",
+ "dev": true,
+ "optional": true
+ },
+ "nanomatch": {
+ "version": "1.2.13",
+ "resolved": "https://registry.npmjs.org/nanomatch/-/nanomatch-1.2.13.tgz",
+ "integrity": "sha512-fpoe2T0RbHwBTBUOftAfBPaDEi06ufaUai0mE6Yn1kacc3SnTErfb/h+X94VXzI64rKFHYImXSvdwGGCmwOqCA==",
+ "dev": true,
+ "requires": {
+ "arr-diff": "^4.0.0",
+ "array-unique": "^0.3.2",
+ "define-property": "^2.0.2",
+ "extend-shallow": "^3.0.2",
+ "fragment-cache": "^0.2.1",
+ "is-windows": "^1.0.2",
+ "kind-of": "^6.0.2",
+ "object.pick": "^1.3.0",
+ "regex-not": "^1.0.0",
+ "snapdragon": "^0.8.1",
+ "to-regex": "^3.0.1"
+ },
+ "dependencies": {
+ "arr-diff": {
+ "version": "4.0.0",
+ "resolved": "https://registry.npmjs.org/arr-diff/-/arr-diff-4.0.0.tgz",
+ "integrity": "sha1-1kYQdP6/7HHn4VI1dhoyml3HxSA=",
+ "dev": true
+ },
+ "array-unique": {
+ "version": "0.3.2",
+ "resolved": "https://registry.npmjs.org/array-unique/-/array-unique-0.3.2.tgz",
+ "integrity": "sha1-qJS3XUvE9s1nnvMkSp/Y9Gri1Cg=",
+ "dev": true
+ },
+ "kind-of": {
+ "version": "6.0.3",
+ "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-6.0.3.tgz",
+ "integrity": "sha512-dcS1ul+9tmeD95T+x28/ehLgd9mENa3LsvDTtzm3vyBEO7RPptvAD+t44WVXaUjTBRcrpFeFlC8WCruUR456hw==",
+ "dev": true
+ }
+ }
+ },
"natural-compare": {
"version": "1.4.0",
"resolved": "https://registry.npmjs.org/natural-compare/-/natural-compare-1.4.0.tgz",
"integrity": "sha1-Sr6/7tdUHywnrPspvbvRXI1bpPc=",
"dev": true
},
+ "negotiator": {
+ "version": "0.6.1",
+ "resolved": "https://registry.npmjs.org/negotiator/-/negotiator-0.6.1.tgz",
+ "integrity": "sha1-KzJxhOiZIQEXeyhWP7XnECrNDKk=",
+ "dev": true
+ },
"nested-error-stacks": {
"version": "2.1.0",
"resolved": "https://registry.npmjs.org/nested-error-stacks/-/nested-error-stacks-2.1.0.tgz",
@@ -2624,6 +5987,15 @@
"write-file-atomic": "^1.1.4"
}
},
+ "nopt": {
+ "version": "3.0.6",
+ "resolved": "https://registry.npmjs.org/nopt/-/nopt-3.0.6.tgz",
+ "integrity": "sha1-xkZdvwirzU2zWTF/eaxopkayj/k=",
+ "dev": true,
+ "requires": {
+ "abbrev": "1"
+ }
+ },
"normalize-package-data": {
"version": "2.4.0",
"resolved": "https://registry.npmjs.org/normalize-package-data/-/normalize-package-data-2.4.0.tgz",
@@ -2636,6 +6008,21 @@
"validate-npm-package-license": "^3.0.1"
}
},
+ "normalize-path": {
+ "version": "2.1.1",
+ "resolved": "https://registry.npmjs.org/normalize-path/-/normalize-path-2.1.1.tgz",
+ "integrity": "sha1-GrKLVW4Zg2Oowab35vogE3/mrtk=",
+ "dev": true,
+ "requires": {
+ "remove-trailing-separator": "^1.0.1"
+ }
+ },
+ "number-is-nan": {
+ "version": "1.0.1",
+ "resolved": "https://registry.npmjs.org/number-is-nan/-/number-is-nan-1.0.1.tgz",
+ "integrity": "sha1-CXtgK1NCKlIsGvuHkDGDNpQaAR0=",
+ "dev": true
+ },
"nyc": {
"version": "14.1.1",
"resolved": "https://registry.npmjs.org/nyc/-/nyc-14.1.1.tgz",
@@ -2669,6 +6056,47 @@
"yargs-parser": "^13.0.0"
},
"dependencies": {
+ "ansi-regex": {
+ "version": "4.1.0",
+ "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-4.1.0.tgz",
+ "integrity": "sha512-1apePfXM1UOSqw0o9IiFAovVz9M5S1Dg+4TrDwfMewQ6p/rmMueb7tWZjQ1rx4Loy1ArBggoqGpfqqdI4rondg==",
+ "dev": true
+ },
+ "ansi-styles": {
+ "version": "3.2.1",
+ "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-3.2.1.tgz",
+ "integrity": "sha512-VT0ZI6kZRdTh8YyJw3SMbYm/u+NqfsAxEpWO0Pf9sq8/e94WxxOpPKx9FR1FlyCtOVDNOQ+8ntlqFxiRc+r5qA==",
+ "dev": true,
+ "requires": {
+ "color-convert": "^1.9.0"
+ }
+ },
+ "camelcase": {
+ "version": "5.3.1",
+ "resolved": "https://registry.npmjs.org/camelcase/-/camelcase-5.3.1.tgz",
+ "integrity": "sha512-L28STB170nwWS63UjtlEOE3dldQApaJXZkOI1uMFfzf3rRuPegHaHesyee+YxQ+W6SvRDQV6UrdOdRiR153wJg==",
+ "dev": true
+ },
+ "cliui": {
+ "version": "5.0.0",
+ "resolved": "https://registry.npmjs.org/cliui/-/cliui-5.0.0.tgz",
+ "integrity": "sha512-PYeGSEmmHM6zvoef2w8TPzlrnNpXIjTipYK780YswmIP9vjxmd6Y2a3CB2Ks6/AU8NHjZugXvo8w3oWM2qnwXA==",
+ "dev": true,
+ "requires": {
+ "string-width": "^3.1.0",
+ "strip-ansi": "^5.2.0",
+ "wrap-ansi": "^5.1.0"
+ }
+ },
+ "convert-source-map": {
+ "version": "1.7.0",
+ "resolved": "https://registry.npmjs.org/convert-source-map/-/convert-source-map-1.7.0.tgz",
+ "integrity": "sha512-4FJkXzKXEDB1snCFZlLP4gpC3JILicCpGbzG9f9G7tGqGCzETQ2hWPrcinA9oU4wtf2biUaEH5065UnMeR33oA==",
+ "dev": true,
+ "requires": {
+ "safe-buffer": "~5.1.1"
+ }
+ },
"find-up": {
"version": "3.0.0",
"resolved": "https://registry.npmjs.org/find-up/-/find-up-3.0.0.tgz",
@@ -2678,6 +6106,12 @@
"locate-path": "^3.0.0"
}
},
+ "get-caller-file": {
+ "version": "2.0.5",
+ "resolved": "https://registry.npmjs.org/get-caller-file/-/get-caller-file-2.0.5.tgz",
+ "integrity": "sha512-DyFP3BM/3YHTQOCUL/w0OZHR0lpKeGrxotcHWcqNEdnltqFwXVfhEBQ94eIo34AfQpo0rGki4cyIiftY06h2Fg==",
+ "dev": true
+ },
"glob": {
"version": "7.1.6",
"resolved": "https://registry.npmjs.org/glob/-/glob-7.1.6.tgz",
@@ -2692,6 +6126,12 @@
"path-is-absolute": "^1.0.0"
}
},
+ "is-fullwidth-code-point": {
+ "version": "2.0.0",
+ "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-2.0.0.tgz",
+ "integrity": "sha1-o7MKXE8ZkYMWeqq5O+764937ZU8=",
+ "dev": true
+ },
"locate-path": {
"version": "3.0.0",
"resolved": "https://registry.npmjs.org/locate-path/-/locate-path-3.0.0.tgz",
@@ -2703,9 +6143,9 @@
}
},
"p-limit": {
- "version": "2.3.0",
- "resolved": "https://registry.npmjs.org/p-limit/-/p-limit-2.3.0.tgz",
- "integrity": "sha512-//88mFWSJx8lxCzwdAABTJL2MyWB12+eIY7MDL2SqLmAkeKU9qxRvWuSyTjm3FUmpBEMuFfckAIqEaVGUDxb6w==",
+ "version": "2.2.2",
+ "resolved": "https://registry.npmjs.org/p-limit/-/p-limit-2.2.2.tgz",
+ "integrity": "sha512-WGR+xHecKTr7EbUEhyLSh5Dube9JtdiG78ufaeLxTgpudf/20KqyMioIUZJAezlTIi6evxuoUs9YXc11cU+yzQ==",
"dev": true,
"requires": {
"p-try": "^2.0.0"
@@ -2732,6 +6172,12 @@
"integrity": "sha1-zg6+ql94yxiSXqfYENe1mwEP1RU=",
"dev": true
},
+ "require-main-filename": {
+ "version": "2.0.0",
+ "resolved": "https://registry.npmjs.org/require-main-filename/-/require-main-filename-2.0.0.tgz",
+ "integrity": "sha512-NKN5kMDylKuldxYLSUfrbo5Tuzh4hd+2E8NPPX02mZtn1VuREQToYe/ZdlJy+J3uCpfaiGF05e7B8W0iXbQHmg==",
+ "dev": true
+ },
"resolve-from": {
"version": "4.0.0",
"resolved": "https://registry.npmjs.org/resolve-from/-/resolve-from-4.0.0.tgz",
@@ -2746,6 +6192,77 @@
"requires": {
"glob": "^7.1.3"
}
+ },
+ "string-width": {
+ "version": "3.1.0",
+ "resolved": "https://registry.npmjs.org/string-width/-/string-width-3.1.0.tgz",
+ "integrity": "sha512-vafcv6KjVZKSgz06oM/H6GDBrAtz8vdhQakGjFIvNrHA6y3HCF1CInLy+QLq8dTJPQ1b+KDUqDFctkdRW44e1w==",
+ "dev": true,
+ "requires": {
+ "emoji-regex": "^7.0.1",
+ "is-fullwidth-code-point": "^2.0.0",
+ "strip-ansi": "^5.1.0"
+ }
+ },
+ "strip-ansi": {
+ "version": "5.2.0",
+ "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-5.2.0.tgz",
+ "integrity": "sha512-DuRs1gKbBqsMKIZlrffwlug8MHkcnpjs5VPmL1PAh+mA30U0DTotfDZ0d2UUsXpPmPmMMJ6W773MaA3J+lbiWA==",
+ "dev": true,
+ "requires": {
+ "ansi-regex": "^4.1.0"
+ }
+ },
+ "which-module": {
+ "version": "2.0.0",
+ "resolved": "https://registry.npmjs.org/which-module/-/which-module-2.0.0.tgz",
+ "integrity": "sha1-2e8H3Od7mQK4o6j6SzHD4/fm6Ho=",
+ "dev": true
+ },
+ "wrap-ansi": {
+ "version": "5.1.0",
+ "resolved": "https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-5.1.0.tgz",
+ "integrity": "sha512-QC1/iN/2/RPVJ5jYK8BGttj5z83LmSKmvbvrXPNCLZSEb32KKVDJDl/MOt2N01qU2H/FkzEa9PKto1BqDjtd7Q==",
+ "dev": true,
+ "requires": {
+ "ansi-styles": "^3.2.0",
+ "string-width": "^3.0.0",
+ "strip-ansi": "^5.0.0"
+ }
+ },
+ "y18n": {
+ "version": "4.0.0",
+ "resolved": "https://registry.npmjs.org/y18n/-/y18n-4.0.0.tgz",
+ "integrity": "sha512-r9S/ZyXu/Xu9q1tYlpsLIsa3EeLXXk0VwlxqTcFRfg9EhMW+17kbt9G0NrgCmhGb5vT2hyhJZLfDGx+7+5Uj/w==",
+ "dev": true
+ },
+ "yargs": {
+ "version": "13.3.2",
+ "resolved": "https://registry.npmjs.org/yargs/-/yargs-13.3.2.tgz",
+ "integrity": "sha512-AX3Zw5iPruN5ie6xGRIDgqkT+ZhnRlZMLMHAs8tg7nRruy2Nb+i5o9bwghAogtM08q1dpr2LVoS8KSTMYpWXUw==",
+ "dev": true,
+ "requires": {
+ "cliui": "^5.0.0",
+ "find-up": "^3.0.0",
+ "get-caller-file": "^2.0.1",
+ "require-directory": "^2.1.1",
+ "require-main-filename": "^2.0.0",
+ "set-blocking": "^2.0.0",
+ "string-width": "^3.0.0",
+ "which-module": "^2.0.0",
+ "y18n": "^4.0.0",
+ "yargs-parser": "^13.1.2"
+ }
+ },
+ "yargs-parser": {
+ "version": "13.1.2",
+ "resolved": "https://registry.npmjs.org/yargs-parser/-/yargs-parser-13.1.2.tgz",
+ "integrity": "sha512-3lbsNRf/j+A4QuSZfDRA7HRSfWrzO0YjqTJd5kjAq37Zep1CEgaYmrH9Q3GwPiB9cHyd1Y1UwggGhJGoxipbzg==",
+ "dev": true,
+ "requires": {
+ "camelcase": "^5.0.0",
+ "decamelize": "^1.2.0"
+ }
}
}
},
@@ -2755,6 +6272,77 @@
"integrity": "sha1-IQmtx5ZYh8/AXLvUQsrIv7s2CGM=",
"dev": true
},
+ "object-copy": {
+ "version": "0.1.0",
+ "resolved": "https://registry.npmjs.org/object-copy/-/object-copy-0.1.0.tgz",
+ "integrity": "sha1-fn2Fi3gb18mRpBupde04EnVOmYw=",
+ "dev": true,
+ "requires": {
+ "copy-descriptor": "^0.1.0",
+ "define-property": "^0.2.5",
+ "kind-of": "^3.0.3"
+ },
+ "dependencies": {
+ "define-property": {
+ "version": "0.2.5",
+ "resolved": "https://registry.npmjs.org/define-property/-/define-property-0.2.5.tgz",
+ "integrity": "sha1-w1se+RjsPJkPmlvFe+BKrOxcgRY=",
+ "dev": true,
+ "requires": {
+ "is-descriptor": "^0.1.0"
+ }
+ }
+ }
+ },
+ "object-visit": {
+ "version": "1.0.1",
+ "resolved": "https://registry.npmjs.org/object-visit/-/object-visit-1.0.1.tgz",
+ "integrity": "sha1-95xEk68MU3e1n+OdOV5BBC3QRbs=",
+ "dev": true,
+ "requires": {
+ "isobject": "^3.0.0"
+ },
+ "dependencies": {
+ "isobject": {
+ "version": "3.0.1",
+ "resolved": "https://registry.npmjs.org/isobject/-/isobject-3.0.1.tgz",
+ "integrity": "sha1-TkMekrEalzFjaqH5yNHMvP2reN8=",
+ "dev": true
+ }
+ }
+ },
+ "object.pick": {
+ "version": "1.3.0",
+ "resolved": "https://registry.npmjs.org/object.pick/-/object.pick-1.3.0.tgz",
+ "integrity": "sha1-h6EKxMFpS9Lhy/U1kaZhQftd10c=",
+ "dev": true,
+ "requires": {
+ "isobject": "^3.0.1"
+ },
+ "dependencies": {
+ "isobject": {
+ "version": "3.0.1",
+ "resolved": "https://registry.npmjs.org/isobject/-/isobject-3.0.1.tgz",
+ "integrity": "sha1-TkMekrEalzFjaqH5yNHMvP2reN8=",
+ "dev": true
+ }
+ }
+ },
+ "on-finished": {
+ "version": "2.3.0",
+ "resolved": "https://registry.npmjs.org/on-finished/-/on-finished-2.3.0.tgz",
+ "integrity": "sha1-IPEzZIGwg811M3mSoWlxqi2QaUc=",
+ "dev": true,
+ "requires": {
+ "ee-first": "1.1.1"
+ }
+ },
+ "on-headers": {
+ "version": "1.0.1",
+ "resolved": "https://registry.npmjs.org/on-headers/-/on-headers-1.0.1.tgz",
+ "integrity": "sha1-ko9dD0cNSTQmUepnlLCFfBAGk/c=",
+ "dev": true
+ },
"once": {
"version": "1.4.0",
"resolved": "https://registry.npmjs.org/once/-/once-1.4.0.tgz",
@@ -2773,11 +6361,24 @@
"mimic-fn": "^1.0.0"
}
},
- "opener": {
- "version": "1.5.1",
- "resolved": "https://registry.npmjs.org/opener/-/opener-1.5.1.tgz",
- "integrity": "sha512-goYSy5c2UXE4Ra1xixabeVh1guIX/ZV/YokJksb6q2lubWu6UbvPQ20p542/sFIll1nl8JnCyK9oBaOcCWXwvA==",
- "dev": true
+ "opn": {
+ "version": "4.0.2",
+ "resolved": "https://registry.npmjs.org/opn/-/opn-4.0.2.tgz",
+ "integrity": "sha1-erwi5kTf9jsKltWrfyeQwPAavJU=",
+ "dev": true,
+ "requires": {
+ "object-assign": "^4.0.1",
+ "pinkie-promise": "^2.0.0"
+ }
+ },
+ "opted": {
+ "version": "1.0.2",
+ "resolved": "https://registry.npmjs.org/opted/-/opted-1.0.2.tgz",
+ "integrity": "sha1-CU562dDA/CuzhLTYpQfieOrVV8k=",
+ "dev": true,
+ "requires": {
+ "lodash": "^4.17.4"
+ }
},
"optionator": {
"version": "0.8.2",
@@ -2793,18 +6394,42 @@
"wordwrap": "~1.0.0"
}
},
+ "os-browserify": {
+ "version": "0.3.0",
+ "resolved": "https://registry.npmjs.org/os-browserify/-/os-browserify-0.3.0.tgz",
+ "integrity": "sha1-hUNzx/XCMVkU/Jv8a9gjj92h7Cc=",
+ "dev": true
+ },
"os-homedir": {
"version": "1.0.2",
"resolved": "https://registry.npmjs.org/os-homedir/-/os-homedir-1.0.2.tgz",
"integrity": "sha1-/7xJiDNuDoM94MFox+8VISGqf7M=",
"dev": true
},
+ "os-locale": {
+ "version": "1.4.0",
+ "resolved": "https://registry.npmjs.org/os-locale/-/os-locale-1.4.0.tgz",
+ "integrity": "sha1-IPnxeuKe00XoveWDsT0gCYA8FNk=",
+ "dev": true,
+ "requires": {
+ "lcid": "^1.0.0"
+ }
+ },
"os-tmpdir": {
"version": "1.0.2",
"resolved": "https://registry.npmjs.org/os-tmpdir/-/os-tmpdir-1.0.2.tgz",
"integrity": "sha1-u+Z0BseaqFxc/sdm/lc0VV36EnQ=",
"dev": true
},
+ "outpipe": {
+ "version": "1.1.1",
+ "resolved": "https://registry.npmjs.org/outpipe/-/outpipe-1.1.1.tgz",
+ "integrity": "sha1-UM+GFjZeh+Ax4ppeyTOaPaRyX6I=",
+ "dev": true,
+ "requires": {
+ "shell-quote": "^1.4.2"
+ }
+ },
"p-limit": {
"version": "1.2.0",
"resolved": "https://registry.npmjs.org/p-limit/-/p-limit-1.2.0.tgz",
@@ -2842,18 +6467,54 @@
},
"dependencies": {
"graceful-fs": {
- "version": "4.2.4",
- "resolved": "https://registry.npmjs.org/graceful-fs/-/graceful-fs-4.2.4.tgz",
- "integrity": "sha512-WjKPNJF79dtJAVniUlGGWHYGz2jWxT6VhN/4m1NdkbZ2nOsEF+cI1Edgql5zCRhs/VsQYRvrXctxktVXZUkixw==",
+ "version": "4.2.3",
+ "resolved": "https://registry.npmjs.org/graceful-fs/-/graceful-fs-4.2.3.tgz",
+ "integrity": "sha512-a30VEBm4PEdx1dRB7MFK7BejejvCvBronbLjht+sHuGYj8PHs7M/5Z+rt5lw551vZ7yfTCj4Vuyy3mSJytDWRQ==",
"dev": true
}
}
},
"pako": {
- "version": "github:openpgpjs/pako#f38f7368a5fa511e54b95add2f04444c3a9d803f",
- "from": "github:openpgpjs/pako#f38f7368a5fa511e54b95add2f04444c3a9d803f",
+ "version": "1.0.6",
+ "resolved": "https://registry.npmjs.org/pako/-/pako-1.0.6.tgz",
+ "integrity": "sha512-lQe48YPsMJAig+yngZ87Lus+NF+3mtu7DVOBu6b/gHO1YpKwIj5AWjZ/TOS7i46HD/UixzWb1zeWDZfGZ3iYcg==",
"dev": true
},
+ "parents": {
+ "version": "1.0.1",
+ "resolved": "https://registry.npmjs.org/parents/-/parents-1.0.1.tgz",
+ "integrity": "sha1-/t1NK/GTp3dF/nHjcdc8MwfZx1E=",
+ "dev": true,
+ "requires": {
+ "path-platform": "~0.11.15"
+ }
+ },
+ "parse-asn1": {
+ "version": "5.1.1",
+ "resolved": "https://registry.npmjs.org/parse-asn1/-/parse-asn1-5.1.1.tgz",
+ "integrity": "sha512-KPx7flKXg775zZpnp9SxJlz00gTd4BmJ2yJufSc44gMCRrRQ7NSzAcSJQfifuOLgW6bEi+ftrALtsgALeB2Adw==",
+ "dev": true,
+ "requires": {
+ "asn1.js": "^4.0.0",
+ "browserify-aes": "^1.0.0",
+ "create-hash": "^1.1.0",
+ "evp_bytestokey": "^1.0.0",
+ "pbkdf2": "^3.0.3"
+ },
+ "dependencies": {
+ "asn1.js": {
+ "version": "4.10.1",
+ "resolved": "https://registry.npmjs.org/asn1.js/-/asn1.js-4.10.1.tgz",
+ "integrity": "sha512-p32cOF5q0Zqs9uBiONKYLm6BClCoBCM5O9JfeUSlnQLBTxYdTK+pW+nXflm8UkKd2UYlEbYz5qEi0JuZR9ckSw==",
+ "dev": true,
+ "requires": {
+ "bn.js": "^4.0.0",
+ "inherits": "^2.0.1",
+ "minimalistic-assert": "^1.0.0"
+ }
+ }
+ }
+ },
"parse-json": {
"version": "2.2.0",
"resolved": "https://registry.npmjs.org/parse-json/-/parse-json-2.2.0.tgz",
@@ -2863,6 +6524,30 @@
"error-ex": "^1.2.0"
}
},
+ "parseurl": {
+ "version": "1.3.2",
+ "resolved": "https://registry.npmjs.org/parseurl/-/parseurl-1.3.2.tgz",
+ "integrity": "sha1-/CidTtiZMRlGDBViUyYs3I3mW/M=",
+ "dev": true
+ },
+ "pascalcase": {
+ "version": "0.1.1",
+ "resolved": "https://registry.npmjs.org/pascalcase/-/pascalcase-0.1.1.tgz",
+ "integrity": "sha1-s2PlXoAGym/iF4TS2yK9FdeRfxQ=",
+ "dev": true
+ },
+ "path-browserify": {
+ "version": "0.0.1",
+ "resolved": "https://registry.npmjs.org/path-browserify/-/path-browserify-0.0.1.tgz",
+ "integrity": "sha512-BapA40NHICOS+USX9SN4tyhq+A2RrN/Ws5F0Z5aMHDp98Fl86lX8Oti8B7uN93L4Ifv4fHOEA+pQw87gmMO/lQ==",
+ "dev": true
+ },
+ "path-dirname": {
+ "version": "1.0.2",
+ "resolved": "https://registry.npmjs.org/path-dirname/-/path-dirname-1.0.2.tgz",
+ "integrity": "sha1-zDPSTVJeCZpTiMAzbG4yuRYGCeA=",
+ "dev": true
+ },
"path-exists": {
"version": "2.1.0",
"resolved": "https://registry.npmjs.org/path-exists/-/path-exists-2.1.0.tgz",
@@ -2884,12 +6569,24 @@
"integrity": "sha1-NlQX3t5EQw0cEa9hAn+s8HS9/FM=",
"dev": true
},
+ "path-key": {
+ "version": "3.1.1",
+ "resolved": "https://registry.npmjs.org/path-key/-/path-key-3.1.1.tgz",
+ "integrity": "sha512-ojmeN0qd+y0jszEtoY48r0Peq5dwMEkIlCOu6Q5f41lfkswXuKtYrhgoTpLnyIcHm24Uhqx+5Tqm2InSwLhE6Q==",
+ "dev": true
+ },
"path-parse": {
"version": "1.0.5",
"resolved": "https://registry.npmjs.org/path-parse/-/path-parse-1.0.5.tgz",
"integrity": "sha1-PBrfhx6pzWyUMbbqK9dKD/BVxME=",
"dev": true
},
+ "path-platform": {
+ "version": "0.11.15",
+ "resolved": "https://registry.npmjs.org/path-platform/-/path-platform-0.11.15.tgz",
+ "integrity": "sha1-6GQhf3TDaFDwhSt43Hv31KVyG/I=",
+ "dev": true
+ },
"path-to-regexp": {
"version": "1.7.0",
"resolved": "https://registry.npmjs.org/path-to-regexp/-/path-to-regexp-1.7.0.tgz",
@@ -2907,17 +6604,35 @@
}
}
},
+ "path-type": {
+ "version": "1.1.0",
+ "resolved": "https://registry.npmjs.org/path-type/-/path-type-1.1.0.tgz",
+ "integrity": "sha1-WcRPfuSR2nBNpBXaWkBwuk+P5EE=",
+ "dev": true,
+ "requires": {
+ "graceful-fs": "^4.1.2",
+ "pify": "^2.0.0",
+ "pinkie-promise": "^2.0.0"
+ }
+ },
"pathval": {
"version": "1.1.0",
"resolved": "https://registry.npmjs.org/pathval/-/pathval-1.1.0.tgz",
"integrity": "sha1-uULm1L3mUwBe9rcTYd74cn0GReA=",
"dev": true
},
- "picomatch": {
- "version": "2.2.2",
- "resolved": "https://registry.npmjs.org/picomatch/-/picomatch-2.2.2.tgz",
- "integrity": "sha512-q0M/9eZHzmr0AulXyPwNfZjtwZ/RBZlbN3K3CErVrk50T2ASYI7Bye0EvekFY3IP1Nt2DHu0re+V2ZHIpMkuWg==",
- "dev": true
+ "pbkdf2": {
+ "version": "3.0.16",
+ "resolved": "https://registry.npmjs.org/pbkdf2/-/pbkdf2-3.0.16.tgz",
+ "integrity": "sha512-y4CXP3thSxqf7c0qmOF+9UeOTrifiVTIM+u7NWlq+PRsHbr7r7dpCmvzrZxa96JJUNi0Y5w9VqG5ZNeCVMoDcA==",
+ "dev": true,
+ "requires": {
+ "create-hash": "^1.1.2",
+ "create-hmac": "^1.1.4",
+ "ripemd160": "^2.0.1",
+ "safe-buffer": "^5.0.1",
+ "sha.js": "^2.4.8"
+ }
},
"pify": {
"version": "2.3.0",
@@ -2955,72 +6670,198 @@
"integrity": "sha512-ARhBOdzS3e41FbkW/XWrTEtukqqLoK5+Z/4UeDaLuSW+39JPeFgs4gCGqsrJHVZX0fUrx//4OF0K1CUGwlIFow==",
"dev": true
},
- "portfinder": {
- "version": "1.0.26",
- "resolved": "https://registry.npmjs.org/portfinder/-/portfinder-1.0.26.tgz",
- "integrity": "sha512-Xi7mKxJHHMI3rIUrnm/jjUgwhbYMkp/XKEcZX3aG4BrumLpq3nmoQMX+ClYnDZnZ/New7IatC1no5RX0zo1vXQ==",
+ "portscanner": {
+ "version": "1.2.0",
+ "resolved": "https://registry.npmjs.org/portscanner/-/portscanner-1.2.0.tgz",
+ "integrity": "sha1-sUu9olfRTDEPqcwJaCrwLUCWGAI=",
"dev": true,
"requires": {
- "async": "^2.6.2",
- "debug": "^3.1.1",
- "mkdirp": "^0.5.1"
- },
- "dependencies": {
- "async": {
- "version": "2.6.3",
- "resolved": "https://registry.npmjs.org/async/-/async-2.6.3.tgz",
- "integrity": "sha512-zflvls11DCy+dQWzTW2dzuilv8Z5X/pjfmZOWba6TNIVDm+2UDaJmXSOXlasHKfNBs8oo3M0aT50fDEWfKZjXg==",
- "dev": true,
- "requires": {
- "lodash": "^4.17.14"
- }
- },
- "debug": {
- "version": "3.2.6",
- "resolved": "https://registry.npmjs.org/debug/-/debug-3.2.6.tgz",
- "integrity": "sha512-mel+jf7nrtEl5Pn1Qx46zARXKDpBbvzezse7p7LqINmdoIk8PYP5SySaxEmYv6TZ0JyEKA1hsCId6DIhgITtWQ==",
- "dev": true,
- "requires": {
- "ms": "^2.1.1"
- }
- },
- "ms": {
- "version": "2.1.2",
- "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.2.tgz",
- "integrity": "sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w==",
+ "async": "1.5.2"
+ }
+ },
+ "posix-character-classes": {
+ "version": "0.1.1",
+ "resolved": "https://registry.npmjs.org/posix-character-classes/-/posix-character-classes-0.1.1.tgz",
+ "integrity": "sha1-AerA/jta9xoqbAL+q7jB/vfgDqs=",
+ "dev": true
+ },
+ "prelude-ls": {
+ "version": "1.1.2",
+ "resolved": "https://registry.npmjs.org/prelude-ls/-/prelude-ls-1.1.2.tgz",
+ "integrity": "sha1-IZMqVJ9eUv/ZqCf1cOBL5iqX2lQ=",
+ "dev": true
+ },
+ "private": {
+ "version": "0.1.8",
+ "resolved": "https://registry.npmjs.org/private/-/private-0.1.8.tgz",
+ "integrity": "sha512-VvivMrbvd2nKkiG38qjULzlc+4Vx4wm/whI9pQD35YrARNnhxeiRktSOhSukRLFNlzg6Br/cJPet5J/u19r/mg==",
+ "dev": true
+ },
+ "process": {
+ "version": "0.11.10",
+ "resolved": "https://registry.npmjs.org/process/-/process-0.11.10.tgz",
+ "integrity": "sha1-czIwDoQBYb2j5podHZGn1LwW8YI=",
+ "dev": true
+ },
+ "process-nextick-args": {
+ "version": "1.0.7",
+ "resolved": "https://registry.npmjs.org/process-nextick-args/-/process-nextick-args-1.0.7.tgz",
+ "integrity": "sha1-FQ4gt1ZZCtP5EJPyWk8q2L/zC6M=",
+ "dev": true
+ },
+ "progress": {
+ "version": "2.0.0",
+ "resolved": "https://registry.npmjs.org/progress/-/progress-2.0.0.tgz",
+ "integrity": "sha1-ihvjZr+Pwj2yvSPxDG/pILQ4nR8=",
+ "dev": true
+ },
+ "proto-list": {
+ "version": "1.2.4",
+ "resolved": "https://registry.npmjs.org/proto-list/-/proto-list-1.2.4.tgz",
+ "integrity": "sha1-IS1b/hMYMGpCD2QCuOJv85ZHqEk=",
+ "dev": true
+ },
+ "pseudomap": {
+ "version": "1.0.2",
+ "resolved": "https://registry.npmjs.org/pseudomap/-/pseudomap-1.0.2.tgz",
+ "integrity": "sha1-8FKijacOYYkX7wqKw0wa5aaChrM=",
+ "dev": true
+ },
+ "public-encrypt": {
+ "version": "4.0.2",
+ "resolved": "https://registry.npmjs.org/public-encrypt/-/public-encrypt-4.0.2.tgz",
+ "integrity": "sha512-4kJ5Esocg8X3h8YgJsKAuoesBgB7mqH3eowiDzMUPKiRDDE7E/BqqZD1hnTByIaAFiwAw246YEltSq7tdrOH0Q==",
+ "dev": true,
+ "requires": {
+ "bn.js": "^4.1.0",
+ "browserify-rsa": "^4.0.0",
+ "create-hash": "^1.1.0",
+ "parse-asn1": "^5.0.0",
+ "randombytes": "^2.0.1"
+ }
+ },
+ "punycode": {
+ "version": "1.4.1",
+ "resolved": "https://registry.npmjs.org/punycode/-/punycode-1.4.1.tgz",
+ "integrity": "sha1-wNWmOycYgArY4esPpSachN1BhF4=",
+ "dev": true
+ },
+ "qs": {
+ "version": "6.5.2",
+ "resolved": "https://registry.npmjs.org/qs/-/qs-6.5.2.tgz",
+ "integrity": "sha512-N5ZAX4/LxJmF+7wN74pUD6qAh9/wnvdQcjq9TZjevvXzSUo7bfmw91saqMjzGS2xq91/odN2dW/WOl7qQHNDGA==",
+ "dev": true
+ },
+ "querystring": {
+ "version": "0.2.0",
+ "resolved": "https://registry.npmjs.org/querystring/-/querystring-0.2.0.tgz",
+ "integrity": "sha1-sgmEkgO7Jd+CDadW50cAWHhSFiA=",
+ "dev": true
+ },
+ "querystring-es3": {
+ "version": "0.2.1",
+ "resolved": "https://registry.npmjs.org/querystring-es3/-/querystring-es3-0.2.1.tgz",
+ "integrity": "sha1-nsYfeQSYdXB9aUFFlv2Qek1xHnM=",
+ "dev": true
+ },
+ "randombytes": {
+ "version": "2.0.6",
+ "resolved": "https://registry.npmjs.org/randombytes/-/randombytes-2.0.6.tgz",
+ "integrity": "sha512-CIQ5OFxf4Jou6uOKe9t1AOgqpeU5fd70A8NPdHSGeYXqXsPe6peOwI0cUl88RWZ6sP1vPMV3avd/R6cZ5/sP1A==",
+ "dev": true,
+ "requires": {
+ "safe-buffer": "^5.1.0"
+ }
+ },
+ "randomfill": {
+ "version": "1.0.4",
+ "resolved": "https://registry.npmjs.org/randomfill/-/randomfill-1.0.4.tgz",
+ "integrity": "sha512-87lcbR8+MhcWcUiQ+9e+Rwx8MyR2P7qnt15ynUlbm3TU/fjbgz4GsvfSUDTemtCCtVCqb4ZcEFlyPNTh9bBTLw==",
+ "dev": true,
+ "requires": {
+ "randombytes": "^2.0.5",
+ "safe-buffer": "^5.1.0"
+ }
+ },
+ "range-parser": {
+ "version": "1.2.0",
+ "resolved": "https://registry.npmjs.org/range-parser/-/range-parser-1.2.0.tgz",
+ "integrity": "sha1-9JvmtIeJTdxA3MlKMi9hEJLgDV4=",
+ "dev": true
+ },
+ "raw-body": {
+ "version": "1.1.7",
+ "resolved": "https://registry.npmjs.org/raw-body/-/raw-body-1.1.7.tgz",
+ "integrity": "sha1-HQJ8K/oRasxmI7yo8AAWVyqH1CU=",
+ "dev": true,
+ "requires": {
+ "bytes": "1",
+ "string_decoder": "0.10"
+ },
+ "dependencies": {
+ "string_decoder": {
+ "version": "0.10.31",
+ "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-0.10.31.tgz",
+ "integrity": "sha1-YuIDvEF2bGwoyfyEMB2rHFMQ+pQ=",
"dev": true
}
}
},
- "prelude-ls": {
- "version": "1.1.2",
- "resolved": "https://registry.npmjs.org/prelude-ls/-/prelude-ls-1.1.2.tgz",
- "integrity": "sha1-IZMqVJ9eUv/ZqCf1cOBL5iqX2lQ=",
- "dev": true
- },
- "process-nextick-args": {
- "version": "1.0.7",
- "resolved": "https://registry.npmjs.org/process-nextick-args/-/process-nextick-args-1.0.7.tgz",
- "integrity": "sha1-FQ4gt1ZZCtP5EJPyWk8q2L/zC6M=",
- "dev": true
+ "rc": {
+ "version": "1.2.8",
+ "resolved": "https://registry.npmjs.org/rc/-/rc-1.2.8.tgz",
+ "integrity": "sha512-y3bGgqKj3QBdxLbLkomlohkvsA8gdAiUQlSBJnBhfn+BPxg4bc62d8TcBW15wavDfgexCgccckhcZvywyQYPOw==",
+ "dev": true,
+ "requires": {
+ "deep-extend": "^0.6.0",
+ "ini": "~1.3.0",
+ "minimist": "^1.2.0",
+ "strip-json-comments": "~2.0.1"
+ },
+ "dependencies": {
+ "deep-extend": {
+ "version": "0.6.0",
+ "resolved": "https://registry.npmjs.org/deep-extend/-/deep-extend-0.6.0.tgz",
+ "integrity": "sha512-LOHxIOaPYdHlJRtCQfDIVZtfw/ufM8+rVj649RIHzcm/vGwQRXFt6OPqIFWsm2XEMrNIEtWR64sY1LEKD2vAOA==",
+ "dev": true
+ },
+ "minimist": {
+ "version": "1.2.5",
+ "resolved": "https://registry.npmjs.org/minimist/-/minimist-1.2.5.tgz",
+ "integrity": "sha512-FM9nNUYrRBAELZQT3xeZQ7fmMOBg6nWNmJKTcgsJeaLstP/UODVpGsr5OhXhhXg6f+qtJ8uiZ+PUxkDWcgIXLw==",
+ "dev": true
+ }
+ }
},
- "progress": {
+ "read-only-stream": {
"version": "2.0.0",
- "resolved": "https://registry.npmjs.org/progress/-/progress-2.0.0.tgz",
- "integrity": "sha1-ihvjZr+Pwj2yvSPxDG/pILQ4nR8=",
- "dev": true
+ "resolved": "https://registry.npmjs.org/read-only-stream/-/read-only-stream-2.0.0.tgz",
+ "integrity": "sha1-JyT9aoET1zdkrCiNQ4YnDB2/F/A=",
+ "dev": true,
+ "requires": {
+ "readable-stream": "^2.0.2"
+ }
},
- "pseudomap": {
- "version": "1.0.2",
- "resolved": "https://registry.npmjs.org/pseudomap/-/pseudomap-1.0.2.tgz",
- "integrity": "sha1-8FKijacOYYkX7wqKw0wa5aaChrM=",
- "dev": true
+ "read-pkg": {
+ "version": "1.1.0",
+ "resolved": "https://registry.npmjs.org/read-pkg/-/read-pkg-1.1.0.tgz",
+ "integrity": "sha1-9f+qXs0pyzHAR0vKfXVra7KePyg=",
+ "dev": true,
+ "requires": {
+ "load-json-file": "^1.0.0",
+ "normalize-package-data": "^2.3.2",
+ "path-type": "^1.0.0"
+ }
},
- "qs": {
- "version": "6.5.2",
- "resolved": "https://registry.npmjs.org/qs/-/qs-6.5.2.tgz",
- "integrity": "sha512-N5ZAX4/LxJmF+7wN74pUD6qAh9/wnvdQcjq9TZjevvXzSUo7bfmw91saqMjzGS2xq91/odN2dW/WOl7qQHNDGA==",
- "dev": true
+ "read-pkg-up": {
+ "version": "1.0.1",
+ "resolved": "https://registry.npmjs.org/read-pkg-up/-/read-pkg-up-1.0.1.tgz",
+ "integrity": "sha1-nWPBMnbAZZGNV/ACpX9AobZD+wI=",
+ "dev": true,
+ "requires": {
+ "find-up": "^1.0.0",
+ "read-pkg": "^1.0.0"
+ }
},
"readable-stream": {
"version": "2.3.3",
@@ -3037,12 +6878,89 @@
"util-deprecate": "~1.0.1"
}
},
+ "redent": {
+ "version": "1.0.0",
+ "resolved": "https://registry.npmjs.org/redent/-/redent-1.0.0.tgz",
+ "integrity": "sha1-z5Fqsf1fHxbfsggi3W7H9zDCr94=",
+ "dev": true,
+ "requires": {
+ "indent-string": "^2.1.0",
+ "strip-indent": "^1.0.1"
+ }
+ },
+ "regenerate": {
+ "version": "1.3.3",
+ "resolved": "https://registry.npmjs.org/regenerate/-/regenerate-1.3.3.tgz",
+ "integrity": "sha512-jVpo1GadrDAK59t/0jRx5VxYWQEDkkEKi6+HjE3joFVLfDOh9Xrdh0dF1eSq+BI/SwvTQ44gSscJ8N5zYL61sg==",
+ "dev": true
+ },
+ "regenerator-runtime": {
+ "version": "0.11.0",
+ "resolved": "https://registry.npmjs.org/regenerator-runtime/-/regenerator-runtime-0.11.0.tgz",
+ "integrity": "sha512-/aA0kLeRb5N9K0d4fw7ooEbI+xDe+DKD499EQqygGqeS8N3xto15p09uY2xj7ixP81sNPXvRLnAQIqdVStgb1A==",
+ "dev": true
+ },
+ "regenerator-transform": {
+ "version": "0.10.1",
+ "resolved": "https://registry.npmjs.org/regenerator-transform/-/regenerator-transform-0.10.1.tgz",
+ "integrity": "sha512-PJepbvDbuK1xgIgnau7Y90cwaAmO/LCLMI2mPvaXq2heGMR3aWW5/BQvYrhJ8jgmQjXewXvBjzfqKcVOmhjZ6Q==",
+ "dev": true,
+ "requires": {
+ "babel-runtime": "^6.18.0",
+ "babel-types": "^6.19.0",
+ "private": "^0.1.6"
+ }
+ },
+ "regex-not": {
+ "version": "1.0.2",
+ "resolved": "https://registry.npmjs.org/regex-not/-/regex-not-1.0.2.tgz",
+ "integrity": "sha512-J6SDjUgDxQj5NusnOtdFxDwN/+HWykR8GELwctJ7mdqhcyy1xEc4SRFHUXvxTp661YaVKAjfRLZ9cCqS6tn32A==",
+ "dev": true,
+ "requires": {
+ "extend-shallow": "^3.0.2",
+ "safe-regex": "^1.1.0"
+ }
+ },
"regexpp": {
"version": "1.1.0",
"resolved": "https://registry.npmjs.org/regexpp/-/regexpp-1.1.0.tgz",
"integrity": "sha512-LOPw8FpgdQF9etWMaAfG/WRthIdXJGYp4mJ2Jgn/2lpkbod9jPn0t9UqN7AxBOKNfzRbYyVfgc7Vk4t/MpnXgw==",
"dev": true
},
+ "regexpu-core": {
+ "version": "2.0.0",
+ "resolved": "https://registry.npmjs.org/regexpu-core/-/regexpu-core-2.0.0.tgz",
+ "integrity": "sha1-SdA4g3uNz4v6W5pCE5k45uoq4kA=",
+ "dev": true,
+ "requires": {
+ "regenerate": "^1.2.1",
+ "regjsgen": "^0.2.0",
+ "regjsparser": "^0.1.4"
+ }
+ },
+ "regjsgen": {
+ "version": "0.2.0",
+ "resolved": "https://registry.npmjs.org/regjsgen/-/regjsgen-0.2.0.tgz",
+ "integrity": "sha1-bAFq3qxVT3WCP+N6wFuS1aTtsfc=",
+ "dev": true
+ },
+ "regjsparser": {
+ "version": "0.1.5",
+ "resolved": "https://registry.npmjs.org/regjsparser/-/regjsparser-0.1.5.tgz",
+ "integrity": "sha1-fuj4Tcb6eS0/0K4ijSS9lJ6tIFw=",
+ "dev": true,
+ "requires": {
+ "jsesc": "~0.5.0"
+ },
+ "dependencies": {
+ "jsesc": {
+ "version": "0.5.0",
+ "resolved": "https://registry.npmjs.org/jsesc/-/jsesc-0.5.0.tgz",
+ "integrity": "sha1-597mbjXW/Bb3EP6R1c9p9w8IkR0=",
+ "dev": true
+ }
+ }
+ },
"release-zalgo": {
"version": "1.0.0",
"resolved": "https://registry.npmjs.org/release-zalgo/-/release-zalgo-1.0.0.tgz",
@@ -3052,6 +6970,33 @@
"es6-error": "^4.0.1"
}
},
+ "remove-trailing-separator": {
+ "version": "1.1.0",
+ "resolved": "https://registry.npmjs.org/remove-trailing-separator/-/remove-trailing-separator-1.1.0.tgz",
+ "integrity": "sha1-wkvOKig62tW8P1jg1IJJuSN52O8=",
+ "dev": true
+ },
+ "repeat-element": {
+ "version": "1.1.2",
+ "resolved": "https://registry.npmjs.org/repeat-element/-/repeat-element-1.1.2.tgz",
+ "integrity": "sha1-7wiaF40Ug7quTZPrmLT55OEdmQo=",
+ "dev": true
+ },
+ "repeat-string": {
+ "version": "1.6.1",
+ "resolved": "https://registry.npmjs.org/repeat-string/-/repeat-string-1.6.1.tgz",
+ "integrity": "sha1-jcrkcOHIirwtYA//Sndihtp15jc=",
+ "dev": true
+ },
+ "repeating": {
+ "version": "2.0.1",
+ "resolved": "https://registry.npmjs.org/repeating/-/repeating-2.0.1.tgz",
+ "integrity": "sha1-UhTFOpJtNVJwdSf7q0FdvAjQbdo=",
+ "dev": true,
+ "requires": {
+ "is-finite": "^1.0.0"
+ }
+ },
"require-directory": {
"version": "2.1.1",
"resolved": "https://registry.npmjs.org/require-directory/-/require-directory-2.1.1.tgz",
@@ -3059,9 +7004,15 @@
"dev": true
},
"require-main-filename": {
- "version": "2.0.0",
- "resolved": "https://registry.npmjs.org/require-main-filename/-/require-main-filename-2.0.0.tgz",
- "integrity": "sha512-NKN5kMDylKuldxYLSUfrbo5Tuzh4hd+2E8NPPX02mZtn1VuREQToYe/ZdlJy+J3uCpfaiGF05e7B8W0iXbQHmg==",
+ "version": "1.0.1",
+ "resolved": "https://registry.npmjs.org/require-main-filename/-/require-main-filename-1.0.1.tgz",
+ "integrity": "sha1-l/cXtp1IeE9fUmpsWqj/3aBVpNE=",
+ "dev": true
+ },
+ "require-relative": {
+ "version": "0.8.7",
+ "resolved": "https://registry.npmjs.org/require-relative/-/require-relative-0.8.7.tgz",
+ "integrity": "sha1-eZlTn8ngR6N5KPoZb44VY9q9Nt4=",
"dev": true
},
"require-uncached": {
@@ -3074,44 +7025,41 @@
"resolve-from": "^1.0.0"
}
},
- "requires-port": {
- "version": "1.0.0",
- "resolved": "https://registry.npmjs.org/requires-port/-/requires-port-1.0.0.tgz",
- "integrity": "sha1-kl0mAdOaxIXgkc8NpcbmlNw9yv8=",
- "dev": true
- },
"requizzle": {
- "version": "0.2.3",
- "resolved": "https://registry.npmjs.org/requizzle/-/requizzle-0.2.3.tgz",
- "integrity": "sha512-YanoyJjykPxGHii0fZP0uUPEXpvqfBDxWV7s6GKAiiOsiqhX6vHNyW3Qzdmqp/iq/ExbhaGbVrjB4ruEVSM4GQ==",
- "dev": true,
- "requires": {
- "lodash": "^4.17.14"
- }
- },
- "resolve": {
- "version": "1.17.0",
- "resolved": "https://registry.npmjs.org/resolve/-/resolve-1.17.0.tgz",
- "integrity": "sha512-ic+7JYiV8Vi2yzQGFWOkiZD5Z9z7O2Zhm9XMaTxdJExKasieFCr+yXZ/WmXsckHiKl12ar0y6XiXDx3m4RHn1w==",
+ "version": "0.2.1",
+ "resolved": "https://registry.npmjs.org/requizzle/-/requizzle-0.2.1.tgz",
+ "integrity": "sha1-aUPDUwxNmn5G8c3dUcFY/GcM294=",
"dev": true,
"requires": {
- "path-parse": "^1.0.6"
+ "underscore": "~1.6.0"
},
"dependencies": {
- "path-parse": {
- "version": "1.0.6",
- "resolved": "https://registry.npmjs.org/path-parse/-/path-parse-1.0.6.tgz",
- "integrity": "sha512-GSmOT2EbHrINBf9SR7CDELwlJ8AENk3Qn7OikK4nFYAu3Ote2+JYNVvkpAEQm3/TLNEJFD/xZJjzyxg3KBWOzw==",
+ "underscore": {
+ "version": "1.6.0",
+ "resolved": "https://registry.npmjs.org/underscore/-/underscore-1.6.0.tgz",
+ "integrity": "sha1-izixDKze9jM3uLJOT/htRa6lKag=",
"dev": true
}
}
},
+ "resolve": {
+ "version": "1.1.7",
+ "resolved": "https://registry.npmjs.org/resolve/-/resolve-1.1.7.tgz",
+ "integrity": "sha1-IDEU2CrSxe2ejgQRs5ModeiJ6Xs=",
+ "dev": true
+ },
"resolve-from": {
"version": "1.0.1",
"resolved": "https://registry.npmjs.org/resolve-from/-/resolve-from-1.0.1.tgz",
"integrity": "sha1-Jsv+k10a7uq7Kbw/5a6wHpPUQiY=",
"dev": true
},
+ "resolve-url": {
+ "version": "0.2.1",
+ "resolved": "https://registry.npmjs.org/resolve-url/-/resolve-url-0.2.1.tgz",
+ "integrity": "sha1-LGN/53yJOv0qZj/iGqkIAGjiBSo=",
+ "dev": true
+ },
"restore-cursor": {
"version": "2.0.0",
"resolved": "https://registry.npmjs.org/restore-cursor/-/restore-cursor-2.0.0.tgz",
@@ -3122,58 +7070,26 @@
"signal-exit": "^3.0.2"
}
},
+ "ret": {
+ "version": "0.1.15",
+ "resolved": "https://registry.npmjs.org/ret/-/ret-0.1.15.tgz",
+ "integrity": "sha512-TTlYpa+OL+vMMNG24xSlQGEJ3B/RzEfUlLct7b5G/ytav+wPrplCpVMFuwzXbkecJrb6IYo1iFb0S9v37754mg==",
+ "dev": true
+ },
"rimraf": {
"version": "2.2.8",
"resolved": "https://registry.npmjs.org/rimraf/-/rimraf-2.2.8.tgz",
"integrity": "sha1-5Dm+Kq7jJzIZUnMPmaiSnk/FBYI=",
"dev": true
},
- "rollup": {
- "version": "2.7.2",
- "resolved": "https://registry.npmjs.org/rollup/-/rollup-2.7.2.tgz",
- "integrity": "sha512-SdtTZVMMVSPe7SNv4exUyPXARe5v/p3TeeG3LRA5WabLPJt4Usi3wVrvVlyAUTG40JJmqS6zbIHt2vWTss2prw==",
- "dev": true,
- "requires": {
- "fsevents": "~2.1.2"
- },
- "dependencies": {
- "fsevents": {
- "version": "2.1.3",
- "resolved": "https://registry.npmjs.org/fsevents/-/fsevents-2.1.3.tgz",
- "integrity": "sha512-Auw9a4AxqWpa9GUfj370BMPzzyncfBABW8Mab7BGWBYDj4Isgq+cDKtx0i6u9jcX9pQDnswsaaOTgTmA5pEjuQ==",
- "dev": true,
- "optional": true
- }
- }
- },
- "rollup-plugin-terser": {
- "version": "5.3.0",
- "resolved": "https://registry.npmjs.org/rollup-plugin-terser/-/rollup-plugin-terser-5.3.0.tgz",
- "integrity": "sha512-XGMJihTIO3eIBsVGq7jiNYOdDMb3pVxuzY0uhOE/FM4x/u9nQgr3+McsjzqBn3QfHIpNSZmFnpoKAwHBEcsT7g==",
- "dev": true,
- "requires": {
- "@babel/code-frame": "^7.5.5",
- "jest-worker": "^24.9.0",
- "rollup-pluginutils": "^2.8.2",
- "serialize-javascript": "^2.1.2",
- "terser": "^4.6.2"
- }
- },
- "rollup-pluginutils": {
- "version": "2.8.2",
- "resolved": "https://registry.npmjs.org/rollup-pluginutils/-/rollup-pluginutils-2.8.2.tgz",
- "integrity": "sha512-EEp9NhnUkwY8aif6bxgovPHMoMoNr2FulJziTndpt5H9RdwC47GSGuII9XxpSdzVGM0GWrNPHV6ie1LTNJPaLQ==",
+ "ripemd160": {
+ "version": "2.0.2",
+ "resolved": "https://registry.npmjs.org/ripemd160/-/ripemd160-2.0.2.tgz",
+ "integrity": "sha512-ii4iagi25WusVoiC4B4lq7pbXfAp3D9v5CwfkY33vffw2+pkDjY1D8GaN7spsxvCSx8dkPqOZCEZyfxcmJG2IA==",
"dev": true,
"requires": {
- "estree-walker": "^0.6.1"
- },
- "dependencies": {
- "estree-walker": {
- "version": "0.6.1",
- "resolved": "https://registry.npmjs.org/estree-walker/-/estree-walker-0.6.1.tgz",
- "integrity": "sha512-SqmZANLWS0mnatqbSfRP5g8OXZC12Fgg1IwNtLsyHDzJizORW4khDfjPqJZsemPWBB2uqykUah5YpQ6epsqC/w==",
- "dev": true
- }
+ "hash-base": "^3.0.0",
+ "inherits": "^2.0.1"
}
},
"run-async": {
@@ -3206,24 +7122,44 @@
"integrity": "sha512-kKvNJn6Mm93gAczWVJg7wH+wGYWNrDHdWvpUmHyEsgCtIwwo3bqPtV4tR5tuPaUhTOo/kvhVwd8XwwOllGYkbg==",
"dev": true
},
+ "safe-json-parse": {
+ "version": "1.0.1",
+ "resolved": "https://registry.npmjs.org/safe-json-parse/-/safe-json-parse-1.0.1.tgz",
+ "integrity": "sha1-PnZyPjjf3aE8mx0poeB//uSzC1c=",
+ "dev": true
+ },
+ "safe-regex": {
+ "version": "1.1.0",
+ "resolved": "https://registry.npmjs.org/safe-regex/-/safe-regex-1.1.0.tgz",
+ "integrity": "sha1-QKNmnzsHfR6UPURinhV91IAjvy4=",
+ "dev": true,
+ "requires": {
+ "ret": "~0.1.10"
+ }
+ },
"samsam": {
"version": "1.3.0",
"resolved": "https://registry.npmjs.org/samsam/-/samsam-1.3.0.tgz",
"integrity": "sha512-1HwIYD/8UlOtFS3QO3w7ey+SdSDFE4HRNLZoZRYVQefrOY3l17epswImeB1ijgJFQJodIaHcwkp3r/myBjFVbg==",
"dev": true
},
- "secure-compare": {
- "version": "3.0.1",
- "resolved": "https://registry.npmjs.org/secure-compare/-/secure-compare-3.0.1.tgz",
- "integrity": "sha1-8aAymzCLIh+uN7mXTz1XjQypmeM=",
- "dev": true
- },
"seek-bzip": {
- "version": "github:openpgpjs/seek-bzip#4b89457f20c0e1921b4689106a31c99782c29829",
- "from": "github:openpgpjs/seek-bzip#4b89457f20c0e1921b4689106a31c99782c29829",
+ "version": "github:openpgpjs/seek-bzip#6187fc025851d35c4e104a25ea15a10b9b8d6f7d",
+ "from": "github:openpgpjs/seek-bzip#6187fc025851d35c4e104a25ea15a10b9b8d6f7d",
"dev": true,
"requires": {
"commander": "~2.8.1"
+ },
+ "dependencies": {
+ "commander": {
+ "version": "2.8.1",
+ "resolved": "https://registry.npmjs.org/commander/-/commander-2.8.1.tgz",
+ "integrity": "sha1-Br42f+v9oMMwqh4qBy09yXYkJdQ=",
+ "dev": true,
+ "requires": {
+ "graceful-readlink": ">= 1.0.0"
+ }
+ }
}
},
"semver": {
@@ -3232,11 +7168,53 @@
"integrity": "sha512-WfG/X9+oATh81XtllIo/I8gOiY9EXRdv1cQdyykeXK17YcUW3EXUAi2To4pcH6nZtJPr7ZOpM5OMyWJZm+8Rsg==",
"dev": true
},
- "serialize-javascript": {
- "version": "2.1.2",
- "resolved": "https://registry.npmjs.org/serialize-javascript/-/serialize-javascript-2.1.2.tgz",
- "integrity": "sha512-rs9OggEUF0V4jUSecXazOYsLfu7OGK2qIn3c7IPBiffz32XniEp/TX9Xmc9LQfK2nQ2QKHvZ2oygKUGU0lG4jQ==",
- "dev": true
+ "send": {
+ "version": "0.16.1",
+ "resolved": "https://registry.npmjs.org/send/-/send-0.16.1.tgz",
+ "integrity": "sha512-ElCLJdJIKPk6ux/Hocwhk7NFHpI3pVm/IZOYWqUmoxcgeyM+MpxHHKhb8QmlJDX1pU6WrgaHBkVNm73Sv7uc2A==",
+ "dev": true,
+ "requires": {
+ "debug": "2.6.9",
+ "depd": "~1.1.1",
+ "destroy": "~1.0.4",
+ "encodeurl": "~1.0.1",
+ "escape-html": "~1.0.3",
+ "etag": "~1.8.1",
+ "fresh": "0.5.2",
+ "http-errors": "~1.6.2",
+ "mime": "1.4.1",
+ "ms": "2.0.0",
+ "on-finished": "~2.3.0",
+ "range-parser": "~1.2.0",
+ "statuses": "~1.3.1"
+ }
+ },
+ "serve-index": {
+ "version": "1.9.1",
+ "resolved": "https://registry.npmjs.org/serve-index/-/serve-index-1.9.1.tgz",
+ "integrity": "sha1-03aNabHn2C5c4FD/9bRTvqEqkjk=",
+ "dev": true,
+ "requires": {
+ "accepts": "~1.3.4",
+ "batch": "0.6.1",
+ "debug": "2.6.9",
+ "escape-html": "~1.0.3",
+ "http-errors": "~1.6.2",
+ "mime-types": "~2.1.17",
+ "parseurl": "~1.3.2"
+ }
+ },
+ "serve-static": {
+ "version": "1.13.1",
+ "resolved": "https://registry.npmjs.org/serve-static/-/serve-static-1.13.1.tgz",
+ "integrity": "sha512-hSMUZrsPa/I09VYFJwa627JJkNs0NrfL1Uzuup+GqHfToR2KcsXFymXSV90hoyw3M+msjFuQly+YzIH/q0MGlQ==",
+ "dev": true,
+ "requires": {
+ "encodeurl": "~1.0.1",
+ "escape-html": "~1.0.3",
+ "parseurl": "~1.3.2",
+ "send": "0.16.1"
+ }
},
"set-blocking": {
"version": "2.0.0",
@@ -3244,6 +7222,55 @@
"integrity": "sha1-BF+XgtARrppoA93TgrJDkrPYkPc=",
"dev": true
},
+ "set-value": {
+ "version": "2.0.1",
+ "resolved": "https://registry.npmjs.org/set-value/-/set-value-2.0.1.tgz",
+ "integrity": "sha512-JxHc1weCN68wRY0fhCoXpyK55m/XPHafOmK4UWD7m2CI14GMcFypt4w/0+NV5f/ZMby2F6S2wwA7fgynh9gWSw==",
+ "dev": true,
+ "requires": {
+ "extend-shallow": "^2.0.1",
+ "is-extendable": "^0.1.1",
+ "is-plain-object": "^2.0.3",
+ "split-string": "^3.0.1"
+ },
+ "dependencies": {
+ "extend-shallow": {
+ "version": "2.0.1",
+ "resolved": "https://registry.npmjs.org/extend-shallow/-/extend-shallow-2.0.1.tgz",
+ "integrity": "sha1-Ua99YUrZqfYQ6huvu5idaxxWiQ8=",
+ "dev": true,
+ "requires": {
+ "is-extendable": "^0.1.0"
+ }
+ }
+ }
+ },
+ "setprototypeof": {
+ "version": "1.0.3",
+ "resolved": "https://registry.npmjs.org/setprototypeof/-/setprototypeof-1.0.3.tgz",
+ "integrity": "sha1-ZlZ+NwQ+608E2RvWWMDL77VbjgQ=",
+ "dev": true
+ },
+ "sha.js": {
+ "version": "2.4.11",
+ "resolved": "https://registry.npmjs.org/sha.js/-/sha.js-2.4.11.tgz",
+ "integrity": "sha512-QMEp5B7cftE7APOjk5Y6xgrbWu+WkLVQwk8JNjZ8nKRciZaByEW6MubieAiToS7+dwvrjGhH8jRXz3MVd0AYqQ==",
+ "dev": true,
+ "requires": {
+ "inherits": "^2.0.1",
+ "safe-buffer": "^5.0.1"
+ }
+ },
+ "shasum": {
+ "version": "1.0.2",
+ "resolved": "https://registry.npmjs.org/shasum/-/shasum-1.0.2.tgz",
+ "integrity": "sha1-5wEjENj0F/TetXEhUOVni4euVl8=",
+ "dev": true,
+ "requires": {
+ "json-stable-stringify": "~0.0.0",
+ "sha.js": "~2.4.4"
+ }
+ },
"shebang-command": {
"version": "1.2.0",
"resolved": "https://registry.npmjs.org/shebang-command/-/shebang-command-1.2.0.tgz",
@@ -3253,16 +7280,126 @@
"shebang-regex": "^1.0.0"
}
},
- "shebang-regex": {
+ "shebang-regex": {
+ "version": "1.0.0",
+ "resolved": "https://registry.npmjs.org/shebang-regex/-/shebang-regex-1.0.0.tgz",
+ "integrity": "sha1-2kL0l0DAtC2yypcoVxyxkMmO/qM=",
+ "dev": true
+ },
+ "shell-quote": {
+ "version": "1.6.1",
+ "resolved": "https://registry.npmjs.org/shell-quote/-/shell-quote-1.6.1.tgz",
+ "integrity": "sha1-9HgZSczkAmlxJ0MOo7PFR29IF2c=",
+ "dev": true,
+ "requires": {
+ "array-filter": "~0.0.0",
+ "array-map": "~0.0.0",
+ "array-reduce": "~0.0.0",
+ "jsonify": "~0.0.0"
+ }
+ },
+ "sigmund": {
+ "version": "1.0.1",
+ "resolved": "https://registry.npmjs.org/sigmund/-/sigmund-1.0.1.tgz",
+ "integrity": "sha1-P/IfGYytIXX587eBhT/ZTQ0ZtZA=",
+ "dev": true
+ },
+ "signal-exit": {
+ "version": "3.0.2",
+ "resolved": "https://registry.npmjs.org/signal-exit/-/signal-exit-3.0.2.tgz",
+ "integrity": "sha1-tf3AjxKH6hF4Yo5BXiUTK3NkbG0=",
+ "dev": true
+ },
+ "simple-cli": {
+ "version": "5.0.5",
+ "resolved": "https://registry.npmjs.org/simple-cli/-/simple-cli-5.0.5.tgz",
+ "integrity": "sha512-Er2FhsIayL/sktxg6fOCdNQJBTXhlf/fswNFsdmks88xsHzQ/IXGwxYgSSKeXBq4yqn83/iD4Sg8yjagwysUgw==",
+ "dev": true,
+ "requires": {
+ "async": "^3.1.0",
+ "chalk": "^2.4.2",
+ "cross-spawn": "^7.0.0",
+ "key-list": "^0.1.4",
+ "lodash": "^4.17.15",
+ "opted": "^1.0.0"
+ },
+ "dependencies": {
+ "ansi-styles": {
+ "version": "3.2.1",
+ "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-3.2.1.tgz",
+ "integrity": "sha512-VT0ZI6kZRdTh8YyJw3SMbYm/u+NqfsAxEpWO0Pf9sq8/e94WxxOpPKx9FR1FlyCtOVDNOQ+8ntlqFxiRc+r5qA==",
+ "dev": true,
+ "requires": {
+ "color-convert": "^1.9.0"
+ }
+ },
+ "async": {
+ "version": "3.2.0",
+ "resolved": "https://registry.npmjs.org/async/-/async-3.2.0.tgz",
+ "integrity": "sha512-TR2mEZFVOj2pLStYxLht7TyfuRzaydfpxr3k9RpHIzMgw7A64dzsdqCxH1WJyQdoe8T10nDXd9wnEigmiuHIZw==",
+ "dev": true
+ },
+ "chalk": {
+ "version": "2.4.2",
+ "resolved": "https://registry.npmjs.org/chalk/-/chalk-2.4.2.tgz",
+ "integrity": "sha512-Mti+f9lpJNcwF4tWV8/OrTTtF1gZi+f8FqlyAdouralcFWFQWF2+NgCHShjkCb+IFBLq9buZwE1xckQU4peSuQ==",
+ "dev": true,
+ "requires": {
+ "ansi-styles": "^3.2.1",
+ "escape-string-regexp": "^1.0.5",
+ "supports-color": "^5.3.0"
+ }
+ },
+ "cross-spawn": {
+ "version": "7.0.1",
+ "resolved": "https://registry.npmjs.org/cross-spawn/-/cross-spawn-7.0.1.tgz",
+ "integrity": "sha512-u7v4o84SwFpD32Z8IIcPZ6z1/ie24O6RU3RbtL5Y316l3KuHVPx9ItBgWQ6VlfAFnRnTtMUrsQ9MUUTuEZjogg==",
+ "dev": true,
+ "requires": {
+ "path-key": "^3.1.0",
+ "shebang-command": "^2.0.0",
+ "which": "^2.0.1"
+ }
+ },
+ "shebang-command": {
+ "version": "2.0.0",
+ "resolved": "https://registry.npmjs.org/shebang-command/-/shebang-command-2.0.0.tgz",
+ "integrity": "sha512-kHxr2zZpYtdmrN1qDjrrX/Z1rR1kG8Dx+gkpK1G4eXmvXswmcE1hTWBWYUzlraYw1/yZp6YuDY77YtvbN0dmDA==",
+ "dev": true,
+ "requires": {
+ "shebang-regex": "^3.0.0"
+ }
+ },
+ "shebang-regex": {
+ "version": "3.0.0",
+ "resolved": "https://registry.npmjs.org/shebang-regex/-/shebang-regex-3.0.0.tgz",
+ "integrity": "sha512-7++dFhtcx3353uBaq8DDR4NuxBetBzC7ZQOhmTQInHEd6bSrXdiEyzCvG07Z44UYdLShWUyXt5M/yhz8ekcb1A==",
+ "dev": true
+ },
+ "supports-color": {
+ "version": "5.5.0",
+ "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-5.5.0.tgz",
+ "integrity": "sha512-QjVjwdXIt408MIiAqCX4oUKsgU2EqAGzs2Ppkm4aQYbjm+ZEWEcW4SfFNTr4uMNZma0ey4f5lgLrkB0aX0QMow==",
+ "dev": true,
+ "requires": {
+ "has-flag": "^3.0.0"
+ }
+ },
+ "which": {
+ "version": "2.0.2",
+ "resolved": "https://registry.npmjs.org/which/-/which-2.0.2.tgz",
+ "integrity": "sha512-BLI3Tl1TW3Pvl70l3yq3Y64i+awpwXqsGBYWkkqMtnbXgrMD+yj7rhW0kuEDxzJaYXGjEW5ogapKNMEKNMjibA==",
+ "dev": true,
+ "requires": {
+ "isexe": "^2.0.0"
+ }
+ }
+ }
+ },
+ "simple-concat": {
"version": "1.0.0",
- "resolved": "https://registry.npmjs.org/shebang-regex/-/shebang-regex-1.0.0.tgz",
- "integrity": "sha1-2kL0l0DAtC2yypcoVxyxkMmO/qM=",
- "dev": true
- },
- "signal-exit": {
- "version": "3.0.2",
- "resolved": "https://registry.npmjs.org/signal-exit/-/signal-exit-3.0.2.tgz",
- "integrity": "sha1-tf3AjxKH6hF4Yo5BXiUTK3NkbG0=",
+ "resolved": "https://registry.npmjs.org/simple-concat/-/simple-concat-1.0.0.tgz",
+ "integrity": "sha1-c0TLuLbib7J9ZrL8hvn21Zl1IcY=",
"dev": true
},
"sinon": {
@@ -3297,6 +7434,12 @@
}
}
},
+ "slash": {
+ "version": "1.0.0",
+ "resolved": "https://registry.npmjs.org/slash/-/slash-1.0.0.tgz",
+ "integrity": "sha1-xB8vbDn8FtHNF61LXYlhFK5HDVU=",
+ "dev": true
+ },
"slice-ansi": {
"version": "1.0.0",
"resolved": "https://registry.npmjs.org/slice-ansi/-/slice-ansi-1.0.0.tgz",
@@ -3319,34 +7462,146 @@
"resolved": "https://registry.npmjs.org/slide/-/slide-1.1.6.tgz",
"integrity": "sha1-VusCfWW00tzmyy4tMsTUr8nh1wc="
},
+ "snapdragon": {
+ "version": "0.8.2",
+ "resolved": "https://registry.npmjs.org/snapdragon/-/snapdragon-0.8.2.tgz",
+ "integrity": "sha512-FtyOnWN/wCHTVXOMwvSv26d+ko5vWlIDD6zoUJ7LW8vh+ZBC8QdljveRP+crNrtBwioEUWy/4dMtbBjA4ioNlg==",
+ "dev": true,
+ "requires": {
+ "base": "^0.11.1",
+ "debug": "^2.2.0",
+ "define-property": "^0.2.5",
+ "extend-shallow": "^2.0.1",
+ "map-cache": "^0.2.2",
+ "source-map": "^0.5.6",
+ "source-map-resolve": "^0.5.0",
+ "use": "^3.1.0"
+ },
+ "dependencies": {
+ "define-property": {
+ "version": "0.2.5",
+ "resolved": "https://registry.npmjs.org/define-property/-/define-property-0.2.5.tgz",
+ "integrity": "sha1-w1se+RjsPJkPmlvFe+BKrOxcgRY=",
+ "dev": true,
+ "requires": {
+ "is-descriptor": "^0.1.0"
+ }
+ },
+ "extend-shallow": {
+ "version": "2.0.1",
+ "resolved": "https://registry.npmjs.org/extend-shallow/-/extend-shallow-2.0.1.tgz",
+ "integrity": "sha1-Ua99YUrZqfYQ6huvu5idaxxWiQ8=",
+ "dev": true,
+ "requires": {
+ "is-extendable": "^0.1.0"
+ }
+ }
+ }
+ },
+ "snapdragon-node": {
+ "version": "2.1.1",
+ "resolved": "https://registry.npmjs.org/snapdragon-node/-/snapdragon-node-2.1.1.tgz",
+ "integrity": "sha512-O27l4xaMYt/RSQ5TR3vpWCAB5Kb/czIcqUFOM/C4fYcLnbZUc1PkjTAMjof2pBWaSTwOUd6qUHcFGVGj7aIwnw==",
+ "dev": true,
+ "requires": {
+ "define-property": "^1.0.0",
+ "isobject": "^3.0.0",
+ "snapdragon-util": "^3.0.1"
+ },
+ "dependencies": {
+ "define-property": {
+ "version": "1.0.0",
+ "resolved": "https://registry.npmjs.org/define-property/-/define-property-1.0.0.tgz",
+ "integrity": "sha1-dp66rz9KY6rTr56NMEybvnm/sOY=",
+ "dev": true,
+ "requires": {
+ "is-descriptor": "^1.0.0"
+ }
+ },
+ "is-accessor-descriptor": {
+ "version": "1.0.0",
+ "resolved": "https://registry.npmjs.org/is-accessor-descriptor/-/is-accessor-descriptor-1.0.0.tgz",
+ "integrity": "sha512-m5hnHTkcVsPfqx3AKlyttIPb7J+XykHvJP2B9bZDjlhLIoEq4XoK64Vg7boZlVWYK6LUY94dYPEE7Lh0ZkZKcQ==",
+ "dev": true,
+ "requires": {
+ "kind-of": "^6.0.0"
+ }
+ },
+ "is-data-descriptor": {
+ "version": "1.0.0",
+ "resolved": "https://registry.npmjs.org/is-data-descriptor/-/is-data-descriptor-1.0.0.tgz",
+ "integrity": "sha512-jbRXy1FmtAoCjQkVmIVYwuuqDFUbaOeDjmed1tOGPrsMhtJA4rD9tkgA0F1qJ3gRFRXcHYVkdeaP50Q5rE/jLQ==",
+ "dev": true,
+ "requires": {
+ "kind-of": "^6.0.0"
+ }
+ },
+ "is-descriptor": {
+ "version": "1.0.2",
+ "resolved": "https://registry.npmjs.org/is-descriptor/-/is-descriptor-1.0.2.tgz",
+ "integrity": "sha512-2eis5WqQGV7peooDyLmNEPUrps9+SXX5c9pL3xEB+4e9HnGuDa7mB7kHxHw4CbqS9k1T2hOH3miL8n8WtiYVtg==",
+ "dev": true,
+ "requires": {
+ "is-accessor-descriptor": "^1.0.0",
+ "is-data-descriptor": "^1.0.0",
+ "kind-of": "^6.0.2"
+ }
+ },
+ "isobject": {
+ "version": "3.0.1",
+ "resolved": "https://registry.npmjs.org/isobject/-/isobject-3.0.1.tgz",
+ "integrity": "sha1-TkMekrEalzFjaqH5yNHMvP2reN8=",
+ "dev": true
+ },
+ "kind-of": {
+ "version": "6.0.3",
+ "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-6.0.3.tgz",
+ "integrity": "sha512-dcS1ul+9tmeD95T+x28/ehLgd9mENa3LsvDTtzm3vyBEO7RPptvAD+t44WVXaUjTBRcrpFeFlC8WCruUR456hw==",
+ "dev": true
+ }
+ }
+ },
+ "snapdragon-util": {
+ "version": "3.0.1",
+ "resolved": "https://registry.npmjs.org/snapdragon-util/-/snapdragon-util-3.0.1.tgz",
+ "integrity": "sha512-mbKkMdQKsjX4BAL4bRYTj21edOf8cN7XHdYUJEe+Zn99hVEYcMvKPct1IqNe7+AZPirn8BCDOQBHQZknqmKlZQ==",
+ "dev": true,
+ "requires": {
+ "kind-of": "^3.2.0"
+ }
+ },
"source-map": {
"version": "0.5.7",
"resolved": "https://registry.npmjs.org/source-map/-/source-map-0.5.7.tgz",
"integrity": "sha1-igOdLRAh0i0eoUyA2OpGi6LvP8w=",
"dev": true
},
+ "source-map-resolve": {
+ "version": "0.5.3",
+ "resolved": "https://registry.npmjs.org/source-map-resolve/-/source-map-resolve-0.5.3.tgz",
+ "integrity": "sha512-Htz+RnsXWk5+P2slx5Jh3Q66vhQj1Cllm0zvnaY98+NFx+Dv2CF/f5O/t8x+KaNdrdIAsruNzoh/KpialbqAnw==",
+ "dev": true,
+ "requires": {
+ "atob": "^2.1.2",
+ "decode-uri-component": "^0.2.0",
+ "resolve-url": "^0.2.1",
+ "source-map-url": "^0.4.0",
+ "urix": "^0.1.0"
+ }
+ },
"source-map-support": {
- "version": "0.5.19",
- "resolved": "https://registry.npmjs.org/source-map-support/-/source-map-support-0.5.19.tgz",
- "integrity": "sha512-Wonm7zOCIJzBGQdB+thsPar0kYuCIzYvxZwlBa87yi/Mdjv7Tip2cyVbLj5o0cFPN4EVkuTwb3GDDyUx2DGnGw==",
+ "version": "0.4.18",
+ "resolved": "https://registry.npmjs.org/source-map-support/-/source-map-support-0.4.18.tgz",
+ "integrity": "sha512-try0/JqxPLF9nOjvSta7tVondkP5dwgyLDjVoyMDlmjugT2lRZ1OfsrYTkCd2hkDnJTKRbO/Rl3orm8vlsUzbA==",
"dev": true,
"requires": {
- "buffer-from": "^1.0.0",
- "source-map": "^0.6.0"
- },
- "dependencies": {
- "source-map": {
- "version": "0.6.1",
- "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz",
- "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==",
- "dev": true
- }
+ "source-map": "^0.5.6"
}
},
- "sourcemap-codec": {
- "version": "1.4.8",
- "resolved": "https://registry.npmjs.org/sourcemap-codec/-/sourcemap-codec-1.4.8.tgz",
- "integrity": "sha512-9NykojV5Uih4lgo5So5dtw+f0JgJX30KCNI8gwhz2J9A15wD0Ml6tjHKwf6fTSa6fAdVBdZeNOs9eJ71qCk8vA==",
+ "source-map-url": {
+ "version": "0.4.0",
+ "resolved": "https://registry.npmjs.org/source-map-url/-/source-map-url-0.4.0.tgz",
+ "integrity": "sha1-PpNdfd1zYxuXZZlW1VEo6HtQhKM=",
"dev": true
},
"spawn-wrap": {
@@ -3418,40 +7673,140 @@
"integrity": "sha1-yd96NCRZSt5r0RkA1ZZpbcBrrFc=",
"dev": true
},
+ "split-string": {
+ "version": "3.1.0",
+ "resolved": "https://registry.npmjs.org/split-string/-/split-string-3.1.0.tgz",
+ "integrity": "sha512-NzNVhJDYpwceVVii8/Hu6DKfD2G+NrQHlS/V/qgv763EYudVwEcMQNxd2lh+0VrUByXN/oJkl5grOhYWvQUYiw==",
+ "dev": true,
+ "requires": {
+ "extend-shallow": "^3.0.0"
+ }
+ },
"sprintf-js": {
"version": "1.0.3",
"resolved": "https://registry.npmjs.org/sprintf-js/-/sprintf-js-1.0.3.tgz",
"integrity": "sha1-BOaSb2YolTVPPdAVIDYzuFcpfiw=",
"dev": true
},
- "string-width": {
- "version": "3.1.0",
- "resolved": "https://registry.npmjs.org/string-width/-/string-width-3.1.0.tgz",
- "integrity": "sha512-vafcv6KjVZKSgz06oM/H6GDBrAtz8vdhQakGjFIvNrHA6y3HCF1CInLy+QLq8dTJPQ1b+KDUqDFctkdRW44e1w==",
+ "static-extend": {
+ "version": "0.1.2",
+ "resolved": "https://registry.npmjs.org/static-extend/-/static-extend-0.1.2.tgz",
+ "integrity": "sha1-YICcOcv/VTNyJv1eC1IPNB8ftcY=",
"dev": true,
"requires": {
- "emoji-regex": "^7.0.1",
- "is-fullwidth-code-point": "^2.0.0",
- "strip-ansi": "^5.1.0"
+ "define-property": "^0.2.5",
+ "object-copy": "^0.1.0"
},
"dependencies": {
- "ansi-regex": {
- "version": "4.1.0",
- "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-4.1.0.tgz",
- "integrity": "sha512-1apePfXM1UOSqw0o9IiFAovVz9M5S1Dg+4TrDwfMewQ6p/rmMueb7tWZjQ1rx4Loy1ArBggoqGpfqqdI4rondg==",
+ "define-property": {
+ "version": "0.2.5",
+ "resolved": "https://registry.npmjs.org/define-property/-/define-property-0.2.5.tgz",
+ "integrity": "sha1-w1se+RjsPJkPmlvFe+BKrOxcgRY=",
+ "dev": true,
+ "requires": {
+ "is-descriptor": "^0.1.0"
+ }
+ }
+ }
+ },
+ "statuses": {
+ "version": "1.3.1",
+ "resolved": "https://registry.npmjs.org/statuses/-/statuses-1.3.1.tgz",
+ "integrity": "sha1-+vUbnrdKrvOzrPStX2Gr8ky3uT4=",
+ "dev": true
+ },
+ "stream-browserify": {
+ "version": "2.0.1",
+ "resolved": "https://registry.npmjs.org/stream-browserify/-/stream-browserify-2.0.1.tgz",
+ "integrity": "sha1-ZiZu5fm9uZQKTkUUyvtDu3Hlyds=",
+ "dev": true,
+ "requires": {
+ "inherits": "~2.0.1",
+ "readable-stream": "^2.0.2"
+ }
+ },
+ "stream-combiner2": {
+ "version": "1.1.1",
+ "resolved": "https://registry.npmjs.org/stream-combiner2/-/stream-combiner2-1.1.1.tgz",
+ "integrity": "sha1-+02KFCDqNidk4hrUeAOXvry0HL4=",
+ "dev": true,
+ "requires": {
+ "duplexer2": "~0.1.0",
+ "readable-stream": "^2.0.2"
+ }
+ },
+ "stream-http": {
+ "version": "2.8.3",
+ "resolved": "https://registry.npmjs.org/stream-http/-/stream-http-2.8.3.tgz",
+ "integrity": "sha512-+TSkfINHDo4J+ZobQLWiMouQYB+UVYFttRA94FpEzzJ7ZdqcL4uUUQ7WkdkI4DSozGmgBUE/a47L+38PenXhUw==",
+ "dev": true,
+ "requires": {
+ "builtin-status-codes": "^3.0.0",
+ "inherits": "^2.0.1",
+ "readable-stream": "^2.3.6",
+ "to-arraybuffer": "^1.0.0",
+ "xtend": "^4.0.0"
+ },
+ "dependencies": {
+ "process-nextick-args": {
+ "version": "2.0.0",
+ "resolved": "https://registry.npmjs.org/process-nextick-args/-/process-nextick-args-2.0.0.tgz",
+ "integrity": "sha512-MtEC1TqN0EU5nephaJ4rAtThHtC86dNN9qCuEhtshvpVBkAW5ZO7BASN9REnF9eoXGcRub+pFuKEpOHE+HbEMw==",
"dev": true
},
- "strip-ansi": {
- "version": "5.2.0",
- "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-5.2.0.tgz",
- "integrity": "sha512-DuRs1gKbBqsMKIZlrffwlug8MHkcnpjs5VPmL1PAh+mA30U0DTotfDZ0d2UUsXpPmPmMMJ6W773MaA3J+lbiWA==",
+ "readable-stream": {
+ "version": "2.3.6",
+ "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-2.3.6.tgz",
+ "integrity": "sha512-tQtKA9WIAhBF3+VLAseyMqZeBjW0AHJoxOtYqSUZNJxauErmLbVm2FW1y+J/YA9dUrAC39ITejlZWhVIwawkKw==",
"dev": true,
"requires": {
- "ansi-regex": "^4.1.0"
+ "core-util-is": "~1.0.0",
+ "inherits": "~2.0.3",
+ "isarray": "~1.0.0",
+ "process-nextick-args": "~2.0.0",
+ "safe-buffer": "~5.1.1",
+ "string_decoder": "~1.1.1",
+ "util-deprecate": "~1.0.1"
+ }
+ },
+ "string_decoder": {
+ "version": "1.1.1",
+ "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-1.1.1.tgz",
+ "integrity": "sha512-n/ShnvDi6FHbbVfviro+WojiFzv+s8MPMHBczVePfUpDJLwoLT0ht1l4YwBCbi8pJAveEEdnkHyPyTP/mzRfwg==",
+ "dev": true,
+ "requires": {
+ "safe-buffer": "~5.1.0"
}
}
}
},
+ "stream-splicer": {
+ "version": "2.0.0",
+ "resolved": "https://registry.npmjs.org/stream-splicer/-/stream-splicer-2.0.0.tgz",
+ "integrity": "sha1-G2O+Q4oTPktnHMGTUZdgAXWRDYM=",
+ "dev": true,
+ "requires": {
+ "inherits": "^2.0.1",
+ "readable-stream": "^2.0.2"
+ }
+ },
+ "string-template": {
+ "version": "0.2.1",
+ "resolved": "https://registry.npmjs.org/string-template/-/string-template-0.2.1.tgz",
+ "integrity": "sha1-QpMuWYo1LQH8IuwzZ9nYTuxsmt0=",
+ "dev": true
+ },
+ "string-width": {
+ "version": "1.0.2",
+ "resolved": "https://registry.npmjs.org/string-width/-/string-width-1.0.2.tgz",
+ "integrity": "sha1-EYvfW4zcUaKn5w0hHgfisLmxB9M=",
+ "dev": true,
+ "requires": {
+ "code-point-at": "^1.0.0",
+ "is-fullwidth-code-point": "^1.0.0",
+ "strip-ansi": "^3.0.0"
+ }
+ },
"string_decoder": {
"version": "1.0.3",
"resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-1.0.3.tgz",
@@ -3470,18 +7825,62 @@
"ansi-regex": "^2.0.0"
}
},
+ "strip-bom": {
+ "version": "2.0.0",
+ "resolved": "https://registry.npmjs.org/strip-bom/-/strip-bom-2.0.0.tgz",
+ "integrity": "sha1-YhmoVhZSBJHzV4i9vxRHqZx+aw4=",
+ "dev": true,
+ "requires": {
+ "is-utf8": "^0.2.0"
+ }
+ },
+ "strip-indent": {
+ "version": "1.0.1",
+ "resolved": "https://registry.npmjs.org/strip-indent/-/strip-indent-1.0.1.tgz",
+ "integrity": "sha1-DHlipq3vp7vUrDZkYKY4VSrhoKI=",
+ "dev": true,
+ "requires": {
+ "get-stdin": "^4.0.1"
+ }
+ },
"strip-json-comments": {
"version": "2.0.1",
"resolved": "https://registry.npmjs.org/strip-json-comments/-/strip-json-comments-2.0.1.tgz",
"integrity": "sha1-PFMZQukIwml8DsNEhYwobHygpgo=",
"dev": true
},
+ "subarg": {
+ "version": "1.0.0",
+ "resolved": "https://registry.npmjs.org/subarg/-/subarg-1.0.0.tgz",
+ "integrity": "sha1-9izxdYHplrSPyWVpn1TAauJouNI=",
+ "dev": true,
+ "requires": {
+ "minimist": "^1.1.0"
+ },
+ "dependencies": {
+ "minimist": {
+ "version": "1.2.5",
+ "resolved": "https://registry.npmjs.org/minimist/-/minimist-1.2.5.tgz",
+ "integrity": "sha512-FM9nNUYrRBAELZQT3xeZQ7fmMOBg6nWNmJKTcgsJeaLstP/UODVpGsr5OhXhhXg6f+qtJ8uiZ+PUxkDWcgIXLw==",
+ "dev": true
+ }
+ }
+ },
"supports-color": {
"version": "2.0.0",
"resolved": "https://registry.npmjs.org/supports-color/-/supports-color-2.0.0.tgz",
"integrity": "sha1-U10EXOa2Nj+kARcIRimZXp3zJMc=",
"dev": true
},
+ "syntax-error": {
+ "version": "1.4.0",
+ "resolved": "https://registry.npmjs.org/syntax-error/-/syntax-error-1.4.0.tgz",
+ "integrity": "sha512-YPPlu67mdnHGTup2A8ff7BC2Pjq0e0Yp/IyTFN03zWO0RcK07uLcbi7C2KpGR2FvWbaB0+bfE27a+sBKebSo7w==",
+ "dev": true,
+ "requires": {
+ "acorn-node": "^1.2.0"
+ }
+ },
"table": {
"version": "4.0.2",
"resolved": "https://registry.npmjs.org/table/-/table-4.0.2.tgz",
@@ -3571,20 +7970,20 @@
"dev": true
},
"terser": {
- "version": "4.6.12",
- "resolved": "https://registry.npmjs.org/terser/-/terser-4.6.12.tgz",
- "integrity": "sha512-fnIwuaKjFPANG6MAixC/k1TDtnl1YlPLUlLVIxxGZUn1gfUx2+l3/zGNB72wya+lgsb50QBi2tUV75RiODwnww==",
+ "version": "3.14.1",
+ "resolved": "https://registry.npmjs.org/terser/-/terser-3.14.1.tgz",
+ "integrity": "sha512-NSo3E99QDbYSMeJaEk9YW2lTg3qS9V0aKGlb+PlOrei1X02r1wSBHCNX/O+yeTRFSWPKPIGj6MqvvdqV4rnVGw==",
"dev": true,
"requires": {
- "commander": "^2.20.0",
+ "commander": "~2.17.1",
"source-map": "~0.6.1",
- "source-map-support": "~0.5.12"
+ "source-map-support": "~0.5.6"
},
"dependencies": {
"commander": {
- "version": "2.20.3",
- "resolved": "https://registry.npmjs.org/commander/-/commander-2.20.3.tgz",
- "integrity": "sha512-GpVkmM8vF2vQUkj2LvZmD35JxeJOLCwJ9cUkugyk2nuhbv3+mJvpLYYt+0+USMxE+oj+ey/lJEnhZw75x/OMcQ==",
+ "version": "2.17.1",
+ "resolved": "https://registry.npmjs.org/commander/-/commander-2.17.1.tgz",
+ "integrity": "sha512-wPMUt6FnH2yzG95SA6mzjQOEKUU3aLaDEmzs1ti+1E9h+CsrZghRlqEM/EJ4KscsQVG8uNN4uVreUeT8+drlgg==",
"dev": true
},
"source-map": {
@@ -3592,6 +7991,16 @@
"resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz",
"integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==",
"dev": true
+ },
+ "source-map-support": {
+ "version": "0.5.10",
+ "resolved": "https://registry.npmjs.org/source-map-support/-/source-map-support-0.5.10.tgz",
+ "integrity": "sha512-YfQ3tQFTK/yzlGJuX8pTwa4tifQj4QS2Mj7UegOu8jAz59MqIiMGPXxQhVQiIMNzayuUSF/jEuVnfFF5JqybmQ==",
+ "dev": true,
+ "requires": {
+ "buffer-from": "^1.0.0",
+ "source-map": "^0.6.0"
+ }
}
}
},
@@ -3653,9 +8062,9 @@
}
},
"p-limit": {
- "version": "2.3.0",
- "resolved": "https://registry.npmjs.org/p-limit/-/p-limit-2.3.0.tgz",
- "integrity": "sha512-//88mFWSJx8lxCzwdAABTJL2MyWB12+eIY7MDL2SqLmAkeKU9qxRvWuSyTjm3FUmpBEMuFfckAIqEaVGUDxb6w==",
+ "version": "2.2.2",
+ "resolved": "https://registry.npmjs.org/p-limit/-/p-limit-2.2.2.tgz",
+ "integrity": "sha512-WGR+xHecKTr7EbUEhyLSh5Dube9JtdiG78ufaeLxTgpudf/20KqyMioIUZJAezlTIi6evxuoUs9YXc11cU+yzQ==",
"dev": true,
"requires": {
"p-try": "^2.0.0"
@@ -3728,6 +8137,12 @@
"read-pkg": "^3.0.0"
}
},
+ "require-main-filename": {
+ "version": "2.0.0",
+ "resolved": "https://registry.npmjs.org/require-main-filename/-/require-main-filename-2.0.0.tgz",
+ "integrity": "sha512-NKN5kMDylKuldxYLSUfrbo5Tuzh4hd+2E8NPPX02mZtn1VuREQToYe/ZdlJy+J3uCpfaiGF05e7B8W0iXbQHmg==",
+ "dev": true
+ },
"strip-bom": {
"version": "3.0.0",
"resolved": "https://registry.npmjs.org/strip-bom/-/strip-bom-3.0.0.tgz",
@@ -3754,6 +8169,76 @@
"integrity": "sha1-DdTJ/6q8NXlgsbckEV1+Doai4fU=",
"dev": true
},
+ "through2": {
+ "version": "1.1.1",
+ "resolved": "https://registry.npmjs.org/through2/-/through2-1.1.1.tgz",
+ "integrity": "sha1-CEfLxESfNAVXTb3M2buEG4OsNUU=",
+ "dev": true,
+ "requires": {
+ "readable-stream": ">=1.1.13-1 <1.2.0-0",
+ "xtend": ">=4.0.0 <4.1.0-0"
+ },
+ "dependencies": {
+ "isarray": {
+ "version": "0.0.1",
+ "resolved": "https://registry.npmjs.org/isarray/-/isarray-0.0.1.tgz",
+ "integrity": "sha1-ihis/Kmo9Bd+Cav8YDiTmwXR7t8=",
+ "dev": true
+ },
+ "readable-stream": {
+ "version": "1.1.14",
+ "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-1.1.14.tgz",
+ "integrity": "sha1-fPTFTvZI44EwhMY23SB54WbAgdk=",
+ "dev": true,
+ "requires": {
+ "core-util-is": "~1.0.0",
+ "inherits": "~2.0.1",
+ "isarray": "0.0.1",
+ "string_decoder": "~0.10.x"
+ }
+ },
+ "string_decoder": {
+ "version": "0.10.31",
+ "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-0.10.31.tgz",
+ "integrity": "sha1-YuIDvEF2bGwoyfyEMB2rHFMQ+pQ=",
+ "dev": true
+ }
+ }
+ },
+ "timers-browserify": {
+ "version": "1.4.2",
+ "resolved": "https://registry.npmjs.org/timers-browserify/-/timers-browserify-1.4.2.tgz",
+ "integrity": "sha1-ycWLV1voQHN1y14kYtrO50NZ9B0=",
+ "dev": true,
+ "requires": {
+ "process": "~0.11.0"
+ }
+ },
+ "tiny-lr": {
+ "version": "1.1.1",
+ "resolved": "https://registry.npmjs.org/tiny-lr/-/tiny-lr-1.1.1.tgz",
+ "integrity": "sha512-44yhA3tsaRoMOjQQ+5v5mVdqef+kH6Qze9jTpqtVufgYjYt08zyZAwNwwVBj3i1rJMnR52IxOW0LK0vBzgAkuA==",
+ "dev": true,
+ "requires": {
+ "body": "^5.1.0",
+ "debug": "^3.1.0",
+ "faye-websocket": "~0.10.0",
+ "livereload-js": "^2.3.0",
+ "object-assign": "^4.1.0",
+ "qs": "^6.4.0"
+ },
+ "dependencies": {
+ "debug": {
+ "version": "3.1.0",
+ "resolved": "https://registry.npmjs.org/debug/-/debug-3.1.0.tgz",
+ "integrity": "sha512-OX8XqP7/1a9cqkxYw2yXss15f26NKWBpDXQd0/uK/KPqdQhxbPa994hnzjcE2VqQpDslf55723cKPUOGSmMY3g==",
+ "dev": true,
+ "requires": {
+ "ms": "2.0.0"
+ }
+ }
+ }
+ },
"tmp": {
"version": "0.0.33",
"resolved": "https://registry.npmjs.org/tmp/-/tmp-0.0.33.tgz",
@@ -3763,10 +8248,76 @@
"os-tmpdir": "~1.0.2"
}
},
- "to-fast-properties": {
- "version": "2.0.0",
- "resolved": "https://registry.npmjs.org/to-fast-properties/-/to-fast-properties-2.0.0.tgz",
- "integrity": "sha1-3F5pjL0HkmW8c+A3doGk5Og/YW4=",
+ "to-arraybuffer": {
+ "version": "1.0.1",
+ "resolved": "https://registry.npmjs.org/to-arraybuffer/-/to-arraybuffer-1.0.1.tgz",
+ "integrity": "sha1-fSKbH8xjfkZsoIEYCDanqr/4P0M=",
+ "dev": true
+ },
+ "to-fast-properties": {
+ "version": "1.0.3",
+ "resolved": "https://registry.npmjs.org/to-fast-properties/-/to-fast-properties-1.0.3.tgz",
+ "integrity": "sha1-uDVx+k2MJbguIxsG46MFXeTKGkc=",
+ "dev": true
+ },
+ "to-object-path": {
+ "version": "0.3.0",
+ "resolved": "https://registry.npmjs.org/to-object-path/-/to-object-path-0.3.0.tgz",
+ "integrity": "sha1-KXWIt7Dn4KwI4E5nL4XB9JmeF68=",
+ "dev": true,
+ "requires": {
+ "kind-of": "^3.0.2"
+ }
+ },
+ "to-regex": {
+ "version": "3.0.2",
+ "resolved": "https://registry.npmjs.org/to-regex/-/to-regex-3.0.2.tgz",
+ "integrity": "sha512-FWtleNAtZ/Ki2qtqej2CXTOayOH9bHDQF+Q48VpWyDXjbYxA4Yz8iDB31zXOBUlOHHKidDbqGVrTUvQMPmBGBw==",
+ "dev": true,
+ "requires": {
+ "define-property": "^2.0.2",
+ "extend-shallow": "^3.0.2",
+ "regex-not": "^1.0.2",
+ "safe-regex": "^1.1.0"
+ }
+ },
+ "to-regex-range": {
+ "version": "2.1.1",
+ "resolved": "https://registry.npmjs.org/to-regex-range/-/to-regex-range-2.1.1.tgz",
+ "integrity": "sha1-fIDBe53+vlmeJzZ+DU3VWQFB2zg=",
+ "dev": true,
+ "requires": {
+ "is-number": "^3.0.0",
+ "repeat-string": "^1.6.1"
+ },
+ "dependencies": {
+ "is-number": {
+ "version": "3.0.0",
+ "resolved": "https://registry.npmjs.org/is-number/-/is-number-3.0.0.tgz",
+ "integrity": "sha1-JP1iAaR4LPUFYcgQJ2r8fRLXEZU=",
+ "dev": true,
+ "requires": {
+ "kind-of": "^3.0.2"
+ }
+ }
+ }
+ },
+ "trim-newlines": {
+ "version": "1.0.0",
+ "resolved": "https://registry.npmjs.org/trim-newlines/-/trim-newlines-1.0.0.tgz",
+ "integrity": "sha1-WIeWa7WCpFA6QetST301ARgVphM=",
+ "dev": true
+ },
+ "trim-right": {
+ "version": "1.0.1",
+ "resolved": "https://registry.npmjs.org/trim-right/-/trim-right-1.0.1.tgz",
+ "integrity": "sha1-yy4SAwZ+DI3h9hQJS5/kVwTqYAM=",
+ "dev": true
+ },
+ "tty-browserify": {
+ "version": "0.0.1",
+ "resolved": "https://registry.npmjs.org/tty-browserify/-/tty-browserify-0.0.1.tgz",
+ "integrity": "sha512-C3TaO7K81YvjCgQH9Q1S3R3P3BtN3RIM8n+OvX4il1K1zgE8ZhI0op7kClgkxtutIE8hQrcrHBXvIheqKUUCxw==",
"dev": true
},
"tweetnacl": {
@@ -3795,45 +8346,178 @@
"integrity": "sha1-hnrHTjhkGHsdPUfZlqeOxciDB3c=",
"dev": true
},
- "typescript": {
- "version": "4.1.2",
- "resolved": "https://registry.npmjs.org/typescript/-/typescript-4.1.2.tgz",
- "integrity": "sha512-thGloWsGH3SOxv1SoY7QojKi0tc+8FnOmiarEGMbd/lar7QOEd3hvlx3Fp5y6FlDUGl9L+pd4n2e+oToGMmhRQ==",
+ "umd": {
+ "version": "3.0.3",
+ "resolved": "https://registry.npmjs.org/umd/-/umd-3.0.3.tgz",
+ "integrity": "sha512-4IcGSufhFshvLNcMCV80UnQVlZ5pMOC8mvNPForqwA4+lzYQuetTESLDQkeLmihq8bRcnpbQa48Wb8Lh16/xow==",
"dev": true
},
- "uc.micro": {
- "version": "1.0.6",
- "resolved": "https://registry.npmjs.org/uc.micro/-/uc.micro-1.0.6.tgz",
- "integrity": "sha512-8Y75pvTYkLJW2hWQHXxoqRgV7qb9B+9vFEtidML+7koHUFapnVJAZ6cKs+Qjz5Aw3aZWHMC6u0wJE3At+nSGwA==",
- "dev": true
+ "undeclared-identifiers": {
+ "version": "1.1.2",
+ "resolved": "https://registry.npmjs.org/undeclared-identifiers/-/undeclared-identifiers-1.1.2.tgz",
+ "integrity": "sha512-13EaeocO4edF/3JKime9rD7oB6QI8llAGhgn5fKOPyfkJbRb6NFv9pYV6dFEmpa4uRjKeBqLZP8GpuzqHlKDMQ==",
+ "dev": true,
+ "requires": {
+ "acorn-node": "^1.3.0",
+ "get-assigned-identifiers": "^1.2.0",
+ "simple-concat": "^1.0.0",
+ "xtend": "^4.0.1"
+ }
},
"underscore": {
- "version": "1.10.2",
- "resolved": "https://registry.npmjs.org/underscore/-/underscore-1.10.2.tgz",
- "integrity": "sha512-N4P+Q/BuyuEKFJ43B9gYuOj4TQUHXX+j2FqguVOpjkssLUUrnJofCcBccJSCoeturDoZU6GorDTHSvUDlSQbTg==",
+ "version": "1.8.3",
+ "resolved": "https://registry.npmjs.org/underscore/-/underscore-1.8.3.tgz",
+ "integrity": "sha1-Tz+1OxBuYJf8+ctBCfKl6b36UCI=",
"dev": true
},
- "union": {
- "version": "0.5.0",
- "resolved": "https://registry.npmjs.org/union/-/union-0.5.0.tgz",
- "integrity": "sha512-N6uOhuW6zO95P3Mel2I2zMsbsanvvtgn6jVqJv4vbVcz/JN0OkL9suomjQGmWtxJQXOCqUJvquc1sMeNz/IwlA==",
+ "underscore-contrib": {
+ "version": "0.3.0",
+ "resolved": "https://registry.npmjs.org/underscore-contrib/-/underscore-contrib-0.3.0.tgz",
+ "integrity": "sha1-ZltmwkeD+PorGMn4y7Dix9SMJsc=",
"dev": true,
"requires": {
- "qs": "^6.4.0"
+ "underscore": "1.6.0"
+ },
+ "dependencies": {
+ "underscore": {
+ "version": "1.6.0",
+ "resolved": "https://registry.npmjs.org/underscore/-/underscore-1.6.0.tgz",
+ "integrity": "sha1-izixDKze9jM3uLJOT/htRa6lKag=",
+ "dev": true
+ }
}
},
- "url-join": {
- "version": "2.0.5",
- "resolved": "https://registry.npmjs.org/url-join/-/url-join-2.0.5.tgz",
- "integrity": "sha1-WvIvGMBSoACkjXuCxenC4v7tpyg=",
+ "underscore.string": {
+ "version": "3.3.5",
+ "resolved": "https://registry.npmjs.org/underscore.string/-/underscore.string-3.3.5.tgz",
+ "integrity": "sha512-g+dpmgn+XBneLmXXo+sGlW5xQEt4ErkS3mgeN2GFbremYeMBSJKr9Wf2KJplQVaiPY/f7FN6atosWYNm9ovrYg==",
+ "dev": true,
+ "requires": {
+ "sprintf-js": "^1.0.3",
+ "util-deprecate": "^1.0.2"
+ }
+ },
+ "union-value": {
+ "version": "1.0.1",
+ "resolved": "https://registry.npmjs.org/union-value/-/union-value-1.0.1.tgz",
+ "integrity": "sha512-tJfXmxMeWYnczCVs7XAEvIV7ieppALdyepWMkHkwciRpZraG/xwT+s2JN8+pr1+8jCRf80FFzvr+MpQeeoF4Xg==",
+ "dev": true,
+ "requires": {
+ "arr-union": "^3.1.0",
+ "get-value": "^2.0.6",
+ "is-extendable": "^0.1.1",
+ "set-value": "^2.0.1"
+ }
+ },
+ "unpipe": {
+ "version": "1.0.0",
+ "resolved": "https://registry.npmjs.org/unpipe/-/unpipe-1.0.0.tgz",
+ "integrity": "sha1-sr9O6FFKrmFltIF4KdIbLvSZBOw=",
+ "dev": true
+ },
+ "unset-value": {
+ "version": "1.0.0",
+ "resolved": "https://registry.npmjs.org/unset-value/-/unset-value-1.0.0.tgz",
+ "integrity": "sha1-g3aHP30jNRef+x5vw6jtDfyKtVk=",
+ "dev": true,
+ "requires": {
+ "has-value": "^0.3.1",
+ "isobject": "^3.0.0"
+ },
+ "dependencies": {
+ "has-value": {
+ "version": "0.3.1",
+ "resolved": "https://registry.npmjs.org/has-value/-/has-value-0.3.1.tgz",
+ "integrity": "sha1-ex9YutpiyoJ+wKIHgCVlSEWZXh8=",
+ "dev": true,
+ "requires": {
+ "get-value": "^2.0.3",
+ "has-values": "^0.1.4",
+ "isobject": "^2.0.0"
+ },
+ "dependencies": {
+ "isobject": {
+ "version": "2.1.0",
+ "resolved": "https://registry.npmjs.org/isobject/-/isobject-2.1.0.tgz",
+ "integrity": "sha1-8GVWEJaj8dou9GJy+BXIQNh+DIk=",
+ "dev": true,
+ "requires": {
+ "isarray": "1.0.0"
+ }
+ }
+ }
+ },
+ "has-values": {
+ "version": "0.1.4",
+ "resolved": "https://registry.npmjs.org/has-values/-/has-values-0.1.4.tgz",
+ "integrity": "sha1-bWHeldkd/Km5oCCJrThL/49it3E=",
+ "dev": true
+ },
+ "isobject": {
+ "version": "3.0.1",
+ "resolved": "https://registry.npmjs.org/isobject/-/isobject-3.0.1.tgz",
+ "integrity": "sha1-TkMekrEalzFjaqH5yNHMvP2reN8=",
+ "dev": true
+ }
+ }
+ },
+ "upath": {
+ "version": "1.2.0",
+ "resolved": "https://registry.npmjs.org/upath/-/upath-1.2.0.tgz",
+ "integrity": "sha512-aZwGpamFO61g3OlfT7OQCHqhGnW43ieH9WZeP7QxN/G/jS4jfqUkZxoryvJgVPEcrl5NL/ggHsSmLMHuH64Lhg==",
+ "dev": true
+ },
+ "urix": {
+ "version": "0.1.0",
+ "resolved": "https://registry.npmjs.org/urix/-/urix-0.1.0.tgz",
+ "integrity": "sha1-2pN/emLiH+wf0Y1Js1wpNQZ6bHI=",
+ "dev": true
+ },
+ "url": {
+ "version": "0.11.0",
+ "resolved": "https://registry.npmjs.org/url/-/url-0.11.0.tgz",
+ "integrity": "sha1-ODjpfPxgUh63PFJajlW/3Z4uKPE=",
+ "dev": true,
+ "requires": {
+ "punycode": "1.3.2",
+ "querystring": "0.2.0"
+ },
+ "dependencies": {
+ "punycode": {
+ "version": "1.3.2",
+ "resolved": "https://registry.npmjs.org/punycode/-/punycode-1.3.2.tgz",
+ "integrity": "sha1-llOgNvt8HuQjQvIyXM7v6jkmxI0=",
+ "dev": true
+ }
+ }
+ },
+ "use": {
+ "version": "3.1.1",
+ "resolved": "https://registry.npmjs.org/use/-/use-3.1.1.tgz",
+ "integrity": "sha512-cwESVXlO3url9YWlFW/TA9cshCEhtu7IKJ/p5soJ/gGpj7vbvFrAY/eIioQ6Dw23KjZhYgiIo8HOs1nQ2vr/oQ==",
"dev": true
},
+ "util": {
+ "version": "0.10.4",
+ "resolved": "https://registry.npmjs.org/util/-/util-0.10.4.tgz",
+ "integrity": "sha512-0Pm9hTQ3se5ll1XihRic3FDIku70C+iHUdT/W926rSgHV5QgXsYbKZN8MSC3tJtSkhuROzvsQjAaFENRXr+19A==",
+ "dev": true,
+ "requires": {
+ "inherits": "2.0.3"
+ }
+ },
"util-deprecate": {
"version": "1.0.2",
"resolved": "https://registry.npmjs.org/util-deprecate/-/util-deprecate-1.0.2.tgz",
"integrity": "sha1-RQ1Nyfpw3nMnYvvS1KKJgUGaDM8=",
"dev": true
},
+ "utils-merge": {
+ "version": "1.0.1",
+ "resolved": "https://registry.npmjs.org/utils-merge/-/utils-merge-1.0.1.tgz",
+ "integrity": "sha1-n5VxD1CiZ5R7LMwSR0HBAoQn5xM=",
+ "dev": true
+ },
"uuid": {
"version": "3.4.0",
"resolved": "https://registry.npmjs.org/uuid/-/uuid-3.4.0.tgz",
@@ -3850,19 +8534,449 @@
"spdx-expression-parse": "~1.0.0"
}
},
+ "vm-browserify": {
+ "version": "1.1.0",
+ "resolved": "https://registry.npmjs.org/vm-browserify/-/vm-browserify-1.1.0.tgz",
+ "integrity": "sha512-iq+S7vZJE60yejDYM0ek6zg308+UZsdtPExWP9VZoCFCz1zkJoXFnAX7aZfd/ZwrkidzdUZL0C/ryW+JwAiIGw==",
+ "dev": true
+ },
+ "watchify": {
+ "version": "3.11.1",
+ "resolved": "https://registry.npmjs.org/watchify/-/watchify-3.11.1.tgz",
+ "integrity": "sha512-WwnUClyFNRMB2NIiHgJU9RQPQNqVeFk7OmZaWf5dC5EnNa0Mgr7imBydbaJ7tGTuPM2hz1Cb4uiBvK9NVxMfog==",
+ "dev": true,
+ "requires": {
+ "anymatch": "^2.0.0",
+ "browserify": "^16.1.0",
+ "chokidar": "^2.1.1",
+ "defined": "^1.0.0",
+ "outpipe": "^1.1.0",
+ "through2": "^2.0.0",
+ "xtend": "^4.0.0"
+ },
+ "dependencies": {
+ "anymatch": {
+ "version": "2.0.0",
+ "resolved": "https://registry.npmjs.org/anymatch/-/anymatch-2.0.0.tgz",
+ "integrity": "sha512-5teOsQWABXHHBFP9y3skS5P3d/WfWXpv3FUpy+LorMrNYaT9pI4oLMQX7jzQ2KklNpGpWHzdCXTDT2Y3XGlZBw==",
+ "dev": true,
+ "requires": {
+ "micromatch": "^3.1.4",
+ "normalize-path": "^2.1.1"
+ }
+ },
+ "arr-diff": {
+ "version": "4.0.0",
+ "resolved": "https://registry.npmjs.org/arr-diff/-/arr-diff-4.0.0.tgz",
+ "integrity": "sha1-1kYQdP6/7HHn4VI1dhoyml3HxSA=",
+ "dev": true
+ },
+ "array-unique": {
+ "version": "0.3.2",
+ "resolved": "https://registry.npmjs.org/array-unique/-/array-unique-0.3.2.tgz",
+ "integrity": "sha1-qJS3XUvE9s1nnvMkSp/Y9Gri1Cg=",
+ "dev": true
+ },
+ "braces": {
+ "version": "2.3.2",
+ "resolved": "https://registry.npmjs.org/braces/-/braces-2.3.2.tgz",
+ "integrity": "sha512-aNdbnj9P8PjdXU4ybaWLK2IF3jc/EoDYbC7AazW6to3TRsfXxscC9UXOB5iDiEQrkyIbWp2SLQda4+QAa7nc3w==",
+ "dev": true,
+ "requires": {
+ "arr-flatten": "^1.1.0",
+ "array-unique": "^0.3.2",
+ "extend-shallow": "^2.0.1",
+ "fill-range": "^4.0.0",
+ "isobject": "^3.0.1",
+ "repeat-element": "^1.1.2",
+ "snapdragon": "^0.8.1",
+ "snapdragon-node": "^2.0.1",
+ "split-string": "^3.0.2",
+ "to-regex": "^3.0.1"
+ },
+ "dependencies": {
+ "extend-shallow": {
+ "version": "2.0.1",
+ "resolved": "https://registry.npmjs.org/extend-shallow/-/extend-shallow-2.0.1.tgz",
+ "integrity": "sha1-Ua99YUrZqfYQ6huvu5idaxxWiQ8=",
+ "dev": true,
+ "requires": {
+ "is-extendable": "^0.1.0"
+ }
+ }
+ }
+ },
+ "chokidar": {
+ "version": "2.1.8",
+ "resolved": "https://registry.npmjs.org/chokidar/-/chokidar-2.1.8.tgz",
+ "integrity": "sha512-ZmZUazfOzf0Nve7duiCKD23PFSCs4JPoYyccjUFF3aQkQadqBhfzhjkwBH2mNOG9cTBwhamM37EIsIkZw3nRgg==",
+ "dev": true,
+ "requires": {
+ "anymatch": "^2.0.0",
+ "async-each": "^1.0.1",
+ "braces": "^2.3.2",
+ "fsevents": "^1.2.7",
+ "glob-parent": "^3.1.0",
+ "inherits": "^2.0.3",
+ "is-binary-path": "^1.0.0",
+ "is-glob": "^4.0.0",
+ "normalize-path": "^3.0.0",
+ "path-is-absolute": "^1.0.0",
+ "readdirp": "^2.2.1",
+ "upath": "^1.1.1"
+ },
+ "dependencies": {
+ "normalize-path": {
+ "version": "3.0.0",
+ "resolved": "https://registry.npmjs.org/normalize-path/-/normalize-path-3.0.0.tgz",
+ "integrity": "sha512-6eZs5Ls3WtCisHWp9S2GUy8dqkpGi4BVSz3GaqiE6ezub0512ESztXUwUB6C6IKbQkY2Pnb/mD4WYojCRwcwLA==",
+ "dev": true
+ }
+ }
+ },
+ "expand-brackets": {
+ "version": "2.1.4",
+ "resolved": "https://registry.npmjs.org/expand-brackets/-/expand-brackets-2.1.4.tgz",
+ "integrity": "sha1-t3c14xXOMPa27/D4OwQVGiJEliI=",
+ "dev": true,
+ "requires": {
+ "debug": "^2.3.3",
+ "define-property": "^0.2.5",
+ "extend-shallow": "^2.0.1",
+ "posix-character-classes": "^0.1.0",
+ "regex-not": "^1.0.0",
+ "snapdragon": "^0.8.1",
+ "to-regex": "^3.0.1"
+ },
+ "dependencies": {
+ "define-property": {
+ "version": "0.2.5",
+ "resolved": "https://registry.npmjs.org/define-property/-/define-property-0.2.5.tgz",
+ "integrity": "sha1-w1se+RjsPJkPmlvFe+BKrOxcgRY=",
+ "dev": true,
+ "requires": {
+ "is-descriptor": "^0.1.0"
+ }
+ },
+ "extend-shallow": {
+ "version": "2.0.1",
+ "resolved": "https://registry.npmjs.org/extend-shallow/-/extend-shallow-2.0.1.tgz",
+ "integrity": "sha1-Ua99YUrZqfYQ6huvu5idaxxWiQ8=",
+ "dev": true,
+ "requires": {
+ "is-extendable": "^0.1.0"
+ }
+ },
+ "is-accessor-descriptor": {
+ "version": "0.1.6",
+ "resolved": "https://registry.npmjs.org/is-accessor-descriptor/-/is-accessor-descriptor-0.1.6.tgz",
+ "integrity": "sha1-qeEss66Nh2cn7u84Q/igiXtcmNY=",
+ "dev": true,
+ "requires": {
+ "kind-of": "^3.0.2"
+ },
+ "dependencies": {
+ "kind-of": {
+ "version": "3.2.2",
+ "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-3.2.2.tgz",
+ "integrity": "sha1-MeohpzS6ubuw8yRm2JOupR5KPGQ=",
+ "dev": true,
+ "requires": {
+ "is-buffer": "^1.1.5"
+ }
+ }
+ }
+ },
+ "is-data-descriptor": {
+ "version": "0.1.4",
+ "resolved": "https://registry.npmjs.org/is-data-descriptor/-/is-data-descriptor-0.1.4.tgz",
+ "integrity": "sha1-C17mSDiOLIYCgueT8YVv7D8wG1Y=",
+ "dev": true,
+ "requires": {
+ "kind-of": "^3.0.2"
+ },
+ "dependencies": {
+ "kind-of": {
+ "version": "3.2.2",
+ "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-3.2.2.tgz",
+ "integrity": "sha1-MeohpzS6ubuw8yRm2JOupR5KPGQ=",
+ "dev": true,
+ "requires": {
+ "is-buffer": "^1.1.5"
+ }
+ }
+ }
+ },
+ "is-descriptor": {
+ "version": "0.1.6",
+ "resolved": "https://registry.npmjs.org/is-descriptor/-/is-descriptor-0.1.6.tgz",
+ "integrity": "sha512-avDYr0SB3DwO9zsMov0gKCESFYqCnE4hq/4z3TdUlukEy5t9C0YRq7HLrsN52NAcqXKaepeCD0n+B0arnVG3Hg==",
+ "dev": true,
+ "requires": {
+ "is-accessor-descriptor": "^0.1.6",
+ "is-data-descriptor": "^0.1.4",
+ "kind-of": "^5.0.0"
+ }
+ },
+ "kind-of": {
+ "version": "5.1.0",
+ "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-5.1.0.tgz",
+ "integrity": "sha512-NGEErnH6F2vUuXDh+OlbcKW7/wOcfdRHaZ7VWtqCztfHri/++YKmP51OdWeGPuqCOba6kk2OTe5d02VmTB80Pw==",
+ "dev": true
+ }
+ }
+ },
+ "extglob": {
+ "version": "2.0.4",
+ "resolved": "https://registry.npmjs.org/extglob/-/extglob-2.0.4.tgz",
+ "integrity": "sha512-Nmb6QXkELsuBr24CJSkilo6UHHgbekK5UiZgfE6UHD3Eb27YC6oD+bhcT+tJ6cl8dmsgdQxnWlcry8ksBIBLpw==",
+ "dev": true,
+ "requires": {
+ "array-unique": "^0.3.2",
+ "define-property": "^1.0.0",
+ "expand-brackets": "^2.1.4",
+ "extend-shallow": "^2.0.1",
+ "fragment-cache": "^0.2.1",
+ "regex-not": "^1.0.0",
+ "snapdragon": "^0.8.1",
+ "to-regex": "^3.0.1"
+ },
+ "dependencies": {
+ "define-property": {
+ "version": "1.0.0",
+ "resolved": "https://registry.npmjs.org/define-property/-/define-property-1.0.0.tgz",
+ "integrity": "sha1-dp66rz9KY6rTr56NMEybvnm/sOY=",
+ "dev": true,
+ "requires": {
+ "is-descriptor": "^1.0.0"
+ }
+ },
+ "extend-shallow": {
+ "version": "2.0.1",
+ "resolved": "https://registry.npmjs.org/extend-shallow/-/extend-shallow-2.0.1.tgz",
+ "integrity": "sha1-Ua99YUrZqfYQ6huvu5idaxxWiQ8=",
+ "dev": true,
+ "requires": {
+ "is-extendable": "^0.1.0"
+ }
+ }
+ }
+ },
+ "fill-range": {
+ "version": "4.0.0",
+ "resolved": "https://registry.npmjs.org/fill-range/-/fill-range-4.0.0.tgz",
+ "integrity": "sha1-1USBHUKPmOsGpj3EAtJAPDKMOPc=",
+ "dev": true,
+ "requires": {
+ "extend-shallow": "^2.0.1",
+ "is-number": "^3.0.0",
+ "repeat-string": "^1.6.1",
+ "to-regex-range": "^2.1.0"
+ },
+ "dependencies": {
+ "extend-shallow": {
+ "version": "2.0.1",
+ "resolved": "https://registry.npmjs.org/extend-shallow/-/extend-shallow-2.0.1.tgz",
+ "integrity": "sha1-Ua99YUrZqfYQ6huvu5idaxxWiQ8=",
+ "dev": true,
+ "requires": {
+ "is-extendable": "^0.1.0"
+ }
+ }
+ }
+ },
+ "glob-parent": {
+ "version": "3.1.0",
+ "resolved": "https://registry.npmjs.org/glob-parent/-/glob-parent-3.1.0.tgz",
+ "integrity": "sha1-nmr2KZ2NO9K9QEMIMr0RPfkGxa4=",
+ "dev": true,
+ "requires": {
+ "is-glob": "^3.1.0",
+ "path-dirname": "^1.0.0"
+ },
+ "dependencies": {
+ "is-glob": {
+ "version": "3.1.0",
+ "resolved": "https://registry.npmjs.org/is-glob/-/is-glob-3.1.0.tgz",
+ "integrity": "sha1-e6WuJCF4BKxwcHuWkiVnSGzD6Eo=",
+ "dev": true,
+ "requires": {
+ "is-extglob": "^2.1.0"
+ }
+ }
+ }
+ },
+ "is-accessor-descriptor": {
+ "version": "1.0.0",
+ "resolved": "https://registry.npmjs.org/is-accessor-descriptor/-/is-accessor-descriptor-1.0.0.tgz",
+ "integrity": "sha512-m5hnHTkcVsPfqx3AKlyttIPb7J+XykHvJP2B9bZDjlhLIoEq4XoK64Vg7boZlVWYK6LUY94dYPEE7Lh0ZkZKcQ==",
+ "dev": true,
+ "requires": {
+ "kind-of": "^6.0.0"
+ }
+ },
+ "is-data-descriptor": {
+ "version": "1.0.0",
+ "resolved": "https://registry.npmjs.org/is-data-descriptor/-/is-data-descriptor-1.0.0.tgz",
+ "integrity": "sha512-jbRXy1FmtAoCjQkVmIVYwuuqDFUbaOeDjmed1tOGPrsMhtJA4rD9tkgA0F1qJ3gRFRXcHYVkdeaP50Q5rE/jLQ==",
+ "dev": true,
+ "requires": {
+ "kind-of": "^6.0.0"
+ }
+ },
+ "is-descriptor": {
+ "version": "1.0.2",
+ "resolved": "https://registry.npmjs.org/is-descriptor/-/is-descriptor-1.0.2.tgz",
+ "integrity": "sha512-2eis5WqQGV7peooDyLmNEPUrps9+SXX5c9pL3xEB+4e9HnGuDa7mB7kHxHw4CbqS9k1T2hOH3miL8n8WtiYVtg==",
+ "dev": true,
+ "requires": {
+ "is-accessor-descriptor": "^1.0.0",
+ "is-data-descriptor": "^1.0.0",
+ "kind-of": "^6.0.2"
+ }
+ },
+ "is-extglob": {
+ "version": "2.1.1",
+ "resolved": "https://registry.npmjs.org/is-extglob/-/is-extglob-2.1.1.tgz",
+ "integrity": "sha1-qIwCU1eR8C7TfHahueqXc8gz+MI=",
+ "dev": true
+ },
+ "is-glob": {
+ "version": "4.0.1",
+ "resolved": "https://registry.npmjs.org/is-glob/-/is-glob-4.0.1.tgz",
+ "integrity": "sha512-5G0tKtBTFImOqDnLB2hG6Bp2qcKEFduo4tZu9MT/H6NQv/ghhy30o55ufafxJ/LdH79LLs2Kfrn85TLKyA7BUg==",
+ "dev": true,
+ "requires": {
+ "is-extglob": "^2.1.1"
+ }
+ },
+ "is-number": {
+ "version": "3.0.0",
+ "resolved": "https://registry.npmjs.org/is-number/-/is-number-3.0.0.tgz",
+ "integrity": "sha1-JP1iAaR4LPUFYcgQJ2r8fRLXEZU=",
+ "dev": true,
+ "requires": {
+ "kind-of": "^3.0.2"
+ },
+ "dependencies": {
+ "kind-of": {
+ "version": "3.2.2",
+ "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-3.2.2.tgz",
+ "integrity": "sha1-MeohpzS6ubuw8yRm2JOupR5KPGQ=",
+ "dev": true,
+ "requires": {
+ "is-buffer": "^1.1.5"
+ }
+ }
+ }
+ },
+ "isobject": {
+ "version": "3.0.1",
+ "resolved": "https://registry.npmjs.org/isobject/-/isobject-3.0.1.tgz",
+ "integrity": "sha1-TkMekrEalzFjaqH5yNHMvP2reN8=",
+ "dev": true
+ },
+ "kind-of": {
+ "version": "6.0.3",
+ "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-6.0.3.tgz",
+ "integrity": "sha512-dcS1ul+9tmeD95T+x28/ehLgd9mENa3LsvDTtzm3vyBEO7RPptvAD+t44WVXaUjTBRcrpFeFlC8WCruUR456hw==",
+ "dev": true
+ },
+ "micromatch": {
+ "version": "3.1.10",
+ "resolved": "https://registry.npmjs.org/micromatch/-/micromatch-3.1.10.tgz",
+ "integrity": "sha512-MWikgl9n9M3w+bpsY3He8L+w9eF9338xRl8IAO5viDizwSzziFEyUzo2xrrloB64ADbTf8uA8vRqqttDTOmccg==",
+ "dev": true,
+ "requires": {
+ "arr-diff": "^4.0.0",
+ "array-unique": "^0.3.2",
+ "braces": "^2.3.1",
+ "define-property": "^2.0.2",
+ "extend-shallow": "^3.0.2",
+ "extglob": "^2.0.4",
+ "fragment-cache": "^0.2.1",
+ "kind-of": "^6.0.2",
+ "nanomatch": "^1.2.9",
+ "object.pick": "^1.3.0",
+ "regex-not": "^1.0.0",
+ "snapdragon": "^0.8.1",
+ "to-regex": "^3.0.2"
+ }
+ },
+ "process-nextick-args": {
+ "version": "2.0.1",
+ "resolved": "https://registry.npmjs.org/process-nextick-args/-/process-nextick-args-2.0.1.tgz",
+ "integrity": "sha512-3ouUOpQhtgrbOa17J7+uxOTpITYWaGP7/AhoR3+A+/1e9skrzelGi/dXzEYyvbxubEF6Wn2ypscTKiKJFFn1ag==",
+ "dev": true
+ },
+ "readdirp": {
+ "version": "2.2.1",
+ "resolved": "https://registry.npmjs.org/readdirp/-/readdirp-2.2.1.tgz",
+ "integrity": "sha512-1JU/8q+VgFZyxwrJ+SVIOsh+KywWGpds3NTqikiKpDMZWScmAYyKIgqkO+ARvNWJfXeXR1zxz7aHF4u4CyH6vQ==",
+ "dev": true,
+ "requires": {
+ "graceful-fs": "^4.1.11",
+ "micromatch": "^3.1.10",
+ "readable-stream": "^2.0.2"
+ }
+ },
+ "string_decoder": {
+ "version": "1.1.1",
+ "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-1.1.1.tgz",
+ "integrity": "sha512-n/ShnvDi6FHbbVfviro+WojiFzv+s8MPMHBczVePfUpDJLwoLT0ht1l4YwBCbi8pJAveEEdnkHyPyTP/mzRfwg==",
+ "dev": true,
+ "requires": {
+ "safe-buffer": "~5.1.0"
+ }
+ },
+ "through2": {
+ "version": "2.0.5",
+ "resolved": "https://registry.npmjs.org/through2/-/through2-2.0.5.tgz",
+ "integrity": "sha512-/mrRod8xqpA+IHSLyGCQ2s8SPHiCDEeQJSep1jqLYeEUClOFG2Qsh+4FU6G9VeqpZnGW/Su8LQGc4YKni5rYSQ==",
+ "dev": true,
+ "requires": {
+ "readable-stream": "~2.3.6",
+ "xtend": "~4.0.1"
+ },
+ "dependencies": {
+ "readable-stream": {
+ "version": "2.3.7",
+ "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-2.3.7.tgz",
+ "integrity": "sha512-Ebho8K4jIbHAxnuxi7o42OrZgF/ZTNcsZj6nRKyUmkhLFq8CHItp/fy6hQZuZmP/n3yZ9VBUbp4zz/mX8hmYPw==",
+ "dev": true,
+ "requires": {
+ "core-util-is": "~1.0.0",
+ "inherits": "~2.0.3",
+ "isarray": "~1.0.0",
+ "process-nextick-args": "~2.0.0",
+ "safe-buffer": "~5.1.1",
+ "string_decoder": "~1.1.1",
+ "util-deprecate": "~1.0.1"
+ }
+ }
+ }
+ }
+ }
+ },
"web-stream-tools": {
- "version": "github:openpgpjs/web-stream-tools#5e6cb1a976d50c421091907615cf7cce77ac4f2a",
- "from": "github:openpgpjs/web-stream-tools#5e6cb1a976d50c421091907615cf7cce77ac4f2a",
+ "version": "github:openpgpjs/web-stream-tools#dc4b05e8a272b45819233f3df735423432beacfc",
+ "from": "github:openpgpjs/web-stream-tools#dc4b05e8a272b45819233f3df735423432beacfc",
+ "dev": true
+ },
+ "websocket-driver": {
+ "version": "0.7.0",
+ "resolved": "https://registry.npmjs.org/websocket-driver/-/websocket-driver-0.7.0.tgz",
+ "integrity": "sha1-DK+dLXVdk67gSdS90NP+LMoqJOs=",
"dev": true,
"requires": {
- "@mattiasbuelens/web-streams-adapter": "0.1.0-alpha.5",
- "web-streams-polyfill": "~2.1.1"
+ "http-parser-js": ">=0.4.0",
+ "websocket-extensions": ">=0.1.1"
}
},
- "web-streams-polyfill": {
- "version": "2.1.1",
- "resolved": "https://registry.npmjs.org/web-streams-polyfill/-/web-streams-polyfill-2.1.1.tgz",
- "integrity": "sha512-dlNpL2aab3g8CKfGz6rl8FNmGaRWLLn2g/DtSc9IjB30mEdE6XxzPfPSig5BwGSzI+oLxHyETrQGKjrVVhbLCg==",
+ "websocket-extensions": {
+ "version": "0.1.3",
+ "resolved": "https://registry.npmjs.org/websocket-extensions/-/websocket-extensions-0.1.3.tgz",
+ "integrity": "sha512-nqHUnMXmBzT0w570r2JpJxfiSD1IzoI+HGVdd3aZ0yNi3ngvQ4jv1dtHt5VGxfI2yj5yqImPhOK4vmIh2xMbGg==",
"dev": true
},
"whatwg-fetch": {
@@ -3881,9 +8995,9 @@
}
},
"which-module": {
- "version": "2.0.0",
- "resolved": "https://registry.npmjs.org/which-module/-/which-module-2.0.0.tgz",
- "integrity": "sha1-2e8H3Od7mQK4o6j6SzHD4/fm6Ho=",
+ "version": "1.0.0",
+ "resolved": "https://registry.npmjs.org/which-module/-/which-module-1.0.0.tgz",
+ "integrity": "sha1-u6Y8qGGUiZT/MHc2CJ47lgJsKk8=",
"dev": true
},
"wordwrap": {
@@ -3893,40 +9007,13 @@
"dev": true
},
"wrap-ansi": {
- "version": "5.1.0",
- "resolved": "https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-5.1.0.tgz",
- "integrity": "sha512-QC1/iN/2/RPVJ5jYK8BGttj5z83LmSKmvbvrXPNCLZSEb32KKVDJDl/MOt2N01qU2H/FkzEa9PKto1BqDjtd7Q==",
+ "version": "2.1.0",
+ "resolved": "https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-2.1.0.tgz",
+ "integrity": "sha1-2Pw9KE3QV5T+hJc8rs3Rz4JP3YU=",
"dev": true,
"requires": {
- "ansi-styles": "^3.2.0",
- "string-width": "^3.0.0",
- "strip-ansi": "^5.0.0"
- },
- "dependencies": {
- "ansi-regex": {
- "version": "4.1.0",
- "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-4.1.0.tgz",
- "integrity": "sha512-1apePfXM1UOSqw0o9IiFAovVz9M5S1Dg+4TrDwfMewQ6p/rmMueb7tWZjQ1rx4Loy1ArBggoqGpfqqdI4rondg==",
- "dev": true
- },
- "ansi-styles": {
- "version": "3.2.1",
- "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-3.2.1.tgz",
- "integrity": "sha512-VT0ZI6kZRdTh8YyJw3SMbYm/u+NqfsAxEpWO0Pf9sq8/e94WxxOpPKx9FR1FlyCtOVDNOQ+8ntlqFxiRc+r5qA==",
- "dev": true,
- "requires": {
- "color-convert": "^1.9.0"
- }
- },
- "strip-ansi": {
- "version": "5.2.0",
- "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-5.2.0.tgz",
- "integrity": "sha512-DuRs1gKbBqsMKIZlrffwlug8MHkcnpjs5VPmL1PAh+mA30U0DTotfDZ0d2UUsXpPmPmMMJ6W773MaA3J+lbiWA==",
- "dev": true,
- "requires": {
- "ansi-regex": "^4.1.0"
- }
- }
+ "string-width": "^1.0.1",
+ "strip-ansi": "^3.0.1"
}
},
"wrappy": {
@@ -3955,15 +9042,21 @@
}
},
"xmlcreate": {
- "version": "2.0.3",
- "resolved": "https://registry.npmjs.org/xmlcreate/-/xmlcreate-2.0.3.tgz",
- "integrity": "sha512-HgS+X6zAztGa9zIK3Y3LXuJes33Lz9x+YyTxgrkIdabu2vqcGOWwdfCpf1hWLRrd553wd4QCDf6BBO6FfdsRiQ==",
+ "version": "1.0.2",
+ "resolved": "https://registry.npmjs.org/xmlcreate/-/xmlcreate-1.0.2.tgz",
+ "integrity": "sha1-+mv3YqYKQT+z3Y9LA8WyaSONMI8=",
+ "dev": true
+ },
+ "xtend": {
+ "version": "4.0.1",
+ "resolved": "https://registry.npmjs.org/xtend/-/xtend-4.0.1.tgz",
+ "integrity": "sha1-pcbVMr5lbiPbgg77lDofBJmNY68=",
"dev": true
},
"y18n": {
- "version": "4.0.0",
- "resolved": "https://registry.npmjs.org/y18n/-/y18n-4.0.0.tgz",
- "integrity": "sha512-r9S/ZyXu/Xu9q1tYlpsLIsa3EeLXXk0VwlxqTcFRfg9EhMW+17kbt9G0NrgCmhGb5vT2hyhJZLfDGx+7+5Uj/w==",
+ "version": "3.2.1",
+ "resolved": "https://registry.npmjs.org/y18n/-/y18n-3.2.1.tgz",
+ "integrity": "sha1-bRX7qITAhnnA136I53WegR4H+kE=",
"dev": true
},
"yallist": {
@@ -3973,82 +9066,33 @@
"dev": true
},
"yargs": {
- "version": "13.3.2",
- "resolved": "https://registry.npmjs.org/yargs/-/yargs-13.3.2.tgz",
- "integrity": "sha512-AX3Zw5iPruN5ie6xGRIDgqkT+ZhnRlZMLMHAs8tg7nRruy2Nb+i5o9bwghAogtM08q1dpr2LVoS8KSTMYpWXUw==",
+ "version": "6.6.0",
+ "resolved": "https://registry.npmjs.org/yargs/-/yargs-6.6.0.tgz",
+ "integrity": "sha1-eC7CHvQDNF+DCoCMo9UTr1YGUgg=",
"dev": true,
"requires": {
- "cliui": "^5.0.0",
- "find-up": "^3.0.0",
- "get-caller-file": "^2.0.1",
+ "camelcase": "^3.0.0",
+ "cliui": "^3.2.0",
+ "decamelize": "^1.1.1",
+ "get-caller-file": "^1.0.1",
+ "os-locale": "^1.4.0",
+ "read-pkg-up": "^1.0.1",
"require-directory": "^2.1.1",
- "require-main-filename": "^2.0.0",
+ "require-main-filename": "^1.0.1",
"set-blocking": "^2.0.0",
- "string-width": "^3.0.0",
- "which-module": "^2.0.0",
- "y18n": "^4.0.0",
- "yargs-parser": "^13.1.2"
- },
- "dependencies": {
- "find-up": {
- "version": "3.0.0",
- "resolved": "https://registry.npmjs.org/find-up/-/find-up-3.0.0.tgz",
- "integrity": "sha512-1yD6RmLI1XBfxugvORwlck6f75tYL+iR0jqwsOrOxMZyGYqUuDhJ0l4AXdO1iX/FTs9cBAMEk1gWSEx1kSbylg==",
- "dev": true,
- "requires": {
- "locate-path": "^3.0.0"
- }
- },
- "locate-path": {
- "version": "3.0.0",
- "resolved": "https://registry.npmjs.org/locate-path/-/locate-path-3.0.0.tgz",
- "integrity": "sha512-7AO748wWnIhNqAuaty2ZWHkQHRSNfPVIsPIfwEOWO22AmaoVrWavlOcMR5nzTLNYvp36X220/maaRsrec1G65A==",
- "dev": true,
- "requires": {
- "p-locate": "^3.0.0",
- "path-exists": "^3.0.0"
- }
- },
- "p-limit": {
- "version": "2.3.0",
- "resolved": "https://registry.npmjs.org/p-limit/-/p-limit-2.3.0.tgz",
- "integrity": "sha512-//88mFWSJx8lxCzwdAABTJL2MyWB12+eIY7MDL2SqLmAkeKU9qxRvWuSyTjm3FUmpBEMuFfckAIqEaVGUDxb6w==",
- "dev": true,
- "requires": {
- "p-try": "^2.0.0"
- }
- },
- "p-locate": {
- "version": "3.0.0",
- "resolved": "https://registry.npmjs.org/p-locate/-/p-locate-3.0.0.tgz",
- "integrity": "sha512-x+12w/To+4GFfgJhBEpiDcLozRJGegY+Ei7/z0tSLkMmxGZNybVMSfWj9aJn8Z5Fc7dBUNJOOVgPv2H7IwulSQ==",
- "dev": true,
- "requires": {
- "p-limit": "^2.0.0"
- }
- },
- "p-try": {
- "version": "2.2.0",
- "resolved": "https://registry.npmjs.org/p-try/-/p-try-2.2.0.tgz",
- "integrity": "sha512-R4nPAVTAU0B9D35/Gk3uJf/7XYbQcyohSKdvAxIRSNghFl4e71hVoGnBNQz9cWaXxO2I10KTC+3jMdvvoKw6dQ==",
- "dev": true
- },
- "path-exists": {
- "version": "3.0.0",
- "resolved": "https://registry.npmjs.org/path-exists/-/path-exists-3.0.0.tgz",
- "integrity": "sha1-zg6+ql94yxiSXqfYENe1mwEP1RU=",
- "dev": true
- }
+ "string-width": "^1.0.2",
+ "which-module": "^1.0.0",
+ "y18n": "^3.2.1",
+ "yargs-parser": "^4.2.0"
}
},
"yargs-parser": {
- "version": "13.1.2",
- "resolved": "https://registry.npmjs.org/yargs-parser/-/yargs-parser-13.1.2.tgz",
- "integrity": "sha512-3lbsNRf/j+A4QuSZfDRA7HRSfWrzO0YjqTJd5kjAq37Zep1CEgaYmrH9Q3GwPiB9cHyd1Y1UwggGhJGoxipbzg==",
+ "version": "4.2.1",
+ "resolved": "https://registry.npmjs.org/yargs-parser/-/yargs-parser-4.2.1.tgz",
+ "integrity": "sha1-KczqwNxPA8bIe0qfIX3RjJ90hxw=",
"dev": true,
"requires": {
- "camelcase": "^5.0.0",
- "decamelize": "^1.2.0"
+ "camelcase": "^3.0.0"
}
}
}
diff --git a/package.json b/package.json
index 212e94c7..087682dc 100644
--- a/package.json
+++ b/package.json
@@ -13,77 +13,74 @@
"gpg",
"openpgp"
],
- "main": "dist/node/openpgp.min.js",
- "module": "dist/node/openpgp.min.mjs",
- "browser": {
- "./dist/node/openpgp.min.js": "./dist/openpgp.min.js",
- "./dist/node/openpgp.min.mjs": "./dist/openpgp.min.mjs"
- },
- "types": "openpgp.d.ts",
+ "main": "dist/openpgp.js",
"directories": {
"lib": "src"
},
"files": [
+ "src/",
"dist/",
- "lightweight/",
- "openpgp.d.ts"
+ "test/unittests.js",
+ "test/general",
+ "test/crypto"
],
- "esm": {
- "cjs": {
- "dedefault": true
- }
- },
"scripts": {
- "build": "rollup --config",
- "build-test": "npm run build --build-only=test",
- "prepare": "npm run build",
- "test": "mocha --require esm --timeout 120000 test/unittests.js",
- "test-type-definitions": "tsc test/typescript/definitions.ts && node test/typescript/definitions.js",
- "start": "http-server",
- "prebrowsertest": "npm run build-test",
- "browsertest": "npm start -- -o test/unittests.html",
- "coverage": "nyc npm test",
- "lint": "eslint 'src/**/*.js' 'test/crypto/**/*.js'",
- "docs": "jsdoc --configure .jsdocrc.js --destination docs --recurse README.md src",
- "preversion": "rm -rf dist docs node_modules && npm install && npm test",
- "version": "npm run docs && git add -A docs",
- "postversion": "git push && git push --tags && npm publish"
+ "build": "grunt build --compat copy:openpgp_compat && grunt build --lightweight copy:openpgp_lightweight clean:js && grunt build",
+ "pretest": "grunt",
+ "test": "grunt test",
+ "lint": "eslint src"
},
"devDependencies": {
- "@mattiasbuelens/web-streams-adapter": "0.1.0-alpha.5",
- "@rollup/plugin-commonjs": "^11.1.0",
- "@rollup/plugin-node-resolve": "^7.1.3",
- "@rollup/plugin-replace": "^2.3.2",
- "@types/chai": "^4.2.14",
- "asmcrypto.js": "github:openpgpjs/asmcrypto#5b994303a9d3e27e0915f72a10b6c2c51535a4dc",
- "babel-eslint": "^10.1.0",
- "bn.js": "^4.11.8",
- "buffer": "^5.0.8",
+ "babel-core": "^6.26.3",
+ "babel-plugin-syntax-async-functions": "^6.13.0",
+ "babel-plugin-transform-async-to-generator": "^6.24.1",
+ "babel-plugin-transform-regenerator": "^6.26.0",
+ "babel-plugin-transform-remove-strict-mode": "0.0.2",
+ "babel-plugin-transform-runtime": "^6.23.0",
+ "babel-polyfill": "^6.26.0",
+ "babel-preset-env": "^1.7.0",
+ "babel-preset-es2015-mod": "^6.6.0",
+ "babel-preset-es3": "^1.0.1",
+ "babelify": "^8.0.0",
+ "browserify-derequire": "^0.9.4",
"chai": "^4.1.2",
"chai-as-promised": "^7.1.1",
- "elliptic": "github:openpgpjs/elliptic#ab7d8268c60b6abeb175841c578c224ac5b2d279",
- "email-addresses": "3.1.0",
+ "core-js": "^2.5.3",
"eslint": "^4.17.0",
"eslint-config-airbnb": "^16.1.0",
"eslint-config-airbnb-base": "^12.1.0",
- "eslint-plugin-chai-friendly": "^0.5.0",
"eslint-plugin-import": "^2.8.0",
- "esm": "^3.2.25",
- "hash.js": "^1.1.3",
- "http-server": "^0.12.3",
- "jsdoc": "github:openpgpjs/jsdoc#0f1816eb4553856647b4ca9561b9307b11ec4f9e",
+ "eslint-plugin-chai-friendly": "^0.5.0",
+ "grunt": "^1.1.0",
+ "grunt-browserify": "^5.3.0",
+ "grunt-contrib-clean": "~1.1.0",
+ "grunt-contrib-connect": "~1.0.2",
+ "grunt-contrib-copy": "~1.0.0",
+ "grunt-contrib-watch": "^1.1.0",
+ "grunt-header": "^1.1.0",
+ "grunt-jsbeautifier": "^0.2.13",
+ "grunt-jsdoc": "^2.2.1",
+ "grunt-mocha-test": "^0.13.3",
+ "grunt-simple-nyc": "^3.0.1",
+ "grunt-terser": "^0.1.0",
+ "grunt-text-replace": "~0.4.0",
+ "gruntify-eslint": "^4.0.0",
"mocha": "^5.0.0",
"nyc": "^14.1.1",
- "pako": "github:openpgpjs/pako#f38f7368a5fa511e54b95add2f04444c3a9d803f",
- "rollup": "^2.7.2",
- "rollup-plugin-terser": "^5.3.0",
- "seek-bzip": "github:openpgpjs/seek-bzip#4b89457f20c0e1921b4689106a31c99782c29829",
"sinon": "^4.3.0",
"text-encoding-utf-8": "^1.0.2",
+ "whatwg-fetch": "^2.0.3",
+ "@mattiasbuelens/web-streams-polyfill": "^0.3.1",
+ "asmcrypto.js": "github:openpgpjs/asmcrypto#475cffa5ccb2cf2556427056679414acf3610d1b",
+ "bn.js": "^4.11.8",
+ "buffer": "^5.0.8",
+ "elliptic": "github:openpgpjs/elliptic#ab7d8268c60b6abeb175841c578c224ac5b2d279",
+ "hash.js": "^1.1.3",
+ "pako": "^1.0.6",
+ "seek-bzip": "github:openpgpjs/seek-bzip#6187fc025851d35c4e104a25ea15a10b9b8d6f7d",
"tweetnacl": "github:openpgpjs/tweetnacl-js#3dae25bd3eaa77173f3405676b595721dde92eec",
- "typescript": "^4.1.2",
- "web-stream-tools": "github:openpgpjs/web-stream-tools#5e6cb1a976d50c421091907615cf7cce77ac4f2a",
- "whatwg-fetch": "^2.0.3"
+ "web-stream-tools": "github:openpgpjs/web-stream-tools#dc4b05e8a272b45819233f3df735423432beacfc",
+ "email-addresses": "3.1.0"
},
"dependencies": {
"asn1.js": "^5.0.0",
diff --git a/release.sh b/release.sh
new file mode 100755
index 00000000..f282d14f
--- /dev/null
+++ b/release.sh
@@ -0,0 +1,35 @@
+#!/bin/sh
+
+# abort if tests fail
+set -e
+
+# go to root
+cd `dirname $0`
+
+if [ "$#" -ne 1 ] ; then
+ echo 'Usage: ./release.sh 0.0.0'
+ exit 0
+fi
+
+# install dependencies
+rm -rf node_modules
+npm install
+
+# set version
+grunt set_version --release=$1
+
+# build and test
+rm -rf dist
+rm -f browserify-cache*
+npm run build
+grunt test
+
+# Add build files to git
+git add --force dist/ bower.json package-lock.json package.json
+git commit -m "Release new version"
+git tag v$1
+git push
+git push --tag
+
+# publish to npm
+npm publish #--tag old-version
diff --git a/src/biginteger/bn.interface.js b/src/biginteger/bn.interface.js
deleted file mode 100644
index 84226097..00000000
--- a/src/biginteger/bn.interface.js
+++ /dev/null
@@ -1,327 +0,0 @@
-import BN from 'bn.js';
-
-/**
- * BigInteger implementation of basic operations
- * Wrapper of bn.js library (wwww.github.com/indutny/bn.js)
- */
-export default class BigInteger {
- /**
- * Get a BigInteger (input must be big endian for strings and arrays)
- * @param {Number|String|Uint8Array} n value to convert
- * @throws {Error} on undefined input
- */
- constructor(n) {
- if (n === undefined) {
- throw new Error('Invalid BigInteger input');
- }
-
- this.value = new BN(n);
- }
-
- clone() {
- const clone = new BigInteger(null);
- this.value.copy(clone.value);
- return clone;
- }
-
- /**
- * BigInteger increment in place
- */
- iinc() {
- this.value.iadd(new BN(1));
- return this;
- }
-
- /**
- * BigInteger increment
- * @returns {BigInteger} this + 1
- */
- inc() {
- return this.clone().iinc();
- }
-
- /**
- * BigInteger decrement in place
- */
- idec() {
- this.value.isub(new BN(1));
- return this;
- }
-
- /**
- * BigInteger decrement
- * @returns {BigInteger} this - 1
- */
- dec() {
- return this.clone().idec();
- }
-
-
- /**
- * BigInteger addition in place
- * @param {BigInteger} x value to add
- */
- iadd(x) {
- this.value.iadd(x.value);
- return this;
- }
-
- /**
- * BigInteger addition
- * @param {BigInteger} x value to add
- * @returns {BigInteger} this + x
- */
- add(x) {
- return this.clone().iadd(x);
- }
-
- /**
- * BigInteger subtraction in place
- * @param {BigInteger} x value to subtract
- */
- isub(x) {
- this.value.isub(x.value);
- return this;
- }
-
- /**
- * BigInteger subtraction
- * @param {BigInteger} x value to subtract
- * @returns {BigInteger} this - x
- */
- sub(x) {
- return this.clone().isub(x);
- }
-
- /**
- * BigInteger multiplication in place
- * @param {BigInteger} x value to multiply
- */
- imul(x) {
- this.value.imul(x.value);
- return this;
- }
-
- /**
- * BigInteger multiplication
- * @param {BigInteger} x value to multiply
- * @returns {BigInteger} this * x
- */
- mul(x) {
- return this.clone().imul(x);
- }
-
- /**
- * Compute value modulo m, in place
- * @param {BigInteger} m modulo
- */
- imod(m) {
- this.value = this.value.umod(m.value);
- return this;
- }
-
- /**
- * Compute value modulo m
- * @param {BigInteger} m modulo
- * @returns {BigInteger} this mod m
- */
- mod(m) {
- return this.clone().imod(m);
- }
-
- /**
- * Compute modular exponentiation
- * Much faster than this.exp(e).mod(n)
- * @param {BigInteger} e exponent
- * @param {BigInteger} n modulo
- * @returns {BigInteger} this ** e mod n
- */
- modExp(e, n) {
- // We use either Montgomery or normal reduction context
- // Montgomery requires coprime n and R (montogmery multiplier)
- // bn.js picks R as power of 2, so n must be odd
- const nred = n.isEven() ? BN.red(n.value) : BN.mont(n.value);
- const x = this.clone();
- x.value = x.value.toRed(nred).redPow(e.value).fromRed();
- return x;
- }
-
- /**
- * Compute the inverse of this value modulo n
- * Note: this and and n must be relatively prime
- * @param {BigInteger} n modulo
- * @return {BigInteger} x such that this*x = 1 mod n
- * @throws {Error} if the inverse does not exist
- */
- modInv(n) {
- // invm returns a wrong result if the inverse does not exist
- if (!this.gcd(n).isOne()) {
- throw new Error('Inverse does not exist');
- }
- return new BigInteger(this.value.invm(n.value));
- }
-
- /**
- * Compute greatest common divisor between this and n
- * @param {BigInteger} n operand
- * @return {BigInteger} gcd
- */
- gcd(n) {
- return new BigInteger(this.value.gcd(n.value));
- }
-
- /**
- * Shift this to the left by x, in place
- * @param {BigInteger} x shift value
- */
- ileftShift(x) {
- this.value.ishln(x.value.toNumber());
- return this;
- }
-
- /**
- * Shift this to the left by x
- * @param {BigInteger} x shift value
- * @returns {BigInteger} this << x
- */
- leftShift(x) {
- return this.clone().ileftShift(x);
- }
-
- /**
- * Shift this to the right by x, in place
- * @param {BigInteger} x shift value
- */
- irightShift(x) {
- this.value.ishrn(x.value.toNumber());
- return this;
- }
-
- /**
- * Shift this to the right by x
- * @param {BigInteger} x shift value
- * @returns {BigInteger} this >> x
- */
- rightShift(x) {
- return this.clone().irightShift(x);
- }
-
- /**
- * Whether this value is equal to x
- * @param {BigInteger} x
- * @returns {Boolean}
- */
- equal(x) {
- return this.value.eq(x.value);
- }
-
- /**
- * Whether this value is less than x
- * @param {BigInteger} x
- * @returns {Boolean}
- */
- lt(x) {
- return this.value.lt(x.value);
- }
-
- /**
- * Whether this value is less than or equal to x
- * @param {BigInteger} x
- * @returns {Boolean}
- */
- lte(x) {
- return this.value.lte(x.value);
- }
-
- /**
- * Whether this value is greater than x
- * @param {BigInteger} x
- * @returns {Boolean}
- */
- gt(x) {
- return this.value.gt(x.value);
- }
-
- /**
- * Whether this value is greater than or equal to x
- * @param {BigInteger} x
- * @returns {Boolean}
- */
- gte(x) {
- return this.value.gte(x.value);
- }
-
- isZero() {
- return this.value.isZero();
- }
-
- isOne() {
- return this.value.eq(new BN(1));
- }
-
- isNegative() {
- return this.value.isNeg();
- }
-
- isEven() {
- return this.value.isEven();
- }
-
- abs() {
- const res = this.clone();
- res.value = res.value.abs();
- return res;
- }
-
- /**
- * Get this value as a string
- * @returns {String} this value
- */
- toString() {
- return this.value.toString();
- }
-
- /**
- * Get this value as an exact Number (max 53 bits)
- * Fails if this value is too large
- * @return {Number}
- */
- toNumber() {
- return this.value.toNumber();
- }
-
- /**
- * Get value of i-th bit
- * @param {Number} i bit index
- * @returns {Number} bit value
- */
- getBit(i) {
- return this.value.testn(i) ? 1 : 0;
- }
-
- /**
- * Compute bit length
- * @returns {Number} bit length
- */
- bitLength() {
- return this.value.bitLength();
- }
-
- /**
- * Compute byte length
- * @returns {Number} byte length
- */
- byteLength() {
- return this.value.byteLength();
- }
-
- /**
- * Get Uint8Array representation of this number
- * @param {String} endian endianess of output array (defaults to 'be')
- * @param {Number} length of output array
- * @return {Uint8Array}
- */
- toUint8Array(endian = 'be', length) {
- return this.value.toArrayLike(Uint8Array, endian, length);
- }
-}
diff --git a/src/biginteger/index.js b/src/biginteger/index.js
deleted file mode 100644
index 2cd1d54a..00000000
--- a/src/biginteger/index.js
+++ /dev/null
@@ -1,14 +0,0 @@
-import util from '../util';
-import BigInteger from './native.interface';
-
-async function getBigInteger() {
- if (util.detectBigInt()) {
- return BigInteger;
- } else {
- const { default: BigInteger } = await import('./bn.interface');
- return BigInteger;
- }
-}
-
-// eslint-disable-next-line import/prefer-default-export
-export { getBigInteger };
diff --git a/src/biginteger/native.interface.js b/src/biginteger/native.interface.js
deleted file mode 100644
index 20397b13..00000000
--- a/src/biginteger/native.interface.js
+++ /dev/null
@@ -1,446 +0,0 @@
-/* eslint-disable new-cap */
-
-/**
- * BigInteger implementation of basic operations
- * that wraps the native BigInt library.
- * Operations are not constant time,
- * but we try and limit timing leakage where we can
- */
-export default class BigInteger {
- /**
- * Get a BigInteger (input must be big endian for strings and arrays)
- * @param {Number|String|Uint8Array} n value to convert
- * @throws {Error} on null or undefined input
- */
- constructor(n) {
- if (n === undefined) {
- throw new Error('Invalid BigInteger input');
- }
-
- if (n instanceof Uint8Array) {
- const bytes = n;
- const hex = new Array(bytes.length);
- for (let i = 0; i < bytes.length; i++) {
- const hexByte = bytes[i].toString(16);
- hex[i] = (bytes[i] <= 0xF) ? ('0' + hexByte) : hexByte;
- }
- this.value = BigInt('0x0' + hex.join(''));
- } else {
- this.value = BigInt(n);
- }
- }
-
- clone() {
- return new BigInteger(this.value);
- }
-
- /**
- * BigInteger increment in place
- */
- iinc() {
- this.value++;
- return this;
- }
-
- /**
- * BigInteger increment
- * @returns {BigInteger} this + 1
- */
- inc() {
- return this.clone().iinc();
- }
-
- /**
- * BigInteger decrement in place
- */
- idec() {
- this.value--;
- return this;
- }
-
- /**
- * BigInteger decrement
- * @returns {BigInteger} this - 1
- */
- dec() {
- return this.clone().idec();
- }
-
- /**
- * BigInteger addition in place
- * @param {BigInteger} x value to add
- */
- iadd(x) {
- this.value += x.value;
- return this;
- }
-
- /**
- * BigInteger addition
- * @param {BigInteger} x value to add
- * @returns {BigInteger} this + x
- */
- add(x) {
- return this.clone().iadd(x);
- }
-
- /**
- * BigInteger subtraction in place
- * @param {BigInteger} x value to subtract
- */
- isub(x) {
- this.value -= x.value;
- return this;
- }
-
- /**
- * BigInteger subtraction
- * @param {BigInteger} x value to subtract
- * @returns {BigInteger} this - x
- */
- sub(x) {
- return this.clone().isub(x);
- }
-
- /**
- * BigInteger multiplication in place
- * @param {BigInteger} x value to multiply
- */
- imul(x) {
- this.value *= x.value;
- return this;
- }
-
- /**
- * BigInteger multiplication
- * @param {BigInteger} x value to multiply
- * @returns {BigInteger} this * x
- */
- mul(x) {
- return this.clone().imul(x);
- }
-
- /**
- * Compute value modulo m, in place
- * @param {BigInteger} m modulo
- */
- imod(m) {
- this.value %= m.value;
- if (this.isNegative()) {
- this.iadd(m);
- }
- return this;
- }
-
- /**
- * Compute value modulo m
- * @param {BigInteger} m modulo
- * @returns {BigInteger} this mod m
- */
- mod(m) {
- return this.clone().imod(m);
- }
-
- /**
- * Compute modular exponentiation using square and multiply
- * @param {BigInteger} e exponent
- * @param {BigInteger} n modulo
- * @returns {BigInteger} this ** e mod n
- */
- modExp(e, n) {
- if (n.isZero()) throw Error("Modulo cannot be zero");
- if (n.isOne()) return new BigInteger(0);
- if (e.isNegative()) throw Error("Unsopported negative exponent");
-
- let exp = e.value;
- let x = this.value;
-
- x %= n.value;
- let r = BigInt(1);
- while (exp > BigInt(0)) {
- const lsb = exp & BigInt(1);
- exp >>= BigInt(1); // e / 2
- // Always compute multiplication step, to reduce timing leakage
- const rx = (r * x) % n.value;
- // Update r only if lsb is 1 (odd exponent)
- r = lsb ? rx : r;
- x = (x * x) % n.value; // Square
- }
- return new BigInteger(r);
- }
-
-
- /**
- * Compute the inverse of this value modulo n
- * Note: this and and n must be relatively prime
- * @param {BigInteger} n modulo
- * @return {BigInteger} x such that this*x = 1 mod n
- * @throws {Error} if the inverse does not exist
- */
- modInv(n) {
- const { gcd, x } = this._egcd(n);
- if (!gcd.isOne()) {
- throw new Error('Inverse does not exist');
- }
- return x.add(n).mod(n);
- }
-
- /**
- * Extended Eucleadian algorithm (http://anh.cs.luc.edu/331/notes/xgcd.pdf)
- * Given a = this and b, compute (x, y) such that ax + by = gdc(a, b)
- * @param {BigInteger} b second operand
- * @returns { gcd, x, y: BigInteger }
- */
- _egcd(b) {
- let x = BigInt(0);
- let y = BigInt(1);
- let xPrev = BigInt(1);
- let yPrev = BigInt(0);
-
- let a = this.value;
- b = b.value;
-
- while (b !== BigInt(0)) {
- const q = a / b;
- let tmp = x;
- x = xPrev - q * x;
- xPrev = tmp;
-
- tmp = y;
- y = yPrev - q * y;
- yPrev = tmp;
-
- tmp = b;
- b = a % b;
- a = tmp;
- }
-
- return {
- x: new BigInteger(xPrev),
- y: new BigInteger(yPrev),
- gcd: new BigInteger(a)
- };
- }
-
- /**
- * Compute greatest common divisor between this and n
- * @param {BigInteger} b operand
- * @return {BigInteger} gcd
- */
- gcd(b) {
- let a = this.value;
- b = b.value;
- while (b !== BigInt(0)) {
- const tmp = b;
- b = a % b;
- a = tmp;
- }
- return new BigInteger(a);
- }
-
- /**
- * Shift this to the left by x, in place
- * @param {BigInteger} x shift value
- */
- ileftShift(x) {
- this.value <<= x.value;
- return this;
- }
-
- /**
- * Shift this to the left by x
- * @param {BigInteger} x shift value
- * @returns {BigInteger} this << x
- */
- leftShift(x) {
- return this.clone().ileftShift(x);
- }
-
- /**
- * Shift this to the right by x, in place
- * @param {BigInteger} x shift value
- */
- irightShift(x) {
- this.value >>= x.value;
- return this;
- }
-
- /**
- * Shift this to the right by x
- * @param {BigInteger} x shift value
- * @returns {BigInteger} this >> x
- */
- rightShift(x) {
- return this.clone().irightShift(x);
- }
-
- /**
- * Whether this value is equal to x
- * @param {BigInteger} x
- * @returns {Boolean}
- */
- equal(x) {
- return this.value === x.value;
- }
-
- /**
- * Whether this value is less than x
- * @param {BigInteger} x
- * @returns {Boolean}
- */
- lt(x) {
- return this.value < x.value;
- }
-
- /**
- * Whether this value is less than or equal to x
- * @param {BigInteger} x
- * @returns {Boolean}
- */
- lte(x) {
- return this.value <= x.value;
- }
-
- /**
- * Whether this value is greater than x
- * @param {BigInteger} x
- * @returns {Boolean}
- */
- gt(x) {
- return this.value > x.value;
- }
-
- /**
- * Whether this value is greater than or equal to x
- * @param {BigInteger} x
- * @returns {Boolean}
- */
- gte(x) {
- return this.value >= x.value;
- }
-
- isZero() {
- return this.value === BigInt(0);
- }
-
- isOne() {
- return this.value === BigInt(1);
- }
-
- isNegative() {
- return this.value < BigInt(0);
- }
-
- isEven() {
- return !(this.value & BigInt(1));
- }
-
- abs() {
- const res = this.clone();
- if (this.isNegative()) {
- res.value = -res.value;
- }
- return res;
- }
-
- /**
- * Get this value as a string
- * @returns {String} this value
- */
- toString() {
- return this.value.toString();
- }
-
- /**
- * Get this value as an exact Number (max 53 bits)
- * Fails if this value is too large
- * @return {Number}
- */
- toNumber() {
- const number = Number(this.value);
- if (number > Number.MAX_SAFE_INTEGER) {
- // We throw and error to conform with the bn.js implementation
- throw new Error('Number can only safely store up to 53 bits');
- }
- return number;
- }
-
- /**
- * Get value of i-th bit
- * @param {Number} i bit index
- * @returns {Number} bit value
- */
- getBit(i) {
- const bit = (this.value >> BigInt(i)) & BigInt(1);
- return (bit === BigInt(0)) ? 0 : 1;
- }
-
- /**
- * Compute bit length
- * @returns {Number} bit length
- */
- bitLength() {
- const zero = new BigInteger(0);
- const one = new BigInteger(1);
- const negOne = new BigInteger(-1);
-
- // -1n >> -1n is -1n
- // 1n >> 1n is 0n
- const target = this.isNegative() ? negOne : zero;
- let bitlen = 1;
- const tmp = this.clone();
- while (!tmp.irightShift(one).equal(target)) {
- bitlen++;
- }
- return bitlen;
- }
-
- /**
- * Compute byte length
- * @returns {Number} byte length
- */
- byteLength() {
- const zero = new BigInteger(0);
- const negOne = new BigInteger(-1);
-
- const target = this.isNegative() ? negOne : zero;
- const eight = new BigInteger(8);
- let len = 1;
- const tmp = this.clone();
- while (!tmp.irightShift(eight).equal(target)) {
- len++;
- }
- return len;
- }
-
- /**
- * Get Uint8Array representation of this number
- * @param {String} endian endianess of output array (defaults to 'be')
- * @param {Number} length of output array
- * @return {Uint8Array}
- */
- toUint8Array(endian = 'be', length) {
- // we get and parse the hex string (https://coolaj86.com/articles/convert-js-bigints-to-typedarrays/)
- // this is faster than shift+mod iterations
- let hex = this.value.toString(16);
- if (hex.length % 2 === 1) {
- hex = '0' + hex;
- }
-
- const rawLength = hex.length / 2;
- const bytes = new Uint8Array(length || rawLength);
- // parse hex
- const offset = length ? (length - rawLength) : 0;
- let i = 0;
- while (i < rawLength) {
- bytes[i + offset] = parseInt(hex.slice(2 * i, 2 * i + 2), 16);
- i++;
- }
-
- if (endian !== 'be') {
- bytes.reverse();
- }
-
- return bytes;
- }
-}
diff --git a/src/cleartext.js b/src/cleartext.js
index c4fea507..8d8b57a6 100644
--- a/src/cleartext.js
+++ b/src/cleartext.js
@@ -24,134 +24,125 @@
* @module cleartext
*/
-import { armor, unarmor } from './encoding/armor';
+import armor from './encoding/armor';
import enums from './enums';
import util from './util';
-import { PacketList, LiteralDataPacket, SignaturePacket } from './packet';
+import packet from './packet';
import { Signature } from './signature';
import { createVerificationObjects, createSignaturePackets } from './message';
/**
- * Class that represents an OpenPGP cleartext signed message.
+ * @class
+ * @classdesc Class that represents an OpenPGP cleartext signed message.
* See {@link https://tools.ietf.org/html/rfc4880#section-7}
+ * @param {String} text The cleartext of the signed message
+ * @param {module:signature.Signature} signature The detached signature or an empty signature for unsigned messages
*/
-export class CleartextMessage {
- /**
- * @param {String} text The cleartext of the signed message
- * @param {module:signature.Signature} signature The detached signature or an empty signature for unsigned messages
- */
- constructor(text, signature) {
- // normalize EOL to canonical form
- this.text = util.removeTrailingSpaces(text).replace(/\r?\n/g, '\r\n');
- if (signature && !(signature instanceof Signature)) {
- throw new Error('Invalid signature input');
- }
- this.signature = signature || new Signature(new PacketList());
+export function CleartextMessage(text, signature) {
+ if (!(this instanceof CleartextMessage)) {
+ return new CleartextMessage(text, signature);
}
-
- /**
- * Returns the key IDs of the keys that signed the cleartext message
- * @returns {Array} array of keyid objects
- */
- getSigningKeyIds() {
- const keyIds = [];
- const signatureList = this.signature.packets;
- signatureList.forEach(function(packet) {
- keyIds.push(packet.issuerKeyId);
- });
- return keyIds;
+ // normalize EOL to canonical form
+ this.text = util.removeTrailingSpaces(text).replace(/\r?\n/g, '\r\n');
+ if (signature && !(signature instanceof Signature)) {
+ throw new Error('Invalid signature input');
}
+ this.signature = signature || new Signature(new packet.List());
+}
- /**
- * Sign the cleartext message
- * @param {Array} privateKeys private keys with decrypted secret key data for signing
- * @param {Signature} signature (optional) any existing detached signature
- * @param {Date} date (optional) The creation time of the signature that should be created
- * @param {Array} userIds (optional) user IDs to sign with, e.g. [{ name:'Steve Sender', email:'steve@openpgp.org' }]
- * @returns {Promise} new cleartext message with signed content
- * @async
- */
- async sign(privateKeys, signature = null, date = new Date(), userIds = []) {
- return new CleartextMessage(this.text, await this.signDetached(privateKeys, signature, date, userIds));
- }
+/**
+ * Returns the key IDs of the keys that signed the cleartext message
+ * @returns {Array} array of keyid objects
+ */
+CleartextMessage.prototype.getSigningKeyIds = function() {
+ const keyIds = [];
+ const signatureList = this.signature.packets;
+ signatureList.forEach(function(packet) {
+ keyIds.push(packet.issuerKeyId);
+ });
+ return keyIds;
+};
- /**
- * Sign the cleartext message
- * @param {Array} privateKeys private keys with decrypted secret key data for signing
- * @param {Signature} signature (optional) any existing detached signature
- * @param {Date} date (optional) The creation time of the signature that should be created
- * @param {Array} userIds (optional) user IDs to sign with, e.g. [{ name:'Steve Sender', email:'steve@openpgp.org' }]
- * @returns {Promise} new detached signature of message content
- * @async
- */
- async signDetached(privateKeys, signature = null, date = new Date(), userIds = []) {
- const literalDataPacket = new LiteralDataPacket();
- literalDataPacket.setText(this.text);
-
- return new Signature(await createSignaturePackets(literalDataPacket, privateKeys, signature, date, userIds, true));
- }
+/**
+ * Sign the cleartext message
+ * @param {Array} privateKeys private keys with decrypted secret key data for signing
+ * @param {Signature} signature (optional) any existing detached signature
+ * @param {Date} date (optional) The creation time of the signature that should be created
+ * @param {Array} userIds (optional) user IDs to sign with, e.g. [{ name:'Steve Sender', email:'steve@openpgp.org' }]
+ * @returns {Promise} new cleartext message with signed content
+ * @async
+ */
+CleartextMessage.prototype.sign = async function(privateKeys, signature = null, date = new Date(), userIds = []) {
+ return new CleartextMessage(this.text, await this.signDetached(privateKeys, signature, date, userIds));
+};
- /**
- * Verify signatures of cleartext signed message
- * @param {Array} keys array of keys to verify signatures
- * @param {Date} date (optional) Verify the signature against the given date, i.e. check signature creation time < date < expiration time
- * @returns {Promise>} list of signer's keyid and validity of signature
- * @async
- */
- verify(keys, date = new Date()) {
- return this.verifyDetached(this.signature, keys, date);
- }
+/**
+ * Sign the cleartext message
+ * @param {Array} privateKeys private keys with decrypted secret key data for signing
+ * @param {Signature} signature (optional) any existing detached signature
+ * @param {Date} date (optional) The creation time of the signature that should be created
+ * @param {Array} userIds (optional) user IDs to sign with, e.g. [{ name:'Steve Sender', email:'steve@openpgp.org' }]
+ * @returns {Promise} new detached signature of message content
+ * @async
+ */
+CleartextMessage.prototype.signDetached = async function(privateKeys, signature = null, date = new Date(), userIds = []) {
+ const literalDataPacket = new packet.Literal();
+ literalDataPacket.setText(this.text);
- /**
- * Verify signatures of cleartext signed message
- * @param {Array} keys array of keys to verify signatures
- * @param {Date} date (optional) Verify the signature against the given date, i.e. check signature creation time < date < expiration time
- * @returns {Promise>} list of signer's keyid and validity of signature
- * @async
- */
- verifyDetached(signature, keys, date = new Date()) {
- const signatureList = signature.packets;
- const literalDataPacket = new LiteralDataPacket();
- // we assume that cleartext signature is generated based on UTF8 cleartext
- literalDataPacket.setText(this.text);
- return createVerificationObjects(signatureList, [literalDataPacket], keys, date, true);
- }
+ return new Signature(await createSignaturePackets(literalDataPacket, privateKeys, signature, date, userIds, true));
+};
- /**
- * Get cleartext
- * @returns {String} cleartext of message
- */
- getText() {
- // normalize end of line to \n
- return this.text.replace(/\r\n/g, '\n');
- }
+/**
+ * Verify signatures of cleartext signed message
+ * @param {Array} keys array of keys to verify signatures
+ * @param {Date} date (optional) Verify the signature against the given date, i.e. check signature creation time < date < expiration time
+ * @returns {Promise>} list of signer's keyid and validity of signature
+ * @async
+ */
+CleartextMessage.prototype.verify = function(keys, date = new Date()) {
+ return this.verifyDetached(this.signature, keys, date);
+};
- /**
- * Returns ASCII armored text of cleartext signed message
- * @returns {String | ReadableStream} ASCII armor
- */
- armor() {
- let hashes = this.signature.packets.map(function(packet) {
- return enums.read(enums.hash, packet.hashAlgorithm).toUpperCase();
- });
- hashes = hashes.filter(function(item, i, ar) { return ar.indexOf(item) === i; });
- const body = {
- hash: hashes.join(),
- text: this.text,
- data: this.signature.packets.write()
- };
- return armor(enums.armor.signed, body);
- }
+/**
+ * Verify signatures of cleartext signed message
+ * @param {Array} keys array of keys to verify signatures
+ * @param {Date} date (optional) Verify the signature against the given date, i.e. check signature creation time < date < expiration time
+ * @returns {Promise>} list of signer's keyid and validity of signature
+ * @async
+ */
+CleartextMessage.prototype.verifyDetached = function(signature, keys, date = new Date()) {
+ const signatureList = signature.packets;
+ const literalDataPacket = new packet.Literal();
+ // we assume that cleartext signature is generated based on UTF8 cleartext
+ literalDataPacket.setText(this.text);
+ return createVerificationObjects(signatureList, [literalDataPacket], keys, date, true);
+};
- /**
- * Creates a new CleartextMessage object from text
- * @param {String} text
- * @static
- */
- static fromText(text) {
- return new CleartextMessage(text);
- }
-}
+/**
+ * Get cleartext
+ * @returns {String} cleartext of message
+ */
+CleartextMessage.prototype.getText = function() {
+ // normalize end of line to \n
+ return this.text.replace(/\r\n/g, '\n');
+};
+
+/**
+ * Returns ASCII armored text of cleartext signed message
+ * @returns {String | ReadableStream} ASCII armor
+ */
+CleartextMessage.prototype.armor = function() {
+ let hashes = this.signature.packets.map(function(packet) {
+ return enums.read(enums.hash, packet.hashAlgorithm).toUpperCase();
+ });
+ hashes = hashes.filter(function(item, i, ar) { return ar.indexOf(item) === i; });
+ const body = {
+ hash: hashes.join(),
+ text: this.text,
+ data: this.signature.packets.write()
+ };
+ return armor.encode(enums.armor.signed, body);
+};
/**
@@ -161,13 +152,13 @@ export class CleartextMessage {
* @async
* @static
*/
-export async function readArmoredCleartextMessage(armoredText) {
- const input = await unarmor(armoredText);
+export async function readArmored(armoredText) {
+ const input = await armor.decode(armoredText);
if (input.type !== enums.armor.signed) {
throw new Error('No cleartext signed message.');
}
- const packetlist = new PacketList();
- await packetlist.read(input.data, { SignaturePacket });
+ const packetlist = new packet.List();
+ await packetlist.read(input.data);
verifyHeaders(input.headers, packetlist);
const signature = new Signature(packetlist);
return new CleartextMessage(input.text, signature);
@@ -176,7 +167,7 @@ export async function readArmoredCleartextMessage(armoredText) {
/**
* Compare hash algorithm specified in the armor header with signatures
* @param {Array} headers Armor headers
- * @param {PacketList} packetlist The packetlist with signature packets
+ * @param {module:packet.List} packetlist The packetlist with signature packets
* @private
*/
function verifyHeaders(headers, packetlist) {
@@ -218,3 +209,12 @@ function verifyHeaders(headers, packetlist) {
throw new Error('Hash algorithm mismatch in armor header and signature');
}
}
+
+/**
+ * Creates a new CleartextMessage object from text
+ * @param {String} text
+ * @static
+ */
+export function fromText(text) {
+ return new CleartextMessage(text);
+}
diff --git a/src/config/config.js b/src/config/config.js
index 4cfaf95b..9d90747e 100644
--- a/src/config/config.js
+++ b/src/config/config.js
@@ -25,14 +25,14 @@ import enums from '../enums';
export default {
/**
* @memberof module:config
- * @property {Integer} preferHashAlgorithm Default hash algorithm {@link module:enums.hash}
+ * @property {Integer} prefer_hash_algorithm Default hash algorithm {@link module:enums.hash}
*/
- preferHashAlgorithm: enums.hash.sha256,
+ prefer_hash_algorithm: enums.hash.sha256,
/**
* @memberof module:config
- * @property {Integer} encryptionCipher Default encryption cipher {@link module:enums.symmetric}
+ * @property {Integer} encryption_cipher Default encryption cipher {@link module:enums.symmetric}
*/
- encryptionCipher: enums.symmetric.aes256,
+ encryption_cipher: enums.symmetric.aes256,
/**
* @memberof module:config
* @property {Integer} compression Default compression algorithm {@link module:enums.compression}
@@ -40,178 +40,193 @@ export default {
compression: enums.compression.uncompressed,
/**
* @memberof module:config
- * @property {Integer} deflateLevel Default zip/zlib compression level, between 1 and 9
+ * @property {Integer} deflate_level Default zip/zlib compression level, between 1 and 9
*/
- deflateLevel: 6,
+ deflate_level: 6,
/**
* Use Authenticated Encryption with Additional Data (AEAD) protection for symmetric encryption.
- * Note: not all OpenPGP implementations are compatible with this option.
+ * **NOT INTEROPERABLE WITH OTHER OPENPGP IMPLEMENTATIONS**
* **FUTURE OPENPGP.JS VERSIONS MAY BREAK COMPATIBILITY WHEN USING THIS OPTION**
* @see {@link https://tools.ietf.org/html/draft-ietf-openpgp-rfc4880bis-07|RFC4880bis-07}
* @memberof module:config
- * @property {Boolean} aeadProtect
+ * @property {Boolean} aead_protect
*/
- aeadProtect: false,
+ aead_protect: false,
/**
* Default Authenticated Encryption with Additional Data (AEAD) encryption mode
- * Only has an effect when aeadProtect is set to true.
+ * Only has an effect when aead_protect is set to true.
* @memberof module:config
- * @property {Integer} aeadMode Default AEAD mode {@link module:enums.aead}
+ * @property {Integer} aead_mode Default AEAD mode {@link module:enums.aead}
*/
- aeadMode: enums.aead.eax,
+ aead_mode: enums.aead.eax,
/**
* Chunk Size Byte for Authenticated Encryption with Additional Data (AEAD) mode
- * Only has an effect when aeadProtect is set to true.
+ * Only has an effect when aead_protect is set to true.
* Must be an integer value from 0 to 56.
* @memberof module:config
- * @property {Integer} aeadChunkSizeByte
+ * @property {Integer} aead_chunk_size_byte
*/
- aeadChunkSizeByte: 12,
+ aead_chunk_size_byte: 12,
/**
* Use V5 keys.
- * Note: not all OpenPGP implementations are compatible with this option.
+ * **NOT INTEROPERABLE WITH OTHER OPENPGP IMPLEMENTATIONS**
* **FUTURE OPENPGP.JS VERSIONS MAY BREAK COMPATIBILITY WHEN USING THIS OPTION**
* @memberof module:config
- * @property {Boolean} v5Keys
+ * @property {Boolean} v5_keys
*/
- v5Keys: false,
+ v5_keys: false,
/**
* {@link https://tools.ietf.org/html/rfc4880#section-3.7.1.3|RFC4880 3.7.1.3}:
* Iteration Count Byte for S2K (String to Key)
* @memberof module:config
- * @property {Integer} s2kIterationCountByte
+ * @property {Integer} s2k_iteration_count_byte
*/
- s2kIterationCountByte: 224,
+ s2k_iteration_count_byte: 224,
/** Use integrity protection for symmetric encryption
* @memberof module:config
- * @property {Boolean} integrityProtect
+ * @property {Boolean} integrity_protect
*/
- integrityProtect: true,
+ integrity_protect: true,
/**
* @memberof module:config
- * @property {Boolean} ignoreMdcError Fail on decrypt if message is not integrity protected
+ * @property {Boolean} ignore_mdc_error Fail on decrypt if message is not integrity protected
*/
- ignoreMdcError: false,
+ ignore_mdc_error: false,
/**
* @memberof module:config
- * @property {Boolean} allowUnauthenticatedStream Stream unauthenticated data before integrity has been checked
+ * @property {Boolean} allow_unauthenticated_stream Stream unauthenticated data before integrity has been checked
*/
- allowUnauthenticatedStream: false,
+ allow_unauthenticated_stream: false,
/**
* @memberof module:config
- * @property {Boolean} checksumRequired Do not throw error when armor is missing a checksum
+ * @property {Boolean} checksum_required Do not throw error when armor is missing a checksum
*/
- checksumRequired: false,
+ checksum_required: false,
/**
* @memberof module:config
- * @property {Boolean} rsaBlinding
+ * @property {Boolean} rsa_blinding
*/
- rsaBlinding: true,
- /**
- * @memberof module:config
- * @property {Number} minRsaBits Minimum RSA key size allowed for key generation
- */
- minRsaBits: 2048,
+ rsa_blinding: true,
/**
* Work-around for rare GPG decryption bug when encrypting with multiple passwords.
* **Slower and slightly less secure**
* @memberof module:config
- * @property {Boolean} passwordCollisionCheck
+ * @property {Boolean} password_collision_check
*/
- passwordCollisionCheck: false,
+ password_collision_check: false,
/**
* @memberof module:config
- * @property {Boolean} revocationsExpire If true, expired revocation signatures are ignored
+ * @property {Boolean} revocations_expire If true, expired revocation signatures are ignored
*/
- revocationsExpire: false,
+ revocations_expire: false,
/**
* Allow decryption using RSA keys without `encrypt` flag.
* This setting is potentially insecure, but it is needed to get around an old openpgpjs bug
* where key flags were ignored when selecting a key for encryption.
* @memberof module:config
- * @property {Boolean} allowInsecureDecryptionWithSigningKeys
+ * @property {Boolean} allow_insecure_decryption_with_signing_keys
*/
- allowInsecureDecryptionWithSigningKeys: false,
+ allow_insecure_decryption_with_signing_keys: false,
/**
* @memberof module:config
- * @property {Boolean} useNative Use native Node.js crypto/zlib and WebCrypto APIs when available
+ * @property {Boolean} use_native Use native Node.js crypto/zlib and WebCrypto APIs when available
+ */
+ use_native: true,
+ /**
+ * @memberof module:config
+ * @property {Integer} min_bytes_for_web_crypto The minimum amount of bytes for which to use native WebCrypto APIs when available
*/
- useNative: true,
+ min_bytes_for_web_crypto: 1000,
/**
* @memberof module:config
- * @property {Integer} minBytesForWebCrypto The minimum amount of bytes for which to use native WebCrypto APIs when available
+ * @property {Boolean} Use transferable objects between the Web Worker and main thread
*/
- minBytesForWebCrypto: 1000,
+ zero_copy: false,
/**
* @memberof module:config
* @property {Boolean} debug If enabled, debug messages will be printed
*/
- debug: false,
+ debug: false,
/**
* @memberof module:config
* @property {Boolean} tolerant Ignore unsupported/unrecognizable packets instead of throwing an error
*/
- tolerant: true,
+ tolerant: true,
/**
* @memberof module:config
- * @property {Boolean} showVersion Whether to include {@link module:config/config.versionString} in armored messages
+ * @property {Boolean} show_version Whether to include {@link module:config/config.versionstring} in armored messages
*/
- showVersion: false,
+ show_version: true,
/**
* @memberof module:config
- * @property {Boolean} showComment Whether to include {@link module:config/config.commentString} in armored messages
+ * @property {Boolean} show_comment Whether to include {@link module:config/config.commentstring} in armored messages
*/
- showComment: false,
+ show_comment: true,
/**
* @memberof module:config
- * @property {String} versionString A version string to be included in armored messages
+ * @property {String} versionstring A version string to be included in armored messages
*/
- versionString: "OpenPGP.js VERSION",
+ versionstring: "OpenPGP.js VERSION",
/**
* @memberof module:config
- * @property {String} commentString A comment string to be included in armored messages
+ * @property {String} commentstring A comment string to be included in armored messages
*/
- commentString: "https://openpgpjs.org",
+ commentstring: "https://openpgpjs.org",
/**
* @memberof module:config
* @property {String} keyserver
*/
- keyserver: "https://keyserver.ubuntu.com",
+ keyserver: "https://keyserver.ubuntu.com",
/**
* @memberof module:config
- * @property {String} nodeStore
+ * @property {String} node_store
*/
- nodeStore: "./openpgp.store",
+ node_store: "./openpgp.store",
/**
* Max userid string length (used for parsing)
* @memberof module:config
- * @property {Integer} maxUseridLength
+ * @property {Integer} max_userid_length
*/
- maxUseridLength: 1024 * 5,
+ max_userid_length: 1024 * 5,
/**
* Contains notatations that are considered "known". Known notations do not trigger
* validation error when the notation is marked as critical.
* @memberof module:config
- * @property {Array} knownNotations
+ * @property {Array} known_notations
+ */
+ known_notations: ["preferred-email-encoding@pgp.com", "pka-address@gnupg.org"],
+ /**
+ * @memberof module:config
+ * @property {Boolean} use_indutny_elliptic Whether to use the indutny/elliptic library. When false, certain curves will not be supported.
+ */
+ use_indutny_elliptic: true,
+ /**
+ * @memberof module:config
+ * @property {Boolean} external_indutny_elliptic Whether to lazily load the indutny/elliptic library from an external path on demand.
+ */
+ external_indutny_elliptic: false,
+ /**
+ * @memberof module:config
+ * @property {String} indutny_elliptic_path The path to load the indutny/elliptic library from. Only has an effect if `config.external_indutny_elliptic` is true.
*/
- knownNotations: ["preferred-email-encoding@pgp.com", "pka-address@gnupg.org"],
+ indutny_elliptic_path: './elliptic.min.js',
/**
* @memberof module:config
- * @property {Boolean} useIndutnyElliptic Whether to use the indutny/elliptic library. When false, certain curves will not be supported.
+ * @property {Object} indutny_elliptic_fetch_options Options object to pass to `fetch` when loading the indutny/elliptic library. Only has an effect if `config.external_indutny_elliptic` is true.
*/
- useIndutnyElliptic: true,
+ indutny_elliptic_fetch_options: {},
/**
* @memberof module:config
* @property {Set} reject_hash_algorithms Reject insecure hash algorithms {@link module:enums.hash}
*/
- rejectHashAlgorithms: new globalThis.Set([enums.hash.md5, enums.hash.ripemd]),
+ reject_hash_algorithms: new global.Set([enums.hash.md5, enums.hash.ripemd]),
/**
* @memberof module:config
* @property {Set} reject_message_hash_algorithms Reject insecure message hash algorithms {@link module:enums.hash}
*/
- rejectMessageHashAlgorithms: new globalThis.Set([enums.hash.md5, enums.hash.ripemd, enums.hash.sha1])
+ reject_message_hash_algorithms: new global.Set([enums.hash.md5, enums.hash.ripemd, enums.hash.sha1])
};
diff --git a/src/config/localStorage.js b/src/config/localStorage.js
index f3ae4e16..fb6e20f0 100644
--- a/src/config/localStorage.js
+++ b/src/config/localStorage.js
@@ -5,30 +5,31 @@
/**
* This object is used for storing and retrieving configuration from HTML5 local storage.
+ * @constructor
*/
-class LocalStorage {
- /**
- * Reads the config out of the HTML5 local storage
- * and initializes the object config.
- * if config is null the default config will be used
- */
- read() {
- const raw = globalThis.localStorage.getItem("config");
- const cf = (raw === null ? null : JSON.parse(raw));
- if (cf === null) {
- this.config = this.default_config;
- this.write();
- } else {
- this.config = cf;
- }
- }
+function LocalStorage() {}
- /**
- * Writes the config to HTML5 local storage
- */
- write() {
- globalThis.localStorage.setItem("config", JSON.stringify(this.config));
+/**
+ * Reads the config out of the HTML5 local storage
+ * and initializes the object config.
+ * if config is null the default config will be used
+ */
+LocalStorage.prototype.read = function () {
+ const raw = global.localStorage.getItem("config");
+ const cf = (raw === null ? null : JSON.parse(raw));
+ if (cf === null) {
+ this.config = this.default_config;
+ this.write();
+ } else {
+ this.config = cf;
}
-}
+};
+
+/**
+ * Writes the config to HTML5 local storage
+ */
+LocalStorage.prototype.write = function () {
+ global.localStorage.setItem("config", JSON.stringify(this.config));
+};
export default LocalStorage;
diff --git a/src/crypto/aes_kw.js b/src/crypto/aes_kw.js
index 14d5839c..8588a0a1 100644
--- a/src/crypto/aes_kw.js
+++ b/src/crypto/aes_kw.js
@@ -23,17 +23,10 @@
* @module crypto/aes_kw
*/
-import * as cipher from './cipher';
+import cipher from './cipher';
import util from '../util';
-/**
- * AES key wrap
- * @function
- * @param {Uint8Array} key
- * @param {Uint8Array} data
- * @returns {Uint8Array}
- */
-export function wrap(key, data) {
+function wrap(key, data) {
const aes = new cipher["aes" + (key.length * 8)](key);
const IV = new Uint32Array([0xA6A6A6A6, 0xA6A6A6A6]);
const P = unpack(data);
@@ -65,15 +58,7 @@ export function wrap(key, data) {
return pack(A, R);
}
-/**
- * AES key unwrap
- * @function
- * @param {String} key
- * @param {String} data
- * @returns {Uint8Array}
- * @throws {Error}
- */
-export function unwrap(key, data) {
+function unwrap(key, data) {
const aes = new cipher["aes" + (key.length * 8)](key);
const IV = new Uint32Array([0xA6A6A6A6, 0xA6A6A6A6]);
const C = unpack(data);
@@ -146,3 +131,23 @@ function pack() {
}
return new Uint8Array(buffer);
}
+
+export default {
+ /**
+ * AES key wrap
+ * @function
+ * @param {String} key
+ * @param {String} data
+ * @returns {Uint8Array}
+ */
+ wrap,
+ /**
+ * AES key unwrap
+ * @function
+ * @param {String} key
+ * @param {String} data
+ * @returns {Uint8Array}
+ * @throws {Error}
+ */
+ unwrap
+};
diff --git a/src/crypto/cfb.js b/src/crypto/cfb.js
index 67a3289d..623ddb49 100644
--- a/src/crypto/cfb.js
+++ b/src/crypto/cfb.js
@@ -24,10 +24,10 @@
* @module crypto/cfb
*/
-import { AES_CFB } from 'asmcrypto.js/dist_es8/aes/cfb';
+import { AES_CFB } from 'asmcrypto.js/dist_es5/aes/cfb';
import stream from 'web-stream-tools';
-import * as cipher from './cipher';
+import cipher from './cipher';
import config from '../config';
import util from '../util';
@@ -38,6 +38,7 @@ const Buffer = util.getNodeBuffer();
const knownAlgos = nodeCrypto ? nodeCrypto.getCiphers() : [];
const nodeAlgos = {
idea: knownAlgos.includes('idea-cfb') ? 'idea-cfb' : undefined, /* Unused, not implemented */
+ '3des': knownAlgos.includes('des-ede3-cfb') ? 'des-ede3-cfb' : undefined,
tripledes: knownAlgos.includes('des-ede3-cfb') ? 'des-ede3-cfb' : undefined,
cast5: knownAlgos.includes('cast5-cfb') ? 'cast5-cfb' : undefined,
blowfish: knownAlgos.includes('bf-cfb') ? 'bf-cfb' : undefined,
@@ -47,90 +48,92 @@ const nodeAlgos = {
/* twofish is not implemented in OpenSSL */
};
-export async function encrypt(algo, key, plaintext, iv) {
- if (util.getNodeCrypto() && nodeAlgos[algo]) { // Node crypto library.
- return nodeEncrypt(algo, key, plaintext, iv);
- }
- if (algo.substr(0, 3) === 'aes') {
- return aesEncrypt(algo, key, plaintext, iv);
- }
+export default {
+ encrypt: function(algo, key, plaintext, iv) {
+ if (util.getNodeCrypto() && nodeAlgos[algo]) { // Node crypto library.
+ return nodeEncrypt(algo, key, plaintext, iv);
+ }
+ if (algo.substr(0, 3) === 'aes') {
+ return aesEncrypt(algo, key, plaintext, iv);
+ }
- const cipherfn = new cipher[algo](key);
- const block_size = cipherfn.blockSize;
+ const cipherfn = new cipher[algo](key);
+ const block_size = cipherfn.blockSize;
- const blockc = iv.slice();
- let pt = new Uint8Array();
- const process = chunk => {
- if (chunk) {
- pt = util.concatUint8Array([pt, chunk]);
- }
- const ciphertext = new Uint8Array(pt.length);
- let i;
- let j = 0;
- while (chunk ? pt.length >= block_size : pt.length) {
- const encblock = cipherfn.encrypt(blockc);
- for (i = 0; i < block_size; i++) {
- blockc[i] = pt[i] ^ encblock[i];
- ciphertext[j++] = blockc[i];
+ const blockc = iv.slice();
+ let pt = new Uint8Array();
+ const process = chunk => {
+ if (chunk) {
+ pt = util.concatUint8Array([pt, chunk]);
}
- pt = pt.subarray(block_size);
+ const ciphertext = new Uint8Array(pt.length);
+ let i;
+ let j = 0;
+ while (chunk ? pt.length >= block_size : pt.length) {
+ const encblock = cipherfn.encrypt(blockc);
+ for (i = 0; i < block_size; i++) {
+ blockc[i] = pt[i] ^ encblock[i];
+ ciphertext[j++] = blockc[i];
+ }
+ pt = pt.subarray(block_size);
+ }
+ return ciphertext.subarray(0, j);
+ };
+ return stream.transform(plaintext, process, process);
+ },
+
+ decrypt: async function(algo, key, ciphertext, iv) {
+ if (util.getNodeCrypto() && nodeAlgos[algo]) { // Node crypto library.
+ return nodeDecrypt(algo, key, ciphertext, iv);
+ }
+ if (algo.substr(0, 3) === 'aes') {
+ return aesDecrypt(algo, key, ciphertext, iv);
}
- return ciphertext.subarray(0, j);
- };
- return stream.transform(plaintext, process, process);
-}
-
-export async function decrypt(algo, key, ciphertext, iv) {
- if (util.getNodeCrypto() && nodeAlgos[algo]) { // Node crypto library.
- return nodeDecrypt(algo, key, ciphertext, iv);
- }
- if (algo.substr(0, 3) === 'aes') {
- return aesDecrypt(algo, key, ciphertext, iv);
- }
- const cipherfn = new cipher[algo](key);
- const block_size = cipherfn.blockSize;
+ const cipherfn = new cipher[algo](key);
+ const block_size = cipherfn.blockSize;
- let blockp = iv;
- let ct = new Uint8Array();
- const process = chunk => {
- if (chunk) {
- ct = util.concatUint8Array([ct, chunk]);
- }
- const plaintext = new Uint8Array(ct.length);
- let i;
- let j = 0;
- while (chunk ? ct.length >= block_size : ct.length) {
- const decblock = cipherfn.encrypt(blockp);
- blockp = ct;
- for (i = 0; i < block_size; i++) {
- plaintext[j++] = blockp[i] ^ decblock[i];
+ let blockp = iv;
+ let ct = new Uint8Array();
+ const process = chunk => {
+ if (chunk) {
+ ct = util.concatUint8Array([ct, chunk]);
}
- ct = ct.subarray(block_size);
- }
- return plaintext.subarray(0, j);
- };
- return stream.transform(ciphertext, process, process);
-}
+ const plaintext = new Uint8Array(ct.length);
+ let i;
+ let j = 0;
+ while (chunk ? ct.length >= block_size : ct.length) {
+ const decblock = cipherfn.encrypt(blockp);
+ blockp = ct;
+ for (i = 0; i < block_size; i++) {
+ plaintext[j++] = blockp[i] ^ decblock[i];
+ }
+ ct = ct.subarray(block_size);
+ }
+ return plaintext.subarray(0, j);
+ };
+ return stream.transform(ciphertext, process, process);
+ }
+};
function aesEncrypt(algo, key, pt, iv) {
if (
util.getWebCrypto() &&
key.length !== 24 && // Chrome doesn't support 192 bit keys, see https://www.chromium.org/blink/webcrypto#TOC-AES-support
!util.isStream(pt) &&
- pt.length >= 3000 * config.minBytesForWebCrypto // Default to a 3MB minimum. Chrome is pretty slow for small messages, see: https://bugs.chromium.org/p/chromium/issues/detail?id=701188#c2
+ pt.length >= 3000 * config.min_bytes_for_web_crypto // Default to a 3MB minimum. Chrome is pretty slow for small messages, see: https://bugs.chromium.org/p/chromium/issues/detail?id=701188#c2
) { // Web Crypto
return webEncrypt(algo, key, pt, iv);
}
// asm.js fallback
const cfb = new AES_CFB(key, iv);
- return stream.transform(pt, value => cfb.aes.AES_Encrypt_process(value), () => cfb.aes.AES_Encrypt_finish());
+ return stream.transform(pt, value => cfb.AES_Encrypt_process(value), () => cfb.AES_Encrypt_finish());
}
function aesDecrypt(algo, key, ct, iv) {
if (util.isStream(ct)) {
const cfb = new AES_CFB(key, iv);
- return stream.transform(ct, value => cfb.aes.AES_Decrypt_process(value), () => cfb.aes.AES_Decrypt_finish());
+ return stream.transform(ct, value => cfb.AES_Decrypt_process(value), () => cfb.AES_Decrypt_finish());
}
return AES_CFB.decrypt(ct, key, iv);
}
diff --git a/src/crypto/cipher/aes.js b/src/crypto/cipher/aes.js
index ff389480..9a82dbb8 100644
--- a/src/crypto/cipher/aes.js
+++ b/src/crypto/cipher/aes.js
@@ -2,7 +2,7 @@
* @requires asmcrypto.js
*/
-import { AES_ECB } from 'asmcrypto.js/dist_es8/aes/ecb';
+import { AES_ECB } from 'asmcrypto.js/dist_es5/aes/ecb';
// TODO use webCrypto or nodeCrypto when possible.
function aes(length) {
diff --git a/src/crypto/cipher/des.js b/src/crypto/cipher/des.js
index 7c335d34..2cd394e4 100644
--- a/src/crypto/cipher/des.js
+++ b/src/crypto/cipher/des.js
@@ -432,7 +432,7 @@ function des_removePadding(message, padding) {
// added by Recurity Labs
-export function TripleDES(key) {
+function TripleDES(key) {
this.key = [];
for (let i = 0; i < 3; i++) {
@@ -459,7 +459,7 @@ TripleDES.blockSize = TripleDES.prototype.blockSize = 8;
// This is "original" DES
-export function DES(key) {
+function DES(key) {
this.key = key;
this.encrypt = function(block, padding) {
@@ -472,3 +472,5 @@ export function DES(key) {
return des(keys, block, false, 0, null, padding);
};
}
+
+export default { DES, TripleDES };
diff --git a/src/crypto/cipher/index.js b/src/crypto/cipher/index.js
index daf3f222..7ae8a06c 100644
--- a/src/crypto/cipher/index.js
+++ b/src/crypto/cipher/index.js
@@ -9,80 +9,83 @@
*/
import aes from './aes';
-import { DES, TripleDES } from './des.js';
-import Cast5 from './cast5';
-import TF from './twofish';
-import BF from './blowfish';
+import des from './des.js';
+import cast5 from './cast5';
+import twofish from './twofish';
+import blowfish from './blowfish';
-/**
- * AES-128 encryption and decryption (ID 7)
- * @function
- * @param {String} key 128-bit key
- * @see {@link https://github.com/asmcrypto/asmcrypto.js|asmCrypto}
- * @see {@link https://csrc.nist.gov/publications/fips/fips197/fips-197.pdf|NIST FIPS-197}
- * @returns {Object}
- * @requires asmcrypto.js
- */
-export const aes128 = aes(128);
-/**
- * AES-128 Block Cipher (ID 8)
- * @function
- * @param {String} key 192-bit key
- * @see {@link https://github.com/asmcrypto/asmcrypto.js|asmCrypto}
- * @see {@link https://csrc.nist.gov/publications/fips/fips197/fips-197.pdf|NIST FIPS-197}
- * @returns {Object}
- * @requires asmcrypto.js
- */
-export const aes192 = aes(192);
-/**
- * AES-128 Block Cipher (ID 9)
- * @function
- * @param {String} key 256-bit key
- * @see {@link https://github.com/asmcrypto/asmcrypto.js|asmCrypto}
- * @see {@link https://csrc.nist.gov/publications/fips/fips197/fips-197.pdf|NIST FIPS-197}
- * @returns {Object}
- * @requires asmcrypto.js
- */
-export const aes256 = aes(256);
-// Not in OpenPGP specifications
-export const des = DES;
-/**
- * Triple DES Block Cipher (ID 2)
- * @function
- * @param {String} key 192-bit key
- * @see {@link https://nvlpubs.nist.gov/nistpubs/SpecialPublications/NIST.SP.800-67r2.pdf|NIST SP 800-67}
- * @returns {Object}
- */
-export const tripledes = TripleDES;
-/**
- * CAST-128 Block Cipher (ID 3)
- * @function
- * @param {String} key 128-bit key
- * @see {@link https://tools.ietf.org/html/rfc2144|The CAST-128 Encryption Algorithm}
- * @returns {Object}
- */
-export const cast5 = Cast5;
-/**
- * Twofish Block Cipher (ID 10)
- * @function
- * @param {String} key 256-bit key
- * @see {@link https://tools.ietf.org/html/rfc4880#ref-TWOFISH|TWOFISH}
- * @returns {Object}
- */
-export const twofish = TF;
-/**
- * Blowfish Block Cipher (ID 4)
- * @function
- * @param {String} key 128-bit key
- * @see {@link https://tools.ietf.org/html/rfc4880#ref-BLOWFISH|BLOWFISH}
- * @returns {Object}
- */
-export const blowfish = BF;
-/**
- * Not implemented
- * @function
- * @throws {Error}
- */
-export const idea = function() {
- throw new Error('IDEA symmetric-key algorithm not implemented');
+export default {
+ /**
+ * AES-128 encryption and decryption (ID 7)
+ * @function
+ * @param {String} key 128-bit key
+ * @see {@link https://github.com/asmcrypto/asmcrypto.js|asmCrypto}
+ * @see {@link https://csrc.nist.gov/publications/fips/fips197/fips-197.pdf|NIST FIPS-197}
+ * @returns {Object}
+ * @requires asmcrypto.js
+ */
+ aes128: aes(128),
+ /**
+ * AES-128 Block Cipher (ID 8)
+ * @function
+ * @param {String} key 192-bit key
+ * @see {@link https://github.com/asmcrypto/asmcrypto.js|asmCrypto}
+ * @see {@link https://csrc.nist.gov/publications/fips/fips197/fips-197.pdf|NIST FIPS-197}
+ * @returns {Object}
+ * @requires asmcrypto.js
+ */
+ aes192: aes(192),
+ /**
+ * AES-128 Block Cipher (ID 9)
+ * @function
+ * @param {String} key 256-bit key
+ * @see {@link https://github.com/asmcrypto/asmcrypto.js|asmCrypto}
+ * @see {@link https://csrc.nist.gov/publications/fips/fips197/fips-197.pdf|NIST FIPS-197}
+ * @returns {Object}
+ * @requires asmcrypto.js
+ */
+ aes256: aes(256),
+ // Not in OpenPGP specifications
+ des: des.DES,
+ /**
+ * Triple DES Block Cipher (ID 2)
+ * @function
+ * @param {String} key 192-bit key
+ * @see {@link https://nvlpubs.nist.gov/nistpubs/SpecialPublications/NIST.SP.800-67r2.pdf|NIST SP 800-67}
+ * @returns {Object}
+ */
+ tripledes: des.TripleDES,
+ '3des': des.TripleDES,
+ /**
+ * CAST-128 Block Cipher (ID 3)
+ * @function
+ * @param {String} key 128-bit key
+ * @see {@link https://tools.ietf.org/html/rfc2144|The CAST-128 Encryption Algorithm}
+ * @returns {Object}
+ */
+ cast5: cast5,
+ /**
+ * Twofish Block Cipher (ID 10)
+ * @function
+ * @param {String} key 256-bit key
+ * @see {@link https://tools.ietf.org/html/rfc4880#ref-TWOFISH|TWOFISH}
+ * @returns {Object}
+ */
+ twofish: twofish,
+ /**
+ * Blowfish Block Cipher (ID 4)
+ * @function
+ * @param {String} key 128-bit key
+ * @see {@link https://tools.ietf.org/html/rfc4880#ref-BLOWFISH|BLOWFISH}
+ * @returns {Object}
+ */
+ blowfish: blowfish,
+ /**
+ * Not implemented
+ * @function
+ * @throws {Error}
+ */
+ idea: function() {
+ throw new Error('IDEA symmetric-key algorithm not implemented');
+ }
};
diff --git a/src/crypto/cmac.js b/src/crypto/cmac.js
index 3eda17ea..e6ce66c1 100644
--- a/src/crypto/cmac.js
+++ b/src/crypto/cmac.js
@@ -6,7 +6,7 @@
* @module crypto/cmac
*/
-import { AES_CBC } from 'asmcrypto.js/dist_es8/aes/cbc';
+import { AES_CBC } from 'asmcrypto.js/dist_es5/aes/cbc';
import util from '../util';
const webCrypto = util.getWebCrypto();
diff --git a/src/crypto/crypto.js b/src/crypto/crypto.js
index f0da2898..5f0bbe1f 100644
--- a/src/crypto/crypto.js
+++ b/src/crypto/crypto.js
@@ -25,6 +25,7 @@
* @requires crypto/random
* @requires type/ecdh_symkey
* @requires type/kdf_params
+ * @requires type/mpi
* @requires type/oid
* @requires enums
* @requires util
@@ -32,341 +33,364 @@
*/
import publicKey from './public_key';
-import * as cipher from './cipher';
-import { getRandomBytes } from './random';
-import ECDHSymkey from '../type/ecdh_symkey';
-import KDFParams from '../type/kdf_params';
+import cipher from './cipher';
+import random from './random';
+import type_ecdh_symkey from '../type/ecdh_symkey';
+import type_kdf_params from '../type/kdf_params';
+import type_mpi from '../type/mpi';
+import type_oid from '../type/oid';
import enums from '../enums';
import util from '../util';
-import OID from '../type/oid';
-import { Curve } from './public_key/elliptic/curves';
+import pkcs1 from './pkcs1';
+import pkcs5 from './pkcs5';
-/**
- * Encrypts data using specified algorithm and public key parameters.
- * See {@link https://tools.ietf.org/html/rfc4880#section-9.1|RFC 4880 9.1} for public key algorithms.
- * @param {module:enums.publicKey} algo Public key algorithm
- * @param {Object} publicParams Algorithm-specific public key parameters
- * @param {Uint8Array} data Data to be encrypted
- * @param {Uint8Array} fingerprint Recipient fingerprint
- * @returns {Object} Encrypted session key parameters
- * @async
- */
-export async function publicKeyEncrypt(algo, publicParams, data, fingerprint) {
- switch (algo) {
- case enums.publicKey.rsaEncrypt:
- case enums.publicKey.rsaEncryptSign: {
- const { n, e } = publicParams;
- const c = await publicKey.rsa.encrypt(data, n, e);
- return { c };
- }
- case enums.publicKey.elgamal: {
- const { p, g, y } = publicParams;
- return publicKey.elgamal.encrypt(data, p, g, y);
- }
- case enums.publicKey.ecdh: {
- const { oid, Q, kdfParams } = publicParams;
- const { publicKey: V, wrappedKey: C } = await publicKey.elliptic.ecdh.encrypt(
- oid, kdfParams, data, Q, fingerprint);
- return { V, C: new ECDHSymkey(C) };
+function constructParams(types, data) {
+ return types.map(function(type, i) {
+ if (data && data[i]) {
+ return new type(data[i]);
}
- default:
- return [];
- }
+ return new type();
+ });
}
-/**
- * Decrypts data using specified algorithm and private key parameters.
- * See {@link https://tools.ietf.org/html/rfc4880#section-5.5.3|RFC 4880 5.5.3}
- * @param {module:enums.publicKey} algo Public key algorithm
- * @param {Object} publicKeyParams Algorithm-specific public key parameters
- * @param {Object} privateKeyParams Algorithm-specific private key parameters
- * @param {Object} sessionKeyParams Encrypted session key parameters
- * @param {Uint8Array} fingerprint Recipient fingerprint
- * @returns {Uint8Array} Decrypted data
- * @async
- */
-export async function publicKeyDecrypt(algo, publicKeyParams, privateKeyParams, sessionKeyParams, fingerprint) {
- switch (algo) {
- case enums.publicKey.rsaEncryptSign:
- case enums.publicKey.rsaEncrypt: {
- const { c } = sessionKeyParams;
- const { n, e } = publicKeyParams;
- const { d, p, q, u } = privateKeyParams;
- return publicKey.rsa.decrypt(c, n, e, d, p, q, u);
+export default {
+ /**
+ * Encrypts data using specified algorithm and public key parameters.
+ * See {@link https://tools.ietf.org/html/rfc4880#section-9.1|RFC 4880 9.1} for public key algorithms.
+ * @param {module:enums.publicKey} algo Public key algorithm
+ * @param {Array} pub_params Algorithm-specific public key parameters
+ * @param {String} data Data to be encrypted
+ * @param {String} fingerprint Recipient fingerprint
+ * @returns {Array} encrypted session key parameters
+ * @async
+ */
+ publicKeyEncrypt: async function(algo, pub_params, data, fingerprint) {
+ const types = this.getEncSessionKeyParamTypes(algo);
+ switch (algo) {
+ case enums.publicKey.rsa_encrypt:
+ case enums.publicKey.rsa_encrypt_sign: {
+ data = util.str_to_Uint8Array(data);
+ const n = pub_params[0].toUint8Array();
+ const e = pub_params[1].toUint8Array();
+ const res = await publicKey.rsa.encrypt(data, n, e);
+ return constructParams(types, [res]);
+ }
+ case enums.publicKey.elgamal: {
+ data = new type_mpi(await pkcs1.eme.encode(data, pub_params[0].byteLength()));
+ const m = data.toBN();
+ const p = pub_params[0].toBN();
+ const g = pub_params[1].toBN();
+ const y = pub_params[2].toBN();
+ const res = await publicKey.elgamal.encrypt(m, p, g, y);
+ return constructParams(types, [res.c1, res.c2]);
+ }
+ case enums.publicKey.ecdh: {
+ data = new type_mpi(pkcs5.encode(data));
+ const oid = pub_params[0];
+ const Q = pub_params[1].toUint8Array();
+ const kdfParams = pub_params[2];
+ const { publicKey: V, wrappedKey: C } = await publicKey.elliptic.ecdh.encrypt(
+ oid, kdfParams, data, Q, fingerprint);
+ return constructParams(types, [V, C]);
+ }
+ default:
+ return [];
}
- case enums.publicKey.elgamal: {
- const { c1, c2 } = sessionKeyParams;
- const p = publicKeyParams.p;
- const x = privateKeyParams.x;
- return publicKey.elgamal.decrypt(c1, c2, p, x);
- }
- case enums.publicKey.ecdh: {
- const { oid, Q, kdfParams } = publicKeyParams;
- const { d } = privateKeyParams;
- const { V, C } = sessionKeyParams;
- return publicKey.elliptic.ecdh.decrypt(
- oid, kdfParams, V, C.data, Q, d, fingerprint);
- }
- default:
- throw new Error('Invalid public key encryption algorithm.');
- }
-}
+ },
-/**
- * Parse public key material in binary form to get the key parameters
- * @param {module:enums.publicKey} algo The key algorithm
- * @param {Uint8Array} bytes The key material to parse
- * @returns {{ read: Number, publicParams: Object }} Number of read bytes plus key parameters referenced by name
- */
-export function parsePublicKeyParams(algo, bytes) {
- let read = 0;
- switch (algo) {
- case enums.publicKey.rsaEncrypt:
- case enums.publicKey.rsaEncryptSign:
- case enums.publicKey.rsaSign: {
- const n = util.readMPI(bytes.subarray(read)); read += n.length + 2;
- const e = util.readMPI(bytes.subarray(read)); read += e.length + 2;
- return { read, publicParams: { n, e } };
- }
- case enums.publicKey.dsa: {
- const p = util.readMPI(bytes.subarray(read)); read += p.length + 2;
- const q = util.readMPI(bytes.subarray(read)); read += q.length + 2;
- const g = util.readMPI(bytes.subarray(read)); read += g.length + 2;
- const y = util.readMPI(bytes.subarray(read)); read += y.length + 2;
- return { read, publicParams: { p, q, g, y } };
- }
- case enums.publicKey.elgamal: {
- const p = util.readMPI(bytes.subarray(read)); read += p.length + 2;
- const g = util.readMPI(bytes.subarray(read)); read += g.length + 2;
- const y = util.readMPI(bytes.subarray(read)); read += y.length + 2;
- return { read, publicParams: { p, g, y } };
+ /**
+ * Decrypts data using specified algorithm and private key parameters.
+ * See {@link https://tools.ietf.org/html/rfc4880#section-5.5.3|RFC 4880 5.5.3}
+ * @param {module:enums.publicKey} algo Public key algorithm
+ * @param {Array} key_params Algorithm-specific public, private key parameters
+ * @param {Array}
+ data_params encrypted session key parameters
+ * @param {String} fingerprint Recipient fingerprint
+ * @returns {String} String containing the decrypted data
+ * @async
+ */
+ publicKeyDecrypt: async function(algo, key_params, data_params, fingerprint) {
+ switch (algo) {
+ case enums.publicKey.rsa_encrypt_sign:
+ case enums.publicKey.rsa_encrypt: {
+ const c = data_params[0].toUint8Array();
+ const n = key_params[0].toUint8Array(); // n = pq
+ const e = key_params[1].toUint8Array();
+ const d = key_params[2].toUint8Array(); // de = 1 mod (p-1)(q-1)
+ const p = key_params[3].toUint8Array();
+ const q = key_params[4].toUint8Array();
+ const u = key_params[5].toUint8Array(); // p^-1 mod q
+ return publicKey.rsa.decrypt(c, n, e, d, p, q, u);
+ }
+ case enums.publicKey.elgamal: {
+ const c1 = data_params[0].toBN();
+ const c2 = data_params[1].toBN();
+ const p = key_params[0].toBN();
+ const x = key_params[3].toBN();
+ const result = new type_mpi(await publicKey.elgamal.decrypt(c1, c2, p, x)); // MPI and BN.js discard any leading zeros
+ return pkcs1.eme.decode(
+ util.Uint8Array_to_str(result.toUint8Array('be', p.byteLength())) // re-introduce leading zeros
+ );
+ }
+ case enums.publicKey.ecdh: {
+ const oid = key_params[0];
+ const kdfParams = key_params[2];
+ const V = data_params[0].toUint8Array();
+ const C = data_params[1].data;
+ const Q = key_params[1].toUint8Array();
+ const d = key_params[3].toUint8Array();
+ const result = new type_mpi(await publicKey.elliptic.ecdh.decrypt(
+ oid, kdfParams, V, C, Q, d, fingerprint));
+ return pkcs5.decode(result.toString());
+ }
+ default:
+ throw new Error('Invalid public key encryption algorithm.');
}
- case enums.publicKey.ecdsa: {
- const oid = new OID(); read += oid.read(bytes);
- const Q = util.readMPI(bytes.subarray(read)); read += Q.length + 2;
- return { read: read, publicParams: { oid, Q } };
- }
- case enums.publicKey.eddsa: {
- const oid = new OID(); read += oid.read(bytes);
- let Q = util.readMPI(bytes.subarray(read)); read += Q.length + 2;
- Q = util.leftPad(Q, 33);
- return { read: read, publicParams: { oid, Q } };
- }
- case enums.publicKey.ecdh: {
- const oid = new OID(); read += oid.read(bytes);
- const Q = util.readMPI(bytes.subarray(read)); read += Q.length + 2;
- const kdfParams = new KDFParams(); read += kdfParams.read(bytes.subarray(read));
- return { read: read, publicParams: { oid, Q, kdfParams } };
- }
- default:
- throw new Error('Invalid public key encryption algorithm.');
- }
-}
+ },
-/**
- * Parse private key material in binary form to get the key parameters
- * @param {module:enums.publicKey} algo The key algorithm
- * @param {Uint8Array} bytes The key material to parse
- * @param {Object} publicParams (ECC only) public params, needed to format some private params
- * @returns {{ read: Number, privateParams: Object }} Number of read bytes plus the key parameters referenced by name
- */
-export function parsePrivateKeyParams(algo, bytes, publicParams) {
- let read = 0;
- switch (algo) {
- case enums.publicKey.rsaEncrypt:
- case enums.publicKey.rsaEncryptSign:
- case enums.publicKey.rsaSign: {
- const d = util.readMPI(bytes.subarray(read)); read += d.length + 2;
- const p = util.readMPI(bytes.subarray(read)); read += p.length + 2;
- const q = util.readMPI(bytes.subarray(read)); read += q.length + 2;
- const u = util.readMPI(bytes.subarray(read)); read += u.length + 2;
- return { read, privateParams: { d, p, q, u } };
- }
- case enums.publicKey.dsa:
- case enums.publicKey.elgamal: {
- const x = util.readMPI(bytes.subarray(read)); read += x.length + 2;
- return { read, privateParams: { x } };
+ /** Returns the types comprising the private key of an algorithm
+ * @param {module:enums.publicKey} algo The public key algorithm
+ * @returns {Array} The array of types
+ */
+ getPrivKeyParamTypes: function(algo) {
+ switch (algo) {
+ // Algorithm-Specific Fields for RSA secret keys:
+ // - multiprecision integer (MPI) of RSA secret exponent d.
+ // - MPI of RSA secret prime value p.
+ // - MPI of RSA secret prime value q (p < q).
+ // - MPI of u, the multiplicative inverse of p, mod q.
+ case enums.publicKey.rsa_encrypt:
+ case enums.publicKey.rsa_encrypt_sign:
+ case enums.publicKey.rsa_sign:
+ return [type_mpi, type_mpi, type_mpi, type_mpi];
+ // Algorithm-Specific Fields for Elgamal secret keys:
+ // - MPI of Elgamal secret exponent x.
+ case enums.publicKey.elgamal:
+ return [type_mpi];
+ // Algorithm-Specific Fields for DSA secret keys:
+ // - MPI of DSA secret exponent x.
+ case enums.publicKey.dsa:
+ return [type_mpi];
+ // Algorithm-Specific Fields for ECDSA or ECDH secret keys:
+ // - MPI of an integer representing the secret key.
+ case enums.publicKey.ecdh:
+ case enums.publicKey.ecdsa:
+ case enums.publicKey.eddsa:
+ return [type_mpi];
+ default:
+ throw new Error('Invalid public key encryption algorithm.');
}
- case enums.publicKey.ecdsa:
- case enums.publicKey.ecdh: {
- const curve = new Curve(publicParams.oid);
- let d = util.readMPI(bytes.subarray(read)); read += d.length + 2;
- d = util.leftPad(d, curve.payloadSize);
- return { read, privateParams: { d } };
- }
- case enums.publicKey.eddsa: {
- let seed = util.readMPI(bytes.subarray(read)); read += seed.length + 2;
- seed = util.leftPad(seed, 32);
- return { read, privateParams: { seed } };
- }
- default:
- throw new Error('Invalid public key encryption algorithm.');
- }
-}
+ },
-/** Returns the types comprising the encrypted session key of an algorithm
- * @param {module:enums.publicKey} algo The key algorithm
- * @param {Uint8Array} bytes The key material to parse
- * @returns {Object} The session key parameters referenced by name
- */
-export function parseEncSessionKeyParams(algo, bytes) {
- let read = 0;
- switch (algo) {
- // Algorithm-Specific Fields for RSA encrypted session keys:
- // - MPI of RSA encrypted value m**e mod n.
- case enums.publicKey.rsaEncrypt:
- case enums.publicKey.rsaEncryptSign: {
- const c = util.readMPI(bytes.subarray(read));
- return { c };
+ /** Returns the types comprising the public key of an algorithm
+ * @param {module:enums.publicKey} algo The public key algorithm
+ * @returns {Array} The array of types
+ */
+ getPubKeyParamTypes: function(algo) {
+ switch (algo) {
+ // Algorithm-Specific Fields for RSA public keys:
+ // - a multiprecision integer (MPI) of RSA public modulus n;
+ // - an MPI of RSA public encryption exponent e.
+ case enums.publicKey.rsa_encrypt:
+ case enums.publicKey.rsa_encrypt_sign:
+ case enums.publicKey.rsa_sign:
+ return [type_mpi, type_mpi];
+ // Algorithm-Specific Fields for Elgamal public keys:
+ // - MPI of Elgamal prime p;
+ // - MPI of Elgamal group generator g;
+ // - MPI of Elgamal public key value y (= g**x mod p where x is secret).
+ case enums.publicKey.elgamal:
+ return [type_mpi, type_mpi, type_mpi];
+ // Algorithm-Specific Fields for DSA public keys:
+ // - MPI of DSA prime p;
+ // - MPI of DSA group order q (q is a prime divisor of p-1);
+ // - MPI of DSA group generator g;
+ // - MPI of DSA public-key value y (= g**x mod p where x is secret).
+ case enums.publicKey.dsa:
+ return [type_mpi, type_mpi, type_mpi, type_mpi];
+ // Algorithm-Specific Fields for ECDSA/EdDSA public keys:
+ // - OID of curve;
+ // - MPI of EC point representing public key.
+ case enums.publicKey.ecdsa:
+ case enums.publicKey.eddsa:
+ return [type_oid, type_mpi];
+ // Algorithm-Specific Fields for ECDH public keys:
+ // - OID of curve;
+ // - MPI of EC point representing public key.
+ // - KDF: variable-length field containing KDF parameters.
+ case enums.publicKey.ecdh:
+ return [type_oid, type_mpi, type_kdf_params];
+ default:
+ throw new Error('Invalid public key encryption algorithm.');
}
+ },
+
+ /** Returns the types comprising the encrypted session key of an algorithm
+ * @param {module:enums.publicKey} algo The public key algorithm
+ * @returns {Array} The array of types
+ */
+ getEncSessionKeyParamTypes: function(algo) {
+ switch (algo) {
+ // Algorithm-Specific Fields for RSA encrypted session keys:
+ // - MPI of RSA encrypted value m**e mod n.
+ case enums.publicKey.rsa_encrypt:
+ case enums.publicKey.rsa_encrypt_sign:
+ return [type_mpi];
- // Algorithm-Specific Fields for Elgamal encrypted session keys:
- // - MPI of Elgamal value g**k mod p
- // - MPI of Elgamal value m * y**k mod p
- case enums.publicKey.elgamal: {
- const c1 = util.readMPI(bytes.subarray(read)); read += c1.length + 2;
- const c2 = util.readMPI(bytes.subarray(read));
- return { c1, c2 };
+ // Algorithm-Specific Fields for Elgamal encrypted session keys:
+ // - MPI of Elgamal value g**k mod p
+ // - MPI of Elgamal value m * y**k mod p
+ case enums.publicKey.elgamal:
+ return [type_mpi, type_mpi];
+ // Algorithm-Specific Fields for ECDH encrypted session keys:
+ // - MPI containing the ephemeral key used to establish the shared secret
+ // - ECDH Symmetric Key
+ case enums.publicKey.ecdh:
+ return [type_mpi, type_ecdh_symkey];
+ default:
+ throw new Error('Invalid public key encryption algorithm.');
}
- // Algorithm-Specific Fields for ECDH encrypted session keys:
- // - MPI containing the ephemeral key used to establish the shared secret
- // - ECDH Symmetric Key
- case enums.publicKey.ecdh: {
- const V = util.readMPI(bytes.subarray(read)); read += V.length + 2;
- const C = new ECDHSymkey(); C.read(bytes.subarray(read));
- return { V, C };
+ },
+
+ /** Generate algorithm-specific key parameters
+ * @param {module:enums.publicKey} algo The public key algorithm
+ * @param {Integer} bits Bit length for RSA keys
+ * @param {module:type/oid} oid Object identifier for ECC keys
+ * @returns {Array} The array of parameters
+ * @async
+ */
+ generateParams: function(algo, bits, oid) {
+ const types = [].concat(this.getPubKeyParamTypes(algo), this.getPrivKeyParamTypes(algo));
+ switch (algo) {
+ case enums.publicKey.rsa_encrypt:
+ case enums.publicKey.rsa_encrypt_sign:
+ case enums.publicKey.rsa_sign: {
+ return publicKey.rsa.generate(bits, "10001").then(function(keyObject) {
+ return constructParams(
+ types, [keyObject.n, keyObject.e, keyObject.d, keyObject.p, keyObject.q, keyObject.u]
+ );
+ });
+ }
+ case enums.publicKey.dsa:
+ case enums.publicKey.elgamal:
+ throw new Error('Unsupported algorithm for key generation.');
+ case enums.publicKey.ecdsa:
+ case enums.publicKey.eddsa:
+ return publicKey.elliptic.generate(oid).then(function (keyObject) {
+ return constructParams(types, [keyObject.oid, keyObject.Q, keyObject.d]);
+ });
+ case enums.publicKey.ecdh:
+ return publicKey.elliptic.generate(oid).then(function (keyObject) {
+ return constructParams(types, [
+ keyObject.oid,
+ keyObject.Q,
+ { hash: keyObject.hash, cipher: keyObject.cipher },
+ keyObject.d
+ ]);
+ });
+ default:
+ throw new Error('Invalid public key algorithm.');
}
- default:
- throw new Error('Invalid public key encryption algorithm.');
- }
-}
+ },
-/**
- * Convert params to MPI and serializes them in the proper order
- * @param {module:enums.publicKey} algo The public key algorithm
- * @param {Object} params The key parameters indexed by name
- * @returns {Uint8Array} The array containing the MPIs
- */
-export function serializeParams(algo, params) {
- const orderedParams = Object.keys(params).map(name => {
- const param = params[name];
- return util.isUint8Array(param) ? util.uint8ArrayToMpi(param) : param.write();
- });
- return util.concatUint8Array(orderedParams);
-}
+ /**
+ * Validate algorithm-specific key parameters
+ * @param {module:enums.publicKey} algo The public key algorithm
+ * @param {Array} params The array of parameters
+ * @returns {Promise whether the parameters are valid
+ * @async
+ */
+ validateParams: async function(algo, params) {
+ switch (algo) {
+ case enums.publicKey.rsa_encrypt:
+ case enums.publicKey.rsa_encrypt_sign:
+ case enums.publicKey.rsa_sign: {
+ if (params.length < 6) {
+ throw new Error('Missing key parameters');
+ }
+ const n = params[0].toUint8Array();
+ const e = params[1].toUint8Array();
+ const d = params[2].toUint8Array();
+ const p = params[3].toUint8Array();
+ const q = params[4].toUint8Array();
+ const u = params[5].toUint8Array();
+ return publicKey.rsa.validateParams(n, e, d, p, q, u);
+ }
+ case enums.publicKey.dsa: {
+ if (params.length < 5) {
+ throw new Error('Missing key parameters');
+ }
+ const p = params[0].toUint8Array();
+ const q = params[1].toUint8Array();
+ const g = params[2].toUint8Array();
+ const y = params[3].toUint8Array();
+ const x = params[4].toUint8Array();
+ return publicKey.dsa.validateParams(p, q, g, y, x);
+ }
+ case enums.publicKey.elgamal: {
+ if (params.length < 4) {
+ throw new Error('Missing key parameters');
+ }
+ const p = params[0].toUint8Array();
+ const g = params[1].toUint8Array();
+ const y = params[2].toUint8Array();
+ const x = params[3].toUint8Array();
+ return publicKey.elgamal.validateParams(p, g, y, x);
+ }
+ case enums.publicKey.ecdsa:
+ case enums.publicKey.ecdh: {
+ const expectedLen = algo === enums.publicKey.ecdh ? 3 : 2;
+ if (params.length < expectedLen) {
+ throw new Error('Missing key parameters');
+ }
-/**
- * Generate algorithm-specific key parameters
- * @param {module:enums.publicKey} algo The public key algorithm
- * @param {Integer} bits Bit length for RSA keys
- * @param {module:type/oid} oid Object identifier for ECC keys
- * @returns {{ publicParams: {Object}, privateParams: {Object} }} The parameters referenced by name
- * @async
- */
-export function generateParams(algo, bits, oid) {
- switch (algo) {
- case enums.publicKey.rsaEncrypt:
- case enums.publicKey.rsaEncryptSign:
- case enums.publicKey.rsaSign: {
- return publicKey.rsa.generate(bits, 65537).then(({ n, e, d, p, q, u }) => ({
- privateParams: { d, p, q, u },
- publicParams: { n, e }
- }));
- }
- case enums.publicKey.ecdsa:
- return publicKey.elliptic.generate(oid).then(({ oid, Q, secret }) => ({
- privateParams: { d: secret },
- publicParams: { oid: new OID(oid), Q }
- }));
- case enums.publicKey.eddsa:
- return publicKey.elliptic.generate(oid).then(({ oid, Q, secret }) => ({
- privateParams: { seed: secret },
- publicParams: { oid: new OID(oid), Q }
- }));
- case enums.publicKey.ecdh:
- return publicKey.elliptic.generate(oid).then(({ oid, Q, secret, hash, cipher }) => ({
- privateParams: { d: secret },
- publicParams: {
- oid: new OID(oid),
- Q,
- kdfParams: new KDFParams({ hash, cipher })
+ const algoModule = publicKey.elliptic[enums.read(enums.publicKey, algo)];
+ const { oid, Q, d } = algoModule.parseParams(params);
+ return algoModule.validateParams(oid, Q, d);
+ }
+ case enums.publicKey.eddsa: {
+ const expectedLen = 3;
+ if (params.length < expectedLen) {
+ throw new Error('Missing key parameters');
}
- }));
- case enums.publicKey.dsa:
- case enums.publicKey.elgamal:
- throw new Error('Unsupported algorithm for key generation.');
- default:
- throw new Error('Invalid public key algorithm.');
- }
-}
-/**
- * Validate algorithm-specific key parameters
- * @param {module:enums.publicKey} algo The public key algorithm
- * @param {Object} publicParams Algorithm-specific public key parameters
- * @param {Object} privateParams Algorithm-specific private key parameters
- * @returns {Promise} Whether the parameters are valid
- * @async
- */
-export async function validateParams(algo, publicParams, privateParams) {
- if (!publicParams || !privateParams) {
- throw new Error('Missing key parameters');
- }
- switch (algo) {
- case enums.publicKey.rsaEncrypt:
- case enums.publicKey.rsaEncryptSign:
- case enums.publicKey.rsaSign: {
- const { n, e } = publicParams;
- const { d, p, q, u } = privateParams;
- return publicKey.rsa.validateParams(n, e, d, p, q, u);
- }
- case enums.publicKey.dsa: {
- const { p, q, g, y } = publicParams;
- const { x } = privateParams;
- return publicKey.dsa.validateParams(p, q, g, y, x);
- }
- case enums.publicKey.elgamal: {
- const { p, g, y } = publicParams;
- const { x } = privateParams;
- return publicKey.elgamal.validateParams(p, g, y, x);
- }
- case enums.publicKey.ecdsa:
- case enums.publicKey.ecdh: {
- const algoModule = publicKey.elliptic[enums.read(enums.publicKey, algo)];
- const { oid, Q } = publicParams;
- const { d } = privateParams;
- return algoModule.validateParams(oid, Q, d);
+ const { oid, Q, seed } = publicKey.elliptic.eddsa.parseParams(params);
+ return publicKey.elliptic.eddsa.validateParams(oid, Q, seed);
+ }
+ default:
+ throw new Error('Invalid public key algorithm.');
}
- case enums.publicKey.eddsa: {
- const { oid, Q } = publicParams;
- const { seed } = privateParams;
- return publicKey.elliptic.eddsa.validateParams(oid, Q, seed);
- }
- default:
- throw new Error('Invalid public key algorithm.');
- }
-}
+ },
-/**
- * Generates a random byte prefix for the specified algorithm
- * See {@link https://tools.ietf.org/html/rfc4880#section-9.2|RFC 4880 9.2} for algorithms.
- * @param {module:enums.symmetric} algo Symmetric encryption algorithm
- * @returns {Uint8Array} Random bytes with length equal to the block size of the cipher, plus the last two bytes repeated.
- * @async
- */
-export async function getPrefixRandom(algo) {
- const prefixrandom = await getRandomBytes(cipher[algo].blockSize);
- const repeat = new Uint8Array([prefixrandom[prefixrandom.length - 2], prefixrandom[prefixrandom.length - 1]]);
- return util.concat([prefixrandom, repeat]);
-}
+ /**
+ * Generates a random byte prefix for the specified algorithm
+ * See {@link https://tools.ietf.org/html/rfc4880#section-9.2|RFC 4880 9.2} for algorithms.
+ * @param {module:enums.symmetric} algo Symmetric encryption algorithm
+ * @returns {Uint8Array} Random bytes with length equal to the block size of the cipher, plus the last two bytes repeated.
+ * @async
+ */
+ getPrefixRandom: async function(algo) {
+ const prefixrandom = await random.getRandomBytes(cipher[algo].blockSize);
+ const repeat = new Uint8Array([prefixrandom[prefixrandom.length - 2], prefixrandom[prefixrandom.length - 1]]);
+ return util.concat([prefixrandom, repeat]);
+ },
-/**
- * Generating a session key for the specified symmetric algorithm
- * See {@link https://tools.ietf.org/html/rfc4880#section-9.2|RFC 4880 9.2} for algorithms.
- * @param {module:enums.symmetric} algo Symmetric encryption algorithm
- * @returns {Uint8Array} Random bytes as a string to be used as a key
- * @async
- */
-export function generateSessionKey(algo) {
- return getRandomBytes(cipher[algo].keySize);
-}
+ /**
+ * Generating a session key for the specified symmetric algorithm
+ * See {@link https://tools.ietf.org/html/rfc4880#section-9.2|RFC 4880 9.2} for algorithms.
+ * @param {module:enums.symmetric} algo Symmetric encryption algorithm
+ * @returns {Uint8Array} Random bytes as a string to be used as a key
+ * @async
+ */
+ generateSessionKey: function(algo) {
+ return random.getRandomBytes(cipher[algo].keySize);
+ },
+
+ constructParams: constructParams
+};
diff --git a/src/crypto/eax.js b/src/crypto/eax.js
index e59cf3ff..0844b8af 100644
--- a/src/crypto/eax.js
+++ b/src/crypto/eax.js
@@ -24,7 +24,7 @@
* @module crypto/eax
*/
-import { AES_CTR } from 'asmcrypto.js/dist_es8/aes/ctr';
+import { AES_CTR } from 'asmcrypto.js/dist_es5/aes/ctr';
import CMAC from './cmac';
import util from '../util';
diff --git a/src/crypto/gcm.js b/src/crypto/gcm.js
index 64b75567..f028c3b0 100644
--- a/src/crypto/gcm.js
+++ b/src/crypto/gcm.js
@@ -23,7 +23,7 @@
* @module crypto/gcm
*/
-import { AES_GCM } from 'asmcrypto.js/dist_es8/aes/gcm';
+import { AES_GCM } from 'asmcrypto.js/dist_es5/aes/gcm';
import util from '../util';
const webCrypto = util.getWebCrypto(); // no GCM support in IE11, Safari 9
diff --git a/src/crypto/hash/index.js b/src/crypto/hash/index.js
index aeefce36..a8aecd69 100644
--- a/src/crypto/hash/index.js
+++ b/src/crypto/hash/index.js
@@ -11,8 +11,8 @@
* @module crypto/hash
*/
-import { Sha1 } from 'asmcrypto.js/dist_es8/hash/sha1/sha1';
-import { Sha256 } from 'asmcrypto.js/dist_es8/hash/sha256/sha256';
+import { Sha1 } from 'asmcrypto.js/dist_es5/hash/sha1/sha1';
+import { Sha256 } from 'asmcrypto.js/dist_es5/hash/sha256/sha256';
import sha224 from 'hash.js/lib/hash/sha/224';
import sha384 from 'hash.js/lib/hash/sha/384';
import sha512 from 'hash.js/lib/hash/sha/512';
@@ -37,7 +37,7 @@ function node_hash(type) {
function hashjs_hash(hash, webCryptoHash) {
return async function(data) {
- if (!util.isStream(data) && webCrypto && webCryptoHash && data.length >= config.minBytesForWebCrypto) {
+ if (!util.isStream(data) && webCrypto && webCryptoHash && data.length >= config.min_bytes_for_web_crypto) {
return new Uint8Array(await webCrypto.digest(webCryptoHash, data));
}
const hashInstance = hash();
@@ -54,7 +54,7 @@ function asmcrypto_hash(hash, webCryptoHash) {
return stream.transform(data, value => {
hashInstance.process(value);
}, () => hashInstance.finish().result);
- } else if (webCrypto && webCryptoHash && data.length >= config.minBytesForWebCrypto) {
+ } else if (webCrypto && webCryptoHash && data.length >= config.min_bytes_for_web_crypto) {
return new Uint8Array(await webCrypto.digest(webCryptoHash, data));
} else {
return hash.bytes(data);
diff --git a/src/crypto/hash/md5.js b/src/crypto/hash/md5.js
index 126c8fb1..fb277030 100644
--- a/src/crypto/hash/md5.js
+++ b/src/crypto/hash/md5.js
@@ -20,8 +20,8 @@ import util from '../../util';
// MD5 Digest
async function md5(entree) {
- const digest = md51(util.uint8ArrayToStr(entree));
- return util.hexToUint8Array(hex(digest));
+ const digest = md51(util.Uint8Array_to_str(entree));
+ return util.hex_to_Uint8Array(hex(digest));
}
function md5cycle(x, k) {
diff --git a/src/crypto/index.js b/src/crypto/index.js
index ac08ed0f..c136af1e 100644
--- a/src/crypto/index.js
+++ b/src/crypto/index.js
@@ -9,19 +9,19 @@
* @module crypto
*/
-import * as cipher from './cipher';
+import cipher from './cipher';
import hash from './hash';
-import * as cfb from './cfb';
+import cfb from './cfb';
import gcm from './gcm';
import eax from './eax';
import ocb from './ocb';
import publicKey from './public_key';
-import * as signature from './signature';
-import * as random from './random';
-import * as pkcs1 from './pkcs1';
-import * as pkcs5 from './pkcs5';
-import * as crypto from './crypto';
-import * as aes_kw from './aes_kw';
+import signature from './signature';
+import random from './random';
+import pkcs1 from './pkcs1';
+import pkcs5 from './pkcs5';
+import crypto from './crypto';
+import aes_kw from './aes_kw';
// TODO move cfb and gcm to cipher
const mod = {
@@ -33,7 +33,7 @@ const mod = {
cfb: cfb,
/** @see module:crypto/gcm */
gcm: gcm,
- experimentalGcm: gcm,
+ experimental_gcm: gcm,
/** @see module:crypto/eax */
eax: eax,
/** @see module:crypto/ocb */
diff --git a/src/crypto/ocb.js b/src/crypto/ocb.js
index 8547e27e..f193e2af 100644
--- a/src/crypto/ocb.js
+++ b/src/crypto/ocb.js
@@ -22,7 +22,7 @@
* @module crypto/ocb
*/
-import * as ciphers from './cipher';
+import ciphers from './cipher';
import util from '../util';
diff --git a/src/crypto/pkcs1.js b/src/crypto/pkcs1.js
index d91f234e..4bc783c2 100644
--- a/src/crypto/pkcs1.js
+++ b/src/crypto/pkcs1.js
@@ -19,14 +19,21 @@
* @fileoverview Provides EME-PKCS1-v1_5 encoding and decoding and EMSA-PKCS1-v1_5 encoding function
* @see module:crypto/public_key/rsa
* @see module:crypto/public_key/elliptic/ecdh
- * @see PublicKeyEncryptedSessionKeyPacket
+ * @see module:packet.PublicKeyEncryptedSessionKey
* @requires crypto/random
* @requires crypto/hash
+ * @requires util
* @module crypto/pkcs1
*/
-import { getRandomBytes } from './random';
+import random from './random';
import hash from './hash';
+import util from '../util';
+
+/** @namespace */
+const eme = {};
+/** @namespace */
+const emsa = {};
/**
* ASN1 object identifiers for hashes
@@ -49,18 +56,17 @@ hash_headers[11] = [0x30, 0x2d, 0x30, 0x0d, 0x06, 0x09, 0x60, 0x86, 0x48, 0x01,
/**
* Create padding with secure random data
* @private
- * @param {Integer} length Length of the padding in bytes
- * @returns {Uint8Array} Random padding
+ * @param {Integer} length Length of the padding in bytes
+ * @returns {String} Padding as string
* @async
*/
async function getPkcs1Padding(length) {
- const result = new Uint8Array(length);
- let count = 0;
- while (count < length) {
- const randomBytes = await getRandomBytes(length - count);
+ let result = '';
+ while (result.length < length) {
+ const randomBytes = await random.getRandomBytes(length - result.length);
for (let i = 0; i < randomBytes.length; i++) {
if (randomBytes[i] !== 0) {
- result[count++] = randomBytes[i];
+ result += String.fromCharCode(randomBytes[i]);
}
}
}
@@ -70,49 +76,49 @@ async function getPkcs1Padding(length) {
/**
* Create a EME-PKCS1-v1_5 padded message
* @see {@link https://tools.ietf.org/html/rfc4880#section-13.1.1|RFC 4880 13.1.1}
- * @param {Uint8Array} message message to be encoded
- * @param {Integer} keyLength the length in octets of the key modulus
- * @returns {Promise} EME-PKCS1 padded message
+ * @param {String} M message to be encoded
+ * @param {Integer} k the length in octets of the key modulus
+ * @returns {Promise} EME-PKCS1 padded message
* @async
*/
-export async function emeEncode(message, keyLength) {
- const mLength = message.length;
+eme.encode = async function(M, k) {
+ const mLen = M.length;
// length checking
- if (mLength > keyLength - 11) {
+ if (mLen > k - 11) {
throw new Error('Message too long');
}
// Generate an octet string PS of length k - mLen - 3 consisting of
// pseudo-randomly generated nonzero octets
- const PS = await getPkcs1Padding(keyLength - mLength - 3);
+ const PS = await getPkcs1Padding(k - mLen - 3);
// Concatenate PS, the message M, and other padding to form an
// encoded message EM of length k octets as EM = 0x00 || 0x02 || PS || 0x00 || M.
- const encoded = new Uint8Array(keyLength);
- // 0x00 byte
- encoded[1] = 2;
- encoded.set(PS, 2);
- // 0x00 bytes
- encoded.set(message, keyLength - mLength);
- return encoded;
-}
+ return String.fromCharCode(0) +
+ String.fromCharCode(2) +
+ PS +
+ String.fromCharCode(0) +
+ M;
+};
/**
* Decode a EME-PKCS1-v1_5 padded message
* @see {@link https://tools.ietf.org/html/rfc4880#section-13.1.2|RFC 4880 13.1.2}
- * @param {Uint8Array} encoded encoded message bytes
- * @returns {Uint8Array} message
+ * @param {String} EM encoded message, an octet string
+ * @returns {String} message, an octet string
*/
-export function emeDecode(encoded) {
+eme.decode = function(EM) {
+ const firstOct = EM.charCodeAt(0);
+ const secondOct = EM.charCodeAt(1);
let i = 2;
- while (encoded[i] !== 0 && i < encoded.length) {
+ while (EM.charCodeAt(i) !== 0 && i < EM.length) {
i++;
}
const psLen = i - 2;
- const separator = encoded[i++];
- if (encoded[0] === 0 && encoded[1] === 2 && psLen >= 8 && separator === 0) {
- return encoded.subarray(i);
+ const separator = EM.charCodeAt(i++);
+ if (firstOct === 0 && secondOct === 2 && psLen >= 8 && separator === 0) {
+ return EM.substr(i);
}
throw new Error('Decryption error');
-}
+};
/**
* Create a EMSA-PKCS1-v1_5 padded message
@@ -120,34 +126,41 @@ export function emeDecode(encoded) {
* @param {Integer} algo Hash algorithm type used
* @param {Uint8Array} hashed message to be encoded
* @param {Integer} emLen intended length in octets of the encoded message
- * @returns {Uint8Array} encoded message
+ * @returns {String} encoded message
*/
-export async function emsaEncode(algo, hashed, emLen) {
+emsa.encode = async function(algo, hashed, emLen) {
let i;
- if (hashed.length !== hash.getHashByteLength(algo)) {
+ const H = util.Uint8Array_to_str(hashed);
+ if (H.length !== hash.getHashByteLength(algo)) {
throw new Error('Invalid hash length');
}
// produce an ASN.1 DER value for the hash function used.
// Let T be the full hash prefix
- const hashPrefix = new Uint8Array(hash_headers[algo].length);
+ let T = '';
for (i = 0; i < hash_headers[algo].length; i++) {
- hashPrefix[i] = hash_headers[algo][i];
+ T += String.fromCharCode(hash_headers[algo][i]);
}
- // and let tLen be the length in octets prefix and hashed data
- const tLen = hashPrefix.length + hashed.length;
+ // add hash value to prefix
+ T += H;
+ // and let tLen be the length in octets of T
+ const tLen = T.length;
if (emLen < tLen + 11) {
throw new Error('Intended encoded message length too short');
}
// an octet string PS consisting of emLen - tLen - 3 octets with hexadecimal value 0xFF
// The length of PS will be at least 8 octets
- const PS = new Uint8Array(emLen - tLen - 3).fill(0xff);
+ let PS = '';
+ for (i = 0; i < (emLen - tLen - 3); i++) {
+ PS += String.fromCharCode(0xff);
+ }
+ // Concatenate PS, the hash prefix T, and other padding to form the
+ // encoded message EM as EM = 0x00 || 0x01 || PS || 0x00 || T.
+ const EM = String.fromCharCode(0x00) +
+ String.fromCharCode(0x01) +
+ PS +
+ String.fromCharCode(0x00) +
+ T;
+ return util.str_to_hex(EM);
+};
- // Concatenate PS, the hash prefix, hashed data, and other padding to form the
- // encoded message EM as EM = 0x00 || 0x01 || PS || 0x00 || prefix || hashed
- const EM = new Uint8Array(emLen);
- EM[1] = 0x01;
- EM.set(PS, 2);
- EM.set(hashPrefix, emLen - tLen);
- EM.set(hashed, emLen - hashed.length);
- return EM;
-}
+export default { eme, emsa };
diff --git a/src/crypto/pkcs5.js b/src/crypto/pkcs5.js
index acb1577b..23c93b2d 100644
--- a/src/crypto/pkcs5.js
+++ b/src/crypto/pkcs5.js
@@ -15,42 +15,41 @@
// License along with this library; if not, write to the Free Software
// Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
-import util from '../util';
-
/**
* @fileoverview Functions to add and remove PKCS5 padding
- * @see PublicKeyEncryptedSessionKeyPacket
+ * @see module:packet.PublicKeyEncryptedSessionKey
* @module crypto/pkcs5
*/
/**
- * Add pkcs5 padding to a message
- * @param {Uint8Array} message message to pad
- * @returns {Uint8Array} padded message
+ * Add pkcs5 padding to a text.
+ * @param {String} msg Text to add padding
+ * @returns {String} Text with padding added
*/
-export function encode(message) {
- const c = 8 - (message.length % 8);
- const padded = new Uint8Array(message.length + c).fill(c);
- padded.set(message);
- return padded;
+function encode(msg) {
+ const c = 8 - (msg.length % 8);
+ const padding = String.fromCharCode(c).repeat(c);
+ return msg + padding;
}
/**
- * Remove pkcs5 padding from a message
- * @param {Uint8Array} message message to remove padding from
- * @returns {Uint8Array} message without padding
+ * Remove pkcs5 padding from a string.
+ * @param {String} msg Text to remove padding from
+ * @returns {String} Text with padding removed
*/
-export function decode(message) {
- const len = message.length;
+function decode(msg) {
+ const len = msg.length;
if (len > 0) {
- const c = message[len - 1];
+ const c = msg.charCodeAt(len - 1);
if (c >= 1) {
- const provided = message.subarray(len - c);
- const computed = new Uint8Array(c).fill(c);
- if (util.equalsUint8Array(provided, computed)) {
- return message.subarray(0, len - c);
+ const provided = msg.substr(len - c);
+ const computed = String.fromCharCode(c).repeat(c);
+ if (provided === computed) {
+ return msg.substr(0, len - c);
}
}
}
throw new Error('Invalid padding');
}
+
+export default { encode, decode };
diff --git a/src/crypto/public_key/dsa.js b/src/crypto/public_key/dsa.js
index a501eb39..15f1c94e 100644
--- a/src/crypto/public_key/dsa.js
+++ b/src/crypto/public_key/dsa.js
@@ -17,13 +17,19 @@
/**
* @fileoverview A Digital signature algorithm implementation
+ * @requires bn.js
* @requires crypto/random
* @requires util
* @module crypto/public_key/dsa
*/
-import { getRandomBigInteger } from '../random';
+
+import BN from 'bn.js';
+import random from '../random';
import util from '../../util';
-import { isProbablePrime } from './prime';
+import prime from './prime';
+
+const one = new BN(1);
+const zero = new BN(0);
/*
TODO regarding the hash function, read:
@@ -31,168 +37,152 @@ import { isProbablePrime } from './prime';
https://tools.ietf.org/html/rfc4880#section-14
*/
-/**
- * DSA Sign function
- * @param {Integer} hash_algo
- * @param {Uint8Array} hashed
- * @param {Uint8Array} g
- * @param {Uint8Array} p
- * @param {Uint8Array} q
- * @param {Uint8Array} x
- * @returns {{ r: Uint8Array, s: Uint8Array }}
- * @async
- */
-export async function sign(hash_algo, hashed, g, p, q, x) {
- const BigInteger = await util.getBigInteger();
- const one = new BigInteger(1);
- p = new BigInteger(p);
- q = new BigInteger(q);
- g = new BigInteger(g);
- x = new BigInteger(x);
-
- let k;
- let r;
- let s;
- let t;
- g = g.mod(p);
- x = x.mod(q);
- // If the output size of the chosen hash is larger than the number of
- // bits of q, the hash result is truncated to fit by taking the number
- // of leftmost bits equal to the number of bits of q. This (possibly
- // truncated) hash function result is treated as a number and used
- // directly in the DSA signature algorithm.
- const h = new BigInteger(hashed.subarray(0, q.byteLength())).mod(q);
- // FIPS-186-4, section 4.6:
- // The values of r and s shall be checked to determine if r = 0 or s = 0.
- // If either r = 0 or s = 0, a new value of k shall be generated, and the
- // signature shall be recalculated. It is extremely unlikely that r = 0
- // or s = 0 if signatures are generated properly.
- while (true) {
- // See Appendix B here: https://nvlpubs.nist.gov/nistpubs/FIPS/NIST.FIPS.186-4.pdf
- k = await getRandomBigInteger(one, q); // returns in [1, q-1]
- r = g.modExp(k, p).imod(q); // (g**k mod p) mod q
- if (r.isZero()) {
- continue;
- }
- const xr = x.mul(r).imod(q);
- t = h.add(xr).imod(q); // H(m) + x*r mod q
- s = k.modInv(q).imul(t).imod(q); // k**-1 * (H(m) + x*r) mod q
- if (s.isZero()) {
- continue;
- }
- break;
- }
- return {
- r: r.toUint8Array('be', q.byteLength()),
- s: s.toUint8Array('be', q.byteLength())
- };
-}
-
-/**
- * DSA Verify function
- * @param {Integer} hash_algo
- * @param {Uint8Array} r
- * @param {Uint8Array} s
- * @param {Uint8Array} hashed
- * @param {Uint8Array} g
- * @param {Uint8Array} p
- * @param {Uint8Array} q
- * @param {Uint8Array} y
- * @returns {boolean}
- * @async
- */
-export async function verify(hash_algo, r, s, hashed, g, p, q, y) {
- const BigInteger = await util.getBigInteger();
- const zero = new BigInteger(0);
- r = new BigInteger(r);
- s = new BigInteger(s);
-
- p = new BigInteger(p);
- q = new BigInteger(q);
- g = new BigInteger(g);
- y = new BigInteger(y);
-
- if (r.lte(zero) || r.gte(q) ||
- s.lte(zero) || s.gte(q)) {
- util.printDebug("invalid DSA Signature");
- return false;
- }
- const h = new BigInteger(hashed.subarray(0, q.byteLength())).imod(q);
- const w = s.modInv(q); // s**-1 mod q
- if (w.isZero()) {
- util.printDebug("invalid DSA Signature");
- return false;
- }
-
- g = g.mod(p);
- y = y.mod(p);
- const u1 = h.mul(w).imod(q); // H(m) * w mod q
- const u2 = r.mul(w).imod(q); // r * w mod q
- const t1 = g.modExp(u1, p); // g**u1 mod p
- const t2 = y.modExp(u2, p); // y**u2 mod p
- const v = t1.mul(t2).imod(p).imod(q); // (g**u1 * y**u2 mod p) mod q
- return v.equal(r);
-}
-
-/**
- * Validate DSA parameters
- * @param {Uint8Array} p DSA prime
- * @param {Uint8Array} q DSA group order
- * @param {Uint8Array} g DSA sub-group generator
- * @param {Uint8Array} y DSA public key
- * @param {Uint8Array} x DSA private key
- * @returns {Promise} whether params are valid
- * @async
- */
-export async function validateParams(p, q, g, y, x) {
- const BigInteger = await util.getBigInteger();
- p = new BigInteger(p);
- q = new BigInteger(q);
- g = new BigInteger(g);
- y = new BigInteger(y);
- const one = new BigInteger(1);
- // Check that 1 < g < p
- if (g.lte(one) || g.gte(p)) {
- return false;
- }
-
+export default {
/**
- * Check that subgroup order q divides p-1
+ * DSA Sign function
+ * @param {Integer} hash_algo
+ * @param {Uint8Array} hashed
+ * @param {BN} g
+ * @param {BN} p
+ * @param {BN} q
+ * @param {BN} x
+ * @returns {{ r: BN, s: BN }}
+ * @async
*/
- if (!p.dec().mod(q).isZero()) {
- return false;
- }
+ sign: async function(hash_algo, hashed, g, p, q, x) {
+ let k;
+ let r;
+ let s;
+ let t;
+ const redp = new BN.red(p);
+ const redq = new BN.red(q);
+ const gred = g.toRed(redp);
+ const xred = x.toRed(redq);
+ // If the output size of the chosen hash is larger than the number of
+ // bits of q, the hash result is truncated to fit by taking the number
+ // of leftmost bits equal to the number of bits of q. This (possibly
+ // truncated) hash function result is treated as a number and used
+ // directly in the DSA signature algorithm.
+ const h = new BN(hashed.subarray(0, q.byteLength())).toRed(redq);
+ // FIPS-186-4, section 4.6:
+ // The values of r and s shall be checked to determine if r = 0 or s = 0.
+ // If either r = 0 or s = 0, a new value of k shall be generated, and the
+ // signature shall be recalculated. It is extremely unlikely that r = 0
+ // or s = 0 if signatures are generated properly.
+ while (true) {
+ // See Appendix B here: https://nvlpubs.nist.gov/nistpubs/FIPS/NIST.FIPS.186-4.pdf
+ k = await random.getRandomBN(one, q); // returns in [1, q-1]
+ r = gred.redPow(k).fromRed().toRed(redq); // (g**k mod p) mod q
+ if (zero.cmp(r) === 0) {
+ continue;
+ }
+ t = h.redAdd(xred.redMul(r)); // H(m) + x*r mod q
+ s = k.toRed(redq).redInvm().redMul(t); // k**-1 * (H(m) + x*r) mod q
+ if (zero.cmp(s) === 0) {
+ continue;
+ }
+ break;
+ }
+ return {
+ r: r.toArrayLike(Uint8Array, 'be', q.byteLength()),
+ s: s.toArrayLike(Uint8Array, 'be', q.byteLength())
+ };
+ },
/**
- * g has order q
- * Check that g ** q = 1 mod p
+ * DSA Verify function
+ * @param {Integer} hash_algo
+ * @param {BN} r
+ * @param {BN} s
+ * @param {Uint8Array} hashed
+ * @param {BN} g
+ * @param {BN} p
+ * @param {BN} q
+ * @param {BN} y
+ * @returns {boolean}
+ * @async
*/
- if (!g.modExp(q, p).isOne()) {
- return false;
- }
+ verify: async function(hash_algo, r, s, hashed, g, p, q, y) {
+ if (zero.ucmp(r) >= 0 || r.ucmp(q) >= 0 ||
+ zero.ucmp(s) >= 0 || s.ucmp(q) >= 0) {
+ util.print_debug("invalid DSA Signature");
+ return null;
+ }
+ const redp = new BN.red(p);
+ const redq = new BN.red(q);
+ const h = new BN(hashed.subarray(0, q.byteLength()));
+ const w = s.toRed(redq).redInvm(); // s**-1 mod q
+ if (zero.cmp(w) === 0) {
+ util.print_debug("invalid DSA Signature");
+ return null;
+ }
+ const u1 = h.toRed(redq).redMul(w); // H(m) * w mod q
+ const u2 = r.toRed(redq).redMul(w); // r * w mod q
+ const t1 = g.toRed(redp).redPow(u1.fromRed()); // g**u1 mod p
+ const t2 = y.toRed(redp).redPow(u2.fromRed()); // y**u2 mod p
+ const v = t1.redMul(t2).fromRed().mod(q); // (g**u1 * y**u2 mod p) mod q
+ return v.cmp(r) === 0;
+ },
/**
- * Check q is large and probably prime (we mainly want to avoid small factors)
+ * Validate DSA parameters
+ * @param {Uint8Array} p DSA prime
+ * @param {Uint8Array} q DSA group order
+ * @param {Uint8Array} g DSA sub-group generator
+ * @param {Uint8Array} y DSA public key
+ * @param {Uint8Array} x DSA private key
+ * @returns {Promise} whether params are valid
+ * @async
*/
- const qSize = new BigInteger(q.bitLength());
- const n150 = new BigInteger(150);
- if (qSize.lt(n150) || !(await isProbablePrime(q, null, 32))) {
- return false;
- }
+ validateParams: async function (p, q, g, y, x) {
+ p = new BN(p);
+ q = new BN(q);
+ g = new BN(g);
+ y = new BN(y);
+ const one = new BN(1);
+ // Check that 1 < g < p
+ if (g.lte(one) || g.gte(p)) {
+ return false;
+ }
- /**
- * Re-derive public key y' = g ** x mod p
- * Expect y == y'
- *
- * Blinded exponentiation computes g**{rq + x} to compare to y
- */
- x = new BigInteger(x);
- const two = new BigInteger(2);
- const r = await getRandomBigInteger(two.leftShift(qSize.dec()), two.leftShift(qSize)); // draw r of same size as q
- const rqx = q.mul(r).add(x);
- if (!y.equal(g.modExp(rqx, p))) {
- return false;
- }
+ /**
+ * Check that subgroup order q divides p-1
+ */
+ if (!p.sub(one).mod(q).isZero()) {
+ return false;
+ }
- return true;
-}
+ const pred = new BN.red(p);
+ const gModP = g.toRed(pred);
+ /**
+ * g has order q
+ * Check that g ** q = 1 mod p
+ */
+ if (!gModP.redPow(q).eq(one)) {
+ return false;
+ }
+
+ /**
+ * Check q is large and probably prime (we mainly want to avoid small factors)
+ */
+ const qSize = q.bitLength();
+ if (qSize < 150 || !(await prime.isProbablePrime(q, null, 32))) {
+ return false;
+ }
+
+ /**
+ * Re-derive public key y' = g ** x mod p
+ * Expect y == y'
+ *
+ * Blinded exponentiation computes g**{rq + x} to compare to y
+ */
+ x = new BN(x);
+ const r = await random.getRandomBN(new BN(2).shln(qSize - 1), new BN(2).shln(qSize)); // draw r of same size as q
+ const rqx = q.mul(r).add(x);
+ if (!y.eq(gModP.redPow(rqx))) {
+ return false;
+ }
+
+ return true;
+ }
+};
diff --git a/src/crypto/public_key/elgamal.js b/src/crypto/public_key/elgamal.js
index 81fa505b..0e10f032 100644
--- a/src/crypto/public_key/elgamal.js
+++ b/src/crypto/public_key/elgamal.js
@@ -17,129 +17,120 @@
/**
* @fileoverview ElGamal implementation
+ * @requires bn.js
* @requires crypto/random
- * @requires util
* @module crypto/public_key/elgamal
*/
-import util from '../../util';
-import { getRandomBigInteger } from '../random';
-import { emeEncode, emeDecode } from '../pkcs1';
+import BN from 'bn.js';
+import random from '../random';
-/**
- * ElGamal Encryption function
- * Note that in OpenPGP, the message needs to be padded with PKCS#1 (same as RSA)
- * @param {Uint8Array} data to be padded and encrypted
- * @param {Uint8Array} p
- * @param {Uint8Array} g
- * @param {Uint8Array} y
- * @returns {{ c1: Uint8Array, c2: Uint8Array }}
- * @async
- */
-export async function encrypt(data, p, g, y) {
- const BigInteger = await util.getBigInteger();
- p = new BigInteger(p);
- g = new BigInteger(g);
- y = new BigInteger(y);
-
- const padded = await emeEncode(data, p.byteLength());
- const m = new BigInteger(padded);
-
- // OpenPGP uses a "special" version of ElGamal where g is generator of the full group Z/pZ*
- // hence g has order p-1, and to avoid that k = 0 mod p-1, we need to pick k in [1, p-2]
- const k = await getRandomBigInteger(new BigInteger(1), p.dec());
- return {
- c1: g.modExp(k, p).toUint8Array(),
- c2: y.modExp(k, p).imul(m).imod(p).toUint8Array()
- };
-}
+export default {
+ /**
+ * ElGamal Encryption function
+ * @param {BN} m
+ * @param {BN} p
+ * @param {BN} g
+ * @param {BN} y
+ * @returns {{ c1: BN, c2: BN }}
+ * @async
+ */
+ encrypt: async function(m, p, g, y) {
+ const redp = new BN.red(p);
+ const mred = m.toRed(redp);
+ const gred = g.toRed(redp);
+ const yred = y.toRed(redp);
+ // OpenPGP uses a "special" version of ElGamal where g is generator of the full group Z/pZ*
+ // hence g has order p-1, and to avoid that k = 0 mod p-1, we need to pick k in [1, p-2]
+ const k = await random.getRandomBN(new BN(1), p.subn(1));
+ return {
+ c1: gred.redPow(k).fromRed(),
+ c2: yred.redPow(k).redMul(mred).fromRed()
+ };
+ },
-/**
- * ElGamal Encryption function
- * @param {Uint8Array} c1
- * @param {Uint8Array} c2
- * @param {Uint8Array} p
- * @param {Uint8Array} x
- * @returns {Uint8Array} unpadded message
- * @async
- */
-export async function decrypt(c1, c2, p, x) {
- const BigInteger = await util.getBigInteger();
- c1 = new BigInteger(c1);
- c2 = new BigInteger(c2);
- p = new BigInteger(p);
- x = new BigInteger(x);
+ /**
+ * ElGamal Encryption function
+ * @param {BN} c1
+ * @param {BN} c2
+ * @param {BN} p
+ * @param {BN} x
+ * @returns BN
+ * @async
+ */
+ decrypt: async function(c1, c2, p, x) {
+ const redp = new BN.red(p);
+ const c1red = c1.toRed(redp);
+ const c2red = c2.toRed(redp);
+ return c1red.redPow(x).redInvm().redMul(c2red).fromRed();
+ },
- const padded = c1.modExp(x, p).modInv(p).imul(c2).imod(p);
- return emeDecode(padded.toUint8Array('be', p.byteLength()));
-}
+ /**
+ * Validate ElGamal parameters
+ * @param {Uint8Array} p ElGamal prime
+ * @param {Uint8Array} g ElGamal group generator
+ * @param {Uint8Array} y ElGamal public key
+ * @param {Uint8Array} x ElGamal private exponent
+ * @returns {Promise} whether params are valid
+ * @async
+ */
+ validateParams: async function (p, g, y, x) {
+ p = new BN(p);
+ g = new BN(g);
+ y = new BN(y);
-/**
- * Validate ElGamal parameters
- * @param {Uint8Array} p ElGamal prime
- * @param {Uint8Array} g ElGamal group generator
- * @param {Uint8Array} y ElGamal public key
- * @param {Uint8Array} x ElGamal private exponent
- * @returns {Promise} whether params are valid
- * @async
- */
-export async function validateParams(p, g, y, x) {
- const BigInteger = await util.getBigInteger();
- p = new BigInteger(p);
- g = new BigInteger(g);
- y = new BigInteger(y);
+ const one = new BN(1);
+ // Check that 1 < g < p
+ if (g.lte(one) || g.gte(p)) {
+ return false;
+ }
- const one = new BigInteger(1);
- // Check that 1 < g < p
- if (g.lte(one) || g.gte(p)) {
- return false;
- }
+ // Expect p-1 to be large
+ const pSize = p.subn(1).bitLength();
+ if (pSize < 1023) {
+ return false;
+ }
- // Expect p-1 to be large
- const pSize = new BigInteger(p.bitLength());
- const n1023 = new BigInteger(1023);
- if (pSize.lt(n1023)) {
- return false;
- }
+ const pred = new BN.red(p);
+ const gModP = g.toRed(pred);
+ /**
+ * g should have order p-1
+ * Check that g ** (p-1) = 1 mod p
+ */
+ if (!gModP.redPow(p.subn(1)).eq(one)) {
+ return false;
+ }
- /**
- * g should have order p-1
- * Check that g ** (p-1) = 1 mod p
- */
- if (!g.modExp(p.dec(), p).isOne()) {
- return false;
- }
+ /**
+ * Since p-1 is not prime, g might have a smaller order that divides p-1
+ * We want to make sure that the order is large enough to hinder a small subgroup attack
+ *
+ * We just check g**i != 1 for all i up to a threshold
+ */
+ let res = g;
+ const i = new BN(1);
+ const threshold = new BN(2).shln(17); // we want order > threshold
+ while (i.lt(threshold)) {
+ res = res.mul(g).mod(p);
+ if (res.eqn(1)) {
+ return false;
+ }
+ i.iaddn(1);
+ }
- /**
- * Since p-1 is not prime, g might have a smaller order that divides p-1
- * We want to make sure that the order is large enough to hinder a small subgroup attack
- *
- * We just check g**i != 1 for all i up to a threshold
- */
- let res = g;
- const i = new BigInteger(1);
- const threshold = new BigInteger(2).leftShift(new BigInteger(17)); // we want order > threshold
- while (i.lt(threshold)) {
- res = res.mul(g).imod(p);
- if (res.isOne()) {
+ /**
+ * Re-derive public key y' = g ** x mod p
+ * Expect y == y'
+ *
+ * Blinded exponentiation computes g**{r(p-1) + x} to compare to y
+ */
+ x = new BN(x);
+ const r = await random.getRandomBN(new BN(2).shln(pSize - 1), new BN(2).shln(pSize)); // draw r of same size as p-1
+ const rqx = p.subn(1).mul(r).add(x);
+ if (!y.eq(gModP.redPow(rqx))) {
return false;
}
- i.iinc();
- }
- /**
- * Re-derive public key y' = g ** x mod p
- * Expect y == y'
- *
- * Blinded exponentiation computes g**{r(p-1) + x} to compare to y
- */
- x = new BigInteger(x);
- const two = new BigInteger(2);
- const r = await getRandomBigInteger(two.leftShift(pSize.dec()), two.leftShift(pSize)); // draw r of same size as p-1
- const rqx = p.dec().imul(r).iadd(x);
- if (!y.equal(g.modExp(rqx, p))) {
- return false;
+ return true;
}
-
- return true;
-}
+};
diff --git a/src/crypto/public_key/elliptic/curves.js b/src/crypto/public_key/elliptic/curves.js
index 7370f970..4ba6b617 100644
--- a/src/crypto/public_key/elliptic/curves.js
+++ b/src/crypto/public_key/elliptic/curves.js
@@ -17,6 +17,7 @@
/**
* @fileoverview Wrapper of an instance of an Elliptic Curve
+ * @requires bn.js
* @requires tweetnacl
* @requires crypto/public_key/elliptic/key
* @requires crypto/random
@@ -27,11 +28,11 @@
* @module crypto/public_key/elliptic/curve
*/
+import BN from 'bn.js';
import nacl from 'tweetnacl/nacl-fast-light.js';
-import { getRandomBytes } from '../../random';
+import random from '../../random';
import enums from '../../../enums';
import util from '../../../util';
-import { uint8ArrayToB64, b64ToUint8Array } from '../../../encoding/base64';
import OID from '../../../type/oid';
import { keyFromPublic, keyFromPrivate, getIndutnyCurve } from './indutnyKey';
@@ -136,91 +137,88 @@ const curves = {
}
};
-class Curve {
- constructor(oid_or_name, params) {
- try {
- if (util.isArray(oid_or_name) ||
- util.isUint8Array(oid_or_name)) {
- // by oid byte array
- oid_or_name = new OID(oid_or_name);
- }
- if (oid_or_name instanceof OID) {
- // by curve OID
- oid_or_name = oid_or_name.getName();
- }
- // by curve name or oid string
- this.name = enums.write(enums.curve, oid_or_name);
- } catch (err) {
- throw new Error('Not valid curve');
+/**
+ * @constructor
+ */
+function Curve(oid_or_name, params) {
+ try {
+ if (util.isArray(oid_or_name) ||
+ util.isUint8Array(oid_or_name)) {
+ // by oid byte array
+ oid_or_name = new OID(oid_or_name);
+ }
+ if (oid_or_name instanceof OID) {
+ // by curve OID
+ oid_or_name = oid_or_name.getName();
}
- params = params || curves[this.name];
+ // by curve name or oid string
+ this.name = enums.write(enums.curve, oid_or_name);
+ } catch (err) {
+ throw new Error('Not valid curve');
+ }
+ params = params || curves[this.name];
- this.keyType = params.keyType;
+ this.keyType = params.keyType;
- this.oid = params.oid;
- this.hash = params.hash;
- this.cipher = params.cipher;
- this.node = params.node && curves[this.name];
- this.web = params.web && curves[this.name];
- this.payloadSize = params.payloadSize;
- if (this.web && util.getWebCrypto()) {
- this.type = 'web';
- } else if (this.node && util.getNodeCrypto()) {
- this.type = 'node';
- } else if (this.name === 'curve25519') {
- this.type = 'curve25519';
- } else if (this.name === 'ed25519') {
- this.type = 'ed25519';
- }
+ this.oid = params.oid;
+ this.hash = params.hash;
+ this.cipher = params.cipher;
+ this.node = params.node && curves[this.name];
+ this.web = params.web && curves[this.name];
+ this.payloadSize = params.payloadSize;
+ if (this.web && util.getWebCrypto()) {
+ this.type = 'web';
+ } else if (this.node && util.getNodeCrypto()) {
+ this.type = 'node';
+ } else if (this.name === 'curve25519') {
+ this.type = 'curve25519';
+ } else if (this.name === 'ed25519') {
+ this.type = 'ed25519';
}
+}
- async genKeyPair() {
- let keyPair;
- switch (this.type) {
- case 'web':
- try {
- return await webGenKeyPair(this.name);
- } catch (err) {
- util.printDebugError("Browser did not support generating ec key " + err.message);
- break;
- }
- case 'node':
- return nodeGenKeyPair(this.name);
- case 'curve25519': {
- const privateKey = await getRandomBytes(32);
- privateKey[0] = (privateKey[0] & 127) | 64;
- privateKey[31] &= 248;
- const secretKey = privateKey.slice().reverse();
- keyPair = nacl.box.keyPair.fromSecretKey(secretKey);
- const publicKey = util.concatUint8Array([new Uint8Array([0x40]), keyPair.publicKey]);
- return { publicKey, privateKey };
- }
- case 'ed25519': {
- const privateKey = await getRandomBytes(32);
- const keyPair = nacl.sign.keyPair.fromSeed(privateKey);
- const publicKey = util.concatUint8Array([new Uint8Array([0x40]), keyPair.publicKey]);
- return { publicKey, privateKey };
+Curve.prototype.genKeyPair = async function () {
+ let keyPair;
+ switch (this.type) {
+ case 'web':
+ try {
+ return await webGenKeyPair(this.name);
+ } catch (err) {
+ util.print_debug_error("Browser did not support generating ec key " + err.message);
+ break;
}
+ case 'node':
+ return nodeGenKeyPair(this.name);
+ case 'curve25519': {
+ const privateKey = await random.getRandomBytes(32);
+ privateKey[0] = (privateKey[0] & 127) | 64;
+ privateKey[31] &= 248;
+ const secretKey = privateKey.slice().reverse();
+ keyPair = nacl.box.keyPair.fromSecretKey(secretKey);
+ const publicKey = util.concatUint8Array([new Uint8Array([0x40]), keyPair.publicKey]);
+ return { publicKey, privateKey };
+ }
+ case 'ed25519': {
+ const privateKey = await random.getRandomBytes(32);
+ const keyPair = nacl.sign.keyPair.fromSeed(privateKey);
+ const publicKey = util.concatUint8Array([new Uint8Array([0x40]), keyPair.publicKey]);
+ return { publicKey, privateKey };
}
- const indutnyCurve = await getIndutnyCurve(this.name);
- keyPair = await indutnyCurve.genKeyPair({
- entropy: util.uint8ArrayToStr(await getRandomBytes(32))
- });
- return { publicKey: new Uint8Array(keyPair.getPublic('array', false)), privateKey: keyPair.getPrivate().toArrayLike(Uint8Array) };
}
-}
+ const indutnyCurve = await getIndutnyCurve(this.name);
+ keyPair = await indutnyCurve.genKeyPair({
+ entropy: util.Uint8Array_to_str(await random.getRandomBytes(32))
+ });
+ return { publicKey: new Uint8Array(keyPair.getPublic('array', false)), privateKey: keyPair.getPrivate().toArrayLike(Uint8Array) };
+};
async function generate(curve) {
- const BigInteger = await util.getBigInteger();
-
curve = new Curve(curve);
const keyPair = await curve.genKeyPair();
- const Q = new BigInteger(keyPair.publicKey).toUint8Array();
- const secret = new BigInteger(keyPair.privateKey).toUint8Array('be', curve.payloadSize);
return {
oid: curve.oid,
- Q,
- secret,
+ Q: new BN(keyPair.publicKey),
+ d: new BN(keyPair.privateKey),
hash: curve.hash,
cipher: curve.cipher
};
@@ -284,6 +282,7 @@ async function validateStandardParams(algo, oid, Q, d) {
* Re-derive public point Q' = dG from private key
* Expect Q == Q'
*/
+ d = new BN(d);
const dG = keyFromPrivate(curve, d).getPublic();
if (!dG.eq(Q)) {
return false;
@@ -292,8 +291,10 @@ async function validateStandardParams(algo, oid, Q, d) {
return true;
}
+export default Curve;
+
export {
- Curve, curves, webCurves, nodeCurves, generate, getPreferredHashAlgo, jwkToRawPublic, rawPublicToJwk, privateToJwk, validateStandardParams
+ curves, webCurves, nodeCurves, generate, getPreferredHashAlgo, jwkToRawPublic, rawPublicToJwk, privateToJwk, validateStandardParams
};
//////////////////////////
@@ -312,7 +313,7 @@ async function webGenKeyPair(name) {
return {
publicKey: jwkToRawPublic(publicKey),
- privateKey: b64ToUint8Array(privateKey.d, true)
+ privateKey: util.b64_to_Uint8Array(privateKey.d, true)
};
}
@@ -338,8 +339,8 @@ async function nodeGenKeyPair(name) {
* @returns {Uint8Array} raw public key
*/
function jwkToRawPublic(jwk) {
- const bufX = b64ToUint8Array(jwk.x);
- const bufY = b64ToUint8Array(jwk.y);
+ const bufX = util.b64_to_Uint8Array(jwk.x);
+ const bufY = util.b64_to_Uint8Array(jwk.y);
const publicKey = new Uint8Array(bufX.length + bufY.length + 1);
publicKey[0] = 0x04;
publicKey.set(bufX, 1);
@@ -362,8 +363,8 @@ function rawPublicToJwk(payloadSize, name, publicKey) {
const jwk = {
kty: "EC",
crv: name,
- x: uint8ArrayToB64(bufX, true),
- y: uint8ArrayToB64(bufY, true),
+ x: util.Uint8Array_to_b64(bufX, true),
+ y: util.Uint8Array_to_b64(bufY, true),
ext: true
};
return jwk;
@@ -379,6 +380,6 @@ function rawPublicToJwk(payloadSize, name, publicKey) {
*/
function privateToJwk(payloadSize, name, publicKey, privateKey) {
const jwk = rawPublicToJwk(payloadSize, name, publicKey);
- jwk.d = uint8ArrayToB64(privateKey, true);
+ jwk.d = util.Uint8Array_to_b64(privateKey, true);
return jwk;
}
diff --git a/src/crypto/public_key/elliptic/ecdh.js b/src/crypto/public_key/elliptic/ecdh.js
index 04c97c18..9c9566c6 100644
--- a/src/crypto/public_key/elliptic/ecdh.js
+++ b/src/crypto/public_key/elliptic/ecdh.js
@@ -17,6 +17,7 @@
/**
* @fileoverview Key encryption and decryption for RFC 6637 ECDH
+ * @requires bn.js
* @requires tweetnacl
* @requires crypto/public_key/elliptic/curve
* @requires crypto/aes_kw
@@ -29,16 +30,15 @@
* @module crypto/public_key/elliptic/ecdh
*/
+import BN from 'bn.js';
import nacl from 'tweetnacl/nacl-fast-light.js';
-import { Curve, jwkToRawPublic, rawPublicToJwk, privateToJwk, validateStandardParams } from './curves';
-import * as aes_kw from '../../aes_kw';
-import * as cipher from '../../cipher';
-import { getRandomBytes } from '../../random';
+import Curve, { jwkToRawPublic, rawPublicToJwk, privateToJwk, validateStandardParams } from './curves';
+import aes_kw from '../../aes_kw';
+import cipher from '../../cipher';
+import random from '../../random';
import hash from '../../hash';
import enums from '../../../enums';
import util from '../../../util';
-import { b64ToUint8Array } from '../../../encoding/base64';
-import * as pkcs5 from '../../pkcs5';
import { keyFromPublic, keyFromPrivate, getIndutnyCurve } from './indutnyKey';
const webCrypto = util.getWebCrypto();
@@ -52,7 +52,7 @@ const nodeCrypto = util.getNodeCrypto();
* @returns {Promise} whether params are valid
* @async
*/
-export async function validateParams(oid, Q, d) {
+async function validateParams(oid, Q, d) {
return validateStandardParams(enums.publicKey.ecdh, oid, Q, d);
}
@@ -62,11 +62,36 @@ function buildEcdhParam(public_algo, oid, kdfParams, fingerprint) {
oid.write(),
new Uint8Array([public_algo]),
kdfParams.write(),
- util.strToUint8Array("Anonymous Sender "),
+ util.str_to_Uint8Array("Anonymous Sender "),
fingerprint.subarray(0, 20)
]);
}
+/**
+ * Parses MPI params and returns them as byte arrays of fixed length
+ * @param {Array} params key parameters
+ * @returns {Object} parameters in the form
+ * { oid, kdfParams, d: Uint8Array, Q: Uint8Array }
+ */
+function parseParams(params) {
+ if (params.length < 3 || params.length > 4) {
+ throw new Error('Unexpected number of parameters');
+ }
+
+ const oid = params[0];
+ const curve = new Curve(oid);
+ const parsedParams = { oid };
+ // The public point never has leading zeros, as it is prefixed by 0x40 or 0x04
+ parsedParams.Q = params[1].toUint8Array();
+ parsedParams.kdfParams = params[2];
+
+ if (params.length === 4) {
+ parsedParams.d = params[3].toUint8Array('be', curve.payloadSize);
+ }
+
+ return parsedParams;
+}
+
// Key Derivation Function (RFC 6637)
async function kdf(hash_algo, X, length, param, stripLeading = false, stripTrailing = false) {
// Note: X is little endian for Curve25519, big-endian for all others.
@@ -102,7 +127,7 @@ async function kdf(hash_algo, X, length, param, stripLeading = false, stripTrail
async function genPublicEphemeralKey(curve, Q) {
switch (curve.type) {
case 'curve25519': {
- const d = await getRandomBytes(32);
+ const d = await random.getRandomBytes(32);
const { secretKey, sharedKey } = await genPrivateEphemeralKey(curve, Q, null, d);
let { publicKey } = nacl.box.keyPair.fromSecretKey(secretKey);
publicKey = util.concatUint8Array([new Uint8Array([0x40]), publicKey]);
@@ -113,7 +138,7 @@ async function genPublicEphemeralKey(curve, Q) {
try {
return await webPublicEphemeralKey(curve, Q);
} catch (err) {
- util.printDebugError(err);
+ util.print_debug_error(err);
}
}
break;
@@ -128,21 +153,19 @@ async function genPublicEphemeralKey(curve, Q) {
*
* @param {module:type/oid} oid Elliptic curve object identifier
* @param {module:type/kdf_params} kdfParams KDF params including cipher and algorithm to use
- * @param {Uint8Array} data Unpadded session key data
+ * @param {module:type/mpi} m Value derived from session key (RFC 6637)
* @param {Uint8Array} Q Recipient public key
* @param {Uint8Array} fingerprint Recipient fingerprint
* @returns {Promise<{publicKey: Uint8Array, wrappedKey: Uint8Array}>}
* @async
*/
-export async function encrypt(oid, kdfParams, data, Q, fingerprint) {
- const m = pkcs5.encode(data);
-
+async function encrypt(oid, kdfParams, m, Q, fingerprint) {
const curve = new Curve(oid);
const { publicKey, sharedKey } = await genPublicEphemeralKey(curve, Q);
const param = buildEcdhParam(enums.publicKey.ecdh, oid, kdfParams, fingerprint);
const cipher_algo = enums.read(enums.symmetric, kdfParams.cipher);
const Z = await kdf(kdfParams.hash, sharedKey, cipher[cipher_algo].keySize, param);
- const wrappedKey = aes_kw.wrap(Z, m);
+ const wrappedKey = aes_kw.wrap(Z, m.toString());
return { publicKey, wrappedKey };
}
@@ -173,7 +196,7 @@ async function genPrivateEphemeralKey(curve, V, Q, d) {
try {
return await webPrivateEphemeralKey(curve, V, Q, d);
} catch (err) {
- util.printDebugError(err);
+ util.print_debug_error(err);
}
}
break;
@@ -193,10 +216,10 @@ async function genPrivateEphemeralKey(curve, V, Q, d) {
* @param {Uint8Array} Q Recipient public key
* @param {Uint8Array} d Recipient private key
* @param {Uint8Array} fingerprint Recipient fingerprint
- * @returns {Promise} Value derived from session key
+ * @returns {Promise} Value derived from session key
* @async
*/
-export async function decrypt(oid, kdfParams, V, C, Q, d, fingerprint) {
+async function decrypt(oid, kdfParams, V, C, Q, d, fingerprint) {
const curve = new Curve(oid);
const { sharedKey } = await genPrivateEphemeralKey(curve, V, Q, d);
const param = buildEcdhParam(enums.publicKey.ecdh, oid, kdfParams, fingerprint);
@@ -206,7 +229,7 @@ export async function decrypt(oid, kdfParams, V, C, Q, d, fingerprint) {
try {
// Work around old go crypto bug and old OpenPGP.js bug, respectively.
const Z = await kdf(kdfParams.hash, sharedKey, cipher[cipher_algo].keySize, param, i === 1, i === 2);
- return pkcs5.decode(aes_kw.unwrap(Z, C));
+ return new BN(aes_kw.unwrap(Z, C));
} catch (e) {
err = e;
}
@@ -263,7 +286,7 @@ async function webPrivateEphemeralKey(curve, V, Q, d) {
);
[S, secret] = await Promise.all([S, secret]);
const sharedKey = new Uint8Array(S);
- const secretKey = b64ToUint8Array(secret.d, true);
+ const secretKey = util.b64_to_Uint8Array(secret.d, true);
return { secretKey, sharedKey };
}
@@ -387,3 +410,5 @@ async function nodePublicEphemeralKey(curve, Q) {
const publicKey = new Uint8Array(sender.getPublicKey());
return { publicKey, sharedKey };
}
+
+export default { encrypt, decrypt, genPublicEphemeralKey, genPrivateEphemeralKey, buildEcdhParam, kdf, webPublicEphemeralKey, webPrivateEphemeralKey, ellipticPublicEphemeralKey, ellipticPrivateEphemeralKey, nodePublicEphemeralKey, nodePrivateEphemeralKey, validateParams, parseParams };
diff --git a/src/crypto/public_key/elliptic/ecdsa.js b/src/crypto/public_key/elliptic/ecdsa.js
index 6dacca49..40ecbf1e 100644
--- a/src/crypto/public_key/elliptic/ecdsa.js
+++ b/src/crypto/public_key/elliptic/ecdsa.js
@@ -17,6 +17,7 @@
/**
* @fileoverview Implementation of ECDSA following RFC6637 for Openpgpjs
+ * @requires bn.js
* @requires web-stream-tools
* @requires enums
* @requires util
@@ -24,11 +25,12 @@
* @module crypto/public_key/elliptic/ecdsa
*/
+import BN from 'bn.js';
import enums from '../../../enums';
import util from '../../../util';
-import { getRandomBytes } from '../../random';
+import random from '../../random';
import hash from '../../hash';
-import { Curve, webCurves, privateToJwk, rawPublicToJwk, validateStandardParams } from './curves';
+import Curve, { webCurves, privateToJwk, rawPublicToJwk, validateStandardParams } from './curves';
import { getIndutnyCurve, keyFromPrivate, keyFromPublic } from './indutnyKey';
const webCrypto = util.getWebCrypto();
@@ -46,7 +48,7 @@ const nodeCrypto = util.getNodeCrypto();
* s: Uint8Array}} Signature of the message
* @async
*/
-export async function sign(oid, hash_algo, message, publicKey, privateKey, hashed) {
+async function sign(oid, hash_algo, message, publicKey, privateKey, hashed) {
const curve = new Curve(oid);
if (message && !util.isStream(message)) {
const keyPair = { publicKey, privateKey };
@@ -63,7 +65,7 @@ export async function sign(oid, hash_algo, message, publicKey, privateKey, hashe
if (curve.name !== 'p521' && (err.name === 'DataError' || err.name === 'OperationError')) {
throw err;
}
- util.printDebugError("Browser did not support signing: " + err.message);
+ util.print_debug_error("Browser did not support verifying: " + err.message);
}
break;
}
@@ -91,7 +93,7 @@ export async function sign(oid, hash_algo, message, publicKey, privateKey, hashe
* @returns {Boolean}
* @async
*/
-export async function verify(oid, hash_algo, signature, message, publicKey, hashed) {
+async function verify(oid, hash_algo, signature, message, publicKey, hashed) {
const curve = new Curve(oid);
if (message && !util.isStream(message)) {
switch (curve.type) {
@@ -101,12 +103,12 @@ export async function verify(oid, hash_algo, signature, message, publicKey, hash
return await webVerify(curve, hash_algo, signature, message, publicKey);
} catch (err) {
// We do not fallback if the error is related to key integrity
- // Unfortunately Safari does not support p521 and throws a DataError when using it
+ // Unfortunaley Safari does not support p521 and throws a DataError when using it
// So we need to always fallback for that curve
if (curve.name !== 'p521' && (err.name === 'DataError' || err.name === 'OperationError')) {
throw err;
}
- util.printDebugError("Browser did not support verifying: " + err.message);
+ util.print_debug_error("Browser did not support verifying: " + err.message);
}
break;
case 'node':
@@ -125,7 +127,7 @@ export async function verify(oid, hash_algo, signature, message, publicKey, hash
* @returns {Promise} whether params are valid
* @async
*/
-export async function validateParams(oid, Q, d) {
+async function validateParams(oid, Q, d) {
const curve = new Curve(oid);
// Reject curves x25519 and ed25519
if (curve.keyType !== enums.publicKey.ecdsa) {
@@ -137,7 +139,7 @@ export async function validateParams(oid, Q, d) {
switch (curve.type) {
case 'web':
case 'node': {
- const message = await getRandomBytes(8);
+ const message = await random.getRandomBytes(8);
const hashAlgo = enums.hash.sha256;
const hashed = await hash.digest(hashAlgo, message);
try {
@@ -152,6 +154,32 @@ export async function validateParams(oid, Q, d) {
}
}
+/**
+ * Parses MPI params and returns them as byte arrays of fixed length
+ * @param {Array} params key parameters
+ * @returns {Object} parameters in the form
+ * { oid, d: Uint8Array, Q: Uint8Array }
+ */
+function parseParams(params) {
+ if (params.length < 2 || params.length > 3) {
+ throw new Error('Unexpected number of parameters');
+ }
+
+ const oid = params[0];
+ const curve = new Curve(oid);
+ const parsedParams = { oid };
+ // The public point never has leading zeros, as it is prefixed by 0x40 or 0x04
+ parsedParams.Q = params[1].toUint8Array();
+ if (params.length === 3) {
+ parsedParams.d = params[2].toUint8Array('be', curve.payloadSize);
+ }
+
+ return parsedParams;
+}
+
+
+export default { sign, verify, ellipticVerify, ellipticSign, validateParams, parseParams };
+
//////////////////////////
// //
@@ -207,6 +235,7 @@ async function webSign(curve, hash_algo, message, keyPair) {
}
async function webVerify(curve, hash_algo, { r, s }, message, publicKey) {
+ const len = curve.payloadSize;
const jwk = rawPublicToJwk(curve.payloadSize, webCurves[curve.name], publicKey);
const key = await webCrypto.importKey(
"jwk",
@@ -220,7 +249,10 @@ async function webVerify(curve, hash_algo, { r, s }, message, publicKey) {
["verify"]
);
- const signature = util.concatUint8Array([r, s]).buffer;
+ const signature = util.concatUint8Array([
+ new Uint8Array(len - r.length), r,
+ new Uint8Array(len - s.length), s
+ ]).buffer;
return webCrypto.verify(
{
@@ -251,8 +283,6 @@ async function nodeSign(curve, hash_algo, message, keyPair) {
}
async function nodeVerify(curve, hash_algo, { r, s }, message, publicKey) {
- const { default: BN } = await import('bn.js');
-
const verify = nodeCrypto.createVerify(enums.read(enums.hash, hash_algo));
verify.write(message);
verify.end();
diff --git a/src/crypto/public_key/elliptic/eddsa.js b/src/crypto/public_key/elliptic/eddsa.js
index f3845228..7dc158ec 100644
--- a/src/crypto/public_key/elliptic/eddsa.js
+++ b/src/crypto/public_key/elliptic/eddsa.js
@@ -38,17 +38,17 @@ nacl.hash = bytes => new Uint8Array(sha512().update(bytes).digest());
* @param {Uint8Array} publicKey Public key
* @param {Uint8Array} privateKey Private key used to sign the message
* @param {Uint8Array} hashed The hashed message
- * @returns {{r: Uint8Array,
- * s: Uint8Array}} Signature of the message
+ * @returns {{R: Uint8Array,
+ * S: Uint8Array}} Signature of the message
* @async
*/
-export async function sign(oid, hash_algo, message, publicKey, privateKey, hashed) {
+async function sign(oid, hash_algo, message, publicKey, privateKey, hashed) {
const secretKey = util.concatUint8Array([privateKey, publicKey.subarray(1)]);
const signature = nacl.sign.detached(hashed, secretKey);
// EdDSA signature params are returned in little-endian format
return {
- r: signature.subarray(0, 32),
- s: signature.subarray(32)
+ R: signature.subarray(0, 32),
+ S: signature.subarray(32)
};
}
@@ -56,18 +56,19 @@ export async function sign(oid, hash_algo, message, publicKey, privateKey, hashe
* Verifies if a signature is valid for a message
* @param {module:type/oid} oid Elliptic curve object identifier
* @param {module:enums.hash} hash_algo Hash algorithm used in the signature
- * @param {{r: Uint8Array,
- s: Uint8Array}} signature Signature to verify the message
+ * @param {{R: Uint8Array,
+ S: Uint8Array}} signature Signature to verify the message
* @param {Uint8Array} m Message to verify
* @param {Uint8Array} publicKey Public key used to verify the message
* @param {Uint8Array} hashed The hashed message
* @returns {Boolean}
* @async
*/
-export async function verify(oid, hash_algo, { r, s }, m, publicKey, hashed) {
- const signature = util.concatUint8Array([r, s]);
+async function verify(oid, hash_algo, { R, S }, m, publicKey, hashed) {
+ const signature = util.concatUint8Array([R, S]);
return nacl.sign.detached.verify(hashed, signature, publicKey.subarray(1));
}
+
/**
* Validate EdDSA parameters
* @param {module:type/oid} oid Elliptic curve object identifier
@@ -76,7 +77,7 @@ export async function verify(oid, hash_algo, { r, s }, m, publicKey, hashed) {
* @returns {Promise} whether params are valid
* @async
*/
-export async function validateParams(oid, Q, k) {
+async function validateParams(oid, Q, k) {
// Check whether the given curve is supported
if (oid.getName() !== 'ed25519') {
return false;
@@ -90,3 +91,29 @@ export async function validateParams(oid, Q, k) {
const dG = new Uint8Array([0x40, ...publicKey]); // Add public key prefix
return util.equalsUint8Array(Q, dG);
}
+
+/**
+ * Parses MPI params and returns them as byte arrays of fixed length
+ * @param {Array} params key parameters
+ * @returns {Object} parameters in the form
+ * { oid, seed: Uint8Array, Q: Uint8Array }
+ */
+function parseParams(params) {
+ if (params.length < 2 || params.length > 3) {
+ throw new Error('Unexpected number of parameters');
+ }
+
+ const parsedParams = {
+ oid: params[0],
+ Q: params[1].toUint8Array('be', 33)
+ };
+
+ if (params.length === 3) {
+ parsedParams.seed = params[2].toUint8Array('be', 32);
+ }
+
+ return parsedParams;
+}
+
+
+export default { sign, verify, validateParams, parseParams };
diff --git a/src/crypto/public_key/elliptic/index.js b/src/crypto/public_key/elliptic/index.js
index 4fac26fd..aa271fff 100644
--- a/src/crypto/public_key/elliptic/index.js
+++ b/src/crypto/public_key/elliptic/index.js
@@ -24,11 +24,11 @@
* @module crypto/public_key/elliptic
*/
-import { Curve, generate, getPreferredHashAlgo } from './curves';
-import * as ecdsa from './ecdsa';
-import * as eddsa from './eddsa';
-import * as ecdh from './ecdh';
+import Curve, { generate, getPreferredHashAlgo } from './curves';
+import ecdsa from './ecdsa';
+import eddsa from './eddsa';
+import ecdh from './ecdh';
-export {
+export default {
Curve, ecdh, ecdsa, eddsa, generate, getPreferredHashAlgo
};
diff --git a/src/crypto/public_key/elliptic/indutnyKey.js b/src/crypto/public_key/elliptic/indutnyKey.js
index c1022524..de947cb8 100644
--- a/src/crypto/public_key/elliptic/indutnyKey.js
+++ b/src/crypto/public_key/elliptic/indutnyKey.js
@@ -22,7 +22,9 @@
* @module crypto/public_key/elliptic/indutnyKey
*/
+import { loadScript, dl } from '../../../lightweight_helper';
import config from '../../../config';
+import util from '../../../util';
export function keyFromPrivate(indutnyCurve, priv) {
const keyPair = indutnyCurve.keyPair({ priv: priv });
@@ -37,10 +39,47 @@ export function keyFromPublic(indutnyCurve, pub) {
return keyPair;
}
+/**
+ * Load elliptic on demand to global.openpgp.elliptic
+ * @returns {Promise}
+ */
+async function loadEllipticPromise() {
+ const path = config.indutny_elliptic_path;
+ const options = config.indutny_elliptic_fetch_options;
+ const ellipticDlPromise = dl(path, options).catch(() => dl(path, options));
+ const ellipticContents = await ellipticDlPromise;
+ const mainUrl = URL.createObjectURL(new Blob([ellipticContents], { type: 'text/javascript' }));
+ await loadScript(mainUrl);
+ URL.revokeObjectURL(mainUrl);
+ if (!global.openpgp.elliptic) {
+ throw new Error('Elliptic library failed to load correctly');
+ }
+ return global.openpgp.elliptic;
+}
+
+let ellipticPromise;
+
+function loadElliptic() {
+ if (!config.external_indutny_elliptic) {
+ return require('elliptic');
+ }
+ if (util.detectNode()) {
+ // eslint-disable-next-line
+ return require(config.indutny_elliptic_path);
+ }
+ if (!ellipticPromise) {
+ ellipticPromise = loadEllipticPromise().catch(e => {
+ ellipticPromise = undefined;
+ throw e;
+ });
+ }
+ return ellipticPromise;
+}
+
export async function getIndutnyCurve(name) {
- if (!config.useIndutnyElliptic) {
+ if (!config.use_indutny_elliptic) {
throw new Error('This curve is only supported in the full build of OpenPGP.js');
}
- const { default: elliptic } = await import('elliptic');
+ const elliptic = await loadElliptic();
return new elliptic.ec(name);
}
diff --git a/src/crypto/public_key/index.js b/src/crypto/public_key/index.js
index e9a81025..4e2edbcf 100644
--- a/src/crypto/public_key/index.js
+++ b/src/crypto/public_key/index.js
@@ -9,10 +9,10 @@
*/
import nacl from 'tweetnacl/nacl-fast-light.js';
-import * as rsa from './rsa';
-import * as elgamal from './elgamal';
-import * as elliptic from './elliptic';
-import * as dsa from './dsa';
+import rsa from './rsa';
+import elgamal from './elgamal';
+import elliptic from './elliptic';
+import dsa from './dsa';
export default {
/** @see module:crypto/public_key/rsa */
diff --git a/src/crypto/public_key/prime.js b/src/crypto/public_key/prime.js
index d2f39a4a..1e657236 100644
--- a/src/crypto/public_key/prime.js
+++ b/src/crypto/public_key/prime.js
@@ -17,26 +17,29 @@
/**
* @fileoverview Algorithms for probabilistic random prime generation
+ * @requires bn.js
* @requires crypto/random
* @module crypto/public_key/prime
*/
-import util from '../../util';
-import { getRandomBigInteger } from '../random';
+import BN from 'bn.js';
+import random from '../random';
+
+export default {
+ randomProbablePrime, isProbablePrime, fermat, millerRabin, divisionTest
+};
/**
* Probabilistic random number generator
* @param {Integer} bits Bit length of the prime
- * @param {BigInteger} e Optional RSA exponent to check against the prime
+ * @param {BN} e Optional RSA exponent to check against the prime
* @param {Integer} k Optional number of iterations of Miller-Rabin test
- * @returns BigInteger
+ * @returns BN
* @async
*/
-export async function randomProbablePrime(bits, e, k) {
- const BigInteger = await util.getBigInteger();
- const one = new BigInteger(1);
- const min = one.leftShift(new BigInteger(bits - 1));
- const thirty = new BigInteger(30);
+async function randomProbablePrime(bits, e, k) {
+ const min = new BN(1).shln(bits - 1);
+ const thirty = new BN(30);
/*
* We can avoid any multiples of 3 and 5 by looking at n mod 30
* n mod 30 = 0 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29
@@ -45,15 +48,15 @@ export async function randomProbablePrime(bits, e, k) {
*/
const adds = [1, 6, 5, 4, 3, 2, 1, 4, 3, 2, 1, 2, 1, 4, 3, 2, 1, 2, 1, 4, 3, 2, 1, 6, 5, 4, 3, 2, 1, 2];
- const n = await getRandomBigInteger(min, min.leftShift(one));
+ let n = await random.getRandomBN(min, min.shln(1));
let i = n.mod(thirty).toNumber();
do {
- n.iadd(new BigInteger(adds[i]));
+ n.iaddn(adds[i]);
i = (i + adds[i]) % adds.length;
// If reached the maximum, go back to the minimum.
if (n.bitLength() > bits) {
- n.imod(min.leftShift(one)).iadd(min);
+ n = n.mod(min.shln(1)).iadd(min);
i = n.mod(thirty).toNumber();
}
} while (!await isProbablePrime(n, e, k));
@@ -62,20 +65,20 @@ export async function randomProbablePrime(bits, e, k) {
/**
* Probabilistic primality testing
- * @param {BigInteger} n Number to test
- * @param {BigInteger} e Optional RSA exponent to check against the prime
- * @param {Integer} k Optional number of iterations of Miller-Rabin test
+ * @param {BN} n Number to test
+ * @param {BN} e Optional RSA exponent to check against the prime
+ * @param {Integer} k Optional number of iterations of Miller-Rabin test
* @returns {boolean}
* @async
*/
-export async function isProbablePrime(n, e, k) {
- if (e && !n.dec().gcd(e).isOne()) {
+async function isProbablePrime(n, e, k) {
+ if (e && !n.subn(1).gcd(e).eqn(1)) {
return false;
}
- if (!await divisionTest(n)) {
+ if (!divisionTest(n)) {
return false;
}
- if (!await fermat(n)) {
+ if (!fermat(n)) {
return false;
}
if (!await millerRabin(n, k)) {
@@ -88,26 +91,24 @@ export async function isProbablePrime(n, e, k) {
/**
* Tests whether n is probably prime or not using Fermat's test with b = 2.
- * Fails if b^(n-1) mod n != 1.
- * @param {BigInteger} n Number to test
- * @param {BigInteger} b Optional Fermat test base
+ * Fails if b^(n-1) mod n === 1.
+ * @param {BN} n Number to test
+ * @param {Integer} b Optional Fermat test base
* @returns {boolean}
*/
-export async function fermat(n, b) {
- const BigInteger = await util.getBigInteger();
- b = b || new BigInteger(2);
- return b.modExp(n.dec(), n).isOne();
+function fermat(n, b) {
+ b = b || new BN(2);
+ return b.toRed(BN.mont(n)).redPow(n.subn(1)).fromRed().cmpn(1) === 0;
}
-export async function divisionTest(n) {
- const BigInteger = await util.getBigInteger();
- return smallPrimes.every(m => {
- return n.mod(new BigInteger(m)) !== 0;
+function divisionTest(n) {
+ return small_primes.every(m => {
+ return n.modn(m) !== 0;
});
}
// https://github.com/gpg/libgcrypt/blob/master/cipher/primegen.c
-const smallPrimes = [
+const small_primes = [
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,
@@ -222,43 +223,45 @@ const smallPrimes = [
/**
* Tests whether n is probably prime or not using the Miller-Rabin test.
* See HAC Remark 4.28.
- * @param {BigInteger} n Number to test
- * @param {Integer} k Optional number of iterations of Miller-Rabin test
- * @param {Function} rand Optional function to generate potential witnesses
+ * @param {BN} n Number to test
+ * @param {Integer} k Optional number of iterations of Miller-Rabin test
+ * @param {Function} rand Optional function to generate potential witnesses
* @returns {boolean}
* @async
*/
-export async function millerRabin(n, k, rand) {
- const BigInteger = await util.getBigInteger();
+async function millerRabin(n, k, rand) {
const len = n.bitLength();
+ const red = BN.mont(n);
+ const rone = new BN(1).toRed(red);
if (!k) {
k = Math.max(1, (len / 48) | 0);
}
- const n1 = n.dec(); // n - 1
+ const n1 = n.subn(1);
+ const rn1 = n1.toRed(red);
// Find d and s, (n - 1) = (2 ^ s) * d;
let s = 0;
- while (!n1.getBit(s)) { s++; }
- const d = n.rightShift(new BigInteger(s));
+ while (!n1.testn(s)) { s++; }
+ const d = n.shrn(s);
for (; k > 0; k--) {
- const a = rand ? rand() : await getRandomBigInteger(new BigInteger(2), n1);
+ const a = rand ? rand() : await random.getRandomBN(new BN(2), n1);
- let x = a.modExp(d, n);
- if (x.isOne() || x.equal(n1)) {
+ let x = a.toRed(red).redPow(d);
+ if (x.eq(rone) || x.eq(rn1)) {
continue;
}
let i;
for (i = 1; i < s; i++) {
- x = x.mul(x).mod(n);
+ x = x.redSqr();
- if (x.isOne()) {
+ if (x.eq(rone)) {
return false;
}
- if (x.equal(n1)) {
+ if (x.eq(rn1)) {
break;
}
}
diff --git a/src/crypto/public_key/rsa.js b/src/crypto/public_key/rsa.js
index 9bb7e2f2..7d8ea6b1 100644
--- a/src/crypto/public_key/rsa.js
+++ b/src/crypto/public_key/rsa.js
@@ -17,6 +17,7 @@
/**
* @fileoverview RSA implementation
+ * @requires bn.js
* @requires crypto/public_key/prime
* @requires crypto/random
* @requires config
@@ -24,13 +25,14 @@
* @module crypto/public_key/rsa
*/
-import { randomProbablePrime } from './prime';
-import { getRandomBigInteger } from '../random';
+import BN from 'bn.js';
+import prime from './prime';
+import random from '../random';
import config from '../../config';
import util from '../../util';
-import { uint8ArrayToB64, b64ToUint8Array } from '../../encoding/base64';
-import { emsaEncode, emeEncode, emeDecode } from '../pkcs1';
+import pkcs1 from '../pkcs1';
import enums from '../../enums';
+import type_mpi from '../../type/mpi';
const webCrypto = util.getWebCrypto();
const nodeCrypto = util.getNodeCrypto();
@@ -74,480 +76,480 @@ const RSAPublicKey = util.detectNode() ? asn1.define('RSAPubliceKey', function (
}) : undefined;
/* eslint-enable no-invalid-this */
-/** Create signature
- * @param {module:enums.hash} hash_algo Hash algorithm
- * @param {Uint8Array} data message
- * @param {Uint8Array} n RSA public modulus
- * @param {Uint8Array} e RSA public exponent
- * @param {Uint8Array} d RSA private exponent
- * @param {Uint8Array} p RSA private prime p
- * @param {Uint8Array} q RSA private prime q
- * @param {Uint8Array} u RSA private coefficient
- * @param {Uint8Array} hashed hashed message
- * @returns {Uint8Array} RSA Signature
- * @async
- */
-export async function sign(hash_algo, data, n, e, d, p, q, u, hashed) {
- if (data && !util.isStream(data)) {
- if (util.getWebCrypto()) {
- try {
- return await webSign(enums.read(enums.webHash, hash_algo), data, n, e, d, p, q, u);
- } catch (err) {
- util.printDebugError(err);
+export default {
+ /** Create signature
+ * @param {module:enums.hash} hash_algo Hash algorithm
+ * @param {Uint8Array} data message
+ * @param {Uint8Array} n RSA public modulus
+ * @param {Uint8Array} e RSA public exponent
+ * @param {Uint8Array} d RSA private exponent
+ * @param {Uint8Array} p RSA private prime p
+ * @param {Uint8Array} q RSA private prime q
+ * @param {Uint8Array} u RSA private coefficient
+ * @param {Uint8Array} hashed hashed message
+ * @returns {Uint8Array} RSA Signature
+ * @async
+ */
+ sign: async function(hash_algo, data, n, e, d, p, q, u, hashed) {
+ if (data && !util.isStream(data)) {
+ if (util.getWebCrypto()) {
+ try {
+ return await this.webSign(enums.read(enums.webHash, hash_algo), data, n, e, d, p, q, u);
+ } catch (err) {
+ util.print_debug_error(err);
+ }
+ } else if (util.getNodeCrypto()) {
+ return this.nodeSign(hash_algo, data, n, e, d, p, q, u);
}
- } else if (util.getNodeCrypto()) {
- return nodeSign(hash_algo, data, n, e, d, p, q, u);
}
- }
- return bnSign(hash_algo, n, d, hashed);
-}
+ return this.bnSign(hash_algo, n, d, hashed);
+ },
-/**
- * Verify signature
- * @param {module:enums.hash} hash_algo Hash algorithm
- * @param {Uint8Array} data message
- * @param {Uint8Array} s signature
- * @param {Uint8Array} n RSA public modulus
- * @param {Uint8Array} e RSA public exponent
- * @param {Uint8Array} hashed hashed message
- * @returns {Boolean}
- * @async
- */
-export async function verify(hash_algo, data, s, n, e, hashed) {
- if (data && !util.isStream(data)) {
- if (util.getWebCrypto()) {
- try {
- return await webVerify(enums.read(enums.webHash, hash_algo), data, s, n, e);
- } catch (err) {
- util.printDebugError(err);
+ /**
+ * Verify signature
+ * @param {module:enums.hash} hash_algo Hash algorithm
+ * @param {Uint8Array} data message
+ * @param {Uint8Array} s signature
+ * @param {Uint8Array} n RSA public modulus
+ * @param {Uint8Array} e RSA public exponent
+ * @param {Uint8Array} hashed hashed message
+ * @returns {Boolean}
+ * @async
+ */
+ verify: async function(hash_algo, data, s, n, e, hashed) {
+ if (data && !util.isStream(data)) {
+ if (util.getWebCrypto()) {
+ try {
+ return await this.webVerify(enums.read(enums.webHash, hash_algo), data, s, n, e);
+ } catch (err) {
+ util.print_debug_error(err);
+ }
+ } else if (util.getNodeCrypto()) {
+ return this.nodeVerify(hash_algo, data, s, n, e);
}
- } else if (util.getNodeCrypto()) {
- return nodeVerify(hash_algo, data, s, n, e);
}
- }
- return bnVerify(hash_algo, s, n, e, hashed);
-}
-
-/**
- * Encrypt message
- * @param {Uint8Array} data message
- * @param {Uint8Array} n RSA public modulus
- * @param {Uint8Array} e RSA public exponent
- * @returns {Uint8Array} RSA Ciphertext
- * @async
- */
-export async function encrypt(data, n, e) {
- if (util.getNodeCrypto()) {
- return nodeEncrypt(data, n, e);
- }
- return bnEncrypt(data, n, e);
-}
+ return this.bnVerify(hash_algo, s, n, e, hashed);
+ },
-/**
- * Decrypt RSA message
- * @param {Uint8Array} m message
- * @param {Uint8Array} n RSA public modulus
- * @param {Uint8Array} e RSA public exponent
- * @param {Uint8Array} d RSA private exponent
- * @param {Uint8Array} p RSA private prime p
- * @param {Uint8Array} q RSA private prime q
- * @param {Uint8Array} u RSA private coefficient
- * @returns {String} RSA Plaintext
- * @async
- */
-export async function decrypt(data, n, e, d, p, q, u) {
- if (util.getNodeCrypto()) {
- return nodeDecrypt(data, n, e, d, p, q, u);
- }
- return bnDecrypt(data, n, e, d, p, q, u);
-}
-
-/**
- * Generate a new random private key B bits long with public exponent E.
- *
- * When possible, webCrypto or nodeCrypto is used. Otherwise, primes are generated using
- * 40 rounds of the Miller-Rabin probabilistic random prime generation algorithm.
- * @see module:crypto/public_key/prime
- * @param {Integer} bits RSA bit length
- * @param {Integer} e RSA public exponent
- * @returns {{n, e, d,
- * p, q ,u: Uint8Array}} RSA public modulus, RSA public exponent, RSA private exponent,
- * RSA private prime p, RSA private prime q, u = p ** -1 mod q
- * @async
- */
-export async function generate(bits, e) {
- const BigInteger = await util.getBigInteger();
-
- e = new BigInteger(e);
-
- // Native RSA keygen using Web Crypto
- if (util.getWebCrypto()) {
- let keyPair;
- let keyGenOpt;
- if ((globalThis.crypto && globalThis.crypto.subtle) || globalThis.msCrypto) {
- // current standard spec
- keyGenOpt = {
- name: 'RSASSA-PKCS1-v1_5',
- modulusLength: bits, // the specified keysize in bits
- publicExponent: e.toUint8Array(), // take three bytes (max 65537) for exponent
- hash: {
- name: 'SHA-1' // not required for actual RSA keys, but for crypto api 'sign' and 'verify'
- }
- };
- keyPair = webCrypto.generateKey(keyGenOpt, true, ['sign', 'verify']);
- keyPair = await promisifyIE11Op(keyPair, 'Error generating RSA key pair.');
- } else if (globalThis.crypto && globalThis.crypto.webkitSubtle) {
- // outdated spec implemented by old Webkit
- keyGenOpt = {
- name: 'RSA-OAEP',
- modulusLength: bits, // the specified keysize in bits
- publicExponent: e.toUint8Array(), // take three bytes (max 65537) for exponent
- hash: {
- name: 'SHA-1' // not required for actual RSA keys, but for crypto api 'sign' and 'verify'
- }
- };
- keyPair = await webCrypto.generateKey(keyGenOpt, true, ['encrypt', 'decrypt']);
- } else {
- throw new Error('Unknown WebCrypto implementation');
+ /**
+ * Encrypt message
+ * @param {Uint8Array} data message
+ * @param {Uint8Array} n RSA public modulus
+ * @param {Uint8Array} e RSA public exponent
+ * @returns {Uint8Array} RSA Ciphertext
+ * @async
+ */
+ encrypt: async function(data, n, e) {
+ if (util.getNodeCrypto()) {
+ return this.nodeEncrypt(data, n, e);
}
+ return this.bnEncrypt(data, n, e);
+ },
- // export the generated keys as JsonWebKey (JWK)
- // https://tools.ietf.org/html/draft-ietf-jose-json-web-key-33
- let jwk = webCrypto.exportKey('jwk', keyPair.privateKey);
- jwk = await promisifyIE11Op(jwk, 'Error exporting RSA key pair.');
-
- // parse raw ArrayBuffer bytes to jwk/json (WebKit/Safari/IE11 quirk)
- if (jwk instanceof ArrayBuffer) {
- jwk = JSON.parse(String.fromCharCode.apply(null, new Uint8Array(jwk)));
+ /**
+ * Decrypt RSA message
+ * @param {Uint8Array} m message
+ * @param {Uint8Array} n RSA public modulus
+ * @param {Uint8Array} e RSA public exponent
+ * @param {Uint8Array} d RSA private exponent
+ * @param {Uint8Array} p RSA private prime p
+ * @param {Uint8Array} q RSA private prime q
+ * @param {Uint8Array} u RSA private coefficient
+ * @returns {String} RSA Plaintext
+ * @async
+ */
+ decrypt: async function(data, n, e, d, p, q, u) {
+ if (util.getNodeCrypto()) {
+ return this.nodeDecrypt(data, n, e, d, p, q, u);
}
- // map JWK parameters to corresponding OpenPGP names
- return {
- n: b64ToUint8Array(jwk.n),
- e: e.toUint8Array(),
- d: b64ToUint8Array(jwk.d),
- // switch p and q
- p: b64ToUint8Array(jwk.q),
- q: b64ToUint8Array(jwk.p),
- // Since p and q are switched in places, u is the inverse of jwk.q
- u: b64ToUint8Array(jwk.qi)
- };
- } else if (util.getNodeCrypto() && nodeCrypto.generateKeyPair && RSAPrivateKey) {
- const opts = {
- modulusLength: bits,
- publicExponent: e.toNumber(),
- publicKeyEncoding: { type: 'pkcs1', format: 'der' },
- privateKeyEncoding: { type: 'pkcs1', format: 'der' }
- };
- const prv = await new Promise((resolve, reject) => nodeCrypto.generateKeyPair('rsa', opts, (err, _, der) => {
- if (err) {
- reject(err);
- } else {
- resolve(RSAPrivateKey.decode(der, 'der'));
- }
- }));
- /**
- * OpenPGP spec differs from DER spec, DER: `u = (inverse of q) mod p`, OpenPGP: `u = (inverse of p) mod q`.
- * @link https://tools.ietf.org/html/rfc3447#section-3.2
- * @link https://tools.ietf.org/html/draft-ietf-openpgp-rfc4880bis-08#section-5.6.1
- */
- return {
- n: prv.modulus.toArrayLike(Uint8Array),
- e: prv.publicExponent.toArrayLike(Uint8Array),
- d: prv.privateExponent.toArrayLike(Uint8Array),
- // switch p and q
- p: prv.prime2.toArrayLike(Uint8Array),
- q: prv.prime1.toArrayLike(Uint8Array),
- // Since p and q are switched in places, we can keep u as defined by DER
- u: prv.coefficient.toArrayLike(Uint8Array)
- };
- }
-
- // RSA keygen fallback using 40 iterations of the Miller-Rabin test
- // See https://stackoverflow.com/a/6330138 for justification
- // Also see section C.3 here: https://nvlpubs.nist.gov/nistpubs/FIPS/NIST
- let q = await randomProbablePrime(bits - (bits >> 1), e, 40);
- let p = await randomProbablePrime(bits >> 1, e, 40);
-
- if (q.lt(p)) {
- [p, q] = [q, p];
- }
- const phi = p.dec().imul(q.dec());
- return {
- n: p.mul(q).toUint8Array(),
- e: e.toUint8Array(),
- d: e.modInv(phi).toUint8Array(),
- p: p.toUint8Array(),
- q: q.toUint8Array(),
- // dp: d.mod(p.subn(1)),
- // dq: d.mod(q.subn(1)),
- u: p.modInv(q).toUint8Array()
- };
-}
-
-/**
- * Validate RSA parameters
- * @param {Uint8Array} n RSA public modulus
- * @param {Uint8Array} e RSA public exponent
- * @param {Uint8Array} d RSA private exponent
- * @param {Uint8Array} p RSA private prime p
- * @param {Uint8Array} q RSA private prime q
- * @param {Uint8Array} u RSA inverse of p w.r.t. q
- * @returns {Promise} whether params are valid
- * @async
- */
-export async function validateParams(n, e, d, p, q, u) {
- const BigInteger = await util.getBigInteger();
- n = new BigInteger(n);
- p = new BigInteger(p);
- q = new BigInteger(q);
-
- // expect pq = n
- if (!p.mul(q).equal(n)) {
- return false;
- }
-
- const two = new BigInteger(2);
- // expect p*u = 1 mod q
- u = new BigInteger(u);
- if (!p.mul(u).mod(q).isOne()) {
- return false;
- }
+ return this.bnDecrypt(data, n, e, d, p, q, u);
+ },
- e = new BigInteger(e);
- d = new BigInteger(d);
/**
- * In RSA pkcs#1 the exponents (d, e) are inverses modulo lcm(p-1, q-1)
- * We check that [de = 1 mod (p-1)] and [de = 1 mod (q-1)]
- * By CRT on coprime factors of (p-1, q-1) it follows that [de = 1 mod lcm(p-1, q-1)]
+ * Generate a new random private key B bits long with public exponent E.
*
- * We blind the multiplication with r, and check that rde = r mod lcm(p-1, q-1)
+ * When possible, webCrypto or nodeCrypto is used. Otherwise, primes are generated using
+ * 40 rounds of the Miller-Rabin probabilistic random prime generation algorithm.
+ * @see module:crypto/public_key/prime
+ * @param {Integer} B RSA bit length
+ * @param {String} E RSA public exponent in hex string
+ * @returns {{n: BN, e: BN, d: BN,
+ * p: BN, q: BN, u: BN}} RSA public modulus, RSA public exponent, RSA private exponent,
+ * RSA private prime p, RSA private prime q, u = q ** -1 mod p
+ * @async
*/
- const nSizeOver3 = new BigInteger(Math.floor(n.bitLength() / 3));
- const r = await getRandomBigInteger(two, two.leftShift(nSizeOver3)); // r in [ 2, 2^{|n|/3} ) < p and q
- const rde = r.mul(d).mul(e);
-
- const areInverses = rde.mod(p.dec()).equal(r) && rde.mod(q.dec()).equal(r);
- if (!areInverses) {
- return false;
- }
+ generate: async function(B, E) {
+ let key;
+ E = new BN(E, 16);
- return true;
-}
-
-async function bnSign(hash_algo, n, d, hashed) {
- const BigInteger = await util.getBigInteger();
- n = new BigInteger(n);
- const m = new BigInteger(await emsaEncode(hash_algo, hashed, n.byteLength()));
- d = new BigInteger(d);
- if (m.gte(n)) {
- throw new Error('Message size cannot exceed modulus size');
- }
- return m.modExp(d, n).toUint8Array('be', n.byteLength());
-}
+ // Native RSA keygen using Web Crypto
+ if (util.getWebCrypto()) {
+ let keyPair;
+ let keyGenOpt;
+ if ((global.crypto && global.crypto.subtle) || global.msCrypto) {
+ // current standard spec
+ keyGenOpt = {
+ name: 'RSASSA-PKCS1-v1_5',
+ modulusLength: B, // the specified keysize in bits
+ publicExponent: E.toArrayLike(Uint8Array), // take three bytes (max 65537) for exponent
+ hash: {
+ name: 'SHA-1' // not required for actual RSA keys, but for crypto api 'sign' and 'verify'
+ }
+ };
+ keyPair = webCrypto.generateKey(keyGenOpt, true, ['sign', 'verify']);
+ keyPair = await promisifyIE11Op(keyPair, 'Error generating RSA key pair.');
+ } else if (global.crypto && global.crypto.webkitSubtle) {
+ // outdated spec implemented by old Webkit
+ keyGenOpt = {
+ name: 'RSA-OAEP',
+ modulusLength: B, // the specified keysize in bits
+ publicExponent: E.toArrayLike(Uint8Array), // take three bytes (max 65537) for exponent
+ hash: {
+ name: 'SHA-1' // not required for actual RSA keys, but for crypto api 'sign' and 'verify'
+ }
+ };
+ keyPair = await webCrypto.generateKey(keyGenOpt, true, ['encrypt', 'decrypt']);
+ } else {
+ throw new Error('Unknown WebCrypto implementation');
+ }
-async function webSign(hash_name, data, n, e, d, p, q, u) {
- /** OpenPGP keys require that p < q, and Safari Web Crypto requires that p > q.
- * We swap them in privateToJwk, so it usually works out, but nevertheless,
- * not all OpenPGP keys are compatible with this requirement.
- * OpenPGP.js used to generate RSA keys the wrong way around (p > q), and still
- * does if the underlying Web Crypto does so (e.g. old MS Edge 50% of the time).
- */
- const jwk = await privateToJwk(n, e, d, p, q, u);
- const algo = {
- name: "RSASSA-PKCS1-v1_5",
- hash: { name: hash_name }
- };
- const key = await webCrypto.importKey("jwk", jwk, algo, false, ["sign"]);
- // add hash field for ms edge support
- return new Uint8Array(await webCrypto.sign({ "name": "RSASSA-PKCS1-v1_5", "hash": hash_name }, key, data));
-}
+ // export the generated keys as JsonWebKey (JWK)
+ // https://tools.ietf.org/html/draft-ietf-jose-json-web-key-33
+ let jwk = webCrypto.exportKey('jwk', keyPair.privateKey);
+ jwk = await promisifyIE11Op(jwk, 'Error exporting RSA key pair.');
-async function nodeSign(hash_algo, data, n, e, d, p, q, u) {
- const { default: BN } = await import('bn.js');
- const pBNum = new BN(p);
- const qBNum = new BN(q);
- const dBNum = new BN(d);
- const dq = dBNum.mod(qBNum.subn(1)); // d mod (q-1)
- const dp = dBNum.mod(pBNum.subn(1)); // d mod (p-1)
- const sign = nodeCrypto.createSign(enums.read(enums.hash, hash_algo));
- sign.write(data);
- sign.end();
- const keyObject = {
- version: 0,
- modulus: new BN(n),
- publicExponent: new BN(e),
- privateExponent: new BN(d),
- // switch p and q
- prime1: new BN(q),
- prime2: new BN(p),
- // switch dp and dq
- exponent1: dq,
- exponent2: dp,
- coefficient: new BN(u)
- };
- if (typeof nodeCrypto.createPrivateKey !== 'undefined') { //from version 11.6.0 Node supports der encoded key objects
- const der = RSAPrivateKey.encode(keyObject, 'der');
- return new Uint8Array(sign.sign({ key: der, format: 'der', type: 'pkcs1' }));
- }
- const pem = RSAPrivateKey.encode(keyObject, 'pem', {
- label: 'RSA PRIVATE KEY'
- });
- return new Uint8Array(sign.sign(pem));
-}
+ // parse raw ArrayBuffer bytes to jwk/json (WebKit/Safari/IE11 quirk)
+ if (jwk instanceof ArrayBuffer) {
+ jwk = JSON.parse(String.fromCharCode.apply(null, new Uint8Array(jwk)));
+ }
+ // map JWK parameters to BN
+ key = {};
+ key.n = new BN(util.b64_to_Uint8Array(jwk.n));
+ key.e = E;
+ key.d = new BN(util.b64_to_Uint8Array(jwk.d));
+ // switch p and q
+ key.p = new BN(util.b64_to_Uint8Array(jwk.q));
+ key.q = new BN(util.b64_to_Uint8Array(jwk.p));
+ // Since p and q are switched in places, we could keep u
+ key.u = new BN(util.b64_to_Uint8Array(jwk.qi));
+ return key;
+ } else if (util.getNodeCrypto() && nodeCrypto.generateKeyPair && RSAPrivateKey) {
+ const opts = {
+ modulusLength: Number(B.toString(10)),
+ publicExponent: Number(E.toString(10)),
+ publicKeyEncoding: { type: 'pkcs1', format: 'der' },
+ privateKeyEncoding: { type: 'pkcs1', format: 'der' }
+ };
+ const prv = await new Promise((resolve, reject) => nodeCrypto.generateKeyPair('rsa', opts, (err, _, der) => {
+ if (err) {
+ reject(err);
+ } else {
+ resolve(RSAPrivateKey.decode(der, 'der'));
+ }
+ }));
+ /** PGP spec differs from DER spec, DER: `(inverse of q) mod p`, PGP: `(inverse of p) mod q`.
+ * @link https://tools.ietf.org/html/rfc3447#section-3.2
+ * @link https://tools.ietf.org/html/draft-ietf-openpgp-rfc4880bis-08#section-5.6.1
+ */
+ return {
+ n: prv.modulus,
+ e: prv.publicExponent,
+ d: prv.privateExponent,
+ // switch p and q
+ p: prv.prime2,
+ q: prv.prime1,
+ // Since p and q are switched in places, we could keep u
+ u: prv.coefficient // PGP type of u
+ };
+ }
-async function bnVerify(hash_algo, s, n, e, hashed) {
- const BigInteger = await util.getBigInteger();
- n = new BigInteger(n);
- s = new BigInteger(s);
- e = new BigInteger(e);
- if (s.gte(n)) {
- throw new Error('Signature size cannot exceed modulus size');
- }
- const EM1 = s.modExp(e, n).toUint8Array('be', n.byteLength());
- const EM2 = await emsaEncode(hash_algo, hashed, n.byteLength());
- return util.equalsUint8Array(EM1, EM2);
-}
+ // RSA keygen fallback using 40 iterations of the Miller-Rabin test
+ // See https://stackoverflow.com/a/6330138 for justification
+ // Also see section C.3 here: https://nvlpubs.nist.gov/nistpubs/FIPS/NIST
+ let q = await prime.randomProbablePrime(B - (B >> 1), E, 40);
+ let p = await prime.randomProbablePrime(B >> 1, E, 40);
-async function webVerify(hash_name, data, s, n, e) {
- const jwk = publicToJwk(n, e);
- const key = await webCrypto.importKey("jwk", jwk, {
- name: "RSASSA-PKCS1-v1_5",
- hash: { name: hash_name }
- }, false, ["verify"]);
- // add hash field for ms edge support
- return webCrypto.verify({ "name": "RSASSA-PKCS1-v1_5", "hash": hash_name }, key, s, data);
-}
+ if (q.cmp(p) < 0) {
+ [p, q] = [q, p];
+ }
-async function nodeVerify(hash_algo, data, s, n, e) {
- const { default: BN } = await import('bn.js');
+ const phi = p.subn(1).mul(q.subn(1));
+ return {
+ n: p.mul(q),
+ e: E,
+ d: E.invm(phi),
+ p: p,
+ q: q,
+ // dp: d.mod(p.subn(1)),
+ // dq: d.mod(q.subn(1)),
+ u: p.invm(q)
+ };
+ },
- const verify = nodeCrypto.createVerify(enums.read(enums.hash, hash_algo));
- verify.write(data);
- verify.end();
- const keyObject = {
- modulus: new BN(n),
- publicExponent: new BN(e)
- };
- let key;
- if (typeof nodeCrypto.createPrivateKey !== 'undefined') { //from version 11.6.0 Node supports der encoded key objects
- const der = RSAPublicKey.encode(keyObject, 'der');
- key = { key: der, format: 'der', type: 'pkcs1' };
- } else {
- key = RSAPublicKey.encode(keyObject, 'pem', {
- label: 'RSA PUBLIC KEY'
- });
- }
- try {
- return await verify.verify(key, s);
- } catch (err) {
- return false;
- }
-}
+ /**
+ * Validate RSA parameters
+ * @param {Uint8Array} n RSA public modulus
+ * @param {Uint8Array} e RSA public exponent
+ * @param {Uint8Array} d RSA private exponent
+ * @param {Uint8Array} p RSA private prime p
+ * @param {Uint8Array} q RSA private prime q
+ * @param {Uint8Array} u RSA inverse of p w.r.t. q
+ * @returns {Promise} whether params are valid
+ * @async
+ */
+ validateParams: async function (n, e, d, p, q, u) {
+ n = new BN(n);
+ p = new BN(p);
+ q = new BN(q);
+
+ // expect pq = n
+ if (!p.mul(q).eq(n)) {
+ return false;
+ }
-async function nodeEncrypt(data, n, e) {
- const { default: BN } = await import('bn.js');
+ const one = new BN(1);
+ const two = new BN(2);
+ // expect p*u = 1 mod q
+ u = new BN(u);
+ if (!p.mul(u).umod(q).eq(one)) {
+ return false;
+ }
- const keyObject = {
- modulus: new BN(n),
- publicExponent: new BN(e)
- };
- let key;
- if (typeof nodeCrypto.createPrivateKey !== 'undefined') {
- const der = RSAPublicKey.encode(keyObject, 'der');
- key = { key: der, format: 'der', type: 'pkcs1', padding: nodeCrypto.constants.RSA_PKCS1_PADDING };
- } else {
- const pem = RSAPublicKey.encode(keyObject, 'pem', {
- label: 'RSA PUBLIC KEY'
- });
- key = { key: pem, padding: nodeCrypto.constants.RSA_PKCS1_PADDING };
- }
- return new Uint8Array(nodeCrypto.publicEncrypt(key, data));
-}
+ e = new BN(e);
+ d = new BN(d);
+ /**
+ * In RSA pkcs#1 the exponents (d, e) are inverses modulo lcm(p-1, q-1)
+ * We check that [de = 1 mod (p-1)] and [de = 1 mod (q-1)]
+ * By CRT on coprime factors of (p-1, q-1) it follows that [de = 1 mod lcm(p-1, q-1)]
+ *
+ * We blind the multiplication with r, and check that rde = r mod lcm(p-1, q-1)
+ */
+ const r = await random.getRandomBN(two, two.shln(n.bitLength() / 3)); // r in [ 2, 2^{|n|/3} ) < p and q
+ const rde = r.mul(d).mul(e);
-async function bnEncrypt(data, n, e) {
- const BigInteger = await util.getBigInteger();
- n = new BigInteger(n);
- data = new BigInteger(await emeEncode(data, n.byteLength()));
- e = new BigInteger(e);
- if (data.gte(n)) {
- throw new Error('Message size cannot exceed modulus size');
- }
- return data.modExp(e, n).toUint8Array('be', n.byteLength());
-}
+ const areInverses = rde.umod(p.sub(one)).eq(r) && rde.umod(q.sub(one)).eq(r);
+ if (!areInverses) {
+ return false;
+ }
-async function nodeDecrypt(data, n, e, d, p, q, u) {
- const { default: BN } = await import('bn.js');
+ return true;
+ },
- const pBNum = new BN(p);
- const qBNum = new BN(q);
- const dBNum = new BN(d);
- const dq = dBNum.mod(qBNum.subn(1)); // d mod (q-1)
- const dp = dBNum.mod(pBNum.subn(1)); // d mod (p-1)
- const keyObject = {
- version: 0,
- modulus: new BN(n),
- publicExponent: new BN(e),
- privateExponent: new BN(d),
- // switch p and q
- prime1: new BN(q),
- prime2: new BN(p),
- // switch dp and dq
- exponent1: dq,
- exponent2: dp,
- coefficient: new BN(u)
- };
- let key;
- if (typeof nodeCrypto.createPrivateKey !== 'undefined') {
- const der = RSAPrivateKey.encode(keyObject, 'der');
- key = { key: der, format: 'der' , type: 'pkcs1', padding: nodeCrypto.constants.RSA_PKCS1_PADDING };
- } else {
+ bnSign: async function (hash_algo, n, d, hashed) {
+ n = new BN(n);
+ const m = new BN(await pkcs1.emsa.encode(hash_algo, hashed, n.byteLength()), 16);
+ d = new BN(d);
+ if (n.cmp(m) <= 0) {
+ throw new Error('Message size cannot exceed modulus size');
+ }
+ const nred = new BN.red(n);
+ return m.toRed(nred).redPow(d).toArrayLike(Uint8Array, 'be', n.byteLength());
+ },
+
+ webSign: async function (hash_name, data, n, e, d, p, q, u) {
+ /** OpenPGP keys require that p < q, and Safari Web Crypto requires that p > q.
+ * We swap them in privateToJwk, so it usually works out, but nevertheless,
+ * not all OpenPGP keys are compatible with this requirement.
+ * OpenPGP.js used to generate RSA keys the wrong way around (p > q), and still
+ * does if the underlying Web Crypto does so (e.g. old MS Edge 50% of the time).
+ */
+ const jwk = privateToJwk(n, e, d, p, q, u);
+ const algo = {
+ name: "RSASSA-PKCS1-v1_5",
+ hash: { name: hash_name }
+ };
+ const key = await webCrypto.importKey("jwk", jwk, algo, false, ["sign"]);
+ // add hash field for ms edge support
+ return new Uint8Array(await webCrypto.sign({ "name": "RSASSA-PKCS1-v1_5", "hash": hash_name }, key, data));
+ },
+
+ nodeSign: async function (hash_algo, data, n, e, d, p, q, u) {
+ const pBNum = new BN(p);
+ const qBNum = new BN(q);
+ const dBNum = new BN(d);
+ const dq = dBNum.mod(qBNum.subn(1)); // d mod (q-1)
+ const dp = dBNum.mod(pBNum.subn(1)); // d mod (p-1)
+ const sign = nodeCrypto.createSign(enums.read(enums.hash, hash_algo));
+ sign.write(data);
+ sign.end();
+ const keyObject = {
+ version: 0,
+ modulus: new BN(n),
+ publicExponent: new BN(e),
+ privateExponent: new BN(d),
+ // switch p and q
+ prime1: new BN(q),
+ prime2: new BN(p),
+ // switch dp and dq
+ exponent1: dq,
+ exponent2: dp,
+ coefficient: new BN(u)
+ };
+ if (typeof nodeCrypto.createPrivateKey !== 'undefined') { //from version 11.6.0 Node supports der encoded key objects
+ const der = RSAPrivateKey.encode(keyObject, 'der');
+ return new Uint8Array(sign.sign({ key: der, format: 'der', type: 'pkcs1' }));
+ }
const pem = RSAPrivateKey.encode(keyObject, 'pem', {
label: 'RSA PRIVATE KEY'
});
- key = { key: pem, padding: nodeCrypto.constants.RSA_PKCS1_PADDING };
- }
- try {
- return new Uint8Array(nodeCrypto.privateDecrypt(key, data));
- } catch (err) {
- throw new Error('Decryption error');
- }
-}
+ return new Uint8Array(sign.sign(pem));
+ },
+
+ bnVerify: async function (hash_algo, s, n, e, hashed) {
+ n = new BN(n);
+ s = new BN(s);
+ e = new BN(e);
+ if (n.cmp(s) <= 0) {
+ throw new Error('Signature size cannot exceed modulus size');
+ }
+ const nred = new BN.red(n);
+ const EM1 = s.toRed(nred).redPow(e).toArrayLike(Uint8Array, 'be', n.byteLength());
+ const EM2 = await pkcs1.emsa.encode(hash_algo, hashed, n.byteLength());
+ return util.Uint8Array_to_hex(EM1) === EM2;
+ },
+
+ webVerify: async function (hash_name, data, s, n, e) {
+ const jwk = publicToJwk(n, e);
+ const key = await webCrypto.importKey("jwk", jwk, {
+ name: "RSASSA-PKCS1-v1_5",
+ hash: { name: hash_name }
+ }, false, ["verify"]);
+ // add hash field for ms edge support
+ return webCrypto.verify({ "name": "RSASSA-PKCS1-v1_5", "hash": hash_name }, key, s, data);
+ },
+
+ nodeVerify: async function (hash_algo, data, s, n, e) {
+ const verify = nodeCrypto.createVerify(enums.read(enums.hash, hash_algo));
+ verify.write(data);
+ verify.end();
+ const keyObject = {
+ modulus: new BN(n),
+ publicExponent: new BN(e)
+ };
+ let key;
+ if (typeof nodeCrypto.createPrivateKey !== 'undefined') { //from version 11.6.0 Node supports der encoded key objects
+ const der = RSAPublicKey.encode(keyObject, 'der');
+ key = { key: der, format: 'der', type: 'pkcs1' };
+ } else {
+ key = RSAPublicKey.encode(keyObject, 'pem', {
+ label: 'RSA PUBLIC KEY'
+ });
+ }
+ try {
+ return await verify.verify(key, s);
+ } catch (err) {
+ return false;
+ }
+ },
-async function bnDecrypt(data, n, e, d, p, q, u) {
- const BigInteger = await util.getBigInteger();
- data = new BigInteger(data);
- n = new BigInteger(n);
- e = new BigInteger(e);
- d = new BigInteger(d);
- p = new BigInteger(p);
- q = new BigInteger(q);
- u = new BigInteger(u);
- if (data.gte(n)) {
- throw new Error('Data too large.');
- }
- const dq = d.mod(q.dec()); // d mod (q-1)
- const dp = d.mod(p.dec()); // d mod (p-1)
-
- let blinder;
- let unblinder;
- if (config.rsaBlinding) {
- unblinder = (await getRandomBigInteger(new BigInteger(2), n)).mod(n);
- blinder = unblinder.modInv(n).modExp(e, n);
- data = data.mul(blinder).mod(n);
- }
+ nodeEncrypt: async function (data, n, e) {
+ const keyObject = {
+ modulus: new BN(n),
+ publicExponent: new BN(e)
+ };
+ let key;
+ if (typeof nodeCrypto.createPrivateKey !== 'undefined') {
+ const der = RSAPublicKey.encode(keyObject, 'der');
+ key = { key: der, format: 'der', type: 'pkcs1', padding: nodeCrypto.constants.RSA_PKCS1_PADDING };
+ } else {
+ const pem = RSAPublicKey.encode(keyObject, 'pem', {
+ label: 'RSA PUBLIC KEY'
+ });
+ key = { key: pem, padding: nodeCrypto.constants.RSA_PKCS1_PADDING };
+ }
+ return new Uint8Array(nodeCrypto.publicEncrypt(key, data));
+ },
+
+ bnEncrypt: async function (data, n, e) {
+ n = new BN(n);
+ data = new type_mpi(await pkcs1.eme.encode(util.Uint8Array_to_str(data), n.byteLength()));
+ data = data.toBN();
+ e = new BN(e);
+ if (n.cmp(data) <= 0) {
+ throw new Error('Message size cannot exceed modulus size');
+ }
+ const nred = new BN.red(n);
+ return data.toRed(nred).redPow(e).toArrayLike(Uint8Array, 'be', n.byteLength());
+ },
+
+ nodeDecrypt: function (data, n, e, d, p, q, u) {
+ const pBNum = new BN(p);
+ const qBNum = new BN(q);
+ const dBNum = new BN(d);
+ const dq = dBNum.mod(qBNum.subn(1)); // d mod (q-1)
+ const dp = dBNum.mod(pBNum.subn(1)); // d mod (p-1)
+ const keyObject = {
+ version: 0,
+ modulus: new BN(n),
+ publicExponent: new BN(e),
+ privateExponent: new BN(d),
+ // switch p and q
+ prime1: new BN(q),
+ prime2: new BN(p),
+ // switch dp and dq
+ exponent1: dq,
+ exponent2: dp,
+ coefficient: new BN(u)
+ };
+ let key;
+ if (typeof nodeCrypto.createPrivateKey !== 'undefined') {
+ const der = RSAPrivateKey.encode(keyObject, 'der');
+ key = { key: der, format: 'der' , type: 'pkcs1', padding: nodeCrypto.constants.RSA_PKCS1_PADDING };
+ } else {
+ const pem = RSAPrivateKey.encode(keyObject, 'pem', {
+ label: 'RSA PRIVATE KEY'
+ });
+ key = { key: pem, padding: nodeCrypto.constants.RSA_PKCS1_PADDING };
+ }
+ try {
+ return util.Uint8Array_to_str(nodeCrypto.privateDecrypt(key, data));
+ } catch (err) {
+ throw new Error('Decryption error');
+ }
+ },
+
+ bnDecrypt: async function(data, n, e, d, p, q, u) {
+ data = new BN(data);
+ n = new BN(n);
+ e = new BN(e);
+ d = new BN(d);
+ p = new BN(p);
+ q = new BN(q);
+ u = new BN(u);
+ if (n.cmp(data) <= 0) {
+ throw new Error('Data too large.');
+ }
+ const dq = d.mod(q.subn(1)); // d mod (q-1)
+ const dp = d.mod(p.subn(1)); // d mod (p-1)
+ const pred = new BN.red(p);
+ const qred = new BN.red(q);
+ const nred = new BN.red(n);
+
+ let blinder;
+ let unblinder;
+ if (config.rsa_blinding) {
+ unblinder = (await random.getRandomBN(new BN(2), n)).toRed(nred);
+ blinder = unblinder.redInvm().redPow(e);
+ data = data.toRed(nred).redMul(blinder).fromRed();
+ }
- const mp = data.modExp(dp, p); // data**{d mod (q-1)} mod p
- const mq = data.modExp(dq, q); // data**{d mod (p-1)} mod q
- const h = u.mul(mq.sub(mp)).mod(q); // u * (mq-mp) mod q (operands already < q)
+ const mp = data.toRed(pred).redPow(dp);
+ const mq = data.toRed(qred).redPow(dq);
+ const t = mq.redSub(mp.fromRed().toRed(qred));
+ const h = u.toRed(qred).redMul(t).fromRed();
- let result = h.mul(p).add(mp); // result < n due to relations above
+ let result = h.mul(p).add(mp).toRed(nred);
- if (config.rsaBlinding) {
- result = result.mul(unblinder).mod(n);
- }
+ if (config.rsa_blinding) {
+ result = result.redMul(unblinder);
+ }
- return emeDecode(result.toUint8Array('be', n.byteLength()));
-}
+ result = new type_mpi(result).toUint8Array('be', n.byteLength()); // preserve leading zeros
+ return pkcs1.eme.decode(util.Uint8Array_to_str(result));
+ },
+
+ prime: prime
+};
/** Convert Openpgp private key params to jwk key according to
* @link https://tools.ietf.org/html/rfc7517
@@ -559,28 +561,27 @@ async function bnDecrypt(data, n, e, d, p, q, u) {
* @param {Uint8Array} q
* @param {Uint8Array} u
*/
-async function privateToJwk(n, e, d, p, q, u) {
- const BigInteger = await util.getBigInteger();
- const pNum = new BigInteger(p);
- const qNum = new BigInteger(q);
- const dNum = new BigInteger(d);
-
- let dq = dNum.mod(qNum.dec()); // d mod (q-1)
- let dp = dNum.mod(pNum.dec()); // d mod (p-1)
- dp = dp.toUint8Array();
- dq = dq.toUint8Array();
+function privateToJwk(n, e, d, p, q, u) {
+ const pBNum = new BN(p);
+ const qBNum = new BN(q);
+ const dBNum = new BN(d);
+
+ let dq = dBNum.mod(qBNum.subn(1)); // d mod (q-1)
+ let dp = dBNum.mod(pBNum.subn(1)); // d mod (p-1)
+ dp = dp.toArrayLike(Uint8Array);
+ dq = dq.toArrayLike(Uint8Array);
return {
kty: 'RSA',
- n: uint8ArrayToB64(n, true),
- e: uint8ArrayToB64(e, true),
- d: uint8ArrayToB64(d, true),
+ n: util.Uint8Array_to_b64(n, true),
+ e: util.Uint8Array_to_b64(e, true),
+ d: util.Uint8Array_to_b64(d, true),
// switch p and q
- p: uint8ArrayToB64(q, true),
- q: uint8ArrayToB64(p, true),
+ p: util.Uint8Array_to_b64(q, true),
+ q: util.Uint8Array_to_b64(p, true),
// switch dp and dq
- dp: uint8ArrayToB64(dq, true),
- dq: uint8ArrayToB64(dp, true),
- qi: uint8ArrayToB64(u, true),
+ dp: util.Uint8Array_to_b64(dq, true),
+ dq: util.Uint8Array_to_b64(dp, true),
+ qi: util.Uint8Array_to_b64(u, true),
ext: true
};
}
@@ -594,8 +595,8 @@ async function privateToJwk(n, e, d, p, q, u) {
function publicToJwk(n, e) {
return {
kty: 'RSA',
- n: uint8ArrayToB64(n, true),
- e: uint8ArrayToB64(e, true),
+ n: util.Uint8Array_to_b64(n, true),
+ e: util.Uint8Array_to_b64(e, true),
ext: true
};
}
diff --git a/src/crypto/random.js b/src/crypto/random.js
index 64d5e042..b96569fe 100644
--- a/src/crypto/random.js
+++ b/src/crypto/random.js
@@ -19,126 +19,127 @@
/**
* @fileoverview Provides tools for retrieving secure randomness from browsers or Node.js
+ * @requires bn.js
* @requires util
* @module crypto/random
*/
+
+import BN from 'bn.js';
import util from '../util';
-// Do not use util.getNodeCrypto because we need this regardless of useNative setting
+// Do not use util.getNodeCrypto because we need this regardless of use_native setting
const nodeCrypto = util.detectNode() && require('crypto');
-/**
- * Buffer for secure random numbers
- */
-class RandomBuffer {
- constructor() {
- this.buffer = null;
- this.size = null;
- this.callback = null;
- }
-
- /**
- * Initialize buffer
- * @param {Integer} size size of buffer
- */
- init(size, callback) {
- this.buffer = new Uint8Array(size);
- this.size = 0;
- this.callback = callback;
- }
-
+export default {
/**
- * Concat array of secure random numbers to buffer
- * @param {Uint8Array} buf
+ * Retrieve secure random byte array of the specified length
+ * @param {Integer} length Length in bytes to generate
+ * @returns {Uint8Array} Random byte array
+ * @async
*/
- set(buf) {
- if (!this.buffer) {
- throw new Error('RandomBuffer is not initialized');
+ getRandomBytes: async function(length) {
+ const buf = new Uint8Array(length);
+ if (typeof crypto !== 'undefined' && crypto.getRandomValues) {
+ crypto.getRandomValues(buf);
+ } else if (typeof global !== 'undefined' && typeof global.msCrypto === 'object' && typeof global.msCrypto.getRandomValues === 'function') {
+ global.msCrypto.getRandomValues(buf);
+ } else if (nodeCrypto) {
+ const bytes = nodeCrypto.randomBytes(buf.length);
+ buf.set(bytes);
+ } else if (this.randomBuffer.buffer) {
+ await this.randomBuffer.get(buf);
+ } else {
+ throw new Error('No secure random number generator available.');
}
- if (!(buf instanceof Uint8Array)) {
- throw new Error('Invalid type: buf not an Uint8Array');
- }
- const freeSpace = this.buffer.length - this.size;
- if (buf.length > freeSpace) {
- buf = buf.subarray(0, freeSpace);
- }
- // set buf with offset old size of buffer
- this.buffer.set(buf, this.size);
- this.size += buf.length;
- }
+ return buf;
+ },
/**
- * Take numbers out of buffer and copy to array
- * @param {Uint8Array} buf the destination array
+ * Create a secure random MPI that is greater than or equal to min and less than max.
+ * @param {module:type/mpi} min Lower bound, included
+ * @param {module:type/mpi} max Upper bound, excluded
+ * @returns {module:BN} Random MPI
+ * @async
*/
- async get(buf) {
- if (!this.buffer) {
- throw new Error('RandomBuffer is not initialized');
- }
- if (!(buf instanceof Uint8Array)) {
- throw new Error('Invalid type: buf not an Uint8Array');
- }
- if (this.size < buf.length) {
- if (!this.callback) {
- throw new Error('Random number buffer depleted');
- }
- // Wait for random bytes from main context, then try again
- await this.callback();
- return this.get(buf);
+ getRandomBN: async function(min, max) {
+ if (max.cmp(min) <= 0) {
+ throw new Error('Illegal parameter value: max <= min');
}
- for (let i = 0; i < buf.length; i++) {
- buf[i] = this.buffer[--this.size];
- // clear buffer value
- this.buffer[this.size] = 0;
- }
- }
-}
+
+ const modulus = max.sub(min);
+ const bytes = modulus.byteLength();
+
+ // Using a while loop is necessary to avoid bias introduced by the mod operation.
+ // However, we request 64 extra random bits so that the bias is negligible.
+ // Section B.1.1 here: https://nvlpubs.nist.gov/nistpubs/FIPS/NIST.FIPS.186-4.pdf
+ const r = new BN(await this.getRandomBytes(bytes + 8));
+ return r.mod(modulus).add(min);
+ },
+
+ randomBuffer: new RandomBuffer()
+};
/**
- * Retrieve secure random byte array of the specified length
- * @param {Integer} length Length in bytes to generate
- * @returns {Uint8Array} Random byte array
- * @async
+ * Buffer for secure random numbers
*/
-export async function getRandomBytes(length) {
- const buf = new Uint8Array(length);
- if (typeof crypto !== 'undefined' && crypto.getRandomValues) {
- crypto.getRandomValues(buf);
- } else if (typeof globalThis !== 'undefined' && typeof globalThis.msCrypto === 'object' && typeof globalThis.msCrypto.getRandomValues === 'function') {
- globalThis.msCrypto.getRandomValues(buf);
- } else if (nodeCrypto) {
- const bytes = nodeCrypto.randomBytes(buf.length);
- buf.set(bytes);
- } else if (randomBuffer.buffer) {
- await randomBuffer.get(buf);
- } else {
- throw new Error('No secure random number generator available.');
- }
- return buf;
+function RandomBuffer() {
+ this.buffer = null;
+ this.size = null;
+ this.callback = null;
}
/**
- * Create a secure random BigInteger that is greater than or equal to min and less than max.
- * @param {module:BigInteger} min Lower bound, included
- * @param {module:BigInteger} max Upper bound, excluded
- * @returns {module:BigInteger} Random BigInteger
- * @async
+ * Initialize buffer
+ * @param {Integer} size size of buffer
*/
-export async function getRandomBigInteger(min, max) {
- const BigInteger = await util.getBigInteger();
+RandomBuffer.prototype.init = function(size, callback) {
+ this.buffer = new Uint8Array(size);
+ this.size = 0;
+ this.callback = callback;
+};
- if (max.lt(min)) {
- throw new Error('Illegal parameter value: max <= min');
+/**
+ * Concat array of secure random numbers to buffer
+ * @param {Uint8Array} buf
+ */
+RandomBuffer.prototype.set = function(buf) {
+ if (!this.buffer) {
+ throw new Error('RandomBuffer is not initialized');
}
+ if (!(buf instanceof Uint8Array)) {
+ throw new Error('Invalid type: buf not an Uint8Array');
+ }
+ const freeSpace = this.buffer.length - this.size;
+ if (buf.length > freeSpace) {
+ buf = buf.subarray(0, freeSpace);
+ }
+ // set buf with offset old size of buffer
+ this.buffer.set(buf, this.size);
+ this.size += buf.length;
+};
- const modulus = max.sub(min);
- const bytes = modulus.byteLength();
-
- // Using a while loop is necessary to avoid bias introduced by the mod operation.
- // However, we request 64 extra random bits so that the bias is negligible.
- // Section B.1.1 here: https://nvlpubs.nist.gov/nistpubs/FIPS/NIST.FIPS.186-4.pdf
- const r = new BigInteger(await getRandomBytes(bytes + 8));
- return r.mod(modulus).add(min);
-}
-
-export const randomBuffer = new RandomBuffer();
+/**
+ * Take numbers out of buffer and copy to array
+ * @param {Uint8Array} buf the destination array
+ */
+RandomBuffer.prototype.get = async function(buf) {
+ if (!this.buffer) {
+ throw new Error('RandomBuffer is not initialized');
+ }
+ if (!(buf instanceof Uint8Array)) {
+ throw new Error('Invalid type: buf not an Uint8Array');
+ }
+ if (this.size < buf.length) {
+ if (!this.callback) {
+ throw new Error('Random number buffer depleted');
+ }
+ // Wait for random bytes from main context, then try again
+ await this.callback();
+ return this.get(buf);
+ }
+ for (let i = 0; i < buf.length; i++) {
+ buf[i] = this.buffer[--this.size];
+ // clear buffer value
+ this.buffer[this.size] = 0;
+ }
+};
diff --git a/src/crypto/signature.js b/src/crypto/signature.js
index 39946b7b..55976be4 100644
--- a/src/crypto/signature.js
+++ b/src/crypto/signature.js
@@ -1,158 +1,137 @@
/**
* @fileoverview Provides functions for asymmetric signing and signature verification
+ * @requires crypto/crypto
* @requires crypto/public_key
* @requires enums
* @requires util
* @module crypto/signature
*/
+import crypto from './crypto';
import publicKey from './public_key';
import enums from '../enums';
import util from '../util';
-/**
- * Parse signature in binary form to get the parameters.
- * The returned values are only padded for EdDSA, since in the other cases their expected length
- * depends on the key params, hence we delegate the padding to the signature verification function.
- * See {@link https://tools.ietf.org/html/rfc4880#section-9.1|RFC 4880 9.1}
- * See {@link https://tools.ietf.org/html/rfc4880#section-5.2.2|RFC 4880 5.2.2.}
- * @param {module:enums.publicKey} algo Public key algorithm
- * @param {Uint8Array} signature Data for which the signature was created
- * @returns {Object} True if signature is valid
- * @async
- */
-export function parseSignatureParams(algo, signature) {
- let read = 0;
- switch (algo) {
- // Algorithm-Specific Fields for RSA signatures:
- // - MPI of RSA signature value m**d mod n.
- case enums.publicKey.rsaEncryptSign:
- case enums.publicKey.rsaEncrypt:
- case enums.publicKey.rsaSign: {
- const s = util.readMPI(signature.subarray(read));
- // The signature needs to be the same length as the public key modulo n.
- // We pad s on signature verification, where we have access to n.
- return { s };
- }
- // Algorithm-Specific Fields for DSA or ECDSA signatures:
- // - MPI of DSA or ECDSA value r.
- // - MPI of DSA or ECDSA value s.
- case enums.publicKey.dsa:
- case enums.publicKey.ecdsa:
- {
- const r = util.readMPI(signature.subarray(read)); read += r.length + 2;
- const s = util.readMPI(signature.subarray(read));
- return { r, s };
+export default {
+ /**
+ * Verifies the signature provided for data using specified algorithms and public key parameters.
+ * See {@link https://tools.ietf.org/html/rfc4880#section-9.1|RFC 4880 9.1}
+ * and {@link https://tools.ietf.org/html/rfc4880#section-9.4|RFC 4880 9.4}
+ * for public key and hash algorithms.
+ * @param {module:enums.publicKey} algo Public key algorithm
+ * @param {module:enums.hash} hash_algo Hash algorithm
+ * @param {Array} msg_MPIs Algorithm-specific signature parameters
+ * @param {Array} pub_MPIs Algorithm-specific public key parameters
+ * @param {Uint8Array} data Data for which the signature was created
+ * @param {Uint8Array} hashed The hashed data
+ * @returns {Boolean} True if signature is valid
+ * @async
+ */
+ verify: async function(algo, hash_algo, msg_MPIs, pub_MPIs, data, hashed) {
+ const types = crypto.getPubKeyParamTypes(algo);
+ if (pub_MPIs.length < types.length) {
+ throw new Error('Missing public key parameters');
}
- // Algorithm-Specific Fields for EdDSA signatures:
- // - MPI of an EC point r.
- // - EdDSA value s, in MPI, in the little endian representation
- case enums.publicKey.eddsa: {
- // When parsing little-endian MPI data, we always need to left-pad it, as done with big-endian values:
- // https://www.ietf.org/archive/id/draft-ietf-openpgp-rfc4880bis-10.html#section-3.2-9
- let r = util.readMPI(signature.subarray(read)); read += r.length + 2;
- r = util.leftPad(r, 32);
- let s = util.readMPI(signature.subarray(read));
- s = util.leftPad(s, 32);
- return { r, s };
+ switch (algo) {
+ case enums.publicKey.rsa_encrypt_sign:
+ case enums.publicKey.rsa_encrypt:
+ case enums.publicKey.rsa_sign: {
+ const n = pub_MPIs[0].toUint8Array();
+ const e = pub_MPIs[1].toUint8Array();
+ const m = msg_MPIs[0].toUint8Array('be', n.length);
+ return publicKey.rsa.verify(hash_algo, data, m, n, e, hashed);
+ }
+ case enums.publicKey.dsa: {
+ const r = msg_MPIs[0].toBN();
+ const s = msg_MPIs[1].toBN();
+ const p = pub_MPIs[0].toBN();
+ const q = pub_MPIs[1].toBN();
+ const g = pub_MPIs[2].toBN();
+ const y = pub_MPIs[3].toBN();
+ return publicKey.dsa.verify(hash_algo, r, s, hashed, g, p, q, y);
+ }
+ case enums.publicKey.ecdsa: {
+ const { oid, Q } = publicKey.elliptic.ecdsa.parseParams(pub_MPIs);
+ const signature = { r: msg_MPIs[0].toUint8Array(), s: msg_MPIs[1].toUint8Array() };
+ return publicKey.elliptic.ecdsa.verify(oid, hash_algo, signature, data, Q, hashed);
+ }
+ case enums.publicKey.eddsa: {
+ const { oid, Q } = publicKey.elliptic.eddsa.parseParams(pub_MPIs);
+ // EdDSA signature params are expected in little-endian format
+ const signature = {
+ R: msg_MPIs[0].toUint8Array('le', 32),
+ S: msg_MPIs[1].toUint8Array('le', 32)
+ };
+ return publicKey.elliptic.eddsa.verify(oid, hash_algo, signature, data, Q, hashed);
+ }
+ default:
+ throw new Error('Invalid signature algorithm.');
}
- default:
- throw new Error('Invalid signature algorithm.');
- }
-}
+ },
-/**
- * Verifies the signature provided for data using specified algorithms and public key parameters.
- * See {@link https://tools.ietf.org/html/rfc4880#section-9.1|RFC 4880 9.1}
- * and {@link https://tools.ietf.org/html/rfc4880#section-9.4|RFC 4880 9.4}
- * for public key and hash algorithms.
- * @param {module:enums.publicKey} algo Public key algorithm
- * @param {module:enums.hash} hashAlgo Hash algorithm
- * @param {Object} signature Named algorithm-specific signature parameters
- * @param {Object} publicParams Algorithm-specific public key parameters
- * @param {Uint8Array} data Data for which the signature was created
- * @param {Uint8Array} hashed The hashed data
- * @returns {Boolean} True if signature is valid
- * @async
- */
-export async function verify(algo, hashAlgo, signature, publicParams, data, hashed) {
- switch (algo) {
- case enums.publicKey.rsaEncryptSign:
- case enums.publicKey.rsaEncrypt:
- case enums.publicKey.rsaSign: {
- const { n, e } = publicParams;
- const s = util.leftPad(signature.s, n.length); // padding needed for webcrypto and node crypto
- return publicKey.rsa.verify(hashAlgo, data, s, n, e, hashed);
- }
- case enums.publicKey.dsa: {
- const { g, p, q, y } = publicParams;
- const { r, s } = signature; // no need to pad, since we always handle them as BigIntegers
- return publicKey.dsa.verify(hashAlgo, r, s, hashed, g, p, q, y);
- }
- case enums.publicKey.ecdsa: {
- const { oid, Q } = publicParams;
- const curveSize = new publicKey.elliptic.Curve(oid).payloadSize;
- // padding needed for webcrypto
- const r = util.leftPad(signature.r, curveSize);
- const s = util.leftPad(signature.s, curveSize);
- return publicKey.elliptic.ecdsa.verify(oid, hashAlgo, { r, s }, data, Q, hashed);
- }
- case enums.publicKey.eddsa: {
- const { oid, Q } = publicParams;
- // signature already padded on parsing
- return publicKey.elliptic.eddsa.verify(oid, hashAlgo, signature, data, Q, hashed);
- }
- default:
- throw new Error('Invalid signature algorithm.');
- }
-}
-
-/**
- * Creates a signature on data using specified algorithms and private key parameters.
- * See {@link https://tools.ietf.org/html/rfc4880#section-9.1|RFC 4880 9.1}
- * and {@link https://tools.ietf.org/html/rfc4880#section-9.4|RFC 4880 9.4}
- * for public key and hash algorithms.
- * @param {module:enums.publicKey} algo Public key algorithm
- * @param {module:enums.hash} hashAlgo Hash algorithm
- * @param {Object} publicKeyParams Algorithm-specific public and private key parameters
- * @param {Object} privateKeyParams Algorithm-specific public and private key parameters
- * @param {Uint8Array} data Data to be signed
- * @param {Uint8Array} hashed The hashed data
- * @returns {Object} Signature Object containing named signature parameters
- * @async
- */
-export async function sign(algo, hashAlgo, publicKeyParams, privateKeyParams, data, hashed) {
- if (!publicKeyParams || !privateKeyParams) {
- throw new Error('Missing key parameters');
- }
- switch (algo) {
- case enums.publicKey.rsaEncryptSign:
- case enums.publicKey.rsaEncrypt:
- case enums.publicKey.rsaSign: {
- const { n, e } = publicKeyParams;
- const { d, p, q, u } = privateKeyParams;
- const s = await publicKey.rsa.sign(hashAlgo, data, n, e, d, p, q, u, hashed);
- return { s };
- }
- case enums.publicKey.dsa: {
- const { g, p, q } = publicKeyParams;
- const { x } = privateKeyParams;
- return publicKey.dsa.sign(hashAlgo, hashed, g, p, q, x);
- }
- case enums.publicKey.elgamal: {
- throw new Error('Signing with Elgamal is not defined in the OpenPGP standard.');
- }
- case enums.publicKey.ecdsa: {
- const { oid, Q } = publicKeyParams;
- const { d } = privateKeyParams;
- return publicKey.elliptic.ecdsa.sign(oid, hashAlgo, data, Q, d, hashed);
+ /**
+ * Creates a signature on data using specified algorithms and private key parameters.
+ * See {@link https://tools.ietf.org/html/rfc4880#section-9.1|RFC 4880 9.1}
+ * and {@link https://tools.ietf.org/html/rfc4880#section-9.4|RFC 4880 9.4}
+ * for public key and hash algorithms.
+ * @param {module:enums.publicKey} algo Public key algorithm
+ * @param {module:enums.hash} hash_algo Hash algorithm
+ * @param {Array} key_params Algorithm-specific public and private key parameters
+ * @param {Uint8Array} data Data to be signed
+ * @param {Uint8Array} hashed The hashed data
+ * @returns {Uint8Array} Signature
+ * @async
+ */
+ sign: async function(algo, hash_algo, key_params, data, hashed) {
+ const types = [].concat(crypto.getPubKeyParamTypes(algo), crypto.getPrivKeyParamTypes(algo));
+ if (key_params.length < types.length) {
+ throw new Error('Missing private key parameters');
}
- case enums.publicKey.eddsa: {
- const { oid, Q } = publicKeyParams;
- const { seed } = privateKeyParams;
- return publicKey.elliptic.eddsa.sign(oid, hashAlgo, data, Q, seed, hashed);
+ switch (algo) {
+ case enums.publicKey.rsa_encrypt_sign:
+ case enums.publicKey.rsa_encrypt:
+ case enums.publicKey.rsa_sign: {
+ const n = key_params[0].toUint8Array();
+ const e = key_params[1].toUint8Array();
+ const d = key_params[2].toUint8Array();
+ const p = key_params[3].toUint8Array();
+ const q = key_params[4].toUint8Array();
+ const u = key_params[5].toUint8Array();
+ const signature = await publicKey.rsa.sign(hash_algo, data, n, e, d, p, q, u, hashed);
+ return util.Uint8Array_to_MPI(signature);
+ }
+ case enums.publicKey.dsa: {
+ const p = key_params[0].toBN();
+ const q = key_params[1].toBN();
+ const g = key_params[2].toBN();
+ const x = key_params[4].toBN();
+ const signature = await publicKey.dsa.sign(hash_algo, hashed, g, p, q, x);
+ return util.concatUint8Array([
+ util.Uint8Array_to_MPI(signature.r),
+ util.Uint8Array_to_MPI(signature.s)
+ ]);
+ }
+ case enums.publicKey.elgamal: {
+ throw new Error('Signing with Elgamal is not defined in the OpenPGP standard.');
+ }
+ case enums.publicKey.ecdsa: {
+ const { oid, Q, d } = publicKey.elliptic.ecdsa.parseParams(key_params);
+ const signature = await publicKey.elliptic.ecdsa.sign(oid, hash_algo, data, Q, d, hashed);
+ return util.concatUint8Array([
+ util.Uint8Array_to_MPI(signature.r),
+ util.Uint8Array_to_MPI(signature.s)
+ ]);
+ }
+ case enums.publicKey.eddsa: {
+ const { oid, Q, seed } = publicKey.elliptic.eddsa.parseParams(key_params);
+ const signature = await publicKey.elliptic.eddsa.sign(oid, hash_algo, data, Q, seed, hashed);
+ return util.concatUint8Array([
+ util.Uint8Array_to_MPI(signature.R),
+ util.Uint8Array_to_MPI(signature.S)
+ ]);
+ }
+ default:
+ throw new Error('Invalid signature algorithm.');
}
- default:
- throw new Error('Invalid signature algorithm.');
}
-}
+};
diff --git a/src/encoding/armor.js b/src/encoding/armor.js
index 4d39de16..259a7274 100644
--- a/src/encoding/armor.js
+++ b/src/encoding/armor.js
@@ -25,7 +25,7 @@
*/
import stream from 'web-stream-tools';
-import * as base64 from './base64.js';
+import base64 from './base64.js';
import enums from '../enums.js';
import config from '../config';
import util from '../util';
@@ -55,14 +55,14 @@ function getType(text) {
// Used for multi-part messages, where the armor is split amongst Y
// parts, and this is the Xth part out of Y.
if (/MESSAGE, PART \d+\/\d+/.test(header[1])) {
- return enums.armor.multipartSection;
+ return enums.armor.multipart_section;
} else
// BEGIN PGP MESSAGE, PART X
// Used for multi-part messages, where this is the Xth part of an
// unspecified number of parts. Requires the MESSAGE-ID Armor
// Header to be used.
if (/MESSAGE, PART \d+/.test(header[1])) {
- return enums.armor.multipartLast;
+ return enums.armor.multipart_last;
} else
// BEGIN PGP SIGNED MESSAGE
if (/SIGNED MESSAGE/.test(header[1])) {
@@ -76,12 +76,12 @@ function getType(text) {
// BEGIN PGP PUBLIC KEY BLOCK
// Used for armoring public keys.
if (/PUBLIC KEY BLOCK/.test(header[1])) {
- return enums.armor.publicKey;
+ return enums.armor.public_key;
} else
// BEGIN PGP PRIVATE KEY BLOCK
// Used for armoring private keys.
if (/PRIVATE KEY BLOCK/.test(header[1])) {
- return enums.armor.privateKey;
+ return enums.armor.private_key;
} else
// BEGIN PGP SIGNATURE
// Used for detached signatures, OpenPGP/MIME signatures, and
@@ -102,16 +102,16 @@ function getType(text) {
*/
function addheader(customComment) {
let result = "";
- if (config.showVersion) {
- result += "Version: " + config.versionString + '\n';
+ if (config.show_version) {
+ result += "Version: " + config.versionstring + '\r\n';
}
- if (config.showComment) {
- result += "Comment: " + config.commentString + '\n';
+ if (config.show_comment) {
+ result += "Comment: " + config.commentstring + '\r\n';
}
if (customComment) {
- result += "Comment: " + customComment + '\n';
+ result += "Comment: " + customComment + '\r\n';
}
- result += '\n';
+ result += '\r\n';
return result;
}
@@ -199,7 +199,7 @@ function verifyHeaders(headers) {
throw new Error('Improperly formatted armor header: ' + headers[i]);
}
if (!/^(Version|Comment|MessageID|Hash|Charset): .+$/.test(headers[i])) {
- util.printDebugError(new Error('Unknown header: ' + headers[i]));
+ util.print_debug_error(new Error('Unknown header: ' + headers[i]));
}
}
}
@@ -233,7 +233,7 @@ function splitChecksum(text) {
* @async
* @static
*/
-export function unarmor(input) {
+function dearmor(input) {
return new Promise(async (resolve, reject) => {
try {
const reSplit = /^-----[^-]+-----$/m;
@@ -331,8 +331,8 @@ export function unarmor(input) {
});
const writer = stream.getWriter(writable);
try {
- const checksumVerifiedString = (await checksumVerified).replace('\n', '');
- if (checksum !== checksumVerifiedString && (checksum || config.checksumRequired)) {
+ const checksumVerifiedString = (await checksumVerified).replace('\r\n', '');
+ if (checksum !== checksumVerifiedString && (checksum || config.checksum_required)) {
throw new Error("Ascii armor integrity check on message failed: '" + checksum + "' should be '" +
checksumVerifiedString + "'");
}
@@ -359,7 +359,7 @@ export function unarmor(input) {
* @returns {String | ReadableStream} Armored text
* @static
*/
-export function armor(messagetype, body, partindex, parttotal, customComment) {
+function armor(messagetype, body, partindex, parttotal, customComment) {
let text;
let hash;
if (messagetype === enums.armor.signed) {
@@ -370,59 +370,64 @@ export function armor(messagetype, body, partindex, parttotal, customComment) {
const bodyClone = stream.passiveClone(body);
const result = [];
switch (messagetype) {
- case enums.armor.multipartSection:
- result.push("-----BEGIN PGP MESSAGE, PART " + partindex + "/" + parttotal + "-----\n");
+ case enums.armor.multipart_section:
+ result.push("-----BEGIN PGP MESSAGE, PART " + partindex + "/" + parttotal + "-----\r\n");
result.push(addheader(customComment));
result.push(base64.encode(body));
result.push("=", getCheckSum(bodyClone));
- result.push("-----END PGP MESSAGE, PART " + partindex + "/" + parttotal + "-----\n");
+ result.push("-----END PGP MESSAGE, PART " + partindex + "/" + parttotal + "-----\r\n");
break;
- case enums.armor.multipartLast:
- result.push("-----BEGIN PGP MESSAGE, PART " + partindex + "-----\n");
+ case enums.armor.multipart_last:
+ result.push("-----BEGIN PGP MESSAGE, PART " + partindex + "-----\r\n");
result.push(addheader(customComment));
result.push(base64.encode(body));
result.push("=", getCheckSum(bodyClone));
- result.push("-----END PGP MESSAGE, PART " + partindex + "-----\n");
+ result.push("-----END PGP MESSAGE, PART " + partindex + "-----\r\n");
break;
case enums.armor.signed:
- result.push("\n-----BEGIN PGP SIGNED MESSAGE-----\n");
- result.push("Hash: " + hash + "\n\n");
+ result.push("\r\n-----BEGIN PGP SIGNED MESSAGE-----\r\n");
+ result.push("Hash: " + hash + "\r\n\r\n");
result.push(text.replace(/^-/mg, "- -"));
- result.push("\n-----BEGIN PGP SIGNATURE-----\n");
+ result.push("\r\n-----BEGIN PGP SIGNATURE-----\r\n");
result.push(addheader(customComment));
result.push(base64.encode(body));
result.push("=", getCheckSum(bodyClone));
- result.push("-----END PGP SIGNATURE-----\n");
+ result.push("-----END PGP SIGNATURE-----\r\n");
break;
case enums.armor.message:
- result.push("-----BEGIN PGP MESSAGE-----\n");
+ result.push("-----BEGIN PGP MESSAGE-----\r\n");
result.push(addheader(customComment));
result.push(base64.encode(body));
result.push("=", getCheckSum(bodyClone));
- result.push("-----END PGP MESSAGE-----\n");
+ result.push("-----END PGP MESSAGE-----\r\n");
break;
- case enums.armor.publicKey:
- result.push("-----BEGIN PGP PUBLIC KEY BLOCK-----\n");
+ case enums.armor.public_key:
+ result.push("-----BEGIN PGP PUBLIC KEY BLOCK-----\r\n");
result.push(addheader(customComment));
result.push(base64.encode(body));
result.push("=", getCheckSum(bodyClone));
- result.push("-----END PGP PUBLIC KEY BLOCK-----\n");
+ result.push("-----END PGP PUBLIC KEY BLOCK-----\r\n");
break;
- case enums.armor.privateKey:
- result.push("-----BEGIN PGP PRIVATE KEY BLOCK-----\n");
+ case enums.armor.private_key:
+ result.push("-----BEGIN PGP PRIVATE KEY BLOCK-----\r\n");
result.push(addheader(customComment));
result.push(base64.encode(body));
result.push("=", getCheckSum(bodyClone));
- result.push("-----END PGP PRIVATE KEY BLOCK-----\n");
+ result.push("-----END PGP PRIVATE KEY BLOCK-----\r\n");
break;
case enums.armor.signature:
- result.push("-----BEGIN PGP SIGNATURE-----\n");
+ result.push("-----BEGIN PGP SIGNATURE-----\r\n");
result.push(addheader(customComment));
result.push(base64.encode(body));
result.push("=", getCheckSum(bodyClone));
- result.push("-----END PGP SIGNATURE-----\n");
+ result.push("-----END PGP SIGNATURE-----\r\n");
break;
}
return util.concat(result);
}
+
+export default {
+ encode: armor,
+ decode: dearmor
+};
diff --git a/src/encoding/base64.js b/src/encoding/base64.js
index da56729a..6471ce68 100644
--- a/src/encoding/base64.js
+++ b/src/encoding/base64.js
@@ -31,8 +31,8 @@ if (Buffer) {
return new Uint8Array(b.buffer, b.byteOffset, b.byteLength);
};
} else {
- encodeChunk = buf => btoa(util.uint8ArrayToStr(buf));
- decodeChunk = str => util.strToUint8Array(atob(str));
+ encodeChunk = buf => btoa(util.Uint8Array_to_str(buf));
+ decodeChunk = str => util.str_to_Uint8Array(atob(str));
}
/**
@@ -41,7 +41,7 @@ if (Buffer) {
* @returns {String | ReadableStream} radix-64 version of input string
* @static
*/
-export function encode(data) {
+function encode(data) {
let buf = new Uint8Array();
return stream.transform(data, value => {
buf = util.concatUint8Array([buf, value]);
@@ -52,11 +52,11 @@ export function encode(data) {
const encoded = encodeChunk(buf.subarray(0, bytes));
for (let i = 0; i < lines; i++) {
r.push(encoded.substr(i * 60, 60));
- r.push('\n');
+ r.push('\r\n');
}
buf = buf.subarray(bytes);
return r.join('');
- }, () => (buf.length ? encodeChunk(buf) + '\n' : ''));
+ }, () => (buf.length ? encodeChunk(buf) + '\r\n' : ''));
}
/**
@@ -65,7 +65,7 @@ export function encode(data) {
* @returns {Uint8Array | ReadableStream} binary array version of input string
* @static
*/
-export function decode(data) {
+function decode(data) {
let buf = '';
return stream.transform(data, value => {
buf += value;
@@ -93,27 +93,4 @@ export function decode(data) {
}, () => decodeChunk(buf));
}
-/**
- * Convert a Base-64 encoded string an array of 8-bit integer
- *
- * Note: accepts both Radix-64 and URL-safe strings
- * @param {String} base64 Base-64 encoded string to convert
- * @returns {Uint8Array} An array of 8-bit integers
- */
-export function b64ToUint8Array(base64) {
- return decode(base64.replace(/-/g, '+').replace(/_/g, '/'));
-}
-
-/**
- * Convert an array of 8-bit integer to a Base-64 encoded string
- * @param {Uint8Array} bytes An array of 8-bit integers to convert
- * @param {bool} url If true, output is URL-safe
- * @returns {String} Base-64 encoded string
- */
-export function uint8ArrayToB64(bytes, url) {
- let encoded = encode(bytes).replace(/[\r\n]/g, '');
- if (url) {
- encoded = encoded.replace(/[+]/g, '-').replace(/[/]/g, '_').replace(/[=]/g, '');
- }
- return encoded;
-}
+export default { encode, decode };
diff --git a/src/enums.js b/src/enums.js
index 88fe6ba1..3762ee34 100644
--- a/src/enums.js
+++ b/src/enums.js
@@ -96,11 +96,11 @@ export default {
*/
publicKey: {
/** RSA (Encrypt or Sign) [HAC] */
- rsaEncryptSign: 1,
+ rsa_encrypt_sign: 1,
/** RSA (Encrypt only) [HAC] */
- rsaEncrypt: 2,
+ rsa_encrypt: 2,
/** RSA (Sign only) [HAC] */
- rsaSign: 3,
+ rsa_sign: 3,
/** Elgamal (Encrypt only) [ELGAMAL] [HAC] */
elgamal: 16,
/** DSA (Sign only) [FIPS186] [HAC] */
@@ -126,6 +126,7 @@ export default {
plaintext: 0,
/** Not implemented! */
idea: 1,
+ '3des': 2,
tripledes: 2,
cast5: 3,
blowfish: 4,
@@ -180,7 +181,7 @@ export default {
aead: {
eax: 1,
ocb: 2,
- experimentalGcm: 100 // Private algorithm
+ experimental_gcm: 100 // Private algorithm
},
/** A list of packet types and numeric tags associated with them.
@@ -195,17 +196,17 @@ export default {
secretKey: 5,
publicKey: 6,
secretSubkey: 7,
- compressedData: 8,
- symmetricallyEncryptedData: 9,
+ compressed: 8,
+ symmetricallyEncrypted: 9,
marker: 10,
- literalData: 11,
+ literal: 11,
trust: 12,
- userID: 13,
+ userid: 13,
publicSubkey: 14,
userAttribute: 17,
- symEncryptedIntegrityProtectedData: 18,
+ symEncryptedIntegrityProtected: 18,
modificationDetectionCode: 19,
- AEADEncryptedData: 20 // see IETF draft: https://tools.ietf.org/html/draft-ford-openpgp-format-00#section-2.1
+ symEncryptedAEADProtected: 20 // see IETF draft: https://tools.ietf.org/html/draft-ford-openpgp-format-00#section-2.1
},
/** Data types in the literal packet
@@ -247,17 +248,17 @@ export default {
* The issuer of this certification does not make any particular
* assertion as to how well the certifier has checked that the owner
* of the key is in fact the person described by the User ID. */
- certGeneric: 16,
+ cert_generic: 16,
/** 0x11: Persona certification of a User ID and Public-Key packet.
*
* The issuer of this certification has not done any verification of
* the claim that the owner of this key is the User ID specified. */
- certPersona: 17,
+ cert_persona: 17,
/** 0x12: Casual certification of a User ID and Public-Key packet.
*
* The issuer of this certification has done some casual
* verification of the claim of identity. */
- certCasual: 18,
+ cert_casual: 18,
/** 0x13: Positive certification of a User ID and Public-Key packet.
*
* The issuer of this certification has done substantial
@@ -266,7 +267,7 @@ export default {
* Most OpenPGP implementations make their "key signatures" as 0x10
* certifications. Some implementations can issue 0x11-0x13
* certifications, but few differentiate between the types. */
- certPositive: 19,
+ cert_positive: 19,
/** 0x30: Certification revocation signature
*
* This signature revokes an earlier User ID certification signature
@@ -276,7 +277,7 @@ export default {
* is computed over the same data as the certificate that it
* revokes, and should have a later creation date than that
* certificate. */
- certRevocation: 48,
+ cert_revocation: 48,
/** 0x18: Subkey Binding Signature
*
* This signature is a statement by the top-level signing key that
@@ -286,7 +287,7 @@ export default {
* an Embedded Signature subpacket in this binding signature that
* contains a 0x19 signature made by the signing subkey on the
* primary key and subkey. */
- subkeyBinding: 24,
+ subkey_binding: 24,
/** 0x19: Primary Key Binding Signature
*
* This signature is a statement by a signing subkey, indicating
@@ -301,7 +302,7 @@ export default {
* (type 0x18) or primary key binding signature (type 0x19) then hashes
* the subkey using the same format as the main key (also using 0x99 as
* the first octet). */
- keyBinding: 25,
+ key_binding: 25,
/** 0x1F: Signature directly on a key
*
* This signature is calculated directly on a key. It binds the
@@ -318,7 +319,7 @@ export default {
* revoked key is not to be used. Only revocation signatures by the
* key being revoked, or by an authorized revocation key, should be
* considered valid revocation signatures.a */
- keyRevocation: 32,
+ key_revocation: 32,
/** 0x28: Subkey revocation signature
*
* The signature is calculated directly on the subkey being revoked.
@@ -329,7 +330,7 @@ export default {
*
* Key revocation signatures (types 0x20 and 0x28)
* hash only the key being revoked. */
- subkeyRevocation: 40,
+ subkey_revocation: 40,
/** 0x40: Timestamp signature.
* This signature is only meaningful for the timestamp contained in
* it. */
@@ -343,7 +344,7 @@ export default {
* mean SHOULD. There are plausible uses for this (such as a blind
* party that only sees the signature, not the key or source
* document) that cannot include a target subpacket. */
- thirdParty: 80
+ third_party: 80
},
/** Signature subpacket type
@@ -351,32 +352,32 @@ export default {
* @readonly
*/
signatureSubpacket: {
- signatureCreationTime: 2,
- signatureExpirationTime: 3,
- exportableCertification: 4,
- trustSignature: 5,
- regularExpression: 6,
+ signature_creation_time: 2,
+ signature_expiration_time: 3,
+ exportable_certification: 4,
+ trust_signature: 5,
+ regular_expression: 6,
revocable: 7,
- keyExpirationTime: 9,
- placeholderBackwardsCompatibility: 10,
- preferredSymmetricAlgorithms: 11,
- revocationKey: 12,
+ key_expiration_time: 9,
+ placeholder_backwards_compatibility: 10,
+ preferred_symmetric_algorithms: 11,
+ revocation_key: 12,
issuer: 16,
- notationData: 20,
- preferredHashAlgorithms: 21,
- preferredCompressionAlgorithms: 22,
- keyServerPreferences: 23,
- preferredKeyServer: 24,
- primaryUserId: 25,
- policyUri: 26,
- keyFlags: 27,
- signersUserId: 28,
- reasonForRevocation: 29,
+ notation_data: 20,
+ preferred_hash_algorithms: 21,
+ preferred_compression_algorithms: 22,
+ key_server_preferences: 23,
+ preferred_key_server: 24,
+ primary_user_id: 25,
+ policy_uri: 26,
+ key_flags: 27,
+ signers_user_id: 28,
+ reason_for_revocation: 29,
features: 30,
- signatureTarget: 31,
- embeddedSignature: 32,
- issuerFingerprint: 33,
- preferredAeadAlgorithms: 34
+ signature_target: 31,
+ embedded_signature: 32,
+ issuer_fingerprint: 33,
+ preferred_aead_algorithms: 34
},
/** Key flags
@@ -385,21 +386,21 @@ export default {
*/
keyFlags: {
/** 0x01 - This key may be used to certify other keys. */
- certifyKeys: 1,
+ certify_keys: 1,
/** 0x02 - This key may be used to sign data. */
- signData: 2,
+ sign_data: 2,
/** 0x04 - This key may be used to encrypt communications. */
- encryptCommunication: 4,
+ encrypt_communication: 4,
/** 0x08 - This key may be used to encrypt storage. */
- encryptStorage: 8,
+ encrypt_storage: 8,
/** 0x10 - The private component of this key may have been split
* by a secret-sharing mechanism. */
- splitPrivateKey: 16,
+ split_private_key: 16,
/** 0x20 - This key may be used for authentication. */
authentication: 32,
/** 0x80 - The private component of this key may be in the
* possession of more than one person. */
- sharedPrivateKey: 128
+ shared_private_key: 128
},
/** Armor type
@@ -407,12 +408,12 @@ export default {
* @readonly
*/
armor: {
- multipartSection: 0,
- multipartLast: 1,
+ multipart_section: 0,
+ multipart_last: 1,
signed: 2,
message: 3,
- publicKey: 4,
- privateKey: 5,
+ public_key: 4,
+ private_key: 5,
signature: 6
},
@@ -422,15 +423,15 @@ export default {
*/
reasonForRevocation: {
/** No reason specified (key revocations or cert revocations) */
- noReason: 0,
+ no_reason: 0,
/** Key is superseded (key revocations) */
- keySuperseded: 1,
+ key_superseded: 1,
/** Key material has been compromised (key revocations) */
- keyCompromised: 2,
+ key_compromised: 2,
/** Key is retired and no longer used (key revocations) */
- keyRetired: 3,
+ key_retired: 3,
/** User ID information is no longer valid (cert revocations) */
- userIdInvalid: 32
+ userid_invalid: 32
},
/** {@link https://tools.ietf.org/html/draft-ietf-openpgp-rfc4880bis-04#section-5.2.3.25|RFC4880bis-04, section 5.2.3.25}
@@ -439,13 +440,13 @@ export default {
*/
features: {
/** 0x01 - Modification Detection (packets 18 and 19) */
- modificationDetection: 1,
+ modification_detection: 1,
/** 0x02 - AEAD Encrypted Data Packet (packet 20) and version 5
* Symmetric-Key Encrypted Session Key Packets (packet 3) */
aead: 2,
/** 0x04 - Version 5 Public-Key Packet format and corresponding new
* fingerprint format */
- v5Keys: 4
+ v5_keys: 4
},
/** Asserts validity and converts from string/integer to integer. */
diff --git a/src/hkp.js b/src/hkp.js
index 084bfe3d..f2b1ff05 100644
--- a/src/hkp.js
+++ b/src/hkp.js
@@ -23,68 +23,67 @@
import config from './config';
-class HKP {
- /**
- * Initialize the HKP client and configure it with the key server url and fetch function.
- * @param {String} keyServerBaseUrl (optional) The HKP key server base url including
- * the protocol to use, e.g. 'https://pgp.mit.edu'; defaults to
- * openpgp.config.keyserver (https://keyserver.ubuntu.com)
- */
- constructor(keyServerBaseUrl) {
- this._baseUrl = keyServerBaseUrl || config.keyserver;
- this._fetch = typeof globalThis.fetch === 'function' ? globalThis.fetch : require('node-fetch');
- }
-
- /**
- * Search for a public key on the key server either by key ID or part of the user ID.
- * @param {String} options.keyId The long public key ID.
- * @param {String} options.query This can be any part of the key user ID such as name
- * or email address.
- * @returns {Promise} The ascii armored public key.
- * @async
- */
- lookup(options) {
- let uri = this._baseUrl + '/pks/lookup?op=get&options=mr&search=';
- const fetch = this._fetch;
+/**
+ * Initialize the HKP client and configure it with the key server url and fetch function.
+ * @constructor
+ * @param {String} keyServerBaseUrl (optional) The HKP key server base url including
+ * the protocol to use, e.g. 'https://pgp.mit.edu'; defaults to
+ * openpgp.config.keyserver (https://keyserver.ubuntu.com)
+ */
+function HKP(keyServerBaseUrl) {
+ this._baseUrl = keyServerBaseUrl || config.keyserver;
+ this._fetch = typeof global.fetch === 'function' ? global.fetch : require('node-fetch');
+}
- if (options.keyId) {
- uri += '0x' + encodeURIComponent(options.keyId);
- } else if (options.query) {
- uri += encodeURIComponent(options.query);
- } else {
- throw new Error('You must provide a query parameter!');
- }
+/**
+ * Search for a public key on the key server either by key ID or part of the user ID.
+ * @param {String} options.keyId The long public key ID.
+ * @param {String} options.query This can be any part of the key user ID such as name
+ * or email address.
+ * @returns {Promise} The ascii armored public key.
+ * @async
+ */
+HKP.prototype.lookup = function(options) {
+ let uri = this._baseUrl + '/pks/lookup?op=get&options=mr&search=';
+ const fetch = this._fetch;
- return fetch(uri).then(function(response) {
- if (response.status === 200) {
- return response.text();
- }
- }).then(function(publicKeyArmored) {
- if (!publicKeyArmored || publicKeyArmored.indexOf('-----END PGP PUBLIC KEY BLOCK-----') < 0) {
- return;
- }
- return publicKeyArmored.trim();
- });
+ if (options.keyId) {
+ uri += '0x' + encodeURIComponent(options.keyId);
+ } else if (options.query) {
+ uri += encodeURIComponent(options.query);
+ } else {
+ throw new Error('You must provide a query parameter!');
}
- /**
- * Upload a public key to the server.
- * @param {String} publicKeyArmored An ascii armored public key to be uploaded.
- * @returns {Promise}
- * @async
- */
- upload(publicKeyArmored) {
- const uri = this._baseUrl + '/pks/add';
- const fetch = this._fetch;
+ return fetch(uri).then(function(response) {
+ if (response.status === 200) {
+ return response.text();
+ }
+ }).then(function(publicKeyArmored) {
+ if (!publicKeyArmored || publicKeyArmored.indexOf('-----END PGP PUBLIC KEY BLOCK-----') < 0) {
+ return;
+ }
+ return publicKeyArmored.trim();
+ });
+};
- return fetch(uri, {
- method: 'post',
- headers: {
- 'Content-Type': 'application/x-www-form-urlencoded; charset=UTF-8'
- },
- body: 'keytext=' + encodeURIComponent(publicKeyArmored)
- });
- }
-}
+/**
+ * Upload a public key to the server.
+ * @param {String} publicKeyArmored An ascii armored public key to be uploaded.
+ * @returns {Promise}
+ * @async
+ */
+HKP.prototype.upload = function(publicKeyArmored) {
+ const uri = this._baseUrl + '/pks/add';
+ const fetch = this._fetch;
+
+ return fetch(uri, {
+ method: 'post',
+ headers: {
+ 'Content-Type': 'application/x-www-form-urlencoded; charset=UTF-8'
+ },
+ body: 'keytext=' + encodeURIComponent(publicKeyArmored)
+ });
+};
export default HKP;
diff --git a/src/index.js b/src/index.js
index cf8ccb4b..393b1318 100644
--- a/src/index.js
+++ b/src/index.js
@@ -1,54 +1,104 @@
/* eslint-disable import/newline-after-import, import/first */
/**
- * Export high level API functions.
+ * Export high level api as default.
* Usage:
*
- * import { encrypt } from 'openpgp'
- * encrypt({ message, publicKeys })
+ * import openpgp from 'openpgp.js'
+ * openpgp.encryptMessage(keys, text)
+ */
+import * as openpgp from './openpgp';
+export default openpgp;
+
+/**
+ * Export each high level api function separately.
+ * Usage:
+ *
+ * import { encryptMessage } from 'openpgp.js'
+ * encryptMessage(keys, text)
*/
export {
encrypt, decrypt, sign, verify,
- generateKey, reformatKey, revokeKey, decryptKey, encryptKey,
- generateSessionKey, encryptSessionKey, decryptSessionKeys
+ generateKey, reformatKey, revokeKey, decryptKey,
+ encryptSessionKey, decryptSessionKeys,
+ initWorker, getWorker, destroyWorker
} from './openpgp';
/**
* @see module:key
* @name module:openpgp.key
*/
-export {
- readKey, readArmoredKey,
- readKeys, readArmoredKeys,
- Key
-} from './key';
+import * as keyMod from './key';
+export const key = keyMod;
/**
* @see module:signature
* @name module:openpgp.signature
*/
-export * from './signature';
+import * as signatureMod from './signature';
+export const signature = signatureMod;
/**
* @see module:message
* @name module:openpgp.message
*/
-export {
- readMessage, readArmoredMessage,
- Message
-} from './message';
+import * as messageMod from './message';
+export const message = messageMod;
/**
* @see module:cleartext
* @name module:openpgp.cleartext
*/
-export * from './cleartext';
+import * as cleartextMod from './cleartext';
+export const cleartext = cleartextMod;
+
+/**
+ * @see module:util
+ * @name module:openpgp.util
+ */
+export { default as util } from './util';
/**
* @see module:packet
* @name module:openpgp.packet
*/
-export * from './packet';
+export { default as packet } from './packet';
+
+/**
+ * @see module:type/mpi
+ * @name module:openpgp.MPI
+ */
+export { default as MPI } from './type/mpi';
+
+/**
+ * @see module:type/s2k
+ * @name module:openpgp.S2K
+ */
+export { default as S2K } from './type/s2k';
+
+/**
+ * @see module:type/keyid
+ * @name module:openpgp.Keyid
+ */
+export { default as Keyid } from './type/keyid';
+
+/**
+ * @see module:type/ecdh_symkey
+ * @name module:openpgp.ECDHSymmetricKey
+ */
+export { default as ECDHSymmetricKey } from './type/ecdh_symkey';
+
+/**
+ * @see module:type/kdf_params
+ * @name module:openpgp.KDFParams
+ */
+export { default as KDFParams } from './type/kdf_params';
+
+/**
+ * @see module:type/oid
+ * @name module:openpgp.OID
+ */
+export { default as OID } from './type/oid';
/**
* @see streams
@@ -60,7 +110,7 @@ export { default as stream } from 'web-stream-tools';
* @see module:encoding/armor
* @name module:openpgp.armor
*/
-export * from './encoding/armor';
+export { default as armor } from './encoding/armor';
/**
* @see module:enums
@@ -74,12 +124,24 @@ export { default as enums } from './enums';
*/
export { default as config } from './config/config';
+/**
+ * @see module:crypto
+ * @name module:openpgp.crypto
+ */
+export { default as crypto } from './crypto';
+
/**
* @see module:keyring
* @name module:openpgp.Keyring
*/
export { default as Keyring } from './keyring';
+/**
+ * @see module:worker/async_proxy
+ * @name module:openpgp.AsyncProxy
+ */
+export { default as AsyncProxy } from './worker/async_proxy';
+
/**
* @see module:hkp
* @name module:openpgp.HKP
@@ -91,3 +153,9 @@ export { default as HKP } from './hkp';
* @name module:openpgp.WKD
*/
export { default as WKD } from './wkd';
+
+/**
+ * @see module:lightweight
+ */
+import * as lightweightMod from './lightweight_helper';
+export const lightweight = lightweightMod;
diff --git a/src/key/factory.js b/src/key/factory.js
index 735d9a15..0cb6920e 100644
--- a/src/key/factory.js
+++ b/src/key/factory.js
@@ -27,26 +27,31 @@
* @module key/factory
*/
-import { PacketList, UserIDPacket, SignaturePacket } from '../packet';
+import packet from '../packet';
import Key from './key';
import * as helper from './helper';
import enums from '../enums';
import util from '../util';
import config from '../config';
-import { unarmor } from '../encoding/armor';
+import armor from '../encoding/armor';
/**
* Generates a new OpenPGP key. Supports RSA and ECC keys.
- * By default, primary and subkeys will be of same type.
- * @param {ecc|rsa} options.type The primary key algorithm type: ECC or RSA
- * @param {String} options.curve Elliptic curve for ECC keys
- * @param {Integer} options.rsaBits Number of bits for RSA keys
- * @param {Array} options.userIds User IDs as strings or objects: 'Jo Doe ' or { name:'Jo Doe', email:'info@jo.com' }
- * @param {String} options.passphrase Passphrase used to encrypt the resulting private key
- * @param {Number} options.keyExpirationTime (optional) Number of seconds from the key creation time after which the key expires
- * @param {Date} options.date Creation date of the key and the key signatures
- * @param {Array