├── .dockerignore ├── .gitignore ├── Dockerfile ├── LICENCE ├── README.md ├── apps └── service.js ├── index.js ├── libs └── utils.js ├── models ├── index.js ├── secrets.js ├── transactions.js └── utils.js ├── package.json └── yarn.lock /.dockerignore: -------------------------------------------------------------------------------- 1 | node_modules 2 | .env 3 | .k8s 4 | deploy.sh -------------------------------------------------------------------------------- /.gitignore: -------------------------------------------------------------------------------- 1 | node_modules 2 | .env 3 | .k8s 4 | deploy.sh -------------------------------------------------------------------------------- /Dockerfile: -------------------------------------------------------------------------------- 1 | FROM node:10 as build 2 | WORKDIR /app 3 | COPY . . 4 | RUN yarn install --production=true 5 | 6 | FROM node:10 7 | COPY --from=build /app / 8 | CMD ["yarn", "service"] -------------------------------------------------------------------------------- /LICENCE: -------------------------------------------------------------------------------- 1 | MIT License 2 | 3 | Copyright (c) 4 | 5 | Permission is hereby granted, free of charge, to any person obtaining a copy 6 | of this software and associated documentation files (the "Software"), to deal 7 | in the Software without restriction, including without limitation the rights 8 | to use, copy, modify, merge, publish, distribute, sublicense, and/or sell 9 | copies of the Software, and to permit persons to whom the Software is 10 | furnished to do so, subject to the following conditions: 11 | 12 | The above copyright notice and this permission notice shall be included in all 13 | copies or substantial portions of the Software. 14 | 15 | THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR 16 | IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, 17 | FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE 18 | AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER 19 | LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, 20 | OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE 21 | SOFTWARE. 22 | -------------------------------------------------------------------------------- /README.md: -------------------------------------------------------------------------------- 1 | # CryptAPI-Service Introduction 2 | This service is a thin layer on top of the [cryptapi](https://cryptapi.io/) cryptocurrency payment gateway. 3 | Internally we utilize our Nodejs Library [cryptapi](https://github.com/tacyarg/cryptapi), to get started you may want to have a look there. 4 | 5 | > Bitcoin, Bitcoin Cash, Litecoin, Ethereum, Monero, IOTA, ... 6 | 7 | ## What does this service do? 8 | This service allows anyone to easliy start and maintain a fully functional payment gatewayAPI. Create transactions, process payments, using any currency supported by cryptapi. Simply start the service, interact with the api, and process crypto payments. 9 | 10 | ## What problem does this solve? 11 | This service solves the problem of not having a way to transactionally facillitate deposits & withdraws using the [cryptapi](https://cryptapi.io/). This thin layer uses our wrapper and some application logic to create an abstraction. This abstraction allows our service to provide a simple and easy to use api, without having low-level understanding of the underlying [cryptapi](https://github.com/tacyarg/cryptapi). 12 | 13 | ## Why would I use this insted of the api directly? 14 | When using the [cryptapi](https://cryptapi.io/) directy, by design, you have no way historically obtain transactions other than by using the `callbackURL` to listen for completed transactions and storing that locally. When having to do this, it makes things complicated to store and trace due to the requirement of always needing to have a listener online. This service solves this by allowing you to replicate horizontally with a basic efemeral instance. 15 | 16 | ## How do I know this code is stable? 17 | We maintain and support this library for you, here at [ChipSoft](https://chips.gg). This allows you to focus on intigrating payment solutions rather than worrying about the implementation details. Using this lib, you can have a working payment processed in minutes, no signup required. 18 | 19 | 20 | # Installation & Use 21 | Below is a simple guide on how to install and utilize the service. 22 | 23 | ### 1. Installation 24 | 25 | ```bash 26 | git clone git@github.com:tacyarg/cryptapi-service.git 27 | ``` 28 | 29 | ### 2. Setup .ENV 30 | ```env 31 | btcAddress= 32 | ethAddress= 33 | bchAddress= 34 | xlmAddres= 35 | 36 | callbackURL=https://localhost:3000/handleCallback 37 | port=3000 38 | name=service 39 | 40 | coinLimit=0.001 41 | currency=USD 42 | ``` 43 | 44 | ### 3. Startup 45 | 46 | ```js 47 | yarn service 48 | npm start service 49 | ``` 50 | 51 | # Maintenance 52 | The main drawback of [cryptapi](https://cryptapi.io/) is that this service has a requirement to remain online at all times. With its low overhead and simple deployment, this task is easily managed with kubernetes. Additionally, we recommend a management layer be maintained in your application. This service will allow you to recover any missed payments in the event of network failure. **See [cryptapi](https://github.com/tacyarg/cryptapi) For More Details.** 53 | 54 | ----- 55 | 56 | ### NOTICE 57 | > In a future update we plan to attempt "auto-recovery" to handle this event for you. Each "transaction" creates a unique `callbackURL`, doing so, we should be able to recover the complete blockchain history for that address as long as we resume service within a realatively timely manor. For the time being, you will need to do that yourself. 58 | 59 | -------------------------------------------------------------------------------- /apps/service.js: -------------------------------------------------------------------------------- 1 | const assert = require('assert') 2 | const cryptapi = require('cryptapi')() 3 | const { loop, ONE_MINUTE_MS, parseUSD } = require('../libs/utils') 4 | 5 | module.exports = async config => { 6 | console.log(config) 7 | const { callbackURL } = config 8 | assert(callbackURL, 'requires callbackURL') 9 | 10 | const { transactions, secrets } = require('../models')(config) 11 | 12 | // cache the exchange rates for btc every min 13 | let EXCHANGE_RATES = {} 14 | loop(async () => { 15 | const tickers = cryptapi.getSupportedTickers() 16 | 17 | for (t of tickers) { 18 | const { prices } = await cryptapi._getInfo(t) 19 | // console.log('_getInfo', t, prices) 20 | const keys = Object.keys(prices) 21 | EXCHANGE_RATES[t] = keys.reduce((memo, k) => { 22 | memo[k] = parseFloat(prices[k]) 23 | return memo 24 | }, {}) 25 | } 26 | 27 | }, ONE_MINUTE_MS) 28 | 29 | 30 | const listTickers = () => { 31 | return Object.keys(EXCHANGE_RATES) 32 | } 33 | 34 | const isTickerValid = t => { 35 | return EXCHANGE_RATES[t] 36 | } 37 | 38 | const getExchangeRates = (ticker, currency = config.currency, amount = 1) => { 39 | const _error = `Please provide one of the following tickers: ${listTickers()}` 40 | assert(ticker, _error) 41 | assert(EXCHANGE_RATES[ticker], _error) 42 | const currencies = Object.keys(EXCHANGE_RATES[ticker]) 43 | assert(EXCHANGE_RATES[ticker][currency], `Please provide once of the following currencies: ${currencies}`) 44 | 45 | const rates = EXCHANGE_RATES[ticker] 46 | return currency ? parseUSD(rates[currency] * amount) : rates 47 | } 48 | 49 | // public API 50 | return { 51 | async getSupportedTickers() { 52 | return cryptapi.getSupportedTickers() 53 | }, 54 | async getTickerExchangeRates({ ticker, currency = config.currency, amount }) { 55 | return getExchangeRates(ticker, currency, amount) 56 | }, 57 | async handleCallback({ txid, secret, ...params }) { 58 | console.log('handleCallback', txid, params) 59 | 60 | // does the tx exist? 61 | const tx = transactions.get(txid) 62 | assert(tx, `no transaction found using id:${txid}`) 63 | 64 | /// does the secret match? 65 | const s = secrets.get(secret) 66 | assert(s, `secret not found`) 67 | assert(s.txid === txid, `invalid secret found for id:${txid}`) 68 | 69 | // if the tx and secret are valid, we allow the caller to update the state. 70 | const confirmations = parseInt(params.confirmations) || 0 71 | return transactions.set({ 72 | ...tx, 73 | confirmations, 74 | txidIn: params.txid_in, 75 | txidOut: params.txid_out, 76 | value: params.value, 77 | valueForwarded: params.value_forwarded, 78 | status: confirmations > 1 ? 'completed' : 'waitConfirmations' 79 | }) 80 | }, 81 | async getTransaction({ transactionid }) { 82 | return transactions.get(transactionid) 83 | }, 84 | async listTransactions() { 85 | return [...transactions.values()] 86 | }, 87 | async listTransactionsByType(type = 'btc') { 88 | return transactions.getBy('type', type) 89 | }, 90 | async createTransaction({ ticker, amount, to, from }) { 91 | assert(ticker, `Please provide one of the following tickers: ${listTickers()}`) 92 | assert(isTickerValid(ticker), `Please provide one of the following tickers: ${listTickers()}`) 93 | 94 | amount = parseFloat(amount) 95 | assert(amount >= config.coinLimit, `requires amount of at least ${config.coinLimit} btc`) 96 | 97 | const currencyValue = getExchangeRates(ticker, config.currency, amount) 98 | 99 | // create a tx and secret to pass to our trusted caller. 100 | const address = config[`${ticker}Address`] 101 | assert(address, 'please provide the supported ticker address in your .env') 102 | 103 | const tx = transactions.create(amount, address) 104 | const secret = secrets.create(tx.id) 105 | 106 | // call our payment processor including the secret. 107 | const api = await cryptapi._createAddress(ticker, address, `${callbackURL}?txid=${tx.id}&secret=${secret.id}`, { pending: 1 }) 108 | assert(api, 'cryptapi._createAddress failure') 109 | assert(api.address_in, 'cryptapi._createAddress failure') 110 | 111 | // save the caller's resoponse so we can reference it later. 112 | return transactions.update(tx.id, { 113 | currencyValue, 114 | currency: config.currency, 115 | type: 'btc', 116 | from: api.address_in, 117 | to: api.address_out, 118 | callbackURL: api.callback_url, 119 | qr: `https://chart.googleapis.com/chart?chs=200x200&cht=qr&chl=bitcoin:${api.address_in}?amount=${amount}`, 120 | // qr: `https://api.qrserver.com/v1/create-qr-code/?size=250x250&data=bitcoin:${api.address_in}?amount=${amount}`, 121 | // to, from // if the user wants a custom reciving address 122 | }) 123 | } 124 | } 125 | } -------------------------------------------------------------------------------- /index.js: -------------------------------------------------------------------------------- 1 | require('dotenv').config() 2 | const assert = require('assert') 3 | const { parseEnv } = require('./libs/utils') 4 | 5 | const config = parseEnv(process.env) 6 | assert(config.name, 'app requires a name') 7 | 8 | const App = require(`./apps/${config.name}`) 9 | assert(App, 'app not found') 10 | 11 | const Web = require('actions-http') 12 | 13 | App(config) 14 | .then((x={}) => { 15 | console.log(config.name, 'Online') 16 | return Web(config, x) 17 | }) 18 | .catch(e => { 19 | console.log(e) 20 | process.exit(1) 21 | }) 22 | 23 | process.on('unhandledRejection', function(err, promise) { 24 | console.log(err) 25 | process.exit(1) 26 | }) 27 | process.on('uncaughtException', function(err) { 28 | console.log(err.stack) 29 | process.exit(1) 30 | }) 31 | -------------------------------------------------------------------------------- /libs/utils.js: -------------------------------------------------------------------------------- 1 | const lodash = require('lodash') 2 | const moment = require('moment') 3 | 4 | exports.ONE_MINUTE_MS = 60 * 1000 5 | exports.ONE_HOUR_MS = 60 * exports.ONE_MINUTE_MS 6 | exports.ONE_DAY_MS = 24 * exports.ONE_HOUR_MS 7 | 8 | exports.loop = async (fn, delay = 1000, max, count = 0, result) => { 9 | if (max && count >= max) return result 10 | result = await fn(count) 11 | await new Promise(res => setTimeout(res, delay)) 12 | return exports.loop(fn, delay, max, count + 1, result) 13 | } 14 | 15 | exports.isEnvArray = (value = '') => { 16 | return value.toString().includes(',') 17 | } 18 | 19 | const isLower = new RegExp('^[a-z0-9]') 20 | exports.isEnvParsable = key => { 21 | return isLower.test(key) 22 | } 23 | 24 | exports.parseEnvArray = value => { 25 | return lodash(value.split(',')) 26 | .map(x => x.trim()) 27 | .compact() 28 | .value() 29 | } 30 | 31 | exports.mapValues = (kv, valueFn) => { 32 | return lodash.reduce( 33 | kv, 34 | (result, value, key) => { 35 | result[key] = valueFn(value) 36 | return result 37 | }, 38 | {} 39 | ) 40 | } 41 | 42 | exports.parseEnv = env => { 43 | return lodash.reduce( 44 | env, 45 | (result, value, key) => { 46 | if (!exports.isEnvParsable(key)) return result 47 | const path = key.split('.') 48 | let val = value 49 | if (exports.isEnvArray(value)) { 50 | val = exports.parseEnvArray(value) 51 | } 52 | lodash.set(result, path, val) 53 | return result 54 | }, 55 | {} 56 | ) 57 | } 58 | 59 | // TIME SHIT FOR STATS 60 | 61 | exports.defaultHourly = function (stats) { 62 | return lodash.defaults(stats, { 63 | done: false, 64 | name: 'hourly', 65 | start: moment() 66 | .startOf('hour') 67 | .valueOf(), 68 | end: moment() 69 | .endOf('hour') 70 | .valueOf(), 71 | }) 72 | } 73 | exports.defaultDaily = function (stats) { 74 | return lodash.defaults(stats, { 75 | done: false, 76 | name: 'daily', 77 | start: moment() 78 | .startOf('day') 79 | .valueOf(), 80 | end: moment() 81 | .endOf('day') 82 | .valueOf(), 83 | }) 84 | } 85 | exports.defaultWeekly = function (stats) { 86 | return lodash.defaults(stats, { 87 | done: false, 88 | name: 'weekly', 89 | start: moment() 90 | .startOf('week') 91 | .valueOf(), 92 | end: moment() 93 | .endOf('week') 94 | .valueOf(), 95 | }) 96 | } 97 | exports.defaultMonthly = function (stats) { 98 | return lodash.defaults(stats, { 99 | done: false, 100 | name: 'monthly', 101 | start: moment() 102 | .startOf('month') 103 | .valueOf(), 104 | end: moment() 105 | .endOf('month') 106 | .valueOf(), 107 | }) 108 | } 109 | exports.defaultAllTime = function (stats) { 110 | return lodash.defaults(stats, { 111 | done: false, 112 | name: 'allTime', 113 | start: 0, 114 | end: 99999999999999999999, 115 | }) 116 | } 117 | 118 | exports.generateDefaults = function (name) { 119 | switch (name) { 120 | case 'hourly': 121 | return exports.defaultHourly() 122 | case 'daily': 123 | return exports.defaultDaily() 124 | case 'weekly': 125 | return exports.defaultWeekly() 126 | case 'monthly': 127 | return exports.defaultMonthly() 128 | case 'allTime': 129 | return exports.defaultAllTime() 130 | } 131 | } 132 | 133 | exports.makeID = function (start, end) { 134 | return [start, end].join('_') 135 | } 136 | 137 | exports.parseUSD = (value=0) => Math.round(Number(value) * 100) / 100 -------------------------------------------------------------------------------- /models/index.js: -------------------------------------------------------------------------------- 1 | const Transactions = require('./transactions') 2 | const Secrets = require('./secrets') 3 | const { CreateMemtable } = require('./utils') 4 | 5 | // NOTE: config will later be used for database credentials. 6 | module.exports = (config = {}) => { 7 | return { 8 | transactions: Transactions(config, CreateMemtable()), 9 | secrets: Secrets(config, CreateMemtable()) 10 | } 11 | } -------------------------------------------------------------------------------- /models/secrets.js: -------------------------------------------------------------------------------- 1 | const uuid = require('uuid/v4') 2 | const assert = require('assert') 3 | const lodash = require('lodash') 4 | 5 | const Defaults = p => { 6 | return { 7 | id: uuid(), 8 | type: 'secret', 9 | created: Date.now(), 10 | updated: Date.now(), 11 | ...p 12 | } 13 | } 14 | 15 | module.exports = (config, table) => { 16 | return { 17 | ...table, 18 | create(txid) { 19 | const tx = Defaults({ txid }) 20 | return table.set(tx) 21 | } 22 | } 23 | } 24 | 25 | -------------------------------------------------------------------------------- /models/transactions.js: -------------------------------------------------------------------------------- 1 | const uuid = require('uuid/v4') 2 | const assert = require('assert') 3 | const lodash = require('lodash') 4 | 5 | const Defaults = p => { 6 | return { 7 | id: uuid(), 8 | type: 'basic', 9 | created: Date.now(), 10 | updated: Date.now(), 11 | callbackURL: null, 12 | to: null, 13 | from: null, 14 | status: 'pending', // 'waitConfirmation', 'completed' 15 | confirmations: 0, 16 | ...p 17 | } 18 | } 19 | 20 | module.exports = (config, table) => { 21 | 22 | return { 23 | ...table, 24 | create(amount, to) { 25 | assert(amount, 'requires amount') 26 | assert(lodash.isFinite(amount), 'requires amount') 27 | assert(amount >= config.coinLimit, 'requires amount > 0.001') 28 | assert(to, 'requires to') 29 | 30 | const tx = Defaults({ to, amount }) 31 | return table.set(tx) 32 | } 33 | } 34 | } 35 | 36 | -------------------------------------------------------------------------------- /models/utils.js: -------------------------------------------------------------------------------- 1 | const Table = require('memtable') 2 | const lodash = require('lodash') 3 | exports.CreateMemtable = (cfg={}) => { 4 | return Table({ 5 | primary: 'id', 6 | indexes: [ 7 | { name: 'type', required: true, unique: false, index: 'type' }, 8 | // { name: 'login', required: true, unique: true, index: 'login' }, 9 | // { name: 'email', required: false, unique: true, index: 'email' }, 10 | // { name: 'name', required: false, unique: false, index: 'name' }, 11 | ], 12 | //Pre save hook, allows for mutations, side effects or validations 13 | preSet: x => { 14 | // //validate data 15 | // validateUser(x) 16 | //clone our data so it does not get modified outside table 17 | x = lodash.clone(x) 18 | //always make sure we have an updated timestamp before saving 19 | x.updated = Date.now() 20 | return x 21 | }, 22 | ...cfg 23 | }) 24 | } -------------------------------------------------------------------------------- /package.json: -------------------------------------------------------------------------------- 1 | { 2 | "name": "cryptapi-service", 3 | "version": "1.0.0", 4 | "main": "index.js", 5 | "license": "MIT", 6 | "dependencies": { 7 | "actions-http": "^2.0.13", 8 | "cryptapi": "^1.1.2", 9 | "dotenv": "^8.2.0", 10 | "lodash": "^4.17.21", 11 | "memtable": "^2.0.0-alpha.12", 12 | "moment": "^2.24.0", 13 | "unirest": "^0.6.0", 14 | "url-join": "^4.0.1", 15 | "uuid": "^3.3.3" 16 | }, 17 | "scripts": { 18 | "start": "node index.js --max_old_space_size=4096", 19 | "service": "name=service yarn start" 20 | } 21 | } 22 | -------------------------------------------------------------------------------- /yarn.lock: -------------------------------------------------------------------------------- 1 | # THIS IS AN AUTOGENERATED FILE. DO NOT EDIT THIS FILE DIRECTLY. 2 | # yarn lockfile v1 3 | 4 | 5 | accepts@~1.3.7: 6 | version "1.3.7" 7 | resolved "https://registry.yarnpkg.com/accepts/-/accepts-1.3.7.tgz#531bc726517a3b2b41f850021c6cc15eaab507cd" 8 | integrity sha512-Il80Qs2WjYlJIBNzNkK6KYqlVMTbZLXgHx2oT0pU/fjRHyEp+PEfEPY0R3WCwAGVOtauxh1hOxNgIf5bv7dQpA== 9 | dependencies: 10 | mime-types "~2.1.24" 11 | negotiator "0.6.2" 12 | 13 | actions-http@^2.0.13: 14 | version "2.0.13" 15 | resolved "https://registry.yarnpkg.com/actions-http/-/actions-http-2.0.13.tgz#9c4767bb3f31ada15222413fb1595fa9ca4f01c1" 16 | integrity sha512-DBtnZG6QRVGfwwOp3TrpXliH5b6fb4iSybxelRRPm6QUklKxSL16qfNagWIdI1ekpN65KvzuDi5SVSHck+mqNQ== 17 | dependencies: 18 | body-parser "^1.19.0" 19 | cookie-parser "^1.4.4" 20 | cors "^2.8.5" 21 | express "^4.17.1" 22 | express-bearer-token "^2.4.0" 23 | uWebSockets.js uNetworking/uWebSockets.js#v15.4.0 24 | 25 | ajv@^6.5.5: 26 | version "6.10.2" 27 | resolved "https://registry.yarnpkg.com/ajv/-/ajv-6.10.2.tgz#d3cea04d6b017b2894ad69040fec8b623eb4bd52" 28 | integrity sha512-TXtUUEYHuaTEbLZWIKUr5pmBuhDLy+8KYtPYdcV8qC+pOZL+NKqYwvWSRrVXHn+ZmRRAu8vJTAznH7Oag6RVRw== 29 | dependencies: 30 | fast-deep-equal "^2.0.1" 31 | fast-json-stable-stringify "^2.0.0" 32 | json-schema-traverse "^0.4.1" 33 | uri-js "^4.2.2" 34 | 35 | array-flatten@1.1.1: 36 | version "1.1.1" 37 | resolved "https://registry.yarnpkg.com/array-flatten/-/array-flatten-1.1.1.tgz#9a5f699051b1e7073328f2a008968b64ea2955d2" 38 | integrity sha1-ml9pkFGx5wczKPKgCJaLZOopVdI= 39 | 40 | asn1@~0.2.3: 41 | version "0.2.4" 42 | resolved "https://registry.yarnpkg.com/asn1/-/asn1-0.2.4.tgz#8d2475dfab553bb33e77b54e59e880bb8ce23136" 43 | integrity sha512-jxwzQpLQjSmWXgwaCZE9Nz+glAG01yF1QnWgbhGwHI5A6FRIEY6IVqtHhIepHqI7/kyEyQEagBC5mBEFlIYvdg== 44 | dependencies: 45 | safer-buffer "~2.1.0" 46 | 47 | assert-plus@1.0.0, assert-plus@^1.0.0: 48 | version "1.0.0" 49 | resolved "https://registry.yarnpkg.com/assert-plus/-/assert-plus-1.0.0.tgz#f12e0f3c5d77b0b1cdd9146942e4e96c1e4dd525" 50 | integrity sha1-8S4PPF13sLHN2RRpQuTpbB5N1SU= 51 | 52 | async@~0.9.0: 53 | version "0.9.2" 54 | resolved "https://registry.yarnpkg.com/async/-/async-0.9.2.tgz#aea74d5e61c1f899613bf64bda66d4c78f2fd17d" 55 | integrity sha1-rqdNXmHB+JlhO/ZL2mbUx48v0X0= 56 | 57 | asynckit@^0.4.0: 58 | version "0.4.0" 59 | resolved "https://registry.yarnpkg.com/asynckit/-/asynckit-0.4.0.tgz#c79ed97f7f34cb8f2ba1bc9790bcc366474b4b79" 60 | integrity sha1-x57Zf380y48robyXkLzDZkdLS3k= 61 | 62 | aws-sign2@~0.7.0: 63 | version "0.7.0" 64 | resolved "https://registry.yarnpkg.com/aws-sign2/-/aws-sign2-0.7.0.tgz#b46e890934a9591f2d2f6f86d7e6a9f1b3fe76a8" 65 | integrity sha1-tG6JCTSpWR8tL2+G1+ap8bP+dqg= 66 | 67 | aws4@^1.8.0: 68 | version "1.9.0" 69 | resolved "https://registry.yarnpkg.com/aws4/-/aws4-1.9.0.tgz#24390e6ad61386b0a747265754d2a17219de862c" 70 | integrity sha512-Uvq6hVe90D0B2WEnUqtdgY1bATGz3mw33nH9Y+dmA+w5DHvUmBgkr5rM/KCHpCsiFNRUfokW/szpPPgMK2hm4A== 71 | 72 | bcrypt-pbkdf@^1.0.0: 73 | version "1.0.2" 74 | resolved "https://registry.yarnpkg.com/bcrypt-pbkdf/-/bcrypt-pbkdf-1.0.2.tgz#a4301d389b6a43f9b67ff3ca11a3f6637e360e9e" 75 | integrity sha1-pDAdOJtqQ/m2f/PKEaP2Y342Dp4= 76 | dependencies: 77 | tweetnacl "^0.14.3" 78 | 79 | body-parser@1.19.0, body-parser@^1.19.0: 80 | version "1.19.0" 81 | resolved "https://registry.yarnpkg.com/body-parser/-/body-parser-1.19.0.tgz#96b2709e57c9c4e09a6fd66a8fd979844f69f08a" 82 | integrity sha512-dhEPs72UPbDnAQJ9ZKMNTP6ptJaionhP5cBb541nXPlW60Jepo9RV/a4fX4XWW9CuFNK22krhrj1+rgzifNCsw== 83 | dependencies: 84 | bytes "3.1.0" 85 | content-type "~1.0.4" 86 | debug "2.6.9" 87 | depd "~1.1.2" 88 | http-errors "1.7.2" 89 | iconv-lite "0.4.24" 90 | on-finished "~2.3.0" 91 | qs "6.7.0" 92 | raw-body "2.4.0" 93 | type-is "~1.6.17" 94 | 95 | bytes@3.1.0: 96 | version "3.1.0" 97 | resolved "https://registry.yarnpkg.com/bytes/-/bytes-3.1.0.tgz#f6cf7933a360e0588fa9fde85651cdc7f805d1f6" 98 | integrity sha512-zauLjrfCG+xvoyaqLoV8bLVXXNGC4JqlxFCutSDWA6fJrTo2ZuvLYTqZ7aHBLZSMOopbzwv8f+wZcVzfVTI2Dg== 99 | 100 | caseless@~0.12.0: 101 | version "0.12.0" 102 | resolved "https://registry.yarnpkg.com/caseless/-/caseless-0.12.0.tgz#1b681c21ff84033c826543090689420d187151dc" 103 | integrity sha1-G2gcIf+EAzyCZUMJBolCDRhxUdw= 104 | 105 | combined-stream@^1.0.6, combined-stream@~1.0.6: 106 | version "1.0.8" 107 | resolved "https://registry.yarnpkg.com/combined-stream/-/combined-stream-1.0.8.tgz#c3d45a8b34fd730631a110a8a2520682b31d5a7f" 108 | integrity sha512-FQN4MRfuJeHf7cBbBMJFXhKSDq+2kAArBlmRBvcvFE5BB1HZKXtSFASDhdlz9zOYwxh8lDdnvmMOe/+5cdoEdg== 109 | dependencies: 110 | delayed-stream "~1.0.0" 111 | 112 | combined-stream@~0.0.4: 113 | version "0.0.7" 114 | resolved "https://registry.yarnpkg.com/combined-stream/-/combined-stream-0.0.7.tgz#0137e657baa5a7541c57ac37ac5fc07d73b4dc1f" 115 | integrity sha1-ATfmV7qlp1QcV6w3rF/AfXO03B8= 116 | dependencies: 117 | delayed-stream "0.0.5" 118 | 119 | content-disposition@0.5.3: 120 | version "0.5.3" 121 | resolved "https://registry.yarnpkg.com/content-disposition/-/content-disposition-0.5.3.tgz#e130caf7e7279087c5616c2007d0485698984fbd" 122 | integrity sha512-ExO0774ikEObIAEV9kDo50o+79VCUdEB6n6lzKgGwupcVeRlhrj3qGAfwq8G6uBJjkqLrhT0qEYFcWng8z1z0g== 123 | dependencies: 124 | safe-buffer "5.1.2" 125 | 126 | content-type@~1.0.4: 127 | version "1.0.4" 128 | resolved "https://registry.yarnpkg.com/content-type/-/content-type-1.0.4.tgz#e138cc75e040c727b1966fe5e5f8c9aee256fe3b" 129 | integrity sha512-hIP3EEPs8tB9AT1L+NUqtwOAps4mk2Zob89MWXMHjHWg9milF/j4osnnQLXBCBFBk/tvIG/tUc9mOUJiPBhPXA== 130 | 131 | cookie-parser@^1.4.4: 132 | version "1.4.4" 133 | resolved "https://registry.yarnpkg.com/cookie-parser/-/cookie-parser-1.4.4.tgz#e6363de4ea98c3def9697b93421c09f30cf5d188" 134 | integrity sha512-lo13tqF3JEtFO7FyA49CqbhaFkskRJ0u/UAiINgrIXeRCY41c88/zxtrECl8AKH3B0hj9q10+h3Kt8I7KlW4tw== 135 | dependencies: 136 | cookie "0.3.1" 137 | cookie-signature "1.0.6" 138 | 139 | cookie-signature@1.0.6: 140 | version "1.0.6" 141 | resolved "https://registry.yarnpkg.com/cookie-signature/-/cookie-signature-1.0.6.tgz#e303a882b342cc3ee8ca513a79999734dab3ae2c" 142 | integrity sha1-4wOogrNCzD7oylE6eZmXNNqzriw= 143 | 144 | cookie@0.3.1, cookie@^0.3.1: 145 | version "0.3.1" 146 | resolved "https://registry.yarnpkg.com/cookie/-/cookie-0.3.1.tgz#e7e0a1f9ef43b4c8ba925c5c5a96e806d16873bb" 147 | integrity sha1-5+Ch+e9DtMi6klxcWpboBtFoc7s= 148 | 149 | cookie@0.4.0: 150 | version "0.4.0" 151 | resolved "https://registry.yarnpkg.com/cookie/-/cookie-0.4.0.tgz#beb437e7022b3b6d49019d088665303ebe9c14ba" 152 | integrity sha512-+Hp8fLp57wnUSt0tY0tHEXh4voZRDnoIrZPqlo3DPiI4y9lwg/jqx+1Om94/W6ZaPDOUbnjOt/99w66zk+l1Xg== 153 | 154 | core-util-is@1.0.2: 155 | version "1.0.2" 156 | resolved "https://registry.yarnpkg.com/core-util-is/-/core-util-is-1.0.2.tgz#b5fd54220aa2bc5ab57aab7140c940754503c1a7" 157 | integrity sha1-tf1UIgqivFq1eqtxQMlAdUUDwac= 158 | 159 | cors@^2.8.5: 160 | version "2.8.5" 161 | resolved "https://registry.yarnpkg.com/cors/-/cors-2.8.5.tgz#eac11da51592dd86b9f06f6e7ac293b3df875d29" 162 | integrity sha512-KIHbLJqu73RGr/hnbrO9uBeixNGuvSQjul/jdFvS/KFSIH1hWVd1ng7zOHx+YrEfInLG7q4n6GHQ9cDtxv/P6g== 163 | dependencies: 164 | object-assign "^4" 165 | vary "^1" 166 | 167 | cryptapi@^1.1.2: 168 | version "1.1.2" 169 | resolved "https://registry.yarnpkg.com/cryptapi/-/cryptapi-1.1.2.tgz#328a48067a42432c3267991d7daf4272b7f7d152" 170 | integrity sha512-3WFnd4enLFDUE87PvU4nxMevdTrK56umqlhPZ2kHAmfIcS+2afTHIKzBd6ioXrEwk+i1uYUng0m7fAaapMVmqA== 171 | dependencies: 172 | unirest "^0.6.0" 173 | url-join "^4.0.1" 174 | 175 | dashdash@^1.12.0: 176 | version "1.14.1" 177 | resolved "https://registry.yarnpkg.com/dashdash/-/dashdash-1.14.1.tgz#853cfa0f7cbe2fed5de20326b8dd581035f6e2f0" 178 | integrity sha1-hTz6D3y+L+1d4gMmuN1YEDX24vA= 179 | dependencies: 180 | assert-plus "^1.0.0" 181 | 182 | debug@2.6.9: 183 | version "2.6.9" 184 | resolved "https://registry.yarnpkg.com/debug/-/debug-2.6.9.tgz#5d128515df134ff327e90a4c93f4e077a536341f" 185 | integrity sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA== 186 | dependencies: 187 | ms "2.0.0" 188 | 189 | delayed-stream@0.0.5: 190 | version "0.0.5" 191 | resolved "https://registry.yarnpkg.com/delayed-stream/-/delayed-stream-0.0.5.tgz#d4b1f43a93e8296dfe02694f4680bc37a313c73f" 192 | integrity sha1-1LH0OpPoKW3+AmlPRoC8N6MTxz8= 193 | 194 | delayed-stream@~1.0.0: 195 | version "1.0.0" 196 | resolved "https://registry.yarnpkg.com/delayed-stream/-/delayed-stream-1.0.0.tgz#df3ae199acadfb7d440aaae0b29e2272b24ec619" 197 | integrity sha1-3zrhmayt+31ECqrgsp4icrJOxhk= 198 | 199 | depd@~1.1.2: 200 | version "1.1.2" 201 | resolved "https://registry.yarnpkg.com/depd/-/depd-1.1.2.tgz#9bcd52e14c097763e749b274c4346ed2e560b5a9" 202 | integrity sha1-m81S4UwJd2PnSbJ0xDRu0uVgtak= 203 | 204 | destroy@~1.0.4: 205 | version "1.0.4" 206 | resolved "https://registry.yarnpkg.com/destroy/-/destroy-1.0.4.tgz#978857442c44749e4206613e37946205826abd80" 207 | integrity sha1-l4hXRCxEdJ5CBmE+N5RiBYJqvYA= 208 | 209 | dotenv@^8.2.0: 210 | version "8.2.0" 211 | resolved "https://registry.yarnpkg.com/dotenv/-/dotenv-8.2.0.tgz#97e619259ada750eea3e4ea3e26bceea5424b16a" 212 | integrity sha512-8sJ78ElpbDJBHNeBzUbUVLsqKdccaa/BXF1uPTw3GrvQTBgrQrtObr2mUrE38vzYd8cEv+m/JBfDLioYcfXoaw== 213 | 214 | ecc-jsbn@~0.1.1: 215 | version "0.1.2" 216 | resolved "https://registry.yarnpkg.com/ecc-jsbn/-/ecc-jsbn-0.1.2.tgz#3a83a904e54353287874c564b7549386849a98c9" 217 | integrity sha1-OoOpBOVDUyh4dMVkt1SThoSamMk= 218 | dependencies: 219 | jsbn "~0.1.0" 220 | safer-buffer "^2.1.0" 221 | 222 | ee-first@1.1.1: 223 | version "1.1.1" 224 | resolved "https://registry.yarnpkg.com/ee-first/-/ee-first-1.1.1.tgz#590c61156b0ae2f4f0255732a158b266bc56b21d" 225 | integrity sha1-WQxhFWsK4vTwJVcyoViyZrxWsh0= 226 | 227 | encodeurl@~1.0.2: 228 | version "1.0.2" 229 | resolved "https://registry.yarnpkg.com/encodeurl/-/encodeurl-1.0.2.tgz#ad3ff4c86ec2d029322f5a02c3a9a606c95b3f59" 230 | integrity sha1-rT/0yG7C0CkyL1oCw6mmBslbP1k= 231 | 232 | escape-html@~1.0.3: 233 | version "1.0.3" 234 | resolved "https://registry.yarnpkg.com/escape-html/-/escape-html-1.0.3.tgz#0258eae4d3d0c0974de1c169188ef0051d1d1988" 235 | integrity sha1-Aljq5NPQwJdN4cFpGI7wBR0dGYg= 236 | 237 | etag@~1.8.1: 238 | version "1.8.1" 239 | resolved "https://registry.yarnpkg.com/etag/-/etag-1.8.1.tgz#41ae2eeb65efa62268aebfea83ac7d79299b0887" 240 | integrity sha1-Qa4u62XvpiJorr/qg6x9eSmbCIc= 241 | 242 | express-bearer-token@^2.4.0: 243 | version "2.4.0" 244 | resolved "https://registry.yarnpkg.com/express-bearer-token/-/express-bearer-token-2.4.0.tgz#f4d9d5a1e318953445e7f0d2bde00bb96d21c95a" 245 | integrity sha512-2+kRZT2xo+pmmvSY7Ma5FzxTJpO3kGaPCEXPbAm3GaoZ/z6FE4K6L7cvs1AUZwY2xkk15PcQw7t4dWjsl5rdJw== 246 | dependencies: 247 | cookie "^0.3.1" 248 | cookie-parser "^1.4.4" 249 | 250 | express@^4.17.1: 251 | version "4.17.1" 252 | resolved "https://registry.yarnpkg.com/express/-/express-4.17.1.tgz#4491fc38605cf51f8629d39c2b5d026f98a4c134" 253 | integrity sha512-mHJ9O79RqluphRrcw2X/GTh3k9tVv8YcoyY4Kkh4WDMUYKRZUq0h1o0w2rrrxBqM7VoeUVqgb27xlEMXTnYt4g== 254 | dependencies: 255 | accepts "~1.3.7" 256 | array-flatten "1.1.1" 257 | body-parser "1.19.0" 258 | content-disposition "0.5.3" 259 | content-type "~1.0.4" 260 | cookie "0.4.0" 261 | cookie-signature "1.0.6" 262 | debug "2.6.9" 263 | depd "~1.1.2" 264 | encodeurl "~1.0.2" 265 | escape-html "~1.0.3" 266 | etag "~1.8.1" 267 | finalhandler "~1.1.2" 268 | fresh "0.5.2" 269 | merge-descriptors "1.0.1" 270 | methods "~1.1.2" 271 | on-finished "~2.3.0" 272 | parseurl "~1.3.3" 273 | path-to-regexp "0.1.7" 274 | proxy-addr "~2.0.5" 275 | qs "6.7.0" 276 | range-parser "~1.2.1" 277 | safe-buffer "5.1.2" 278 | send "0.17.1" 279 | serve-static "1.14.1" 280 | setprototypeof "1.1.1" 281 | statuses "~1.5.0" 282 | type-is "~1.6.18" 283 | utils-merge "1.0.1" 284 | vary "~1.1.2" 285 | 286 | extend@~3.0.2: 287 | version "3.0.2" 288 | resolved "https://registry.yarnpkg.com/extend/-/extend-3.0.2.tgz#f8b1136b4071fbd8eb140aff858b1019ec2915fa" 289 | integrity sha512-fjquC59cD7CyW6urNXK0FBufkZcoiGG80wTuPujX590cB5Ttln20E2UB4S/WARVqhXffZl2LNgS+gQdPIIim/g== 290 | 291 | extsprintf@1.3.0: 292 | version "1.3.0" 293 | resolved "https://registry.yarnpkg.com/extsprintf/-/extsprintf-1.3.0.tgz#96918440e3041a7a414f8c52e3c574eb3c3e1e05" 294 | integrity sha1-lpGEQOMEGnpBT4xS48V06zw+HgU= 295 | 296 | extsprintf@^1.2.0: 297 | version "1.4.0" 298 | resolved "https://registry.yarnpkg.com/extsprintf/-/extsprintf-1.4.0.tgz#e2689f8f356fad62cca65a3a91c5df5f9551692f" 299 | integrity sha1-4mifjzVvrWLMplo6kcXfX5VRaS8= 300 | 301 | fast-deep-equal@^2.0.1: 302 | version "2.0.1" 303 | resolved "https://registry.yarnpkg.com/fast-deep-equal/-/fast-deep-equal-2.0.1.tgz#7b05218ddf9667bf7f370bf7fdb2cb15fdd0aa49" 304 | integrity sha1-ewUhjd+WZ79/Nwv3/bLLFf3Qqkk= 305 | 306 | fast-json-stable-stringify@^2.0.0: 307 | version "2.0.0" 308 | resolved "https://registry.yarnpkg.com/fast-json-stable-stringify/-/fast-json-stable-stringify-2.0.0.tgz#d5142c0caee6b1189f87d3a76111064f86c8bbf2" 309 | integrity sha1-1RQsDK7msRifh9OnYREGT4bIu/I= 310 | 311 | finalhandler@~1.1.2: 312 | version "1.1.2" 313 | resolved "https://registry.yarnpkg.com/finalhandler/-/finalhandler-1.1.2.tgz#b7e7d000ffd11938d0fdb053506f6ebabe9f587d" 314 | integrity sha512-aAWcW57uxVNrQZqFXjITpW3sIUQmHGG3qSb9mUah9MgMC4NeWhNOlNjXEYq3HjRAvL6arUviZGGJsBg6z0zsWA== 315 | dependencies: 316 | debug "2.6.9" 317 | encodeurl "~1.0.2" 318 | escape-html "~1.0.3" 319 | on-finished "~2.3.0" 320 | parseurl "~1.3.3" 321 | statuses "~1.5.0" 322 | unpipe "~1.0.0" 323 | 324 | forever-agent@~0.6.1: 325 | version "0.6.1" 326 | resolved "https://registry.yarnpkg.com/forever-agent/-/forever-agent-0.6.1.tgz#fbc71f0c41adeb37f96c577ad1ed42d8fdacca91" 327 | integrity sha1-+8cfDEGt6zf5bFd60e1C2P2sypE= 328 | 329 | form-data@^0.2.0: 330 | version "0.2.0" 331 | resolved "https://registry.yarnpkg.com/form-data/-/form-data-0.2.0.tgz#26f8bc26da6440e299cbdcfb69035c4f77a6e466" 332 | integrity sha1-Jvi8JtpkQOKZy9z7aQNcT3em5GY= 333 | dependencies: 334 | async "~0.9.0" 335 | combined-stream "~0.0.4" 336 | mime-types "~2.0.3" 337 | 338 | form-data@~2.3.2: 339 | version "2.3.3" 340 | resolved "https://registry.yarnpkg.com/form-data/-/form-data-2.3.3.tgz#dcce52c05f644f298c6a7ab936bd724ceffbf3a6" 341 | integrity sha512-1lLKB2Mu3aGP1Q/2eCOx0fNbRMe7XdwktwOruhfqqd0rIJWwN4Dh+E3hrPSlDCXnSR7UtZ1N38rVXm+6+MEhJQ== 342 | dependencies: 343 | asynckit "^0.4.0" 344 | combined-stream "^1.0.6" 345 | mime-types "^2.1.12" 346 | 347 | forwarded@~0.1.2: 348 | version "0.1.2" 349 | resolved "https://registry.yarnpkg.com/forwarded/-/forwarded-0.1.2.tgz#98c23dab1175657b8c0573e8ceccd91b0ff18c84" 350 | integrity sha1-mMI9qxF1ZXuMBXPozszZGw/xjIQ= 351 | 352 | fresh@0.5.2: 353 | version "0.5.2" 354 | resolved "https://registry.yarnpkg.com/fresh/-/fresh-0.5.2.tgz#3d8cadd90d976569fa835ab1f8e4b23a105605a7" 355 | integrity sha1-PYyt2Q2XZWn6g1qx+OSyOhBWBac= 356 | 357 | getpass@^0.1.1: 358 | version "0.1.7" 359 | resolved "https://registry.yarnpkg.com/getpass/-/getpass-0.1.7.tgz#5eff8e3e684d569ae4cb2b1282604e8ba62149fa" 360 | integrity sha1-Xv+OPmhNVprkyysSgmBOi6YhSfo= 361 | dependencies: 362 | assert-plus "^1.0.0" 363 | 364 | har-schema@^2.0.0: 365 | version "2.0.0" 366 | resolved "https://registry.yarnpkg.com/har-schema/-/har-schema-2.0.0.tgz#a94c2224ebcac04782a0d9035521f24735b7ec92" 367 | integrity sha1-qUwiJOvKwEeCoNkDVSHyRzW37JI= 368 | 369 | har-validator@~5.1.0: 370 | version "5.1.3" 371 | resolved "https://registry.yarnpkg.com/har-validator/-/har-validator-5.1.3.tgz#1ef89ebd3e4996557675eed9893110dc350fa080" 372 | integrity sha512-sNvOCzEQNr/qrvJgc3UG/kD4QtlHycrzwS+6mfTrrSq97BvaYcPZZI1ZSqGSPR73Cxn4LKTD4PttRwfU7jWq5g== 373 | dependencies: 374 | ajv "^6.5.5" 375 | har-schema "^2.0.0" 376 | 377 | highland@^2.13.0: 378 | version "2.13.5" 379 | resolved "https://registry.yarnpkg.com/highland/-/highland-2.13.5.tgz#d55cd8ac3f67a00fad79918668d51493222cfcc2" 380 | integrity sha512-dn2flPapIIAa4BtkB2ahjshg8iSJtrJtdhEb9/oiOrS5HMQTR/GuhFpqJ+11YBdtnl3AwWKvbZd1Uxr8uAmA7A== 381 | dependencies: 382 | util-deprecate "^1.0.2" 383 | 384 | http-errors@1.7.2: 385 | version "1.7.2" 386 | resolved "https://registry.yarnpkg.com/http-errors/-/http-errors-1.7.2.tgz#4f5029cf13239f31036e5b2e55292bcfbcc85c8f" 387 | integrity sha512-uUQBt3H/cSIVfch6i1EuPNy/YsRSOUBXTVfZ+yR7Zjez3qjBz6i9+i4zjNaoqcoFVI4lQJ5plg63TvGfRSDCRg== 388 | dependencies: 389 | depd "~1.1.2" 390 | inherits "2.0.3" 391 | setprototypeof "1.1.1" 392 | statuses ">= 1.5.0 < 2" 393 | toidentifier "1.0.0" 394 | 395 | http-errors@~1.7.2: 396 | version "1.7.3" 397 | resolved "https://registry.yarnpkg.com/http-errors/-/http-errors-1.7.3.tgz#6c619e4f9c60308c38519498c14fbb10aacebb06" 398 | integrity sha512-ZTTX0MWrsQ2ZAhA1cejAwDLycFsd7I7nVtnkT3Ol0aqodaKW+0CTZDQ1uBv5whptCnc8e8HeRRJxRs0kmm/Qfw== 399 | dependencies: 400 | depd "~1.1.2" 401 | inherits "2.0.4" 402 | setprototypeof "1.1.1" 403 | statuses ">= 1.5.0 < 2" 404 | toidentifier "1.0.0" 405 | 406 | http-signature@~1.2.0: 407 | version "1.2.0" 408 | resolved "https://registry.yarnpkg.com/http-signature/-/http-signature-1.2.0.tgz#9aecd925114772f3d95b65a60abb8f7c18fbace1" 409 | integrity sha1-muzZJRFHcvPZW2WmCruPfBj7rOE= 410 | dependencies: 411 | assert-plus "^1.0.0" 412 | jsprim "^1.2.2" 413 | sshpk "^1.7.0" 414 | 415 | iconv-lite@0.4.24: 416 | version "0.4.24" 417 | resolved "https://registry.yarnpkg.com/iconv-lite/-/iconv-lite-0.4.24.tgz#2022b4b25fbddc21d2f524974a474aafe733908b" 418 | integrity sha512-v3MXnZAcvnywkTUEZomIActle7RXXeedOR31wwl7VlyoXO4Qi9arvSenNQWne1TcRwhCL1HwLI21bEqdpj8/rA== 419 | dependencies: 420 | safer-buffer ">= 2.1.2 < 3" 421 | 422 | inherits@2.0.3: 423 | version "2.0.3" 424 | resolved "https://registry.yarnpkg.com/inherits/-/inherits-2.0.3.tgz#633c2c83e3da42a502f52466022480f4208261de" 425 | integrity sha1-Yzwsg+PaQqUC9SRmAiSA9CCCYd4= 426 | 427 | inherits@2.0.4: 428 | version "2.0.4" 429 | resolved "https://registry.yarnpkg.com/inherits/-/inherits-2.0.4.tgz#0fa2c64f932917c3433a0ded55363aae37416b7c" 430 | integrity sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ== 431 | 432 | ipaddr.js@1.9.0: 433 | version "1.9.0" 434 | resolved "https://registry.yarnpkg.com/ipaddr.js/-/ipaddr.js-1.9.0.tgz#37df74e430a0e47550fe54a2defe30d8acd95f65" 435 | integrity sha512-M4Sjn6N/+O6/IXSJseKqHoFc+5FdGJ22sXqnjTpdZweHK64MzEPAyQZyEU3R/KRv2GLoa7nNtg/C2Ev6m7z+eA== 436 | 437 | is-typedarray@~1.0.0: 438 | version "1.0.0" 439 | resolved "https://registry.yarnpkg.com/is-typedarray/-/is-typedarray-1.0.0.tgz#e479c80858df0c1b11ddda6940f96011fcda4a9a" 440 | integrity sha1-5HnICFjfDBsR3dppQPlgEfzaSpo= 441 | 442 | isstream@~0.1.2: 443 | version "0.1.2" 444 | resolved "https://registry.yarnpkg.com/isstream/-/isstream-0.1.2.tgz#47e63f7af55afa6f92e1500e690eb8b8529c099a" 445 | integrity sha1-R+Y/evVa+m+S4VAOaQ64uFKcCZo= 446 | 447 | jsbn@~0.1.0: 448 | version "0.1.1" 449 | resolved "https://registry.yarnpkg.com/jsbn/-/jsbn-0.1.1.tgz#a5e654c2e5a2deb5f201d96cefbca80c0ef2f513" 450 | integrity sha1-peZUwuWi3rXyAdls77yoDA7y9RM= 451 | 452 | json-schema-traverse@^0.4.1: 453 | version "0.4.1" 454 | resolved "https://registry.yarnpkg.com/json-schema-traverse/-/json-schema-traverse-0.4.1.tgz#69f6a87d9513ab8bb8fe63bdb0979c448e684660" 455 | integrity sha512-xbbCH5dCYU5T8LcEhhuh7HJ88HXuW3qsI3Y0zOZFKfZEHcpWiHU/Jxzk629Brsab/mMiHQti9wMP+845RPe3Vg== 456 | 457 | json-schema@0.2.3: 458 | version "0.2.3" 459 | resolved "https://registry.yarnpkg.com/json-schema/-/json-schema-0.2.3.tgz#b480c892e59a2f05954ce727bd3f2a4e882f9e13" 460 | integrity sha1-tIDIkuWaLwWVTOcnvT8qTogvnhM= 461 | 462 | json-stringify-safe@~5.0.1: 463 | version "5.0.1" 464 | resolved "https://registry.yarnpkg.com/json-stringify-safe/-/json-stringify-safe-5.0.1.tgz#1296a2d58fd45f19a0f6ce01d65701e2c735b6eb" 465 | integrity sha1-Epai1Y/UXxmg9s4B1lcB4sc1tus= 466 | 467 | jsprim@^1.2.2: 468 | version "1.4.1" 469 | resolved "https://registry.yarnpkg.com/jsprim/-/jsprim-1.4.1.tgz#313e66bc1e5cc06e438bc1b7499c2e5c56acb6a2" 470 | integrity sha1-MT5mvB5cwG5Di8G3SZwuXFastqI= 471 | dependencies: 472 | assert-plus "1.0.0" 473 | extsprintf "1.3.0" 474 | json-schema "0.2.3" 475 | verror "1.10.0" 476 | 477 | lodash@^4.17.10, lodash@^4.17.21: 478 | version "4.17.21" 479 | resolved "https://registry.yarnpkg.com/lodash/-/lodash-4.17.21.tgz#679591c564c3bffaae8454cf0b3df370c3d6911c" 480 | integrity sha512-v2kDEe57lecTulaDIuNTPy3Ry4gLGJ6Z1O3vE1krgXZNrsQ+LFTGHVxVjcXPs17LhbZVGedAJv8XZ1tvj5FvSg== 481 | 482 | media-typer@0.3.0: 483 | version "0.3.0" 484 | resolved "https://registry.yarnpkg.com/media-typer/-/media-typer-0.3.0.tgz#8710d7af0aa626f8fffa1ce00168545263255748" 485 | integrity sha1-hxDXrwqmJvj/+hzgAWhUUmMlV0g= 486 | 487 | memtable@^2.0.0-alpha.12: 488 | version "2.0.0-alpha.12" 489 | resolved "https://registry.yarnpkg.com/memtable/-/memtable-2.0.0-alpha.12.tgz#e97ad06d8c21a2ee12b48d4f5fda9743d92bde32" 490 | integrity sha512-msS2x6rjcR9jhiu4CIEtamxnX3V9TqvFYh9OWdinKKoCkrV+RIsg05SbdB+AX6CkiFmRIjMVoc5hQ3S6VBgQDg== 491 | dependencies: 492 | highland "^2.13.0" 493 | lodash "^4.17.10" 494 | 495 | merge-descriptors@1.0.1: 496 | version "1.0.1" 497 | resolved "https://registry.yarnpkg.com/merge-descriptors/-/merge-descriptors-1.0.1.tgz#b00aaa556dd8b44568150ec9d1b953f3f90cbb61" 498 | integrity sha1-sAqqVW3YtEVoFQ7J0blT8/kMu2E= 499 | 500 | methods@~1.1.2: 501 | version "1.1.2" 502 | resolved "https://registry.yarnpkg.com/methods/-/methods-1.1.2.tgz#5529a4d67654134edcc5266656835b0f851afcee" 503 | integrity sha1-VSmk1nZUE07cxSZmVoNbD4Ua/O4= 504 | 505 | mime-db@1.42.0: 506 | version "1.42.0" 507 | resolved "https://registry.yarnpkg.com/mime-db/-/mime-db-1.42.0.tgz#3e252907b4c7adb906597b4b65636272cf9e7bac" 508 | integrity sha512-UbfJCR4UAVRNgMpfImz05smAXK7+c+ZntjaA26ANtkXLlOe947Aag5zdIcKQULAiF9Cq4WxBi9jUs5zkA84bYQ== 509 | 510 | mime-db@~1.12.0: 511 | version "1.12.0" 512 | resolved "https://registry.yarnpkg.com/mime-db/-/mime-db-1.12.0.tgz#3d0c63180f458eb10d325aaa37d7c58ae312e9d7" 513 | integrity sha1-PQxjGA9FjrENMlqqN9fFiuMS6dc= 514 | 515 | mime-types@^2.1.12, mime-types@~2.1.19, mime-types@~2.1.24: 516 | version "2.1.25" 517 | resolved "https://registry.yarnpkg.com/mime-types/-/mime-types-2.1.25.tgz#39772d46621f93e2a80a856c53b86a62156a6437" 518 | integrity sha512-5KhStqB5xpTAeGqKBAMgwaYMnQik7teQN4IAzC7npDv6kzeU6prfkR67bc87J1kWMPGkoaZSq1npmexMgkmEVg== 519 | dependencies: 520 | mime-db "1.42.0" 521 | 522 | mime-types@~2.0.3: 523 | version "2.0.14" 524 | resolved "https://registry.yarnpkg.com/mime-types/-/mime-types-2.0.14.tgz#310e159db23e077f8bb22b748dabfa4957140aa6" 525 | integrity sha1-MQ4VnbI+B3+Lsit0jav6SVcUCqY= 526 | dependencies: 527 | mime-db "~1.12.0" 528 | 529 | mime@1.6.0: 530 | version "1.6.0" 531 | resolved "https://registry.yarnpkg.com/mime/-/mime-1.6.0.tgz#32cd9e5c64553bd58d19a568af452acff04981b1" 532 | integrity sha512-x0Vn8spI+wuJ1O6S7gnbaQg8Pxh4NNHb7KSINmEWKiPE4RKOplvijn+NkmYmmRgP68mc70j2EbeTFRsrswaQeg== 533 | 534 | mime@^2.4.0: 535 | version "2.4.4" 536 | resolved "https://registry.yarnpkg.com/mime/-/mime-2.4.4.tgz#bd7b91135fc6b01cde3e9bae33d659b63d8857e5" 537 | integrity sha512-LRxmNwziLPT828z+4YkNzloCFC2YM4wrB99k+AV5ZbEyfGNWfG8SO1FUXLmLDBSo89NrJZ4DIWeLjy1CHGhMGA== 538 | 539 | moment@^2.24.0: 540 | version "2.24.0" 541 | resolved "https://registry.yarnpkg.com/moment/-/moment-2.24.0.tgz#0d055d53f5052aa653c9f6eb68bb5d12bf5c2b5b" 542 | integrity sha512-bV7f+6l2QigeBBZSM/6yTNq4P2fNpSWj/0e7jQcy87A8e7o2nAfP/34/2ky5Vw4B9S446EtIhodAzkFCcR4dQg== 543 | 544 | ms@2.0.0: 545 | version "2.0.0" 546 | resolved "https://registry.yarnpkg.com/ms/-/ms-2.0.0.tgz#5608aeadfc00be6c2901df5f9861788de0d597c8" 547 | integrity sha1-VgiurfwAvmwpAd9fmGF4jeDVl8g= 548 | 549 | ms@2.1.1: 550 | version "2.1.1" 551 | resolved "https://registry.yarnpkg.com/ms/-/ms-2.1.1.tgz#30a5864eb3ebb0a66f2ebe6d727af06a09d86e0a" 552 | integrity sha512-tgp+dl5cGk28utYktBsrFqA7HKgrhgPsg6Z/EfhWI4gl1Hwq8B/GmY/0oXZ6nF8hDVesS/FpnYaD/kOWhYQvyg== 553 | 554 | negotiator@0.6.2: 555 | version "0.6.2" 556 | resolved "https://registry.yarnpkg.com/negotiator/-/negotiator-0.6.2.tgz#feacf7ccf525a77ae9634436a64883ffeca346fb" 557 | integrity sha512-hZXc7K2e+PgeI1eDBe/10Ard4ekbfrrqG8Ep+8Jmf4JID2bNg7NvCPOZN+kfF574pFQI7mum2AUqDidoKqcTOw== 558 | 559 | oauth-sign@~0.9.0: 560 | version "0.9.0" 561 | resolved "https://registry.yarnpkg.com/oauth-sign/-/oauth-sign-0.9.0.tgz#47a7b016baa68b5fa0ecf3dee08a85c679ac6455" 562 | integrity sha512-fexhUFFPTGV8ybAtSIGbV6gOkSv8UtRbDBnAyLQw4QPKkgNlsH2ByPGtMUqdWkos6YCRmAqViwgZrJc/mRDzZQ== 563 | 564 | object-assign@^4: 565 | version "4.1.1" 566 | resolved "https://registry.yarnpkg.com/object-assign/-/object-assign-4.1.1.tgz#2109adc7965887cfc05cbbd442cac8bfbb360863" 567 | integrity sha1-IQmtx5ZYh8/AXLvUQsrIv7s2CGM= 568 | 569 | on-finished@~2.3.0: 570 | version "2.3.0" 571 | resolved "https://registry.yarnpkg.com/on-finished/-/on-finished-2.3.0.tgz#20f1336481b083cd75337992a16971aa2d906947" 572 | integrity sha1-IPEzZIGwg811M3mSoWlxqi2QaUc= 573 | dependencies: 574 | ee-first "1.1.1" 575 | 576 | parseurl@~1.3.3: 577 | version "1.3.3" 578 | resolved "https://registry.yarnpkg.com/parseurl/-/parseurl-1.3.3.tgz#9da19e7bee8d12dff0513ed5b76957793bc2e8d4" 579 | integrity sha512-CiyeOxFT/JZyN5m0z9PfXw4SCBJ6Sygz1Dpl0wqjlhDEGGBP1GnsUVEL0p63hoG1fcj3fHynXi9NYO4nWOL+qQ== 580 | 581 | path-to-regexp@0.1.7: 582 | version "0.1.7" 583 | resolved "https://registry.yarnpkg.com/path-to-regexp/-/path-to-regexp-0.1.7.tgz#df604178005f522f15eb4490e7247a1bfaa67f8c" 584 | integrity sha1-32BBeABfUi8V60SQ5yR6G/qmf4w= 585 | 586 | performance-now@^2.1.0: 587 | version "2.1.0" 588 | resolved "https://registry.yarnpkg.com/performance-now/-/performance-now-2.1.0.tgz#6309f4e0e5fa913ec1c69307ae364b4b377c9e7b" 589 | integrity sha1-Ywn04OX6kT7BxpMHrjZLSzd8nns= 590 | 591 | proxy-addr@~2.0.5: 592 | version "2.0.5" 593 | resolved "https://registry.yarnpkg.com/proxy-addr/-/proxy-addr-2.0.5.tgz#34cbd64a2d81f4b1fd21e76f9f06c8a45299ee34" 594 | integrity sha512-t/7RxHXPH6cJtP0pRG6smSr9QJidhB+3kXu0KgXnbGYMgzEnUxRQ4/LDdfOwZEMyIh3/xHb8PX3t+lfL9z+YVQ== 595 | dependencies: 596 | forwarded "~0.1.2" 597 | ipaddr.js "1.9.0" 598 | 599 | psl@^1.1.24: 600 | version "1.6.0" 601 | resolved "https://registry.yarnpkg.com/psl/-/psl-1.6.0.tgz#60557582ee23b6c43719d9890fb4170ecd91e110" 602 | integrity sha512-SYKKmVel98NCOYXpkwUqZqh0ahZeeKfmisiLIcEZdsb+WbLv02g/dI5BUmZnIyOe7RzZtLax81nnb2HbvC2tzA== 603 | 604 | punycode@^1.4.1: 605 | version "1.4.1" 606 | resolved "https://registry.yarnpkg.com/punycode/-/punycode-1.4.1.tgz#c0d5a63b2718800ad8e1eb0fa5269c84dd41845e" 607 | integrity sha1-wNWmOycYgArY4esPpSachN1BhF4= 608 | 609 | punycode@^2.1.0: 610 | version "2.1.1" 611 | resolved "https://registry.yarnpkg.com/punycode/-/punycode-2.1.1.tgz#b58b010ac40c22c5657616c8d2c2c02c7bf479ec" 612 | integrity sha512-XRsRjdf+j5ml+y/6GKHPZbrF/8p2Yga0JPtdqTIY2Xe5ohJPD9saDJJLPvp9+NSBprVvevdXZybnj2cv8OEd0A== 613 | 614 | qs@6.7.0: 615 | version "6.7.0" 616 | resolved "https://registry.yarnpkg.com/qs/-/qs-6.7.0.tgz#41dc1a015e3d581f1621776be31afb2876a9b1bc" 617 | integrity sha512-VCdBRNFTX1fyE7Nb6FYoURo/SPe62QCaAyzJvUjwRaIsc+NePBEniHlvxFmmX56+HZphIGtV0XeCirBtpDrTyQ== 618 | 619 | qs@~6.5.2: 620 | version "6.5.2" 621 | resolved "https://registry.yarnpkg.com/qs/-/qs-6.5.2.tgz#cb3ae806e8740444584ef154ce8ee98d403f3e36" 622 | integrity sha512-N5ZAX4/LxJmF+7wN74pUD6qAh9/wnvdQcjq9TZjevvXzSUo7bfmw91saqMjzGS2xq91/odN2dW/WOl7qQHNDGA== 623 | 624 | range-parser@~1.2.1: 625 | version "1.2.1" 626 | resolved "https://registry.yarnpkg.com/range-parser/-/range-parser-1.2.1.tgz#3cf37023d199e1c24d1a55b84800c2f3e6468031" 627 | integrity sha512-Hrgsx+orqoygnmhFbKaHE6c296J+HTAQXoxEF6gNupROmmGJRoyzfG3ccAveqCBrwr/2yxQ5BVd/GTl5agOwSg== 628 | 629 | raw-body@2.4.0: 630 | version "2.4.0" 631 | resolved "https://registry.yarnpkg.com/raw-body/-/raw-body-2.4.0.tgz#a1ce6fb9c9bc356ca52e89256ab59059e13d0332" 632 | integrity sha512-4Oz8DUIwdvoa5qMJelxipzi/iJIi40O5cGV1wNYp5hvZP8ZN0T+jiNkL0QepXs+EsQ9XJ8ipEDoiH70ySUJP3Q== 633 | dependencies: 634 | bytes "3.1.0" 635 | http-errors "1.7.2" 636 | iconv-lite "0.4.24" 637 | unpipe "1.0.0" 638 | 639 | request@^2.88.0: 640 | version "2.88.0" 641 | resolved "https://registry.yarnpkg.com/request/-/request-2.88.0.tgz#9c2fca4f7d35b592efe57c7f0a55e81052124fef" 642 | integrity sha512-NAqBSrijGLZdM0WZNsInLJpkJokL72XYjUpnB0iwsRgxh7dB6COrHnTBNwN0E+lHDAJzu7kLAkDeY08z2/A0hg== 643 | dependencies: 644 | aws-sign2 "~0.7.0" 645 | aws4 "^1.8.0" 646 | caseless "~0.12.0" 647 | combined-stream "~1.0.6" 648 | extend "~3.0.2" 649 | forever-agent "~0.6.1" 650 | form-data "~2.3.2" 651 | har-validator "~5.1.0" 652 | http-signature "~1.2.0" 653 | is-typedarray "~1.0.0" 654 | isstream "~0.1.2" 655 | json-stringify-safe "~5.0.1" 656 | mime-types "~2.1.19" 657 | oauth-sign "~0.9.0" 658 | performance-now "^2.1.0" 659 | qs "~6.5.2" 660 | safe-buffer "^5.1.2" 661 | tough-cookie "~2.4.3" 662 | tunnel-agent "^0.6.0" 663 | uuid "^3.3.2" 664 | 665 | safe-buffer@5.1.2: 666 | version "5.1.2" 667 | resolved "https://registry.yarnpkg.com/safe-buffer/-/safe-buffer-5.1.2.tgz#991ec69d296e0313747d59bdfd2b745c35f8828d" 668 | integrity sha512-Gd2UZBJDkXlY7GbJxfsE8/nvKkUEU1G38c1siN6QP6a9PT9MmHB8GnpscSmMJSoF8LOIrt8ud/wPtojys4G6+g== 669 | 670 | safe-buffer@^5.0.1, safe-buffer@^5.1.2: 671 | version "5.2.0" 672 | resolved "https://registry.yarnpkg.com/safe-buffer/-/safe-buffer-5.2.0.tgz#b74daec49b1148f88c64b68d49b1e815c1f2f519" 673 | integrity sha512-fZEwUGbVl7kouZs1jCdMLdt95hdIv0ZeHg6L7qPeciMZhZ+/gdesW4wgTARkrFWEpspjEATAzUGPG8N2jJiwbg== 674 | 675 | "safer-buffer@>= 2.1.2 < 3", safer-buffer@^2.0.2, safer-buffer@^2.1.0, safer-buffer@~2.1.0: 676 | version "2.1.2" 677 | resolved "https://registry.yarnpkg.com/safer-buffer/-/safer-buffer-2.1.2.tgz#44fa161b0187b9549dd84bb91802f9bd8385cd6a" 678 | integrity sha512-YZo3K82SD7Riyi0E1EQPojLz7kpepnSQI9IyPbHHg1XXXevb5dJI7tpyN2ADxGcQbHG7vcyRHk0cbwqcQriUtg== 679 | 680 | send@0.17.1: 681 | version "0.17.1" 682 | resolved "https://registry.yarnpkg.com/send/-/send-0.17.1.tgz#c1d8b059f7900f7466dd4938bdc44e11ddb376c8" 683 | integrity sha512-BsVKsiGcQMFwT8UxypobUKyv7irCNRHk1T0G680vk88yf6LBByGcZJOTJCrTP2xVN6yI+XjPJcNuE3V4fT9sAg== 684 | dependencies: 685 | debug "2.6.9" 686 | depd "~1.1.2" 687 | destroy "~1.0.4" 688 | encodeurl "~1.0.2" 689 | escape-html "~1.0.3" 690 | etag "~1.8.1" 691 | fresh "0.5.2" 692 | http-errors "~1.7.2" 693 | mime "1.6.0" 694 | ms "2.1.1" 695 | on-finished "~2.3.0" 696 | range-parser "~1.2.1" 697 | statuses "~1.5.0" 698 | 699 | serve-static@1.14.1: 700 | version "1.14.1" 701 | resolved "https://registry.yarnpkg.com/serve-static/-/serve-static-1.14.1.tgz#666e636dc4f010f7ef29970a88a674320898b2f9" 702 | integrity sha512-JMrvUwE54emCYWlTI+hGrGv5I8dEwmco/00EvkzIIsR7MqrHonbD9pO2MOfFnpFntl7ecpZs+3mW+XbQZu9QCg== 703 | dependencies: 704 | encodeurl "~1.0.2" 705 | escape-html "~1.0.3" 706 | parseurl "~1.3.3" 707 | send "0.17.1" 708 | 709 | setprototypeof@1.1.1: 710 | version "1.1.1" 711 | resolved "https://registry.yarnpkg.com/setprototypeof/-/setprototypeof-1.1.1.tgz#7e95acb24aa92f5885e0abef5ba131330d4ae683" 712 | integrity sha512-JvdAWfbXeIGaZ9cILp38HntZSFSo3mWg6xGcJJsd+d4aRMOqauag1C63dJfDw7OaMYwEbHMOxEZ1lqVRYP2OAw== 713 | 714 | sshpk@^1.7.0: 715 | version "1.16.1" 716 | resolved "https://registry.yarnpkg.com/sshpk/-/sshpk-1.16.1.tgz#fb661c0bef29b39db40769ee39fa70093d6f6877" 717 | integrity sha512-HXXqVUq7+pcKeLqqZj6mHFUMvXtOJt1uoUx09pFW6011inTMxqI8BA8PM95myrIyyKwdnzjdFjLiE6KBPVtJIg== 718 | dependencies: 719 | asn1 "~0.2.3" 720 | assert-plus "^1.0.0" 721 | bcrypt-pbkdf "^1.0.0" 722 | dashdash "^1.12.0" 723 | ecc-jsbn "~0.1.1" 724 | getpass "^0.1.1" 725 | jsbn "~0.1.0" 726 | safer-buffer "^2.0.2" 727 | tweetnacl "~0.14.0" 728 | 729 | "statuses@>= 1.5.0 < 2", statuses@~1.5.0: 730 | version "1.5.0" 731 | resolved "https://registry.yarnpkg.com/statuses/-/statuses-1.5.0.tgz#161c7dac177659fd9811f43771fa99381478628c" 732 | integrity sha1-Fhx9rBd2Wf2YEfQ3cfqZOBR4Yow= 733 | 734 | toidentifier@1.0.0: 735 | version "1.0.0" 736 | resolved "https://registry.yarnpkg.com/toidentifier/-/toidentifier-1.0.0.tgz#7e1be3470f1e77948bc43d94a3c8f4d7752ba553" 737 | integrity sha512-yaOH/Pk/VEhBWWTlhI+qXxDFXlejDGcQipMlyxda9nthulaxLZUNcUqFxokp0vcYnvteJln5FNQDRrxj3YcbVw== 738 | 739 | tough-cookie@~2.4.3: 740 | version "2.4.3" 741 | resolved "https://registry.yarnpkg.com/tough-cookie/-/tough-cookie-2.4.3.tgz#53f36da3f47783b0925afa06ff9f3b165280f781" 742 | integrity sha512-Q5srk/4vDM54WJsJio3XNn6K2sCG+CQ8G5Wz6bZhRZoAe/+TxjWB/GlFAnYEbkYVlON9FMk/fE3h2RLpPXo4lQ== 743 | dependencies: 744 | psl "^1.1.24" 745 | punycode "^1.4.1" 746 | 747 | tunnel-agent@^0.6.0: 748 | version "0.6.0" 749 | resolved "https://registry.yarnpkg.com/tunnel-agent/-/tunnel-agent-0.6.0.tgz#27a5dea06b36b04a0a9966774b290868f0fc40fd" 750 | integrity sha1-J6XeoGs2sEoKmWZ3SykIaPD8QP0= 751 | dependencies: 752 | safe-buffer "^5.0.1" 753 | 754 | tweetnacl@^0.14.3, tweetnacl@~0.14.0: 755 | version "0.14.5" 756 | resolved "https://registry.yarnpkg.com/tweetnacl/-/tweetnacl-0.14.5.tgz#5ae68177f192d4456269d108afa93ff8743f4f64" 757 | integrity sha1-WuaBd/GS1EViadEIr6k/+HQ/T2Q= 758 | 759 | type-is@~1.6.17, type-is@~1.6.18: 760 | version "1.6.18" 761 | resolved "https://registry.yarnpkg.com/type-is/-/type-is-1.6.18.tgz#4e552cd05df09467dcbc4ef739de89f2cf37c131" 762 | integrity sha512-TkRKr9sUTxEH8MdfuCSP7VizJyzRNMjj2J2do2Jr3Kym598JVdEksuzPQCnlFPW4ky9Q+iA+ma9BGm06XQBy8g== 763 | dependencies: 764 | media-typer "0.3.0" 765 | mime-types "~2.1.24" 766 | 767 | uWebSockets.js@uNetworking/uWebSockets.js#v15.4.0: 768 | version "15.4.0" 769 | resolved "https://codeload.github.com/uNetworking/uWebSockets.js/tar.gz/23b29ec03b057ee079de99460c212b2620cfe8fe" 770 | 771 | unirest@^0.6.0: 772 | version "0.6.0" 773 | resolved "https://registry.yarnpkg.com/unirest/-/unirest-0.6.0.tgz#289b5ae59cc9fa9fdfff3b5866e0dd50bf5eb280" 774 | integrity sha512-BdYdcYJHXACqZ53k8Zz7QlNK/1W/HjCZlmg1OaaN/oTSp4FTWh0upXGSJsG88PljDBpSrNc2R649drasUA9NEg== 775 | dependencies: 776 | form-data "^0.2.0" 777 | mime "^2.4.0" 778 | request "^2.88.0" 779 | 780 | unpipe@1.0.0, unpipe@~1.0.0: 781 | version "1.0.0" 782 | resolved "https://registry.yarnpkg.com/unpipe/-/unpipe-1.0.0.tgz#b2bf4ee8514aae6165b4817829d21b2ef49904ec" 783 | integrity sha1-sr9O6FFKrmFltIF4KdIbLvSZBOw= 784 | 785 | uri-js@^4.2.2: 786 | version "4.2.2" 787 | resolved "https://registry.yarnpkg.com/uri-js/-/uri-js-4.2.2.tgz#94c540e1ff772956e2299507c010aea6c8838eb0" 788 | integrity sha512-KY9Frmirql91X2Qgjry0Wd4Y+YTdrdZheS8TFwvkbLWf/G5KNJDCh6pKL5OZctEW4+0Baa5idK2ZQuELRwPznQ== 789 | dependencies: 790 | punycode "^2.1.0" 791 | 792 | url-join@^4.0.1: 793 | version "4.0.1" 794 | resolved "https://registry.yarnpkg.com/url-join/-/url-join-4.0.1.tgz#b642e21a2646808ffa178c4c5fda39844e12cde7" 795 | integrity sha512-jk1+QP6ZJqyOiuEI9AEWQfju/nB2Pw466kbA0LEZljHwKeMgd9WrAEgEGxjPDD2+TNbbb37rTyhEfrCXfuKXnA== 796 | 797 | util-deprecate@^1.0.2: 798 | version "1.0.2" 799 | resolved "https://registry.yarnpkg.com/util-deprecate/-/util-deprecate-1.0.2.tgz#450d4dc9fa70de732762fbd2d4a28981419a0ccf" 800 | integrity sha1-RQ1Nyfpw3nMnYvvS1KKJgUGaDM8= 801 | 802 | utils-merge@1.0.1: 803 | version "1.0.1" 804 | resolved "https://registry.yarnpkg.com/utils-merge/-/utils-merge-1.0.1.tgz#9f95710f50a267947b2ccc124741c1028427e713" 805 | integrity sha1-n5VxD1CiZ5R7LMwSR0HBAoQn5xM= 806 | 807 | uuid@^3.3.2, uuid@^3.3.3: 808 | version "3.3.3" 809 | resolved "https://registry.yarnpkg.com/uuid/-/uuid-3.3.3.tgz#4568f0216e78760ee1dbf3a4d2cf53e224112866" 810 | integrity sha512-pW0No1RGHgzlpHJO1nsVrHKpOEIxkGg1xB+v0ZmdNH5OAeAwzAVrCnI2/6Mtx+Uys6iaylxa+D3g4j63IKKjSQ== 811 | 812 | vary@^1, vary@~1.1.2: 813 | version "1.1.2" 814 | resolved "https://registry.yarnpkg.com/vary/-/vary-1.1.2.tgz#2299f02c6ded30d4a5961b0b9f74524a18f634fc" 815 | integrity sha1-IpnwLG3tMNSllhsLn3RSShj2NPw= 816 | 817 | verror@1.10.0: 818 | version "1.10.0" 819 | resolved "https://registry.yarnpkg.com/verror/-/verror-1.10.0.tgz#3a105ca17053af55d6e270c1f8288682e18da400" 820 | integrity sha1-OhBcoXBTr1XW4nDB+CiGguGNpAA= 821 | dependencies: 822 | assert-plus "^1.0.0" 823 | core-util-is "1.0.2" 824 | extsprintf "^1.2.0" 825 | --------------------------------------------------------------------------------