├── .gitignore ├── README.md ├── client ├── .gitignore ├── README.md ├── index.js ├── package.json └── yarn.lock ├── handler.js ├── package.json ├── serverless.yml ├── sls-policies.json ├── src ├── connector │ ├── apigateway.connector.js │ ├── cognito.connector.js │ └── dynamodb.connector.js ├── constants.js └── controllers │ ├── auth.controller.js │ ├── greeting.controller.js │ └── websocket.controller.js └── yarn.lock /.gitignore: -------------------------------------------------------------------------------- 1 | # IDE 2 | .idea/ 3 | *.iml 4 | 5 | # NodeJS 6 | node_modules/ 7 | *.log 8 | 9 | # MAC 10 | .DS_Store 11 | -------------------------------------------------------------------------------- /README.md: -------------------------------------------------------------------------------- 1 | ## AWS Secure Websocket 2 | 3 | Secured _web socket_ deployed on _AWS_ infrastructure using 4 | the [serverless] framework. 5 | 6 | This repository serves as an example for this 7 | [medium article]. Please, invest a few minutes reading it 8 | in case you need further detail. 9 | 10 | All services have been implemented using [NodeJS]. 11 | 12 | ### Serverless service user policies 13 | 14 | _serverless_ documentation recommends creating a service user 15 | with restricted permissions in order to avoid security issues; 16 | for example, user leaking and having admin rights could be 17 | devastating for your _AWS_ bill. 18 | 19 | However, the policies provided on the official example do not 20 | provide access to _AWS Cognito_. In order to use proper 21 | permissions, check the _sls-policies.json_ file within this 22 | repository. 23 | 24 | ### Infrastructure 25 | 26 | The required _AWS_ infrastructure is as follows: 27 | 28 | * _Lambda_: used to host our services. 29 | * _API Gateway_: used to expose our services to the outer 30 | world. Also provides authentication using _AWS Cognito_ 31 | generated _JWT_ tokens. 32 | * _API WebSocket_: used to expose our services as _near 33 | realtime connections_, allowing _bi directional_ communication. 34 | It also helps us secure our connections using _AWS 35 | Cognito_ generated _JWT_ tokens. 36 | * _DynamoDB_: used to track active _web socket_ connections 37 | and what they're subscribed to. 38 | * _Cognito_: user pool which allows us create and validate 39 | user credentials. 40 | 41 | ### Deploying it 42 | 43 | First of all, you need an _AWS_ account. Then it is 44 | mandatory to [configure serverless locally] with your 45 | credentials. 46 | 47 | Once you've set your environment up, you can deploy the 48 | entire stack using the following command: 49 | ```bash 50 | serverless deploy -v 51 | ``` 52 | 53 | In case you want to deploy an specific _lambda_, you can 54 | use this other command: 55 | ```bash 56 | serverless deploy function -f -v 57 | ``` 58 | 59 | You can also remove all the allocated resources by executing 60 | this command: 61 | ```bash 62 | serverless remove -v 63 | ``` 64 | 65 | [medium article]: https://medium.com/@damoresac/implementing-secure-web-sockets-with-aws-api-gateway-cognito-dynamodb-and-lambda-b38e02314b42 66 | [NodeJS]: https://nodejs.org/ 67 | [serverless]: https://serverless.com/ 68 | [configure serverless locally]: https://serverless.com/framework/docs/providers/aws/guide/credentials/ 69 | -------------------------------------------------------------------------------- /client/.gitignore: -------------------------------------------------------------------------------- 1 | # Environment 2 | .env 3 | 4 | # NodeJS 5 | node_modules/ 6 | *.log 7 | -------------------------------------------------------------------------------- /client/README.md: -------------------------------------------------------------------------------- 1 | ## AWS Secure Websocket client 2 | 3 | Secured _web socket_ client implemented using [websocket]. 4 | 5 | ### Configuration 6 | 7 | This client uses [dotenv] to manage credentials and URLs. 8 | The following environment variables must be declared in a 9 | _.env_ file at the root of the client project: 10 | 11 | 1. _AUTH_ENDPOINT_: _lambda_ service endpoint used to 12 | create the _JWT_ token to be used as identity. 13 | 1. _WS_HOST_: _API Gateway WebSocket_ endpoint which 14 | exposes the _web socket_ server. 15 | 1. _USERNAME_: username created at _AWS Cognito_. It'll 16 | be used in order to generate the _JWT_ token used to 17 | validate the user identity. 18 | 1. _PASSWORD_: user's password as set at _AWS Cognito_. 19 | 20 | ### Running it! 21 | 22 | In order to run the client you must specify: 23 | 24 | * Client identifier you'd like to use. 25 | * Event you're subscribing to. 26 | * Whether you want to deliver test messages or not. 27 | 28 | Examples: 29 | 30 | ```bash 31 | # Example pattern 32 | $ node index.js 33 | 34 | # Listener only: 35 | node index.js first-listener greeting 36 | node index.js first-listener greeting false 37 | 38 | # Listener publisher: 39 | node index.js second-listener greeting true 40 | ``` 41 | 42 | 43 | [dotenv]: https://www.npmjs.com/package/dotenv 44 | [websocket]: https://www.npmjs.com/package/websocket 45 | -------------------------------------------------------------------------------- /client/index.js: -------------------------------------------------------------------------------- 1 | 'use strict'; 2 | 3 | require('dotenv').config(); 4 | const axios = require('axios'); 5 | const WebsocketClient = require('websocket').client; 6 | 7 | // Websocket client configuration 8 | const client = new WebsocketClient(); 9 | 10 | client.on('connectFailed', (error) => { 11 | console.error('Connection attempt failed', error); 12 | client.abort(); 13 | }); 14 | client.on('connect', (connection) => { 15 | console.log('Connected!'); 16 | connection.on('error', (error) => { 17 | console.error('Error during connection', error); 18 | connection.close(); 19 | }); 20 | connection.on('close', () => { 21 | console.log('Connection closed!'); 22 | }); 23 | connection.on('message', (message) => { 24 | const content = JSON.parse(message.utf8Data); 25 | switch (content.action) { 26 | case 'PING': 27 | console.log('Keeping alive'); 28 | break; 29 | case 'GREETING': 30 | console.log(content.value); 31 | break; 32 | default: 33 | console.error('Unsupported response', content); 34 | } 35 | }); 36 | 37 | // Websockets usually timeout and close automatically after being 38 | // idle for around a minute. This ping/pong implementation keeps 39 | // the socket alive. 40 | const ping = () => { 41 | if (connection.connected) { 42 | // console.log('Pinging!'); 43 | const pingMessage = { 44 | action: 'PING' 45 | }; 46 | connection.sendUTF(JSON.stringify(pingMessage)); 47 | setTimeout(ping, 30000); 48 | } 49 | }; 50 | 51 | const scheduledMessage = () => { 52 | if (connection.connected) { 53 | console.log('Greeting everyone!'); 54 | const greetingMessage = { 55 | action: 'GREETING', 56 | message: `Hello everyone, this is instance ${instance}` 57 | }; 58 | connection.sendUTF(JSON.stringify(greetingMessage)); 59 | setTimeout(scheduledMessage, 5000); 60 | } 61 | }; 62 | 63 | ping(); 64 | if (greets) { 65 | scheduledMessage(); 66 | } 67 | }); 68 | 69 | // Process configuration and execution 70 | // Connection metadata: API Websocket host address and Cognito user auth :) 71 | 72 | const authHost = process.env.AUTH_ENDPOINT; 73 | const host = process.env.WS_HOST; 74 | const authData = { 75 | user: process.env.USERNAME, 76 | password: process.env.PASSWORD 77 | }; 78 | 79 | if (process.argv.length < 4) { 80 | console.error('ERROR: Client identifier and event must be provided'); 81 | console.error('Command has the following pattern: node index.js '); 82 | console.error(); 83 | console.error('Example usages:'); 84 | console.error('\t- Listener only:'); 85 | console.error('\t\tnode index.js first-listener greeting'); 86 | console.error('\t\tnode index.js first-listener greeting false'); 87 | console.error('\t- Listener publisher:'); 88 | console.error('\t\tnode index.js second-listener greeting true'); 89 | process.exit(1); 90 | } 91 | 92 | const instance = process.argv[2]; 93 | const event = process.argv[3]; 94 | const greets = process.argv.length > 4 ? process.argv[4] : false; 95 | 96 | // Retrieve the access token 97 | axios.post(authHost, authData) 98 | .then((response) => { 99 | const loginData = response.data; 100 | console.log(`Generated token for user ${loginData.user}`); 101 | 102 | // This old token cause sa signature verification failed at CloudWatch 103 | // loginData.token = 'eyJraWQiOiJBSnlTb0ZuVVk3WlBVVVhMSG5DMnZWMXJmXC9TZ3RsaHYyTHN1Z3lrem5GMD0iLCJhbGciOiJSUzI1NiJ9.eyJzdWIiOiIyZjZmNmJkZi1jZDBiLTQ0NmYtYWMyNC1kZGEwM2RjN2UwMGQiLCJhdWQiOiIxNXJhZjQ1cWxrNTVjM2pjZ2dnYzI2aXR0NiIsImVtYWlsX3ZlcmlmaWVkIjp0cnVlLCJldmVudF9pZCI6Ijc5MTA4ZjZkLTFhZGItNDhiYy05NTg4LThiNzUxZTRlZTk5ZiIsInRva2VuX3VzZSI6ImlkIiwiYXV0aF90aW1lIjoxNTYzOTgzNTkzLCJpc3MiOiJodHRwczpcL1wvY29nbml0by1pZHAuZXUtY2VudHJhbC0xLmFtYXpvbmF3cy5jb21cL2V1LWNlbnRyYWwtMV9vT25vM1JrN04iLCJjb2duaXRvOnVzZXJuYW1lIjoiZGFtb3Jlc2EiLCJleHAiOjE1NjM5ODcxOTMsImlhdCI6MTU2Mzk4MzU5MywiZW1haWwiOiJkYW5pZWwuYW1vcmVzLmFsdmFyZXpAZXZlcmlzLmNvbSJ9.HPeiTBDwiZd-6Oe7OnyaEZjfEL5in4u1GqxtiA2mhF7aCoqZDDLqanicrRLW3M0x4xV3IdivwD5MdPE-T0WCts60pdnxIBKDBvajehLT-lrWdDv-7SKDXrgaYA4-ZuAmqcrmEN3NgTIVfXB5sMVkeahWAXnPPBiSdGDSCVdrYXTTmM-R8y0TQrAqp38x6u5pfpYmIktEnWqbafoU36nDlRxGBdt9dJ_Esm3Dux05MeILcoYBbo741uXNgsk3qr4pOF-4t0A8TiNSccsyFoSdqFy7B06CsHLckRSIcJQow4Vnn3Ojtg-GYrEuXzeOj8Ydlx-Yb9kvp451_LRMM3NuGQ","refresh":"eyJjdHkiOiJKV1QiLCJlbmMiOiJBMjU2R0NNIiwiYWxnIjoiUlNBLU9BRVAifQ.gHEqD6XveeyAx-Hqf_pJa-lT0jw-VzFStL8KS2szG5_WbEOFXqpi6lkciQDOczuCfRXHpwmfC8gESdz-BDxYDXvM18N0lWj5Ro-0v9LtJ2zOntZqYyclb-Z6Kr0HYFlAw3R3seBC2lUx37DKasrlsDhMyu1-n3JMth8D3uvjPxmduDu3XRxUdSG07qGyc2nagUU9846vd67cA1fPzgoi6rdHb-dK-yqF_XKqYI5cMIOslB7Enx8rcWlZOplmB_VJHM1DBFSAW2xjWiSWSwrNxNnODln8b8cXEk0nOmOpQj6bW0LSHu0pmNFvP3-OId84oCqpF6GV3uAWENiG5SO6UA.DR_yq8TlySkdRjPl.2LYsjn7qhQAYJxtFm862EklbL-DUd7Uc6f9r69UqpaGnRccsZ6IKxSHW4WS3nr-9Q-_Lk5LWDgNPAymdSV9Pj0OtBXDMrktjGukffpDKcr5-Kiqk9vcGvC0ylYWcapHvZSwi8wj8qLawsVhgmIULh-34w9NxX6EPTFwFNc5nZEoZkcCsfTw3IEIinE_ulTNJdfkwpMdvndx9X0-XwKtu7946H1NGJ2XJWZxLhmrSuTHwIjnu8JFBLcYb44SlDj36yv25rOW3Sx-z0AN0HRoW_Brs1tcLonmtkar7Fz9F2XDZVqytJf4HmulSI8ex6WXvO22fHP9ZJAc32r3K455i2llBftgtcOse_WdInr-6_BHZlKOAncCdlLkIpoyAMy2U5xWTYAiIiD4Up24inzh60wQgfaQqcTmDymW7avXAqTAxnr2y34atU0-nMmYifBEuaKIakzvaNXXrUgZFejDKlw2oPc1PY5yIxr63USv3iqLIxaDkmbqU43jq87EVQyl454jaM-eVL-iJvjpZBwxOoCQLCCw4YakRnxt5y7Bbtk0itpUfIEkoGjdkRveMm0gDwolF3LHAvEdNPEXiz6MDr9uWNEijBxvBI42afBv2BIjxfYKeC71BERaMXaV8nAJA2wsC2VFueX2YJLLVbLLnB_uYf6Eb84xKsABlYI__yHYxPrulT2_rwMufmE1Sa12qrNQFl3PeqhY9pqyBXLhogF-0iuMPg2y2b80co0sh2NVvHzAngNg45rOYPPbMCVpg7x65ypAXkf9XK7pIuAl4EzmTbn_KJGQHnY1hDuzdnPdLQ_3GgiaQSXldCT7scxFNchJleR3VWtd9tYtwl8TgKowFOHmn0-knAjgzH4QkA-Wwf4EEe9EuT5hUDdOIK4CFEMx9-qEGeGkOhzr8xb4cb82nddZU5jBzFGL5FKSY2h_RWGbGuffgpORq8GZN_OX665iJMQoXyC37mfCiZ3s2wj9ygzhzTgPUVQ-fbN0G9-aioL6DnYHk4uiuPylTn5MZeWtRY7qW8lpaz5QsexPy8rNxHMl43yBToaxPcddKBKdEVVgc_jp2a8U4kaS8Ea-lBwYH9yzHYwVOqm8xXNHHHVit-FfDN60-s2YmhDClCzmVWR7VaFEem_LTWhhHH3urPnkVRXutdl-SEV4AaKF7wdMUSGRoERQPxmVhKbhVooQiTZuDWc0SUsAKouB-B-r_BjmHZmlzOwVQVw_hZSCept_hLtmXXv7PEIhyBR1zHnOPPHsM8s4KYFjP-Ls5pZpWieO1IZwU2rGq-MSXZmEM.ie2DRoTujV4tGJO5xXtJEg'; 104 | 105 | // Use the retrieved access token to connect to the socket. 106 | // If Authorizer is not added to the request, server delivers a 401 response. 107 | // If an invalid Authorizer is added, server delivers a 500 response 108 | client.connect(`${host}?connectionType=${event}&Authorizer=${loginData.token}`); 109 | 110 | }) 111 | .catch((err) => { 112 | console.error('Unable to initialize socket connection', err.toString()); 113 | }); 114 | -------------------------------------------------------------------------------- /client/package.json: -------------------------------------------------------------------------------- 1 | { 2 | "name": "aws-secure-websockets-client", 3 | "version": "1.0.0", 4 | "description": "AWS secured socket client", 5 | "main": "index.js", 6 | "author": "Daniel Amores Álvarez ", 7 | "license": "MIT", 8 | "dependencies": { 9 | "axios": "0.19.0", 10 | "dotenv": "8.0.0", 11 | "websocket": "1.0.29" 12 | } 13 | } 14 | -------------------------------------------------------------------------------- /client/yarn.lock: -------------------------------------------------------------------------------- 1 | # THIS IS AN AUTOGENERATED FILE. DO NOT EDIT THIS FILE DIRECTLY. 2 | # yarn lockfile v1 3 | 4 | 5 | abbrev@1: 6 | version "1.1.1" 7 | resolved "https://registry.yarnpkg.com/abbrev/-/abbrev-1.1.1.tgz#f8f2c887ad10bf67f634f005b6987fed3179aac8" 8 | integrity sha512-nne9/IiQ/hzIhY6pdDnbBtz7DjPTKrY00P/zvPSm5pOFkl6xuGrGnXn/VtTNNfNtAfZ9/1RtehkszU9qcTii0Q== 9 | 10 | ansi-colors@^1.0.1: 11 | version "1.1.0" 12 | resolved "https://registry.yarnpkg.com/ansi-colors/-/ansi-colors-1.1.0.tgz#6374b4dd5d4718ff3ce27a671a3b1cad077132a9" 13 | integrity sha512-SFKX67auSNoVR38N3L+nvsPjOE0bybKTYbkf5tRvushrAPQ9V75huw0ZxBkKVeRU9kqH3d6HA4xTckbwZ4ixmA== 14 | dependencies: 15 | ansi-wrap "^0.1.0" 16 | 17 | ansi-gray@^0.1.1: 18 | version "0.1.1" 19 | resolved "https://registry.yarnpkg.com/ansi-gray/-/ansi-gray-0.1.1.tgz#2962cf54ec9792c48510a3deb524436861ef7251" 20 | integrity sha1-KWLPVOyXksSFEKPetSRDaGHvclE= 21 | dependencies: 22 | ansi-wrap "0.1.0" 23 | 24 | ansi-regex@^2.0.0: 25 | version "2.1.1" 26 | resolved "https://registry.yarnpkg.com/ansi-regex/-/ansi-regex-2.1.1.tgz#c3b33ab5ee360d86e0e628f0468ae7ef27d654df" 27 | integrity sha1-w7M6te42DYbg5ijwRorn7yfWVN8= 28 | 29 | ansi-regex@^3.0.0: 30 | version "3.0.0" 31 | resolved "https://registry.yarnpkg.com/ansi-regex/-/ansi-regex-3.0.0.tgz#ed0317c322064f79466c02966bddb605ab37d998" 32 | integrity sha1-7QMXwyIGT3lGbAKWa922Bas32Zg= 33 | 34 | ansi-wrap@0.1.0, ansi-wrap@^0.1.0: 35 | version "0.1.0" 36 | resolved "https://registry.yarnpkg.com/ansi-wrap/-/ansi-wrap-0.1.0.tgz#a82250ddb0015e9a27ca82e82ea603bbfa45efaf" 37 | integrity sha1-qCJQ3bABXponyoLoLqYDu/pF768= 38 | 39 | anymatch@^2.0.0: 40 | version "2.0.0" 41 | resolved "https://registry.yarnpkg.com/anymatch/-/anymatch-2.0.0.tgz#bcb24b4f37934d9aa7ac17b4adaf89e7c76ef2eb" 42 | integrity sha512-5teOsQWABXHHBFP9y3skS5P3d/WfWXpv3FUpy+LorMrNYaT9pI4oLMQX7jzQ2KklNpGpWHzdCXTDT2Y3XGlZBw== 43 | dependencies: 44 | micromatch "^3.1.4" 45 | normalize-path "^2.1.1" 46 | 47 | append-buffer@^1.0.2: 48 | version "1.0.2" 49 | resolved "https://registry.yarnpkg.com/append-buffer/-/append-buffer-1.0.2.tgz#d8220cf466081525efea50614f3de6514dfa58f1" 50 | integrity sha1-2CIM9GYIFSXv6lBhTz3mUU36WPE= 51 | dependencies: 52 | buffer-equal "^1.0.0" 53 | 54 | aproba@^1.0.3: 55 | version "1.2.0" 56 | resolved "https://registry.yarnpkg.com/aproba/-/aproba-1.2.0.tgz#6802e6264efd18c790a1b0d517f0f2627bf2c94a" 57 | integrity sha512-Y9J6ZjXtoYh8RnXVCMOU/ttDmk1aBjunq9vO0ta5x85WDQiQfUF9sIPBITdbiiIVcBo03Hi3jMxigBtsddlXRw== 58 | 59 | archy@^1.0.0: 60 | version "1.0.0" 61 | resolved "https://registry.yarnpkg.com/archy/-/archy-1.0.0.tgz#f9c8c13757cc1dd7bc379ac77b2c62a5c2868c40" 62 | integrity sha1-+cjBN1fMHde8N5rHeyxipcKGjEA= 63 | 64 | are-we-there-yet@~1.1.2: 65 | version "1.1.5" 66 | resolved "https://registry.yarnpkg.com/are-we-there-yet/-/are-we-there-yet-1.1.5.tgz#4b35c2944f062a8bfcda66410760350fe9ddfc21" 67 | integrity sha512-5hYdAkZlcG8tOLujVDTgCT+uPX0VnpAH28gWsLfzpXYm7wP6mp5Q/gYyR7YQ0cKVJcXJnl3j2kpBan13PtQf6w== 68 | dependencies: 69 | delegates "^1.0.0" 70 | readable-stream "^2.0.6" 71 | 72 | arr-diff@^4.0.0: 73 | version "4.0.0" 74 | resolved "https://registry.yarnpkg.com/arr-diff/-/arr-diff-4.0.0.tgz#d6461074febfec71e7e15235761a329a5dc7c520" 75 | integrity sha1-1kYQdP6/7HHn4VI1dhoyml3HxSA= 76 | 77 | arr-filter@^1.1.1: 78 | version "1.1.2" 79 | resolved "https://registry.yarnpkg.com/arr-filter/-/arr-filter-1.1.2.tgz#43fdddd091e8ef11aa4c45d9cdc18e2dff1711ee" 80 | integrity sha1-Q/3d0JHo7xGqTEXZzcGOLf8XEe4= 81 | dependencies: 82 | make-iterator "^1.0.0" 83 | 84 | arr-flatten@^1.0.1, arr-flatten@^1.1.0: 85 | version "1.1.0" 86 | resolved "https://registry.yarnpkg.com/arr-flatten/-/arr-flatten-1.1.0.tgz#36048bbff4e7b47e136644316c99669ea5ae91f1" 87 | integrity sha512-L3hKV5R/p5o81R7O02IGnwpDmkp6E982XhtbuwSe3O4qOtMMMtodicASA1Cny2U+aCXcNpml+m4dPsvsJ3jatg== 88 | 89 | arr-map@^2.0.0, arr-map@^2.0.2: 90 | version "2.0.2" 91 | resolved "https://registry.yarnpkg.com/arr-map/-/arr-map-2.0.2.tgz#3a77345ffc1cf35e2a91825601f9e58f2e24cac4" 92 | integrity sha1-Onc0X/wc814qkYJWAfnljy4kysQ= 93 | dependencies: 94 | make-iterator "^1.0.0" 95 | 96 | arr-union@^3.1.0: 97 | version "3.1.0" 98 | resolved "https://registry.yarnpkg.com/arr-union/-/arr-union-3.1.0.tgz#e39b09aea9def866a8f206e288af63919bae39c4" 99 | integrity sha1-45sJrqne+Gao8gbiiK9jkZuuOcQ= 100 | 101 | array-each@^1.0.0, array-each@^1.0.1: 102 | version "1.0.1" 103 | resolved "https://registry.yarnpkg.com/array-each/-/array-each-1.0.1.tgz#a794af0c05ab1752846ee753a1f211a05ba0c44f" 104 | integrity sha1-p5SvDAWrF1KEbudTofIRoFugxE8= 105 | 106 | array-initial@^1.0.0: 107 | version "1.1.0" 108 | resolved "https://registry.yarnpkg.com/array-initial/-/array-initial-1.1.0.tgz#2fa74b26739371c3947bd7a7adc73be334b3d795" 109 | integrity sha1-L6dLJnOTccOUe9enrcc74zSz15U= 110 | dependencies: 111 | array-slice "^1.0.0" 112 | is-number "^4.0.0" 113 | 114 | array-last@^1.1.1: 115 | version "1.3.0" 116 | resolved "https://registry.yarnpkg.com/array-last/-/array-last-1.3.0.tgz#7aa77073fec565ddab2493f5f88185f404a9d336" 117 | integrity sha512-eOCut5rXlI6aCOS7Z7kCplKRKyiFQ6dHFBem4PwlwKeNFk2/XxTrhRh5T9PyaEWGy/NHTZWbY+nsZlNFJu9rYg== 118 | dependencies: 119 | is-number "^4.0.0" 120 | 121 | array-slice@^1.0.0: 122 | version "1.1.0" 123 | resolved "https://registry.yarnpkg.com/array-slice/-/array-slice-1.1.0.tgz#e368ea15f89bc7069f7ffb89aec3a6c7d4ac22d4" 124 | integrity sha512-B1qMD3RBP7O8o0H2KbrXDyB0IccejMF15+87Lvlor12ONPRHP6gTjXMNkt/d3ZuOGbAe66hFmaCfECI24Ufp6w== 125 | 126 | array-sort@^1.0.0: 127 | version "1.0.0" 128 | resolved "https://registry.yarnpkg.com/array-sort/-/array-sort-1.0.0.tgz#e4c05356453f56f53512a7d1d6123f2c54c0a88a" 129 | integrity sha512-ihLeJkonmdiAsD7vpgN3CRcx2J2S0TiYW+IS/5zHBI7mKUq3ySvBdzzBfD236ubDBQFiiyG3SWCPc+msQ9KoYg== 130 | dependencies: 131 | default-compare "^1.0.0" 132 | get-value "^2.0.6" 133 | kind-of "^5.0.2" 134 | 135 | array-unique@^0.3.2: 136 | version "0.3.2" 137 | resolved "https://registry.yarnpkg.com/array-unique/-/array-unique-0.3.2.tgz#a894b75d4bc4f6cd679ef3244a9fd8f46ae2d428" 138 | integrity sha1-qJS3XUvE9s1nnvMkSp/Y9Gri1Cg= 139 | 140 | assign-symbols@^1.0.0: 141 | version "1.0.0" 142 | resolved "https://registry.yarnpkg.com/assign-symbols/-/assign-symbols-1.0.0.tgz#59667f41fadd4f20ccbc2bb96b8d4f7f78ec0367" 143 | integrity sha1-WWZ/QfrdTyDMvCu5a41Pf3jsA2c= 144 | 145 | async-done@^1.2.0, async-done@^1.2.2: 146 | version "1.3.2" 147 | resolved "https://registry.yarnpkg.com/async-done/-/async-done-1.3.2.tgz#5e15aa729962a4b07414f528a88cdf18e0b290a2" 148 | integrity sha512-uYkTP8dw2og1tu1nmza1n1CMW0qb8gWWlwqMmLb7MhBVs4BXrFziT6HXUd+/RlRA/i4H9AkofYloUbs1fwMqlw== 149 | dependencies: 150 | end-of-stream "^1.1.0" 151 | once "^1.3.2" 152 | process-nextick-args "^2.0.0" 153 | stream-exhaust "^1.0.1" 154 | 155 | async-each@^1.0.1: 156 | version "1.0.3" 157 | resolved "https://registry.yarnpkg.com/async-each/-/async-each-1.0.3.tgz#b727dbf87d7651602f06f4d4ac387f47d91b0cbf" 158 | integrity sha512-z/WhQ5FPySLdvREByI2vZiTWwCnF0moMJ1hK9YQwDTHKh6I7/uSckMetoRGb5UBZPC1z0jlw+n/XCgjeH7y1AQ== 159 | 160 | async-settle@^1.0.0: 161 | version "1.0.0" 162 | resolved "https://registry.yarnpkg.com/async-settle/-/async-settle-1.0.0.tgz#1d0a914bb02575bec8a8f3a74e5080f72b2c0c6b" 163 | integrity sha1-HQqRS7Aldb7IqPOnTlCA9yssDGs= 164 | dependencies: 165 | async-done "^1.2.2" 166 | 167 | atob@^2.1.1: 168 | version "2.1.2" 169 | resolved "https://registry.yarnpkg.com/atob/-/atob-2.1.2.tgz#6d9517eb9e030d2436666651e86bd9f6f13533c9" 170 | integrity sha512-Wm6ukoaOGJi/73p/cl2GvLjTI5JM1k/O14isD73YML8StrH/7/lRFgmg8nICZgD3bZZvjwCGxtMOD3wWNAu8cg== 171 | 172 | axios@^0.19.0: 173 | version "0.19.0" 174 | resolved "https://registry.yarnpkg.com/axios/-/axios-0.19.0.tgz#8e09bff3d9122e133f7b8101c8fbdd00ed3d2ab8" 175 | integrity sha512-1uvKqKQta3KBxIz14F2v06AEHZ/dIoeKfbTRkK1E5oqjDnuEerLmYTgJB5AiQZHJcljpg1TuRzdjDR06qNk0DQ== 176 | dependencies: 177 | follow-redirects "1.5.10" 178 | is-buffer "^2.0.2" 179 | 180 | bach@^1.0.0: 181 | version "1.2.0" 182 | resolved "https://registry.yarnpkg.com/bach/-/bach-1.2.0.tgz#4b3ce96bf27134f79a1b414a51c14e34c3bd9880" 183 | integrity sha1-Szzpa/JxNPeaG0FKUcFONMO9mIA= 184 | dependencies: 185 | arr-filter "^1.1.1" 186 | arr-flatten "^1.0.1" 187 | arr-map "^2.0.0" 188 | array-each "^1.0.0" 189 | array-initial "^1.0.0" 190 | array-last "^1.1.1" 191 | async-done "^1.2.2" 192 | async-settle "^1.0.0" 193 | now-and-later "^2.0.0" 194 | 195 | balanced-match@^1.0.0: 196 | version "1.0.0" 197 | resolved "https://registry.yarnpkg.com/balanced-match/-/balanced-match-1.0.0.tgz#89b4d199ab2bee49de164ea02b89ce462d71b767" 198 | integrity sha1-ibTRmasr7kneFk6gK4nORi1xt2c= 199 | 200 | base@^0.11.1: 201 | version "0.11.2" 202 | resolved "https://registry.yarnpkg.com/base/-/base-0.11.2.tgz#7bde5ced145b6d551a90db87f83c558b4eb48a8f" 203 | integrity sha512-5T6P4xPgpp0YDFvSWwEZ4NoE3aM4QBQXDzmVbraCkFj8zHM+mba8SyqB5DbZWyR7mYHo6Y7BdQo3MoA4m0TeQg== 204 | dependencies: 205 | cache-base "^1.0.1" 206 | class-utils "^0.3.5" 207 | component-emitter "^1.2.1" 208 | define-property "^1.0.0" 209 | isobject "^3.0.1" 210 | mixin-deep "^1.2.0" 211 | pascalcase "^0.1.1" 212 | 213 | binary-extensions@^1.0.0: 214 | version "1.13.1" 215 | resolved "https://registry.yarnpkg.com/binary-extensions/-/binary-extensions-1.13.1.tgz#598afe54755b2868a5330d2aff9d4ebb53209b65" 216 | integrity sha512-Un7MIEDdUC5gNpcGDV97op1Ywk748MpHcFTHoYs6qnj1Z3j7I53VG3nwZhKzoBZmbdRNnb6WRdFlwl7tSDuZGw== 217 | 218 | brace-expansion@^1.1.7: 219 | version "1.1.11" 220 | resolved "https://registry.yarnpkg.com/brace-expansion/-/brace-expansion-1.1.11.tgz#3c7fcbf529d87226f3d2f52b966ff5271eb441dd" 221 | integrity sha512-iCuPHDFgrHX7H2vEI/5xpz07zSHB00TpugqhmYtVmMO6518mCuRMoOYFldEBl0g187ufozdaHgWKcYFb61qGiA== 222 | dependencies: 223 | balanced-match "^1.0.0" 224 | concat-map "0.0.1" 225 | 226 | braces@^2.3.1, braces@^2.3.2: 227 | version "2.3.2" 228 | resolved "https://registry.yarnpkg.com/braces/-/braces-2.3.2.tgz#5979fd3f14cd531565e5fa2df1abfff1dfaee729" 229 | integrity sha512-aNdbnj9P8PjdXU4ybaWLK2IF3jc/EoDYbC7AazW6to3TRsfXxscC9UXOB5iDiEQrkyIbWp2SLQda4+QAa7nc3w== 230 | dependencies: 231 | arr-flatten "^1.1.0" 232 | array-unique "^0.3.2" 233 | extend-shallow "^2.0.1" 234 | fill-range "^4.0.0" 235 | isobject "^3.0.1" 236 | repeat-element "^1.1.2" 237 | snapdragon "^0.8.1" 238 | snapdragon-node "^2.0.1" 239 | split-string "^3.0.2" 240 | to-regex "^3.0.1" 241 | 242 | buffer-equal@^1.0.0: 243 | version "1.0.0" 244 | resolved "https://registry.yarnpkg.com/buffer-equal/-/buffer-equal-1.0.0.tgz#59616b498304d556abd466966b22eeda3eca5fbe" 245 | integrity sha1-WWFrSYME1Var1GaWayLu2j7KX74= 246 | 247 | buffer-from@^1.0.0: 248 | version "1.1.1" 249 | resolved "https://registry.yarnpkg.com/buffer-from/-/buffer-from-1.1.1.tgz#32713bc028f75c02fdb710d7c7bcec1f2c6070ef" 250 | integrity sha512-MQcXEUbCKtEo7bhqEs6560Hyd4XaovZlO/k9V3hjVUF/zwW7KBVdSK4gIt/bzwS9MbR5qob+F5jusZsb0YQK2A== 251 | 252 | cache-base@^1.0.1: 253 | version "1.0.1" 254 | resolved "https://registry.yarnpkg.com/cache-base/-/cache-base-1.0.1.tgz#0a7f46416831c8b662ee36fe4e7c59d76f666ab2" 255 | integrity sha512-AKcdTnFSWATd5/GCPRxr2ChwIJ85CeyrEyjRHlKxQ56d4XJMGym0uAiKn0xbLOGOl3+yRpOTi484dVCEc5AUzQ== 256 | dependencies: 257 | collection-visit "^1.0.0" 258 | component-emitter "^1.2.1" 259 | get-value "^2.0.6" 260 | has-value "^1.0.0" 261 | isobject "^3.0.1" 262 | set-value "^2.0.0" 263 | to-object-path "^0.3.0" 264 | union-value "^1.0.0" 265 | unset-value "^1.0.0" 266 | 267 | camelcase@^3.0.0: 268 | version "3.0.0" 269 | resolved "https://registry.yarnpkg.com/camelcase/-/camelcase-3.0.0.tgz#32fc4b9fcdaf845fcdf7e73bb97cac2261f0ab0a" 270 | integrity sha1-MvxLn82vhF/N9+c7uXysImHwqwo= 271 | 272 | chokidar@^2.0.0: 273 | version "2.1.6" 274 | resolved "https://registry.yarnpkg.com/chokidar/-/chokidar-2.1.6.tgz#b6cad653a929e244ce8a834244164d241fa954c5" 275 | integrity sha512-V2jUo67OKkc6ySiRpJrjlpJKl9kDuG+Xb8VgsGzb+aEouhgS1D0weyPU4lEzdAcsCAvrih2J2BqyXqHWvVLw5g== 276 | dependencies: 277 | anymatch "^2.0.0" 278 | async-each "^1.0.1" 279 | braces "^2.3.2" 280 | glob-parent "^3.1.0" 281 | inherits "^2.0.3" 282 | is-binary-path "^1.0.0" 283 | is-glob "^4.0.0" 284 | normalize-path "^3.0.0" 285 | path-is-absolute "^1.0.0" 286 | readdirp "^2.2.1" 287 | upath "^1.1.1" 288 | optionalDependencies: 289 | fsevents "^1.2.7" 290 | 291 | chownr@^1.1.1: 292 | version "1.1.2" 293 | resolved "https://registry.yarnpkg.com/chownr/-/chownr-1.1.2.tgz#a18f1e0b269c8a6a5d3c86eb298beb14c3dd7bf6" 294 | integrity sha512-GkfeAQh+QNy3wquu9oIZr6SS5x7wGdSgNQvD10X3r+AZr1Oys22HW8kAmDMvNg2+Dm0TeGaEuO8gFwdBXxwO8A== 295 | 296 | class-utils@^0.3.5: 297 | version "0.3.6" 298 | resolved "https://registry.yarnpkg.com/class-utils/-/class-utils-0.3.6.tgz#f93369ae8b9a7ce02fd41faad0ca83033190c463" 299 | integrity sha512-qOhPa/Fj7s6TY8H8esGu5QNpMMQxz79h+urzrNYN6mn+9BnxlDGf5QZ+XeCDsxSjPqsSR56XOZOJmpeurnLMeg== 300 | dependencies: 301 | arr-union "^3.1.0" 302 | define-property "^0.2.5" 303 | isobject "^3.0.0" 304 | static-extend "^0.1.1" 305 | 306 | cliui@^3.2.0: 307 | version "3.2.0" 308 | resolved "https://registry.yarnpkg.com/cliui/-/cliui-3.2.0.tgz#120601537a916d29940f934da3b48d585a39213d" 309 | integrity sha1-EgYBU3qRbSmUD5NNo7SNWFo5IT0= 310 | dependencies: 311 | string-width "^1.0.1" 312 | strip-ansi "^3.0.1" 313 | wrap-ansi "^2.0.0" 314 | 315 | clone-buffer@^1.0.0: 316 | version "1.0.0" 317 | resolved "https://registry.yarnpkg.com/clone-buffer/-/clone-buffer-1.0.0.tgz#e3e25b207ac4e701af721e2cb5a16792cac3dc58" 318 | integrity sha1-4+JbIHrE5wGvch4staFnksrD3Fg= 319 | 320 | clone-stats@^1.0.0: 321 | version "1.0.0" 322 | resolved "https://registry.yarnpkg.com/clone-stats/-/clone-stats-1.0.0.tgz#b3782dff8bb5474e18b9b6bf0fdfe782f8777680" 323 | integrity sha1-s3gt/4u1R04Yuba/D9/ngvh3doA= 324 | 325 | clone@^2.1.1: 326 | version "2.1.2" 327 | resolved "https://registry.yarnpkg.com/clone/-/clone-2.1.2.tgz#1b7f4b9f591f1e8f83670401600345a02887435f" 328 | integrity sha1-G39Ln1kfHo+DZwQBYANFoCiHQ18= 329 | 330 | cloneable-readable@^1.0.0: 331 | version "1.1.3" 332 | resolved "https://registry.yarnpkg.com/cloneable-readable/-/cloneable-readable-1.1.3.tgz#120a00cb053bfb63a222e709f9683ea2e11d8cec" 333 | integrity sha512-2EF8zTQOxYq70Y4XKtorQupqF0m49MBz2/yf5Bj+MHjvpG3Hy7sImifnqD6UA+TKYxeSV+u6qqQPawN5UvnpKQ== 334 | dependencies: 335 | inherits "^2.0.1" 336 | process-nextick-args "^2.0.0" 337 | readable-stream "^2.3.5" 338 | 339 | code-point-at@^1.0.0: 340 | version "1.1.0" 341 | resolved "https://registry.yarnpkg.com/code-point-at/-/code-point-at-1.1.0.tgz#0d070b4d043a5bea33a2f1a40e2edb3d9a4ccf77" 342 | integrity sha1-DQcLTQQ6W+ozovGkDi7bPZpMz3c= 343 | 344 | collection-map@^1.0.0: 345 | version "1.0.0" 346 | resolved "https://registry.yarnpkg.com/collection-map/-/collection-map-1.0.0.tgz#aea0f06f8d26c780c2b75494385544b2255af18c" 347 | integrity sha1-rqDwb40mx4DCt1SUOFVEsiVa8Yw= 348 | dependencies: 349 | arr-map "^2.0.2" 350 | for-own "^1.0.0" 351 | make-iterator "^1.0.0" 352 | 353 | collection-visit@^1.0.0: 354 | version "1.0.0" 355 | resolved "https://registry.yarnpkg.com/collection-visit/-/collection-visit-1.0.0.tgz#4bc0373c164bc3291b4d368c829cf1a80a59dca0" 356 | integrity sha1-S8A3PBZLwykbTTaMgpzxqApZ3KA= 357 | dependencies: 358 | map-visit "^1.0.0" 359 | object-visit "^1.0.0" 360 | 361 | color-support@^1.1.3: 362 | version "1.1.3" 363 | resolved "https://registry.yarnpkg.com/color-support/-/color-support-1.1.3.tgz#93834379a1cc9a0c61f82f52f0d04322251bd5a2" 364 | integrity sha512-qiBjkpbMLO/HL68y+lh4q0/O1MZFj2RX6X/KmMa3+gJD3z+WwI1ZzDHysvqHGS3mP6mznPckpXmw1nI9cJjyRg== 365 | 366 | component-emitter@^1.2.1: 367 | version "1.3.0" 368 | resolved "https://registry.yarnpkg.com/component-emitter/-/component-emitter-1.3.0.tgz#16e4070fba8ae29b679f2215853ee181ab2eabc0" 369 | integrity sha512-Rd3se6QB+sO1TwqZjscQrurpEPIfO0/yYnSin6Q/rD3mOutHvUrCAhJub3r90uNb+SESBuE0QYoB90YdfatsRg== 370 | 371 | concat-map@0.0.1: 372 | version "0.0.1" 373 | resolved "https://registry.yarnpkg.com/concat-map/-/concat-map-0.0.1.tgz#d8a96bd77fd68df7793a73036a3ba0d5405d477b" 374 | integrity sha1-2Klr13/Wjfd5OnMDajug1UBdR3s= 375 | 376 | concat-stream@^1.6.0: 377 | version "1.6.2" 378 | resolved "https://registry.yarnpkg.com/concat-stream/-/concat-stream-1.6.2.tgz#904bdf194cd3122fc675c77fc4ac3d4ff0fd1a34" 379 | integrity sha512-27HBghJxjiZtIk3Ycvn/4kbJk/1uZuJFfuPEns6LaEvpvG1f0hTea8lilrouyo9mVc2GWdcEZ8OLoGmSADlrCw== 380 | dependencies: 381 | buffer-from "^1.0.0" 382 | inherits "^2.0.3" 383 | readable-stream "^2.2.2" 384 | typedarray "^0.0.6" 385 | 386 | console-control-strings@^1.0.0, console-control-strings@~1.1.0: 387 | version "1.1.0" 388 | resolved "https://registry.yarnpkg.com/console-control-strings/-/console-control-strings-1.1.0.tgz#3d7cf4464db6446ea644bf4b39507f9851008e8e" 389 | integrity sha1-PXz0Rk22RG6mRL9LOVB/mFEAjo4= 390 | 391 | convert-source-map@^1.5.0: 392 | version "1.6.0" 393 | resolved "https://registry.yarnpkg.com/convert-source-map/-/convert-source-map-1.6.0.tgz#51b537a8c43e0f04dec1993bffcdd504e758ac20" 394 | integrity sha512-eFu7XigvxdZ1ETfbgPBohgyQ/Z++C0eEhTor0qRwBw9unw+L0/6V8wkSuGgzdThkiS5lSpdptOQPD8Ak40a+7A== 395 | dependencies: 396 | safe-buffer "~5.1.1" 397 | 398 | copy-descriptor@^0.1.0: 399 | version "0.1.1" 400 | resolved "https://registry.yarnpkg.com/copy-descriptor/-/copy-descriptor-0.1.1.tgz#676f6eb3c39997c2ee1ac3a924fd6124748f578d" 401 | integrity sha1-Z29us8OZl8LuGsOpJP1hJHSPV40= 402 | 403 | copy-props@^2.0.1: 404 | version "2.0.4" 405 | resolved "https://registry.yarnpkg.com/copy-props/-/copy-props-2.0.4.tgz#93bb1cadfafd31da5bb8a9d4b41f471ec3a72dfe" 406 | integrity sha512-7cjuUME+p+S3HZlbllgsn2CDwS+5eCCX16qBgNC4jgSTf49qR1VKy/Zhl400m0IQXl/bPGEVqncgUUMjrr4s8A== 407 | dependencies: 408 | each-props "^1.3.0" 409 | is-plain-object "^2.0.1" 410 | 411 | core-util-is@~1.0.0: 412 | version "1.0.2" 413 | resolved "https://registry.yarnpkg.com/core-util-is/-/core-util-is-1.0.2.tgz#b5fd54220aa2bc5ab57aab7140c940754503c1a7" 414 | integrity sha1-tf1UIgqivFq1eqtxQMlAdUUDwac= 415 | 416 | d@1: 417 | version "1.0.1" 418 | resolved "https://registry.yarnpkg.com/d/-/d-1.0.1.tgz#8698095372d58dbee346ffd0c7093f99f8f9eb5a" 419 | integrity sha512-m62ShEObQ39CfralilEQRjH6oAMtNCV1xJyEx5LpRYUVN+EviphDgUc/F3hnYbADmkiNs67Y+3ylmlG7Lnu+FA== 420 | dependencies: 421 | es5-ext "^0.10.50" 422 | type "^1.0.1" 423 | 424 | debug@=3.1.0: 425 | version "3.1.0" 426 | resolved "https://registry.yarnpkg.com/debug/-/debug-3.1.0.tgz#5bb5a0672628b64149566ba16819e61518c67261" 427 | integrity sha512-OX8XqP7/1a9cqkxYw2yXss15f26NKWBpDXQd0/uK/KPqdQhxbPa994hnzjcE2VqQpDslf55723cKPUOGSmMY3g== 428 | dependencies: 429 | ms "2.0.0" 430 | 431 | debug@^2.2.0, debug@^2.3.3: 432 | version "2.6.9" 433 | resolved "https://registry.yarnpkg.com/debug/-/debug-2.6.9.tgz#5d128515df134ff327e90a4c93f4e077a536341f" 434 | integrity sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA== 435 | dependencies: 436 | ms "2.0.0" 437 | 438 | debug@^3.2.6: 439 | version "3.2.6" 440 | resolved "https://registry.yarnpkg.com/debug/-/debug-3.2.6.tgz#e83d17de16d8a7efb7717edbe5fb10135eee629b" 441 | integrity sha512-mel+jf7nrtEl5Pn1Qx46zARXKDpBbvzezse7p7LqINmdoIk8PYP5SySaxEmYv6TZ0JyEKA1hsCId6DIhgITtWQ== 442 | dependencies: 443 | ms "^2.1.1" 444 | 445 | decamelize@^1.1.1: 446 | version "1.2.0" 447 | resolved "https://registry.yarnpkg.com/decamelize/-/decamelize-1.2.0.tgz#f6534d15148269b20352e7bee26f501f9a191290" 448 | integrity sha1-9lNNFRSCabIDUue+4m9QH5oZEpA= 449 | 450 | decode-uri-component@^0.2.0: 451 | version "0.2.0" 452 | resolved "https://registry.yarnpkg.com/decode-uri-component/-/decode-uri-component-0.2.0.tgz#eb3913333458775cb84cd1a1fae062106bb87545" 453 | integrity sha1-6zkTMzRYd1y4TNGh+uBiEGu4dUU= 454 | 455 | deep-extend@^0.6.0: 456 | version "0.6.0" 457 | resolved "https://registry.yarnpkg.com/deep-extend/-/deep-extend-0.6.0.tgz#c4fa7c95404a17a9c3e8ca7e1537312b736330ac" 458 | integrity sha512-LOHxIOaPYdHlJRtCQfDIVZtfw/ufM8+rVj649RIHzcm/vGwQRXFt6OPqIFWsm2XEMrNIEtWR64sY1LEKD2vAOA== 459 | 460 | default-compare@^1.0.0: 461 | version "1.0.0" 462 | resolved "https://registry.yarnpkg.com/default-compare/-/default-compare-1.0.0.tgz#cb61131844ad84d84788fb68fd01681ca7781a2f" 463 | integrity sha512-QWfXlM0EkAbqOCbD/6HjdwT19j7WCkMyiRhWilc4H9/5h/RzTF9gv5LYh1+CmDV5d1rki6KAWLtQale0xt20eQ== 464 | dependencies: 465 | kind-of "^5.0.2" 466 | 467 | default-resolution@^2.0.0: 468 | version "2.0.0" 469 | resolved "https://registry.yarnpkg.com/default-resolution/-/default-resolution-2.0.0.tgz#bcb82baa72ad79b426a76732f1a81ad6df26d684" 470 | integrity sha1-vLgrqnKtebQmp2cy8aga1t8m1oQ= 471 | 472 | define-properties@^1.1.2: 473 | version "1.1.3" 474 | resolved "https://registry.yarnpkg.com/define-properties/-/define-properties-1.1.3.tgz#cf88da6cbee26fe6db7094f61d870cbd84cee9f1" 475 | integrity sha512-3MqfYKj2lLzdMSf8ZIZE/V+Zuy+BgD6f164e8K2w7dgnpKArBDerGYpM46IYYcjnkdPNMjPk9A6VFB8+3SKlXQ== 476 | dependencies: 477 | object-keys "^1.0.12" 478 | 479 | define-property@^0.2.5: 480 | version "0.2.5" 481 | resolved "https://registry.yarnpkg.com/define-property/-/define-property-0.2.5.tgz#c35b1ef918ec3c990f9a5bc57be04aacec5c8116" 482 | integrity sha1-w1se+RjsPJkPmlvFe+BKrOxcgRY= 483 | dependencies: 484 | is-descriptor "^0.1.0" 485 | 486 | define-property@^1.0.0: 487 | version "1.0.0" 488 | resolved "https://registry.yarnpkg.com/define-property/-/define-property-1.0.0.tgz#769ebaaf3f4a63aad3af9e8d304c9bbe79bfb0e6" 489 | integrity sha1-dp66rz9KY6rTr56NMEybvnm/sOY= 490 | dependencies: 491 | is-descriptor "^1.0.0" 492 | 493 | define-property@^2.0.2: 494 | version "2.0.2" 495 | resolved "https://registry.yarnpkg.com/define-property/-/define-property-2.0.2.tgz#d459689e8d654ba77e02a817f8710d702cb16e9d" 496 | integrity sha512-jwK2UV4cnPpbcG7+VRARKTZPUWowwXA8bzH5NP6ud0oeAxyYPuGZUAC7hMugpCdz4BeSZl2Dl9k66CHJ/46ZYQ== 497 | dependencies: 498 | is-descriptor "^1.0.2" 499 | isobject "^3.0.1" 500 | 501 | delegates@^1.0.0: 502 | version "1.0.0" 503 | resolved "https://registry.yarnpkg.com/delegates/-/delegates-1.0.0.tgz#84c6e159b81904fdca59a0ef44cd870d31250f9a" 504 | integrity sha1-hMbhWbgZBP3KWaDvRM2HDTElD5o= 505 | 506 | detect-file@^1.0.0: 507 | version "1.0.0" 508 | resolved "https://registry.yarnpkg.com/detect-file/-/detect-file-1.0.0.tgz#f0d66d03672a825cb1b73bdb3fe62310c8e552b7" 509 | integrity sha1-8NZtA2cqglyxtzvbP+YjEMjlUrc= 510 | 511 | detect-libc@^1.0.2: 512 | version "1.0.3" 513 | resolved "https://registry.yarnpkg.com/detect-libc/-/detect-libc-1.0.3.tgz#fa137c4bd698edf55cd5cd02ac559f91a4c4ba9b" 514 | integrity sha1-+hN8S9aY7fVc1c0CrFWfkaTEups= 515 | 516 | dotenv@^8.0.0: 517 | version "8.0.0" 518 | resolved "https://registry.yarnpkg.com/dotenv/-/dotenv-8.0.0.tgz#ed310c165b4e8a97bb745b0a9d99c31bda566440" 519 | integrity sha512-30xVGqjLjiUOArT4+M5q9sYdvuR4riM6yK9wMcas9Vbp6zZa+ocC9dp6QoftuhTPhFAiLK/0C5Ni2nou/Bk8lg== 520 | 521 | duplexify@^3.6.0: 522 | version "3.7.1" 523 | resolved "https://registry.yarnpkg.com/duplexify/-/duplexify-3.7.1.tgz#2a4df5317f6ccfd91f86d6fd25d8d8a103b88309" 524 | integrity sha512-07z8uv2wMyS51kKhD1KsdXJg5WQ6t93RneqRxUHnskXVtlYYkLqM0gqStQZ3pj073g687jPCHrqNfCzawLYh5g== 525 | dependencies: 526 | end-of-stream "^1.0.0" 527 | inherits "^2.0.1" 528 | readable-stream "^2.0.0" 529 | stream-shift "^1.0.0" 530 | 531 | each-props@^1.3.0: 532 | version "1.3.2" 533 | resolved "https://registry.yarnpkg.com/each-props/-/each-props-1.3.2.tgz#ea45a414d16dd5cfa419b1a81720d5ca06892333" 534 | integrity sha512-vV0Hem3zAGkJAyU7JSjixeU66rwdynTAa1vofCrSA5fEln+m67Az9CcnkVD776/fsN/UjIWmBDoNRS6t6G9RfA== 535 | dependencies: 536 | is-plain-object "^2.0.1" 537 | object.defaults "^1.1.0" 538 | 539 | end-of-stream@^1.0.0, end-of-stream@^1.1.0: 540 | version "1.4.1" 541 | resolved "https://registry.yarnpkg.com/end-of-stream/-/end-of-stream-1.4.1.tgz#ed29634d19baba463b6ce6b80a37213eab71ec43" 542 | integrity sha512-1MkrZNvWTKCaigbn+W15elq2BB/L22nqrSY5DKlo3X6+vclJm8Bb5djXJBmEX6fS3+zCh/F4VBK5Z2KxJt4s2Q== 543 | dependencies: 544 | once "^1.4.0" 545 | 546 | error-ex@^1.2.0: 547 | version "1.3.2" 548 | resolved "https://registry.yarnpkg.com/error-ex/-/error-ex-1.3.2.tgz#b4ac40648107fdcdcfae242f428bea8a14d4f1bf" 549 | integrity sha512-7dFHNmqeFSEt2ZBsCriorKnn3Z2pj+fd9kmI6QoWw4//DL+icEBfc0U7qJCisqrTsKTjw4fNFy2pW9OqStD84g== 550 | dependencies: 551 | is-arrayish "^0.2.1" 552 | 553 | es5-ext@^0.10.35, es5-ext@^0.10.46, es5-ext@^0.10.50, es5-ext@~0.10.14: 554 | version "0.10.50" 555 | resolved "https://registry.yarnpkg.com/es5-ext/-/es5-ext-0.10.50.tgz#6d0e23a0abdb27018e5ac4fd09b412bc5517a778" 556 | integrity sha512-KMzZTPBkeQV/JcSQhI5/z6d9VWJ3EnQ194USTUwIYZ2ZbpN8+SGXQKt1h68EX44+qt+Fzr8DO17vnxrw7c3agw== 557 | dependencies: 558 | es6-iterator "~2.0.3" 559 | es6-symbol "~3.1.1" 560 | next-tick "^1.0.0" 561 | 562 | es6-iterator@^2.0.1, es6-iterator@^2.0.3, es6-iterator@~2.0.3: 563 | version "2.0.3" 564 | resolved "https://registry.yarnpkg.com/es6-iterator/-/es6-iterator-2.0.3.tgz#a7de889141a05a94b0854403b2d0a0fbfa98f3b7" 565 | integrity sha1-p96IkUGgWpSwhUQDstCg+/qY87c= 566 | dependencies: 567 | d "1" 568 | es5-ext "^0.10.35" 569 | es6-symbol "^3.1.1" 570 | 571 | es6-symbol@^3.1.1, es6-symbol@~3.1.1: 572 | version "3.1.1" 573 | resolved "https://registry.yarnpkg.com/es6-symbol/-/es6-symbol-3.1.1.tgz#bf00ef4fdab6ba1b46ecb7b629b4c7ed5715cc77" 574 | integrity sha1-vwDvT9q2uhtG7Le2KbTH7VcVzHc= 575 | dependencies: 576 | d "1" 577 | es5-ext "~0.10.14" 578 | 579 | es6-weak-map@^2.0.1: 580 | version "2.0.3" 581 | resolved "https://registry.yarnpkg.com/es6-weak-map/-/es6-weak-map-2.0.3.tgz#b6da1f16cc2cc0d9be43e6bdbfc5e7dfcdf31d53" 582 | integrity sha512-p5um32HOTO1kP+w7PRnB+5lQ43Z6muuMuIMffvDN8ZB4GcnjLBV6zGStpbASIMk4DCAvEaamhe2zhyCb/QXXsA== 583 | dependencies: 584 | d "1" 585 | es5-ext "^0.10.46" 586 | es6-iterator "^2.0.3" 587 | es6-symbol "^3.1.1" 588 | 589 | expand-brackets@^2.1.4: 590 | version "2.1.4" 591 | resolved "https://registry.yarnpkg.com/expand-brackets/-/expand-brackets-2.1.4.tgz#b77735e315ce30f6b6eff0f83b04151a22449622" 592 | integrity sha1-t3c14xXOMPa27/D4OwQVGiJEliI= 593 | dependencies: 594 | debug "^2.3.3" 595 | define-property "^0.2.5" 596 | extend-shallow "^2.0.1" 597 | posix-character-classes "^0.1.0" 598 | regex-not "^1.0.0" 599 | snapdragon "^0.8.1" 600 | to-regex "^3.0.1" 601 | 602 | expand-tilde@^2.0.0, expand-tilde@^2.0.2: 603 | version "2.0.2" 604 | resolved "https://registry.yarnpkg.com/expand-tilde/-/expand-tilde-2.0.2.tgz#97e801aa052df02454de46b02bf621642cdc8502" 605 | integrity sha1-l+gBqgUt8CRU3kawK/YhZCzchQI= 606 | dependencies: 607 | homedir-polyfill "^1.0.1" 608 | 609 | extend-shallow@^2.0.1: 610 | version "2.0.1" 611 | resolved "https://registry.yarnpkg.com/extend-shallow/-/extend-shallow-2.0.1.tgz#51af7d614ad9a9f610ea1bafbb989d6b1c56890f" 612 | integrity sha1-Ua99YUrZqfYQ6huvu5idaxxWiQ8= 613 | dependencies: 614 | is-extendable "^0.1.0" 615 | 616 | extend-shallow@^3.0.0, extend-shallow@^3.0.2: 617 | version "3.0.2" 618 | resolved "https://registry.yarnpkg.com/extend-shallow/-/extend-shallow-3.0.2.tgz#26a71aaf073b39fb2127172746131c2704028db8" 619 | integrity sha1-Jqcarwc7OfshJxcnRhMcJwQCjbg= 620 | dependencies: 621 | assign-symbols "^1.0.0" 622 | is-extendable "^1.0.1" 623 | 624 | extend@^3.0.0: 625 | version "3.0.2" 626 | resolved "https://registry.yarnpkg.com/extend/-/extend-3.0.2.tgz#f8b1136b4071fbd8eb140aff858b1019ec2915fa" 627 | integrity sha512-fjquC59cD7CyW6urNXK0FBufkZcoiGG80wTuPujX590cB5Ttln20E2UB4S/WARVqhXffZl2LNgS+gQdPIIim/g== 628 | 629 | extglob@^2.0.4: 630 | version "2.0.4" 631 | resolved "https://registry.yarnpkg.com/extglob/-/extglob-2.0.4.tgz#ad00fe4dc612a9232e8718711dc5cb5ab0285543" 632 | integrity sha512-Nmb6QXkELsuBr24CJSkilo6UHHgbekK5UiZgfE6UHD3Eb27YC6oD+bhcT+tJ6cl8dmsgdQxnWlcry8ksBIBLpw== 633 | dependencies: 634 | array-unique "^0.3.2" 635 | define-property "^1.0.0" 636 | expand-brackets "^2.1.4" 637 | extend-shallow "^2.0.1" 638 | fragment-cache "^0.2.1" 639 | regex-not "^1.0.0" 640 | snapdragon "^0.8.1" 641 | to-regex "^3.0.1" 642 | 643 | fancy-log@^1.3.2: 644 | version "1.3.3" 645 | resolved "https://registry.yarnpkg.com/fancy-log/-/fancy-log-1.3.3.tgz#dbc19154f558690150a23953a0adbd035be45fc7" 646 | integrity sha512-k9oEhlyc0FrVh25qYuSELjr8oxsCoc4/LEZfg2iJJrfEk/tZL9bCoJE47gqAvI2m/AUjluCS4+3I0eTx8n3AEw== 647 | dependencies: 648 | ansi-gray "^0.1.1" 649 | color-support "^1.1.3" 650 | parse-node-version "^1.0.0" 651 | time-stamp "^1.0.0" 652 | 653 | fill-range@^4.0.0: 654 | version "4.0.0" 655 | resolved "https://registry.yarnpkg.com/fill-range/-/fill-range-4.0.0.tgz#d544811d428f98eb06a63dc402d2403c328c38f7" 656 | integrity sha1-1USBHUKPmOsGpj3EAtJAPDKMOPc= 657 | dependencies: 658 | extend-shallow "^2.0.1" 659 | is-number "^3.0.0" 660 | repeat-string "^1.6.1" 661 | to-regex-range "^2.1.0" 662 | 663 | find-up@^1.0.0: 664 | version "1.1.2" 665 | resolved "https://registry.yarnpkg.com/find-up/-/find-up-1.1.2.tgz#6b2e9822b1a2ce0a60ab64d610eccad53cb24d0f" 666 | integrity sha1-ay6YIrGizgpgq2TWEOzK1TyyTQ8= 667 | dependencies: 668 | path-exists "^2.0.0" 669 | pinkie-promise "^2.0.0" 670 | 671 | findup-sync@^2.0.0: 672 | version "2.0.0" 673 | resolved "https://registry.yarnpkg.com/findup-sync/-/findup-sync-2.0.0.tgz#9326b1488c22d1a6088650a86901b2d9a90a2cbc" 674 | integrity sha1-kyaxSIwi0aYIhlCoaQGy2akKLLw= 675 | dependencies: 676 | detect-file "^1.0.0" 677 | is-glob "^3.1.0" 678 | micromatch "^3.0.4" 679 | resolve-dir "^1.0.1" 680 | 681 | findup-sync@^3.0.0: 682 | version "3.0.0" 683 | resolved "https://registry.yarnpkg.com/findup-sync/-/findup-sync-3.0.0.tgz#17b108f9ee512dfb7a5c7f3c8b27ea9e1a9c08d1" 684 | integrity sha512-YbffarhcicEhOrm4CtrwdKBdCuz576RLdhJDsIfvNtxUuhdRet1qZcsMjqbePtAseKdAnDyM/IyXbu7PRPRLYg== 685 | dependencies: 686 | detect-file "^1.0.0" 687 | is-glob "^4.0.0" 688 | micromatch "^3.0.4" 689 | resolve-dir "^1.0.1" 690 | 691 | fined@^1.0.1: 692 | version "1.2.0" 693 | resolved "https://registry.yarnpkg.com/fined/-/fined-1.2.0.tgz#d00beccf1aa2b475d16d423b0238b713a2c4a37b" 694 | integrity sha512-ZYDqPLGxDkDhDZBjZBb+oD1+j0rA4E0pXY50eplAAOPg2N/gUBSSk5IM1/QhPfyVo19lJ+CvXpqfvk+b2p/8Ng== 695 | dependencies: 696 | expand-tilde "^2.0.2" 697 | is-plain-object "^2.0.3" 698 | object.defaults "^1.1.0" 699 | object.pick "^1.2.0" 700 | parse-filepath "^1.0.1" 701 | 702 | flagged-respawn@^1.0.0: 703 | version "1.0.1" 704 | resolved "https://registry.yarnpkg.com/flagged-respawn/-/flagged-respawn-1.0.1.tgz#e7de6f1279ddd9ca9aac8a5971d618606b3aab41" 705 | integrity sha512-lNaHNVymajmk0OJMBn8fVUAU1BtDeKIqKoVhk4xAALB57aALg6b4W0MfJ/cUE0g9YBXy5XhSlPIpYIJ7HaY/3Q== 706 | 707 | flush-write-stream@^1.0.2: 708 | version "1.1.1" 709 | resolved "https://registry.yarnpkg.com/flush-write-stream/-/flush-write-stream-1.1.1.tgz#8dd7d873a1babc207d94ead0c2e0e44276ebf2e8" 710 | integrity sha512-3Z4XhFZ3992uIq0XOqb9AreonueSYphE6oYbpt5+3u06JWklbsPkNv3ZKkP9Bz/r+1MWCaMoSQ28P85+1Yc77w== 711 | dependencies: 712 | inherits "^2.0.3" 713 | readable-stream "^2.3.6" 714 | 715 | follow-redirects@1.5.10: 716 | version "1.5.10" 717 | resolved "https://registry.yarnpkg.com/follow-redirects/-/follow-redirects-1.5.10.tgz#7b7a9f9aea2fdff36786a94ff643ed07f4ff5e2a" 718 | integrity sha512-0V5l4Cizzvqt5D44aTXbFZz+FtyXV1vrDN6qrelxtfYQKW0KO0W2T/hkE8xvGa/540LkZlkaUjO4ailYTFtHVQ== 719 | dependencies: 720 | debug "=3.1.0" 721 | 722 | for-in@^1.0.1, for-in@^1.0.2: 723 | version "1.0.2" 724 | resolved "https://registry.yarnpkg.com/for-in/-/for-in-1.0.2.tgz#81068d295a8142ec0ac726c6e2200c30fb6d5e80" 725 | integrity sha1-gQaNKVqBQuwKxybG4iAMMPttXoA= 726 | 727 | for-own@^1.0.0: 728 | version "1.0.0" 729 | resolved "https://registry.yarnpkg.com/for-own/-/for-own-1.0.0.tgz#c63332f415cedc4b04dbfe70cf836494c53cb44b" 730 | integrity sha1-xjMy9BXO3EsE2/5wz4NklMU8tEs= 731 | dependencies: 732 | for-in "^1.0.1" 733 | 734 | fragment-cache@^0.2.1: 735 | version "0.2.1" 736 | resolved "https://registry.yarnpkg.com/fragment-cache/-/fragment-cache-0.2.1.tgz#4290fad27f13e89be7f33799c6bc5a0abfff0d19" 737 | integrity sha1-QpD60n8T6Jvn8zeZxrxaCr//DRk= 738 | dependencies: 739 | map-cache "^0.2.2" 740 | 741 | fs-minipass@^1.2.5: 742 | version "1.2.6" 743 | resolved "https://registry.yarnpkg.com/fs-minipass/-/fs-minipass-1.2.6.tgz#2c5cc30ded81282bfe8a0d7c7c1853ddeb102c07" 744 | integrity sha512-crhvyXcMejjv3Z5d2Fa9sf5xLYVCF5O1c71QxbVnbLsmYMBEvDAftewesN/HhY03YRoA7zOMxjNGrF5svGaaeQ== 745 | dependencies: 746 | minipass "^2.2.1" 747 | 748 | fs-mkdirp-stream@^1.0.0: 749 | version "1.0.0" 750 | resolved "https://registry.yarnpkg.com/fs-mkdirp-stream/-/fs-mkdirp-stream-1.0.0.tgz#0b7815fc3201c6a69e14db98ce098c16935259eb" 751 | integrity sha1-C3gV/DIBxqaeFNuYzgmMFpNSWes= 752 | dependencies: 753 | graceful-fs "^4.1.11" 754 | through2 "^2.0.3" 755 | 756 | fs.realpath@^1.0.0: 757 | version "1.0.0" 758 | resolved "https://registry.yarnpkg.com/fs.realpath/-/fs.realpath-1.0.0.tgz#1504ad2523158caa40db4a2787cb01411994ea4f" 759 | integrity sha1-FQStJSMVjKpA20onh8sBQRmU6k8= 760 | 761 | fsevents@^1.2.7: 762 | version "1.2.9" 763 | resolved "https://registry.yarnpkg.com/fsevents/-/fsevents-1.2.9.tgz#3f5ed66583ccd6f400b5a00db6f7e861363e388f" 764 | integrity sha512-oeyj2H3EjjonWcFjD5NvZNE9Rqe4UW+nQBU2HNeKw0koVLEFIhtyETyAakeAM3de7Z/SW5kcA+fZUait9EApnw== 765 | dependencies: 766 | nan "^2.12.1" 767 | node-pre-gyp "^0.12.0" 768 | 769 | function-bind@^1.1.1: 770 | version "1.1.1" 771 | resolved "https://registry.yarnpkg.com/function-bind/-/function-bind-1.1.1.tgz#a56899d3ea3c9bab874bb9773b7c5ede92f4895d" 772 | integrity sha512-yIovAzMX49sF8Yl58fSCWJ5svSLuaibPxXQJFLmBObTuCr0Mf1KiPopGM9NiFjiYBCbfaa2Fh6breQ6ANVTI0A== 773 | 774 | gauge@~2.7.3: 775 | version "2.7.4" 776 | resolved "https://registry.yarnpkg.com/gauge/-/gauge-2.7.4.tgz#2c03405c7538c39d7eb37b317022e325fb018bf7" 777 | integrity sha1-LANAXHU4w51+s3sxcCLjJfsBi/c= 778 | dependencies: 779 | aproba "^1.0.3" 780 | console-control-strings "^1.0.0" 781 | has-unicode "^2.0.0" 782 | object-assign "^4.1.0" 783 | signal-exit "^3.0.0" 784 | string-width "^1.0.1" 785 | strip-ansi "^3.0.1" 786 | wide-align "^1.1.0" 787 | 788 | get-caller-file@^1.0.1: 789 | version "1.0.3" 790 | resolved "https://registry.yarnpkg.com/get-caller-file/-/get-caller-file-1.0.3.tgz#f978fa4c90d1dfe7ff2d6beda2a515e713bdcf4a" 791 | integrity sha512-3t6rVToeoZfYSGd8YoLFR2DJkiQrIiUrGcjvFX2mDw3bn6k2OtwHN0TNCLbBO+w8qTvimhDkv+LSscbJY1vE6w== 792 | 793 | get-value@^2.0.3, get-value@^2.0.6: 794 | version "2.0.6" 795 | resolved "https://registry.yarnpkg.com/get-value/-/get-value-2.0.6.tgz#dc15ca1c672387ca76bd37ac0a395ba2042a2c28" 796 | integrity sha1-3BXKHGcjh8p2vTesCjlbogQqLCg= 797 | 798 | glob-parent@^3.1.0: 799 | version "3.1.0" 800 | resolved "https://registry.yarnpkg.com/glob-parent/-/glob-parent-3.1.0.tgz#9e6af6299d8d3bd2bd40430832bd113df906c5ae" 801 | integrity sha1-nmr2KZ2NO9K9QEMIMr0RPfkGxa4= 802 | dependencies: 803 | is-glob "^3.1.0" 804 | path-dirname "^1.0.0" 805 | 806 | glob-stream@^6.1.0: 807 | version "6.1.0" 808 | resolved "https://registry.yarnpkg.com/glob-stream/-/glob-stream-6.1.0.tgz#7045c99413b3eb94888d83ab46d0b404cc7bdde4" 809 | integrity sha1-cEXJlBOz65SIjYOrRtC0BMx73eQ= 810 | dependencies: 811 | extend "^3.0.0" 812 | glob "^7.1.1" 813 | glob-parent "^3.1.0" 814 | is-negated-glob "^1.0.0" 815 | ordered-read-streams "^1.0.0" 816 | pumpify "^1.3.5" 817 | readable-stream "^2.1.5" 818 | remove-trailing-separator "^1.0.1" 819 | to-absolute-glob "^2.0.0" 820 | unique-stream "^2.0.2" 821 | 822 | glob-watcher@^5.0.3: 823 | version "5.0.3" 824 | resolved "https://registry.yarnpkg.com/glob-watcher/-/glob-watcher-5.0.3.tgz#88a8abf1c4d131eb93928994bc4a593c2e5dd626" 825 | integrity sha512-8tWsULNEPHKQ2MR4zXuzSmqbdyV5PtwwCaWSGQ1WwHsJ07ilNeN1JB8ntxhckbnpSHaf9dXFUHzIWvm1I13dsg== 826 | dependencies: 827 | anymatch "^2.0.0" 828 | async-done "^1.2.0" 829 | chokidar "^2.0.0" 830 | is-negated-glob "^1.0.0" 831 | just-debounce "^1.0.0" 832 | object.defaults "^1.1.0" 833 | 834 | glob@^7.1.1, glob@^7.1.3: 835 | version "7.1.4" 836 | resolved "https://registry.yarnpkg.com/glob/-/glob-7.1.4.tgz#aa608a2f6c577ad357e1ae5a5c26d9a8d1969255" 837 | integrity sha512-hkLPepehmnKk41pUGm3sYxoFs/umurYfYJCerbXEyFIWcAzvpipAgVkBqqT9RBKMGjnq6kMuyYwha6csxbiM1A== 838 | dependencies: 839 | fs.realpath "^1.0.0" 840 | inflight "^1.0.4" 841 | inherits "2" 842 | minimatch "^3.0.4" 843 | once "^1.3.0" 844 | path-is-absolute "^1.0.0" 845 | 846 | global-modules@^1.0.0: 847 | version "1.0.0" 848 | resolved "https://registry.yarnpkg.com/global-modules/-/global-modules-1.0.0.tgz#6d770f0eb523ac78164d72b5e71a8877265cc3ea" 849 | integrity sha512-sKzpEkf11GpOFuw0Zzjzmt4B4UZwjOcG757PPvrfhxcLFbq0wpsgpOqxpxtxFiCG4DtG93M6XRVbF2oGdev7bg== 850 | dependencies: 851 | global-prefix "^1.0.1" 852 | is-windows "^1.0.1" 853 | resolve-dir "^1.0.0" 854 | 855 | global-prefix@^1.0.1: 856 | version "1.0.2" 857 | resolved "https://registry.yarnpkg.com/global-prefix/-/global-prefix-1.0.2.tgz#dbf743c6c14992593c655568cb66ed32c0122ebe" 858 | integrity sha1-2/dDxsFJklk8ZVVoy2btMsASLr4= 859 | dependencies: 860 | expand-tilde "^2.0.2" 861 | homedir-polyfill "^1.0.1" 862 | ini "^1.3.4" 863 | is-windows "^1.0.1" 864 | which "^1.2.14" 865 | 866 | glogg@^1.0.0: 867 | version "1.0.2" 868 | resolved "https://registry.yarnpkg.com/glogg/-/glogg-1.0.2.tgz#2d7dd702beda22eb3bffadf880696da6d846313f" 869 | integrity sha512-5mwUoSuBk44Y4EshyiqcH95ZntbDdTQqA3QYSrxmzj28Ai0vXBGMH1ApSANH14j2sIRtqCEyg6PfsuP7ElOEDA== 870 | dependencies: 871 | sparkles "^1.0.0" 872 | 873 | graceful-fs@^4.0.0, graceful-fs@^4.1.11, graceful-fs@^4.1.2, graceful-fs@^4.1.6: 874 | version "4.2.0" 875 | resolved "https://registry.yarnpkg.com/graceful-fs/-/graceful-fs-4.2.0.tgz#8d8fdc73977cb04104721cb53666c1ca64cd328b" 876 | integrity sha512-jpSvDPV4Cq/bgtpndIWbI5hmYxhQGHPC4d4cqBPb4DLniCfhJokdXhwhaDuLBGLQdvvRum/UiX6ECVIPvDXqdg== 877 | 878 | gulp-cli@^2.2.0: 879 | version "2.2.0" 880 | resolved "https://registry.yarnpkg.com/gulp-cli/-/gulp-cli-2.2.0.tgz#5533126eeb7fe415a7e3e84a297d334d5cf70ebc" 881 | integrity sha512-rGs3bVYHdyJpLqR0TUBnlcZ1O5O++Zs4bA0ajm+zr3WFCfiSLjGwoCBqFs18wzN+ZxahT9DkOK5nDf26iDsWjA== 882 | dependencies: 883 | ansi-colors "^1.0.1" 884 | archy "^1.0.0" 885 | array-sort "^1.0.0" 886 | color-support "^1.1.3" 887 | concat-stream "^1.6.0" 888 | copy-props "^2.0.1" 889 | fancy-log "^1.3.2" 890 | gulplog "^1.0.0" 891 | interpret "^1.1.0" 892 | isobject "^3.0.1" 893 | liftoff "^3.1.0" 894 | matchdep "^2.0.0" 895 | mute-stdout "^1.0.0" 896 | pretty-hrtime "^1.0.0" 897 | replace-homedir "^1.0.0" 898 | semver-greatest-satisfied-range "^1.1.0" 899 | v8flags "^3.0.1" 900 | yargs "^7.1.0" 901 | 902 | gulp@^4.0.2: 903 | version "4.0.2" 904 | resolved "https://registry.yarnpkg.com/gulp/-/gulp-4.0.2.tgz#543651070fd0f6ab0a0650c6a3e6ff5a7cb09caa" 905 | integrity sha512-dvEs27SCZt2ibF29xYgmnwwCYZxdxhQ/+LFWlbAW8y7jt68L/65402Lz3+CKy0Ov4rOs+NERmDq7YlZaDqUIfA== 906 | dependencies: 907 | glob-watcher "^5.0.3" 908 | gulp-cli "^2.2.0" 909 | undertaker "^1.2.1" 910 | vinyl-fs "^3.0.0" 911 | 912 | gulplog@^1.0.0: 913 | version "1.0.0" 914 | resolved "https://registry.yarnpkg.com/gulplog/-/gulplog-1.0.0.tgz#e28c4d45d05ecbbed818363ce8f9c5926229ffe5" 915 | integrity sha1-4oxNRdBey77YGDY86PnFkmIp/+U= 916 | dependencies: 917 | glogg "^1.0.0" 918 | 919 | has-symbols@^1.0.0: 920 | version "1.0.0" 921 | resolved "https://registry.yarnpkg.com/has-symbols/-/has-symbols-1.0.0.tgz#ba1a8f1af2a0fc39650f5c850367704122063b44" 922 | integrity sha1-uhqPGvKg/DllD1yFA2dwQSIGO0Q= 923 | 924 | has-unicode@^2.0.0: 925 | version "2.0.1" 926 | resolved "https://registry.yarnpkg.com/has-unicode/-/has-unicode-2.0.1.tgz#e0e6fe6a28cf51138855e086d1691e771de2a8b9" 927 | integrity sha1-4Ob+aijPUROIVeCG0Wkedx3iqLk= 928 | 929 | has-value@^0.3.1: 930 | version "0.3.1" 931 | resolved "https://registry.yarnpkg.com/has-value/-/has-value-0.3.1.tgz#7b1f58bada62ca827ec0a2078025654845995e1f" 932 | integrity sha1-ex9YutpiyoJ+wKIHgCVlSEWZXh8= 933 | dependencies: 934 | get-value "^2.0.3" 935 | has-values "^0.1.4" 936 | isobject "^2.0.0" 937 | 938 | has-value@^1.0.0: 939 | version "1.0.0" 940 | resolved "https://registry.yarnpkg.com/has-value/-/has-value-1.0.0.tgz#18b281da585b1c5c51def24c930ed29a0be6b177" 941 | integrity sha1-GLKB2lhbHFxR3vJMkw7SmgvmsXc= 942 | dependencies: 943 | get-value "^2.0.6" 944 | has-values "^1.0.0" 945 | isobject "^3.0.0" 946 | 947 | has-values@^0.1.4: 948 | version "0.1.4" 949 | resolved "https://registry.yarnpkg.com/has-values/-/has-values-0.1.4.tgz#6d61de95d91dfca9b9a02089ad384bff8f62b771" 950 | integrity sha1-bWHeldkd/Km5oCCJrThL/49it3E= 951 | 952 | has-values@^1.0.0: 953 | version "1.0.0" 954 | resolved "https://registry.yarnpkg.com/has-values/-/has-values-1.0.0.tgz#95b0b63fec2146619a6fe57fe75628d5a39efe4f" 955 | integrity sha1-lbC2P+whRmGab+V/51Yo1aOe/k8= 956 | dependencies: 957 | is-number "^3.0.0" 958 | kind-of "^4.0.0" 959 | 960 | homedir-polyfill@^1.0.1: 961 | version "1.0.3" 962 | resolved "https://registry.yarnpkg.com/homedir-polyfill/-/homedir-polyfill-1.0.3.tgz#743298cef4e5af3e194161fbadcc2151d3a058e8" 963 | integrity sha512-eSmmWE5bZTK2Nou4g0AI3zZ9rswp7GRKoKXS1BLUkvPviOqs4YTN1djQIqrXy9k5gEtdLPy86JjRwsNM9tnDcA== 964 | dependencies: 965 | parse-passwd "^1.0.0" 966 | 967 | hosted-git-info@^2.1.4: 968 | version "2.7.1" 969 | resolved "https://registry.yarnpkg.com/hosted-git-info/-/hosted-git-info-2.7.1.tgz#97f236977bd6e125408930ff6de3eec6281ec047" 970 | integrity sha512-7T/BxH19zbcCTa8XkMlbK5lTo1WtgkFi3GvdWEyNuc4Vex7/9Dqbnpsf4JMydcfj9HCg4zUWFTL3Za6lapg5/w== 971 | 972 | iconv-lite@^0.4.4: 973 | version "0.4.24" 974 | resolved "https://registry.yarnpkg.com/iconv-lite/-/iconv-lite-0.4.24.tgz#2022b4b25fbddc21d2f524974a474aafe733908b" 975 | integrity sha512-v3MXnZAcvnywkTUEZomIActle7RXXeedOR31wwl7VlyoXO4Qi9arvSenNQWne1TcRwhCL1HwLI21bEqdpj8/rA== 976 | dependencies: 977 | safer-buffer ">= 2.1.2 < 3" 978 | 979 | ignore-walk@^3.0.1: 980 | version "3.0.1" 981 | resolved "https://registry.yarnpkg.com/ignore-walk/-/ignore-walk-3.0.1.tgz#a83e62e7d272ac0e3b551aaa82831a19b69f82f8" 982 | integrity sha512-DTVlMx3IYPe0/JJcYP7Gxg7ttZZu3IInhuEhbchuqneY9wWe5Ojy2mXLBaQFUQmo0AW2r3qG7m1mg86js+gnlQ== 983 | dependencies: 984 | minimatch "^3.0.4" 985 | 986 | inflight@^1.0.4: 987 | version "1.0.6" 988 | resolved "https://registry.yarnpkg.com/inflight/-/inflight-1.0.6.tgz#49bd6331d7d02d0c09bc910a1075ba8165b56df9" 989 | integrity sha1-Sb1jMdfQLQwJvJEKEHW6gWW1bfk= 990 | dependencies: 991 | once "^1.3.0" 992 | wrappy "1" 993 | 994 | inherits@2, inherits@^2.0.1, inherits@^2.0.3, inherits@~2.0.3: 995 | version "2.0.4" 996 | resolved "https://registry.yarnpkg.com/inherits/-/inherits-2.0.4.tgz#0fa2c64f932917c3433a0ded55363aae37416b7c" 997 | integrity sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ== 998 | 999 | ini@^1.3.4, ini@~1.3.0: 1000 | version "1.3.5" 1001 | resolved "https://registry.yarnpkg.com/ini/-/ini-1.3.5.tgz#eee25f56db1c9ec6085e0c22778083f596abf927" 1002 | integrity sha512-RZY5huIKCMRWDUqZlEi72f/lmXKMvuszcMBduliQ3nnWbx9X/ZBQO7DijMEYS9EhHBb2qacRUMtC7svLwe0lcw== 1003 | 1004 | interpret@^1.1.0: 1005 | version "1.2.0" 1006 | resolved "https://registry.yarnpkg.com/interpret/-/interpret-1.2.0.tgz#d5061a6224be58e8083985f5014d844359576296" 1007 | integrity sha512-mT34yGKMNceBQUoVn7iCDKDntA7SC6gycMAWzGx1z/CMCTV7b2AAtXlo3nRyHZ1FelRkQbQjprHSYGwzLtkVbw== 1008 | 1009 | invert-kv@^1.0.0: 1010 | version "1.0.0" 1011 | resolved "https://registry.yarnpkg.com/invert-kv/-/invert-kv-1.0.0.tgz#104a8e4aaca6d3d8cd157a8ef8bfab2d7a3ffdb6" 1012 | integrity sha1-EEqOSqym09jNFXqO+L+rLXo//bY= 1013 | 1014 | is-absolute@^1.0.0: 1015 | version "1.0.0" 1016 | resolved "https://registry.yarnpkg.com/is-absolute/-/is-absolute-1.0.0.tgz#395e1ae84b11f26ad1795e73c17378e48a301576" 1017 | integrity sha512-dOWoqflvcydARa360Gvv18DZ/gRuHKi2NU/wU5X1ZFzdYfH29nkiNZsF3mp4OJ3H4yo9Mx8A/uAGNzpzPN3yBA== 1018 | dependencies: 1019 | is-relative "^1.0.0" 1020 | is-windows "^1.0.1" 1021 | 1022 | is-accessor-descriptor@^0.1.6: 1023 | version "0.1.6" 1024 | resolved "https://registry.yarnpkg.com/is-accessor-descriptor/-/is-accessor-descriptor-0.1.6.tgz#a9e12cb3ae8d876727eeef3843f8a0897b5c98d6" 1025 | integrity sha1-qeEss66Nh2cn7u84Q/igiXtcmNY= 1026 | dependencies: 1027 | kind-of "^3.0.2" 1028 | 1029 | is-accessor-descriptor@^1.0.0: 1030 | version "1.0.0" 1031 | resolved "https://registry.yarnpkg.com/is-accessor-descriptor/-/is-accessor-descriptor-1.0.0.tgz#169c2f6d3df1f992618072365c9b0ea1f6878656" 1032 | integrity sha512-m5hnHTkcVsPfqx3AKlyttIPb7J+XykHvJP2B9bZDjlhLIoEq4XoK64Vg7boZlVWYK6LUY94dYPEE7Lh0ZkZKcQ== 1033 | dependencies: 1034 | kind-of "^6.0.0" 1035 | 1036 | is-arrayish@^0.2.1: 1037 | version "0.2.1" 1038 | resolved "https://registry.yarnpkg.com/is-arrayish/-/is-arrayish-0.2.1.tgz#77c99840527aa8ecb1a8ba697b80645a7a926a9d" 1039 | integrity sha1-d8mYQFJ6qOyxqLppe4BkWnqSap0= 1040 | 1041 | is-binary-path@^1.0.0: 1042 | version "1.0.1" 1043 | resolved "https://registry.yarnpkg.com/is-binary-path/-/is-binary-path-1.0.1.tgz#75f16642b480f187a711c814161fd3a4a7655898" 1044 | integrity sha1-dfFmQrSA8YenEcgUFh/TpKdlWJg= 1045 | dependencies: 1046 | binary-extensions "^1.0.0" 1047 | 1048 | is-buffer@^1.1.5: 1049 | version "1.1.6" 1050 | resolved "https://registry.yarnpkg.com/is-buffer/-/is-buffer-1.1.6.tgz#efaa2ea9daa0d7ab2ea13a97b2b8ad51fefbe8be" 1051 | integrity sha512-NcdALwpXkTm5Zvvbk7owOUSvVvBKDgKP5/ewfXEznmQFfs4ZRmanOeKBTjRVjka3QFoN6XJ+9F3USqfHqTaU5w== 1052 | 1053 | is-buffer@^2.0.2: 1054 | version "2.0.3" 1055 | resolved "https://registry.yarnpkg.com/is-buffer/-/is-buffer-2.0.3.tgz#4ecf3fcf749cbd1e472689e109ac66261a25e725" 1056 | integrity sha512-U15Q7MXTuZlrbymiz95PJpZxu8IlipAp4dtS3wOdgPXx3mqBnslrWU14kxfHB+Py/+2PVKSr37dMAgM2A4uArw== 1057 | 1058 | is-data-descriptor@^0.1.4: 1059 | version "0.1.4" 1060 | resolved "https://registry.yarnpkg.com/is-data-descriptor/-/is-data-descriptor-0.1.4.tgz#0b5ee648388e2c860282e793f1856fec3f301b56" 1061 | integrity sha1-C17mSDiOLIYCgueT8YVv7D8wG1Y= 1062 | dependencies: 1063 | kind-of "^3.0.2" 1064 | 1065 | is-data-descriptor@^1.0.0: 1066 | version "1.0.0" 1067 | resolved "https://registry.yarnpkg.com/is-data-descriptor/-/is-data-descriptor-1.0.0.tgz#d84876321d0e7add03990406abbbbd36ba9268c7" 1068 | integrity sha512-jbRXy1FmtAoCjQkVmIVYwuuqDFUbaOeDjmed1tOGPrsMhtJA4rD9tkgA0F1qJ3gRFRXcHYVkdeaP50Q5rE/jLQ== 1069 | dependencies: 1070 | kind-of "^6.0.0" 1071 | 1072 | is-descriptor@^0.1.0: 1073 | version "0.1.6" 1074 | resolved "https://registry.yarnpkg.com/is-descriptor/-/is-descriptor-0.1.6.tgz#366d8240dde487ca51823b1ab9f07a10a78251ca" 1075 | integrity sha512-avDYr0SB3DwO9zsMov0gKCESFYqCnE4hq/4z3TdUlukEy5t9C0YRq7HLrsN52NAcqXKaepeCD0n+B0arnVG3Hg== 1076 | dependencies: 1077 | is-accessor-descriptor "^0.1.6" 1078 | is-data-descriptor "^0.1.4" 1079 | kind-of "^5.0.0" 1080 | 1081 | is-descriptor@^1.0.0, is-descriptor@^1.0.2: 1082 | version "1.0.2" 1083 | resolved "https://registry.yarnpkg.com/is-descriptor/-/is-descriptor-1.0.2.tgz#3b159746a66604b04f8c81524ba365c5f14d86ec" 1084 | integrity sha512-2eis5WqQGV7peooDyLmNEPUrps9+SXX5c9pL3xEB+4e9HnGuDa7mB7kHxHw4CbqS9k1T2hOH3miL8n8WtiYVtg== 1085 | dependencies: 1086 | is-accessor-descriptor "^1.0.0" 1087 | is-data-descriptor "^1.0.0" 1088 | kind-of "^6.0.2" 1089 | 1090 | is-extendable@^0.1.0, is-extendable@^0.1.1: 1091 | version "0.1.1" 1092 | resolved "https://registry.yarnpkg.com/is-extendable/-/is-extendable-0.1.1.tgz#62b110e289a471418e3ec36a617d472e301dfc89" 1093 | integrity sha1-YrEQ4omkcUGOPsNqYX1HLjAd/Ik= 1094 | 1095 | is-extendable@^1.0.1: 1096 | version "1.0.1" 1097 | resolved "https://registry.yarnpkg.com/is-extendable/-/is-extendable-1.0.1.tgz#a7470f9e426733d81bd81e1155264e3a3507cab4" 1098 | integrity sha512-arnXMxT1hhoKo9k1LZdmlNyJdDDfy2v0fXjFlmok4+i8ul/6WlbVge9bhM74OpNPQPMGUToDtz+KXa1PneJxOA== 1099 | dependencies: 1100 | is-plain-object "^2.0.4" 1101 | 1102 | is-extglob@^2.1.0, is-extglob@^2.1.1: 1103 | version "2.1.1" 1104 | resolved "https://registry.yarnpkg.com/is-extglob/-/is-extglob-2.1.1.tgz#a88c02535791f02ed37c76a1b9ea9773c833f8c2" 1105 | integrity sha1-qIwCU1eR8C7TfHahueqXc8gz+MI= 1106 | 1107 | is-fullwidth-code-point@^1.0.0: 1108 | version "1.0.0" 1109 | resolved "https://registry.yarnpkg.com/is-fullwidth-code-point/-/is-fullwidth-code-point-1.0.0.tgz#ef9e31386f031a7f0d643af82fde50c457ef00cb" 1110 | integrity sha1-754xOG8DGn8NZDr4L95QxFfvAMs= 1111 | dependencies: 1112 | number-is-nan "^1.0.0" 1113 | 1114 | is-fullwidth-code-point@^2.0.0: 1115 | version "2.0.0" 1116 | resolved "https://registry.yarnpkg.com/is-fullwidth-code-point/-/is-fullwidth-code-point-2.0.0.tgz#a3b30a5c4f199183167aaab93beefae3ddfb654f" 1117 | integrity sha1-o7MKXE8ZkYMWeqq5O+764937ZU8= 1118 | 1119 | is-glob@^3.1.0: 1120 | version "3.1.0" 1121 | resolved "https://registry.yarnpkg.com/is-glob/-/is-glob-3.1.0.tgz#7ba5ae24217804ac70707b96922567486cc3e84a" 1122 | integrity sha1-e6WuJCF4BKxwcHuWkiVnSGzD6Eo= 1123 | dependencies: 1124 | is-extglob "^2.1.0" 1125 | 1126 | is-glob@^4.0.0: 1127 | version "4.0.1" 1128 | resolved "https://registry.yarnpkg.com/is-glob/-/is-glob-4.0.1.tgz#7567dbe9f2f5e2467bc77ab83c4a29482407a5dc" 1129 | integrity sha512-5G0tKtBTFImOqDnLB2hG6Bp2qcKEFduo4tZu9MT/H6NQv/ghhy30o55ufafxJ/LdH79LLs2Kfrn85TLKyA7BUg== 1130 | dependencies: 1131 | is-extglob "^2.1.1" 1132 | 1133 | is-negated-glob@^1.0.0: 1134 | version "1.0.0" 1135 | resolved "https://registry.yarnpkg.com/is-negated-glob/-/is-negated-glob-1.0.0.tgz#6910bca5da8c95e784b5751b976cf5a10fee36d2" 1136 | integrity sha1-aRC8pdqMleeEtXUbl2z1oQ/uNtI= 1137 | 1138 | is-number@^3.0.0: 1139 | version "3.0.0" 1140 | resolved "https://registry.yarnpkg.com/is-number/-/is-number-3.0.0.tgz#24fd6201a4782cf50561c810276afc7d12d71195" 1141 | integrity sha1-JP1iAaR4LPUFYcgQJ2r8fRLXEZU= 1142 | dependencies: 1143 | kind-of "^3.0.2" 1144 | 1145 | is-number@^4.0.0: 1146 | version "4.0.0" 1147 | resolved "https://registry.yarnpkg.com/is-number/-/is-number-4.0.0.tgz#0026e37f5454d73e356dfe6564699867c6a7f0ff" 1148 | integrity sha512-rSklcAIlf1OmFdyAqbnWTLVelsQ58uvZ66S/ZyawjWqIviTWCjg2PzVGw8WUA+nNuPTqb4wgA+NszrJ+08LlgQ== 1149 | 1150 | is-plain-object@^2.0.1, is-plain-object@^2.0.3, is-plain-object@^2.0.4: 1151 | version "2.0.4" 1152 | resolved "https://registry.yarnpkg.com/is-plain-object/-/is-plain-object-2.0.4.tgz#2c163b3fafb1b606d9d17928f05c2a1c38e07677" 1153 | integrity sha512-h5PpgXkWitc38BBMYawTYMWJHFZJVnBquFE57xFpjB8pJFiF6gZ+bU+WyI/yqXiFR5mdLsgYNaPe8uao6Uv9Og== 1154 | dependencies: 1155 | isobject "^3.0.1" 1156 | 1157 | is-relative@^1.0.0: 1158 | version "1.0.0" 1159 | resolved "https://registry.yarnpkg.com/is-relative/-/is-relative-1.0.0.tgz#a1bb6935ce8c5dba1e8b9754b9b2dcc020e2260d" 1160 | integrity sha512-Kw/ReK0iqwKeu0MITLFuj0jbPAmEiOsIwyIXvvbfa6QfmN9pkD1M+8pdk7Rl/dTKbH34/XBFMbgD4iMJhLQbGA== 1161 | dependencies: 1162 | is-unc-path "^1.0.0" 1163 | 1164 | is-typedarray@^1.0.0: 1165 | version "1.0.0" 1166 | resolved "https://registry.yarnpkg.com/is-typedarray/-/is-typedarray-1.0.0.tgz#e479c80858df0c1b11ddda6940f96011fcda4a9a" 1167 | integrity sha1-5HnICFjfDBsR3dppQPlgEfzaSpo= 1168 | 1169 | is-unc-path@^1.0.0: 1170 | version "1.0.0" 1171 | resolved "https://registry.yarnpkg.com/is-unc-path/-/is-unc-path-1.0.0.tgz#d731e8898ed090a12c352ad2eaed5095ad322c9d" 1172 | integrity sha512-mrGpVd0fs7WWLfVsStvgF6iEJnbjDFZh9/emhRDcGWTduTfNHd9CHeUwH3gYIjdbwo4On6hunkztwOaAw0yllQ== 1173 | dependencies: 1174 | unc-path-regex "^0.1.2" 1175 | 1176 | is-utf8@^0.2.0, is-utf8@^0.2.1: 1177 | version "0.2.1" 1178 | resolved "https://registry.yarnpkg.com/is-utf8/-/is-utf8-0.2.1.tgz#4b0da1442104d1b336340e80797e865cf39f7d72" 1179 | integrity sha1-Sw2hRCEE0bM2NA6AeX6GXPOffXI= 1180 | 1181 | is-valid-glob@^1.0.0: 1182 | version "1.0.0" 1183 | resolved "https://registry.yarnpkg.com/is-valid-glob/-/is-valid-glob-1.0.0.tgz#29bf3eff701be2d4d315dbacc39bc39fe8f601aa" 1184 | integrity sha1-Kb8+/3Ab4tTTFdusw5vDn+j2Aao= 1185 | 1186 | is-windows@^1.0.1, is-windows@^1.0.2: 1187 | version "1.0.2" 1188 | resolved "https://registry.yarnpkg.com/is-windows/-/is-windows-1.0.2.tgz#d1850eb9791ecd18e6182ce12a30f396634bb19d" 1189 | integrity sha512-eXK1UInq2bPmjyX6e3VHIzMLobc4J94i4AWn+Hpq3OU5KkrRC96OAcR3PRJ/pGu6m8TRnBHP9dkXQVsT/COVIA== 1190 | 1191 | isarray@1.0.0, isarray@~1.0.0: 1192 | version "1.0.0" 1193 | resolved "https://registry.yarnpkg.com/isarray/-/isarray-1.0.0.tgz#bb935d48582cba168c06834957a54a3e07124f11" 1194 | integrity sha1-u5NdSFgsuhaMBoNJV6VKPgcSTxE= 1195 | 1196 | isexe@^2.0.0: 1197 | version "2.0.0" 1198 | resolved "https://registry.yarnpkg.com/isexe/-/isexe-2.0.0.tgz#e8fbf374dc556ff8947a10dcb0572d633f2cfa10" 1199 | integrity sha1-6PvzdNxVb/iUehDcsFctYz8s+hA= 1200 | 1201 | isobject@^2.0.0: 1202 | version "2.1.0" 1203 | resolved "https://registry.yarnpkg.com/isobject/-/isobject-2.1.0.tgz#f065561096a3f1da2ef46272f815c840d87e0c89" 1204 | integrity sha1-8GVWEJaj8dou9GJy+BXIQNh+DIk= 1205 | dependencies: 1206 | isarray "1.0.0" 1207 | 1208 | isobject@^3.0.0, isobject@^3.0.1: 1209 | version "3.0.1" 1210 | resolved "https://registry.yarnpkg.com/isobject/-/isobject-3.0.1.tgz#4e431e92b11a9731636aa1f9c8d1ccbcfdab78df" 1211 | integrity sha1-TkMekrEalzFjaqH5yNHMvP2reN8= 1212 | 1213 | json-stable-stringify-without-jsonify@^1.0.1: 1214 | version "1.0.1" 1215 | resolved "https://registry.yarnpkg.com/json-stable-stringify-without-jsonify/-/json-stable-stringify-without-jsonify-1.0.1.tgz#9db7b59496ad3f3cfef30a75142d2d930ad72651" 1216 | integrity sha1-nbe1lJatPzz+8wp1FC0tkwrXJlE= 1217 | 1218 | just-debounce@^1.0.0: 1219 | version "1.0.0" 1220 | resolved "https://registry.yarnpkg.com/just-debounce/-/just-debounce-1.0.0.tgz#87fccfaeffc0b68cd19d55f6722943f929ea35ea" 1221 | integrity sha1-h/zPrv/AtozRnVX2cilD+SnqNeo= 1222 | 1223 | kind-of@^3.0.2, kind-of@^3.0.3, kind-of@^3.2.0: 1224 | version "3.2.2" 1225 | resolved "https://registry.yarnpkg.com/kind-of/-/kind-of-3.2.2.tgz#31ea21a734bab9bbb0f32466d893aea51e4a3c64" 1226 | integrity sha1-MeohpzS6ubuw8yRm2JOupR5KPGQ= 1227 | dependencies: 1228 | is-buffer "^1.1.5" 1229 | 1230 | kind-of@^4.0.0: 1231 | version "4.0.0" 1232 | resolved "https://registry.yarnpkg.com/kind-of/-/kind-of-4.0.0.tgz#20813df3d712928b207378691a45066fae72dd57" 1233 | integrity sha1-IIE989cSkosgc3hpGkUGb65y3Vc= 1234 | dependencies: 1235 | is-buffer "^1.1.5" 1236 | 1237 | kind-of@^5.0.0, kind-of@^5.0.2: 1238 | version "5.1.0" 1239 | resolved "https://registry.yarnpkg.com/kind-of/-/kind-of-5.1.0.tgz#729c91e2d857b7a419a1f9aa65685c4c33f5845d" 1240 | integrity sha512-NGEErnH6F2vUuXDh+OlbcKW7/wOcfdRHaZ7VWtqCztfHri/++YKmP51OdWeGPuqCOba6kk2OTe5d02VmTB80Pw== 1241 | 1242 | kind-of@^6.0.0, kind-of@^6.0.2: 1243 | version "6.0.2" 1244 | resolved "https://registry.yarnpkg.com/kind-of/-/kind-of-6.0.2.tgz#01146b36a6218e64e58f3a8d66de5d7fc6f6d051" 1245 | integrity sha512-s5kLOcnH0XqDO+FvuaLX8DDjZ18CGFk7VygH40QoKPUQhW4e2rvM0rwUq0t8IQDOwYSeLK01U90OjzBTme2QqA== 1246 | 1247 | last-run@^1.1.0: 1248 | version "1.1.1" 1249 | resolved "https://registry.yarnpkg.com/last-run/-/last-run-1.1.1.tgz#45b96942c17b1c79c772198259ba943bebf8ca5b" 1250 | integrity sha1-RblpQsF7HHnHchmCWbqUO+v4yls= 1251 | dependencies: 1252 | default-resolution "^2.0.0" 1253 | es6-weak-map "^2.0.1" 1254 | 1255 | lazystream@^1.0.0: 1256 | version "1.0.0" 1257 | resolved "https://registry.yarnpkg.com/lazystream/-/lazystream-1.0.0.tgz#f6995fe0f820392f61396be89462407bb77168e4" 1258 | integrity sha1-9plf4PggOS9hOWvolGJAe7dxaOQ= 1259 | dependencies: 1260 | readable-stream "^2.0.5" 1261 | 1262 | lcid@^1.0.0: 1263 | version "1.0.0" 1264 | resolved "https://registry.yarnpkg.com/lcid/-/lcid-1.0.0.tgz#308accafa0bc483a3867b4b6f2b9506251d1b835" 1265 | integrity sha1-MIrMr6C8SDo4Z7S28rlQYlHRuDU= 1266 | dependencies: 1267 | invert-kv "^1.0.0" 1268 | 1269 | lead@^1.0.0: 1270 | version "1.0.0" 1271 | resolved "https://registry.yarnpkg.com/lead/-/lead-1.0.0.tgz#6f14f99a37be3a9dd784f5495690e5903466ee42" 1272 | integrity sha1-bxT5mje+Op3XhPVJVpDlkDRm7kI= 1273 | dependencies: 1274 | flush-write-stream "^1.0.2" 1275 | 1276 | liftoff@^3.1.0: 1277 | version "3.1.0" 1278 | resolved "https://registry.yarnpkg.com/liftoff/-/liftoff-3.1.0.tgz#c9ba6081f908670607ee79062d700df062c52ed3" 1279 | integrity sha512-DlIPlJUkCV0Ips2zf2pJP0unEoT1kwYhiiPUGF3s/jtxTCjziNLoiVVh+jqWOWeFi6mmwQ5fNxvAUyPad4Dfog== 1280 | dependencies: 1281 | extend "^3.0.0" 1282 | findup-sync "^3.0.0" 1283 | fined "^1.0.1" 1284 | flagged-respawn "^1.0.0" 1285 | is-plain-object "^2.0.4" 1286 | object.map "^1.0.0" 1287 | rechoir "^0.6.2" 1288 | resolve "^1.1.7" 1289 | 1290 | load-json-file@^1.0.0: 1291 | version "1.1.0" 1292 | resolved "https://registry.yarnpkg.com/load-json-file/-/load-json-file-1.1.0.tgz#956905708d58b4bab4c2261b04f59f31c99374c0" 1293 | integrity sha1-lWkFcI1YtLq0wiYbBPWfMcmTdMA= 1294 | dependencies: 1295 | graceful-fs "^4.1.2" 1296 | parse-json "^2.2.0" 1297 | pify "^2.0.0" 1298 | pinkie-promise "^2.0.0" 1299 | strip-bom "^2.0.0" 1300 | 1301 | make-iterator@^1.0.0: 1302 | version "1.0.1" 1303 | resolved "https://registry.yarnpkg.com/make-iterator/-/make-iterator-1.0.1.tgz#29b33f312aa8f547c4a5e490f56afcec99133ad6" 1304 | integrity sha512-pxiuXh0iVEq7VM7KMIhs5gxsfxCux2URptUQaXo4iZZJxBAzTPOLE2BumO5dbfVYq/hBJFBR/a1mFDmOx5AGmw== 1305 | dependencies: 1306 | kind-of "^6.0.2" 1307 | 1308 | map-cache@^0.2.0, map-cache@^0.2.2: 1309 | version "0.2.2" 1310 | resolved "https://registry.yarnpkg.com/map-cache/-/map-cache-0.2.2.tgz#c32abd0bd6525d9b051645bb4f26ac5dc98a0dbf" 1311 | integrity sha1-wyq9C9ZSXZsFFkW7TyasXcmKDb8= 1312 | 1313 | map-visit@^1.0.0: 1314 | version "1.0.0" 1315 | resolved "https://registry.yarnpkg.com/map-visit/-/map-visit-1.0.0.tgz#ecdca8f13144e660f1b5bd41f12f3479d98dfb8f" 1316 | integrity sha1-7Nyo8TFE5mDxtb1B8S80edmN+48= 1317 | dependencies: 1318 | object-visit "^1.0.0" 1319 | 1320 | matchdep@^2.0.0: 1321 | version "2.0.0" 1322 | resolved "https://registry.yarnpkg.com/matchdep/-/matchdep-2.0.0.tgz#c6f34834a0d8dbc3b37c27ee8bbcb27c7775582e" 1323 | integrity sha1-xvNINKDY28OzfCfui7yyfHd1WC4= 1324 | dependencies: 1325 | findup-sync "^2.0.0" 1326 | micromatch "^3.0.4" 1327 | resolve "^1.4.0" 1328 | stack-trace "0.0.10" 1329 | 1330 | micromatch@^3.0.4, micromatch@^3.1.10, micromatch@^3.1.4: 1331 | version "3.1.10" 1332 | resolved "https://registry.yarnpkg.com/micromatch/-/micromatch-3.1.10.tgz#70859bc95c9840952f359a068a3fc49f9ecfac23" 1333 | integrity sha512-MWikgl9n9M3w+bpsY3He8L+w9eF9338xRl8IAO5viDizwSzziFEyUzo2xrrloB64ADbTf8uA8vRqqttDTOmccg== 1334 | dependencies: 1335 | arr-diff "^4.0.0" 1336 | array-unique "^0.3.2" 1337 | braces "^2.3.1" 1338 | define-property "^2.0.2" 1339 | extend-shallow "^3.0.2" 1340 | extglob "^2.0.4" 1341 | fragment-cache "^0.2.1" 1342 | kind-of "^6.0.2" 1343 | nanomatch "^1.2.9" 1344 | object.pick "^1.3.0" 1345 | regex-not "^1.0.0" 1346 | snapdragon "^0.8.1" 1347 | to-regex "^3.0.2" 1348 | 1349 | minimatch@^3.0.4: 1350 | version "3.0.4" 1351 | resolved "https://registry.yarnpkg.com/minimatch/-/minimatch-3.0.4.tgz#5166e286457f03306064be5497e8dbb0c3d32083" 1352 | integrity sha512-yJHVQEhyqPLUTgt9B83PXu6W3rx4MvvHvSUvToogpwoGDOUQ+yDrR0HRot+yOCdCO7u4hX3pWft6kWBBcqh0UA== 1353 | dependencies: 1354 | brace-expansion "^1.1.7" 1355 | 1356 | minimist@0.0.8: 1357 | version "0.0.8" 1358 | resolved "https://registry.yarnpkg.com/minimist/-/minimist-0.0.8.tgz#857fcabfc3397d2625b8228262e86aa7a011b05d" 1359 | integrity sha1-hX/Kv8M5fSYluCKCYuhqp6ARsF0= 1360 | 1361 | minimist@^1.2.0: 1362 | version "1.2.0" 1363 | resolved "https://registry.yarnpkg.com/minimist/-/minimist-1.2.0.tgz#a35008b20f41383eec1fb914f4cd5df79a264284" 1364 | integrity sha1-o1AIsg9BOD7sH7kU9M1d95omQoQ= 1365 | 1366 | minipass@^2.2.1, minipass@^2.3.5: 1367 | version "2.3.5" 1368 | resolved "https://registry.yarnpkg.com/minipass/-/minipass-2.3.5.tgz#cacebe492022497f656b0f0f51e2682a9ed2d848" 1369 | integrity sha512-Gi1W4k059gyRbyVUZQ4mEqLm0YIUiGYfvxhF6SIlk3ui1WVxMTGfGdQ2SInh3PDrRTVvPKgULkpJtT4RH10+VA== 1370 | dependencies: 1371 | safe-buffer "^5.1.2" 1372 | yallist "^3.0.0" 1373 | 1374 | minizlib@^1.2.1: 1375 | version "1.2.1" 1376 | resolved "https://registry.yarnpkg.com/minizlib/-/minizlib-1.2.1.tgz#dd27ea6136243c7c880684e8672bb3a45fd9b614" 1377 | integrity sha512-7+4oTUOWKg7AuL3vloEWekXY2/D20cevzsrNT2kGWm+39J9hGTCBv8VI5Pm5lXZ/o3/mdR4f8rflAPhnQb8mPA== 1378 | dependencies: 1379 | minipass "^2.2.1" 1380 | 1381 | mixin-deep@^1.2.0: 1382 | version "1.3.2" 1383 | resolved "https://registry.yarnpkg.com/mixin-deep/-/mixin-deep-1.3.2.tgz#1120b43dc359a785dce65b55b82e257ccf479566" 1384 | integrity sha512-WRoDn//mXBiJ1H40rqa3vH0toePwSsGb45iInWlTySa+Uu4k3tYUSxa2v1KqAiLtvlrSzaExqS1gtk96A9zvEA== 1385 | dependencies: 1386 | for-in "^1.0.2" 1387 | is-extendable "^1.0.1" 1388 | 1389 | mkdirp@^0.5.0, mkdirp@^0.5.1: 1390 | version "0.5.1" 1391 | resolved "https://registry.yarnpkg.com/mkdirp/-/mkdirp-0.5.1.tgz#30057438eac6cf7f8c4767f38648d6697d75c903" 1392 | integrity sha1-MAV0OOrGz3+MR2fzhkjWaX11yQM= 1393 | dependencies: 1394 | minimist "0.0.8" 1395 | 1396 | ms@2.0.0: 1397 | version "2.0.0" 1398 | resolved "https://registry.yarnpkg.com/ms/-/ms-2.0.0.tgz#5608aeadfc00be6c2901df5f9861788de0d597c8" 1399 | integrity sha1-VgiurfwAvmwpAd9fmGF4jeDVl8g= 1400 | 1401 | ms@^2.1.1: 1402 | version "2.1.2" 1403 | resolved "https://registry.yarnpkg.com/ms/-/ms-2.1.2.tgz#d09d1f357b443f493382a8eb3ccd183872ae6009" 1404 | integrity sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w== 1405 | 1406 | mute-stdout@^1.0.0: 1407 | version "1.0.1" 1408 | resolved "https://registry.yarnpkg.com/mute-stdout/-/mute-stdout-1.0.1.tgz#acb0300eb4de23a7ddeec014e3e96044b3472331" 1409 | integrity sha512-kDcwXR4PS7caBpuRYYBUz9iVixUk3anO3f5OYFiIPwK/20vCzKCHyKoulbiDY1S53zD2bxUpxN/IJ+TnXjfvxg== 1410 | 1411 | nan@^2.11.0, nan@^2.12.1: 1412 | version "2.14.0" 1413 | resolved "https://registry.yarnpkg.com/nan/-/nan-2.14.0.tgz#7818f722027b2459a86f0295d434d1fc2336c52c" 1414 | integrity sha512-INOFj37C7k3AfaNTtX8RhsTw7qRy7eLET14cROi9+5HAVbbHuIWUHEauBv5qT4Av2tWasiTY1Jw6puUNqRJXQg== 1415 | 1416 | nanomatch@^1.2.9: 1417 | version "1.2.13" 1418 | resolved "https://registry.yarnpkg.com/nanomatch/-/nanomatch-1.2.13.tgz#b87a8aa4fc0de8fe6be88895b38983ff265bd119" 1419 | integrity sha512-fpoe2T0RbHwBTBUOftAfBPaDEi06ufaUai0mE6Yn1kacc3SnTErfb/h+X94VXzI64rKFHYImXSvdwGGCmwOqCA== 1420 | dependencies: 1421 | arr-diff "^4.0.0" 1422 | array-unique "^0.3.2" 1423 | define-property "^2.0.2" 1424 | extend-shallow "^3.0.2" 1425 | fragment-cache "^0.2.1" 1426 | is-windows "^1.0.2" 1427 | kind-of "^6.0.2" 1428 | object.pick "^1.3.0" 1429 | regex-not "^1.0.0" 1430 | snapdragon "^0.8.1" 1431 | to-regex "^3.0.1" 1432 | 1433 | needle@^2.2.1: 1434 | version "2.4.0" 1435 | resolved "https://registry.yarnpkg.com/needle/-/needle-2.4.0.tgz#6833e74975c444642590e15a750288c5f939b57c" 1436 | integrity sha512-4Hnwzr3mi5L97hMYeNl8wRW/Onhy4nUKR/lVemJ8gJedxxUyBLm9kkrDColJvoSfwi0jCNhD+xCdOtiGDQiRZg== 1437 | dependencies: 1438 | debug "^3.2.6" 1439 | iconv-lite "^0.4.4" 1440 | sax "^1.2.4" 1441 | 1442 | next-tick@^1.0.0: 1443 | version "1.0.0" 1444 | resolved "https://registry.yarnpkg.com/next-tick/-/next-tick-1.0.0.tgz#ca86d1fe8828169b0120208e3dc8424b9db8342c" 1445 | integrity sha1-yobR/ogoFpsBICCOPchCS524NCw= 1446 | 1447 | node-pre-gyp@^0.12.0: 1448 | version "0.12.0" 1449 | resolved "https://registry.yarnpkg.com/node-pre-gyp/-/node-pre-gyp-0.12.0.tgz#39ba4bb1439da030295f899e3b520b7785766149" 1450 | integrity sha512-4KghwV8vH5k+g2ylT+sLTjy5wmUOb9vPhnM8NHvRf9dHmnW/CndrFXy2aRPaPST6dugXSdHXfeaHQm77PIz/1A== 1451 | dependencies: 1452 | detect-libc "^1.0.2" 1453 | mkdirp "^0.5.1" 1454 | needle "^2.2.1" 1455 | nopt "^4.0.1" 1456 | npm-packlist "^1.1.6" 1457 | npmlog "^4.0.2" 1458 | rc "^1.2.7" 1459 | rimraf "^2.6.1" 1460 | semver "^5.3.0" 1461 | tar "^4" 1462 | 1463 | nopt@^4.0.1: 1464 | version "4.0.1" 1465 | resolved "https://registry.yarnpkg.com/nopt/-/nopt-4.0.1.tgz#d0d4685afd5415193c8c7505602d0d17cd64474d" 1466 | integrity sha1-0NRoWv1UFRk8jHUFYC0NF81kR00= 1467 | dependencies: 1468 | abbrev "1" 1469 | osenv "^0.1.4" 1470 | 1471 | normalize-package-data@^2.3.2: 1472 | version "2.5.0" 1473 | resolved "https://registry.yarnpkg.com/normalize-package-data/-/normalize-package-data-2.5.0.tgz#e66db1838b200c1dfc233225d12cb36520e234a8" 1474 | integrity sha512-/5CMN3T0R4XTj4DcGaexo+roZSdSFW/0AOOTROrjxzCG1wrWXEsGbRKevjlIL+ZDE4sZlJr5ED4YW0yqmkK+eA== 1475 | dependencies: 1476 | hosted-git-info "^2.1.4" 1477 | resolve "^1.10.0" 1478 | semver "2 || 3 || 4 || 5" 1479 | validate-npm-package-license "^3.0.1" 1480 | 1481 | normalize-path@^2.1.1: 1482 | version "2.1.1" 1483 | resolved "https://registry.yarnpkg.com/normalize-path/-/normalize-path-2.1.1.tgz#1ab28b556e198363a8c1a6f7e6fa20137fe6aed9" 1484 | integrity sha1-GrKLVW4Zg2Oowab35vogE3/mrtk= 1485 | dependencies: 1486 | remove-trailing-separator "^1.0.1" 1487 | 1488 | normalize-path@^3.0.0: 1489 | version "3.0.0" 1490 | resolved "https://registry.yarnpkg.com/normalize-path/-/normalize-path-3.0.0.tgz#0dcd69ff23a1c9b11fd0978316644a0388216a65" 1491 | integrity sha512-6eZs5Ls3WtCisHWp9S2GUy8dqkpGi4BVSz3GaqiE6ezub0512ESztXUwUB6C6IKbQkY2Pnb/mD4WYojCRwcwLA== 1492 | 1493 | now-and-later@^2.0.0: 1494 | version "2.0.1" 1495 | resolved "https://registry.yarnpkg.com/now-and-later/-/now-and-later-2.0.1.tgz#8e579c8685764a7cc02cb680380e94f43ccb1f7c" 1496 | integrity sha512-KGvQ0cB70AQfg107Xvs/Fbu+dGmZoTRJp2TaPwcwQm3/7PteUyN2BCgk8KBMPGBUXZdVwyWS8fDCGFygBm19UQ== 1497 | dependencies: 1498 | once "^1.3.2" 1499 | 1500 | npm-bundled@^1.0.1: 1501 | version "1.0.6" 1502 | resolved "https://registry.yarnpkg.com/npm-bundled/-/npm-bundled-1.0.6.tgz#e7ba9aadcef962bb61248f91721cd932b3fe6bdd" 1503 | integrity sha512-8/JCaftHwbd//k6y2rEWp6k1wxVfpFzB6t1p825+cUb7Ym2XQfhwIC5KwhrvzZRJu+LtDE585zVaS32+CGtf0g== 1504 | 1505 | npm-packlist@^1.1.6: 1506 | version "1.4.4" 1507 | resolved "https://registry.yarnpkg.com/npm-packlist/-/npm-packlist-1.4.4.tgz#866224233850ac534b63d1a6e76050092b5d2f44" 1508 | integrity sha512-zTLo8UcVYtDU3gdeaFu2Xu0n0EvelfHDGuqtNIn5RO7yQj4H1TqNdBc/yZjxnWA0PVB8D3Woyp0i5B43JwQ6Vw== 1509 | dependencies: 1510 | ignore-walk "^3.0.1" 1511 | npm-bundled "^1.0.1" 1512 | 1513 | npmlog@^4.0.2: 1514 | version "4.1.2" 1515 | resolved "https://registry.yarnpkg.com/npmlog/-/npmlog-4.1.2.tgz#08a7f2a8bf734604779a9efa4ad5cc717abb954b" 1516 | integrity sha512-2uUqazuKlTaSI/dC8AzicUck7+IrEaOnN/e0jd3Xtt1KcGpwx30v50mL7oPyr/h9bL3E4aZccVwpwP+5W9Vjkg== 1517 | dependencies: 1518 | are-we-there-yet "~1.1.2" 1519 | console-control-strings "~1.1.0" 1520 | gauge "~2.7.3" 1521 | set-blocking "~2.0.0" 1522 | 1523 | number-is-nan@^1.0.0: 1524 | version "1.0.1" 1525 | resolved "https://registry.yarnpkg.com/number-is-nan/-/number-is-nan-1.0.1.tgz#097b602b53422a522c1afb8790318336941a011d" 1526 | integrity sha1-CXtgK1NCKlIsGvuHkDGDNpQaAR0= 1527 | 1528 | object-assign@^4.1.0: 1529 | version "4.1.1" 1530 | resolved "https://registry.yarnpkg.com/object-assign/-/object-assign-4.1.1.tgz#2109adc7965887cfc05cbbd442cac8bfbb360863" 1531 | integrity sha1-IQmtx5ZYh8/AXLvUQsrIv7s2CGM= 1532 | 1533 | object-copy@^0.1.0: 1534 | version "0.1.0" 1535 | resolved "https://registry.yarnpkg.com/object-copy/-/object-copy-0.1.0.tgz#7e7d858b781bd7c991a41ba975ed3812754e998c" 1536 | integrity sha1-fn2Fi3gb18mRpBupde04EnVOmYw= 1537 | dependencies: 1538 | copy-descriptor "^0.1.0" 1539 | define-property "^0.2.5" 1540 | kind-of "^3.0.3" 1541 | 1542 | object-keys@^1.0.11, object-keys@^1.0.12: 1543 | version "1.1.1" 1544 | resolved "https://registry.yarnpkg.com/object-keys/-/object-keys-1.1.1.tgz#1c47f272df277f3b1daf061677d9c82e2322c60e" 1545 | integrity sha512-NuAESUOUMrlIXOfHKzD6bpPu3tYt3xvjNdRIQ+FeT0lNb4K8WR70CaDxhuNguS2XG+GjkyMwOzsN5ZktImfhLA== 1546 | 1547 | object-visit@^1.0.0: 1548 | version "1.0.1" 1549 | resolved "https://registry.yarnpkg.com/object-visit/-/object-visit-1.0.1.tgz#f79c4493af0c5377b59fe39d395e41042dd045bb" 1550 | integrity sha1-95xEk68MU3e1n+OdOV5BBC3QRbs= 1551 | dependencies: 1552 | isobject "^3.0.0" 1553 | 1554 | object.assign@^4.0.4: 1555 | version "4.1.0" 1556 | resolved "https://registry.yarnpkg.com/object.assign/-/object.assign-4.1.0.tgz#968bf1100d7956bb3ca086f006f846b3bc4008da" 1557 | integrity sha512-exHJeq6kBKj58mqGyTQ9DFvrZC/eR6OwxzoM9YRoGBqrXYonaFyGiFMuc9VZrXf7DarreEwMpurG3dd+CNyW5w== 1558 | dependencies: 1559 | define-properties "^1.1.2" 1560 | function-bind "^1.1.1" 1561 | has-symbols "^1.0.0" 1562 | object-keys "^1.0.11" 1563 | 1564 | object.defaults@^1.0.0, object.defaults@^1.1.0: 1565 | version "1.1.0" 1566 | resolved "https://registry.yarnpkg.com/object.defaults/-/object.defaults-1.1.0.tgz#3a7f868334b407dea06da16d88d5cd29e435fecf" 1567 | integrity sha1-On+GgzS0B96gbaFtiNXNKeQ1/s8= 1568 | dependencies: 1569 | array-each "^1.0.1" 1570 | array-slice "^1.0.0" 1571 | for-own "^1.0.0" 1572 | isobject "^3.0.0" 1573 | 1574 | object.map@^1.0.0: 1575 | version "1.0.1" 1576 | resolved "https://registry.yarnpkg.com/object.map/-/object.map-1.0.1.tgz#cf83e59dc8fcc0ad5f4250e1f78b3b81bd801d37" 1577 | integrity sha1-z4Plncj8wK1fQlDh94s7gb2AHTc= 1578 | dependencies: 1579 | for-own "^1.0.0" 1580 | make-iterator "^1.0.0" 1581 | 1582 | object.pick@^1.2.0, object.pick@^1.3.0: 1583 | version "1.3.0" 1584 | resolved "https://registry.yarnpkg.com/object.pick/-/object.pick-1.3.0.tgz#87a10ac4c1694bd2e1cbf53591a66141fb5dd747" 1585 | integrity sha1-h6EKxMFpS9Lhy/U1kaZhQftd10c= 1586 | dependencies: 1587 | isobject "^3.0.1" 1588 | 1589 | object.reduce@^1.0.0: 1590 | version "1.0.1" 1591 | resolved "https://registry.yarnpkg.com/object.reduce/-/object.reduce-1.0.1.tgz#6fe348f2ac7fa0f95ca621226599096825bb03ad" 1592 | integrity sha1-b+NI8qx/oPlcpiEiZZkJaCW7A60= 1593 | dependencies: 1594 | for-own "^1.0.0" 1595 | make-iterator "^1.0.0" 1596 | 1597 | once@^1.3.0, once@^1.3.1, once@^1.3.2, once@^1.4.0: 1598 | version "1.4.0" 1599 | resolved "https://registry.yarnpkg.com/once/-/once-1.4.0.tgz#583b1aa775961d4b113ac17d9c50baef9dd76bd1" 1600 | integrity sha1-WDsap3WWHUsROsF9nFC6753Xa9E= 1601 | dependencies: 1602 | wrappy "1" 1603 | 1604 | ordered-read-streams@^1.0.0: 1605 | version "1.0.1" 1606 | resolved "https://registry.yarnpkg.com/ordered-read-streams/-/ordered-read-streams-1.0.1.tgz#77c0cb37c41525d64166d990ffad7ec6a0e1363e" 1607 | integrity sha1-d8DLN8QVJdZBZtmQ/61+xqDhNj4= 1608 | dependencies: 1609 | readable-stream "^2.0.1" 1610 | 1611 | os-homedir@^1.0.0: 1612 | version "1.0.2" 1613 | resolved "https://registry.yarnpkg.com/os-homedir/-/os-homedir-1.0.2.tgz#ffbc4988336e0e833de0c168c7ef152121aa7fb3" 1614 | integrity sha1-/7xJiDNuDoM94MFox+8VISGqf7M= 1615 | 1616 | os-locale@^1.4.0: 1617 | version "1.4.0" 1618 | resolved "https://registry.yarnpkg.com/os-locale/-/os-locale-1.4.0.tgz#20f9f17ae29ed345e8bde583b13d2009803c14d9" 1619 | integrity sha1-IPnxeuKe00XoveWDsT0gCYA8FNk= 1620 | dependencies: 1621 | lcid "^1.0.0" 1622 | 1623 | os-tmpdir@^1.0.0: 1624 | version "1.0.2" 1625 | resolved "https://registry.yarnpkg.com/os-tmpdir/-/os-tmpdir-1.0.2.tgz#bbe67406c79aa85c5cfec766fe5734555dfa1274" 1626 | integrity sha1-u+Z0BseaqFxc/sdm/lc0VV36EnQ= 1627 | 1628 | osenv@^0.1.4: 1629 | version "0.1.5" 1630 | resolved "https://registry.yarnpkg.com/osenv/-/osenv-0.1.5.tgz#85cdfafaeb28e8677f416e287592b5f3f49ea410" 1631 | integrity sha512-0CWcCECdMVc2Rw3U5w9ZjqX6ga6ubk1xDVKxtBQPK7wis/0F2r9T6k4ydGYhecl7YUBxBVxhL5oisPsNxAPe2g== 1632 | dependencies: 1633 | os-homedir "^1.0.0" 1634 | os-tmpdir "^1.0.0" 1635 | 1636 | parse-filepath@^1.0.1: 1637 | version "1.0.2" 1638 | resolved "https://registry.yarnpkg.com/parse-filepath/-/parse-filepath-1.0.2.tgz#a632127f53aaf3d15876f5872f3ffac763d6c891" 1639 | integrity sha1-pjISf1Oq89FYdvWHLz/6x2PWyJE= 1640 | dependencies: 1641 | is-absolute "^1.0.0" 1642 | map-cache "^0.2.0" 1643 | path-root "^0.1.1" 1644 | 1645 | parse-json@^2.2.0: 1646 | version "2.2.0" 1647 | resolved "https://registry.yarnpkg.com/parse-json/-/parse-json-2.2.0.tgz#f480f40434ef80741f8469099f8dea18f55a4dc9" 1648 | integrity sha1-9ID0BDTvgHQfhGkJn43qGPVaTck= 1649 | dependencies: 1650 | error-ex "^1.2.0" 1651 | 1652 | parse-node-version@^1.0.0: 1653 | version "1.0.1" 1654 | resolved "https://registry.yarnpkg.com/parse-node-version/-/parse-node-version-1.0.1.tgz#e2b5dbede00e7fa9bc363607f53327e8b073189b" 1655 | integrity sha512-3YHlOa/JgH6Mnpr05jP9eDG254US9ek25LyIxZlDItp2iJtwyaXQb57lBYLdT3MowkUFYEV2XXNAYIPlESvJlA== 1656 | 1657 | parse-passwd@^1.0.0: 1658 | version "1.0.0" 1659 | resolved "https://registry.yarnpkg.com/parse-passwd/-/parse-passwd-1.0.0.tgz#6d5b934a456993b23d37f40a382d6f1666a8e5c6" 1660 | integrity sha1-bVuTSkVpk7I9N/QKOC1vFmao5cY= 1661 | 1662 | pascalcase@^0.1.1: 1663 | version "0.1.1" 1664 | resolved "https://registry.yarnpkg.com/pascalcase/-/pascalcase-0.1.1.tgz#b363e55e8006ca6fe21784d2db22bd15d7917f14" 1665 | integrity sha1-s2PlXoAGym/iF4TS2yK9FdeRfxQ= 1666 | 1667 | path-dirname@^1.0.0: 1668 | version "1.0.2" 1669 | resolved "https://registry.yarnpkg.com/path-dirname/-/path-dirname-1.0.2.tgz#cc33d24d525e099a5388c0336c6e32b9160609e0" 1670 | integrity sha1-zDPSTVJeCZpTiMAzbG4yuRYGCeA= 1671 | 1672 | path-exists@^2.0.0: 1673 | version "2.1.0" 1674 | resolved "https://registry.yarnpkg.com/path-exists/-/path-exists-2.1.0.tgz#0feb6c64f0fc518d9a754dd5efb62c7022761f4b" 1675 | integrity sha1-D+tsZPD8UY2adU3V77YscCJ2H0s= 1676 | dependencies: 1677 | pinkie-promise "^2.0.0" 1678 | 1679 | path-is-absolute@^1.0.0: 1680 | version "1.0.1" 1681 | resolved "https://registry.yarnpkg.com/path-is-absolute/-/path-is-absolute-1.0.1.tgz#174b9268735534ffbc7ace6bf53a5a9e1b5c5f5f" 1682 | integrity sha1-F0uSaHNVNP+8es5r9TpanhtcX18= 1683 | 1684 | path-parse@^1.0.6: 1685 | version "1.0.6" 1686 | resolved "https://registry.yarnpkg.com/path-parse/-/path-parse-1.0.6.tgz#d62dbb5679405d72c4737ec58600e9ddcf06d24c" 1687 | integrity sha512-GSmOT2EbHrINBf9SR7CDELwlJ8AENk3Qn7OikK4nFYAu3Ote2+JYNVvkpAEQm3/TLNEJFD/xZJjzyxg3KBWOzw== 1688 | 1689 | path-root-regex@^0.1.0: 1690 | version "0.1.2" 1691 | resolved "https://registry.yarnpkg.com/path-root-regex/-/path-root-regex-0.1.2.tgz#bfccdc8df5b12dc52c8b43ec38d18d72c04ba96d" 1692 | integrity sha1-v8zcjfWxLcUsi0PsONGNcsBLqW0= 1693 | 1694 | path-root@^0.1.1: 1695 | version "0.1.1" 1696 | resolved "https://registry.yarnpkg.com/path-root/-/path-root-0.1.1.tgz#9a4a6814cac1c0cd73360a95f32083c8ea4745b7" 1697 | integrity sha1-mkpoFMrBwM1zNgqV8yCDyOpHRbc= 1698 | dependencies: 1699 | path-root-regex "^0.1.0" 1700 | 1701 | path-type@^1.0.0: 1702 | version "1.1.0" 1703 | resolved "https://registry.yarnpkg.com/path-type/-/path-type-1.1.0.tgz#59c44f7ee491da704da415da5a4070ba4f8fe441" 1704 | integrity sha1-WcRPfuSR2nBNpBXaWkBwuk+P5EE= 1705 | dependencies: 1706 | graceful-fs "^4.1.2" 1707 | pify "^2.0.0" 1708 | pinkie-promise "^2.0.0" 1709 | 1710 | pify@^2.0.0: 1711 | version "2.3.0" 1712 | resolved "https://registry.yarnpkg.com/pify/-/pify-2.3.0.tgz#ed141a6ac043a849ea588498e7dca8b15330e90c" 1713 | integrity sha1-7RQaasBDqEnqWISY59yosVMw6Qw= 1714 | 1715 | pinkie-promise@^2.0.0: 1716 | version "2.0.1" 1717 | resolved "https://registry.yarnpkg.com/pinkie-promise/-/pinkie-promise-2.0.1.tgz#2135d6dfa7a358c069ac9b178776288228450ffa" 1718 | integrity sha1-ITXW36ejWMBprJsXh3YogihFD/o= 1719 | dependencies: 1720 | pinkie "^2.0.0" 1721 | 1722 | pinkie@^2.0.0: 1723 | version "2.0.4" 1724 | resolved "https://registry.yarnpkg.com/pinkie/-/pinkie-2.0.4.tgz#72556b80cfa0d48a974e80e77248e80ed4f7f870" 1725 | integrity sha1-clVrgM+g1IqXToDnckjoDtT3+HA= 1726 | 1727 | posix-character-classes@^0.1.0: 1728 | version "0.1.1" 1729 | resolved "https://registry.yarnpkg.com/posix-character-classes/-/posix-character-classes-0.1.1.tgz#01eac0fe3b5af71a2a6c02feabb8c1fef7e00eab" 1730 | integrity sha1-AerA/jta9xoqbAL+q7jB/vfgDqs= 1731 | 1732 | pretty-hrtime@^1.0.0: 1733 | version "1.0.3" 1734 | resolved "https://registry.yarnpkg.com/pretty-hrtime/-/pretty-hrtime-1.0.3.tgz#b7e3ea42435a4c9b2759d99e0f201eb195802ee1" 1735 | integrity sha1-t+PqQkNaTJsnWdmeDyAesZWALuE= 1736 | 1737 | process-nextick-args@^2.0.0, process-nextick-args@~2.0.0: 1738 | version "2.0.1" 1739 | resolved "https://registry.yarnpkg.com/process-nextick-args/-/process-nextick-args-2.0.1.tgz#7820d9b16120cc55ca9ae7792680ae7dba6d7fe2" 1740 | integrity sha512-3ouUOpQhtgrbOa17J7+uxOTpITYWaGP7/AhoR3+A+/1e9skrzelGi/dXzEYyvbxubEF6Wn2ypscTKiKJFFn1ag== 1741 | 1742 | pump@^2.0.0: 1743 | version "2.0.1" 1744 | resolved "https://registry.yarnpkg.com/pump/-/pump-2.0.1.tgz#12399add6e4cf7526d973cbc8b5ce2e2908b3909" 1745 | integrity sha512-ruPMNRkN3MHP1cWJc9OWr+T/xDP0jhXYCLfJcBuX54hhfIBnaQmAUMfDcG4DM5UMWByBbJY69QSphm3jtDKIkA== 1746 | dependencies: 1747 | end-of-stream "^1.1.0" 1748 | once "^1.3.1" 1749 | 1750 | pumpify@^1.3.5: 1751 | version "1.5.1" 1752 | resolved "https://registry.yarnpkg.com/pumpify/-/pumpify-1.5.1.tgz#36513be246ab27570b1a374a5ce278bfd74370ce" 1753 | integrity sha512-oClZI37HvuUJJxSKKrC17bZ9Cu0ZYhEAGPsPUy9KlMUmv9dKX2o77RUmq7f3XjIxbwyGwYzbzQ1L2Ks8sIradQ== 1754 | dependencies: 1755 | duplexify "^3.6.0" 1756 | inherits "^2.0.3" 1757 | pump "^2.0.0" 1758 | 1759 | rc@^1.2.7: 1760 | version "1.2.8" 1761 | resolved "https://registry.yarnpkg.com/rc/-/rc-1.2.8.tgz#cd924bf5200a075b83c188cd6b9e211b7fc0d3ed" 1762 | integrity sha512-y3bGgqKj3QBdxLbLkomlohkvsA8gdAiUQlSBJnBhfn+BPxg4bc62d8TcBW15wavDfgexCgccckhcZvywyQYPOw== 1763 | dependencies: 1764 | deep-extend "^0.6.0" 1765 | ini "~1.3.0" 1766 | minimist "^1.2.0" 1767 | strip-json-comments "~2.0.1" 1768 | 1769 | read-pkg-up@^1.0.1: 1770 | version "1.0.1" 1771 | resolved "https://registry.yarnpkg.com/read-pkg-up/-/read-pkg-up-1.0.1.tgz#9d63c13276c065918d57f002a57f40a1b643fb02" 1772 | integrity sha1-nWPBMnbAZZGNV/ACpX9AobZD+wI= 1773 | dependencies: 1774 | find-up "^1.0.0" 1775 | read-pkg "^1.0.0" 1776 | 1777 | read-pkg@^1.0.0: 1778 | version "1.1.0" 1779 | resolved "https://registry.yarnpkg.com/read-pkg/-/read-pkg-1.1.0.tgz#f5ffaa5ecd29cb31c0474bca7d756b6bb29e3f28" 1780 | integrity sha1-9f+qXs0pyzHAR0vKfXVra7KePyg= 1781 | dependencies: 1782 | load-json-file "^1.0.0" 1783 | normalize-package-data "^2.3.2" 1784 | path-type "^1.0.0" 1785 | 1786 | readable-stream@^2.0.0, readable-stream@^2.0.1, readable-stream@^2.0.2, readable-stream@^2.0.5, readable-stream@^2.0.6, readable-stream@^2.1.5, readable-stream@^2.2.2, readable-stream@^2.3.3, readable-stream@^2.3.5, readable-stream@^2.3.6, readable-stream@~2.3.6: 1787 | version "2.3.6" 1788 | resolved "https://registry.yarnpkg.com/readable-stream/-/readable-stream-2.3.6.tgz#b11c27d88b8ff1fbe070643cf94b0c79ae1b0aaf" 1789 | integrity sha512-tQtKA9WIAhBF3+VLAseyMqZeBjW0AHJoxOtYqSUZNJxauErmLbVm2FW1y+J/YA9dUrAC39ITejlZWhVIwawkKw== 1790 | dependencies: 1791 | core-util-is "~1.0.0" 1792 | inherits "~2.0.3" 1793 | isarray "~1.0.0" 1794 | process-nextick-args "~2.0.0" 1795 | safe-buffer "~5.1.1" 1796 | string_decoder "~1.1.1" 1797 | util-deprecate "~1.0.1" 1798 | 1799 | readdirp@^2.2.1: 1800 | version "2.2.1" 1801 | resolved "https://registry.yarnpkg.com/readdirp/-/readdirp-2.2.1.tgz#0e87622a3325aa33e892285caf8b4e846529a525" 1802 | integrity sha512-1JU/8q+VgFZyxwrJ+SVIOsh+KywWGpds3NTqikiKpDMZWScmAYyKIgqkO+ARvNWJfXeXR1zxz7aHF4u4CyH6vQ== 1803 | dependencies: 1804 | graceful-fs "^4.1.11" 1805 | micromatch "^3.1.10" 1806 | readable-stream "^2.0.2" 1807 | 1808 | rechoir@^0.6.2: 1809 | version "0.6.2" 1810 | resolved "https://registry.yarnpkg.com/rechoir/-/rechoir-0.6.2.tgz#85204b54dba82d5742e28c96756ef43af50e3384" 1811 | integrity sha1-hSBLVNuoLVdC4oyWdW70OvUOM4Q= 1812 | dependencies: 1813 | resolve "^1.1.6" 1814 | 1815 | regex-not@^1.0.0, regex-not@^1.0.2: 1816 | version "1.0.2" 1817 | resolved "https://registry.yarnpkg.com/regex-not/-/regex-not-1.0.2.tgz#1f4ece27e00b0b65e0247a6810e6a85d83a5752c" 1818 | integrity sha512-J6SDjUgDxQj5NusnOtdFxDwN/+HWykR8GELwctJ7mdqhcyy1xEc4SRFHUXvxTp661YaVKAjfRLZ9cCqS6tn32A== 1819 | dependencies: 1820 | extend-shallow "^3.0.2" 1821 | safe-regex "^1.1.0" 1822 | 1823 | remove-bom-buffer@^3.0.0: 1824 | version "3.0.0" 1825 | resolved "https://registry.yarnpkg.com/remove-bom-buffer/-/remove-bom-buffer-3.0.0.tgz#c2bf1e377520d324f623892e33c10cac2c252b53" 1826 | integrity sha512-8v2rWhaakv18qcvNeli2mZ/TMTL2nEyAKRvzo1WtnZBl15SHyEhrCu2/xKlJyUFKHiHgfXIyuY6g2dObJJycXQ== 1827 | dependencies: 1828 | is-buffer "^1.1.5" 1829 | is-utf8 "^0.2.1" 1830 | 1831 | remove-bom-stream@^1.2.0: 1832 | version "1.2.0" 1833 | resolved "https://registry.yarnpkg.com/remove-bom-stream/-/remove-bom-stream-1.2.0.tgz#05f1a593f16e42e1fb90ebf59de8e569525f9523" 1834 | integrity sha1-BfGlk/FuQuH7kOv1nejlaVJflSM= 1835 | dependencies: 1836 | remove-bom-buffer "^3.0.0" 1837 | safe-buffer "^5.1.0" 1838 | through2 "^2.0.3" 1839 | 1840 | remove-trailing-separator@^1.0.1, remove-trailing-separator@^1.1.0: 1841 | version "1.1.0" 1842 | resolved "https://registry.yarnpkg.com/remove-trailing-separator/-/remove-trailing-separator-1.1.0.tgz#c24bce2a283adad5bc3f58e0d48249b92379d8ef" 1843 | integrity sha1-wkvOKig62tW8P1jg1IJJuSN52O8= 1844 | 1845 | repeat-element@^1.1.2: 1846 | version "1.1.3" 1847 | resolved "https://registry.yarnpkg.com/repeat-element/-/repeat-element-1.1.3.tgz#782e0d825c0c5a3bb39731f84efee6b742e6b1ce" 1848 | integrity sha512-ahGq0ZnV5m5XtZLMb+vP76kcAM5nkLqk0lpqAuojSKGgQtn4eRi4ZZGm2olo2zKFH+sMsWaqOCW1dqAnOru72g== 1849 | 1850 | repeat-string@^1.6.1: 1851 | version "1.6.1" 1852 | resolved "https://registry.yarnpkg.com/repeat-string/-/repeat-string-1.6.1.tgz#8dcae470e1c88abc2d600fff4a776286da75e637" 1853 | integrity sha1-jcrkcOHIirwtYA//Sndihtp15jc= 1854 | 1855 | replace-ext@^1.0.0: 1856 | version "1.0.0" 1857 | resolved "https://registry.yarnpkg.com/replace-ext/-/replace-ext-1.0.0.tgz#de63128373fcbf7c3ccfa4de5a480c45a67958eb" 1858 | integrity sha1-3mMSg3P8v3w8z6TeWkgMRaZ5WOs= 1859 | 1860 | replace-homedir@^1.0.0: 1861 | version "1.0.0" 1862 | resolved "https://registry.yarnpkg.com/replace-homedir/-/replace-homedir-1.0.0.tgz#e87f6d513b928dde808260c12be7fec6ff6e798c" 1863 | integrity sha1-6H9tUTuSjd6AgmDBK+f+xv9ueYw= 1864 | dependencies: 1865 | homedir-polyfill "^1.0.1" 1866 | is-absolute "^1.0.0" 1867 | remove-trailing-separator "^1.1.0" 1868 | 1869 | require-directory@^2.1.1: 1870 | version "2.1.1" 1871 | resolved "https://registry.yarnpkg.com/require-directory/-/require-directory-2.1.1.tgz#8c64ad5fd30dab1c976e2344ffe7f792a6a6df42" 1872 | integrity sha1-jGStX9MNqxyXbiNE/+f3kqam30I= 1873 | 1874 | require-main-filename@^1.0.1: 1875 | version "1.0.1" 1876 | resolved "https://registry.yarnpkg.com/require-main-filename/-/require-main-filename-1.0.1.tgz#97f717b69d48784f5f526a6c5aa8ffdda055a4d1" 1877 | integrity sha1-l/cXtp1IeE9fUmpsWqj/3aBVpNE= 1878 | 1879 | resolve-dir@^1.0.0, resolve-dir@^1.0.1: 1880 | version "1.0.1" 1881 | resolved "https://registry.yarnpkg.com/resolve-dir/-/resolve-dir-1.0.1.tgz#79a40644c362be82f26effe739c9bb5382046f43" 1882 | integrity sha1-eaQGRMNivoLybv/nOcm7U4IEb0M= 1883 | dependencies: 1884 | expand-tilde "^2.0.0" 1885 | global-modules "^1.0.0" 1886 | 1887 | resolve-options@^1.1.0: 1888 | version "1.1.0" 1889 | resolved "https://registry.yarnpkg.com/resolve-options/-/resolve-options-1.1.0.tgz#32bb9e39c06d67338dc9378c0d6d6074566ad131" 1890 | integrity sha1-MrueOcBtZzONyTeMDW1gdFZq0TE= 1891 | dependencies: 1892 | value-or-function "^3.0.0" 1893 | 1894 | resolve-url@^0.2.1: 1895 | version "0.2.1" 1896 | resolved "https://registry.yarnpkg.com/resolve-url/-/resolve-url-0.2.1.tgz#2c637fe77c893afd2a663fe21aa9080068e2052a" 1897 | integrity sha1-LGN/53yJOv0qZj/iGqkIAGjiBSo= 1898 | 1899 | resolve@^1.1.6, resolve@^1.1.7, resolve@^1.10.0, resolve@^1.4.0: 1900 | version "1.11.1" 1901 | resolved "https://registry.yarnpkg.com/resolve/-/resolve-1.11.1.tgz#ea10d8110376982fef578df8fc30b9ac30a07a3e" 1902 | integrity sha512-vIpgF6wfuJOZI7KKKSP+HmiKggadPQAdsp5HiC1mvqnfp0gF1vdwgBWZIdrVft9pgqoMFQN+R7BSWZiBxx+BBw== 1903 | dependencies: 1904 | path-parse "^1.0.6" 1905 | 1906 | ret@~0.1.10: 1907 | version "0.1.15" 1908 | resolved "https://registry.yarnpkg.com/ret/-/ret-0.1.15.tgz#b8a4825d5bdb1fc3f6f53c2bc33f81388681c7bc" 1909 | integrity sha512-TTlYpa+OL+vMMNG24xSlQGEJ3B/RzEfUlLct7b5G/ytav+wPrplCpVMFuwzXbkecJrb6IYo1iFb0S9v37754mg== 1910 | 1911 | rimraf@^2.6.1: 1912 | version "2.6.3" 1913 | resolved "https://registry.yarnpkg.com/rimraf/-/rimraf-2.6.3.tgz#b2d104fe0d8fb27cf9e0a1cda8262dd3833c6cab" 1914 | integrity sha512-mwqeW5XsA2qAejG46gYdENaxXjx9onRNCfn7L0duuP4hCuTIi/QO7PDK07KJfp1d+izWPrzEJDcSqBa0OZQriA== 1915 | dependencies: 1916 | glob "^7.1.3" 1917 | 1918 | safe-buffer@^5.1.0, safe-buffer@^5.1.2: 1919 | version "5.2.0" 1920 | resolved "https://registry.yarnpkg.com/safe-buffer/-/safe-buffer-5.2.0.tgz#b74daec49b1148f88c64b68d49b1e815c1f2f519" 1921 | integrity sha512-fZEwUGbVl7kouZs1jCdMLdt95hdIv0ZeHg6L7qPeciMZhZ+/gdesW4wgTARkrFWEpspjEATAzUGPG8N2jJiwbg== 1922 | 1923 | safe-buffer@~5.1.0, safe-buffer@~5.1.1: 1924 | version "5.1.2" 1925 | resolved "https://registry.yarnpkg.com/safe-buffer/-/safe-buffer-5.1.2.tgz#991ec69d296e0313747d59bdfd2b745c35f8828d" 1926 | integrity sha512-Gd2UZBJDkXlY7GbJxfsE8/nvKkUEU1G38c1siN6QP6a9PT9MmHB8GnpscSmMJSoF8LOIrt8ud/wPtojys4G6+g== 1927 | 1928 | safe-regex@^1.1.0: 1929 | version "1.1.0" 1930 | resolved "https://registry.yarnpkg.com/safe-regex/-/safe-regex-1.1.0.tgz#40a3669f3b077d1e943d44629e157dd48023bf2e" 1931 | integrity sha1-QKNmnzsHfR6UPURinhV91IAjvy4= 1932 | dependencies: 1933 | ret "~0.1.10" 1934 | 1935 | "safer-buffer@>= 2.1.2 < 3": 1936 | version "2.1.2" 1937 | resolved "https://registry.yarnpkg.com/safer-buffer/-/safer-buffer-2.1.2.tgz#44fa161b0187b9549dd84bb91802f9bd8385cd6a" 1938 | integrity sha512-YZo3K82SD7Riyi0E1EQPojLz7kpepnSQI9IyPbHHg1XXXevb5dJI7tpyN2ADxGcQbHG7vcyRHk0cbwqcQriUtg== 1939 | 1940 | sax@^1.2.4: 1941 | version "1.2.4" 1942 | resolved "https://registry.yarnpkg.com/sax/-/sax-1.2.4.tgz#2816234e2378bddc4e5354fab5caa895df7100d9" 1943 | integrity sha512-NqVDv9TpANUjFm0N8uM5GxL36UgKi9/atZw+x7YFnQ8ckwFGKrl4xX4yWtrey3UJm5nP1kUbnYgLopqWNSRhWw== 1944 | 1945 | semver-greatest-satisfied-range@^1.1.0: 1946 | version "1.1.0" 1947 | resolved "https://registry.yarnpkg.com/semver-greatest-satisfied-range/-/semver-greatest-satisfied-range-1.1.0.tgz#13e8c2658ab9691cb0cd71093240280d36f77a5b" 1948 | integrity sha1-E+jCZYq5aRywzXEJMkAoDTb3els= 1949 | dependencies: 1950 | sver-compat "^1.5.0" 1951 | 1952 | "semver@2 || 3 || 4 || 5", semver@^5.3.0: 1953 | version "5.7.0" 1954 | resolved "https://registry.yarnpkg.com/semver/-/semver-5.7.0.tgz#790a7cf6fea5459bac96110b29b60412dc8ff96b" 1955 | integrity sha512-Ya52jSX2u7QKghxeoFGpLwCtGlt7j0oY9DYb5apt9nPlJ42ID+ulTXESnt/qAQcoSERyZ5sl3LDIOw0nAn/5DA== 1956 | 1957 | set-blocking@^2.0.0, set-blocking@~2.0.0: 1958 | version "2.0.0" 1959 | resolved "https://registry.yarnpkg.com/set-blocking/-/set-blocking-2.0.0.tgz#045f9782d011ae9a6803ddd382b24392b3d890f7" 1960 | integrity sha1-BF+XgtARrppoA93TgrJDkrPYkPc= 1961 | 1962 | set-value@^2.0.0, set-value@^2.0.1: 1963 | version "2.0.1" 1964 | resolved "https://registry.yarnpkg.com/set-value/-/set-value-2.0.1.tgz#a18d40530e6f07de4228c7defe4227af8cad005b" 1965 | integrity sha512-JxHc1weCN68wRY0fhCoXpyK55m/XPHafOmK4UWD7m2CI14GMcFypt4w/0+NV5f/ZMby2F6S2wwA7fgynh9gWSw== 1966 | dependencies: 1967 | extend-shallow "^2.0.1" 1968 | is-extendable "^0.1.1" 1969 | is-plain-object "^2.0.3" 1970 | split-string "^3.0.1" 1971 | 1972 | signal-exit@^3.0.0: 1973 | version "3.0.2" 1974 | resolved "https://registry.yarnpkg.com/signal-exit/-/signal-exit-3.0.2.tgz#b5fdc08f1287ea1178628e415e25132b73646c6d" 1975 | integrity sha1-tf3AjxKH6hF4Yo5BXiUTK3NkbG0= 1976 | 1977 | snapdragon-node@^2.0.1: 1978 | version "2.1.1" 1979 | resolved "https://registry.yarnpkg.com/snapdragon-node/-/snapdragon-node-2.1.1.tgz#6c175f86ff14bdb0724563e8f3c1b021a286853b" 1980 | integrity sha512-O27l4xaMYt/RSQ5TR3vpWCAB5Kb/czIcqUFOM/C4fYcLnbZUc1PkjTAMjof2pBWaSTwOUd6qUHcFGVGj7aIwnw== 1981 | dependencies: 1982 | define-property "^1.0.0" 1983 | isobject "^3.0.0" 1984 | snapdragon-util "^3.0.1" 1985 | 1986 | snapdragon-util@^3.0.1: 1987 | version "3.0.1" 1988 | resolved "https://registry.yarnpkg.com/snapdragon-util/-/snapdragon-util-3.0.1.tgz#f956479486f2acd79700693f6f7b805e45ab56e2" 1989 | integrity sha512-mbKkMdQKsjX4BAL4bRYTj21edOf8cN7XHdYUJEe+Zn99hVEYcMvKPct1IqNe7+AZPirn8BCDOQBHQZknqmKlZQ== 1990 | dependencies: 1991 | kind-of "^3.2.0" 1992 | 1993 | snapdragon@^0.8.1: 1994 | version "0.8.2" 1995 | resolved "https://registry.yarnpkg.com/snapdragon/-/snapdragon-0.8.2.tgz#64922e7c565b0e14204ba1aa7d6964278d25182d" 1996 | integrity sha512-FtyOnWN/wCHTVXOMwvSv26d+ko5vWlIDD6zoUJ7LW8vh+ZBC8QdljveRP+crNrtBwioEUWy/4dMtbBjA4ioNlg== 1997 | dependencies: 1998 | base "^0.11.1" 1999 | debug "^2.2.0" 2000 | define-property "^0.2.5" 2001 | extend-shallow "^2.0.1" 2002 | map-cache "^0.2.2" 2003 | source-map "^0.5.6" 2004 | source-map-resolve "^0.5.0" 2005 | use "^3.1.0" 2006 | 2007 | source-map-resolve@^0.5.0: 2008 | version "0.5.2" 2009 | resolved "https://registry.yarnpkg.com/source-map-resolve/-/source-map-resolve-0.5.2.tgz#72e2cc34095543e43b2c62b2c4c10d4a9054f259" 2010 | integrity sha512-MjqsvNwyz1s0k81Goz/9vRBe9SZdB09Bdw+/zYyO+3CuPk6fouTaxscHkgtE8jKvf01kVfl8riHzERQ/kefaSA== 2011 | dependencies: 2012 | atob "^2.1.1" 2013 | decode-uri-component "^0.2.0" 2014 | resolve-url "^0.2.1" 2015 | source-map-url "^0.4.0" 2016 | urix "^0.1.0" 2017 | 2018 | source-map-url@^0.4.0: 2019 | version "0.4.0" 2020 | resolved "https://registry.yarnpkg.com/source-map-url/-/source-map-url-0.4.0.tgz#3e935d7ddd73631b97659956d55128e87b5084a3" 2021 | integrity sha1-PpNdfd1zYxuXZZlW1VEo6HtQhKM= 2022 | 2023 | source-map@^0.5.6: 2024 | version "0.5.7" 2025 | resolved "https://registry.yarnpkg.com/source-map/-/source-map-0.5.7.tgz#8a039d2d1021d22d1ea14c80d8ea468ba2ef3fcc" 2026 | integrity sha1-igOdLRAh0i0eoUyA2OpGi6LvP8w= 2027 | 2028 | sparkles@^1.0.0: 2029 | version "1.0.1" 2030 | resolved "https://registry.yarnpkg.com/sparkles/-/sparkles-1.0.1.tgz#008db65edce6c50eec0c5e228e1945061dd0437c" 2031 | integrity sha512-dSO0DDYUahUt/0/pD/Is3VIm5TGJjludZ0HVymmhYF6eNA53PVLhnUk0znSYbH8IYBuJdCE+1luR22jNLMaQdw== 2032 | 2033 | spdx-correct@^3.0.0: 2034 | version "3.1.0" 2035 | resolved "https://registry.yarnpkg.com/spdx-correct/-/spdx-correct-3.1.0.tgz#fb83e504445268f154b074e218c87c003cd31df4" 2036 | integrity sha512-lr2EZCctC2BNR7j7WzJ2FpDznxky1sjfxvvYEyzxNyb6lZXHODmEoJeFu4JupYlkfha1KZpJyoqiJ7pgA1qq8Q== 2037 | dependencies: 2038 | spdx-expression-parse "^3.0.0" 2039 | spdx-license-ids "^3.0.0" 2040 | 2041 | spdx-exceptions@^2.1.0: 2042 | version "2.2.0" 2043 | resolved "https://registry.yarnpkg.com/spdx-exceptions/-/spdx-exceptions-2.2.0.tgz#2ea450aee74f2a89bfb94519c07fcd6f41322977" 2044 | integrity sha512-2XQACfElKi9SlVb1CYadKDXvoajPgBVPn/gOQLrTvHdElaVhr7ZEbqJaRnJLVNeaI4cMEAgVCeBMKF6MWRDCRA== 2045 | 2046 | spdx-expression-parse@^3.0.0: 2047 | version "3.0.0" 2048 | resolved "https://registry.yarnpkg.com/spdx-expression-parse/-/spdx-expression-parse-3.0.0.tgz#99e119b7a5da00e05491c9fa338b7904823b41d0" 2049 | integrity sha512-Yg6D3XpRD4kkOmTpdgbUiEJFKghJH03fiC1OPll5h/0sO6neh2jqRDVHOQ4o/LMea0tgCkbMgea5ip/e+MkWyg== 2050 | dependencies: 2051 | spdx-exceptions "^2.1.0" 2052 | spdx-license-ids "^3.0.0" 2053 | 2054 | spdx-license-ids@^3.0.0: 2055 | version "3.0.5" 2056 | resolved "https://registry.yarnpkg.com/spdx-license-ids/-/spdx-license-ids-3.0.5.tgz#3694b5804567a458d3c8045842a6358632f62654" 2057 | integrity sha512-J+FWzZoynJEXGphVIS+XEh3kFSjZX/1i9gFBaWQcB+/tmpe2qUsSBABpcxqxnAxFdiUFEgAX1bjYGQvIZmoz9Q== 2058 | 2059 | split-string@^3.0.1, split-string@^3.0.2: 2060 | version "3.1.0" 2061 | resolved "https://registry.yarnpkg.com/split-string/-/split-string-3.1.0.tgz#7cb09dda3a86585705c64b39a6466038682e8fe2" 2062 | integrity sha512-NzNVhJDYpwceVVii8/Hu6DKfD2G+NrQHlS/V/qgv763EYudVwEcMQNxd2lh+0VrUByXN/oJkl5grOhYWvQUYiw== 2063 | dependencies: 2064 | extend-shallow "^3.0.0" 2065 | 2066 | stack-trace@0.0.10: 2067 | version "0.0.10" 2068 | resolved "https://registry.yarnpkg.com/stack-trace/-/stack-trace-0.0.10.tgz#547c70b347e8d32b4e108ea1a2a159e5fdde19c0" 2069 | integrity sha1-VHxws0fo0ytOEI6hoqFZ5f3eGcA= 2070 | 2071 | static-extend@^0.1.1: 2072 | version "0.1.2" 2073 | resolved "https://registry.yarnpkg.com/static-extend/-/static-extend-0.1.2.tgz#60809c39cbff55337226fd5e0b520f341f1fb5c6" 2074 | integrity sha1-YICcOcv/VTNyJv1eC1IPNB8ftcY= 2075 | dependencies: 2076 | define-property "^0.2.5" 2077 | object-copy "^0.1.0" 2078 | 2079 | stream-exhaust@^1.0.1: 2080 | version "1.0.2" 2081 | resolved "https://registry.yarnpkg.com/stream-exhaust/-/stream-exhaust-1.0.2.tgz#acdac8da59ef2bc1e17a2c0ccf6c320d120e555d" 2082 | integrity sha512-b/qaq/GlBK5xaq1yrK9/zFcyRSTNxmcZwFLGSTG0mXgZl/4Z6GgiyYOXOvY7N3eEvFRAG1bkDRz5EPGSvPYQlw== 2083 | 2084 | stream-shift@^1.0.0: 2085 | version "1.0.0" 2086 | resolved "https://registry.yarnpkg.com/stream-shift/-/stream-shift-1.0.0.tgz#d5c752825e5367e786f78e18e445ea223a155952" 2087 | integrity sha1-1cdSgl5TZ+eG944Y5EXqIjoVWVI= 2088 | 2089 | string-width@^1.0.1, string-width@^1.0.2: 2090 | version "1.0.2" 2091 | resolved "https://registry.yarnpkg.com/string-width/-/string-width-1.0.2.tgz#118bdf5b8cdc51a2a7e70d211e07e2b0b9b107d3" 2092 | integrity sha1-EYvfW4zcUaKn5w0hHgfisLmxB9M= 2093 | dependencies: 2094 | code-point-at "^1.0.0" 2095 | is-fullwidth-code-point "^1.0.0" 2096 | strip-ansi "^3.0.0" 2097 | 2098 | "string-width@^1.0.2 || 2": 2099 | version "2.1.1" 2100 | resolved "https://registry.yarnpkg.com/string-width/-/string-width-2.1.1.tgz#ab93f27a8dc13d28cac815c462143a6d9012ae9e" 2101 | integrity sha512-nOqH59deCq9SRHlxq1Aw85Jnt4w6KvLKqWVik6oA9ZklXLNIOlqg4F2yrT1MVaTjAqvVwdfeZ7w7aCvJD7ugkw== 2102 | dependencies: 2103 | is-fullwidth-code-point "^2.0.0" 2104 | strip-ansi "^4.0.0" 2105 | 2106 | string_decoder@~1.1.1: 2107 | version "1.1.1" 2108 | resolved "https://registry.yarnpkg.com/string_decoder/-/string_decoder-1.1.1.tgz#9cf1611ba62685d7030ae9e4ba34149c3af03fc8" 2109 | integrity sha512-n/ShnvDi6FHbbVfviro+WojiFzv+s8MPMHBczVePfUpDJLwoLT0ht1l4YwBCbi8pJAveEEdnkHyPyTP/mzRfwg== 2110 | dependencies: 2111 | safe-buffer "~5.1.0" 2112 | 2113 | strip-ansi@^3.0.0, strip-ansi@^3.0.1: 2114 | version "3.0.1" 2115 | resolved "https://registry.yarnpkg.com/strip-ansi/-/strip-ansi-3.0.1.tgz#6a385fb8853d952d5ff05d0e8aaf94278dc63dcf" 2116 | integrity sha1-ajhfuIU9lS1f8F0Oiq+UJ43GPc8= 2117 | dependencies: 2118 | ansi-regex "^2.0.0" 2119 | 2120 | strip-ansi@^4.0.0: 2121 | version "4.0.0" 2122 | resolved "https://registry.yarnpkg.com/strip-ansi/-/strip-ansi-4.0.0.tgz#a8479022eb1ac368a871389b635262c505ee368f" 2123 | integrity sha1-qEeQIusaw2iocTibY1JixQXuNo8= 2124 | dependencies: 2125 | ansi-regex "^3.0.0" 2126 | 2127 | strip-bom@^2.0.0: 2128 | version "2.0.0" 2129 | resolved "https://registry.yarnpkg.com/strip-bom/-/strip-bom-2.0.0.tgz#6219a85616520491f35788bdbf1447a99c7e6b0e" 2130 | integrity sha1-YhmoVhZSBJHzV4i9vxRHqZx+aw4= 2131 | dependencies: 2132 | is-utf8 "^0.2.0" 2133 | 2134 | strip-json-comments@~2.0.1: 2135 | version "2.0.1" 2136 | resolved "https://registry.yarnpkg.com/strip-json-comments/-/strip-json-comments-2.0.1.tgz#3c531942e908c2697c0ec344858c286c7ca0a60a" 2137 | integrity sha1-PFMZQukIwml8DsNEhYwobHygpgo= 2138 | 2139 | sver-compat@^1.5.0: 2140 | version "1.5.0" 2141 | resolved "https://registry.yarnpkg.com/sver-compat/-/sver-compat-1.5.0.tgz#3cf87dfeb4d07b4a3f14827bc186b3fd0c645cd8" 2142 | integrity sha1-PPh9/rTQe0o/FIJ7wYaz/QxkXNg= 2143 | dependencies: 2144 | es6-iterator "^2.0.1" 2145 | es6-symbol "^3.1.1" 2146 | 2147 | tar@^4: 2148 | version "4.4.10" 2149 | resolved "https://registry.yarnpkg.com/tar/-/tar-4.4.10.tgz#946b2810b9a5e0b26140cf78bea6b0b0d689eba1" 2150 | integrity sha512-g2SVs5QIxvo6OLp0GudTqEf05maawKUxXru104iaayWA09551tFCTI8f1Asb4lPfkBr91k07iL4c11XO3/b0tA== 2151 | dependencies: 2152 | chownr "^1.1.1" 2153 | fs-minipass "^1.2.5" 2154 | minipass "^2.3.5" 2155 | minizlib "^1.2.1" 2156 | mkdirp "^0.5.0" 2157 | safe-buffer "^5.1.2" 2158 | yallist "^3.0.3" 2159 | 2160 | through2-filter@^3.0.0: 2161 | version "3.0.0" 2162 | resolved "https://registry.yarnpkg.com/through2-filter/-/through2-filter-3.0.0.tgz#700e786df2367c2c88cd8aa5be4cf9c1e7831254" 2163 | integrity sha512-jaRjI2WxN3W1V8/FMZ9HKIBXixtiqs3SQSX4/YGIiP3gL6djW48VoZq9tDqeCWs3MT8YY5wb/zli8VW8snY1CA== 2164 | dependencies: 2165 | through2 "~2.0.0" 2166 | xtend "~4.0.0" 2167 | 2168 | through2@^2.0.0, through2@^2.0.3, through2@~2.0.0: 2169 | version "2.0.5" 2170 | resolved "https://registry.yarnpkg.com/through2/-/through2-2.0.5.tgz#01c1e39eb31d07cb7d03a96a70823260b23132cd" 2171 | integrity sha512-/mrRod8xqpA+IHSLyGCQ2s8SPHiCDEeQJSep1jqLYeEUClOFG2Qsh+4FU6G9VeqpZnGW/Su8LQGc4YKni5rYSQ== 2172 | dependencies: 2173 | readable-stream "~2.3.6" 2174 | xtend "~4.0.1" 2175 | 2176 | time-stamp@^1.0.0: 2177 | version "1.1.0" 2178 | resolved "https://registry.yarnpkg.com/time-stamp/-/time-stamp-1.1.0.tgz#764a5a11af50561921b133f3b44e618687e0f5c3" 2179 | integrity sha1-dkpaEa9QVhkhsTPztE5hhofg9cM= 2180 | 2181 | to-absolute-glob@^2.0.0: 2182 | version "2.0.2" 2183 | resolved "https://registry.yarnpkg.com/to-absolute-glob/-/to-absolute-glob-2.0.2.tgz#1865f43d9e74b0822db9f145b78cff7d0f7c849b" 2184 | integrity sha1-GGX0PZ50sIItufFFt4z/fQ98hJs= 2185 | dependencies: 2186 | is-absolute "^1.0.0" 2187 | is-negated-glob "^1.0.0" 2188 | 2189 | to-object-path@^0.3.0: 2190 | version "0.3.0" 2191 | resolved "https://registry.yarnpkg.com/to-object-path/-/to-object-path-0.3.0.tgz#297588b7b0e7e0ac08e04e672f85c1f4999e17af" 2192 | integrity sha1-KXWIt7Dn4KwI4E5nL4XB9JmeF68= 2193 | dependencies: 2194 | kind-of "^3.0.2" 2195 | 2196 | to-regex-range@^2.1.0: 2197 | version "2.1.1" 2198 | resolved "https://registry.yarnpkg.com/to-regex-range/-/to-regex-range-2.1.1.tgz#7c80c17b9dfebe599e27367e0d4dd5590141db38" 2199 | integrity sha1-fIDBe53+vlmeJzZ+DU3VWQFB2zg= 2200 | dependencies: 2201 | is-number "^3.0.0" 2202 | repeat-string "^1.6.1" 2203 | 2204 | to-regex@^3.0.1, to-regex@^3.0.2: 2205 | version "3.0.2" 2206 | resolved "https://registry.yarnpkg.com/to-regex/-/to-regex-3.0.2.tgz#13cfdd9b336552f30b51f33a8ae1b42a7a7599ce" 2207 | integrity sha512-FWtleNAtZ/Ki2qtqej2CXTOayOH9bHDQF+Q48VpWyDXjbYxA4Yz8iDB31zXOBUlOHHKidDbqGVrTUvQMPmBGBw== 2208 | dependencies: 2209 | define-property "^2.0.2" 2210 | extend-shallow "^3.0.2" 2211 | regex-not "^1.0.2" 2212 | safe-regex "^1.1.0" 2213 | 2214 | to-through@^2.0.0: 2215 | version "2.0.0" 2216 | resolved "https://registry.yarnpkg.com/to-through/-/to-through-2.0.0.tgz#fc92adaba072647bc0b67d6b03664aa195093af6" 2217 | integrity sha1-/JKtq6ByZHvAtn1rA2ZKoZUJOvY= 2218 | dependencies: 2219 | through2 "^2.0.3" 2220 | 2221 | type@^1.0.1: 2222 | version "1.0.1" 2223 | resolved "https://registry.yarnpkg.com/type/-/type-1.0.1.tgz#084c9a17fcc9151a2cdb1459905c2e45e4bb7d61" 2224 | integrity sha512-MAM5dBMJCJNKs9E7JXo4CXRAansRfG0nlJxW7Wf6GZzSOvH31zClSaHdIMWLehe/EGMBkqeC55rrkaOr5Oo7Nw== 2225 | 2226 | typedarray-to-buffer@^3.1.5: 2227 | version "3.1.5" 2228 | resolved "https://registry.yarnpkg.com/typedarray-to-buffer/-/typedarray-to-buffer-3.1.5.tgz#a97ee7a9ff42691b9f783ff1bc5112fe3fca9080" 2229 | integrity sha512-zdu8XMNEDepKKR+XYOXAVPtWui0ly0NtohUscw+UmaHiAWT8hrV1rr//H6V+0DvJ3OQ19S979M0laLfX8rm82Q== 2230 | dependencies: 2231 | is-typedarray "^1.0.0" 2232 | 2233 | typedarray@^0.0.6: 2234 | version "0.0.6" 2235 | resolved "https://registry.yarnpkg.com/typedarray/-/typedarray-0.0.6.tgz#867ac74e3864187b1d3d47d996a78ec5c8830777" 2236 | integrity sha1-hnrHTjhkGHsdPUfZlqeOxciDB3c= 2237 | 2238 | unc-path-regex@^0.1.2: 2239 | version "0.1.2" 2240 | resolved "https://registry.yarnpkg.com/unc-path-regex/-/unc-path-regex-0.1.2.tgz#e73dd3d7b0d7c5ed86fbac6b0ae7d8c6a69d50fa" 2241 | integrity sha1-5z3T17DXxe2G+6xrCufYxqadUPo= 2242 | 2243 | undertaker-registry@^1.0.0: 2244 | version "1.0.1" 2245 | resolved "https://registry.yarnpkg.com/undertaker-registry/-/undertaker-registry-1.0.1.tgz#5e4bda308e4a8a2ae584f9b9a4359a499825cc50" 2246 | integrity sha1-XkvaMI5KiirlhPm5pDWaSZglzFA= 2247 | 2248 | undertaker@^1.2.1: 2249 | version "1.2.1" 2250 | resolved "https://registry.yarnpkg.com/undertaker/-/undertaker-1.2.1.tgz#701662ff8ce358715324dfd492a4f036055dfe4b" 2251 | integrity sha512-71WxIzDkgYk9ZS+spIB8iZXchFhAdEo2YU8xYqBYJ39DIUIqziK78ftm26eecoIY49X0J2MLhG4hr18Yp6/CMA== 2252 | dependencies: 2253 | arr-flatten "^1.0.1" 2254 | arr-map "^2.0.0" 2255 | bach "^1.0.0" 2256 | collection-map "^1.0.0" 2257 | es6-weak-map "^2.0.1" 2258 | last-run "^1.1.0" 2259 | object.defaults "^1.0.0" 2260 | object.reduce "^1.0.0" 2261 | undertaker-registry "^1.0.0" 2262 | 2263 | union-value@^1.0.0: 2264 | version "1.0.1" 2265 | resolved "https://registry.yarnpkg.com/union-value/-/union-value-1.0.1.tgz#0b6fe7b835aecda61c6ea4d4f02c14221e109847" 2266 | integrity sha512-tJfXmxMeWYnczCVs7XAEvIV7ieppALdyepWMkHkwciRpZraG/xwT+s2JN8+pr1+8jCRf80FFzvr+MpQeeoF4Xg== 2267 | dependencies: 2268 | arr-union "^3.1.0" 2269 | get-value "^2.0.6" 2270 | is-extendable "^0.1.1" 2271 | set-value "^2.0.1" 2272 | 2273 | unique-stream@^2.0.2: 2274 | version "2.3.1" 2275 | resolved "https://registry.yarnpkg.com/unique-stream/-/unique-stream-2.3.1.tgz#c65d110e9a4adf9a6c5948b28053d9a8d04cbeac" 2276 | integrity sha512-2nY4TnBE70yoxHkDli7DMazpWiP7xMdCYqU2nBRO0UB+ZpEkGsSija7MvmvnZFUeC+mrgiUfcHSr3LmRFIg4+A== 2277 | dependencies: 2278 | json-stable-stringify-without-jsonify "^1.0.1" 2279 | through2-filter "^3.0.0" 2280 | 2281 | unset-value@^1.0.0: 2282 | version "1.0.0" 2283 | resolved "https://registry.yarnpkg.com/unset-value/-/unset-value-1.0.0.tgz#8376873f7d2335179ffb1e6fc3a8ed0dfc8ab559" 2284 | integrity sha1-g3aHP30jNRef+x5vw6jtDfyKtVk= 2285 | dependencies: 2286 | has-value "^0.3.1" 2287 | isobject "^3.0.0" 2288 | 2289 | upath@^1.1.1: 2290 | version "1.1.2" 2291 | resolved "https://registry.yarnpkg.com/upath/-/upath-1.1.2.tgz#3db658600edaeeccbe6db5e684d67ee8c2acd068" 2292 | integrity sha512-kXpym8nmDmlCBr7nKdIx8P2jNBa+pBpIUFRnKJ4dr8htyYGJFokkr2ZvERRtUN+9SY+JqXouNgUPtv6JQva/2Q== 2293 | 2294 | urix@^0.1.0: 2295 | version "0.1.0" 2296 | resolved "https://registry.yarnpkg.com/urix/-/urix-0.1.0.tgz#da937f7a62e21fec1fd18d49b35c2935067a6c72" 2297 | integrity sha1-2pN/emLiH+wf0Y1Js1wpNQZ6bHI= 2298 | 2299 | use@^3.1.0: 2300 | version "3.1.1" 2301 | resolved "https://registry.yarnpkg.com/use/-/use-3.1.1.tgz#d50c8cac79a19fbc20f2911f56eb973f4e10070f" 2302 | integrity sha512-cwESVXlO3url9YWlFW/TA9cshCEhtu7IKJ/p5soJ/gGpj7vbvFrAY/eIioQ6Dw23KjZhYgiIo8HOs1nQ2vr/oQ== 2303 | 2304 | util-deprecate@~1.0.1: 2305 | version "1.0.2" 2306 | resolved "https://registry.yarnpkg.com/util-deprecate/-/util-deprecate-1.0.2.tgz#450d4dc9fa70de732762fbd2d4a28981419a0ccf" 2307 | integrity sha1-RQ1Nyfpw3nMnYvvS1KKJgUGaDM8= 2308 | 2309 | v8flags@^3.0.1: 2310 | version "3.1.3" 2311 | resolved "https://registry.yarnpkg.com/v8flags/-/v8flags-3.1.3.tgz#fc9dc23521ca20c5433f81cc4eb9b3033bb105d8" 2312 | integrity sha512-amh9CCg3ZxkzQ48Mhcb8iX7xpAfYJgePHxWMQCBWECpOSqJUXgY26ncA61UTV0BkPqfhcy6mzwCIoP4ygxpW8w== 2313 | dependencies: 2314 | homedir-polyfill "^1.0.1" 2315 | 2316 | validate-npm-package-license@^3.0.1: 2317 | version "3.0.4" 2318 | resolved "https://registry.yarnpkg.com/validate-npm-package-license/-/validate-npm-package-license-3.0.4.tgz#fc91f6b9c7ba15c857f4cb2c5defeec39d4f410a" 2319 | integrity sha512-DpKm2Ui/xN7/HQKCtpZxoRWBhZ9Z0kqtygG8XCgNQ8ZlDnxuQmWhj566j8fN4Cu3/JmbhsDo7fcAJq4s9h27Ew== 2320 | dependencies: 2321 | spdx-correct "^3.0.0" 2322 | spdx-expression-parse "^3.0.0" 2323 | 2324 | value-or-function@^3.0.0: 2325 | version "3.0.0" 2326 | resolved "https://registry.yarnpkg.com/value-or-function/-/value-or-function-3.0.0.tgz#1c243a50b595c1be54a754bfece8563b9ff8d813" 2327 | integrity sha1-HCQ6ULWVwb5Up1S/7OhWO5/42BM= 2328 | 2329 | vinyl-fs@^3.0.0: 2330 | version "3.0.3" 2331 | resolved "https://registry.yarnpkg.com/vinyl-fs/-/vinyl-fs-3.0.3.tgz#c85849405f67428feabbbd5c5dbdd64f47d31bc7" 2332 | integrity sha512-vIu34EkyNyJxmP0jscNzWBSygh7VWhqun6RmqVfXePrOwi9lhvRs//dOaGOTRUQr4tx7/zd26Tk5WeSVZitgng== 2333 | dependencies: 2334 | fs-mkdirp-stream "^1.0.0" 2335 | glob-stream "^6.1.0" 2336 | graceful-fs "^4.0.0" 2337 | is-valid-glob "^1.0.0" 2338 | lazystream "^1.0.0" 2339 | lead "^1.0.0" 2340 | object.assign "^4.0.4" 2341 | pumpify "^1.3.5" 2342 | readable-stream "^2.3.3" 2343 | remove-bom-buffer "^3.0.0" 2344 | remove-bom-stream "^1.2.0" 2345 | resolve-options "^1.1.0" 2346 | through2 "^2.0.0" 2347 | to-through "^2.0.0" 2348 | value-or-function "^3.0.0" 2349 | vinyl "^2.0.0" 2350 | vinyl-sourcemap "^1.1.0" 2351 | 2352 | vinyl-sourcemap@^1.1.0: 2353 | version "1.1.0" 2354 | resolved "https://registry.yarnpkg.com/vinyl-sourcemap/-/vinyl-sourcemap-1.1.0.tgz#92a800593a38703a8cdb11d8b300ad4be63b3e16" 2355 | integrity sha1-kqgAWTo4cDqM2xHYswCtS+Y7PhY= 2356 | dependencies: 2357 | append-buffer "^1.0.2" 2358 | convert-source-map "^1.5.0" 2359 | graceful-fs "^4.1.6" 2360 | normalize-path "^2.1.1" 2361 | now-and-later "^2.0.0" 2362 | remove-bom-buffer "^3.0.0" 2363 | vinyl "^2.0.0" 2364 | 2365 | vinyl@^2.0.0: 2366 | version "2.2.0" 2367 | resolved "https://registry.yarnpkg.com/vinyl/-/vinyl-2.2.0.tgz#d85b07da96e458d25b2ffe19fece9f2caa13ed86" 2368 | integrity sha512-MBH+yP0kC/GQ5GwBqrTPTzEfiiLjta7hTtvQtbxBgTeSXsmKQRQecjibMbxIXzVT3Y9KJK+drOz1/k+vsu8Nkg== 2369 | dependencies: 2370 | clone "^2.1.1" 2371 | clone-buffer "^1.0.0" 2372 | clone-stats "^1.0.0" 2373 | cloneable-readable "^1.0.0" 2374 | remove-trailing-separator "^1.0.1" 2375 | replace-ext "^1.0.0" 2376 | 2377 | websocket@^1.0.29: 2378 | version "1.0.29" 2379 | resolved "https://registry.yarnpkg.com/websocket/-/websocket-1.0.29.tgz#3f83e49d3279657c58b02a22d90749c806101b98" 2380 | integrity sha512-WhU8jKXC8sTh6ocLSqpZRlOKMNYGwUvjA5+XcIgIk/G3JCaDfkZUr0zA19sVSxJ0TEvm0i5IBzr54RZC4vzW7g== 2381 | dependencies: 2382 | debug "^2.2.0" 2383 | gulp "^4.0.2" 2384 | nan "^2.11.0" 2385 | typedarray-to-buffer "^3.1.5" 2386 | yaeti "^0.0.6" 2387 | 2388 | which-module@^1.0.0: 2389 | version "1.0.0" 2390 | resolved "https://registry.yarnpkg.com/which-module/-/which-module-1.0.0.tgz#bba63ca861948994ff307736089e3b96026c2a4f" 2391 | integrity sha1-u6Y8qGGUiZT/MHc2CJ47lgJsKk8= 2392 | 2393 | which@^1.2.14: 2394 | version "1.3.1" 2395 | resolved "https://registry.yarnpkg.com/which/-/which-1.3.1.tgz#a45043d54f5805316da8d62f9f50918d3da70b0a" 2396 | integrity sha512-HxJdYWq1MTIQbJ3nw0cqssHoTNU267KlrDuGZ1WYlxDStUtKUhOaJmh112/TZmHxxUfuJqPXSOm7tDyas0OSIQ== 2397 | dependencies: 2398 | isexe "^2.0.0" 2399 | 2400 | wide-align@^1.1.0: 2401 | version "1.1.3" 2402 | resolved "https://registry.yarnpkg.com/wide-align/-/wide-align-1.1.3.tgz#ae074e6bdc0c14a431e804e624549c633b000457" 2403 | integrity sha512-QGkOQc8XL6Bt5PwnsExKBPuMKBxnGxWWW3fU55Xt4feHozMUhdUMaBCk290qpm/wG5u/RSKzwdAC4i51YigihA== 2404 | dependencies: 2405 | string-width "^1.0.2 || 2" 2406 | 2407 | wrap-ansi@^2.0.0: 2408 | version "2.1.0" 2409 | resolved "https://registry.yarnpkg.com/wrap-ansi/-/wrap-ansi-2.1.0.tgz#d8fc3d284dd05794fe84973caecdd1cf824fdd85" 2410 | integrity sha1-2Pw9KE3QV5T+hJc8rs3Rz4JP3YU= 2411 | dependencies: 2412 | string-width "^1.0.1" 2413 | strip-ansi "^3.0.1" 2414 | 2415 | wrappy@1: 2416 | version "1.0.2" 2417 | resolved "https://registry.yarnpkg.com/wrappy/-/wrappy-1.0.2.tgz#b5243d8f3ec1aa35f1364605bc0d1036e30ab69f" 2418 | integrity sha1-tSQ9jz7BqjXxNkYFvA0QNuMKtp8= 2419 | 2420 | xtend@~4.0.0, xtend@~4.0.1: 2421 | version "4.0.2" 2422 | resolved "https://registry.yarnpkg.com/xtend/-/xtend-4.0.2.tgz#bb72779f5fa465186b1f438f674fa347fdb5db54" 2423 | integrity sha512-LKYU1iAXJXUgAXn9URjiu+MWhyUXHsvfp7mcuYm9dSUKK0/CjtrUwFAxD82/mCWbtLsGjFIad0wIsod4zrTAEQ== 2424 | 2425 | y18n@^3.2.1: 2426 | version "3.2.1" 2427 | resolved "https://registry.yarnpkg.com/y18n/-/y18n-3.2.1.tgz#6d15fba884c08679c0d77e88e7759e811e07fa41" 2428 | integrity sha1-bRX7qITAhnnA136I53WegR4H+kE= 2429 | 2430 | yaeti@^0.0.6: 2431 | version "0.0.6" 2432 | resolved "https://registry.yarnpkg.com/yaeti/-/yaeti-0.0.6.tgz#f26f484d72684cf42bedfb76970aa1608fbf9577" 2433 | integrity sha1-8m9ITXJoTPQr7ft2lwqhYI+/lXc= 2434 | 2435 | yallist@^3.0.0, yallist@^3.0.3: 2436 | version "3.0.3" 2437 | resolved "https://registry.yarnpkg.com/yallist/-/yallist-3.0.3.tgz#b4b049e314be545e3ce802236d6cd22cd91c3de9" 2438 | integrity sha512-S+Zk8DEWE6oKpV+vI3qWkaK+jSbIK86pCwe2IF/xwIpQ8jEuxpw9NyaGjmp9+BoJv5FV2piqCDcoCtStppiq2A== 2439 | 2440 | yargs-parser@^5.0.0: 2441 | version "5.0.0" 2442 | resolved "https://registry.yarnpkg.com/yargs-parser/-/yargs-parser-5.0.0.tgz#275ecf0d7ffe05c77e64e7c86e4cd94bf0e1228a" 2443 | integrity sha1-J17PDX/+Bcd+ZOfIbkzZS/DhIoo= 2444 | dependencies: 2445 | camelcase "^3.0.0" 2446 | 2447 | yargs@^7.1.0: 2448 | version "7.1.0" 2449 | resolved "https://registry.yarnpkg.com/yargs/-/yargs-7.1.0.tgz#6ba318eb16961727f5d284f8ea003e8d6154d0c8" 2450 | integrity sha1-a6MY6xaWFyf10oT46gA+jWFU0Mg= 2451 | dependencies: 2452 | camelcase "^3.0.0" 2453 | cliui "^3.2.0" 2454 | decamelize "^1.1.1" 2455 | get-caller-file "^1.0.1" 2456 | os-locale "^1.4.0" 2457 | read-pkg-up "^1.0.1" 2458 | require-directory "^2.1.1" 2459 | require-main-filename "^1.0.1" 2460 | set-blocking "^2.0.0" 2461 | string-width "^1.0.2" 2462 | which-module "^1.0.0" 2463 | y18n "^3.2.1" 2464 | yargs-parser "^5.0.0" 2465 | -------------------------------------------------------------------------------- /handler.js: -------------------------------------------------------------------------------- 1 | 'use strict'; 2 | 3 | const { 4 | authUser, 5 | authWebsocket, 6 | refreshToken 7 | } = require('./src/controllers/auth.controller'); 8 | 9 | const { 10 | greeting 11 | } = require('./src/controllers/greeting.controller'); 12 | 13 | const { 14 | defaultSocketHandler, 15 | handleSocketConnect, 16 | handleSocketDisconnect 17 | } = require('./src/controllers/websocket.controller'); 18 | 19 | module.exports.authUser = authUser; 20 | module.exports.authWebsocket = authWebsocket; 21 | module.exports.defaultSocketHandler = defaultSocketHandler; 22 | module.exports.greeting = greeting; 23 | module.exports.handleSocketConnect = handleSocketConnect; 24 | module.exports.handleSocketDisconnect = handleSocketDisconnect; 25 | module.exports.refreshToken = refreshToken; 26 | -------------------------------------------------------------------------------- /package.json: -------------------------------------------------------------------------------- 1 | { 2 | "name": "aws-secure-websockets", 3 | "version": "1.0.0", 4 | "description": "AWS secured websockets example implementation using serverless.", 5 | "main": "handler.js", 6 | "author": "Daniel Amores ", 7 | "license": "MIT", 8 | "dependencies": { 9 | "amazon-cognito-identity-js": "3.0.12", 10 | "aws-sdk": "2.466.0", 11 | "node-fetch": "2.6.0", 12 | "node-jose": "1.1.3" 13 | }, 14 | "devDependencies": { 15 | "serverless-dynamodb-local": "0.2.38", 16 | "serverless-offline": "5.0.0" 17 | } 18 | } 19 | -------------------------------------------------------------------------------- /serverless.yml: -------------------------------------------------------------------------------- 1 | service: aws-secure-websockets 2 | 3 | plugins: 4 | - serverless-dynamodb-local 5 | - serverless-offline 6 | 7 | frameworkVersion: ">=1.38.0 <2.0.0" 8 | 9 | custom: 10 | # This can be changed to the desired origin 11 | # When using lambda proxy integration, you have to manually add the CORS headers to responses... 12 | # https://github.com/serverless/serverless/issues/4681 13 | corsOrigin: '*' 14 | user: damoresa 15 | dynamodb: 16 | start: 17 | port: 8700 18 | inMemory: true 19 | migrate: true 20 | migration: 21 | dir: offline/migrations 22 | serverless-offline: 23 | port: 3700 24 | 25 | # This article helped me find out how Serverless handles Cloud Formation naming 26 | # https://github.com/serverless/serverless/blob/master/docs/providers/aws/guide/resources.md 27 | provider: 28 | name: aws 29 | memorySize: 256 30 | runtime: nodejs8.10 31 | region: eu-central-1 32 | # API GW Websocket specific configuration 33 | websocketsApiName: ${self:service}-apigw-websocket-${opt:stage, self:provider.stage} 34 | # Custom routes are selected by the value of the action property in the body 35 | websocketsApiRouteSelectionExpression: $request.body.action 36 | # DynamoDB table name, as composed with parameters from this definition file 37 | environment: 38 | ENVIRONMENT: ${opt:stage, self:provider.stage} 39 | COGNITO_USER_POOL: 40 | Ref: CognitoUserPool 41 | COGNITO_USER_POOL_CLIENT: 42 | Ref: CognitoUserPoolClient 43 | CORS_ORIGIN: ${self:custom.corsOrigin} 44 | DYNAMODB_SOCKETS_TYPE_GSI: ${self:service}-sockets-type-gsi-${opt:stage, self:provider.stage} 45 | DYNAMODB_SOCKETS_TABLE: ${self:service}-sockets-${opt:stage, self:provider.stage} 46 | KEYS_URL: !Join ['', ['https://cognito-idp.', '${opt:region, self:provider.region}', '.amazonaws.com/', !Ref CognitoUserPool, '/.well-known/jwks.json']] 47 | WEBSOCKET_API_ENDPOINT: !Join ['', ['https://', !Ref WebsocketsApi, '.execute-api.', '${opt:region, self:provider.region}', '.amazonaws.com/', '${opt:stage, self:provider.stage}/']] 48 | # Define the service IAM permissions 49 | iamRoleStatements: 50 | # Websocket permissions 51 | - Effect: Allow 52 | Action: 53 | - "execute-api:ManageConnections" 54 | Resource: 55 | - "arn:aws:execute-api:${opt:region, self:provider.region}:*:**/@connections/*" 56 | - Effect: Allow 57 | Action: 58 | - dynamodb:Query 59 | - dynamodb:Scan 60 | - dynamodb:GetItem 61 | - dynamodb:PutItem 62 | - dynamodb:UpdateItem 63 | - dynamodb:DeleteItem 64 | Resource: 65 | - "arn:aws:dynamodb:${opt:region, self:provider.region}:*:table/${self:provider.environment.DYNAMODB_SOCKETS_TABLE}" 66 | - "arn:aws:dynamodb:${opt:region, self:provider.region}:*:table/${self:provider.environment.DYNAMODB_SOCKETS_TABLE}/index/${self:provider.environment.DYNAMODB_SOCKETS_TYPE_GSI}" 67 | 68 | functions: 69 | authUser: 70 | name: LAMBDA_${self:custom.user}_${self:service}_auth_${opt:stage, self:provider.stage} 71 | handler: handler.authUser 72 | events: 73 | - http: 74 | path: auth 75 | method: post 76 | cors: 77 | origin: ${self:custom.corsOrigin} 78 | authWebsocket: 79 | name: LAMBDA_${self:custom.user}_${self:service}_auth_websocket_${opt:stage, self:provider.stage} 80 | handler: handler.authWebsocket 81 | cors: 82 | origin: ${self:custom.corsOrigin} 83 | defaultSocketHandler: 84 | name: LAMBDA_${self:custom.user}_${self:service}_socket_default_${opt:stage, self:provider.stage} 85 | handler: handler.defaultSocketHandler 86 | events: 87 | - websocket: 88 | route: $default 89 | greeting: 90 | name: LAMBDA_${self:custom.user}_${self:service}_socket_greeting_${opt:stage, self:provider.stage} 91 | handler: handler.greeting 92 | events: 93 | - websocket: 94 | route: GREETING 95 | handleSocketConnect: 96 | name: LAMBDA_${self:custom.user}_${self:service}_socket_connect_${opt:stage, self:provider.stage} 97 | handler: handler.handleSocketConnect 98 | events: 99 | - websocket: 100 | route: $connect 101 | # references the authWebsocket function below, serverless doesn't provide any other 102 | # way to perform this as of 01/07/2019 103 | authorizer: 104 | name: authWebsocket 105 | identitySource: 106 | - 'route.request.querystring.Authorizer' 107 | handleSocketDisconnect: 108 | name: LAMBDA_${self:custom.user}_${self:service}_socket_disconnect_${opt:stage, self:provider.stage} 109 | handler: handler.handleSocketDisconnect 110 | events: 111 | - websocket: 112 | route: $disconnect 113 | refreshToken: 114 | name: LAMBDA_${self:custom.user}_${self:service}_auth_refresh_${opt:stage, self:provider.stage} 115 | handler: handler.refreshToken 116 | events: 117 | - http: 118 | path: auth/refresh 119 | method: post 120 | cors: 121 | origin: ${self:custom.corsOrigin} 122 | 123 | resources: 124 | Resources: 125 | CognitoUserPool: 126 | Type: "AWS::Cognito::UserPool" 127 | Properties: 128 | AliasAttributes: 129 | - preferred_username 130 | MfaConfiguration: OFF 131 | UserPoolName: ${self:service}-cognito-${opt:stage, self:provider.stage} 132 | Policies: 133 | PasswordPolicy: 134 | MinimumLength: 6 135 | RequireLowercase: False 136 | RequireNumbers: True 137 | RequireSymbols: False 138 | RequireUppercase: True 139 | CognitoUserPoolClient: 140 | Type: "AWS::Cognito::UserPoolClient" 141 | Properties: 142 | ClientName: ${self:service}-cognito-client-${opt:stage, self:provider.stage} 143 | GenerateSecret: False 144 | UserPoolId: 145 | Ref: CognitoUserPool 146 | SocketsDynamoDbTable: 147 | Type: 'AWS::DynamoDB::Table' 148 | # For a production deployment, you'd want to retain your DB 149 | # in case of re-deployment or stack removal to avoid data loss. 150 | # DeletionPolicy: Retain 151 | Properties: 152 | AttributeDefinitions: 153 | - AttributeName: connectionId 154 | AttributeType: S 155 | - AttributeName: type 156 | AttributeType: S 157 | KeySchema: 158 | - AttributeName: connectionId 159 | KeyType: HASH 160 | ProvisionedThroughput: 161 | ReadCapacityUnits: 1 162 | WriteCapacityUnits: 1 163 | TableName: ${self:provider.environment.DYNAMODB_SOCKETS_TABLE} 164 | GlobalSecondaryIndexes: 165 | - IndexName: ${self:provider.environment.DYNAMODB_SOCKETS_TYPE_GSI} 166 | KeySchema: 167 | - AttributeName: type 168 | KeyType: HASH 169 | Projection: 170 | ProjectionType: ALL 171 | ProvisionedThroughput: 172 | ReadCapacityUnits: 1 173 | WriteCapacityUnits: 1 174 | Outputs: 175 | CognitoUserPoolId: 176 | Value: 177 | Ref: CognitoUserPool 178 | Export: 179 | Name: ASW-CognitoUserPoolId-${self:provider.stage} 180 | CognitoUserPoolClientId: 181 | Value: 182 | Ref: CognitoUserPoolClient 183 | Export: 184 | Name: ASW-CognitoUserPoolClientId-${self:provider.stage} 185 | -------------------------------------------------------------------------------- /sls-policies.json: -------------------------------------------------------------------------------- 1 | { 2 | "Statement": [ 3 | { 4 | "Action": [ 5 | "apigateway:*", 6 | "cloudformation:CancelUpdateStack", 7 | "cloudformation:ContinueUpdateRollback", 8 | "cloudformation:CreateChangeSet", 9 | "cloudformation:CreateStack", 10 | "cloudformation:CreateUploadBucket", 11 | "cloudformation:DeleteStack", 12 | "cloudformation:Describe*", 13 | "cloudformation:EstimateTemplateCost", 14 | "cloudformation:ExecuteChangeSet", 15 | "cloudformation:Get*", 16 | "cloudformation:List*", 17 | "cloudformation:PreviewStackUpdate", 18 | "cloudformation:UpdateStack", 19 | "cloudformation:UpdateTerminationProtection", 20 | "cloudformation:ValidateTemplate", 21 | "dynamodb:CreateTable", 22 | "dynamodb:DeleteTable", 23 | "dynamodb:DescribeTable", 24 | "ec2:AttachInternetGateway", 25 | "ec2:AuthorizeSecurityGroupIngress", 26 | "ec2:CreateInternetGateway", 27 | "ec2:CreateNetworkAcl", 28 | "ec2:CreateNetworkAclEntry", 29 | "ec2:CreateRouteTable", 30 | "ec2:CreateSecurityGroup", 31 | "ec2:CreateSubnet", 32 | "ec2:CreateTags", 33 | "ec2:CreateVpc", 34 | "ec2:DeleteInternetGateway", 35 | "ec2:DeleteNetworkAcl", 36 | "ec2:DeleteNetworkAclEntry", 37 | "ec2:DeleteRouteTable", 38 | "ec2:DeleteSecurityGroup", 39 | "ec2:DeleteSubnet", 40 | "ec2:DeleteVpc", 41 | "ec2:Describe*", 42 | "ec2:DetachInternetGateway", 43 | "ec2:ModifyVpcAttribute", 44 | "events:DeleteRule", 45 | "events:DescribeRule", 46 | "events:ListRuleNamesByTarget", 47 | "events:ListRules", 48 | "events:ListTargetsByRule", 49 | "events:PutRule", 50 | "events:PutTargets", 51 | "events:RemoveTargets", 52 | "iam:CreateRole", 53 | "iam:DeleteRole", 54 | "iam:DeleteRolePolicy", 55 | "iam:GetRole", 56 | "iam:PassRole", 57 | "iam:PutRolePolicy", 58 | "iot:CreateTopicRule", 59 | "iot:DeleteTopicRule", 60 | "iot:DisableTopicRule", 61 | "iot:EnableTopicRule", 62 | "iot:ReplaceTopicRule", 63 | "kinesis:CreateStream", 64 | "kinesis:DeleteStream", 65 | "kinesis:DescribeStream", 66 | "lambda:*", 67 | "logs:CreateLogGroup", 68 | "logs:DeleteLogGroup", 69 | "logs:DescribeLogGroups", 70 | "logs:DescribeLogStreams", 71 | "logs:FilterLogEvents", 72 | "logs:GetLogEvents", 73 | "s3:CreateBucket", 74 | "s3:DeleteBucket", 75 | "s3:DeleteBucketPolicy", 76 | "s3:DeleteObject", 77 | "s3:DeleteObjectVersion", 78 | "s3:GetObject", 79 | "s3:GetObjectVersion", 80 | "s3:ListAllMyBuckets", 81 | "s3:ListBucket", 82 | "s3:PutBucketNotification", 83 | "s3:PutBucketPolicy", 84 | "s3:PutBucketTagging", 85 | "s3:PutBucketWebsite", 86 | "s3:PutEncryptionConfiguration", 87 | "s3:PutObject", 88 | "sns:CreateTopic", 89 | "sns:DeleteTopic", 90 | "sns:GetSubscriptionAttributes", 91 | "sns:GetTopicAttributes", 92 | "sns:ListSubscriptions", 93 | "sns:ListSubscriptionsByTopic", 94 | "sns:ListTopics", 95 | "sns:SetSubscriptionAttributes", 96 | "sns:SetTopicAttributes", 97 | "sns:Subscribe", 98 | "sns:Unsubscribe", 99 | "states:CreateStateMachine", 100 | "states:DeleteStateMachine", 101 | "cognito-idp:ListUserPools", 102 | "cognito-idp:ListUserPoolClients", 103 | "cognito-idp:CreateUserPool", 104 | "cognito-idp:CreateUserPoolClient", 105 | "cognito-idp:DeleteUserPool", 106 | "cognito-idp:DeleteUserPoolClient" 107 | ], 108 | "Effect": "Allow", 109 | "Resource": "*" 110 | } 111 | ], 112 | "Version": "2012-10-17" 113 | } 114 | -------------------------------------------------------------------------------- /src/connector/apigateway.connector.js: -------------------------------------------------------------------------------- 1 | 'use strict'; 2 | 3 | const aws = require('aws-sdk'); 4 | 5 | const CONSTANTS = require('./../constants'); 6 | const dynamodbConnector = require('./dynamodb.connector'); 7 | 8 | class ApiGatewayConnector { 9 | constructor() { 10 | const CONNECTOR_OPTS = { 11 | endpoint: CONSTANTS.WEBSOCKET_API_ENDPOINT 12 | }; 13 | this._connector = new aws.ApiGatewayManagementApi(CONNECTOR_OPTS); 14 | } 15 | 16 | get connector() { 17 | return this._connector; 18 | } 19 | 20 | async generateSocketMessage(connectionId, data) { 21 | try { 22 | return await this._connector.postToConnection({ 23 | ConnectionId: connectionId, 24 | Data: data 25 | }).promise(); 26 | } catch (error) { 27 | console.error('Unable to generate socket message', error); 28 | if (error.statusCode === 410) { 29 | console.log(`Removing stale connector ${connectionId}`); 30 | await dynamodbConnector.removeSocket(connectionId); 31 | } 32 | } 33 | } 34 | } 35 | 36 | const APIGW_CONNECTOR = new ApiGatewayConnector(); 37 | module.exports = APIGW_CONNECTOR; 38 | -------------------------------------------------------------------------------- /src/connector/cognito.connector.js: -------------------------------------------------------------------------------- 1 | 'use strict'; 2 | 3 | // AWS Cognito Identity is only meant for browser usage apparently... 4 | // As a workaround, install and load fetch as global.. 5 | // https://github.com/aws-amplify/amplify-js/issues/403 6 | global.fetch = require('node-fetch'); 7 | const cognitosdk = require('amazon-cognito-identity-js'); 8 | 9 | const CONSTANTS = require('./../constants'); 10 | 11 | const getTokens = (authResult) => { 12 | // According to the official docs, in order to authenticate via API GW 13 | // you don't use the access token but the token id instead. 14 | // https://docs.aws.amazon.com/en_en/cognito/latest/developerguide/using-amazon-cognito-user-identity-pools-javascript-examples.html 15 | const accessToken = authResult.getAccessToken().getJwtToken(); 16 | const refreshToken = authResult.getRefreshToken().getToken(); 17 | const tokenId = authResult.getIdToken().getJwtToken(); 18 | 19 | return { 20 | accessToken, 21 | refreshToken, 22 | tokenId 23 | }; 24 | }; 25 | 26 | const authenticate = (cognitoUser, authenticationDetails) => { 27 | return new Promise((resolve, reject) => { 28 | cognitoUser.authenticateUser(authenticationDetails, { 29 | onSuccess: (result) => { 30 | // Authenticate a user section 31 | resolve(getTokens(result)); 32 | }, 33 | newPasswordRequired: function (userAttributes, requiredAttributes) { 34 | // User was signed up by an admin and must provide new 35 | // password and required attributes, if any, to complete 36 | // authentication. 37 | // This is not production ready and should be managed by the user 38 | // on production environments.C 39 | 40 | // the api doesn't accept this field back 41 | delete userAttributes.email_verified; 42 | 43 | // unsure about this field, but I don't send this back 44 | delete userAttributes.phone_number_verified; 45 | 46 | // Get these details and call 47 | cognitoUser.completeNewPasswordChallenge( 48 | authenticationDetails.getPassword(), 49 | userAttributes, 50 | this 51 | ); 52 | }, 53 | onFailure: (error) => { 54 | reject(error); 55 | } 56 | }); 57 | }); 58 | }; 59 | 60 | const refresh = (cognitoUser, token) => { 61 | return new Promise((resolve, reject) => { 62 | cognitoUser.refreshSession(token, (err, session) => { 63 | if (err) { 64 | reject(err); 65 | } else { 66 | resolve(getTokens(session)); 67 | } 68 | }); 69 | }); 70 | }; 71 | 72 | class CognitoConnector { 73 | constructor() { 74 | const poolData = { 75 | UserPoolId: CONSTANTS.COGNITO_USER_POOL, 76 | ClientId: CONSTANTS.COGNITO_USER_POOL_CLIENT 77 | }; 78 | this._userPool = new cognitosdk.CognitoUserPool(poolData); 79 | } 80 | 81 | async authenticateUser(user, password) { 82 | // 1. Generate an AuthenticationDetails object 83 | const authenticationData = { 84 | Username: user, 85 | Password: password 86 | }; 87 | const authenticationDetails = 88 | new cognitosdk.AuthenticationDetails(authenticationData); 89 | 90 | // 2. Generate a CognitoUser object 91 | const userData = { 92 | Username: user, 93 | Pool: this._userPool 94 | }; 95 | const cognitoUser = new cognitosdk.CognitoUser(userData); 96 | 97 | // 3. Invoke the authenticate method 98 | return await authenticate(cognitoUser, authenticationDetails); 99 | } 100 | 101 | async refreshToken(user, token) { 102 | // 1. Generate a CognitoUser object 103 | const userData = { 104 | Username: user, 105 | Pool: this._userPool 106 | }; 107 | const cognitoUser = new cognitosdk.CognitoUser(userData); 108 | 109 | // 2. Generate a RefreshToken object 110 | const refreshToken = new cognitosdk.CognitoRefreshToken({RefreshToken: token}); 111 | console.log(refreshToken); 112 | console.log(refreshToken.getToken()); 113 | 114 | // 3. Invoke the refresh method 115 | return await refresh(cognitoUser, refreshToken); 116 | } 117 | } 118 | 119 | const COGNITO_CONNECTOR = new CognitoConnector(); 120 | module.exports = COGNITO_CONNECTOR; 121 | -------------------------------------------------------------------------------- /src/connector/dynamodb.connector.js: -------------------------------------------------------------------------------- 1 | 'use strict'; 2 | 3 | const aws = require('aws-sdk'); 4 | 5 | const CONSTANTS = require('./../constants'); 6 | 7 | class DynamoDbConnector { 8 | constructor() { 9 | this._connector = new aws.DynamoDB.DocumentClient(CONSTANTS.DYNAMODB_OPTIONS); 10 | } 11 | 12 | get connector() { 13 | return this._connector; 14 | } 15 | 16 | async findSocketsBySubscription(subscription) { 17 | const queryParams = { 18 | TableName: CONSTANTS.DYNAMODB_SOCKETS_TABLE, 19 | IndexName: CONSTANTS.DYNAMODB_SOCKETS_TYPE_GSI, 20 | KeyConditionExpression: '#type = :type', 21 | ExpressionAttributeNames: { 22 | '#type': 'type', 23 | }, 24 | ExpressionAttributeValues: { 25 | ':type': subscription 26 | } 27 | }; 28 | 29 | return await this._connector.query(queryParams).promise(); 30 | } 31 | 32 | async registerSocket(connectionId, connectionType) { 33 | const socketParams = { 34 | TableName: CONSTANTS.DYNAMODB_SOCKETS_TABLE, 35 | Item: { 36 | connectionId, 37 | type: connectionType 38 | } 39 | }; 40 | 41 | return await this._connector.put(socketParams).promise(); 42 | } 43 | 44 | async removeSocket(connectionId) { 45 | const socketParams = { 46 | TableName: CONSTANTS.DYNAMODB_SOCKETS_TABLE, 47 | Key: { 48 | connectionId 49 | } 50 | }; 51 | 52 | return await this._connector.delete(socketParams).promise(); 53 | } 54 | } 55 | 56 | const DYNAMODB_CONNECTOR = new DynamoDbConnector(); 57 | module.exports = DYNAMODB_CONNECTOR; 58 | -------------------------------------------------------------------------------- /src/constants.js: -------------------------------------------------------------------------------- 1 | 'use strict'; 2 | 3 | const CONSTANTS = { 4 | RSTUDIO_INSTANCE: process.env.RSTUDIO_INSTANCE, 5 | ENVIRONMENT: process.env.ENVIRONMENT, 6 | COGNITO_USER_POOL: process.env.COGNITO_USER_POOL, 7 | COGNITO_USER_POOL_CLIENT: process.env.COGNITO_USER_POOL_CLIENT, 8 | CORS_ORIGIN: process.env.CORS_ORIGIN, 9 | BUCKET_NAME: process.env.BUCKET_NAME, 10 | DYNAMODB_FILES_GSI: process.env.DYNAMODB_FILES_GSI, 11 | DYNAMODB_FILES_TABLE: process.env.DYNAMODB_FILES_TABLE, 12 | DYNAMODB_JOBS_STATE_GSI: process.env.DYNAMODB_JOBS_STATE_GSI, 13 | DYNAMODB_JOBS_TIME_GSI: process.env.DYNAMODB_JOBS_TIME_GSI, 14 | DYNAMODB_JOBS_TABLE: process.env.DYNAMODB_JOBS_TABLE, 15 | DYNAMODB_SOCKETS_TYPE_GSI: process.env.DYNAMODB_SOCKETS_TYPE_GSI, 16 | DYNAMODB_SOCKETS_TABLE: process.env.DYNAMODB_SOCKETS_TABLE, 17 | DYNAMODB_OPTIONS: {}, 18 | GLUE_JOB_NAME: process.env.GLUE_JOB_NAME, 19 | KEYS_URL: process.env.KEYS_URL, 20 | SIGNED_URL_EXPIRE_SECONDS: 60 * 60, 21 | WEBSOCKET_API_ENDPOINT: process.env.WEBSOCKET_API_ENDPOINT 22 | }; 23 | 24 | module.exports = CONSTANTS; 25 | -------------------------------------------------------------------------------- /src/controllers/auth.controller.js: -------------------------------------------------------------------------------- 1 | 'use strict'; 2 | 3 | const fetch = require('node-fetch'); 4 | const jose = require('node-jose'); 5 | 6 | const cognitoConnector = require('./../connector/cognito.connector'); 7 | 8 | const CONSTANTS = require('./../constants'); 9 | 10 | // FIXME: I don't really feel like these fit in here as util functions, but they don't fit in a connector either... 11 | const generatePolicy = function (principalId, effect, resource) { 12 | const authResponse = {}; 13 | authResponse.principalId = principalId; 14 | if (effect && resource) { 15 | const policyDocument = {}; 16 | // default version 17 | policyDocument.Version = "2012-10-17"; 18 | policyDocument.Statement = []; 19 | const statementOne = {}; 20 | // default action 21 | statementOne.Action = "execute-api:Invoke"; 22 | statementOne.Effect = effect; 23 | statementOne.Resource = resource; 24 | policyDocument.Statement[0] = statementOne; 25 | authResponse.policyDocument = policyDocument; 26 | } 27 | return authResponse; 28 | }; 29 | 30 | const generateAllow = function (principalId, resource) { 31 | return generatePolicy(principalId, "Allow", resource); 32 | }; 33 | 34 | const generateDeny = function (principalId, resource) { 35 | return generatePolicy(principalId, "Deny", resource); 36 | }; 37 | 38 | const authUser = async (event, context) => { 39 | 40 | try { 41 | const data = JSON.parse(event.body); 42 | 43 | const user = data.user; 44 | const password = data.password; 45 | 46 | if (!user || !password) { 47 | const error = 'User and password must be provided for user authentication.'; 48 | console.error(error); 49 | return { 50 | statusCode: 500, 51 | headers: { 52 | 'Content-Type': 'text/plain', 53 | 'Access-Control-Allow-Origin': CONSTANTS.CORS_ORIGIN 54 | }, 55 | body: error 56 | } 57 | } else { 58 | const result = await cognitoConnector.authenticateUser(user, password); 59 | const response = { 60 | token: result.tokenId, 61 | refresh: result.refreshToken, 62 | user 63 | }; 64 | 65 | return { 66 | statusCode: 200, 67 | headers: { 68 | 'Content-Type': 'text/plain', 69 | 'Access-Control-Allow-Origin': CONSTANTS.CORS_ORIGIN 70 | }, 71 | body: JSON.stringify(response) 72 | } 73 | } 74 | } catch (error) { 75 | console.error(error); 76 | return { 77 | statusCode: 500, 78 | headers: { 79 | 'Content-Type': 'text/plain', 80 | 'Access-Control-Allow-Origin': CONSTANTS.CORS_ORIGIN 81 | }, 82 | body: 'Unable to authenticate user using AWS Cognito' 83 | } 84 | } 85 | }; 86 | 87 | const authWebsocket = async (event, context) => { 88 | // Read input parameters from event 89 | const methodArn = event.methodArn; 90 | const token = event.queryStringParameters.Authorizer; 91 | 92 | if (!token) { 93 | return context.fail('Unauthorized'); 94 | } else { 95 | // Get the kid from the headers prior to verification 96 | const sections = token.split('.'); 97 | let header = jose.util.base64url.decode(sections[0]); 98 | header = JSON.parse(header); 99 | const kid = header.kid; 100 | 101 | // Fetch known valid keys 102 | const rawRes = await fetch(CONSTANTS.KEYS_URL); 103 | const response = await rawRes.json(); 104 | 105 | if (rawRes.ok) { 106 | const keys = response['keys']; 107 | const foundKey = keys.find((key) => key.kid === kid); 108 | 109 | if (!foundKey) { 110 | context.fail('Public key not found in jwks.json'); 111 | } else { 112 | try { 113 | const result = await jose.JWK.asKey(foundKey); 114 | const keyVerify = jose.JWS.createVerify(result); 115 | const verificationResult = await keyVerify.verify(token); 116 | 117 | const claims = JSON.parse(verificationResult.payload); 118 | 119 | // Verify the token expiration 120 | const currentTime = Math.floor(new Date() / 1000); 121 | if (currentTime > claims.exp) { 122 | console.error('Token expired!'); 123 | context.fail('Token expired!'); 124 | } else if (claims.aud !== CONSTANTS.COGNITO_USER_POOL_CLIENT) { 125 | console.error('Token wasn\'t issued for target audience'); 126 | context.fail('Token was not issued for target audience'); 127 | } else { 128 | context.succeed(generateAllow('me', methodArn)); 129 | } 130 | } catch (error) { 131 | console.error('Unable to verify token', error); 132 | context.fail('Signature verification failed'); 133 | } 134 | } 135 | } 136 | } 137 | }; 138 | 139 | const refreshToken = async (event, context) => { 140 | try { 141 | const data = JSON.parse(event.body); 142 | 143 | const user = data.user; 144 | const refresh = data.refresh; 145 | 146 | if (!user || !refresh) { 147 | const error = 'The user and token to be refreshed must be provided.'; 148 | console.error(error); 149 | return { 150 | statusCode: 500, 151 | headers: { 152 | 'Content-Type': 'text/plain', 153 | 'Access-Control-Allow-Origin': CONSTANTS.CORS_ORIGIN 154 | }, 155 | body: error 156 | } 157 | } else { 158 | const result = await cognitoConnector.refreshToken(user, refresh); 159 | const response = { 160 | token: result.tokenId, 161 | refresh: result.refreshToken, 162 | user: user 163 | }; 164 | 165 | return { 166 | statusCode: 200, 167 | headers: { 168 | 'Content-Type': 'text/plain', 169 | 'Access-Control-Allow-Origin': CONSTANTS.CORS_ORIGIN 170 | }, 171 | body: JSON.stringify(response) 172 | } 173 | } 174 | } catch (error) { 175 | console.error(error); 176 | return { 177 | statusCode: 500, 178 | headers: { 179 | 'Content-Type': 'text/plain', 180 | 'Access-Control-Allow-Origin': CONSTANTS.CORS_ORIGIN 181 | }, 182 | body: 'Unable to refresh user token using AWS Cognito' 183 | } 184 | } 185 | }; 186 | 187 | module.exports = { 188 | authUser, 189 | authWebsocket, 190 | refreshToken 191 | }; 192 | -------------------------------------------------------------------------------- /src/controllers/greeting.controller.js: -------------------------------------------------------------------------------- 1 | 'use strict'; 2 | 3 | const apigatewayConnector = require('./../connector/apigateway.connector'); 4 | const dynamodbConnector = require('./../connector/dynamodb.connector'); 5 | const CONSTANTS = require('./../constants'); 6 | 7 | const greeting = async (event, context) => { 8 | try { 9 | const connectionId = event.requestContext.connectionId; 10 | // Retrieve the message from the socket payload 11 | const data = JSON.parse(event.body); 12 | const greetingMessage = { 13 | action: data.action, 14 | value: data.message 15 | }; 16 | 17 | // Allocate sockets subscribe to greetings 18 | const sockets = await dynamodbConnector.findSocketsBySubscription('greeting'); 19 | if (sockets.Count > 0) { 20 | // Deliver a message to each subscriber found. 21 | // Filter our own connection to avoid notifying ourselves. 22 | const deliverableSockets = sockets.Items 23 | .filter((socket) => socket.connectionId !== connectionId); 24 | 25 | for (const socket of deliverableSockets) { 26 | // Handle errors for each message to avoid stopping if any error happens 27 | try { 28 | await apigatewayConnector.generateSocketMessage( 29 | socket.connectionId, 30 | JSON.stringify(greetingMessage) 31 | ); 32 | } catch (err) { 33 | console.error(`Unable to deliver message to ${socket.connectionId}`, err); 34 | } 35 | } 36 | } else { 37 | console.log('No sockets subscribed to greetings found.'); 38 | } 39 | 40 | // Let the API Gateway Websocket know everything went OK. 41 | return { 42 | statusCode: 200, 43 | headers: { 44 | 'Content-Type': 'text/plain', 45 | 'Access-Control-Allow-Origin': CONSTANTS.CORS_ORIGIN 46 | }, 47 | body: 'Greeting delivered.' 48 | }; 49 | } catch (err) { 50 | // Notify API Gateway Websocket in case of error, also log it on 51 | // CloudWatch 52 | console.error('Unable to generate greeting', err); 53 | return { 54 | statusCode: 500, 55 | headers: { 56 | 'Content-Type': 'text/plain', 57 | 'Access-Control-Allow-Origin': CONSTANTS.CORS_ORIGIN 58 | }, 59 | body: 'Unable to generate greeting.' 60 | } 61 | } 62 | }; 63 | 64 | module.exports = { 65 | greeting 66 | }; 67 | -------------------------------------------------------------------------------- /src/controllers/websocket.controller.js: -------------------------------------------------------------------------------- 1 | 'use strict'; 2 | 3 | const apigatewayConnector = require('./../connector/apigateway.connector'); 4 | const dynamodbConnector = require('./../connector/dynamodb.connector'); 5 | const CONSTANTS = require('./../constants'); 6 | 7 | const defaultSocketHandler = async (event, context) => { 8 | try { 9 | const data = JSON.parse(event.body); 10 | const action = data.action; 11 | 12 | const connectionId = event.requestContext.connectionId; 13 | switch (action) { 14 | case 'PING': 15 | const pingResponse = JSON.stringify({action: 'PING', value: 'PONG'}); 16 | await apigatewayConnector.generateSocketMessage(connectionId, pingResponse); 17 | break; 18 | default: 19 | const invalidResponse = JSON.stringify({action: 'ERROR', error: 'Invalid request'}); 20 | await apigatewayConnector.generateSocketMessage(connectionId, invalidResponse); 21 | } 22 | 23 | return { 24 | statusCode: 200, 25 | headers: { 26 | 'Content-Type': 'text/plain', 27 | 'Access-Control-Allow-Origin': CONSTANTS.CORS_ORIGIN 28 | }, 29 | body: 'Default socket response.' 30 | }; 31 | } catch (err) { 32 | console.error('Unable to generate default response', err); 33 | return { 34 | statusCode: 500, 35 | headers: { 36 | 'Content-Type': 'text/plain', 37 | 'Access-Control-Allow-Origin': CONSTANTS.CORS_ORIGIN 38 | }, 39 | body: 'Default socket response error.' 40 | } 41 | } 42 | }; 43 | 44 | const handleSocketConnect = async (event, context) => { 45 | try { 46 | 47 | const connectionId = event.requestContext.connectionId; 48 | const connectionType = event.queryStringParameters.connectionType; 49 | 50 | await dynamodbConnector.registerSocket(connectionId, connectionType); 51 | 52 | return { 53 | statusCode: 200, 54 | headers: { 55 | 'Content-Type': 'text/plain', 56 | 'Access-Control-Allow-Origin': CONSTANTS.CORS_ORIGIN 57 | }, 58 | body: 'Socket successfully registered.' 59 | }; 60 | } catch (err) { 61 | console.error('Unable to initialize socket connection', err); 62 | return { 63 | statusCode: 500, 64 | headers: { 65 | 'Content-Type': 'text/plain', 66 | 'Access-Control-Allow-Origin': CONSTANTS.CORS_ORIGIN 67 | }, 68 | body: 'Unable to register socket.' 69 | } 70 | } 71 | }; 72 | 73 | const handleSocketDisconnect = async (event, context) => { 74 | try { 75 | const connectionId = event.requestContext.connectionId; 76 | 77 | await dynamodbConnector.removeSocket(connectionId); 78 | 79 | return { 80 | statusCode: 200, 81 | headers: { 82 | 'Content-Type': 'text/plain', 83 | 'Access-Control-Allow-Origin': CONSTANTS.CORS_ORIGIN 84 | }, 85 | body: 'Socket successfully terminated.' 86 | }; 87 | } catch (err) { 88 | console.error('Unable to terminate socket connection', err); 89 | return { 90 | statusCode: 500, 91 | headers: { 92 | 'Content-Type': 'text/plain', 93 | 'Access-Control-Allow-Origin': CONSTANTS.CORS_ORIGIN 94 | }, 95 | body: 'Unable to terminate socket.' 96 | } 97 | } 98 | }; 99 | 100 | module.exports = { 101 | defaultSocketHandler, 102 | handleSocketConnect, 103 | handleSocketDisconnect 104 | }; 105 | -------------------------------------------------------------------------------- /yarn.lock: -------------------------------------------------------------------------------- 1 | # THIS IS AN AUTOGENERATED FILE. DO NOT EDIT THIS FILE DIRECTLY. 2 | # yarn lockfile v1 3 | 4 | 5 | "@hapi/accept@3.x.x": 6 | version "3.2.2" 7 | resolved "https://registry.yarnpkg.com/@hapi/accept/-/accept-3.2.2.tgz#3a033af67be8196c23f8f51aa8756687b972c7cb" 8 | integrity sha512-UtXlTT59srtMr7ZRBzK2CvyWqFwlf78hPt9jEXqkwfbwiwRH1PRv/qkS8lgr5ZyoG6kfpU3xTgt2X91Yfe/6Yg== 9 | dependencies: 10 | "@hapi/boom" "7.x.x" 11 | "@hapi/hoek" "6.x.x" 12 | 13 | "@hapi/address@2.x.x": 14 | version "2.0.0" 15 | resolved "https://registry.yarnpkg.com/@hapi/address/-/address-2.0.0.tgz#9f05469c88cb2fd3dcd624776b54ee95c312126a" 16 | integrity sha512-mV6T0IYqb0xL1UALPFplXYQmR0twnXG0M6jUswpquqT2sD12BOiCiLy3EvMp/Fy7s3DZElC4/aPjEjo2jeZpvw== 17 | 18 | "@hapi/ammo@3.x.x": 19 | version "3.1.0" 20 | resolved "https://registry.yarnpkg.com/@hapi/ammo/-/ammo-3.1.0.tgz#a3281ecb68bf7af2ffa6d0f7656536a7d23700ed" 21 | integrity sha512-iFQBEfm3WwWy8JdPQ8l6qXVLPtzmjITVfaxwl6dfoP8kKv6i2Uk43Ax+ShkNfOVyfEnNggqL2IyZTY3DaaRGNg== 22 | dependencies: 23 | "@hapi/hoek" "6.x.x" 24 | 25 | "@hapi/b64@4.x.x": 26 | version "4.2.0" 27 | resolved "https://registry.yarnpkg.com/@hapi/b64/-/b64-4.2.0.tgz#76de0c7ed76e55bfa42709a4facfe894dd41d741" 28 | integrity sha512-hmfPC1aF7cP21489A/IWPC3s1GE+1eAteVwFcOWLwj0Pky8eHgvrXPSSko2IeCpxqOdZhYw71IFN8xKPdv3CtQ== 29 | dependencies: 30 | "@hapi/hoek" "6.x.x" 31 | 32 | "@hapi/boom@7.x.x", "@hapi/boom@^7.4.2": 33 | version "7.4.2" 34 | resolved "https://registry.yarnpkg.com/@hapi/boom/-/boom-7.4.2.tgz#c16957cd09796f6c1bfb4031bdc39d66d6d750c3" 35 | integrity sha512-T2CYcTI0AqSvC6YC7keu/fh9LVSMzfoMLharBnPbOwmc+Cexj9joIc5yNDKunaxYq9LPuOwMS0f2B3S1tFQUNw== 36 | dependencies: 37 | "@hapi/hoek" "6.x.x" 38 | 39 | "@hapi/bounce@1.x.x": 40 | version "1.3.1" 41 | resolved "https://registry.yarnpkg.com/@hapi/bounce/-/bounce-1.3.1.tgz#7e0017300fa92b21bc6706590cac08f6085899e1" 42 | integrity sha512-/ecFQTRBom2MEbjMHvKKE6FZ/e1gYK72CeUIFzz++dKK1kYJ0KbRJ72mXroWoTT2hIv+8H0ua/eOkO0+hRdHcw== 43 | dependencies: 44 | "@hapi/boom" "7.x.x" 45 | "@hapi/hoek" "8.x.x" 46 | 47 | "@hapi/bourne@1.x.x": 48 | version "1.3.2" 49 | resolved "https://registry.yarnpkg.com/@hapi/bourne/-/bourne-1.3.2.tgz#0a7095adea067243ce3283e1b56b8a8f453b242a" 50 | integrity sha512-1dVNHT76Uu5N3eJNTYcvxee+jzX4Z9lfciqRRHCU27ihbUcYi+iSc2iml5Ke1LXe1SyJCLA0+14Jh4tXJgOppA== 51 | 52 | "@hapi/call@5.x.x": 53 | version "5.1.0" 54 | resolved "https://registry.yarnpkg.com/@hapi/call/-/call-5.1.0.tgz#91e4c434318003173d96d211d90d35736a33945e" 55 | integrity sha512-CiVEXjD/jiIHBqufBW3pdedshEMjRmHtff7m1puot8j4MUmuKRbLlh0DB8fv6QqH/7/55pH1qgFj300r0WpyMw== 56 | dependencies: 57 | "@hapi/boom" "7.x.x" 58 | "@hapi/hoek" "6.x.x" 59 | 60 | "@hapi/catbox-memory@4.x.x": 61 | version "4.1.0" 62 | resolved "https://registry.yarnpkg.com/@hapi/catbox-memory/-/catbox-memory-4.1.0.tgz#cb5fbaf45c52beb44766dae018a2aee7b43e9c88" 63 | integrity sha512-libCGyufOZaJu6uE9nVXw/u8tqOt4ifNIrOSAsDjzS+af3vPJyid8faOICqKCAh3E338UAsUe5AeYdezdsmtpg== 64 | dependencies: 65 | "@hapi/boom" "7.x.x" 66 | "@hapi/hoek" "6.x.x" 67 | 68 | "@hapi/catbox@10.x.x": 69 | version "10.2.1" 70 | resolved "https://registry.yarnpkg.com/@hapi/catbox/-/catbox-10.2.1.tgz#ae21fbcdd16e4dff802b6969ee2d6bc51b7e1128" 71 | integrity sha512-u13BXlnmmrNUZssjTriRVTLuk6I/yUy5C1/Pia1+E2cpfd7o2/jmEvYdFgeS0Ft9QTz7WWhpXKlrguARUuohhQ== 72 | dependencies: 73 | "@hapi/boom" "7.x.x" 74 | "@hapi/hoek" "6.x.x" 75 | "@hapi/joi" "15.x.x" 76 | "@hapi/podium" "3.x.x" 77 | 78 | "@hapi/content@4.x.x": 79 | version "4.1.0" 80 | resolved "https://registry.yarnpkg.com/@hapi/content/-/content-4.1.0.tgz#5265516949ca081e85a43e97c1058ff53fc69714" 81 | integrity sha512-hv2Czsl49hnWDEfRZOFow/BmYbKyfEknmk3k83gOp6moFn5ceHB4xVcna8OwsGfy8dxO81lhpPy+JgQEaU4SWw== 82 | dependencies: 83 | "@hapi/boom" "7.x.x" 84 | 85 | "@hapi/cryptiles@4.x.x", "@hapi/cryptiles@^4.2.0": 86 | version "4.2.0" 87 | resolved "https://registry.yarnpkg.com/@hapi/cryptiles/-/cryptiles-4.2.0.tgz#d22bd5afa54f3c1a3b944a43dadfd4c5e5747f72" 88 | integrity sha512-P+ioMP1JGhwDOKPRuQls6sT/ln6Fk+Ks6d90mlBi6HcOu5itvdUiFv5Ynq2DvLadPDWaA43lwNxkfZrjE9s2MA== 89 | dependencies: 90 | "@hapi/boom" "7.x.x" 91 | 92 | "@hapi/file@1.x.x": 93 | version "1.0.0" 94 | resolved "https://registry.yarnpkg.com/@hapi/file/-/file-1.0.0.tgz#c91c39fd04db8bed5af82d2e032e7a4e65555b38" 95 | integrity sha512-Bsfp/+1Gyf70eGtnIgmScvrH8sSypO3TcK3Zf0QdHnzn/ACnAkI6KLtGACmNRPEzzIy+W7aJX5E+1fc9GwIABQ== 96 | 97 | "@hapi/h2o2@^8.3.0": 98 | version "8.3.0" 99 | resolved "https://registry.yarnpkg.com/@hapi/h2o2/-/h2o2-8.3.0.tgz#9783fb54005cc8e05fb75a1eba975035ad469127" 100 | integrity sha512-JKFqewDvVBXwhIHFIuFjtndzW5SDA1oi7qohwYW/igqfDdOAwYq9cYlpGVPg+KeeDCESDNJCl7bPQt+oQgirOw== 101 | dependencies: 102 | "@hapi/boom" "7.x.x" 103 | "@hapi/hoek" "6.x.x" 104 | "@hapi/joi" "15.x.x" 105 | "@hapi/wreck" "15.x.x" 106 | 107 | "@hapi/hapi@^18.3.1": 108 | version "18.3.1" 109 | resolved "https://registry.yarnpkg.com/@hapi/hapi/-/hapi-18.3.1.tgz#936d1e24551b11486eabd6a4974bea4ec2127669" 110 | integrity sha512-gBiU9isWWezrg0ucX95Ph6AY6fUKZub3FxKapaleoFBJDOUcxTYiQR6Lha2zvHalIFoTl3K04O3Yr/5pD17QkQ== 111 | dependencies: 112 | "@hapi/accept" "3.x.x" 113 | "@hapi/ammo" "3.x.x" 114 | "@hapi/boom" "7.x.x" 115 | "@hapi/bounce" "1.x.x" 116 | "@hapi/call" "5.x.x" 117 | "@hapi/catbox" "10.x.x" 118 | "@hapi/catbox-memory" "4.x.x" 119 | "@hapi/heavy" "6.x.x" 120 | "@hapi/hoek" "6.x.x" 121 | "@hapi/joi" "15.x.x" 122 | "@hapi/mimos" "4.x.x" 123 | "@hapi/podium" "3.x.x" 124 | "@hapi/shot" "4.x.x" 125 | "@hapi/somever" "2.x.x" 126 | "@hapi/statehood" "6.x.x" 127 | "@hapi/subtext" "6.x.x" 128 | "@hapi/teamwork" "3.x.x" 129 | "@hapi/topo" "3.x.x" 130 | 131 | "@hapi/heavy@6.x.x": 132 | version "6.2.0" 133 | resolved "https://registry.yarnpkg.com/@hapi/heavy/-/heavy-6.2.0.tgz#b6c30578e1f30ab6ca17a818772f11b1116ba8cc" 134 | integrity sha512-tzGU9cElY0IxRBudGB7tLFkdpBD8XQPfd6G7DSOnvHRK+q96UHGHn4t59Yd7kDpVucNkErWWYarsGx2KmKPkXA== 135 | dependencies: 136 | "@hapi/boom" "7.x.x" 137 | "@hapi/hoek" "6.x.x" 138 | "@hapi/joi" "15.x.x" 139 | 140 | "@hapi/hoek@6.x.x": 141 | version "6.2.4" 142 | resolved "https://registry.yarnpkg.com/@hapi/hoek/-/hoek-6.2.4.tgz#4b95fbaccbfba90185690890bdf1a2fbbda10595" 143 | integrity sha512-HOJ20Kc93DkDVvjwHyHawPwPkX44sIrbXazAUDiUXaY2R9JwQGo2PhFfnQtdrsIe4igjG2fPgMra7NYw7qhy0A== 144 | 145 | "@hapi/hoek@8.x.x": 146 | version "8.0.2" 147 | resolved "https://registry.yarnpkg.com/@hapi/hoek/-/hoek-8.0.2.tgz#f63a5ff00e891a4e7aa98f11119f9515c6672032" 148 | integrity sha512-O6o6mrV4P65vVccxymuruucb+GhP2zl9NLCG8OdoFRS8BEGw3vwpPp20wpAtpbQQxz1CEUtmxJGgWhjq1XA3qw== 149 | 150 | "@hapi/iron@5.x.x": 151 | version "5.1.0" 152 | resolved "https://registry.yarnpkg.com/@hapi/iron/-/iron-5.1.0.tgz#c3b34783cd19b7b8aabe11b72b0ce3781fcee08d" 153 | integrity sha512-+MK3tBPkEKd50SrDTRXa2DVvE0UTPFKxGbodlbQpNP9SVlxi+ZwA640VJtMNj84FZh81UUxda8AOLPRKFffnEA== 154 | dependencies: 155 | "@hapi/b64" "4.x.x" 156 | "@hapi/boom" "7.x.x" 157 | "@hapi/cryptiles" "4.x.x" 158 | "@hapi/hoek" "6.x.x" 159 | 160 | "@hapi/joi@15.x.x": 161 | version "15.1.0" 162 | resolved "https://registry.yarnpkg.com/@hapi/joi/-/joi-15.1.0.tgz#940cb749b5c55c26ab3b34ce362e82b6162c8e7a" 163 | integrity sha512-n6kaRQO8S+kepUTbXL9O/UOL788Odqs38/VOfoCrATDtTvyfiO3fgjlSRaNkHabpTLgM7qru9ifqXlXbXk8SeQ== 164 | dependencies: 165 | "@hapi/address" "2.x.x" 166 | "@hapi/hoek" "6.x.x" 167 | "@hapi/marker" "1.x.x" 168 | "@hapi/topo" "3.x.x" 169 | 170 | "@hapi/marker@1.x.x": 171 | version "1.0.0" 172 | resolved "https://registry.yarnpkg.com/@hapi/marker/-/marker-1.0.0.tgz#65b0b2b01d1be06304886ce9b4b77b1bfb21a769" 173 | integrity sha512-JOfdekTXnJexfE8PyhZFyHvHjt81rBFSAbTIRAhF2vv/2Y1JzoKsGqxH/GpZJoF7aEfYok8JVcAHmSz1gkBieA== 174 | 175 | "@hapi/mimos@4.x.x": 176 | version "4.1.0" 177 | resolved "https://registry.yarnpkg.com/@hapi/mimos/-/mimos-4.1.0.tgz#8c3345ca3b70c0e10e7e9e35f0e01d314c2d4e32" 178 | integrity sha512-CkxOB15TFZDMl5tQ5qezKZvvBnkRYVc8YksNfA5TnqQMMsU7vGPyvuuNFqj+15bfEwHyM6qasxyQNdkX9B/cQw== 179 | dependencies: 180 | "@hapi/hoek" "6.x.x" 181 | mime-db "1.x.x" 182 | 183 | "@hapi/nigel@3.x.x": 184 | version "3.1.0" 185 | resolved "https://registry.yarnpkg.com/@hapi/nigel/-/nigel-3.1.0.tgz#88f78220f4f022a5bd1d61b59505367861425595" 186 | integrity sha512-IJyau32pz5Bf7pzUU/8AIn/SvPvhLMQcOel6kM7ECpKyPc895AwttSusRKfgTwfxZOEG6W8DnNv25gLtqrVFSg== 187 | dependencies: 188 | "@hapi/hoek" "6.x.x" 189 | "@hapi/vise" "3.x.x" 190 | 191 | "@hapi/pez@4.x.x": 192 | version "4.1.0" 193 | resolved "https://registry.yarnpkg.com/@hapi/pez/-/pez-4.1.0.tgz#97a88e5d19e756efbd24e5f583d59fa8db1d6cba" 194 | integrity sha512-c+AxL8/cCj+7FB+tzJ5FhWKYP8zF7/7mA3Ft3a5y7h6YT26qzhj5d2JY27jur30KaZbrZAd4ofXXkqvE/IpJlA== 195 | dependencies: 196 | "@hapi/b64" "4.x.x" 197 | "@hapi/boom" "7.x.x" 198 | "@hapi/content" "4.x.x" 199 | "@hapi/hoek" "6.x.x" 200 | "@hapi/nigel" "3.x.x" 201 | 202 | "@hapi/podium@3.x.x": 203 | version "3.4.0" 204 | resolved "https://registry.yarnpkg.com/@hapi/podium/-/podium-3.4.0.tgz#350b2a93eb13b8b7e297e5bcd8b1fea26e359607" 205 | integrity sha512-IwyewAPGlCoq+g5536PKSDqSTfgpwbj+q4cBJpEUNqzwc5C5SM2stuFsULU7x1jKeWevfgWDoYWC75ML4IOYug== 206 | dependencies: 207 | "@hapi/hoek" "6.x.x" 208 | "@hapi/joi" "15.x.x" 209 | 210 | "@hapi/shot@4.x.x": 211 | version "4.1.0" 212 | resolved "https://registry.yarnpkg.com/@hapi/shot/-/shot-4.1.0.tgz#e564bf5474d932e947bc48ab35ff565d4e1bf57b" 213 | integrity sha512-rpUU5cF08fqAZLLnue6Sy0osj1QMPbrYskehxtLFPdk7CwlPcu9N/wRtgu7vDHTQCKTkag6M8sjc8V8p8lSxpg== 214 | dependencies: 215 | "@hapi/hoek" "6.x.x" 216 | "@hapi/joi" "15.x.x" 217 | 218 | "@hapi/somever@2.x.x": 219 | version "2.1.0" 220 | resolved "https://registry.yarnpkg.com/@hapi/somever/-/somever-2.1.0.tgz#46ccf2a85ab77635982af15aa4a28c847717bdbf" 221 | integrity sha512-kMPewbpgLd0MSlNg0bjvq57Levozbg7c3O0idpWRxRgXfXBALNATLf8GRVbnMehYXAh7YRD2mR/91kginDtJ2Q== 222 | dependencies: 223 | "@hapi/bounce" "1.x.x" 224 | "@hapi/hoek" "6.x.x" 225 | 226 | "@hapi/statehood@6.x.x": 227 | version "6.1.0" 228 | resolved "https://registry.yarnpkg.com/@hapi/statehood/-/statehood-6.1.0.tgz#2681c738d816281d6a590286054c8b9e779116fc" 229 | integrity sha512-qc8Qq3kg0b3XK7siXf6DK0wp+rcOrXv336kIP6YrtD9TbQ45TsBobwKkUXB+4R3GCCQ8a6tOj8FR/9bdtjKJCA== 230 | dependencies: 231 | "@hapi/boom" "7.x.x" 232 | "@hapi/bounce" "1.x.x" 233 | "@hapi/bourne" "1.x.x" 234 | "@hapi/cryptiles" "4.x.x" 235 | "@hapi/hoek" "6.x.x" 236 | "@hapi/iron" "5.x.x" 237 | "@hapi/joi" "15.x.x" 238 | 239 | "@hapi/subtext@6.x.x": 240 | version "6.1.1" 241 | resolved "https://registry.yarnpkg.com/@hapi/subtext/-/subtext-6.1.1.tgz#3b63b4175a7bd06cd0d21f13912c7d81de90e6d2" 242 | integrity sha512-Y7NjKFRPwlzKRw5IdwRou42hR4IBQZolT+/DlvfSr/CBjGyu38n5+9LKfNKzqB/0AVEk+xynCijsx1o1UVWX8A== 243 | dependencies: 244 | "@hapi/boom" "7.x.x" 245 | "@hapi/bourne" "1.x.x" 246 | "@hapi/content" "4.x.x" 247 | "@hapi/file" "1.x.x" 248 | "@hapi/hoek" "8.x.x" 249 | "@hapi/pez" "4.x.x" 250 | "@hapi/wreck" "15.x.x" 251 | 252 | "@hapi/teamwork@3.x.x": 253 | version "3.3.1" 254 | resolved "https://registry.yarnpkg.com/@hapi/teamwork/-/teamwork-3.3.1.tgz#b52d0ec48682dc793926bd432e22ceb19c915d3f" 255 | integrity sha512-61tiqWCYvMKP7fCTXy0M4VE6uNIwA0qvgFoiDubgfj7uqJ0fdHJFQNnVPGrxhLWlwz0uBPWrQlBH7r8y9vFITQ== 256 | 257 | "@hapi/topo@3.x.x": 258 | version "3.1.2" 259 | resolved "https://registry.yarnpkg.com/@hapi/topo/-/topo-3.1.2.tgz#57cc1317be1a8c5f47c124f9b0e3c49cd78424d2" 260 | integrity sha512-r+aumOqJ5QbD6aLPJWqVjMAPsx5pZKz+F5yPqXZ/WWG9JTtHbQqlzrJoknJ0iJxLj9vlXtmpSdjlkszseeG8OA== 261 | dependencies: 262 | "@hapi/hoek" "8.x.x" 263 | 264 | "@hapi/vise@3.x.x": 265 | version "3.1.0" 266 | resolved "https://registry.yarnpkg.com/@hapi/vise/-/vise-3.1.0.tgz#4fa71b9e752f35e5519115c73a47479a7375b445" 267 | integrity sha512-DUDzV0D4iVO5atghsjGZtzaF0HVtRLcxcnH6rAONyH0stnoLiFloGEuP5nkbIPU0B9cgWTzTUsQPuNHBzxy9Yw== 268 | dependencies: 269 | "@hapi/hoek" "6.x.x" 270 | 271 | "@hapi/wreck@15.x.x": 272 | version "15.0.1" 273 | resolved "https://registry.yarnpkg.com/@hapi/wreck/-/wreck-15.0.1.tgz#b9f881965a7e649a8fffe6de25ba41973ed28415" 274 | integrity sha512-ByXQna/W1FZk7dg8NEhL79u4QkhzszRz76VpgyGstSH8bLM01a0C8RsxmUBgi6Tjkag5jA9kaEIhF9dLpMrtBw== 275 | dependencies: 276 | "@hapi/boom" "7.x.x" 277 | "@hapi/bourne" "1.x.x" 278 | "@hapi/hoek" "6.x.x" 279 | 280 | amazon-cognito-identity-js@3.0.12: 281 | version "3.0.12" 282 | resolved "https://registry.yarnpkg.com/amazon-cognito-identity-js/-/amazon-cognito-identity-js-3.0.12.tgz#fd0086e8902ec32c0d6709ac61c851efbe1d07dc" 283 | integrity sha512-fhbuZgaQbjOUt00RY3jhsFK55/ZYlgdx5dey2VB4YT5AW01mDiZiqhPKgLC5qd0JFr3x+c5gNhzNQaQGhq1rxw== 284 | dependencies: 285 | buffer "4.9.1" 286 | crypto-js "^3.1.9-1" 287 | js-cookie "^2.1.4" 288 | 289 | aws-sdk@2.466.0: 290 | version "2.466.0" 291 | resolved "https://registry.yarnpkg.com/aws-sdk/-/aws-sdk-2.466.0.tgz#02d819c5af058e15fd1942296ed3b1def9f4b14d" 292 | integrity sha512-dWFpz774ONjP1Cb19VkLOfQSVTu5p5/uncZGovAe71NOfPGDSvrQKXOsKcuI1/k4oJyKW9z/GATF8ht8DkDWGg== 293 | dependencies: 294 | buffer "4.9.1" 295 | events "1.1.1" 296 | ieee754 "1.1.8" 297 | jmespath "0.15.0" 298 | querystring "0.2.0" 299 | sax "1.2.1" 300 | url "0.10.3" 301 | uuid "3.3.2" 302 | xml2js "0.4.19" 303 | 304 | aws-sdk@^2.7.0: 305 | version "2.498.0" 306 | resolved "https://registry.yarnpkg.com/aws-sdk/-/aws-sdk-2.498.0.tgz#42e05965166a01b45e026e4922926df4cd160fc5" 307 | integrity sha512-xyIBgPylTWGfwOUgDzXMIcB5uVdBfTAfA+cOEl/tCsq88kNm4LWuZtv/O9g5hZYFQeUViQMiRwpFUAf9v8rcCQ== 308 | dependencies: 309 | buffer "4.9.1" 310 | events "1.1.1" 311 | ieee754 "1.1.8" 312 | jmespath "0.15.0" 313 | querystring "0.2.0" 314 | sax "1.2.1" 315 | url "0.10.3" 316 | uuid "3.3.2" 317 | xml2js "0.4.19" 318 | 319 | balanced-match@^1.0.0: 320 | version "1.0.0" 321 | resolved "https://registry.yarnpkg.com/balanced-match/-/balanced-match-1.0.0.tgz#89b4d199ab2bee49de164ea02b89ce462d71b767" 322 | integrity sha1-ibTRmasr7kneFk6gK4nORi1xt2c= 323 | 324 | base64-js@^1.0.2: 325 | version "1.3.0" 326 | resolved "https://registry.yarnpkg.com/base64-js/-/base64-js-1.3.0.tgz#cab1e6118f051095e58b5281aea8c1cd22bfc0e3" 327 | integrity sha512-ccav/yGvoa80BQDljCxsmmQ3Xvx60/UpBIij5QN21W3wBi/hhIC9OoO+KLpu9IJTS9j4DRVJ3aDDF9cMSoa2lw== 328 | 329 | base64url@^3.0.1: 330 | version "3.0.1" 331 | resolved "https://registry.yarnpkg.com/base64url/-/base64url-3.0.1.tgz#6399d572e2bc3f90a9a8b22d5dbb0a32d33f788d" 332 | integrity sha512-ir1UPr3dkwexU7FdV8qBBbNDRUhMmIekYMFZfi+C/sLNnRESKPl23nB9b2pltqfOQNnGzsDdId90AEtG5tCx4A== 333 | 334 | block-stream@*: 335 | version "0.0.9" 336 | resolved "https://registry.yarnpkg.com/block-stream/-/block-stream-0.0.9.tgz#13ebfe778a03205cfe03751481ebb4b3300c126a" 337 | integrity sha1-E+v+d4oDIFz+A3UUgeu0szAMEmo= 338 | dependencies: 339 | inherits "~2.0.0" 340 | 341 | bluebird@^3.4.6: 342 | version "3.5.5" 343 | resolved "https://registry.yarnpkg.com/bluebird/-/bluebird-3.5.5.tgz#a8d0afd73251effbbd5fe384a77d73003c17a71f" 344 | integrity sha512-5am6HnnfN+urzt4yfg7IgTbotDjIT/u8AJpEt0sIU9FtXfVeezXAPKswrG+xKUCOYAINpSdgZVDU6QFh+cuH3w== 345 | 346 | brace-expansion@^1.1.7: 347 | version "1.1.11" 348 | resolved "https://registry.yarnpkg.com/brace-expansion/-/brace-expansion-1.1.11.tgz#3c7fcbf529d87226f3d2f52b966ff5271eb441dd" 349 | integrity sha512-iCuPHDFgrHX7H2vEI/5xpz07zSHB00TpugqhmYtVmMO6518mCuRMoOYFldEBl0g187ufozdaHgWKcYFb61qGiA== 350 | dependencies: 351 | balanced-match "^1.0.0" 352 | concat-map "0.0.1" 353 | 354 | buffer-equal-constant-time@1.0.1: 355 | version "1.0.1" 356 | resolved "https://registry.yarnpkg.com/buffer-equal-constant-time/-/buffer-equal-constant-time-1.0.1.tgz#f8e71132f7ffe6e01a5c9697a4c6f3e48d5cc819" 357 | integrity sha1-+OcRMvf/5uAaXJaXpMbz5I1cyBk= 358 | 359 | buffer@4.9.1: 360 | version "4.9.1" 361 | resolved "https://registry.yarnpkg.com/buffer/-/buffer-4.9.1.tgz#6d1bb601b07a4efced97094132093027c95bc298" 362 | integrity sha1-bRu2AbB6TvztlwlBMgkwJ8lbwpg= 363 | dependencies: 364 | base64-js "^1.0.2" 365 | ieee754 "^1.1.4" 366 | isarray "^1.0.0" 367 | 368 | concat-map@0.0.1: 369 | version "0.0.1" 370 | resolved "https://registry.yarnpkg.com/concat-map/-/concat-map-0.0.1.tgz#d8a96bd77fd68df7793a73036a3ba0d5405d477b" 371 | integrity sha1-2Klr13/Wjfd5OnMDajug1UBdR3s= 372 | 373 | crypto-js@^3.1.9-1: 374 | version "3.1.9-1" 375 | resolved "https://registry.yarnpkg.com/crypto-js/-/crypto-js-3.1.9-1.tgz#fda19e761fc077e01ffbfdc6e9fdfc59e8806cd8" 376 | integrity sha1-/aGedh/Ad+Af+/3G6f38WeiAbNg= 377 | 378 | dynamodb-localhost@^0.0.7: 379 | version "0.0.7" 380 | resolved "https://registry.yarnpkg.com/dynamodb-localhost/-/dynamodb-localhost-0.0.7.tgz#6642d6eb7a29a8c586cc783dd6a59ec3dc00e2ad" 381 | integrity sha512-Xyv0EqQDuOVjA8XGVOo3SuzQ5jKA8/gBKUeKRP3V586Fh9abWXLXOGjf7mPO8sWzddzGqyQx2mALj9IWSotg7A== 382 | dependencies: 383 | mkdirp "^0.5.0" 384 | progress "^1.1.8" 385 | rmdir "^1.2.0" 386 | tar "^2.0.0" 387 | 388 | ecdsa-sig-formatter@1.0.11: 389 | version "1.0.11" 390 | resolved "https://registry.yarnpkg.com/ecdsa-sig-formatter/-/ecdsa-sig-formatter-1.0.11.tgz#ae0f0fa2d85045ef14a817daa3ce9acd0489e5bf" 391 | integrity sha512-nagl3RYrbNv6kQkeJIpt6NJZy8twLB/2vtz6yN9Z4vRKHN4/QZJIEbqohALSgwKdnksuY3k5Addp5lg8sVoVcQ== 392 | dependencies: 393 | safe-buffer "^5.0.1" 394 | 395 | es6-promise@^4.2.6: 396 | version "4.2.8" 397 | resolved "https://registry.yarnpkg.com/es6-promise/-/es6-promise-4.2.8.tgz#4eb21594c972bc40553d276e510539143db53e0a" 398 | integrity sha512-HJDGx5daxeIvxdBxvG2cb9g4tEvwIk3i8+nhX0yGrYmZUzbkdg8QbDevheDB8gd0//uPj4c1EQua8Q+MViT0/w== 399 | 400 | events@1.1.1: 401 | version "1.1.1" 402 | resolved "https://registry.yarnpkg.com/events/-/events-1.1.1.tgz#9ebdb7635ad099c70dcc4c2a1f5004288e8bd924" 403 | integrity sha1-nr23Y1rQmccNzEwqH1AEKI6L2SQ= 404 | 405 | fs.realpath@^1.0.0: 406 | version "1.0.0" 407 | resolved "https://registry.yarnpkg.com/fs.realpath/-/fs.realpath-1.0.0.tgz#1504ad2523158caa40db4a2787cb01411994ea4f" 408 | integrity sha1-FQStJSMVjKpA20onh8sBQRmU6k8= 409 | 410 | fstream@^1.0.12: 411 | version "1.0.12" 412 | resolved "https://registry.yarnpkg.com/fstream/-/fstream-1.0.12.tgz#4e8ba8ee2d48be4f7d0de505455548eae5932045" 413 | integrity sha512-WvJ193OHa0GHPEL+AycEJgxvBEwyfRkN1vhjca23OaPVMCaLCXTd5qAu82AjTcgP1UJmytkOKb63Ypde7raDIg== 414 | dependencies: 415 | graceful-fs "^4.1.2" 416 | inherits "~2.0.0" 417 | mkdirp ">=0.5 0" 418 | rimraf "2" 419 | 420 | glob@^7.1.3: 421 | version "7.1.4" 422 | resolved "https://registry.yarnpkg.com/glob/-/glob-7.1.4.tgz#aa608a2f6c577ad357e1ae5a5c26d9a8d1969255" 423 | integrity sha512-hkLPepehmnKk41pUGm3sYxoFs/umurYfYJCerbXEyFIWcAzvpipAgVkBqqT9RBKMGjnq6kMuyYwha6csxbiM1A== 424 | dependencies: 425 | fs.realpath "^1.0.0" 426 | inflight "^1.0.4" 427 | inherits "2" 428 | minimatch "^3.0.4" 429 | once "^1.3.0" 430 | path-is-absolute "^1.0.0" 431 | 432 | graceful-fs@^4.1.2: 433 | version "4.2.0" 434 | resolved "https://registry.yarnpkg.com/graceful-fs/-/graceful-fs-4.2.0.tgz#8d8fdc73977cb04104721cb53666c1ca64cd328b" 435 | integrity sha512-jpSvDPV4Cq/bgtpndIWbI5hmYxhQGHPC4d4cqBPb4DLniCfhJokdXhwhaDuLBGLQdvvRum/UiX6ECVIPvDXqdg== 436 | 437 | ieee754@1.1.8: 438 | version "1.1.8" 439 | resolved "https://registry.yarnpkg.com/ieee754/-/ieee754-1.1.8.tgz#be33d40ac10ef1926701f6f08a2d86fbfd1ad3e4" 440 | integrity sha1-vjPUCsEO8ZJnAfbwii2G+/0a0+Q= 441 | 442 | ieee754@^1.1.4: 443 | version "1.1.13" 444 | resolved "https://registry.yarnpkg.com/ieee754/-/ieee754-1.1.13.tgz#ec168558e95aa181fd87d37f55c32bbcb6708b84" 445 | integrity sha512-4vf7I2LYV/HaWerSo3XmlMkp5eZ83i+/CDluXi/IGTs/O1sejBNhTtnxzmRZfvOUqj7lZjqHkeTvpgSFDlWZTg== 446 | 447 | inflight@^1.0.4: 448 | version "1.0.6" 449 | resolved "https://registry.yarnpkg.com/inflight/-/inflight-1.0.6.tgz#49bd6331d7d02d0c09bc910a1075ba8165b56df9" 450 | integrity sha1-Sb1jMdfQLQwJvJEKEHW6gWW1bfk= 451 | dependencies: 452 | once "^1.3.0" 453 | wrappy "1" 454 | 455 | inherits@2, inherits@~2.0.0: 456 | version "2.0.4" 457 | resolved "https://registry.yarnpkg.com/inherits/-/inherits-2.0.4.tgz#0fa2c64f932917c3433a0ded55363aae37416b7c" 458 | integrity sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ== 459 | 460 | is@~0.2.6: 461 | version "0.2.7" 462 | resolved "https://registry.yarnpkg.com/is/-/is-0.2.7.tgz#3b34a2c48f359972f35042849193ae7264b63562" 463 | integrity sha1-OzSixI81mXLzUEKEkZOucmS2NWI= 464 | 465 | isarray@^1.0.0: 466 | version "1.0.0" 467 | resolved "https://registry.yarnpkg.com/isarray/-/isarray-1.0.0.tgz#bb935d48582cba168c06834957a54a3e07124f11" 468 | integrity sha1-u5NdSFgsuhaMBoNJV6VKPgcSTxE= 469 | 470 | jmespath@0.15.0: 471 | version "0.15.0" 472 | resolved "https://registry.yarnpkg.com/jmespath/-/jmespath-0.15.0.tgz#a3f222a9aae9f966f5d27c796510e28091764217" 473 | integrity sha1-o/Iiqarp+Wb10nx5ZRDigJF2Qhc= 474 | 475 | js-cookie@^2.1.4: 476 | version "2.2.0" 477 | resolved "https://registry.yarnpkg.com/js-cookie/-/js-cookie-2.2.0.tgz#1b2c279a6eece380a12168b92485265b35b1effb" 478 | integrity sha1-Gywnmm7s44ChIWi5JIUmWzWx7/s= 479 | 480 | js-string-escape@^1.0.1: 481 | version "1.0.1" 482 | resolved "https://registry.yarnpkg.com/js-string-escape/-/js-string-escape-1.0.1.tgz#e2625badbc0d67c7533e9edc1068c587ae4137ef" 483 | integrity sha1-4mJbrbwNZ8dTPp7cEGjFh65BN+8= 484 | 485 | jsonpath-plus@^0.19.0: 486 | version "0.19.0" 487 | resolved "https://registry.yarnpkg.com/jsonpath-plus/-/jsonpath-plus-0.19.0.tgz#b901e57607055933dc9a8bef0cc25160ee9dd64c" 488 | integrity sha512-GSVwsrzW9LsA5lzsqe4CkuZ9wp+kxBb2GwNniaWzI2YFn5Ig42rSW8ZxVpWXaAfakXNrx5pgY5AbQq7kzX29kg== 489 | 490 | jsonschema@^1.2.4: 491 | version "1.2.4" 492 | resolved "https://registry.yarnpkg.com/jsonschema/-/jsonschema-1.2.4.tgz#a46bac5d3506a254465bc548876e267c6d0d6464" 493 | integrity sha512-lz1nOH69GbsVHeVgEdvyavc/33oymY1AZwtePMiMj4HZPMbP5OIKK3zT9INMWjwua/V4Z4yq7wSlBbSG+g4AEw== 494 | 495 | jsonwebtoken@^8.5.1: 496 | version "8.5.1" 497 | resolved "https://registry.yarnpkg.com/jsonwebtoken/-/jsonwebtoken-8.5.1.tgz#00e71e0b8df54c2121a1f26137df2280673bcc0d" 498 | integrity sha512-XjwVfRS6jTMsqYs0EsuJ4LGxXV14zQybNd4L2r0UvbVnSF9Af8x7p5MzbJ90Ioz/9TI41/hTCvznF/loiSzn8w== 499 | dependencies: 500 | jws "^3.2.2" 501 | lodash.includes "^4.3.0" 502 | lodash.isboolean "^3.0.3" 503 | lodash.isinteger "^4.0.4" 504 | lodash.isnumber "^3.0.3" 505 | lodash.isplainobject "^4.0.6" 506 | lodash.isstring "^4.0.1" 507 | lodash.once "^4.0.0" 508 | ms "^2.1.1" 509 | semver "^5.6.0" 510 | 511 | jwa@^1.4.1: 512 | version "1.4.1" 513 | resolved "https://registry.yarnpkg.com/jwa/-/jwa-1.4.1.tgz#743c32985cb9e98655530d53641b66c8645b039a" 514 | integrity sha512-qiLX/xhEEFKUAJ6FiBMbes3w9ATzyk5W7Hvzpa/SLYdxNtng+gcurvrI7TbACjIXlsJyr05/S1oUhZrc63evQA== 515 | dependencies: 516 | buffer-equal-constant-time "1.0.1" 517 | ecdsa-sig-formatter "1.0.11" 518 | safe-buffer "^5.0.1" 519 | 520 | jws@^3.2.2: 521 | version "3.2.2" 522 | resolved "https://registry.yarnpkg.com/jws/-/jws-3.2.2.tgz#001099f3639468c9414000e99995fa52fb478304" 523 | integrity sha512-YHlZCB6lMTllWDtSPHz/ZXTsi8S00usEV6v1tjq8tOUZzw7DpSDWVXjXDre6ed1w/pd495ODpHZYSdkRTsa0HA== 524 | dependencies: 525 | jwa "^1.4.1" 526 | safe-buffer "^5.0.1" 527 | 528 | lodash.includes@^4.3.0: 529 | version "4.3.0" 530 | resolved "https://registry.yarnpkg.com/lodash.includes/-/lodash.includes-4.3.0.tgz#60bb98a87cb923c68ca1e51325483314849f553f" 531 | integrity sha1-YLuYqHy5I8aMoeUTJUgzFISfVT8= 532 | 533 | lodash.isboolean@^3.0.3: 534 | version "3.0.3" 535 | resolved "https://registry.yarnpkg.com/lodash.isboolean/-/lodash.isboolean-3.0.3.tgz#6c2e171db2a257cd96802fd43b01b20d5f5870f6" 536 | integrity sha1-bC4XHbKiV82WgC/UOwGyDV9YcPY= 537 | 538 | lodash.isinteger@^4.0.4: 539 | version "4.0.4" 540 | resolved "https://registry.yarnpkg.com/lodash.isinteger/-/lodash.isinteger-4.0.4.tgz#619c0af3d03f8b04c31f5882840b77b11cd68343" 541 | integrity sha1-YZwK89A/iwTDH1iChAt3sRzWg0M= 542 | 543 | lodash.isnumber@^3.0.3: 544 | version "3.0.3" 545 | resolved "https://registry.yarnpkg.com/lodash.isnumber/-/lodash.isnumber-3.0.3.tgz#3ce76810c5928d03352301ac287317f11c0b1ffc" 546 | integrity sha1-POdoEMWSjQM1IwGsKHMX8RwLH/w= 547 | 548 | lodash.isplainobject@^4.0.6: 549 | version "4.0.6" 550 | resolved "https://registry.yarnpkg.com/lodash.isplainobject/-/lodash.isplainobject-4.0.6.tgz#7c526a52d89b45c45cc690b88163be0497f550cb" 551 | integrity sha1-fFJqUtibRcRcxpC4gWO+BJf1UMs= 552 | 553 | lodash.isstring@^4.0.1: 554 | version "4.0.1" 555 | resolved "https://registry.yarnpkg.com/lodash.isstring/-/lodash.isstring-4.0.1.tgz#d527dfb5456eca7cc9bb95d5daeaf88ba54a5451" 556 | integrity sha1-1SfftUVuynzJu5XV2ur4i6VKVFE= 557 | 558 | lodash.once@^4.0.0: 559 | version "4.1.1" 560 | resolved "https://registry.yarnpkg.com/lodash.once/-/lodash.once-4.1.1.tgz#0dd3971213c7c56df880977d504c88fb471a97ac" 561 | integrity sha1-DdOXEhPHxW34gJd9UEyI+0cal6w= 562 | 563 | lodash@^4.17.0, lodash@^4.17.11: 564 | version "4.17.15" 565 | resolved "https://registry.yarnpkg.com/lodash/-/lodash-4.17.15.tgz#b447f6670a0455bbfeedd11392eff330ea097548" 566 | integrity sha512-8xOcRHvCjnocdS5cpwXQXVzmmh5e5+saE2QGoeQmbKmRS6J3VQppPOIt0MnmE+4xlZoumy0GPG0D0MVIQbNA1A== 567 | 568 | long@^4.0.0: 569 | version "4.0.0" 570 | resolved "https://registry.yarnpkg.com/long/-/long-4.0.0.tgz#9a7b71cfb7d361a194ea555241c92f7468d5bf28" 571 | integrity sha512-XsP+KhQif4bjX1kbuSiySJFNAehNxgLb6hPRGJ9QsUr8ajHkuXGdrHmFUTUUXhDwVX2R5bY4JNZEwbUiMhV+MA== 572 | 573 | mime-db@1.x.x: 574 | version "1.40.0" 575 | resolved "https://registry.yarnpkg.com/mime-db/-/mime-db-1.40.0.tgz#a65057e998db090f732a68f6c276d387d4126c32" 576 | integrity sha512-jYdeOMPy9vnxEqFRRo6ZvTZ8d9oPb+k18PKoYNYUe2stVEBPPwsln/qWzdbmaIvnhZ9v2P+CuecK+fpUfsV2mA== 577 | 578 | minimatch@^3.0.4: 579 | version "3.0.4" 580 | resolved "https://registry.yarnpkg.com/minimatch/-/minimatch-3.0.4.tgz#5166e286457f03306064be5497e8dbb0c3d32083" 581 | integrity sha512-yJHVQEhyqPLUTgt9B83PXu6W3rx4MvvHvSUvToogpwoGDOUQ+yDrR0HRot+yOCdCO7u4hX3pWft6kWBBcqh0UA== 582 | dependencies: 583 | brace-expansion "^1.1.7" 584 | 585 | minimist@0.0.8: 586 | version "0.0.8" 587 | resolved "https://registry.yarnpkg.com/minimist/-/minimist-0.0.8.tgz#857fcabfc3397d2625b8228262e86aa7a011b05d" 588 | integrity sha1-hX/Kv8M5fSYluCKCYuhqp6ARsF0= 589 | 590 | "mkdirp@>=0.5 0", mkdirp@^0.5.0: 591 | version "0.5.1" 592 | resolved "https://registry.yarnpkg.com/mkdirp/-/mkdirp-0.5.1.tgz#30057438eac6cf7f8c4767f38648d6697d75c903" 593 | integrity sha1-MAV0OOrGz3+MR2fzhkjWaX11yQM= 594 | dependencies: 595 | minimist "0.0.8" 596 | 597 | ms@^2.1.1: 598 | version "2.1.2" 599 | resolved "https://registry.yarnpkg.com/ms/-/ms-2.1.2.tgz#d09d1f357b443f493382a8eb3ccd183872ae6009" 600 | integrity sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w== 601 | 602 | node-fetch@2.6.0: 603 | version "2.6.0" 604 | resolved "https://registry.yarnpkg.com/node-fetch/-/node-fetch-2.6.0.tgz#e633456386d4aa55863f676a7ab0daa8fdecb0fd" 605 | integrity sha512-8dG4H5ujfvFiqDmVu9fQ5bOHUC15JMjMY/Zumv26oOvvVJjM67KF8koCWIabKQ1GJIa9r2mMZscBq/TbdOcmNA== 606 | 607 | node-forge@^0.8.1: 608 | version "0.8.5" 609 | resolved "https://registry.yarnpkg.com/node-forge/-/node-forge-0.8.5.tgz#57906f07614dc72762c84cef442f427c0e1b86ee" 610 | integrity sha512-vFMQIWt+J/7FLNyKouZ9TazT74PRV3wgv9UT4cRjC8BffxFbKXkgIWR42URCPSnHm/QDz6BOlb2Q0U4+VQT67Q== 611 | 612 | node-jose@1.1.3: 613 | version "1.1.3" 614 | resolved "https://registry.yarnpkg.com/node-jose/-/node-jose-1.1.3.tgz#26e6bc563101a356c06fb254c7ef0078e8b49670" 615 | integrity sha512-kupfi4uGWhRjnOmtie2T64cLge5a1TZyalEa8uWWWBgtKBcu41A4IGKpI9twZAxRnmviamEUQRK7LSyfFb2w8A== 616 | dependencies: 617 | base64url "^3.0.1" 618 | es6-promise "^4.2.6" 619 | lodash "^4.17.11" 620 | long "^4.0.0" 621 | node-forge "^0.8.1" 622 | uuid "^3.3.2" 623 | 624 | node.extend@1.0.8: 625 | version "1.0.8" 626 | resolved "https://registry.yarnpkg.com/node.extend/-/node.extend-1.0.8.tgz#bab04379f7383f4587990c9df07b6a7f65db772b" 627 | integrity sha1-urBDefc4P0WHmQyd8Htqf2Xbdys= 628 | dependencies: 629 | is "~0.2.6" 630 | object-keys "~0.4.0" 631 | 632 | node.flow@1.2.3: 633 | version "1.2.3" 634 | resolved "https://registry.yarnpkg.com/node.flow/-/node.flow-1.2.3.tgz#e1c44a82aeca8d78b458a77fb3dc642f2eba2649" 635 | integrity sha1-4cRKgq7KjXi0WKd/s9xkLy66Jkk= 636 | dependencies: 637 | node.extend "1.0.8" 638 | 639 | object-keys@~0.4.0: 640 | version "0.4.0" 641 | resolved "https://registry.yarnpkg.com/object-keys/-/object-keys-0.4.0.tgz#28a6aae7428dd2c3a92f3d95f21335dd204e0336" 642 | integrity sha1-KKaq50KN0sOpLz2V8hM13SBOAzY= 643 | 644 | once@^1.3.0: 645 | version "1.4.0" 646 | resolved "https://registry.yarnpkg.com/once/-/once-1.4.0.tgz#583b1aa775961d4b113ac17d9c50baef9dd76bd1" 647 | integrity sha1-WDsap3WWHUsROsF9nFC6753Xa9E= 648 | dependencies: 649 | wrappy "1" 650 | 651 | path-is-absolute@^1.0.0: 652 | version "1.0.1" 653 | resolved "https://registry.yarnpkg.com/path-is-absolute/-/path-is-absolute-1.0.1.tgz#174b9268735534ffbc7ace6bf53a5a9e1b5c5f5f" 654 | integrity sha1-F0uSaHNVNP+8es5r9TpanhtcX18= 655 | 656 | progress@^1.1.8: 657 | version "1.1.8" 658 | resolved "https://registry.yarnpkg.com/progress/-/progress-1.1.8.tgz#e260c78f6161cdd9b0e56cc3e0a85de17c7a57be" 659 | integrity sha1-4mDHj2Fhzdmw5WzD4Khd4Xx6V74= 660 | 661 | punycode@1.3.2: 662 | version "1.3.2" 663 | resolved "https://registry.yarnpkg.com/punycode/-/punycode-1.3.2.tgz#9653a036fb7c1ee42342f2325cceefea3926c48d" 664 | integrity sha1-llOgNvt8HuQjQvIyXM7v6jkmxI0= 665 | 666 | querystring@0.2.0: 667 | version "0.2.0" 668 | resolved "https://registry.yarnpkg.com/querystring/-/querystring-0.2.0.tgz#b209849203bb25df820da756e747005878521620" 669 | integrity sha1-sgmEkgO7Jd+CDadW50cAWHhSFiA= 670 | 671 | rimraf@2: 672 | version "2.6.3" 673 | resolved "https://registry.yarnpkg.com/rimraf/-/rimraf-2.6.3.tgz#b2d104fe0d8fb27cf9e0a1cda8262dd3833c6cab" 674 | integrity sha512-mwqeW5XsA2qAejG46gYdENaxXjx9onRNCfn7L0duuP4hCuTIi/QO7PDK07KJfp1d+izWPrzEJDcSqBa0OZQriA== 675 | dependencies: 676 | glob "^7.1.3" 677 | 678 | rmdir@^1.2.0: 679 | version "1.2.0" 680 | resolved "https://registry.yarnpkg.com/rmdir/-/rmdir-1.2.0.tgz#4fe0357cb06168c258e73e968093dc4e8a0f3253" 681 | integrity sha1-T+A1fLBhaMJY5z6WgJPcTooPMlM= 682 | dependencies: 683 | node.flow "1.2.3" 684 | 685 | safe-buffer@^5.0.1: 686 | version "5.2.0" 687 | resolved "https://registry.yarnpkg.com/safe-buffer/-/safe-buffer-5.2.0.tgz#b74daec49b1148f88c64b68d49b1e815c1f2f519" 688 | integrity sha512-fZEwUGbVl7kouZs1jCdMLdt95hdIv0ZeHg6L7qPeciMZhZ+/gdesW4wgTARkrFWEpspjEATAzUGPG8N2jJiwbg== 689 | 690 | sax@1.2.1: 691 | version "1.2.1" 692 | resolved "https://registry.yarnpkg.com/sax/-/sax-1.2.1.tgz#7b8e656190b228e81a66aea748480d828cd2d37a" 693 | integrity sha1-e45lYZCyKOgaZq6nSEgNgozS03o= 694 | 695 | sax@>=0.6.0: 696 | version "1.2.4" 697 | resolved "https://registry.yarnpkg.com/sax/-/sax-1.2.4.tgz#2816234e2378bddc4e5354fab5caa895df7100d9" 698 | integrity sha512-NqVDv9TpANUjFm0N8uM5GxL36UgKi9/atZw+x7YFnQ8ckwFGKrl4xX4yWtrey3UJm5nP1kUbnYgLopqWNSRhWw== 699 | 700 | semver@^5.6.0: 701 | version "5.7.0" 702 | resolved "https://registry.yarnpkg.com/semver/-/semver-5.7.0.tgz#790a7cf6fea5459bac96110b29b60412dc8ff96b" 703 | integrity sha512-Ya52jSX2u7QKghxeoFGpLwCtGlt7j0oY9DYb5apt9nPlJ42ID+ulTXESnt/qAQcoSERyZ5sl3LDIOw0nAn/5DA== 704 | 705 | serverless-dynamodb-local@0.2.38: 706 | version "0.2.38" 707 | resolved "https://registry.yarnpkg.com/serverless-dynamodb-local/-/serverless-dynamodb-local-0.2.38.tgz#19760c0610ef7310fa7d8968e3410cb10be8d063" 708 | integrity sha512-Ut+QfZSOk4xRWMmZIkN6HuqaTvM9cs1NRL9I+RVEYeCAMIh1hJjfVLRXmzJ6vVIb/7sVZenxLVHLFL9PgUP4eg== 709 | dependencies: 710 | aws-sdk "^2.7.0" 711 | bluebird "^3.4.6" 712 | dynamodb-localhost "^0.0.7" 713 | lodash "^4.17.0" 714 | 715 | serverless-offline@5.0.0: 716 | version "5.0.0" 717 | resolved "https://registry.yarnpkg.com/serverless-offline/-/serverless-offline-5.0.0.tgz#4b310b19a0b7d364bf958fb586123614a211fe24" 718 | integrity sha512-P61pJ2zZN+h+mjv6ZdscTGZEFZx8AWA1rczHDNsljVrccW/rJaedig+zJwBVy9YJOX0+7jtCLa6b09gdT6S95g== 719 | dependencies: 720 | "@hapi/boom" "^7.4.2" 721 | "@hapi/cryptiles" "^4.2.0" 722 | "@hapi/h2o2" "^8.3.0" 723 | "@hapi/hapi" "^18.3.1" 724 | js-string-escape "^1.0.1" 725 | jsonpath-plus "^0.19.0" 726 | jsonschema "^1.2.4" 727 | jsonwebtoken "^8.5.1" 728 | trim-newlines "^3.0.0" 729 | velocityjs "^1.1.3" 730 | 731 | tar@^2.0.0: 732 | version "2.2.2" 733 | resolved "https://registry.yarnpkg.com/tar/-/tar-2.2.2.tgz#0ca8848562c7299b8b446ff6a4d60cdbb23edc40" 734 | integrity sha512-FCEhQ/4rE1zYv9rYXJw/msRqsnmlje5jHP6huWeBZ704jUTy02c5AZyWujpMR1ax6mVw9NyJMfuK2CMDWVIfgA== 735 | dependencies: 736 | block-stream "*" 737 | fstream "^1.0.12" 738 | inherits "2" 739 | 740 | trim-newlines@^3.0.0: 741 | version "3.0.0" 742 | resolved "https://registry.yarnpkg.com/trim-newlines/-/trim-newlines-3.0.0.tgz#79726304a6a898aa8373427298d54c2ee8b1cb30" 743 | integrity sha512-C4+gOpvmxaSMKuEf9Qc134F1ZuOHVXKRbtEflf4NTtuuJDEIJ9p5PXsalL8SkeRw+qit1Mo+yuvMPAKwWg/1hA== 744 | 745 | url@0.10.3: 746 | version "0.10.3" 747 | resolved "https://registry.yarnpkg.com/url/-/url-0.10.3.tgz#021e4d9c7705f21bbf37d03ceb58767402774c64" 748 | integrity sha1-Ah5NnHcF8hu/N9A861h2dAJ3TGQ= 749 | dependencies: 750 | punycode "1.3.2" 751 | querystring "0.2.0" 752 | 753 | uuid@3.3.2, uuid@^3.3.2: 754 | version "3.3.2" 755 | resolved "https://registry.yarnpkg.com/uuid/-/uuid-3.3.2.tgz#1b4af4955eb3077c501c23872fc6513811587131" 756 | integrity sha512-yXJmeNaw3DnnKAOKJE51sL/ZaYfWJRl1pK9dr19YFCu0ObS231AB1/LbqTKRAQ5kw8A90rA6fr4riOUpTZvQZA== 757 | 758 | velocityjs@^1.1.3: 759 | version "1.1.3" 760 | resolved "https://registry.yarnpkg.com/velocityjs/-/velocityjs-1.1.3.tgz#28c69ee90ed288749d95ac001c09bf4ffecc1c8a" 761 | integrity sha512-7cC2jgKt6AuSaAaJvvTkFFLuYJzKWTYHldPcRVCqR8e6bbx8iOweSTMcTjOmY/RedgINrlWG5m/SZxHJGna8CQ== 762 | 763 | wrappy@1: 764 | version "1.0.2" 765 | resolved "https://registry.yarnpkg.com/wrappy/-/wrappy-1.0.2.tgz#b5243d8f3ec1aa35f1364605bc0d1036e30ab69f" 766 | integrity sha1-tSQ9jz7BqjXxNkYFvA0QNuMKtp8= 767 | 768 | xml2js@0.4.19: 769 | version "0.4.19" 770 | resolved "https://registry.yarnpkg.com/xml2js/-/xml2js-0.4.19.tgz#686c20f213209e94abf0d1bcf1efaa291c7827a7" 771 | integrity sha512-esZnJZJOiJR9wWKMyuvSE1y6Dq5LCuJanqhxslH2bxM6duahNZ+HMpCLhBQGZkbX6xRf8x1Y2eJlgt2q3qo49Q== 772 | dependencies: 773 | sax ">=0.6.0" 774 | xmlbuilder "~9.0.1" 775 | 776 | xmlbuilder@~9.0.1: 777 | version "9.0.7" 778 | resolved "https://registry.yarnpkg.com/xmlbuilder/-/xmlbuilder-9.0.7.tgz#132ee63d2ec5565c557e20f4c22df9aca686b10d" 779 | integrity sha1-Ey7mPS7FVlxVfiD0wi35rKaGsQ0= 780 | --------------------------------------------------------------------------------