diff --git a/.eslintrc.json b/.eslintrc.json index 22c23e5..48cf0f4 100644 --- a/.eslintrc.json +++ b/.eslintrc.json @@ -1,32 +1,34 @@ { - "env": { - "browser": false, - "node": true, - "es6": false - }, - "extends": "eslint:recommended", - "parserOptions": { - "ecmaVersion": 2017, - "sourceType": "module" - }, - "rules": { - "indent": [ - "error", - "tab" - ], - "linebreak-style": [ - "error", - "unix" - ], - "quotes": [ - "error", - "double" - ], - "semi": [ - "error", - "always" - ], - "no-console":"off", - "no-unused-vars":"error" - } + "parser": "@typescript-eslint/parser", + "extends": [ + "eslint:recommended", + "plugin:@typescript-eslint/eslint-recommended", + "plugin:@typescript-eslint/recommended" // uses the recommended rules from the @typescript-eslint/eslint-plugin + ], + "parserOptions": { + "ecmaVersion": 2018, + "sourceType": "module" + }, + "ignorePatterns": ["dist", "src/streamingDelegate.ts"], + "rules": { + "quotes": ["warn", "double"], + "indent": ["warn", 2, { "SwitchCase": 1 }], + "linebreak-style": ["warn", "unix"], + "semi": ["warn", "always"], + "comma-dangle": ["off", "always-multiline"], + "dot-notation": "warn", + "eqeqeq": "warn", + "curly": ["warn", "all"], + "brace-style": ["warn"], + "prefer-arrow-callback": ["warn"], + "max-len": ["warn", 140], + "no-console": ["warn"], // use the provided Homebridge log method instead + "lines-between-class-members": [ + "warn", + "always", + { "exceptAfterSingleLine": true } + ], + "@typescript-eslint/explicit-function-return-type": "off", + "@typescript-eslint/no-non-null-assertion": "off" + } } diff --git a/.gitignore b/.gitignore index 01b9f03..b8dd556 100644 --- a/.gitignore +++ b/.gitignore @@ -80,3 +80,5 @@ typings/ # End of https://www.gitignore.io/api/node persist + +dist \ No newline at end of file diff --git a/.jshintrc b/.jshintrc deleted file mode 100644 index af28da2..0000000 --- a/.jshintrc +++ /dev/null @@ -1,4 +0,0 @@ -{ - "esversion": 6, - "node": true - } diff --git a/.npmignore b/.npmignore index 71cba64..7ce7abe 100644 --- a/.npmignore +++ b/.npmignore @@ -39,3 +39,7 @@ persist/ src/ testing-config/ *.code-workspace +.eslintrc +.jshintrc +.travis.yml +.eslintignore diff --git a/.travis.yml b/.travis.yml index 8ac3be6..936efa9 100644 --- a/.travis.yml +++ b/.travis.yml @@ -1,22 +1,26 @@ language: node_js + node_js: - - 6.14.4 - - 8.11.1 - - 8.12.0 - - 10.13.0 - - 11.1.0 -before_install: -- curl -sS https://dl.yarnpkg.com/debian/pubkey.gpg | sudo apt-key add - -- echo "deb https://dl.yarnpkg.com/debian/ stable main" | sudo tee /etc/apt/sources.list.d/yarn.list -- sudo apt-get update && sudo apt-get install yarn -- yarn global add jshint tslint typescript homebridge eslint -- homebridge --version + - node + - 10 + - 11 + +env: + - workerCount=3 + +matrix: + fast_finish: true + +install: + - npm uninstall typescript --no-save + - npm install + +cache: + directories: + - node_modules + +git: + depth: 1 + script: -- tslint -c ./tslint.json --project . -- tsc -- eslint -c .eslintrc.json *.js -- jshint -c .jshintrc *.js -- npm --verbose test -- node --version | grep -v v6.*.* && npm --dry-run publish || echo Skipping publish dry-run for node 6.x -- DEBUG=* timeout -k 20s -s SIGINT 15s homebridge -Q -P ./ -U ./testing-config ; test $? == 124 -- timeout -k 20s -s SIGINT 15s node standalone.js ; test $? == 124 + - npm run prepublishOnly diff --git a/README.md b/README.md index 60534c2..74d40b1 100644 --- a/README.md +++ b/README.md @@ -19,13 +19,12 @@ If you have a newer version, you can help me out with the support. ## Installation -1. Install `ffmpeg` on your computer with *libx264* or (*h264_omx* for Raspberry Pi) +1. Install `ffmpeg` on your computer with _libx264_ or (_h264_omx_ for Raspberry Pi) 1. Make sure your homebridge setup is current. 1. Follow the official [homebridge installation instructions](https://github.com/nfarina/homebridge#installation) if you haven't done so yet 1. Install this plugin using: `npm install -g homebridge-bloomsky` 1. Edit `config.json` and add the platform. 1. Run/Restart Homebridge -1. _Optionally_ `npm install -g sharp` on modern platforms for improved performance when generating snapshot images ### Configuration Example @@ -36,25 +35,22 @@ Add this configuration information to your homebridge `config.json` in the { "platform": "Bloomsky", "apiKey": "your-api-key-here==", - "apiUrl": "https://api.bloomsky.com/api/skydata/", - "vcodec": "libx264", - "debug": false + "apiUrl": "https://api.bloomsky.com/api/skydata/" } ``` -Property Name | Value | Required -------------- | ----- | -------- -`platform` | Must be `Bloomsky` | yes -`apiKey` | Your personal [Bloomsky API](#bloomsky-api) authorization key | yes -`apiUrl` | Use default value for official public Bloomsky API: `https://api.bloomsky.com/api/skydata/` | no -`vcodec` | `libx264` by default, use `h264_omx` for Raspberry Pi | no -`debug` | If set to `true`, will log more information during runtime and try to update camera preview more often, defaults to `false` | no +| Property Name | Value | Required | +| ------------- | ------------------------------------------------------------------------------------------- | -------- | +| `platform` | Must be `Bloomsky` | yes | +| `apiKey` | Your personal [Bloomsky API](#bloomsky-api) authorization key | yes | +| `apiUrl` | Use default value for official public Bloomsky API: `https://api.bloomsky.com/api/skydata/` | no | ## Bloomsky API The BloomSky API provides the most recent data from your own devices! Follow these steps to obtain your own personal Bloomsky API key: + 1. Sign in to your Bloomsky account at: https://dashboard.bloomsky.com 1. In the left hand menu, select [Developers](https://dashboard.bloomsky.com/user#api) 1. The pop-up will show your personal API key @@ -62,6 +58,7 @@ Follow these steps to obtain your own personal Bloomsky API key: ## Donations Donations are very welcome and accepted at the following addresses: + - BTC: `3QTxu56V2gNdq1VznL7ftw3B4megXq5bix` - LTC: `MFDLN62hMNYDLMAWx4W6Z45nhDDLDjDUV7` @@ -70,13 +67,13 @@ Donations are very welcome and accepted at the following addresses: > Copyright 2018 Michael Henke > > Licensed under the Apache License, Version 2.0 (the "License"); -you may not use this file except in compliance with the License. -You may obtain a copy of the License at +> you may not use this file except in compliance with the License. +> You may obtain a copy of the License at > -> http://www.apache.org/licenses/LICENSE-2.0 +> http://www.apache.org/licenses/LICENSE-2.0 > > Unless required by applicable law or agreed to in writing, software -distributed under the License is distributed on an "AS IS" BASIS, -WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -See the License for the specific language governing permissions and -limitations under the License. +> distributed under the License is distributed on an "AS IS" BASIS, +> WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +> See the License for the specific language governing permissions and +> limitations under the License. diff --git a/config.schema.json b/config.schema.json new file mode 100644 index 0000000..21bd99a --- /dev/null +++ b/config.schema.json @@ -0,0 +1,16 @@ +{ + "pluginAlias": "ExampleHomebridgePlugin", + "pluginType": "platform", + "singular": true, + "schema": { + "type": "object", + "properties": { + "name": { + "title": "Name", + "type": "string", + "required": true, + "default": "Example Dynamic Platform" + } + } + } +} \ No newline at end of file diff --git a/index.js b/index.js deleted file mode 100644 index 90ab7e5..0000000 --- a/index.js +++ /dev/null @@ -1,20 +0,0 @@ -"use strict"; - -var Bloomsky = require("./lib/Bloomsky").Bloomsky; - -module.exports = function(homebridge) { - console.log("homebridge API version: " + homebridge.version); - - // Accessory must be created from PlatformAccessory Constructor - Bloomsky.Accessory = homebridge.platformAccessory; - - // Service and Characteristic are from hap-nodejs - Bloomsky.Service = homebridge.hap.Service; - Bloomsky.Characteristic = homebridge.hap.Characteristic; - Bloomsky.Hap = homebridge.hap; - Bloomsky.UUIDGen = homebridge.hap.uuid; - - // For platform plugin to be considered as dynamic platform plugin, - // registerPlatform(pluginName, platformName, constructor, dynamic), dynamic must be true - homebridge.registerPlatform("homebridge-bloomsky", "Bloomsky", Bloomsky, true); -}; diff --git a/lib/AddressResponse.d.ts b/lib/AddressResponse.d.ts deleted file mode 100644 index 26355f2..0000000 --- a/lib/AddressResponse.d.ts +++ /dev/null @@ -1,5 +0,0 @@ -declare class AddressResponse { - address: string; - type: string; -} -export { AddressResponse }; diff --git a/lib/AddressResponse.js b/lib/AddressResponse.js deleted file mode 100644 index c8ad2e5..0000000 --- a/lib/AddressResponse.js +++ /dev/null @@ -1,2 +0,0 @@ -"use strict"; -Object.defineProperty(exports, "__esModule", { value: true }); diff --git a/lib/Bloomsky.d.ts b/lib/Bloomsky.d.ts deleted file mode 100644 index 45e5cd1..0000000 --- a/lib/Bloomsky.d.ts +++ /dev/null @@ -1,33 +0,0 @@ -import API from "./homebridge"; -import { FFMPEG } from "./Ffmpeg"; -import { IStation } from "./Station"; -import { PlatformAccessory } from "./PlatformAccessory"; -export { Bloomsky }; -export default class Bloomsky { - static Accessory: PlatformAccessory; - static Service: HAPNodeJS.Service; - static Characteristic: HAPNodeJS.Characteristic; - static Hap: HAPNodeJS.HAPNodeJS; - static UUIDGen: HAPNodeJS.uuid; - timeout: NodeJS.Timeout | undefined; - accessories: PlatformAccessory[]; - log: (text: string) => void; - private apiKey; - private apiUrl; - private vcodec; - private api; - private latestData; - private debug; - constructor(log: (text: string) => void, config: any, api: API); - configureAccessory(accessory: PlatformAccessory): void; - addAccessory(station: IStation): void; - updateAccessory(station: IStation): void; - removeAccessory(): void; - temporaryFilenameForStationUuid(uuid: string): string; - getFfmpegForStationWithUuid(uuid: string): FFMPEG; - private updateData; - private stationNeedsToBeRegistered; - private updateExistingAccessories; - private registerNewAccessories; - private updateAccessoriesReachability; -} diff --git a/lib/Bloomsky.js b/lib/Bloomsky.js deleted file mode 100644 index 0ec8592..0000000 --- a/lib/Bloomsky.js +++ /dev/null @@ -1,629 +0,0 @@ -"use strict"; -var __awaiter = - (this && this.__awaiter) || - function (thisArg, _arguments, P, generator) { - return new (P || (P = Promise))(function (resolve, reject) { - function fulfilled(value) { - try { - step(generator.next(value)); - } catch (e) { - reject(e); - } - } - function rejected(value) { - try { - step(generator["throw"](value)); - } catch (e) { - reject(e); - } - } - function step(result) { - result.done - ? resolve(result.value) - : new P(function (resolve) { - resolve(result.value); - }).then(fulfilled, rejected); - } - step((generator = generator.apply(thisArg, _arguments || [])).next()); - }); - }; -var __generator = - (this && this.__generator) || - function (thisArg, body) { - var _ = { - label: 0, - sent: function () { - if (t[0] & 1) throw t[1]; - return t[1]; - }, - trys: [], - ops: [], - }, - f, - y, - t, - g; - return ( - (g = { next: verb(0), throw: verb(1), return: verb(2) }), - typeof Symbol === "function" && - (g[Symbol.iterator] = function () { - return this; - }), - g - ); - function verb(n) { - return function (v) { - return step([n, v]); - }; - } - function step(op) { - if (f) throw new TypeError("Generator is already executing."); - while (_) - try { - if ( - ((f = 1), - y && - (t = - op[0] & 2 - ? y["return"] - : op[0] - ? y["throw"] || ((t = y["return"]) && t.call(y), 0) - : y.next) && - !(t = t.call(y, op[1])).done) - ) - return t; - if (((y = 0), t)) op = [op[0] & 2, t.value]; - switch (op[0]) { - case 0: - case 1: - t = op; - break; - case 4: - _.label++; - return { value: op[1], done: false }; - case 5: - _.label++; - y = op[1]; - op = [0]; - continue; - case 7: - op = _.ops.pop(); - _.trys.pop(); - continue; - default: - if ( - !((t = _.trys), (t = t.length > 0 && t[t.length - 1])) && - (op[0] === 6 || op[0] === 2) - ) { - _ = 0; - continue; - } - if (op[0] === 3 && (!t || (op[1] > t[0] && op[1] < t[3]))) { - _.label = op[1]; - break; - } - if (op[0] === 6 && _.label < t[1]) { - _.label = t[1]; - t = op; - break; - } - if (t && _.label < t[2]) { - _.label = t[2]; - _.ops.push(op); - break; - } - if (t[2]) _.ops.pop(); - _.trys.pop(); - continue; - } - op = body.call(thisArg, _); - } catch (e) { - op = [6, e]; - y = 0; - } finally { - f = t = 0; - } - if (op[0] & 5) throw op[1]; - return { value: op[0] ? op[1] : void 0, done: true }; - } - }; -Object.defineProperty(exports, "__esModule", { value: true }); -var Client = require("typed-rest-client"); -var fs = require("fs"); -var http = require("http"); -var Ffmpeg_1 = require("./Ffmpeg"); -var Bloomsky = /** @class */ (function () { - // Platform constructor - // config may be null - // api may be null if launched from old homebridge version - function Bloomsky(log, config, api) { - if (Bloomsky.Accessory === undefined) { - throw Error("Accessory undefined"); - } - if (Bloomsky.Service === undefined) { - throw Error("Service undefined"); - } - if (Bloomsky.Characteristic === undefined) { - throw Error("Characteristic undefined"); - } - if (Bloomsky.Hap === undefined) { - throw Error("Hap undefined"); - } - if (Bloomsky.UUIDGen === undefined) { - throw Error("UUIDGen undefined"); - } - this.log = log; - this.accessories = []; - this.apiKey = config.apiKey; - this.apiUrl = config.apiUrl || "https://api.bloomsky.com/api/skydata/"; - this.vcodec = config.vcodec || "libx264"; - this.latestData = []; - this.debug = config.debug; - this.log("Bloomsky Init"); - var platform = this; - if (api) { - // Save the API object as plugin needs to register new accessory via this object - platform.api = api; - // Listen to event "didFinishLaunching", this means homebridge already finished loading cached accessories. - // Platform Plugin should only register new accessory that doesn't exist in homebridge after this event. - // Or start discover new accessories. - platform.api.on( - "didFinishLaunching", - function () { - platform.log("didFinishLaunching"); - platform.updateData().catch(function (clientError) { - platform.log(clientError); - }); - }.bind(this) - ); - platform.api.on("publishCameraAccessories", function () { - platform.log("publishCameraAccessories"); - }); - } else { - platform.updateData().catch(function (clientError) { - platform.log(clientError); - }); - } - } - // Function invoked when homebridge tries to restore cached accessory. - // Developer can configure accessory here (like setup event handler). - // Update current value. - Bloomsky.prototype.configureAccessory = function (accessory) { - if (this.debug) { - this.log("configuring accessory... " + accessory.displayName); - } - var platform = this; - var ffmpeg = this.getFfmpegForStationWithUuid(accessory.UUID); - try { - accessory.configureCameraSource(ffmpeg); - } catch (_a) { - accessory.cameraSource = ffmpeg; - } - for (var index in ffmpeg.services) { - if (ffmpeg.hasOwnProperty(index)) { - var service = ffmpeg.services[index]; - try { - accessory.removeService(service); - } catch (_b) { - if (this.debug) { - this.log("unable to remove existing camera service"); - } - } finally { - accessory.addService(service); - if (this.debug) { - this.log("added camera service: " + service.displayName); - } - } - } - } - // Do not add any existing services... but this is a good place to add services to earlier registered accessories - this.accessories.push(accessory); - // Set the accessory to reachable if plugin can currently process the accessory, - // otherwise set to false and update the reachability later by invoking - // accessory.updateReachability() - if (this.latestData != null && this.latestData.length > 0) { - if (this.debug) { - this.log("Configure Accessory " + accessory.displayName); - } - var stations = platform.latestData.filter(function (station) { - return accessory.UUID === Bloomsky.UUIDGen.generate(station.DeviceID); - }); - accessory.reachable = stations.length === 1 && stations[0] !== undefined; - if (accessory.reachable) { - this.updateAccessory(stations[0]); - } - } else { - if (this.debug) { - this.log("Can't Configure Accessory " + accessory.displayName); - } - accessory.reachable = false; - } - }; - // add accessory dynamically from outside event - Bloomsky.prototype.addAccessory = function (station) { - if (this.debug) { - this.log("Add Accessory: " + station.DeviceID); - } - var uuid = Bloomsky.UUIDGen.generate(station.DeviceID); - var newAccessory = new Bloomsky.Accessory(station.DeviceName, uuid); - var cameraSource = this.getFfmpegForStationWithUuid(uuid); - var countBefore = newAccessory.services.length; - newAccessory.configureCameraSource(cameraSource); - if (cameraSource.services.length === 0) { - throw Error("Camera Control came without services..."); - } else { - for (var _i = 0, _a = newAccessory.services; _i < _a.length; _i++) { - var service = _a[_i]; - if (this.debug) { - this.log( - service.UUID + - (service.subtype !== undefined ? "." + service.subtype : "") - ); - } - } - } - if (newAccessory.services.length <= countBefore) { - throw Error( - "Camera Control Service Registration failed... +" + - (cameraSource.services.length - countBefore) - ); - // } else if ( - // newAccessory.cameraSource !== cameraSource || - // newAccessory.services.length < cameraSource.services.length - // ) { - // throw Error( - // "Camera Control Service Registration failed... +" + - // (cameraSource.services.length - countBefore) - // ); - } else { - if (this.debug) { - this.log( - "Registered " + - (cameraSource.services.length - countBefore) + - " Camera Control Services" - ); - } - } - newAccessory - .addService(Bloomsky.Service.TemperatureSensor, "Temperature") - .getCharacteristic(Bloomsky.Characteristic.CurrentTemperature) - .updateValue(station.Data.Temperature); - newAccessory - .addService(Bloomsky.Service.LightSensor, "Luminance") - .getCharacteristic(Bloomsky.Characteristic.CurrentAmbientLightLevel) - .updateValue(station.Data.Luminance); - newAccessory - .addService(Bloomsky.Service.HumiditySensor, "Humidity") - .getCharacteristic(Bloomsky.Characteristic.CurrentRelativeHumidity) - .updateValue(station.Data.Humidity); - newAccessory - .addService(Bloomsky.Service.MotionSensor, "Rain") - .getCharacteristic(Bloomsky.Characteristic.MotionDetected) - .updateValue(station.Data.Rain); - newAccessory - .addService(Bloomsky.Service.OccupancySensor, "Night") - .getCharacteristic(Bloomsky.Characteristic.OccupancyDetected) - .updateValue(station.Data.Night); - // I only have a Sky 1 model so I can only make a guess about the battery level - // for this specific model. - if (station.Data.DeviceType === "SKY1") { - // clamp battery level between 0 and 100 - var batteryLevel = Math.max( - 0, - Math.min(100, (100 / 2600) * station.Data.Voltage) - ); - var batteryService = newAccessory.addService( - Bloomsky.Service.BatteryService, - "Battery" - ); - batteryService - .getCharacteristic(Bloomsky.Characteristic.BatteryLevel) - .updateValue(batteryLevel); - batteryService - .getCharacteristic(Bloomsky.Characteristic.ChargingState) - .updateValue(2); - batteryService - .getCharacteristic(Bloomsky.Characteristic.StatusLowBattery) - .updateValue(batteryLevel < 20); - } - var informationService = newAccessory.getService( - Bloomsky.Service.AccessoryInformation - ); - if (!informationService) { - informationService = newAccessory.addService( - Bloomsky.Service.AccessoryInformation, - station.DeviceName - ); - } - informationService - .getCharacteristic(Bloomsky.Characteristic.Manufacturer) - .updateValue("Bloomsky"); - informationService - .getCharacteristic(Bloomsky.Characteristic.Model) - .updateValue(station.Data.DeviceType); - informationService - .getCharacteristic(Bloomsky.Characteristic.SerialNumber) - .updateValue(station.DeviceID); - informationService - .getCharacteristic(Bloomsky.Characteristic.Identify) - .updateValue(false); - informationService - .getCharacteristic(Bloomsky.Characteristic.Name) - .updateValue(station.DeviceName); - informationService - .getCharacteristic(Bloomsky.Characteristic.FirmwareRevision) - .updateValue(station.Data.DeviceType); - if (this.debug) { - this.accessories.push(newAccessory); - } - this.log("new accessory pushed..."); - if (this.api !== undefined) { - // https://github.com/nfarina/homebridge/wiki/Supporting-IP-Camera - this.api.publishCameraAccessories( - "homebridge-bloomsky", - this.accessories - ); - } else { - throw TypeError("this.api UNDEFINED!!!"); - } - if (this.debug) { - this.log("new accessory registered..."); - } - if (this.debug) { - var output = ""; - for (var property in newAccessory) { - if (newAccessory.hasOwnProperty(property)) { - output += property + ": " + newAccessory[property] + "; "; - } - } - this.log(output); - } - }; - // add accessory dynamically from outside event - Bloomsky.prototype.updateAccessory = function (station) { - if (this.debug) { - this.log("Update Accessory"); - } - var platform = this; - var stationUuid = Bloomsky.UUIDGen.generate(station.DeviceID); - var accessory = platform.accessories.filter(function (anyAccessory) { - return anyAccessory.UUID === stationUuid; - })[0]; - accessory - .getService(Bloomsky.Service.TemperatureSensor) - .getCharacteristic(Bloomsky.Characteristic.CurrentTemperature) - .updateValue(station.Data.Temperature); - accessory - .getService(Bloomsky.Service.LightSensor) - .getCharacteristic(Bloomsky.Characteristic.CurrentAmbientLightLevel) - .updateValue(station.Data.Luminance); - accessory - .getService(Bloomsky.Service.HumiditySensor) - .getCharacteristic(Bloomsky.Characteristic.CurrentRelativeHumidity) - .updateValue(station.Data.Humidity); - accessory - .getService(Bloomsky.Service.MotionSensor) - .getCharacteristic(Bloomsky.Characteristic.MotionDetected) - .updateValue(station.Data.Rain); - accessory - .getService(Bloomsky.Service.OccupancySensor) - .getCharacteristic(Bloomsky.Characteristic.OccupancyDetected) - .updateValue(station.Data.Night); - var informationService = accessory.getService( - Bloomsky.Service.AccessoryInformation - ); - informationService - .getCharacteristic(Bloomsky.Characteristic.Manufacturer) - .updateValue("Bloomsky"); - informationService - .getCharacteristic(Bloomsky.Characteristic.Model) - .updateValue(station.Data.DeviceType); - informationService - .getCharacteristic(Bloomsky.Characteristic.SerialNumber) - .updateValue(station.DeviceID); - informationService - .getCharacteristic(Bloomsky.Characteristic.Identify) - .updateValue(false); - informationService - .getCharacteristic(Bloomsky.Characteristic.Name) - .updateValue(station.DeviceName); - informationService - .getCharacteristic(Bloomsky.Characteristic.FirmwareRevision) - .updateValue(station.Data.DeviceType); - // I only have a Sky 1 model so I can only make a guess about the battery level - // for this specific model. - if (station.Data.DeviceType === "SKY1") { - // clamp battery level between 0 and 100 - var batteryLevel = Math.max( - 0, - Math.min(100, (100 / 2600) * station.Data.Voltage) - ); - var batteryService = accessory.getService( - Bloomsky.Service.BatteryService - ); - batteryService - .getCharacteristic(Bloomsky.Characteristic.BatteryLevel) - .updateValue(batteryLevel); - batteryService - .getCharacteristic(Bloomsky.Characteristic.ChargingState) - .updateValue(2); - batteryService - .getCharacteristic(Bloomsky.Characteristic.StatusLowBattery) - .updateValue(batteryLevel < 20); - } - var file = fs.createWriteStream( - this.temporaryFilenameForStationUuid(accessory.UUID) - ); - file.on("finish", function () { - file.close(); - if (platform.debug) { - platform.log("temporary file updated..."); - } - }); - http.get(station.Data.ImageURL, function (response) { - response.pipe(file); - platform.log("temporary file written"); - }); - }; - // remove accessory dynamically from outside event - Bloomsky.prototype.removeAccessory = function () { - if (this.debug) { - this.log("Remove Accessory"); - } - if (this.api !== undefined) { - this.api.unregisterPlatformAccessories( - "homebridge-bloomsky", - "Bloomsky", - this.accessories - ); - } - this.accessories = []; - }; - Bloomsky.prototype.temporaryFilenameForStationUuid = function (uuid) { - return uuid + ".jpg"; - }; - Bloomsky.prototype.getFfmpegForStationWithUuid = function (uuid) { - var filename = this.temporaryFilenameForStationUuid(uuid); - var ffmpeg = new Ffmpeg_1.FFMPEG( - Bloomsky.UUIDGen, - Bloomsky.Hap, - { - name: uuid, - videoConfig: { - debug: this.debug, - maxHeight: 640, - maxStreams: 1, - maxWidth: 640, - source: "-loop 1 -i " + filename, - vcodec: this.vcodec, - }, - }, - this.log, - "ffmpeg", - filename - ); - return ffmpeg; - }; - Bloomsky.prototype.updateData = function () { - return __awaiter(this, void 0, void 0, function () { - var platform_1, requestOptions, client, response, error; - return __generator(this, function (_a) { - switch (_a.label) { - case 0: - if (!(this.apiKey === undefined)) return [3 /*break*/, 1]; - if (this.debug) { - this.log("Skipping updating data..."); - } - return [3 /*break*/, 3]; - case 1: - platform_1 = this; - requestOptions = { - additionalHeaders: { Authorization: this.apiKey }, - }; - client = new Client.RestClient("NodeJS"); - if (platform_1.debug) { - this.log("updateData"); - } - return [ - 4 /*yield*/, - client - .get(this.apiUrl + "?unit=intl", requestOptions) - .catch(function (clientError) { - if (platform_1.debug) { - platform_1.log(clientError); - } - }), - ]; - case 2: - response = _a.sent(); - error = response; - if (error !== undefined && error.detail) { - platform_1.log(error.detail); - } else if (response != null) { - if (response.result != null) { - platform_1.latestData = response.result; - } - if (response != null && platform_1.latestData.length > 0) { - if (platform_1.accessories.length > 0) { - platform_1.updateExistingAccessories(); - } - platform_1.registerNewAccessories(); - platform_1.updateAccessoriesReachability(); - } - } - platform_1.timeout = setTimeout( - function () { - platform_1.updateData().catch(function (clientError) { - platform_1.log(clientError); - }); - }.bind(platform_1), - platform_1.debug ? 30000 : 150000 - ); // 2.5 minutes, 10 seconds for debugging - platform_1.timeout.unref(); - _a.label = 3; - case 3: - return [2 /*return*/]; - } - }); - }); - }; - Bloomsky.prototype.stationNeedsToBeRegistered = function (station) { - if (this.debug) { - this.log("stationNeedsToBeRegistered: " + station); - } - var stationUuid = Bloomsky.UUIDGen.generate(station.DeviceID).valueOf(); - return ( - this.accessories.filter(function (accessory) { - return accessory.UUID.valueOf() === stationUuid; - }).length === 0 - ); - }; - Bloomsky.prototype.updateExistingAccessories = function () { - var _this = this; - if (this.debug) { - this.log("updateExistingAccessories"); - } - var platform = this; - if (this.debug) { - this.log(platform.latestData.toString()); - } - var registeredAccessories = platform.latestData.filter(function (station) { - return !_this.stationNeedsToBeRegistered(station); - }); - for (var i = 0, len = registeredAccessories.length; i < len; i++) { - var station = registeredAccessories[i]; - platform.updateAccessory(station); - } - }; - Bloomsky.prototype.registerNewAccessories = function () { - var _this = this; - if (this.debug) { - this.log("registerNewAccessories"); - } - var platform = this; - if (platform.latestData.length === 0) { - return; - } - var unregisteredAccessories = platform.latestData.filter(function ( - station - ) { - return _this.stationNeedsToBeRegistered(station); - }); - for (var i = 0, len = unregisteredAccessories.length; i < len; i++) { - platform.addAccessory(unregisteredAccessories[i]); - } - }; - Bloomsky.prototype.updateAccessoriesReachability = function () { - if (this.debug) { - this.log("Update Reachability"); - } - for (var _i = 0, _a = this.accessories; _i < _a.length; _i++) { - var accessory = _a[_i]; - // accessory.updateReachability(this.latestData != null); // Reachability update is no longer being supported - accessory.reachable = this.latestData != null; - } - }; - return Bloomsky; -})(); -exports.Bloomsky = Bloomsky; -exports.default = Bloomsky; diff --git a/lib/Ffmpeg.d.ts b/lib/Ffmpeg.d.ts deleted file mode 100644 index ff7fe46..0000000 --- a/lib/Ffmpeg.d.ts +++ /dev/null @@ -1,34 +0,0 @@ -import { SessionInfo } from "./Session"; -import { SnapshotRequest } from "./SnapshotRequest"; -import { StreamController } from "./StreamController"; -import { StreamRequest } from "./StreamRequest"; -import { StreamResponse } from "./StreamResponse"; -export default class FFMPEG implements HAPNodeJS.CameraSource { - streamController: any; - streamControllers: StreamController[]; - cameraControllers: any[]; - pendingSessions: SessionInfo[]; - ongoingSessions: SessionInfo[]; - services: HAPNodeJS.Service[]; - name: string; - uuid: HAPNodeJS.uuid; - service: any; - private log; - private vcodec; - private videoProcessor; - private fps; - private maxBitrate; - private debug; - private ffmpegSource; - private ffmpegImageSource; - private stillImageFilename; - private sharp; - constructor(uuidfunc: HAPNodeJS.uuid, hap: any, cameraConfig: any, log: (text: string) => void, videoProcessor: string, stillImageFilename: string); - handleCloseConnection(connectionID: any): void; - handleSnapshotRequest(request: SnapshotRequest, callback: (error: any, Buffer: any) => any): void; - prepareStream(request: StreamRequest, callback: (response: StreamResponse) => void): void; - handleStreamRequest(request: StreamRequest): void; - createCameraControlService(): void; - private _createStreamControllers; -} -export { FFMPEG }; diff --git a/lib/Ffmpeg.js b/lib/Ffmpeg.js deleted file mode 100644 index e3e36d6..0000000 --- a/lib/Ffmpeg.js +++ /dev/null @@ -1,368 +0,0 @@ -"use strict"; -Object.defineProperty(exports, "__esModule", { value: true }); -var child_process_1 = require("child_process"); -var crypto = require("crypto"); -var ip = require("ip"); -var Jimp = require("jimp"); -var optional = require("optional"); -var FFMPEG = /** @class */ (function () { - function FFMPEG(uuidfunc, hap, cameraConfig, log, videoProcessor, stillImageFilename) { - this.streamControllers = []; - this.cameraControllers = []; - this.pendingSessions = []; - this.ongoingSessions = []; - this.services = []; - if (uuidfunc === undefined) { - throw Error("UUIDGen undefined"); - } - if (hap.Service === undefined) { - throw Error("Service undefined"); - } - if (log === undefined) { - throw Error("Log undefined"); - } - if (hap.StreamController === undefined) { - throw Error("StreamController undefined"); - } - if (cameraConfig.videoConfig.debug) { - log("FFMPEG constructor"); - } - this.sharp = optional("sharp"); - this.uuid = uuidfunc; - this.service = hap.Service; - this.log = log; - this.streamController = hap.StreamController; - var ffmpegOpt = cameraConfig.videoConfig; - this.name = cameraConfig.name; - this.vcodec = ffmpegOpt.vcodec; - this.videoProcessor = videoProcessor || "ffmpeg"; - this.fps = ffmpegOpt.maxFPS || 10; - this.maxBitrate = ffmpegOpt.maxBitrate || 300; - this.debug = ffmpegOpt.debug || false; - if (this.debug) { - log("Debug loggin enabled..."); - } - if (!ffmpegOpt.source) { - throw new Error("Missing source for camera."); - } - this.ffmpegSource = ffmpegOpt.source; - this.ffmpegImageSource = ffmpegOpt.stillImageSource; - this.stillImageFilename = stillImageFilename; - var numberOfStreams = ffmpegOpt.maxStreams || 2; - var options = { - audio: { - codecs: [ - { - samplerate: 24, - type: "OPUS", - }, - { - samplerate: 16, - type: "AAC-eld", - }, - ], - comfort_noise: false, - }, - disable_audio_proxy: false, - proxy: false, - srtp: true, - video: { - codec: { - levels: [0, 1, 2], - profiles: [0, 1, 2], - }, - resolutions: [ - [640, 640, 30], - [640, 640, 15], - [640, 480, 30], - [640, 480, 15], - [640, 360, 30], - [640, 360, 15], - [480, 360, 30], - [480, 360, 15], - [480, 270, 30], - [480, 270, 15], - [320, 240, 30], - [320, 240, 15], - [320, 180, 30], - [320, 180, 15], - ], - }, - }; - this.createCameraControlService(); - if (this.cameraControllers.length < 1) { - throw Error("Did not push camera controller..."); - } - this._createStreamControllers(numberOfStreams, options); - } - FFMPEG.prototype.handleCloseConnection = function (connectionID) { - if (this.debug) { - this.log("closing connection for " + this.streamControllers.length + " stream(s)..."); - } - this.streamControllers.forEach(function (controller) { - controller.handleCloseConnection(connectionID); - }); - }; - // Image request: {width: number, height: number} - // Please override this and invoke callback(error, image buffer) when the snapshot is ready - FFMPEG.prototype.handleSnapshotRequest = function (request, callback) { - var _this = this; - var dir = __dirname; - if (dir.endsWith("/lib")) { - dir = dir.replace("/lib", ""); - } - var path = dir + "/" + this.stillImageFilename; - if (this.debug) { - this.log("Delivering snapshot at path: " + path); - } - if (this.sharp == null) { - if (this.debug) { - this.log("... using Jimp"); - } - Jimp.read(path) - .then(function (image) { - image - .resize(request.width, Jimp.AUTO) - .crop(0, (image.bitmap.height - request.height) / 2, request.width, request.height) - .quality(90) - .getBuffer(Jimp.MIME_JPEG, function (error, buffer) { - if (error !== null) { - if (_this.debug) { - _this.log("Error getting buffer for snapshot: " + error); - } - callback(error, undefined); - } - else { - callback(undefined, buffer); - } - }); - }) - .catch(function (error) { - if (_this.debug) { - _this.log("Error reading snapshot at path: " + error); - } - callback(error, undefined); - }); - } - else { - if (this.debug) { - this.log("... using Sharp"); - } - this.sharp(path) - .resize(request.width, request.height) - .toBuffer() - .then(function (data) { return callback(undefined, data); }) - .catch(function (error) { return callback(error, undefined); }); - } - }; - FFMPEG.prototype.prepareStream = function (request, callback) { - if (this.debug) { - this.log("prepareStream"); - } - var sessionInfo = {}; - var sessionID = request.sessionID; - var targetAddress = request.targetAddress; - sessionInfo.address = targetAddress; - var response = {}; - var videoInfo = request.video; - if (videoInfo) { - var targetPort = videoInfo.port; - var srtpKey = videoInfo.srtp_key; - var srtpSalt = videoInfo.srtp_salt; - if (this.debug) { - this.log("srtpKey.length=" + srtpKey.length + ", srtpSalt.length=" + srtpSalt.length); - } - // SSRC is a 32 bit integer that is unique per stream - var ssrcSource = crypto.randomBytes(4); - ssrcSource[0] = 0; - var ssrc = ssrcSource.readInt32BE(0, true); - this.fps = videoInfo.fps || this.fps; - var videoResp = { - fps: videoInfo.fps, - height: videoInfo.height, - max_bit_rate: videoInfo.max_bit_rate, - port: targetPort, - srtp_key: srtpKey, - srtp_salt: srtpSalt, - ssrc: ssrc, - width: videoInfo.width, - }; - response.video = videoResp; - sessionInfo.video_port = targetPort; - sessionInfo.video_srtp = Buffer.concat([srtpKey, srtpSalt]); - sessionInfo.video_ssrc = ssrc; - } - var audioInfo = request.audio; - if (audioInfo) { - var targetPort = audioInfo.port; - var srtpKey = audioInfo.srtp_key; - var srtpSalt = audioInfo.srtp_salt; - // SSRC is a 32 bit integer that is unique per stream - var ssrcSource = crypto.randomBytes(4); - ssrcSource[0] = 0; - var ssrc = ssrcSource.readInt32BE(0, true); - var audioResp = { - port: targetPort, - srtp_key: srtpKey, - srtp_salt: srtpSalt, - ssrc: ssrc, - }; - response.audio = audioResp; - sessionInfo.audio_port = targetPort; - sessionInfo.audio_port = Buffer.concat([srtpKey, srtpSalt]); - sessionInfo.audio_ssrc = ssrc; - } - var currentAddress = ip.address(); - var addressResp = { - address: currentAddress, - type: "v6", - }; - if (ip.isV4Format(currentAddress)) { - addressResp.type = "v4"; - } - response.address = addressResp; - this.pendingSessions[this.uuid.unparse(sessionID, 0)] = sessionInfo; - callback(response); - }; - FFMPEG.prototype.handleStreamRequest = function (request) { - var _this = this; - if (this.debug) { - this.log("handleStreamRequest"); - } - var platform = this; - var sessionID = request.sessionID; - var requestType = request.type; - if (sessionID) { - var sessionIdentifier = this.uuid.unparse(sessionID, 0); - var sessionInfo = this.pendingSessions[sessionIdentifier]; - if (requestType === "start" && sessionInfo) { - var width = 640; - var height = 640; - var fps = this.fps || 15; - var vbitrate = this.maxBitrate; - var vcodec = this.vcodec || "libx264"; - var packetsize = 1316; // 188 376 - var videoInfo = request.video; - if (videoInfo) { - width = videoInfo.width; - height = videoInfo.height; - var expectedFPS = videoInfo.fps; - if (expectedFPS < fps) { - fps = expectedFPS; - } - if (videoInfo.max_bit_rate < vbitrate) { - vbitrate = videoInfo.max_bit_rate; - } - } - var targetAddress = sessionInfo.address; - var targetVideoPort = sessionInfo.video_port; - var videoKey = sessionInfo.video_srtp; - var videoSsrc = sessionInfo.video_ssrc; - var ffmpegCommand = "-threads 0 -an -re -r 1" + - " " + this.ffmpegSource + - " -vf fps=" + fps + - " -map 0:0" + - " -f mp4 -vcodec " + vcodec + - " -preset faster" + - " -pix_fmt yuv420p -an" + - " -r " + fps + - " -g " + (fps * 2) + - " -movflags frag_keyframe+empty_moov -tune stillimage" + - " -b:v " + vbitrate + "k" + - " -bufsize " + vbitrate + "k" + - " -maxrate " + vbitrate + "k" + - " -payload_type 99" + - " -ssrc " + videoSsrc + - " -f rtp" + - " -srtp_out_suite AES_CM_128_HMAC_SHA1_80" + - " -srtp_out_params " + videoKey.toString("base64") + - " srtp://" + targetAddress + ":" + targetVideoPort + - "?rtcpport=" + targetVideoPort + - "&localrtcpport=" + targetVideoPort + - "&pkt_size=" + packetsize; - var ffmpeg = child_process_1.spawn(this.videoProcessor, ffmpegCommand.split(" "), { env: process.env }); - this.log("Start streaming video from " + this.name + " with " + width + "x" + height + "@" + vbitrate + "kBit"); - if (this.debug) { - this.log("ffmpeg " + ffmpegCommand); - } - ffmpeg.stdout.on("data", function (data) { - // Do not log to the console if debugging is turned off - if (platform.debug) { - platform.log(data.toString()); - } - }); - // Always setup hook on stderr. - // Without this streaming stops within one to two minutes. - ffmpeg.stderr.on("data", function (data) { - // Do not log to the console if debugging is turned off - if (platform.debug) { - platform.log(data.toString()); - } - }); - ffmpeg.on("error", function (error) { - platform.log("An error occurs while making stream request"); - if (platform.debug) { - platform.log(error); - } - }); - ffmpeg.on("close", function (code) { - if (code == null || code === 0 || code === 255) { - platform.log("Stopped streaming"); - } - else { - platform.log("ERROR: FFmpeg exited with code " + code); - for (var _i = 0, _a = _this.streamControllers; _i < _a.length; _i++) { - var controller = _a[_i]; - if (controller.sessionIdentifier === sessionID) { - controller.forceStop(); - } - } - } - }); - this.ongoingSessions[sessionIdentifier] = ffmpeg; - delete this.pendingSessions[sessionIdentifier]; - } - else if (requestType === "stop") { - var ffmpegProcess = this.ongoingSessions[sessionIdentifier]; - if (ffmpegProcess) { - ffmpegProcess.kill("SIGTERM"); - } - delete this.ongoingSessions[sessionIdentifier]; - } - } - }; - FFMPEG.prototype.createCameraControlService = function () { - if (this.service.CameraControl === undefined) { - throw Error("CameraControl undefined"); - } - if (this.debug) { - this.log("createCameraControlService"); - } - var controlService = new this.service.CameraControl(); - this.services.push(controlService); - this.cameraControllers.push(controlService); - if (this.services.filter(function (s) { return s === controlService; }).length < 1) { - throw Error("Failed to register Camera Control Service..."); - } - }; - // Private - FFMPEG.prototype._createStreamControllers = function (maxStreams, options) { - if (this.debug) { - this.log("_createStreamControllers"); - } - for (var i = 0; i < maxStreams; i++) { - if (this.debug) { - this.log("adding StreamController #" + (i + 1) + "/" + maxStreams); - } - var streamController = new this.streamController(i, options, this); - this.services.push(streamController.service); - this.streamControllers.push(streamController); - } - if (this.debug) { - this.log(this.streamControllers.length + "/" + maxStreams + " stream controllers registered"); - } - }; - return FFMPEG; -}()); -exports.FFMPEG = FFMPEG; -exports.default = FFMPEG; diff --git a/lib/PlatformAccessory.d.ts b/lib/PlatformAccessory.d.ts deleted file mode 100644 index efeadaa..0000000 --- a/lib/PlatformAccessory.d.ts +++ /dev/null @@ -1,36 +0,0 @@ -declare interface PlatformAccessory extends HAPNodeJS.Accessory { - displayName: string; - username: string; - pincode: string; - UUID: string; - aid: string; - bridged: boolean; - bridgedAccessories: HAPNodeJS.Accessory[]; - reachable: boolean; - category: HAPNodeJS.Accessory.Categories; - services: HAPNodeJS.Service[]; - cameraSource: HAPNodeJS.CameraSource; - Categories: typeof HAPNodeJS.Accessory.Categories; - new (displayName: string, category: string): PlatformAccessory; - new (displayName: string, uuid: string, subtype: number): PlatformAccessory; - addService(service: HAPNodeJS.Service | Function | HAPNodeJS.PredefinedService): HAPNodeJS.Service; - addService(service: HAPNodeJS.Service | HAPNodeJS.PredefinedService, displayName: string): HAPNodeJS.Service; - removeService(service: HAPNodeJS.Service): HAPNodeJS.Service; - removeService(service: HAPNodeJS.Service, displayName: string): HAPNodeJS.Service; - getService(service: HAPNodeJS.Service | HAPNodeJS.PredefinedService): HAPNodeJS.Service; - getService(name: string): HAPNodeJS.Service; - updateReachability(reachable: boolean): void; - addBridgedAccessory(accessory: HAPNodeJS.Accessory, deferUpdate: boolean): HAPNodeJS.Accessory; - addBridgedAccessories(accessories: HAPNodeJS.Accessory[]): void; - removeBridgedAccessory(accessory: HAPNodeJS.Accessory, deferUpdate: boolean): void; - removeBridgedAccessories(accessories: HAPNodeJS.Accessory[]): void; - getCharacteristicByIID(iid: string): HAPNodeJS.Characteristic; - getBridgedAccessoryByAID(aid: string): HAPNodeJS.Accessory; - findCharacteristic(aid: string, iid: string): HAPNodeJS.Accessory; - configureCameraSource(cameraSource: HAPNodeJS.CameraSource): void; - toHAP(opt: any): JSON; - publish(info: HAPNodeJS.PublishInfo, allowInsecureRequest: boolean): void; - destroy(): void; - setupURI(): string; -} -export { PlatformAccessory }; diff --git a/lib/PlatformAccessory.js b/lib/PlatformAccessory.js deleted file mode 100644 index c8ad2e5..0000000 --- a/lib/PlatformAccessory.js +++ /dev/null @@ -1,2 +0,0 @@ -"use strict"; -Object.defineProperty(exports, "__esModule", { value: true }); diff --git a/lib/Session.d.ts b/lib/Session.d.ts deleted file mode 100644 index 4c1326f..0000000 --- a/lib/Session.d.ts +++ /dev/null @@ -1,9 +0,0 @@ -declare class SessionInfo { - address: any; - video_port: any; - video_srtp: Buffer; - video_ssrc: number; - audio_port: any; - audio_ssrc: number; -} -export { SessionInfo }; diff --git a/lib/Session.js b/lib/Session.js deleted file mode 100644 index c8ad2e5..0000000 --- a/lib/Session.js +++ /dev/null @@ -1,2 +0,0 @@ -"use strict"; -Object.defineProperty(exports, "__esModule", { value: true }); diff --git a/lib/SnapshotRequest.d.ts b/lib/SnapshotRequest.d.ts deleted file mode 100644 index fb89aba..0000000 --- a/lib/SnapshotRequest.d.ts +++ /dev/null @@ -1,5 +0,0 @@ -declare class SnapshotRequest { - width: number; - height: number; -} -export { SnapshotRequest }; diff --git a/lib/SnapshotRequest.js b/lib/SnapshotRequest.js deleted file mode 100644 index c8ad2e5..0000000 --- a/lib/SnapshotRequest.js +++ /dev/null @@ -1,2 +0,0 @@ -"use strict"; -Object.defineProperty(exports, "__esModule", { value: true }); diff --git a/lib/Station.d.ts b/lib/Station.d.ts deleted file mode 100644 index 8e44c52..0000000 --- a/lib/Station.d.ts +++ /dev/null @@ -1,16 +0,0 @@ -import { URL } from "url"; -export declare interface IStation { - DeviceID: string; - DeviceName: string; - Data: IStationData; -} -export declare interface IStationData { - Temperature: number; - Luminance: number; - Humidity: number; - Rain: boolean; - Night: boolean; - Voltage: number; - DeviceType: string; - ImageURL: URL; -} diff --git a/lib/Station.js b/lib/Station.js deleted file mode 100644 index c8ad2e5..0000000 --- a/lib/Station.js +++ /dev/null @@ -1,2 +0,0 @@ -"use strict"; -Object.defineProperty(exports, "__esModule", { value: true }); diff --git a/lib/StreamController.d.ts b/lib/StreamController.d.ts deleted file mode 100644 index e5606c9..0000000 --- a/lib/StreamController.d.ts +++ /dev/null @@ -1,8 +0,0 @@ -declare class StreamController { - service: HAPNodeJS.Service; - sessionIdentifier: any; - constructor(identifier: any, options: any, cameraSource: HAPNodeJS.CameraSource); - forceStop(): void; - handleCloseConnection(connectionID: any): void; -} -export { StreamController }; diff --git a/lib/StreamController.js b/lib/StreamController.js deleted file mode 100644 index c8ad2e5..0000000 --- a/lib/StreamController.js +++ /dev/null @@ -1,2 +0,0 @@ -"use strict"; -Object.defineProperty(exports, "__esModule", { value: true }); diff --git a/lib/StreamRequest.d.ts b/lib/StreamRequest.d.ts deleted file mode 100644 index 237fe0b..0000000 --- a/lib/StreamRequest.d.ts +++ /dev/null @@ -1,10 +0,0 @@ -import { AudioResponse } from "./AudioResponse"; -import { VideoResponse } from "./VideoResponse"; -declare class StreamRequest { - sessionID: any; - type: any; - video: VideoResponse; - targetAddress: string; - audio: AudioResponse | undefined; -} -export { StreamRequest }; diff --git a/lib/StreamRequest.js b/lib/StreamRequest.js deleted file mode 100644 index c8ad2e5..0000000 --- a/lib/StreamRequest.js +++ /dev/null @@ -1,2 +0,0 @@ -"use strict"; -Object.defineProperty(exports, "__esModule", { value: true }); diff --git a/lib/StreamResponse.d.ts b/lib/StreamResponse.d.ts deleted file mode 100644 index 5929628..0000000 --- a/lib/StreamResponse.d.ts +++ /dev/null @@ -1,9 +0,0 @@ -import { AddressResponse } from "./AddressResponse"; -import { AudioResponse } from "./AudioResponse"; -import { VideoResponse } from "./VideoResponse"; -declare class StreamResponse { - video: VideoResponse; - audio: AudioResponse; - address: AddressResponse; -} -export { StreamResponse }; diff --git a/lib/StreamResponse.js b/lib/StreamResponse.js deleted file mode 100644 index c8ad2e5..0000000 --- a/lib/StreamResponse.js +++ /dev/null @@ -1,2 +0,0 @@ -"use strict"; -Object.defineProperty(exports, "__esModule", { value: true }); diff --git a/nodemon.json b/nodemon.json new file mode 100644 index 0000000..43d9a23 --- /dev/null +++ b/nodemon.json @@ -0,0 +1,9 @@ +{ + "watch": [ + "src" + ], + "ext": "ts", + "ignore": [], + "exec": "tsc && homebridge -I -D", + "signal": "SIGTERM" +} \ No newline at end of file diff --git a/package-lock.json b/package-lock.json index 2723f07..f66ab12 100644 --- a/package-lock.json +++ b/package-lock.json @@ -1,362 +1,266 @@ { "name": "homebridge-bloomsky", - "version": "1.1.14", + "version": "1.2.0-alpha.1", "lockfileVersion": 1, "requires": true, "dependencies": { - "@babel/polyfill": { - "version": "7.0.0", - "resolved": "https://registry.npmjs.org/@babel/polyfill/-/polyfill-7.0.0.tgz", - "integrity": "sha512-dnrMRkyyr74CRelJwvgnnSUDh2ge2NCTyHVwpOdvRMHtJUyxLtMAfhBN3s64pY41zdw0kgiLPh6S20eb1NcX6Q==", - "requires": { - "core-js": "^2.5.7", - "regenerator-runtime": "^0.11.1" - } - }, - "@jimp/bmp": { - "version": "0.5.4", - "resolved": "https://registry.npmjs.org/@jimp/bmp/-/bmp-0.5.4.tgz", - "integrity": "sha512-P/ezH1FuoM3FwS0Dm2ZGkph4x5/rPBzFLEZor7KQkmGUnYEIEG4o0BUcAWFmJOp2HgzbT6O2SfrpJNBOcVACzQ==", + "@babel/code-frame": { + "version": "7.8.3", + "resolved": "https://registry.npmjs.org/@babel/code-frame/-/code-frame-7.8.3.tgz", + "integrity": "sha512-a9gxpmdXtZEInkCSHUJDLHZVBgb1QS0jhss4cPP93EW7s+uC5bikET2twEF3KV+7rDblJcmNvTR7VJejqd2C2g==", + "dev": true, "requires": { - "@jimp/utils": "^0.5.0", - "bmp-js": "^0.1.0", - "core-js": "^2.5.7" + "@babel/highlight": "^7.8.3" } }, - "@jimp/core": { - "version": "0.5.4", - "resolved": "https://registry.npmjs.org/@jimp/core/-/core-0.5.4.tgz", - "integrity": "sha512-n3uvHy2ndUKItmbhnRO8xmU8J6KR+v6CQxO9sbeUDpSc3VXc1PkqrA8ZsCVFCjnDFcGBXL+MJeCTyQzq5W9Crw==", - "requires": { - "@jimp/utils": "^0.5.0", - "any-base": "^1.1.0", - "buffer": "^5.2.0", - "core-js": "^2.5.7", - "exif-parser": "^0.1.12", - "file-type": "^9.0.0", - "load-bmfont": "^1.3.1", - "mkdirp": "0.5.1", - "phin": "^2.9.1", - "pixelmatch": "^4.0.2", - "tinycolor2": "^1.4.1" - } + "@babel/helper-validator-identifier": { + "version": "7.9.5", + "resolved": "https://registry.npmjs.org/@babel/helper-validator-identifier/-/helper-validator-identifier-7.9.5.tgz", + "integrity": "sha512-/8arLKUFq882w4tWGj9JYzRpAlZgiWUJ+dtteNTDqrRBz9Iguck9Rn3ykuBDoUwh2TO4tSAJlrxDUOXWklJe4g==", + "dev": true }, - "@jimp/custom": { - "version": "0.5.4", - "resolved": "https://registry.npmjs.org/@jimp/custom/-/custom-0.5.4.tgz", - "integrity": "sha512-tLfyJoyouDl2J3RPFGfDzTtE+4S8ljqJUmLzy/cmx1n7+xS5TpLPdPskp7UaeAfNTqdF4CNAm94KYoxTZdj2mg==", + "@babel/highlight": { + "version": "7.9.0", + "resolved": "https://registry.npmjs.org/@babel/highlight/-/highlight-7.9.0.tgz", + "integrity": "sha512-lJZPilxX7Op3Nv/2cvFdnlepPXDxi29wxteT57Q965oc5R9v86ztx0jfxVrTcBk8C2kcPkkDa2Z4T3ZsPPVWsQ==", + "dev": true, "requires": { - "@jimp/core": "^0.5.4", - "core-js": "^2.5.7" + "@babel/helper-validator-identifier": "^7.9.0", + "chalk": "^2.0.0", + "js-tokens": "^4.0.0" } }, - "@jimp/gif": { - "version": "0.5.0", - "resolved": "https://registry.npmjs.org/@jimp/gif/-/gif-0.5.0.tgz", - "integrity": "sha512-HVB4c7b8r/yCpjhCjVNPRFLuujTav5UPmcQcFJjU6aIxmne6e29rAjRJEv3UMamHDGSu/96PzOsPZBO5U+ZGww==", - "requires": { - "@jimp/utils": "^0.5.0", - "core-js": "^2.5.7", - "omggif": "^1.0.9" - } + "@sindresorhus/is": { + "version": "0.14.0", + "resolved": "https://registry.npmjs.org/@sindresorhus/is/-/is-0.14.0.tgz", + "integrity": "sha512-9NET910DNaIPngYnLLPeg+Ogzqsi9uM4mSboU5y6p8S5DzMTVEsJZrawi+BoDNUVBa2DhJqQYUFvMDfgU062LQ==", + "dev": true }, - "@jimp/jpeg": { - "version": "0.5.4", - "resolved": "https://registry.npmjs.org/@jimp/jpeg/-/jpeg-0.5.4.tgz", - "integrity": "sha512-YaPWm+YSGCThNE/jLMckM3Qs6uaMxd/VsHOnEaqu5tGA4GFbfVaWHjKqkNGAFuiNV+HdgKlNcCOF3of+elvzqQ==", + "@szmarczak/http-timer": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/@szmarczak/http-timer/-/http-timer-1.1.2.tgz", + "integrity": "sha512-XIB2XbzHTN6ieIjfIMV9hlVcfPU26s2vafYWQcZHWXHOxiaRZYEDKEwdl129Zyg50+foYV2jCgtrqSA6qNuNSA==", + "dev": true, "requires": { - "@jimp/utils": "^0.5.0", - "core-js": "^2.5.7", - "jpeg-js": "^0.3.4" + "defer-to-connect": "^1.0.1" } }, - "@jimp/plugin-blit": { - "version": "0.5.4", - "resolved": "https://registry.npmjs.org/@jimp/plugin-blit/-/plugin-blit-0.5.4.tgz", - "integrity": "sha512-WqDYOugv76hF1wnKy7+xPGf9PUbcm9vPW28/jHWn1hjbb2GnusJ2fVEFad76J/1SPfhrQ2Uebf2QCWJuLmOqZg==", - "requires": { - "@jimp/utils": "^0.5.0", - "core-js": "^2.5.7" - } + "@types/chai": { + "version": "4.2.11", + "resolved": "https://registry.npmjs.org/@types/chai/-/chai-4.2.11.tgz", + "integrity": "sha512-t7uW6eFafjO+qJ3BIV2gGUyZs27egcNRkUdalkud+Qa3+kg//f129iuOFivHDXQ+vnU3fDXuwgv0cqMCbcE8sw==", + "dev": true }, - "@jimp/plugin-blur": { - "version": "0.5.0", - "resolved": "https://registry.npmjs.org/@jimp/plugin-blur/-/plugin-blur-0.5.0.tgz", - "integrity": "sha512-5k0PXCA1RTJdITL7yMAyZ5tGQjKLHqFvwdXj/PCoBo5PuMyr0x6qfxmQEySixGk/ZHdDxMi80vYxHdKHjNNgjg==", - "requires": { - "@jimp/utils": "^0.5.0", - "core-js": "^2.5.7" - } + "@types/color-name": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/@types/color-name/-/color-name-1.1.1.tgz", + "integrity": "sha512-rr+OQyAjxze7GgWrSaJwydHStIhHq2lvY3BOC2Mj7KnzI7XK0Uw1TOOdI9lDoajEbSWLiYgoo4f1R51erQfhPQ==", + "dev": true }, - "@jimp/plugin-color": { - "version": "0.5.5", - "resolved": "https://registry.npmjs.org/@jimp/plugin-color/-/plugin-color-0.5.5.tgz", - "integrity": "sha512-hWeOqNCmLguGYLhSvBrpfCvlijsMEVaLZAOod62s1rzWnujozyKOzm2eZe+W3To6mHbp5RGJNVrIwHBWMab4ug==", - "requires": { - "@jimp/utils": "^0.5.0", - "core-js": "^2.5.7", - "tinycolor2": "^1.4.1" - } + "@types/debug": { + "version": "0.0.31", + "resolved": "https://registry.npmjs.org/@types/debug/-/debug-0.0.31.tgz", + "integrity": "sha512-LS1MCPaQKqspg7FvexuhmDbWUhE2yIJ+4AgVIyObfc06/UKZ8REgxGNjZc82wPLWmbeOm7S+gSsLgo75TanG4A==", + "dev": true }, - "@jimp/plugin-contain": { - "version": "0.5.4", - "resolved": "https://registry.npmjs.org/@jimp/plugin-contain/-/plugin-contain-0.5.4.tgz", - "integrity": "sha512-8YJh4FI3S69unri0nJsWeqVLeVGA77N2R0Ws16iSuCCD/5UnWd9FeWRrSbKuidBG6TdMBaG2KUqSYZeHeH9GOQ==", - "requires": { - "@jimp/utils": "^0.5.0", - "core-js": "^2.5.7" - } + "@types/eslint-visitor-keys": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/@types/eslint-visitor-keys/-/eslint-visitor-keys-1.0.0.tgz", + "integrity": "sha512-OCutwjDZ4aFS6PB1UZ988C4YgwlBHJd6wCeQqaLdmadZ/7e+w79+hbMUFC1QXDNCmdyoRfAFdm0RypzwR+Qpag==", + "dev": true }, - "@jimp/plugin-cover": { - "version": "0.5.4", - "resolved": "https://registry.npmjs.org/@jimp/plugin-cover/-/plugin-cover-0.5.4.tgz", - "integrity": "sha512-2Rur7b44WiDDgizUI2M2uYWc1RmfhU5KjKS1xXruobjQ0tXkf5xlrPXSushq0hB6Ne0Ss6wv0+/6eQ8WeGHU2w==", + "@types/ip": { + "version": "0.0.31", + "resolved": "https://registry.npmjs.org/@types/ip/-/ip-0.0.31.tgz", + "integrity": "sha512-oYk8aalgfCt7XfEu66Sjwz/aQjfRtQkjNSXwrUGqyRoQbOymAc156fUNTwn1cSCEEwuPPzMy7fGPmKcFLoaIkA==", + "dev": true, "requires": { - "@jimp/utils": "^0.5.0", - "core-js": "^2.5.7" + "@types/node": "*" } }, - "@jimp/plugin-crop": { - "version": "0.5.4", - "resolved": "https://registry.npmjs.org/@jimp/plugin-crop/-/plugin-crop-0.5.4.tgz", - "integrity": "sha512-6t0rqn4VazquGk48tO6hFBrQ+nkvC+A1RnR6UM/m8ZtG2/yjpwF0MXcpgJI1Fb+a4Ug7BY1fu2GPcZOhnAVK/g==", - "requires": { - "@jimp/utils": "^0.5.0", - "core-js": "^2.5.7" - } + "@types/json-schema": { + "version": "7.0.4", + "resolved": "https://registry.npmjs.org/@types/json-schema/-/json-schema-7.0.4.tgz", + "integrity": "sha512-8+KAKzEvSUdeo+kmqnKrqgeE+LcA0tjYWFY7RPProVYwnqDjukzO+3b6dLD56rYX5TdWejnEOLJYOIeh4CXKuA==", + "dev": true }, - "@jimp/plugin-displace": { - "version": "0.5.0", - "resolved": "https://registry.npmjs.org/@jimp/plugin-displace/-/plugin-displace-0.5.0.tgz", - "integrity": "sha512-Bec7SQvnmKia4hOXEDjeNVx7vo/1bWqjuV6NO8xbNQcAO3gaCl91c9FjMDhsfAVb0Ou6imhbIuFPrLxorXsecQ==", - "requires": { - "@jimp/utils": "^0.5.0", - "core-js": "^2.5.7" - } + "@types/node": { + "version": "14.0.1", + "resolved": "https://registry.npmjs.org/@types/node/-/node-14.0.1.tgz", + "integrity": "sha512-FAYBGwC+W6F9+huFIDtn43cpy7+SzG+atzRiTfdp3inUKL2hXnd4rG8hylJLIh4+hqrQy1P17kvJByE/z825hA==", + "dev": true }, - "@jimp/plugin-dither": { - "version": "0.5.0", - "resolved": "https://registry.npmjs.org/@jimp/plugin-dither/-/plugin-dither-0.5.0.tgz", - "integrity": "sha512-We2WJQsD/Lm8oqBFp/vUv9/5r2avyenL+wNNu/s2b1HqA5O4sPGrjHy9K6vIov0NroQGCQ3bNznLkTmjiHKBcg==", + "@typescript-eslint/eslint-plugin": { + "version": "2.34.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/eslint-plugin/-/eslint-plugin-2.34.0.tgz", + "integrity": "sha512-4zY3Z88rEE99+CNvTbXSyovv2z9PNOVffTWD2W8QF5s2prBQtwN2zadqERcrHpcR7O/+KMI3fcTAmUUhK/iQcQ==", + "dev": true, "requires": { - "@jimp/utils": "^0.5.0", - "core-js": "^2.5.7" + "@typescript-eslint/experimental-utils": "2.34.0", + "functional-red-black-tree": "^1.0.1", + "regexpp": "^3.0.0", + "tsutils": "^3.17.1" } }, - "@jimp/plugin-flip": { - "version": "0.5.0", - "resolved": "https://registry.npmjs.org/@jimp/plugin-flip/-/plugin-flip-0.5.0.tgz", - "integrity": "sha512-D/ehBQxLMNR7oNd80KXo4tnSET5zEm5mR70khYOTtTlfti/DlLp3qOdjPOzfLyAdqO7Ly4qCaXrIsnia+pfPrA==", + "@typescript-eslint/experimental-utils": { + "version": "2.34.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/experimental-utils/-/experimental-utils-2.34.0.tgz", + "integrity": "sha512-eS6FTkq+wuMJ+sgtuNTtcqavWXqsflWcfBnlYhg/nS4aZ1leewkXGbvBhaapn1q6qf4M71bsR1tez5JTRMuqwA==", + "dev": true, "requires": { - "@jimp/utils": "^0.5.0", - "core-js": "^2.5.7" + "@types/json-schema": "^7.0.3", + "@typescript-eslint/typescript-estree": "2.34.0", + "eslint-scope": "^5.0.0", + "eslint-utils": "^2.0.0" } }, - "@jimp/plugin-gaussian": { - "version": "0.5.0", - "resolved": "https://registry.npmjs.org/@jimp/plugin-gaussian/-/plugin-gaussian-0.5.0.tgz", - "integrity": "sha512-Ln4kgxblv0/YzLBDb/J8DYPLhDzKH87Y8yHh5UKv3H+LPKnLaEG3L4iKTE9ivvdocnjmrtTFMYcWv2ERSPeHcg==", + "@typescript-eslint/parser": { + "version": "2.34.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/parser/-/parser-2.34.0.tgz", + "integrity": "sha512-03ilO0ucSD0EPTw2X4PntSIRFtDPWjrVq7C3/Z3VQHRC7+13YB55rcJI3Jt+YgeHbjUdJPcPa7b23rXCBokuyA==", + "dev": true, "requires": { - "@jimp/utils": "^0.5.0", - "core-js": "^2.5.7" + "@types/eslint-visitor-keys": "^1.0.0", + "@typescript-eslint/experimental-utils": "2.34.0", + "@typescript-eslint/typescript-estree": "2.34.0", + "eslint-visitor-keys": "^1.1.0" } }, - "@jimp/plugin-invert": { - "version": "0.5.0", - "resolved": "https://registry.npmjs.org/@jimp/plugin-invert/-/plugin-invert-0.5.0.tgz", - "integrity": "sha512-/vyKeIi3T7puf+8ruWovTjzDC585EnTwJ+lGOOUYiNPsdn4JDFe1B3xd+Ayv9aCQbXDIlPElZaM9vd/+wqDiIQ==", + "@typescript-eslint/typescript-estree": { + "version": "2.34.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/typescript-estree/-/typescript-estree-2.34.0.tgz", + "integrity": "sha512-OMAr+nJWKdlVM9LOqCqh3pQQPwxHAN7Du8DR6dmwCrAmxtiXQnhHJ6tBNtf+cggqfo51SG/FCwnKhXCIM7hnVg==", + "dev": true, "requires": { - "@jimp/utils": "^0.5.0", - "core-js": "^2.5.7" + "debug": "^4.1.1", + "eslint-visitor-keys": "^1.1.0", + "glob": "^7.1.6", + "is-glob": "^4.0.1", + "lodash": "^4.17.15", + "semver": "^7.3.2", + "tsutils": "^3.17.1" + }, + "dependencies": { + "semver": { + "version": "7.3.2", + "resolved": "https://registry.npmjs.org/semver/-/semver-7.3.2.tgz", + "integrity": "sha512-OrOb32TeeambH6UrhtShmF7CRDqhL6/5XpPNp2DuRH6+9QLw/orhp72j87v8Qa1ScDkvrrBNpZcDejAirJmfXQ==", + "dev": true + } } }, - "@jimp/plugin-mask": { - "version": "0.5.4", - "resolved": "https://registry.npmjs.org/@jimp/plugin-mask/-/plugin-mask-0.5.4.tgz", - "integrity": "sha512-mUJ04pCrUWaJGXPjgoVbzhIQB8cVobj2ZEFlGO3BEAjyylYMrdJlNlsER8dd7UuJ2L/a4ocWtFDdsnuicnBghQ==", - "requires": { - "@jimp/utils": "^0.5.0", - "core-js": "^2.5.7" - } + "abbrev": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/abbrev/-/abbrev-1.1.1.tgz", + "integrity": "sha512-nne9/IiQ/hzIhY6pdDnbBtz7DjPTKrY00P/zvPSm5pOFkl6xuGrGnXn/VtTNNfNtAfZ9/1RtehkszU9qcTii0Q==", + "dev": true }, - "@jimp/plugin-normalize": { - "version": "0.5.4", - "resolved": "https://registry.npmjs.org/@jimp/plugin-normalize/-/plugin-normalize-0.5.4.tgz", - "integrity": "sha512-Q5W0oEz9wxsjuhvHAJynI/OqXZcmqEAuRONQId7Aw5ulCXSOg9C4y2a67EO7aZAt55T+zMVxI9UpVUpzVvO6hw==", - "requires": { - "@jimp/utils": "^0.5.0", - "core-js": "^2.5.7" - } + "acorn": { + "version": "7.2.0", + "resolved": "https://registry.npmjs.org/acorn/-/acorn-7.2.0.tgz", + "integrity": "sha512-apwXVmYVpQ34m/i71vrApRrRKCWQnZZF1+npOD0WV5xZFfwWOmKGQ2RWlfdy9vWITsenisM8M0Qeq8agcFHNiQ==", + "dev": true }, - "@jimp/plugin-print": { - "version": "0.5.4", - "resolved": "https://registry.npmjs.org/@jimp/plugin-print/-/plugin-print-0.5.4.tgz", - "integrity": "sha512-DOZr5TY9WyMWFBD37oz7KpTEBVioFIHQF/gH5b3O5jjFyj4JPMkw7k3kVBve9lIrzIYrvLqe0wH59vyAwpeEFg==", - "requires": { - "@jimp/utils": "^0.5.0", - "core-js": "^2.5.7", - "load-bmfont": "^1.4.0" - } + "acorn-jsx": { + "version": "5.2.0", + "resolved": "https://registry.npmjs.org/acorn-jsx/-/acorn-jsx-5.2.0.tgz", + "integrity": "sha512-HiUX/+K2YpkpJ+SzBffkM/AQ2YE03S0U1kjTLVpoJdhZMOWy8qvXVN9JdLqv2QsaQ6MPYQIuNmwD8zOiYUofLQ==", + "dev": true }, - "@jimp/plugin-resize": { - "version": "0.5.4", - "resolved": "https://registry.npmjs.org/@jimp/plugin-resize/-/plugin-resize-0.5.4.tgz", - "integrity": "sha512-lXNprNAT0QY1D1vG/1x6urUTlWuZe2dfL29P81ApW2Yfcio471+oqo45moX5FLS0q24xU600g7cHGf2/TzqSfA==", + "ajv": { + "version": "6.12.2", + "resolved": "https://registry.npmjs.org/ajv/-/ajv-6.12.2.tgz", + "integrity": "sha512-k+V+hzjm5q/Mr8ef/1Y9goCmlsK4I6Sm74teeyGvFk1XrOsbsKLjEdrvny42CZ+a8sXbk8KWpY/bDwS+FLL2UQ==", + "dev": true, "requires": { - "@jimp/utils": "^0.5.0", - "core-js": "^2.5.7" + "fast-deep-equal": "^3.1.1", + "fast-json-stable-stringify": "^2.0.0", + "json-schema-traverse": "^0.4.1", + "uri-js": "^4.2.2" } }, - "@jimp/plugin-rotate": { - "version": "0.5.4", - "resolved": "https://registry.npmjs.org/@jimp/plugin-rotate/-/plugin-rotate-0.5.4.tgz", - "integrity": "sha512-SIdUpMc8clObMchy8TnjgHgcXEQM992z5KavgiuOnCuBlsmSHtE3MrXTOyMW0Dn3gqapV9Y5vygrLm/BVtCCsg==", + "ansi-align": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/ansi-align/-/ansi-align-3.0.0.tgz", + "integrity": "sha512-ZpClVKqXN3RGBmKibdfWzqCY4lnjEuoNzU5T0oEFpfd/z5qJHVarukridD4juLO2FXMiwUQxr9WqQtaYa8XRYw==", + "dev": true, "requires": { - "@jimp/utils": "^0.5.0", - "core-js": "^2.5.7" + "string-width": "^3.0.0" + }, + "dependencies": { + "emoji-regex": { + "version": "7.0.3", + "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-7.0.3.tgz", + "integrity": "sha512-CwBLREIQ7LvYFB0WyRvwhq5N5qPhc6PMjD6bYggFlI5YyDgl+0vxq5VHbMOFqLg7hfWzmu8T5Z1QofhmTIhItA==", + "dev": true + }, + "is-fullwidth-code-point": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-2.0.0.tgz", + "integrity": "sha1-o7MKXE8ZkYMWeqq5O+764937ZU8=", + "dev": true + }, + "string-width": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/string-width/-/string-width-3.1.0.tgz", + "integrity": "sha512-vafcv6KjVZKSgz06oM/H6GDBrAtz8vdhQakGjFIvNrHA6y3HCF1CInLy+QLq8dTJPQ1b+KDUqDFctkdRW44e1w==", + "dev": true, + "requires": { + "emoji-regex": "^7.0.1", + "is-fullwidth-code-point": "^2.0.0", + "strip-ansi": "^5.1.0" + } + } } }, - "@jimp/plugin-scale": { - "version": "0.5.0", - "resolved": "https://registry.npmjs.org/@jimp/plugin-scale/-/plugin-scale-0.5.0.tgz", - "integrity": "sha512-5InIOr3cNtrS5aQ/uaosNf28qLLc0InpNGKFmGFTv8oqZqLch6PtDTjDBZ1GGWsPdA/ljy4Qyy7mJO1QBmgQeQ==", + "ansi-escapes": { + "version": "4.3.1", + "resolved": "https://registry.npmjs.org/ansi-escapes/-/ansi-escapes-4.3.1.tgz", + "integrity": "sha512-JWF7ocqNrp8u9oqpgV+wH5ftbt+cfvv+PTjOvKLT3AdYly/LmORARfEVT1iyjwN+4MqE5UmVKoAdIBqeoCHgLA==", + "dev": true, "requires": { - "@jimp/utils": "^0.5.0", - "core-js": "^2.5.7" - } - }, - "@jimp/plugins": { - "version": "0.5.5", - "resolved": "https://registry.npmjs.org/@jimp/plugins/-/plugins-0.5.5.tgz", - "integrity": "sha512-9oF6LbSM/K7YkFCcxaPaD8NUkL/ZY8vT8NIGfQ/NpX+tKQtcsLHcRavHpUC+M1xXShv/QGx9OdBV/jgiu82QYg==", - "requires": { - "@jimp/plugin-blit": "^0.5.4", - "@jimp/plugin-blur": "^0.5.0", - "@jimp/plugin-color": "^0.5.5", - "@jimp/plugin-contain": "^0.5.4", - "@jimp/plugin-cover": "^0.5.4", - "@jimp/plugin-crop": "^0.5.4", - "@jimp/plugin-displace": "^0.5.0", - "@jimp/plugin-dither": "^0.5.0", - "@jimp/plugin-flip": "^0.5.0", - "@jimp/plugin-gaussian": "^0.5.0", - "@jimp/plugin-invert": "^0.5.0", - "@jimp/plugin-mask": "^0.5.4", - "@jimp/plugin-normalize": "^0.5.4", - "@jimp/plugin-print": "^0.5.4", - "@jimp/plugin-resize": "^0.5.4", - "@jimp/plugin-rotate": "^0.5.4", - "@jimp/plugin-scale": "^0.5.0", - "core-js": "^2.5.7", - "timm": "^1.6.1" - } - }, - "@jimp/png": { - "version": "0.5.4", - "resolved": "https://registry.npmjs.org/@jimp/png/-/png-0.5.4.tgz", - "integrity": "sha512-J2NU7368zihF1HUZdmpXsL/Hhyf+I3ubmK+6Uz3Uoyvtk1VS7dO3L0io6fJQutfWmPZ4bvu6Ry022oHjbi6QCA==", - "requires": { - "@jimp/utils": "^0.5.0", - "core-js": "^2.5.7", - "pngjs": "^3.3.3" - } - }, - "@jimp/tiff": { - "version": "0.5.4", - "resolved": "https://registry.npmjs.org/@jimp/tiff/-/tiff-0.5.4.tgz", - "integrity": "sha512-hr7Zq3eWjAZ+itSwuAObIWMRNv7oHVM3xuEDC2ouP7HfE7woBtyhCyfA7u12KlgtM57gKWeogXqTlewRGVzx6g==", - "requires": { - "core-js": "^2.5.7", - "utif": "^2.0.1" - } - }, - "@jimp/types": { - "version": "0.5.4", - "resolved": "https://registry.npmjs.org/@jimp/types/-/types-0.5.4.tgz", - "integrity": "sha512-nbZXM6TsdpnYHIBd8ZuoxGpvmxc2SqiggY30/bhOP/VJQoDBzm2v/20Ywz5M0snpIK2SdYG52eZPNjfjqUP39w==", - "requires": { - "@jimp/bmp": "^0.5.4", - "@jimp/gif": "^0.5.0", - "@jimp/jpeg": "^0.5.4", - "@jimp/png": "^0.5.4", - "@jimp/tiff": "^0.5.4", - "core-js": "^2.5.7", - "timm": "^1.6.1" - } - }, - "@jimp/utils": { - "version": "0.5.0", - "resolved": "https://registry.npmjs.org/@jimp/utils/-/utils-0.5.0.tgz", - "integrity": "sha512-7H9RFVU+Li2XmEko0GGyzy7m7JjSc7qa+m8l3fUzYg2GtwASApjKF/LSG2AUQCUmDKFLdfIEVjxvKvZUJFEmpw==", - "requires": { - "core-js": "^2.5.7" + "type-fest": "^0.11.0" + }, + "dependencies": { + "type-fest": { + "version": "0.11.0", + "resolved": "https://registry.npmjs.org/type-fest/-/type-fest-0.11.0.tgz", + "integrity": "sha512-OdjXJxnCN1AvyLSzeKIgXTXxV+99ZuXl3Hpo9XpJAv9MBcHrrJOQ5kV7ypXOuQie+AmWG25hLbiKdwYTifzcfQ==", + "dev": true + } } }, - "@types/chai": { - "version": "4.1.7", - "resolved": "https://registry.npmjs.org/@types/chai/-/chai-4.1.7.tgz", - "integrity": "sha512-2Y8uPt0/jwjhQ6EiluT0XCri1Dbplr0ZxfFXUz+ye13gaqE8u5gL5ppao1JrUYr9cIip5S6MvQzBS7Kke7U9VA==", - "dev": true - }, - "@types/debug": { - "version": "0.0.31", - "resolved": "https://registry.npmjs.org/@types/debug/-/debug-0.0.31.tgz", - "integrity": "sha512-LS1MCPaQKqspg7FvexuhmDbWUhE2yIJ+4AgVIyObfc06/UKZ8REgxGNjZc82wPLWmbeOm7S+gSsLgo75TanG4A==", + "ansi-regex": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-5.0.0.tgz", + "integrity": "sha512-bY6fj56OUQ0hU1KjFNDQuJFezqKdrAyFdIevADiqrWHwSlbmBNMHp5ak2f40Pm8JTFyM2mqxkG6ngkHO11f/lg==", "dev": true }, - "@types/ip": { - "version": "0.0.31", - "resolved": "https://registry.npmjs.org/@types/ip/-/ip-0.0.31.tgz", - "integrity": "sha512-oYk8aalgfCt7XfEu66Sjwz/aQjfRtQkjNSXwrUGqyRoQbOymAc156fUNTwn1cSCEEwuPPzMy7fGPmKcFLoaIkA==", + "ansi-styles": { + "version": "3.2.1", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-3.2.1.tgz", + "integrity": "sha512-VT0ZI6kZRdTh8YyJw3SMbYm/u+NqfsAxEpWO0Pf9sq8/e94WxxOpPKx9FR1FlyCtOVDNOQ+8ntlqFxiRc+r5qA==", "dev": true, "requires": { - "@types/node": "*" + "color-convert": "^1.9.0" } }, - "@types/mocha": { - "version": "5.2.5", - "resolved": "https://registry.npmjs.org/@types/mocha/-/mocha-5.2.5.tgz", - "integrity": "sha512-lAVp+Kj54ui/vLUFxsJTMtWvZraZxum3w3Nwkble2dNuV5VnPA+Mi2oGX9XYJAaIvZi3tn3cbjS/qcJXRb6Bww==", - "dev": true - }, - "@types/node": { - "version": "10.12.4", - "resolved": "https://registry.npmjs.org/@types/node/-/node-10.12.4.tgz", - "integrity": "sha512-0aFZiYCvoxyKP/Mg6PvqBb2UtWGIPf63r6rOAvRBrgyJOfanbL60yUH2U4FSpg+Yn6FW+JVYWtzn6hLTy745Fg==", - "dev": true - }, - "@types/sharp": { - "version": "0.21.0", - "resolved": "https://registry.npmjs.org/@types/sharp/-/sharp-0.21.0.tgz", - "integrity": "sha512-BmsCha5/lx2Afz2zwNo9F2txlkZ9HQf49N94lzSFmj5Oc7NfRMZguwVIhytb65qdY2zNF+azovzDNso6JUZpOw==", + "anymatch": { + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/anymatch/-/anymatch-3.1.1.tgz", + "integrity": "sha512-mM8522psRCqzV+6LhomX5wgp25YVibjh8Wj23I5RPkPppSVSjyKD2A2mBJmWGa+KN7f2D6LNh9jkBCeyLktzjg==", "dev": true, "requires": { - "@types/node": "*" + "normalize-path": "^3.0.0", + "picomatch": "^2.0.4" } }, - "acorn": { - "version": "5.7.3", - "resolved": "https://registry.npmjs.org/acorn/-/acorn-5.7.3.tgz", - "integrity": "sha512-T/zvzYRfbVojPWahDsE5evJdHb3oJoQfFbsrKM7w5Zcs++Tr257tia3BmMP8XYVjp1S9RZXQMh7gao96BlqZOw==", - "dev": true - }, - "ansi-regex": { - "version": "2.1.1", - "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-2.1.1.tgz", - "integrity": "sha1-w7M6te42DYbg5ijwRorn7yfWVN8=", - "dev": true - }, - "ansi-styles": { - "version": "2.2.1", - "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-2.2.1.tgz", - "integrity": "sha1-tDLdM1i2NM914eRmQ2gkBTPB3b4=", + "arg": { + "version": "4.1.3", + "resolved": "https://registry.npmjs.org/arg/-/arg-4.1.3.tgz", + "integrity": "sha512-58S9QDqG0Xx27YwPSt9fJxivjYl432YCwfDMfZ+71RAqUrZef7LrKQZ3LHLOwCS4FLNBplP533Zx895SeOCHvA==", "dev": true }, - "any-base": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/any-base/-/any-base-1.1.0.tgz", - "integrity": "sha512-uMgjozySS8adZZYePpaWs8cxB9/kdzmpX6SgJZ+wbz1K5eYk5QMYDVJaZKhxyIHUdnnJkfR7SVgStgH7LkGUyg==" - }, "argparse": { "version": "1.0.10", "resolved": "https://registry.npmjs.org/argparse/-/argparse-1.0.10.tgz", @@ -366,22 +270,23 @@ "sprintf-js": "~1.0.2" } }, - "array-flatten": { - "version": "2.1.1", - "resolved": "https://registry.npmjs.org/array-flatten/-/array-flatten-2.1.1.tgz", - "integrity": "sha1-Qmu52oQJDBg42BLIFQryCoMx4pY=", + "array-filter": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/array-filter/-/array-filter-1.0.0.tgz", + "integrity": "sha1-uveeYubvTCpMC4MSMtr/7CUfnYM=", "dev": true }, - "arrify": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/arrify/-/arrify-1.0.1.tgz", - "integrity": "sha1-iYUI2iIm84DfkEcoRWhJwVAaSw0=", + "array-flatten": { + "version": "2.1.2", + "resolved": "https://registry.npmjs.org/array-flatten/-/array-flatten-2.1.2.tgz", + "integrity": "sha512-hNfzcOV8W4NdualtqBFPyVO+54DSJuZGY9qT4pRroB6S9e3iiido2ISIC5h9R2sPJ8H3FHCIiEnsv1lPXO3KtQ==", "dev": true }, - "assertion-error": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/assertion-error/-/assertion-error-1.1.0.tgz", - "integrity": "sha512-jgsaNduz+ndvGyFt3uSuWqvy4lCnIJiovtouQN5JZHOKCS2QuhEdbcQHFhVksz2N2U9hXJo8odG7ETyWlEeuDw==" + "astral-regex": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/astral-regex/-/astral-regex-1.0.0.tgz", + "integrity": "sha512-+Ryf6g3BKoRc7jfp7ad8tM4TtMiaWvbF/1/sQcZPkkS7ag3D5nMBCe2UfOTONtAkaG0tO0ij3C5Lwmf1EiyjHg==", + "dev": true }, "async-wait-until": { "version": "1.2.4", @@ -389,15 +294,13 @@ "integrity": "sha512-H7ZR3cu1THxrJiDgevu+PgbyT0o5P/9nsCZj70ckruJCMWt/UOQmGo65wKWvEQN69MJk140x5/Z01ZQjzfwyOw==", "dev": true }, - "babel-code-frame": { - "version": "6.26.0", - "resolved": "https://registry.npmjs.org/babel-code-frame/-/babel-code-frame-6.26.0.tgz", - "integrity": "sha1-Y/1D99weO7fONZR9uP42mj9Yx0s=", + "available-typed-arrays": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/available-typed-arrays/-/available-typed-arrays-1.0.2.tgz", + "integrity": "sha512-XWX3OX8Onv97LMk/ftVyBibpGwY5a8SmuxZPzeOxqmuEqUCOM9ZE+uIaD1VNJ5QnvU2UQusvmKbuM1FR8QWGfQ==", "dev": true, "requires": { - "chalk": "^1.1.3", - "esutils": "^2.0.2", - "js-tokens": "^3.0.2" + "array-filter": "^1.0.0" } }, "balanced-match": { @@ -406,36 +309,93 @@ "integrity": "sha1-ibTRmasr7kneFk6gK4nORi1xt2c=", "dev": true }, - "base64-js": { - "version": "1.3.0", - "resolved": "https://registry.npmjs.org/base64-js/-/base64-js-1.3.0.tgz", - "integrity": "sha512-ccav/yGvoa80BQDljCxsmmQ3Xvx60/UpBIij5QN21W3wBi/hhIC9OoO+KLpu9IJTS9j4DRVJ3aDDF9cMSoa2lw==" - }, - "bindings": { - "version": "1.3.0", - "resolved": "https://registry.npmjs.org/bindings/-/bindings-1.3.0.tgz", - "integrity": "sha512-DpLh5EzMR2kzvX1KIlVC0VkC3iZtHKTgdtZ0a3pglBZdaQFjt5S9g9xd1lE+YvXyfd6mtCeRnrUfOLYiTMlNSw==", + "binary-extensions": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/binary-extensions/-/binary-extensions-2.0.0.tgz", + "integrity": "sha512-Phlt0plgpIIBOGTT/ehfFnbNlfsDEiqmzE2KRXoX1bLIlir4X/MR+zSyBEkL05ffWgnRSf/DXv+WrUAVr93/ow==", "dev": true }, - "bmp-js": { - "version": "0.1.0", - "resolved": "https://registry.npmjs.org/bmp-js/-/bmp-js-0.1.0.tgz", - "integrity": "sha1-4Fpj95amwf8l9Hcex62twUjAcjM=" - }, "bonjour-hap": { - "version": "3.5.1", - "resolved": "https://registry.npmjs.org/bonjour-hap/-/bonjour-hap-3.5.1.tgz", - "integrity": "sha512-JqJXX5+i1NRGt8GyIPb+nBNjwrHbWe5Pb+HSuRMG/B62tPRHQ4Jyv3yX7hy1pHfRrV2OhnWpd+ljBtMb24R5rA==", + "version": "3.5.10", + "resolved": "https://registry.npmjs.org/bonjour-hap/-/bonjour-hap-3.5.10.tgz", + "integrity": "sha512-vaqa4uUST8K5rj9QGe6GaSJ+6rQ24KzgkjdyZvoTpbKBti5xL/m8H9Dp9VmPdo434OAetqU5PKAn5izucrKEBA==", "dev": true, "requires": { - "array-flatten": "^2.1.0", - "deep-equal": "^1.0.1", - "dns-equal": "^1.0.0", - "dns-txt": "^2.0.2", - "multicast-dns": "^6.0.1", + "array-flatten": "^2.1.2", + "deep-equal": "^2.0.2", + "ip": "^1.1.5", + "multicast-dns": "^7.2.2", "multicast-dns-service-types": "^1.1.0" } }, + "boxen": { + "version": "4.2.0", + "resolved": "https://registry.npmjs.org/boxen/-/boxen-4.2.0.tgz", + "integrity": "sha512-eB4uT9RGzg2odpER62bBwSLvUeGC+WbRjjyyFhGsKnc8wp/m0+hQsMUvUe3H2V0D5vw0nBdO1hCJoZo5mKeuIQ==", + "dev": true, + "requires": { + "ansi-align": "^3.0.0", + "camelcase": "^5.3.1", + "chalk": "^3.0.0", + "cli-boxes": "^2.2.0", + "string-width": "^4.1.0", + "term-size": "^2.1.0", + "type-fest": "^0.8.1", + "widest-line": "^3.1.0" + }, + "dependencies": { + "ansi-styles": { + "version": "4.2.1", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.2.1.tgz", + "integrity": "sha512-9VGjrMsG1vePxcSweQsN20KY/c4zN0h9fLjqAbwbPfahM3t+NL+M9HC8xeXG2I8pX5NoamTGNuomEUFI7fcUjA==", + "dev": true, + "requires": { + "@types/color-name": "^1.1.1", + "color-convert": "^2.0.1" + } + }, + "chalk": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-3.0.0.tgz", + "integrity": "sha512-4D3B6Wf41KOYRFdszmDqMCGq5VV/uMAB273JILmO+3jAlh8X4qDtdtgCR3fxtbLEMzSx22QdhnDcJvu2u1fVwg==", + "dev": true, + "requires": { + "ansi-styles": "^4.1.0", + "supports-color": "^7.1.0" + } + }, + "color-convert": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz", + "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==", + "dev": true, + "requires": { + "color-name": "~1.1.4" + } + }, + "color-name": { + "version": "1.1.4", + "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz", + "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==", + "dev": true + }, + "has-flag": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz", + "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==", + "dev": true + }, + "supports-color": { + "version": "7.1.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.1.0.tgz", + "integrity": "sha512-oRSIpR8pxT1Wr2FquTNnGet79b3BWljqOuoW/h4oBhxJ/HUbX5nX6JSruTkvXDCFMwDPvsaTTbvMLKZWSy0R5g==", + "dev": true, + "requires": { + "has-flag": "^4.0.0" + } + } + } + }, "brace-expansion": { "version": "1.1.11", "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.11.tgz", @@ -446,86 +406,139 @@ "concat-map": "0.0.1" } }, - "browser-stdout": { - "version": "1.3.1", - "resolved": "https://registry.npmjs.org/browser-stdout/-/browser-stdout-1.3.1.tgz", - "integrity": "sha512-qhAVI1+Av2X7qelOfAIYwXONood6XlZE/fXaBSmW/T5SzLAmCgzi+eiWE7fUvbHaeNBQH13UftjpXxsfLkMpgw==", - "dev": true - }, - "buffer": { - "version": "5.2.1", - "resolved": "https://registry.npmjs.org/buffer/-/buffer-5.2.1.tgz", - "integrity": "sha512-c+Ko0loDaFfuPWiL02ls9Xd3GO3cPVmUobQ6t3rXNUk304u6hGq+8N/kFi+QEIKhzK3uwolVhLzszmfLmMLnqg==", + "braces": { + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/braces/-/braces-3.0.2.tgz", + "integrity": "sha512-b8um+L1RzM3WDSzvhm6gIz1yfTbBt6YTlcEKAvsmqCZZFw46z626lVj9j1yEPW33H5H+lBQpZMP1k8l+78Ha0A==", + "dev": true, "requires": { - "base64-js": "^1.0.2", - "ieee754": "^1.1.4" + "fill-range": "^7.0.1" } }, - "buffer-equal": { - "version": "0.0.1", - "resolved": "https://registry.npmjs.org/buffer-equal/-/buffer-equal-0.0.1.tgz", - "integrity": "sha1-kbx0sR6kBbyRa8aqkI+q+ltKrEs=" - }, "buffer-from": { "version": "1.1.1", "resolved": "https://registry.npmjs.org/buffer-from/-/buffer-from-1.1.1.tgz", "integrity": "sha512-MQcXEUbCKtEo7bhqEs6560Hyd4XaovZlO/k9V3hjVUF/zwW7KBVdSK4gIt/bzwS9MbR5qob+F5jusZsb0YQK2A==", "dev": true }, - "buffer-indexof": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/buffer-indexof/-/buffer-indexof-1.1.1.tgz", - "integrity": "sha512-4/rOEg86jivtPTeOUUT61jJO1Ya1TrR/OkqCSZDyq84WJh3LuuiphBYJN+fm5xufIk4XAFcEwte/8WzC8If/1g==", - "dev": true + "cacheable-request": { + "version": "6.1.0", + "resolved": "https://registry.npmjs.org/cacheable-request/-/cacheable-request-6.1.0.tgz", + "integrity": "sha512-Oj3cAGPCqOZX7Rz64Uny2GYAZNliQSqfbePrgAQ1wKAihYmCUnraBtJtKcGR4xz7wF+LoJC+ssFZvv5BgF9Igg==", + "dev": true, + "requires": { + "clone-response": "^1.0.2", + "get-stream": "^5.1.0", + "http-cache-semantics": "^4.0.0", + "keyv": "^3.0.0", + "lowercase-keys": "^2.0.0", + "normalize-url": "^4.1.0", + "responselike": "^1.0.2" + }, + "dependencies": { + "get-stream": { + "version": "5.1.0", + "resolved": "https://registry.npmjs.org/get-stream/-/get-stream-5.1.0.tgz", + "integrity": "sha512-EXr1FOzrzTfGeL0gQdeFEvOMm2mzMOglyiOXSTpPC+iAjAKftbr3jpCMWynogwYnM+eSj9sHGc6wjIcDvYiygw==", + "dev": true, + "requires": { + "pump": "^3.0.0" + } + }, + "lowercase-keys": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/lowercase-keys/-/lowercase-keys-2.0.0.tgz", + "integrity": "sha512-tqNXrS78oMOE73NMxK4EMLQsQowWf8jKooH9g7xPavRT706R6bkQJ6DY2Te7QukaZsulxa30wQ7bk0pm4XiHmA==", + "dev": true + } + } }, - "buffer-shims": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/buffer-shims/-/buffer-shims-1.0.0.tgz", - "integrity": "sha1-mXjOMXOIxkmth5MCjDR37wRKi1E=", + "callsites": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/callsites/-/callsites-3.1.0.tgz", + "integrity": "sha512-P8BjAsXvZS+VIDUI11hHCQEv74YT67YUi5JJFNWIqL235sBmjX4+qx9Muvls5ivyNENctx46xQLQ3aTuE7ssaQ==", "dev": true }, - "builtin-modules": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/builtin-modules/-/builtin-modules-1.1.1.tgz", - "integrity": "sha1-Jw8HbFpywC9bZaR9+Uxf46J4iS8=", + "camelcase": { + "version": "5.3.1", + "resolved": "https://registry.npmjs.org/camelcase/-/camelcase-5.3.1.tgz", + "integrity": "sha512-L28STB170nwWS63UjtlEOE3dldQApaJXZkOI1uMFfzf3rRuPegHaHesyee+YxQ+W6SvRDQV6UrdOdRiR153wJg==", "dev": true }, - "chai": { - "version": "4.2.0", - "resolved": "https://registry.npmjs.org/chai/-/chai-4.2.0.tgz", - "integrity": "sha512-XQU3bhBukrOsQCuwZndwGcCVQHyZi53fQ6Ys1Fym7E4olpIqqZZhhoFJoaKVvV17lWQoXYwgWN2nF5crA8J2jw==", - "requires": { - "assertion-error": "^1.1.0", - "check-error": "^1.0.2", - "deep-eql": "^3.0.1", - "get-func-name": "^2.0.0", - "pathval": "^1.1.0", - "type-detect": "^4.0.5" - } - }, "chalk": { - "version": "1.1.3", - "resolved": "http://registry.npmjs.org/chalk/-/chalk-1.1.3.tgz", - "integrity": "sha1-qBFcVeSnAv5NFQq9OHKCKn4J/Jg=", + "version": "2.4.2", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-2.4.2.tgz", + "integrity": "sha512-Mti+f9lpJNcwF4tWV8/OrTTtF1gZi+f8FqlyAdouralcFWFQWF2+NgCHShjkCb+IFBLq9buZwE1xckQU4peSuQ==", "dev": true, "requires": { - "ansi-styles": "^2.2.1", - "escape-string-regexp": "^1.0.2", - "has-ansi": "^2.0.0", - "strip-ansi": "^3.0.0", - "supports-color": "^2.0.0" + "ansi-styles": "^3.2.1", + "escape-string-regexp": "^1.0.5", + "supports-color": "^5.3.0" } }, - "check-error": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/check-error/-/check-error-1.0.2.tgz", - "integrity": "sha1-V00xLt2Iu13YkS6Sht1sCu1KrII=" + "chardet": { + "version": "0.7.0", + "resolved": "https://registry.npmjs.org/chardet/-/chardet-0.7.0.tgz", + "integrity": "sha512-mT8iDcrh03qDGRRmoA2hmBJnxpllMR+0/0qlzjqZES6NdiWDcZkCNAk4rPFZ9Q85r27unkiNNg8ZOiwZXBHwcA==", + "dev": true }, "child_process": { "version": "1.0.2", "resolved": "https://registry.npmjs.org/child_process/-/child_process-1.0.2.tgz", "integrity": "sha1-sffn/HPSXn/R1FWtyU4UODAYK1o=" }, + "chokidar": { + "version": "3.4.0", + "resolved": "https://registry.npmjs.org/chokidar/-/chokidar-3.4.0.tgz", + "integrity": "sha512-aXAaho2VJtisB/1fg1+3nlLJqGOuewTzQpd/Tz0yTg2R0e4IGtshYvtjowyEumcBv2z+y4+kc75Mz7j5xJskcQ==", + "dev": true, + "requires": { + "anymatch": "~3.1.1", + "braces": "~3.0.2", + "fsevents": "~2.1.2", + "glob-parent": "~5.1.0", + "is-binary-path": "~2.1.0", + "is-glob": "~4.0.1", + "normalize-path": "~3.0.0", + "readdirp": "~3.4.0" + } + }, + "ci-info": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/ci-info/-/ci-info-2.0.0.tgz", + "integrity": "sha512-5tK7EtrZ0N+OLFMthtqOj4fI2Jeb88C4CAZPu25LDVUgXJ0A3Js4PMGqrn0JU1W0Mh1/Z8wZzYPxqUrXeBboCQ==", + "dev": true + }, + "cli-boxes": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/cli-boxes/-/cli-boxes-2.2.0.tgz", + "integrity": "sha512-gpaBrMAizVEANOpfZp/EEUixTXDyGt7DFzdK5hU+UbWt/J0lB0w20ncZj59Z9a93xHb9u12zF5BS6i9RKbtg4w==", + "dev": true + }, + "cli-cursor": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/cli-cursor/-/cli-cursor-3.1.0.tgz", + "integrity": "sha512-I/zHAwsKf9FqGoXM4WWRACob9+SNukZTd94DWF57E4toouRulbCxcUh6RKUEOQlYTHJnzkPMySvPNaaSLNfLZw==", + "dev": true, + "requires": { + "restore-cursor": "^3.1.0" + } + }, + "cli-width": { + "version": "2.2.1", + "resolved": "https://registry.npmjs.org/cli-width/-/cli-width-2.2.1.tgz", + "integrity": "sha512-GRMWDxpOB6Dgk2E5Uo+3eEBvtOOlimMmpbFiKuLFnQzYDavtLFY3K5ona41jgN/WdRZtG7utuVSVTL4HbZHGkw==", + "dev": true + }, + "clone-response": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/clone-response/-/clone-response-1.0.2.tgz", + "integrity": "sha1-0dyXOSAxTfZ/vrlCI7TuNQI56Ws=", + "dev": true, + "requires": { + "mimic-response": "^1.0.0" + } + }, "color-convert": { "version": "1.9.3", "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-1.9.3.tgz", @@ -542,13 +555,10 @@ "dev": true }, "commander": { - "version": "2.8.1", - "resolved": "http://registry.npmjs.org/commander/-/commander-2.8.1.tgz", - "integrity": "sha1-Br42f+v9oMMwqh4qBy09yXYkJdQ=", - "dev": true, - "requires": { - "graceful-readlink": ">= 1.0.0" - } + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/commander/-/commander-5.0.0.tgz", + "integrity": "sha512-JrDGPAKjMGSP1G0DUoaceEJ3DZgAfr/q6X7FVk4+U5KxUSKviYGM2k6zWkfyyBHy5rAtzgYJFa1ro2O9PtoxwQ==", + "dev": true }, "concat-map": { "version": "0.0.1", @@ -556,179 +566,514 @@ "integrity": "sha1-2Klr13/Wjfd5OnMDajug1UBdR3s=", "dev": true }, - "core-js": { - "version": "2.5.7", - "resolved": "https://registry.npmjs.org/core-js/-/core-js-2.5.7.tgz", - "integrity": "sha512-RszJCAxg/PP6uzXVXL6BsxSXx/B05oJAQ2vkJRjyjrEcNVycaqOmNb5OTxZPE3xa5gwZduqza6L9JOCenh/Ecw==" - }, - "core-util-is": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/core-util-is/-/core-util-is-1.0.2.tgz", - "integrity": "sha1-tf1UIgqivFq1eqtxQMlAdUUDwac=", - "dev": true + "configstore": { + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/configstore/-/configstore-5.0.1.tgz", + "integrity": "sha512-aMKprgk5YhBNyH25hj8wGt2+D52Sw1DRRIzqBwLp2Ya9mFmY8KPvvtvmna8SxVR9JMZ4kzMD68N22vlaRpkeFA==", + "dev": true, + "requires": { + "dot-prop": "^5.2.0", + "graceful-fs": "^4.1.2", + "make-dir": "^3.0.0", + "unique-string": "^2.0.0", + "write-file-atomic": "^3.0.0", + "xdg-basedir": "^4.0.0" + } }, - "curve25519-n": { - "version": "1.4.0", - "resolved": "https://registry.npmjs.org/curve25519-n/-/curve25519-n-1.4.0.tgz", - "integrity": "sha512-ihQ3M/Aj9PVbsNwuul1/PNnyFurl9ejZGJWw/361+SS9hEFLiM2ttde+BXiu3ooc4AQiIx2y1gEcGLTpLRAjKg==", + "cross-spawn": { + "version": "6.0.5", + "resolved": "https://registry.npmjs.org/cross-spawn/-/cross-spawn-6.0.5.tgz", + "integrity": "sha512-eTVLrBSt7fjbDygz805pMnstIs2VTBNkRm0qxZd+M7A5XDdxVRWO5MxGBXZhjY4cqLYLdtrGqRf8mBPmzwSpWQ==", "dev": true, "requires": { - "bindings": "~1.3.0", - "nan": "^2.10.0" + "nice-try": "^1.0.4", + "path-key": "^2.0.1", + "semver": "^5.5.0", + "shebang-command": "^1.2.0", + "which": "^1.2.9" + }, + "dependencies": { + "semver": { + "version": "5.7.1", + "resolved": "https://registry.npmjs.org/semver/-/semver-5.7.1.tgz", + "integrity": "sha512-sauaDf/PZdVgrLTNYHRtpXa1iRiKcaebiKQ1BJdpQlWH2lCvexQdX55snPFyK7QzpudqbCI0qXFfOasHdyNDGQ==", + "dev": true + } } }, + "crypto-random-string": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/crypto-random-string/-/crypto-random-string-2.0.0.tgz", + "integrity": "sha512-v1plID3y9r/lPhviJ1wrXpLeyUIGAZ2SHNYTEapm7/8A9nLPoyvVp3RK/EPFqn5kEznyWgYZNsRtYYIWbuG8KA==", + "dev": true + }, "debug": { - "version": "2.6.9", - "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz", - "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==", + "version": "4.1.1", + "resolved": "https://registry.npmjs.org/debug/-/debug-4.1.1.tgz", + "integrity": "sha512-pYAIzeRo8J6KPEaJ0VWOh5Pzkbw/RetuzehGM7QRRX5he4fPHx2rdKMB256ehJCkX+XRQm16eZLqLNS8RSZXZw==", "dev": true, "requires": { - "ms": "2.0.0" + "ms": "^2.1.1" } }, "decimal.js": { - "version": "7.5.1", - "resolved": "https://registry.npmjs.org/decimal.js/-/decimal.js-7.5.1.tgz", - "integrity": "sha512-1K5Y6MykxQYfHBcFfAj2uBaLmwreq4MsjsvrlgcEOvg+X82IeeXlIVIVkBMiypksu+yo9vcYP6lfU3qTedofSQ==", + "version": "10.2.0", + "resolved": "https://registry.npmjs.org/decimal.js/-/decimal.js-10.2.0.tgz", + "integrity": "sha512-vDPw+rDgn3bZe1+F/pyEwb1oMG2XTlRVgAa6B4KccTEpYgF8w6eQllVbQcfIJnZyvzFtFpxnpGtx8dd7DJp/Rw==", "dev": true }, - "deep-eql": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/deep-eql/-/deep-eql-3.0.1.tgz", - "integrity": "sha512-+QeIQyN5ZuO+3Uk5DYh6/1eKO0m0YmJFGNmFHGACpf1ClL1nmlV/p4gNgbl2pJGxgXb4faqo6UE+M5ACEMyVcw==", + "decompress-response": { + "version": "3.3.0", + "resolved": "https://registry.npmjs.org/decompress-response/-/decompress-response-3.3.0.tgz", + "integrity": "sha1-gKTdMjdIOEv6JICDYirt7Jgq3/M=", + "dev": true, "requires": { - "type-detect": "^4.0.0" + "mimic-response": "^1.0.0" } }, "deep-equal": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/deep-equal/-/deep-equal-1.0.1.tgz", - "integrity": "sha1-9dJgKStmDghO/0zbyfCK0yR0SLU=" - }, - "diff": { - "version": "3.5.0", - "resolved": "https://registry.npmjs.org/diff/-/diff-3.5.0.tgz", - "integrity": "sha512-A46qtFgd+g7pDZinpnwiRJtxbC1hpgf0uzP3iG89scHk0AUC7A1TGxf5OiiOUv/JMZR8GOt8hL900hV0bOy5xA==", + "version": "2.0.3", + "resolved": "https://registry.npmjs.org/deep-equal/-/deep-equal-2.0.3.tgz", + "integrity": "sha512-Spqdl4H+ky45I9ByyJtXteOm9CaIrPmnIPmOhrkKGNYWeDgCvJ8jNYVCTjChxW4FqGuZnLHADc8EKRMX6+CgvA==", + "dev": true, + "requires": { + "es-abstract": "^1.17.5", + "es-get-iterator": "^1.1.0", + "is-arguments": "^1.0.4", + "is-date-object": "^1.0.2", + "is-regex": "^1.0.5", + "isarray": "^2.0.5", + "object-is": "^1.1.2", + "object-keys": "^1.1.1", + "object.assign": "^4.1.0", + "regexp.prototype.flags": "^1.3.0", + "side-channel": "^1.0.2", + "which-boxed-primitive": "^1.0.1", + "which-collection": "^1.0.1", + "which-typed-array": "^1.1.2" + } + }, + "deep-extend": { + "version": "0.6.0", + "resolved": "https://registry.npmjs.org/deep-extend/-/deep-extend-0.6.0.tgz", + "integrity": "sha512-LOHxIOaPYdHlJRtCQfDIVZtfw/ufM8+rVj649RIHzcm/vGwQRXFt6OPqIFWsm2XEMrNIEtWR64sY1LEKD2vAOA==", "dev": true }, - "dns-equal": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/dns-equal/-/dns-equal-1.0.0.tgz", - "integrity": "sha1-s55/HabrCnW6nBcySzR1PEfgZU0=", + "deep-is": { + "version": "0.1.3", + "resolved": "https://registry.npmjs.org/deep-is/-/deep-is-0.1.3.tgz", + "integrity": "sha1-s2nW+128E+7PUk+RsHD+7cNXzzQ=", "dev": true }, - "dns-packet": { - "version": "1.3.1", - "resolved": "https://registry.npmjs.org/dns-packet/-/dns-packet-1.3.1.tgz", - "integrity": "sha512-0UxfQkMhYAUaZI+xrNZOz/as5KgDU0M/fQ9b6SpkyLbk3GEswDi6PADJVaYJradtRVsRIlF1zLyOodbcTCDzUg==", - "dev": true, - "requires": { - "ip": "^1.1.0", - "safe-buffer": "^5.0.1" - } + "defer-to-connect": { + "version": "1.1.3", + "resolved": "https://registry.npmjs.org/defer-to-connect/-/defer-to-connect-1.1.3.tgz", + "integrity": "sha512-0ISdNousHvZT2EiFlZeZAHBUvSxmKswVCEf8hW7KWgG4a8MVEu/3Vb6uWYozkjylyCxe0JBIiRB1jV45S70WVQ==", + "dev": true }, - "dns-txt": { - "version": "2.0.2", - "resolved": "https://registry.npmjs.org/dns-txt/-/dns-txt-2.0.2.tgz", - "integrity": "sha1-uR2Ab10nGI5Ks+fRB9iBocxGQrY=", + "define-properties": { + "version": "1.1.3", + "resolved": "https://registry.npmjs.org/define-properties/-/define-properties-1.1.3.tgz", + "integrity": "sha512-3MqfYKj2lLzdMSf8ZIZE/V+Zuy+BgD6f164e8K2w7dgnpKArBDerGYpM46IYYcjnkdPNMjPk9A6VFB8+3SKlXQ==", "dev": true, "requires": { - "buffer-indexof": "^1.0.0" + "object-keys": "^1.0.12" } }, - "dom-walk": { - "version": "0.1.1", - "resolved": "https://registry.npmjs.org/dom-walk/-/dom-walk-0.1.1.tgz", - "integrity": "sha1-ZyIm3HTI95mtNTB9+TaroRrNYBg=" + "diff": { + "version": "4.0.2", + "resolved": "https://registry.npmjs.org/diff/-/diff-4.0.2.tgz", + "integrity": "sha512-58lmxKSA4BNyLz+HHMUzlOEpg09FV+ev6ZMe3vJihgdxzgcwZ8VoEEPmALCZG9LmqfVoNMMKpttIYTVG6uDY7A==", + "dev": true }, - "ed25519-hap": { - "version": "0.0.5", - "resolved": "https://registry.npmjs.org/ed25519-hap/-/ed25519-hap-0.0.5.tgz", - "integrity": "sha512-6RPUW9BdnUjYz5lGjRfM0sOMa8d43sjWFFchGJhGKkevoZvB0oVp1ES9oDUK+QJoJO8EoJlgawNsxG2yvlMbYg==", + "dns-packet": { + "version": "4.2.0", + "resolved": "https://registry.npmjs.org/dns-packet/-/dns-packet-4.2.0.tgz", + "integrity": "sha512-bn1AKpfkFbm0MIioOMHZ5qJzl2uypdBwI4nYNsqvhjsegBhcKJUlCrMPWLx6JEezRjxZmxhtIz/FkBEur2l8Cw==", "dev": true, "requires": { - "bindings": "^1.2.1", - "nan": "^2.10.0" + "ip": "^1.1.5", + "safe-buffer": "^5.1.1" } }, - "enhanced-resolve": { - "version": "2.3.0", - "resolved": "https://registry.npmjs.org/enhanced-resolve/-/enhanced-resolve-2.3.0.tgz", - "integrity": "sha1-oRXDJQS2MC6Fp2Jp16V8zdli41k=", + "doctrine": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/doctrine/-/doctrine-3.0.0.tgz", + "integrity": "sha512-yS+Q5i3hBf7GBkd4KG8a7eBNNWNGLTaEwwYWUijIYM7zrlYDM0BFXHjjPWlWZ1Rg7UaddZeIDmi9jF3HmqiQ2w==", "dev": true, "requires": { - "graceful-fs": "^4.1.2", - "memory-fs": "^0.3.0", - "object-assign": "^4.0.1", - "tapable": "^0.2.3" + "esutils": "^2.0.2" + } + }, + "dot-prop": { + "version": "5.2.0", + "resolved": "https://registry.npmjs.org/dot-prop/-/dot-prop-5.2.0.tgz", + "integrity": "sha512-uEUyaDKoSQ1M4Oq8l45hSE26SnTxL6snNnqvK/VWx5wJhmff5z0FUVJDKDanor/6w3kzE3i7XZOk+7wC0EXr1A==", + "dev": true, + "requires": { + "is-obj": "^2.0.0" + } + }, + "duplexer3": { + "version": "0.1.4", + "resolved": "https://registry.npmjs.org/duplexer3/-/duplexer3-0.1.4.tgz", + "integrity": "sha1-7gHdHKwO08vH/b6jfcCo8c4ALOI=", + "dev": true + }, + "emoji-regex": { + "version": "8.0.0", + "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-8.0.0.tgz", + "integrity": "sha512-MSjYzcWNOA0ewAHpz0MxpYFvwg6yjy1NG3xteoqz644VCo/RPgnr1/GGt+ic3iJTzQ8Eu3TdM14SawnVUmGE6A==", + "dev": true + }, + "end-of-stream": { + "version": "1.4.4", + "resolved": "https://registry.npmjs.org/end-of-stream/-/end-of-stream-1.4.4.tgz", + "integrity": "sha512-+uw1inIHVPQoaVuHzRyXd21icM+cnt4CzD5rW+NC1wjOUSTOs+Te7FOv7AhN7vS9x/oIyhLP5PR1H+phQAHu5Q==", + "dev": true, + "requires": { + "once": "^1.4.0" + } + }, + "es-abstract": { + "version": "1.17.5", + "resolved": "https://registry.npmjs.org/es-abstract/-/es-abstract-1.17.5.tgz", + "integrity": "sha512-BR9auzDbySxOcfog0tLECW8l28eRGpDpU3Dm3Hp4q/N+VtLTmyj4EUN088XZWQDW/hzj6sYRDXeOFsaAODKvpg==", + "dev": true, + "requires": { + "es-to-primitive": "^1.2.1", + "function-bind": "^1.1.1", + "has": "^1.0.3", + "has-symbols": "^1.0.1", + "is-callable": "^1.1.5", + "is-regex": "^1.0.5", + "object-inspect": "^1.7.0", + "object-keys": "^1.1.1", + "object.assign": "^4.1.0", + "string.prototype.trimleft": "^2.1.1", + "string.prototype.trimright": "^2.1.1" + } + }, + "es-get-iterator": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/es-get-iterator/-/es-get-iterator-1.1.0.tgz", + "integrity": "sha512-UfrmHuWQlNMTs35e1ypnvikg6jCz3SK8v8ImvmDsh36fCVUR1MqoFDiyn0/k52C8NqO3YsO8Oe0azeesNuqSsQ==", + "dev": true, + "requires": { + "es-abstract": "^1.17.4", + "has-symbols": "^1.0.1", + "is-arguments": "^1.0.4", + "is-map": "^2.0.1", + "is-set": "^2.0.1", + "is-string": "^1.0.5", + "isarray": "^2.0.5" } }, - "errno": { - "version": "0.1.7", - "resolved": "https://registry.npmjs.org/errno/-/errno-0.1.7.tgz", - "integrity": "sha512-MfrRBDWzIWifgq6tJj60gkAwtLNb6sQPlcFrSOflcP1aFmmruKQ2wRnze/8V6kgyz7H3FF8Npzv78mZ7XLLflg==", + "es-to-primitive": { + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/es-to-primitive/-/es-to-primitive-1.2.1.tgz", + "integrity": "sha512-QCOllgZJtaUo9miYBcLChTUaHNjJF3PYs1VidD7AwiEj1kYxKeQTctLAezAOH5ZKRH0g2IgPn6KwB4IT8iRpvA==", "dev": true, "requires": { - "prr": "~1.0.1" + "is-callable": "^1.1.4", + "is-date-object": "^1.0.1", + "is-symbol": "^1.0.2" } }, + "escape-goat": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/escape-goat/-/escape-goat-2.1.1.tgz", + "integrity": "sha512-8/uIhbG12Csjy2JEW7D9pHbreaVaS/OpN3ycnyvElTdwM5n6GY6W6e2IPemfvGZeUMqZ9A/3GqIZMgKnBhAw/Q==", + "dev": true + }, "escape-string-regexp": { "version": "1.0.5", "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-1.0.5.tgz", "integrity": "sha1-G2HAViGQqN/2rjuyzwIAyhMLhtQ=", "dev": true }, + "eslint": { + "version": "6.8.0", + "resolved": "https://registry.npmjs.org/eslint/-/eslint-6.8.0.tgz", + "integrity": "sha512-K+Iayyo2LtyYhDSYwz5D5QdWw0hCacNzyq1Y821Xna2xSJj7cijoLLYmLxTQgcgZ9mC61nryMy9S7GRbYpI5Ig==", + "dev": true, + "requires": { + "@babel/code-frame": "^7.0.0", + "ajv": "^6.10.0", + "chalk": "^2.1.0", + "cross-spawn": "^6.0.5", + "debug": "^4.0.1", + "doctrine": "^3.0.0", + "eslint-scope": "^5.0.0", + "eslint-utils": "^1.4.3", + "eslint-visitor-keys": "^1.1.0", + "espree": "^6.1.2", + "esquery": "^1.0.1", + "esutils": "^2.0.2", + "file-entry-cache": "^5.0.1", + "functional-red-black-tree": "^1.0.1", + "glob-parent": "^5.0.0", + "globals": "^12.1.0", + "ignore": "^4.0.6", + "import-fresh": "^3.0.0", + "imurmurhash": "^0.1.4", + "inquirer": "^7.0.0", + "is-glob": "^4.0.0", + "js-yaml": "^3.13.1", + "json-stable-stringify-without-jsonify": "^1.0.1", + "levn": "^0.3.0", + "lodash": "^4.17.14", + "minimatch": "^3.0.4", + "mkdirp": "^0.5.1", + "natural-compare": "^1.4.0", + "optionator": "^0.8.3", + "progress": "^2.0.0", + "regexpp": "^2.0.1", + "semver": "^6.1.2", + "strip-ansi": "^5.2.0", + "strip-json-comments": "^3.0.1", + "table": "^5.2.3", + "text-table": "^0.2.0", + "v8-compile-cache": "^2.0.3" + }, + "dependencies": { + "eslint-utils": { + "version": "1.4.3", + "resolved": "https://registry.npmjs.org/eslint-utils/-/eslint-utils-1.4.3.tgz", + "integrity": "sha512-fbBN5W2xdY45KulGXmLHZ3c3FHfVYmKg0IrAKGOkT/464PQsx2UeIzfz1RmEci+KLm1bBaAzZAh8+/E+XAeZ8Q==", + "dev": true, + "requires": { + "eslint-visitor-keys": "^1.1.0" + } + }, + "regexpp": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/regexpp/-/regexpp-2.0.1.tgz", + "integrity": "sha512-lv0M6+TkDVniA3aD1Eg0DVpfU/booSu7Eev3TDO/mZKHBfVjgCGTV4t4buppESEYDtkArYFOxTJWv6S5C+iaNw==", + "dev": true + } + } + }, + "eslint-scope": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/eslint-scope/-/eslint-scope-5.0.0.tgz", + "integrity": "sha512-oYrhJW7S0bxAFDvWqzvMPRm6pcgcnWc4QnofCAqRTRfQC0JcwenzGglTtsLyIuuWFfkqDG9vz67cnttSd53djw==", + "dev": true, + "requires": { + "esrecurse": "^4.1.0", + "estraverse": "^4.1.1" + } + }, + "eslint-utils": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/eslint-utils/-/eslint-utils-2.0.0.tgz", + "integrity": "sha512-0HCPuJv+7Wv1bACm8y5/ECVfYdfsAm9xmVb7saeFlxjPYALefjhbYoCkBjPdPzGH8wWyTpAez82Fh3VKYEZ8OA==", + "dev": true, + "requires": { + "eslint-visitor-keys": "^1.1.0" + } + }, + "eslint-visitor-keys": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/eslint-visitor-keys/-/eslint-visitor-keys-1.1.0.tgz", + "integrity": "sha512-8y9YjtM1JBJU/A9Kc+SbaOV4y29sSWckBwMHa+FGtVj5gN/sbnKDf6xJUl+8g7FAij9LVaP8C24DUiH/f/2Z9A==", + "dev": true + }, + "espree": { + "version": "6.2.1", + "resolved": "https://registry.npmjs.org/espree/-/espree-6.2.1.tgz", + "integrity": "sha512-ysCxRQY3WaXJz9tdbWOwuWr5Y/XrPTGX9Kiz3yoUXwW0VZ4w30HTkQLaGx/+ttFjF8i+ACbArnB4ce68a9m5hw==", + "dev": true, + "requires": { + "acorn": "^7.1.1", + "acorn-jsx": "^5.2.0", + "eslint-visitor-keys": "^1.1.0" + } + }, "esprima": { "version": "4.0.1", "resolved": "https://registry.npmjs.org/esprima/-/esprima-4.0.1.tgz", "integrity": "sha512-eGuFFw7Upda+g4p+QHvnW0RyTX/SVeJBDM/gCtMARO0cLuT2HcEKnTPvhjV6aGeqrCB/sbNop0Kszm0jsaWU4A==", "dev": true }, + "esquery": { + "version": "1.3.1", + "resolved": "https://registry.npmjs.org/esquery/-/esquery-1.3.1.tgz", + "integrity": "sha512-olpvt9QG0vniUBZspVRN6lwB7hOZoTRtT+jzR+tS4ffYx2mzbw+z0XCOk44aaLYKApNX5nMm+E+P6o25ip/DHQ==", + "dev": true, + "requires": { + "estraverse": "^5.1.0" + }, + "dependencies": { + "estraverse": { + "version": "5.1.0", + "resolved": "https://registry.npmjs.org/estraverse/-/estraverse-5.1.0.tgz", + "integrity": "sha512-FyohXK+R0vE+y1nHLoBM7ZTyqRpqAlhdZHCWIWEviFLiGB8b04H6bQs8G+XTthacvT8VuwvteiP7RJSxMs8UEw==", + "dev": true + } + } + }, + "esrecurse": { + "version": "4.2.1", + "resolved": "https://registry.npmjs.org/esrecurse/-/esrecurse-4.2.1.tgz", + "integrity": "sha512-64RBB++fIOAXPw3P9cy89qfMlvZEXZkqqJkjqqXIvzP5ezRZjW+lPWjw35UX/3EhUPFYbg5ER4JYgDw4007/DQ==", + "dev": true, + "requires": { + "estraverse": "^4.1.0" + } + }, + "estraverse": { + "version": "4.3.0", + "resolved": "https://registry.npmjs.org/estraverse/-/estraverse-4.3.0.tgz", + "integrity": "sha512-39nnKffWz8xN1BU/2c79n9nB9HDzo0niYUqx6xyqUnyoAnQyyWpOTdZEeiCch8BBu515t4wp9ZmgVfVhn9EBpw==", + "dev": true + }, "esutils": { - "version": "2.0.2", - "resolved": "https://registry.npmjs.org/esutils/-/esutils-2.0.2.tgz", - "integrity": "sha1-Cr9PHKpbyx96nYrMbepPqqBLrJs=", + "version": "2.0.3", + "resolved": "https://registry.npmjs.org/esutils/-/esutils-2.0.3.tgz", + "integrity": "sha512-kVscqXk4OCp68SZ0dkgEKVi6/8ij300KBWTJq32P/dYeWTSwK41WyTxalN1eRmA5Z9UU/LX9D7FWSmV9SAYx6g==", + "dev": true + }, + "external-editor": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/external-editor/-/external-editor-3.1.0.tgz", + "integrity": "sha512-hMQ4CX1p1izmuLYyZqLMO/qGNw10wSv9QDCPfzXfyFrOaCSSoRfqE1Kf1s5an66J5JZC62NewG+mK49jOCtQew==", + "dev": true, + "requires": { + "chardet": "^0.7.0", + "iconv-lite": "^0.4.24", + "tmp": "^0.0.33" + } + }, + "fast-deep-equal": { + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/fast-deep-equal/-/fast-deep-equal-3.1.1.tgz", + "integrity": "sha512-8UEa58QDLauDNfpbrX55Q9jrGHThw2ZMdOky5Gl1CDtVeJDPVrG4Jxx1N8jw2gkWaff5UUuX1KJd+9zGe2B+ZA==", + "dev": true + }, + "fast-json-stable-stringify": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/fast-json-stable-stringify/-/fast-json-stable-stringify-2.1.0.tgz", + "integrity": "sha512-lhd/wF+Lk98HZoTCtlVraHtfh5XYijIjalXck7saUtuanSDyLMxnHhSXEDJqHxD7msR8D0uCmqlkwjCV8xvwHw==", "dev": true }, - "exif-parser": { - "version": "0.1.12", - "resolved": "https://registry.npmjs.org/exif-parser/-/exif-parser-0.1.12.tgz", - "integrity": "sha1-WKnS1ywCwfbwKg70qRZicrd2CSI=" + "fast-levenshtein": { + "version": "2.0.6", + "resolved": "https://registry.npmjs.org/fast-levenshtein/-/fast-levenshtein-2.0.6.tgz", + "integrity": "sha1-PYpcZog6FqMMqGQ+hR8Zuqd5eRc=", + "dev": true }, "fast-srp-hap": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/fast-srp-hap/-/fast-srp-hap-1.0.1.tgz", - "integrity": "sha1-N3Ek0Za8alFXquWze/X6NbtK0tk=", + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/fast-srp-hap/-/fast-srp-hap-2.0.1.tgz", + "integrity": "sha512-dClwnyfRd3BZxu3KAdhvAayozq7fLazXGlDc4HAHJV1M+olqGKAT52pygXQu5UiDSHxz/WB3KRvsojqQ5zmXOA==", "dev": true }, - "file-type": { - "version": "9.0.0", - "resolved": "https://registry.npmjs.org/file-type/-/file-type-9.0.0.tgz", - "integrity": "sha512-Qe/5NJrgIOlwijpq3B7BEpzPFcgzggOTagZmkXQY4LA6bsXKTUstK7Wp12lEJ/mLKTpvIZxmIuRcLYWT6ov9lw==" + "figures": { + "version": "3.2.0", + "resolved": "https://registry.npmjs.org/figures/-/figures-3.2.0.tgz", + "integrity": "sha512-yaduQFRKLXYOGgEn6AZau90j3ggSOyiqXU0F9JZfeXYhNa+Jk4X+s45A2zg5jns87GAFa34BBm2kXw4XpNcbdg==", + "dev": true, + "requires": { + "escape-string-regexp": "^1.0.5" + } + }, + "file-entry-cache": { + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/file-entry-cache/-/file-entry-cache-5.0.1.tgz", + "integrity": "sha512-bCg29ictuBaKUwwArK4ouCaqDgLZcysCFLmM/Yn/FDoqndh/9vNuQfXRDvTuXKLxfD/JtZQGKFT8MGcJBK644g==", + "dev": true, + "requires": { + "flat-cache": "^2.0.1" + } + }, + "fill-range": { + "version": "7.0.1", + "resolved": "https://registry.npmjs.org/fill-range/-/fill-range-7.0.1.tgz", + "integrity": "sha512-qOo9F+dMUmC2Lcb4BbVvnKJxTPjCm+RRpe4gDuGrzkL7mEVl/djYSu2OdQ2Pa302N4oqkSg9ir6jaLWJ2USVpQ==", + "dev": true, + "requires": { + "to-regex-range": "^5.0.1" + } }, - "for-each": { - "version": "0.3.3", - "resolved": "https://registry.npmjs.org/for-each/-/for-each-0.3.3.tgz", - "integrity": "sha512-jqYfLp7mo9vIyQf8ykW2v7A+2N4QjeCeI5+Dz9XraiO1ign81wjiH7Fb9vSOWvQfNtmSa4H2RoQTrrXivdUZmw==", + "flat-cache": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/flat-cache/-/flat-cache-2.0.1.tgz", + "integrity": "sha512-LoQe6yDuUMDzQAEH8sgmh4Md6oZnc/7PjtwjNFSzveXqSHt6ka9fPBuso7IGf9Rz4uqnSnWiFH2B/zj24a5ReA==", + "dev": true, "requires": { - "is-callable": "^1.1.3" + "flatted": "^2.0.0", + "rimraf": "2.6.3", + "write": "1.0.3" + }, + "dependencies": { + "rimraf": { + "version": "2.6.3", + "resolved": "https://registry.npmjs.org/rimraf/-/rimraf-2.6.3.tgz", + "integrity": "sha512-mwqeW5XsA2qAejG46gYdENaxXjx9onRNCfn7L0duuP4hCuTIi/QO7PDK07KJfp1d+izWPrzEJDcSqBa0OZQriA==", + "dev": true, + "requires": { + "glob": "^7.1.3" + } + } } }, + "flatted": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/flatted/-/flatted-2.0.2.tgz", + "integrity": "sha512-r5wGx7YeOwNWNlCA0wQ86zKyDLMQr+/RB8xy74M4hTphfmjlijTSSXGuH8rnvKZnfT9i+75zmd8jcKdMR4O6jA==", + "dev": true + }, + "foreach": { + "version": "2.0.5", + "resolved": "https://registry.npmjs.org/foreach/-/foreach-2.0.5.tgz", + "integrity": "sha1-C+4AUBiusmDQo6865ljdATbsG5k=", + "dev": true + }, "fs.realpath": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/fs.realpath/-/fs.realpath-1.0.0.tgz", "integrity": "sha1-FQStJSMVjKpA20onh8sBQRmU6k8=", "dev": true }, - "get-func-name": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/get-func-name/-/get-func-name-2.0.0.tgz", - "integrity": "sha1-6td0q+5y4gQJQzoGY2YCPdaIekE=" + "fsevents": { + "version": "2.1.3", + "resolved": "https://registry.npmjs.org/fsevents/-/fsevents-2.1.3.tgz", + "integrity": "sha512-Auw9a4AxqWpa9GUfj370BMPzzyncfBABW8Mab7BGWBYDj4Isgq+cDKtx0i6u9jcX9pQDnswsaaOTgTmA5pEjuQ==", + "dev": true, + "optional": true + }, + "function-bind": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/function-bind/-/function-bind-1.1.1.tgz", + "integrity": "sha512-yIovAzMX49sF8Yl58fSCWJ5svSLuaibPxXQJFLmBObTuCr0Mf1KiPopGM9NiFjiYBCbfaa2Fh6breQ6ANVTI0A==", + "dev": true + }, + "functional-red-black-tree": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/functional-red-black-tree/-/functional-red-black-tree-1.0.1.tgz", + "integrity": "sha1-GwqzvVU7Kg1jmdKcDj6gslIHgyc=", + "dev": true + }, + "futoin-hkdf": { + "version": "1.3.2", + "resolved": "https://registry.npmjs.org/futoin-hkdf/-/futoin-hkdf-1.3.2.tgz", + "integrity": "sha512-3EVi3ETTyJg5PSXlxLCaUVVn0pSbDf62L3Gwxne7Uq+d8adOSNWQAad4gg7WToHkcgnCJb3Wlb1P8r4Evj4GPw==", + "dev": true + }, + "get-stream": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/get-stream/-/get-stream-4.1.0.tgz", + "integrity": "sha512-GMat4EJ5161kIy2HevLlr4luNjBgvmj413KaQA7jt4V8B4RDsfpHk7WQ9GVqfYyyx8OS/L66Kox+rJRNklLK7w==", + "dev": true, + "requires": { + "pump": "^3.0.0" + } }, "glob": { - "version": "7.1.2", - "resolved": "https://registry.npmjs.org/glob/-/glob-7.1.2.tgz", - "integrity": "sha512-MJTUg1kjuLeQCJ+ccE4Vpa6kKVXkPYJ2mOCQyUuKLcLQsdrMCpBPUi8qVE6+YuaJkozeA9NusTAw3hLr8Xe5EQ==", + "version": "7.1.6", + "resolved": "https://registry.npmjs.org/glob/-/glob-7.1.6.tgz", + "integrity": "sha512-LwaxwyZ72Lk7vZINtNNrywX0ZuLyStrdDtabefZKAY5ZGJhVtgdznluResxNmPitE0SAO+O26sWTHeKSI2wMBA==", "dev": true, "requires": { "fs.realpath": "^1.0.0", @@ -739,57 +1084,81 @@ "path-is-absolute": "^1.0.0" } }, - "global": { - "version": "4.3.2", - "resolved": "https://registry.npmjs.org/global/-/global-4.3.2.tgz", - "integrity": "sha1-52mJJopsdMOJCLEwWxD8DjlOnQ8=", + "glob-parent": { + "version": "5.1.1", + "resolved": "https://registry.npmjs.org/glob-parent/-/glob-parent-5.1.1.tgz", + "integrity": "sha512-FnI+VGOpnlGHWZxthPGR+QhR78fuiK0sNLkHQv+bL9fQi57lNNdquIbna/WrfROrolq8GK5Ek6BiMwqL/voRYQ==", + "dev": true, "requires": { - "min-document": "^2.19.0", - "process": "~0.5.1" + "is-glob": "^4.0.1" } }, - "graceful-fs": { - "version": "4.1.15", - "resolved": "https://registry.npmjs.org/graceful-fs/-/graceful-fs-4.1.15.tgz", - "integrity": "sha512-6uHUhOPEBgQ24HM+r6b/QwWfZq+yiFcipKFrOFiBEnWdy5sdzYoi+pJeQaPI5qOLRFqWmAXUPQNsielzdLoecA==", - "dev": true + "global-dirs": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/global-dirs/-/global-dirs-2.0.1.tgz", + "integrity": "sha512-5HqUqdhkEovj2Of/ms3IeS/EekcO54ytHRLV4PEY2rhRwrHXLQjeVEES0Lhka0xwNDtGYn58wyC4s5+MHsOO6A==", + "dev": true, + "requires": { + "ini": "^1.3.5" + } }, - "graceful-readlink": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/graceful-readlink/-/graceful-readlink-1.0.1.tgz", - "integrity": "sha1-TK+tdrxi8C+gObL5Tpo906ORpyU=", - "dev": true + "globals": { + "version": "12.4.0", + "resolved": "https://registry.npmjs.org/globals/-/globals-12.4.0.tgz", + "integrity": "sha512-BWICuzzDvDoH54NHKCseDanAhE3CeDorgDL5MT6LMXXj2WCnd9UC2szdk4AWLfjdgNBCXLUanXYcpBBKOSWGwg==", + "dev": true, + "requires": { + "type-fest": "^0.8.1" + } }, - "growl": { - "version": "1.10.5", - "resolved": "https://registry.npmjs.org/growl/-/growl-1.10.5.tgz", - "integrity": "sha512-qBr4OuELkhPenW6goKVXiv47US3clb3/IbuWF9KNKEijAy9oeHxU9IgzjvJhHkUzhaj7rOUD7+YGWqUjLp5oSA==", + "got": { + "version": "9.6.0", + "resolved": "https://registry.npmjs.org/got/-/got-9.6.0.tgz", + "integrity": "sha512-R7eWptXuGYxwijs0eV+v3o6+XH1IqVK8dJOEecQfTmkncw9AV4dcw/Dhxi8MdlqPthxxpZyizMzyg8RTmEsG+Q==", + "dev": true, + "requires": { + "@sindresorhus/is": "^0.14.0", + "@szmarczak/http-timer": "^1.1.2", + "cacheable-request": "^6.0.0", + "decompress-response": "^3.3.0", + "duplexer3": "^0.1.4", + "get-stream": "^4.1.0", + "lowercase-keys": "^1.0.1", + "mimic-response": "^1.0.1", + "p-cancelable": "^1.0.0", + "to-readable-stream": "^1.0.0", + "url-parse-lax": "^3.0.0" + } + }, + "graceful-fs": { + "version": "4.2.4", + "resolved": "https://registry.npmjs.org/graceful-fs/-/graceful-fs-4.2.4.tgz", + "integrity": "sha512-WjKPNJF79dtJAVniUlGGWHYGz2jWxT6VhN/4m1NdkbZ2nOsEF+cI1Edgql5zCRhs/VsQYRvrXctxktVXZUkixw==", "dev": true }, "hap-nodejs": { - "version": "0.4.47", - "resolved": "https://registry.npmjs.org/hap-nodejs/-/hap-nodejs-0.4.47.tgz", - "integrity": "sha512-R+wybsxAP/R/NT3WazdY7ErAgyee1zRqvpHgTUkR5mkQHp88z46hcm50kVkFEYRHlpLclBBCqioP6EksHIOsbw==", - "dev": true, - "requires": { - "bonjour-hap": "^3.5.1", - "buffer-shims": "^1.0.0", - "curve25519-n": "^1.2.0", - "debug": "^2.2.0", - "decimal.js": "^7.2.3", - "ed25519-hap": "^0.0.5", - "fast-srp-hap": "^1.0.1", + "version": "0.7.3", + "resolved": "https://registry.npmjs.org/hap-nodejs/-/hap-nodejs-0.7.3.tgz", + "integrity": "sha512-kCPwdRizCPJk43eTSMtW2LtCh+it8rTYW7aGkhW8qFKPS4z5JQilpggvVJvdfmSy5l+L5F0/UyKwkeM/KsdrHA==", + "dev": true, + "requires": { + "bonjour-hap": "~3.5.8", + "debug": "^4.1.1", + "decimal.js": "^10.2.0", + "fast-srp-hap": "2.0.1", + "futoin-hkdf": "~1.3.2", "ip": "^1.1.3", - "node-persist": "^0.0.11" + "node-persist": "^0.0.11", + "tweetnacl": "^1.0.3" } }, - "has-ansi": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/has-ansi/-/has-ansi-2.0.0.tgz", - "integrity": "sha1-NPUEnOHs3ysGSa8+8k5F7TVBbZE=", + "has": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/has/-/has-1.0.3.tgz", + "integrity": "sha512-f2dvO0VU6Oej7RkWJGrehjbzMAjFp5/VKPp5tTpWIV4JHHZK1/BxbFRtf/siA2SWTe09caDmVtYYzWEIbBS4zw==", "dev": true, "requires": { - "ansi-regex": "^2.0.0" + "function-bind": "^1.1.1" } }, "has-flag": { @@ -798,738 +1167,1539 @@ "integrity": "sha1-tdRU3CGZriJWmfNGfloH87lVuv0=", "dev": true }, - "he": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/he/-/he-1.1.1.tgz", - "integrity": "sha1-k0EP0hsAlzUVH4howvJx80J+I/0=", + "has-symbols": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/has-symbols/-/has-symbols-1.0.1.tgz", + "integrity": "sha512-PLcsoqu++dmEIZB+6totNFKq/7Do+Z0u4oT0zKOJNl3lYK6vGwwu2hjHs+68OEZbTjiUE9bgOABXbP/GvrS0Kg==", + "dev": true + }, + "has-yarn": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/has-yarn/-/has-yarn-2.1.0.tgz", + "integrity": "sha512-UqBRqi4ju7T+TqGNdqAO0PaSVGsDGJUBQvk9eUWNGRY1CFGDzYhLWoM7JQEemnlvVcv/YEmc2wNW8BC24EnUsw==", "dev": true }, "homebridge": { - "version": "0.4.45", - "resolved": "https://registry.npmjs.org/homebridge/-/homebridge-0.4.45.tgz", - "integrity": "sha512-zcyI0r4qF2hPmqrP5y45bz7sar3EdQSiqydXFuuTHeXmE4qnGZaxo+/4n3GYK22Yvp/wWBH3yxmm0ZGr+JyChQ==", + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/homebridge/-/homebridge-1.1.0.tgz", + "integrity": "sha512-OMs+1A2G6lkMOrAk0o1nmj8S3XkhwrInVwRDiyLB3aHRQS02KQ/Egv1stV9vDhjib86v3y3MLHIYYzbxKHLjPA==", "dev": true, "requires": { - "chalk": "^1.1.1", - "commander": "2.8.1", - "hap-nodejs": "0.4.47", - "node-persist": "^0.0.8", - "qrcode-terminal": "^0.11.0", - "semver": "5.0.3" + "chalk": "^3.0.0", + "commander": "5.0.0", + "hap-nodejs": "^0.7.3", + "node-persist": "^0.0.11", + "qrcode-terminal": "^0.12.0", + "semver": "^7.3.2", + "source-map-support": "^0.5.19" }, "dependencies": { - "mkdirp": { - "version": "0.3.5", - "resolved": "http://registry.npmjs.org/mkdirp/-/mkdirp-0.3.5.tgz", - "integrity": "sha1-3j5fiWHIjHh+4TaN+EmsRBPsqNc=", + "ansi-styles": { + "version": "4.2.1", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.2.1.tgz", + "integrity": "sha512-9VGjrMsG1vePxcSweQsN20KY/c4zN0h9fLjqAbwbPfahM3t+NL+M9HC8xeXG2I8pX5NoamTGNuomEUFI7fcUjA==", + "dev": true, + "requires": { + "@types/color-name": "^1.1.1", + "color-convert": "^2.0.1" + } + }, + "chalk": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-3.0.0.tgz", + "integrity": "sha512-4D3B6Wf41KOYRFdszmDqMCGq5VV/uMAB273JILmO+3jAlh8X4qDtdtgCR3fxtbLEMzSx22QdhnDcJvu2u1fVwg==", + "dev": true, + "requires": { + "ansi-styles": "^4.1.0", + "supports-color": "^7.1.0" + } + }, + "color-convert": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz", + "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==", + "dev": true, + "requires": { + "color-name": "~1.1.4" + } + }, + "color-name": { + "version": "1.1.4", + "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz", + "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==", + "dev": true + }, + "has-flag": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz", + "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==", + "dev": true + }, + "semver": { + "version": "7.3.2", + "resolved": "https://registry.npmjs.org/semver/-/semver-7.3.2.tgz", + "integrity": "sha512-OrOb32TeeambH6UrhtShmF7CRDqhL6/5XpPNp2DuRH6+9QLw/orhp72j87v8Qa1ScDkvrrBNpZcDejAirJmfXQ==", "dev": true }, - "node-persist": { - "version": "0.0.8", - "resolved": "https://registry.npmjs.org/node-persist/-/node-persist-0.0.8.tgz", - "integrity": "sha1-pWxzm8b/2c7vGcDo2JWXkX8Ikkk=", + "supports-color": { + "version": "7.1.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.1.0.tgz", + "integrity": "sha512-oRSIpR8pxT1Wr2FquTNnGet79b3BWljqOuoW/h4oBhxJ/HUbX5nX6JSruTkvXDCFMwDPvsaTTbvMLKZWSy0R5g==", "dev": true, "requires": { - "mkdirp": "~0.3.5", - "q": "~1.1.1" + "has-flag": "^4.0.0" } } } }, - "ieee754": { - "version": "1.1.12", - "resolved": "https://registry.npmjs.org/ieee754/-/ieee754-1.1.12.tgz", - "integrity": "sha512-GguP+DRY+pJ3soyIiGPTvdiVXjZ+DbXOxGpXn3eMvNW4x4irjqXm4wHKscC+TfxSJ0yw/S1F24tqdMNsMZTiLA==" + "http-cache-semantics": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/http-cache-semantics/-/http-cache-semantics-4.1.0.tgz", + "integrity": "sha512-carPklcUh7ROWRK7Cv27RPtdhYhUsela/ue5/jKzjegVvXDqM2ILE9Q2BGn9JZJh1g87cp56su/FgQSzcWS8cQ==", + "dev": true }, - "inflight": { - "version": "1.0.6", - "resolved": "https://registry.npmjs.org/inflight/-/inflight-1.0.6.tgz", - "integrity": "sha1-Sb1jMdfQLQwJvJEKEHW6gWW1bfk=", + "iconv-lite": { + "version": "0.4.24", + "resolved": "https://registry.npmjs.org/iconv-lite/-/iconv-lite-0.4.24.tgz", + "integrity": "sha512-v3MXnZAcvnywkTUEZomIActle7RXXeedOR31wwl7VlyoXO4Qi9arvSenNQWne1TcRwhCL1HwLI21bEqdpj8/rA==", "dev": true, "requires": { - "once": "^1.3.0", - "wrappy": "1" + "safer-buffer": ">= 2.1.2 < 3" } }, - "inherits": { - "version": "2.0.3", - "resolved": "https://registry.npmjs.org/inherits/-/inherits-2.0.3.tgz", - "integrity": "sha1-Yzwsg+PaQqUC9SRmAiSA9CCCYd4=", + "ignore": { + "version": "4.0.6", + "resolved": "https://registry.npmjs.org/ignore/-/ignore-4.0.6.tgz", + "integrity": "sha512-cyFDKrqc/YdcWFniJhzI42+AzS+gNwmUzOSFcRCQYwySuBBBy/KjuxWLZ/FHEH6Moq1NizMOBWyTcv8O4OZIMg==", "dev": true }, - "ip": { - "version": "1.1.5", - "resolved": "https://registry.npmjs.org/ip/-/ip-1.1.5.tgz", - "integrity": "sha1-vd7XARQpCCjAoDnnLvJfWq7ENUo=" - }, - "is-callable": { - "version": "1.1.4", - "resolved": "https://registry.npmjs.org/is-callable/-/is-callable-1.1.4.tgz", - "integrity": "sha512-r5p9sxJjYnArLjObpjA4xu5EKI3CuKHkJXMhT7kwbpUyIFD1n5PMAsoPvWnvtZiNz7LjkYDRZhd7FlI0eMijEA==" - }, - "is-function": { + "ignore-by-default": { "version": "1.0.1", - "resolved": "https://registry.npmjs.org/is-function/-/is-function-1.0.1.tgz", - "integrity": "sha1-Es+5i2W1fdPRk6MSH19uL0N2ArU=" - }, - "isarray": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/isarray/-/isarray-1.0.0.tgz", - "integrity": "sha1-u5NdSFgsuhaMBoNJV6VKPgcSTxE=", + "resolved": "https://registry.npmjs.org/ignore-by-default/-/ignore-by-default-1.0.1.tgz", + "integrity": "sha1-SMptcvbGo68Aqa1K5odr44ieKwk=", "dev": true }, - "jimp": { - "version": "0.5.6", - "resolved": "https://registry.npmjs.org/jimp/-/jimp-0.5.6.tgz", - "integrity": "sha512-H0nHTu6KgAgQzDxa38ew2dXbnRzKm1w5uEyhMIxqwCQVjwgarOjjkV/avbNLxfxRHAFaNp4rGIc/qm8P+uhX9A==", + "import-fresh": { + "version": "3.2.1", + "resolved": "https://registry.npmjs.org/import-fresh/-/import-fresh-3.2.1.tgz", + "integrity": "sha512-6e1q1cnWP2RXD9/keSkxHScg508CdXqXWgWBaETNhyuBFz+kUZlKboh+ISK+bU++DmbHimVBrOz/zzPe0sZ3sQ==", + "dev": true, "requires": { - "@babel/polyfill": "^7.0.0", - "@jimp/custom": "^0.5.4", - "@jimp/plugins": "^0.5.5", - "@jimp/types": "^0.5.4", - "core-js": "^2.5.7" + "parent-module": "^1.0.0", + "resolve-from": "^4.0.0" } }, - "jpeg-js": { - "version": "0.3.4", - "resolved": "https://registry.npmjs.org/jpeg-js/-/jpeg-js-0.3.4.tgz", - "integrity": "sha512-6IzjQxvnlT8UlklNmDXIJMWxijULjqGrzgqc0OG7YadZdvm7KPQ1j0ehmQQHckgEWOfgpptzcnWgESovxudpTA==" + "import-lazy": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/import-lazy/-/import-lazy-2.1.0.tgz", + "integrity": "sha1-BWmOPUXIjo1+nZLLBYTnfwlvPkM=", + "dev": true }, - "js-tokens": { - "version": "3.0.2", - "resolved": "https://registry.npmjs.org/js-tokens/-/js-tokens-3.0.2.tgz", - "integrity": "sha1-mGbfOVECEw449/mWvOtlRDIJwls=", + "imurmurhash": { + "version": "0.1.4", + "resolved": "https://registry.npmjs.org/imurmurhash/-/imurmurhash-0.1.4.tgz", + "integrity": "sha1-khi5srkoojixPcT7a21XbyMUU+o=", "dev": true }, - "js-yaml": { - "version": "3.12.0", - "resolved": "https://registry.npmjs.org/js-yaml/-/js-yaml-3.12.0.tgz", - "integrity": "sha512-PIt2cnwmPfL4hKNwqeiuz4bKfnzHTBv6HyVgjahA6mPLwPDzjDWrplJBMjHUFxku/N3FlmrbyPclad+I+4mJ3A==", + "inflight": { + "version": "1.0.6", + "resolved": "https://registry.npmjs.org/inflight/-/inflight-1.0.6.tgz", + "integrity": "sha1-Sb1jMdfQLQwJvJEKEHW6gWW1bfk=", "dev": true, "requires": { - "argparse": "^1.0.7", - "esprima": "^4.0.0" - } - }, - "json-stringify-safe": { - "version": "5.0.1", - "resolved": "https://registry.npmjs.org/json-stringify-safe/-/json-stringify-safe-5.0.1.tgz", - "integrity": "sha1-Epai1Y/UXxmg9s4B1lcB4sc1tus=" - }, - "load-bmfont": { - "version": "1.4.0", - "resolved": "https://registry.npmjs.org/load-bmfont/-/load-bmfont-1.4.0.tgz", - "integrity": "sha512-kT63aTAlNhZARowaNYcY29Fn/QYkc52M3l6V1ifRcPewg2lvUZDAj7R6dXjOL9D0sict76op3T5+odumDSF81g==", - "requires": { - "buffer-equal": "0.0.1", - "mime": "^1.3.4", - "parse-bmfont-ascii": "^1.0.3", - "parse-bmfont-binary": "^1.0.5", - "parse-bmfont-xml": "^1.1.4", - "phin": "^2.9.1", - "xhr": "^2.0.1", - "xtend": "^4.0.0" + "once": "^1.3.0", + "wrappy": "1" } }, - "lodash": { - "version": "4.17.11", - "resolved": "https://registry.npmjs.org/lodash/-/lodash-4.17.11.tgz", - "integrity": "sha512-cQKh8igo5QUhZ7lg38DYWAxMvjSAKG0A8wGSVimP07SIUEK2UO+arSRKbRZWtelMtN5V0Hkwh5ryOto/SshYIg==" + "inherits": { + "version": "2.0.4", + "resolved": "https://registry.npmjs.org/inherits/-/inherits-2.0.4.tgz", + "integrity": "sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ==", + "dev": true }, - "make-error": { + "ini": { "version": "1.3.5", - "resolved": "https://registry.npmjs.org/make-error/-/make-error-1.3.5.tgz", - "integrity": "sha512-c3sIjNUow0+8swNwVpqoH4YCShKNFkMaw6oH1mNS2haDZQqkeZFlHS3dhoeEbKKmJB4vXpJucU6oH75aDYeE9g==", + "resolved": "https://registry.npmjs.org/ini/-/ini-1.3.5.tgz", + "integrity": "sha512-RZY5huIKCMRWDUqZlEi72f/lmXKMvuszcMBduliQ3nnWbx9X/ZBQO7DijMEYS9EhHBb2qacRUMtC7svLwe0lcw==", "dev": true }, - "memory-fs": { - "version": "0.3.0", - "resolved": "https://registry.npmjs.org/memory-fs/-/memory-fs-0.3.0.tgz", - "integrity": "sha1-e8xrYp46Q+hx1+Kaymrop/FcuyA=", - "dev": true, - "requires": { - "errno": "^0.1.3", - "readable-stream": "^2.0.1" - } - }, - "mime": { - "version": "1.6.0", - "resolved": "https://registry.npmjs.org/mime/-/mime-1.6.0.tgz", - "integrity": "sha512-x0Vn8spI+wuJ1O6S7gnbaQg8Pxh4NNHb7KSINmEWKiPE4RKOplvijn+NkmYmmRgP68mc70j2EbeTFRsrswaQeg==" - }, - "min-document": { - "version": "2.19.0", - "resolved": "https://registry.npmjs.org/min-document/-/min-document-2.19.0.tgz", - "integrity": "sha1-e9KC4/WELtKVu3SM3Z8f+iyCRoU=", - "requires": { - "dom-walk": "^0.1.0" - } - }, - "minimatch": { - "version": "3.0.4", - "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.0.4.tgz", - "integrity": "sha512-yJHVQEhyqPLUTgt9B83PXu6W3rx4MvvHvSUvToogpwoGDOUQ+yDrR0HRot+yOCdCO7u4hX3pWft6kWBBcqh0UA==", + "inquirer": { + "version": "7.1.0", + "resolved": "https://registry.npmjs.org/inquirer/-/inquirer-7.1.0.tgz", + "integrity": "sha512-5fJMWEmikSYu0nv/flMc475MhGbB7TSPd/2IpFV4I4rMklboCH2rQjYY5kKiYGHqUF9gvaambupcJFFG9dvReg==", "dev": true, "requires": { - "brace-expansion": "^1.1.7" - } - }, - "minimist": { - "version": "0.0.8", - "resolved": "http://registry.npmjs.org/minimist/-/minimist-0.0.8.tgz", - "integrity": "sha1-hX/Kv8M5fSYluCKCYuhqp6ARsF0=" - }, - "mkdirp": { - "version": "0.5.1", - "resolved": "http://registry.npmjs.org/mkdirp/-/mkdirp-0.5.1.tgz", - "integrity": "sha1-MAV0OOrGz3+MR2fzhkjWaX11yQM=", - "requires": { - "minimist": "0.0.8" - } - }, - "mocha": { - "version": "5.2.0", - "resolved": "https://registry.npmjs.org/mocha/-/mocha-5.2.0.tgz", - "integrity": "sha512-2IUgKDhc3J7Uug+FxMXuqIyYzH7gJjXECKe/w43IGgQHTSj3InJi+yAA7T24L9bQMRKiUEHxEX37G5JpVUGLcQ==", - "dev": true, - "requires": { - "browser-stdout": "1.3.1", - "commander": "2.15.1", - "debug": "3.1.0", - "diff": "3.5.0", - "escape-string-regexp": "1.0.5", - "glob": "7.1.2", - "growl": "1.10.5", - "he": "1.1.1", - "minimatch": "3.0.4", - "mkdirp": "0.5.1", - "supports-color": "5.4.0" + "ansi-escapes": "^4.2.1", + "chalk": "^3.0.0", + "cli-cursor": "^3.1.0", + "cli-width": "^2.0.0", + "external-editor": "^3.0.3", + "figures": "^3.0.0", + "lodash": "^4.17.15", + "mute-stream": "0.0.8", + "run-async": "^2.4.0", + "rxjs": "^6.5.3", + "string-width": "^4.1.0", + "strip-ansi": "^6.0.0", + "through": "^2.3.6" }, "dependencies": { - "commander": { - "version": "2.15.1", - "resolved": "http://registry.npmjs.org/commander/-/commander-2.15.1.tgz", - "integrity": "sha512-VlfT9F3V0v+jr4yxPc5gg9s62/fIVWsd2Bk2iD435um1NlGMYdVCq+MjcXnhYq2icNOizHr1kK+5TI6H0Hy0ag==", - "dev": true + "ansi-styles": { + "version": "4.2.1", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.2.1.tgz", + "integrity": "sha512-9VGjrMsG1vePxcSweQsN20KY/c4zN0h9fLjqAbwbPfahM3t+NL+M9HC8xeXG2I8pX5NoamTGNuomEUFI7fcUjA==", + "dev": true, + "requires": { + "@types/color-name": "^1.1.1", + "color-convert": "^2.0.1" + } }, - "debug": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/debug/-/debug-3.1.0.tgz", - "integrity": "sha512-OX8XqP7/1a9cqkxYw2yXss15f26NKWBpDXQd0/uK/KPqdQhxbPa994hnzjcE2VqQpDslf55723cKPUOGSmMY3g==", + "chalk": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-3.0.0.tgz", + "integrity": "sha512-4D3B6Wf41KOYRFdszmDqMCGq5VV/uMAB273JILmO+3jAlh8X4qDtdtgCR3fxtbLEMzSx22QdhnDcJvu2u1fVwg==", "dev": true, "requires": { - "ms": "2.0.0" + "ansi-styles": "^4.1.0", + "supports-color": "^7.1.0" } }, - "supports-color": { - "version": "5.4.0", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-5.4.0.tgz", - "integrity": "sha512-zjaXglF5nnWpsq470jSv6P9DwPvgLkuapYmfDm3JWOm0vkNTVF2tI4UrN2r6jH1qM/uc/WtxYY1hYoA2dOKj5w==", + "color-convert": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz", + "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==", "dev": true, "requires": { - "has-flag": "^3.0.0" + "color-name": "~1.1.4" } - } + }, + "color-name": { + "version": "1.1.4", + "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz", + "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==", + "dev": true + }, + "has-flag": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz", + "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==", + "dev": true + }, + "strip-ansi": { + "version": "6.0.0", + "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-6.0.0.tgz", + "integrity": "sha512-AuvKTrTfQNYNIctbR1K/YGTR1756GycPsg7b9bdV9Duqur4gv6aKqHXah67Z8ImS7WEz5QVcOtlfW2rZEugt6w==", + "dev": true, + "requires": { + "ansi-regex": "^5.0.0" + } + }, + "supports-color": { + "version": "7.1.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.1.0.tgz", + "integrity": "sha512-oRSIpR8pxT1Wr2FquTNnGet79b3BWljqOuoW/h4oBhxJ/HUbX5nX6JSruTkvXDCFMwDPvsaTTbvMLKZWSy0R5g==", + "dev": true, + "requires": { + "has-flag": "^4.0.0" + } + } + } + }, + "ip": { + "version": "1.1.5", + "resolved": "https://registry.npmjs.org/ip/-/ip-1.1.5.tgz", + "integrity": "sha1-vd7XARQpCCjAoDnnLvJfWq7ENUo=" + }, + "is-arguments": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/is-arguments/-/is-arguments-1.0.4.tgz", + "integrity": "sha512-xPh0Rmt8NE65sNzvyUmWgI1tz3mKq74lGA0mL8LYZcoIzKOzDh6HmrYm3d18k60nHerC8A9Km8kYu87zfSFnLA==", + "dev": true + }, + "is-bigint": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/is-bigint/-/is-bigint-1.0.0.tgz", + "integrity": "sha512-t5mGUXC/xRheCK431ylNiSkGGpBp8bHENBcENTkDT6ppwPzEVxNGZRvgvmOEfbWkFhA7D2GEuE2mmQTr78sl2g==", + "dev": true + }, + "is-binary-path": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/is-binary-path/-/is-binary-path-2.1.0.tgz", + "integrity": "sha512-ZMERYes6pDydyuGidse7OsHxtbI7WVeUEozgR/g7rd0xUimYNlvZRE/K2MgZTjWy725IfelLeVcEM97mmtRGXw==", + "dev": true, + "requires": { + "binary-extensions": "^2.0.0" + } + }, + "is-boolean-object": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/is-boolean-object/-/is-boolean-object-1.0.1.tgz", + "integrity": "sha512-TqZuVwa/sppcrhUCAYkGBk7w0yxfQQnxq28fjkO53tnK9FQXmdwz2JS5+GjsWQ6RByES1K40nI+yDic5c9/aAQ==", + "dev": true + }, + "is-callable": { + "version": "1.1.5", + "resolved": "https://registry.npmjs.org/is-callable/-/is-callable-1.1.5.tgz", + "integrity": "sha512-ESKv5sMCJB2jnHTWZ3O5itG+O128Hsus4K4Qh1h2/cgn2vbgnLSVqfV46AeJA9D5EeeLa9w81KUXMtn34zhX+Q==", + "dev": true + }, + "is-ci": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/is-ci/-/is-ci-2.0.0.tgz", + "integrity": "sha512-YfJT7rkpQB0updsdHLGWrvhBJfcfzNNawYDNIyQXJz0IViGf75O8EBPKSdvw2rF+LGCsX4FZ8tcr3b19LcZq4w==", + "dev": true, + "requires": { + "ci-info": "^2.0.0" + } + }, + "is-date-object": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/is-date-object/-/is-date-object-1.0.2.tgz", + "integrity": "sha512-USlDT524woQ08aoZFzh3/Z6ch9Y/EWXEHQ/AaRN0SkKq4t2Jw2R2339tSXmwuVoY7LLlBCbOIlx2myP/L5zk0g==", + "dev": true + }, + "is-extglob": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/is-extglob/-/is-extglob-2.1.1.tgz", + "integrity": "sha1-qIwCU1eR8C7TfHahueqXc8gz+MI=", + "dev": true + }, + "is-fullwidth-code-point": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-3.0.0.tgz", + "integrity": "sha512-zymm5+u+sCsSWyD9qNaejV3DFvhCKclKdizYaJUuHA83RLjb7nSuGnddCHGv0hk+KY7BMAlsWeK4Ueg6EV6XQg==", + "dev": true + }, + "is-glob": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/is-glob/-/is-glob-4.0.1.tgz", + "integrity": "sha512-5G0tKtBTFImOqDnLB2hG6Bp2qcKEFduo4tZu9MT/H6NQv/ghhy30o55ufafxJ/LdH79LLs2Kfrn85TLKyA7BUg==", + "dev": true, + "requires": { + "is-extglob": "^2.1.1" + } + }, + "is-installed-globally": { + "version": "0.3.2", + "resolved": "https://registry.npmjs.org/is-installed-globally/-/is-installed-globally-0.3.2.tgz", + "integrity": "sha512-wZ8x1js7Ia0kecP/CHM/3ABkAmujX7WPvQk6uu3Fly/Mk44pySulQpnHG46OMjHGXApINnV4QhY3SWnECO2z5g==", + "dev": true, + "requires": { + "global-dirs": "^2.0.1", + "is-path-inside": "^3.0.1" + } + }, + "is-map": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/is-map/-/is-map-2.0.1.tgz", + "integrity": "sha512-T/S49scO8plUiAOA2DBTBG3JHpn1yiw0kRp6dgiZ0v2/6twi5eiB0rHtHFH9ZIrvlWc6+4O+m4zg5+Z833aXgw==", + "dev": true + }, + "is-npm": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/is-npm/-/is-npm-4.0.0.tgz", + "integrity": "sha512-96ECIfh9xtDDlPylNPXhzjsykHsMJZ18ASpaWzQyBr4YRTcVjUvzaHayDAES2oU/3KpljhHUjtSRNiDwi0F0ig==", + "dev": true + }, + "is-number": { + "version": "7.0.0", + "resolved": "https://registry.npmjs.org/is-number/-/is-number-7.0.0.tgz", + "integrity": "sha512-41Cifkg6e8TylSpdtTpeLVMqvSBEVzTttHvERD741+pnZ8ANv0004MRL43QKPDlK9cGvNp6NZWZUBlbGXYxxng==", + "dev": true + }, + "is-number-object": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/is-number-object/-/is-number-object-1.0.4.tgz", + "integrity": "sha512-zohwelOAur+5uXtk8O3GPQ1eAcu4ZX3UwxQhUlfFFMNpUd83gXgjbhJh6HmB6LUNV/ieOLQuDwJO3dWJosUeMw==", + "dev": true + }, + "is-obj": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/is-obj/-/is-obj-2.0.0.tgz", + "integrity": "sha512-drqDG3cbczxxEJRoOXcOjtdp1J/lyp1mNn0xaznRs8+muBhgQcrnbspox5X5fOw0HnMnbfDzvnEMEtqDEJEo8w==", + "dev": true + }, + "is-path-inside": { + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/is-path-inside/-/is-path-inside-3.0.2.tgz", + "integrity": "sha512-/2UGPSgmtqwo1ktx8NDHjuPwZWmHhO+gj0f93EkhLB5RgW9RZevWYYlIkS6zePc6U2WpOdQYIwHe9YC4DWEBVg==", + "dev": true + }, + "is-regex": { + "version": "1.0.5", + "resolved": "https://registry.npmjs.org/is-regex/-/is-regex-1.0.5.tgz", + "integrity": "sha512-vlKW17SNq44owv5AQR3Cq0bQPEb8+kF3UKZ2fiZNOWtztYE5i0CzCZxFDwO58qAOWtxdBRVO/V5Qin1wjCqFYQ==", + "dev": true, + "requires": { + "has": "^1.0.3" + } + }, + "is-set": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/is-set/-/is-set-2.0.1.tgz", + "integrity": "sha512-eJEzOtVyenDs1TMzSQ3kU3K+E0GUS9sno+F0OBT97xsgcJsF9nXMBtkT9/kut5JEpM7oL7X/0qxR17K3mcwIAA==", + "dev": true + }, + "is-string": { + "version": "1.0.5", + "resolved": "https://registry.npmjs.org/is-string/-/is-string-1.0.5.tgz", + "integrity": "sha512-buY6VNRjhQMiF1qWDouloZlQbRhDPCebwxSjxMjxgemYT46YMd2NR0/H+fBhEfWX4A/w9TBJ+ol+okqJKFE6vQ==", + "dev": true + }, + "is-symbol": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/is-symbol/-/is-symbol-1.0.3.tgz", + "integrity": "sha512-OwijhaRSgqvhm/0ZdAcXNZt9lYdKFpcRDT5ULUuYXPoT794UNOdU+gpT6Rzo7b4V2HUl/op6GqY894AZwv9faQ==", + "dev": true, + "requires": { + "has-symbols": "^1.0.1" + } + }, + "is-typed-array": { + "version": "1.1.3", + "resolved": "https://registry.npmjs.org/is-typed-array/-/is-typed-array-1.1.3.tgz", + "integrity": "sha512-BSYUBOK/HJibQ30wWkWold5txYwMUXQct9YHAQJr8fSwvZoiglcqB0pd7vEN23+Tsi9IUEjztdOSzl4qLVYGTQ==", + "dev": true, + "requires": { + "available-typed-arrays": "^1.0.0", + "es-abstract": "^1.17.4", + "foreach": "^2.0.5", + "has-symbols": "^1.0.1" + } + }, + "is-typedarray": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/is-typedarray/-/is-typedarray-1.0.0.tgz", + "integrity": "sha1-5HnICFjfDBsR3dppQPlgEfzaSpo=", + "dev": true + }, + "is-weakmap": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/is-weakmap/-/is-weakmap-2.0.1.tgz", + "integrity": "sha512-NSBR4kH5oVj1Uwvv970ruUkCV7O1mzgVFO4/rev2cLRda9Tm9HrL70ZPut4rOHgY0FNrUu9BCbXA2sdQ+x0chA==", + "dev": true + }, + "is-weakset": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/is-weakset/-/is-weakset-2.0.1.tgz", + "integrity": "sha512-pi4vhbhVHGLxohUw7PhGsueT4vRGFoXhP7+RGN0jKIv9+8PWYCQTqtADngrxOm2g46hoH0+g8uZZBzMrvVGDmw==", + "dev": true + }, + "is-yarn-global": { + "version": "0.3.0", + "resolved": "https://registry.npmjs.org/is-yarn-global/-/is-yarn-global-0.3.0.tgz", + "integrity": "sha512-VjSeb/lHmkoyd8ryPVIKvOCn4D1koMqY+vqyjjUfc3xyKtP4dYOxM44sZrnqQSzSds3xyOrUTLTC9LVCVgLngw==", + "dev": true + }, + "isarray": { + "version": "2.0.5", + "resolved": "https://registry.npmjs.org/isarray/-/isarray-2.0.5.tgz", + "integrity": "sha512-xHjhDr3cNBK0BzdUJSPXZntQUx/mwMS5Rw4A7lPJ90XGAO6ISP/ePDNuo0vhqOZU+UD5JoodwCAAoZQd3FeAKw==", + "dev": true + }, + "isexe": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/isexe/-/isexe-2.0.0.tgz", + "integrity": "sha1-6PvzdNxVb/iUehDcsFctYz8s+hA=", + "dev": true + }, + "js-tokens": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/js-tokens/-/js-tokens-4.0.0.tgz", + "integrity": "sha512-RdJUflcE3cUzKiMqQgsCu06FPu9UdIJO0beYbPhHN4k6apgJtifcoCtT9bcxOpYBtpD2kCM6Sbzg4CausW/PKQ==", + "dev": true + }, + "js-yaml": { + "version": "3.13.1", + "resolved": "https://registry.npmjs.org/js-yaml/-/js-yaml-3.13.1.tgz", + "integrity": "sha512-YfbcO7jXDdyj0DGxYVSlSeQNHbD7XPWvrVWeVUujrQEoZzWJIRrCPoyk6kL6IAjAG2IolMK4T0hNUe0HOUs5Jw==", + "dev": true, + "requires": { + "argparse": "^1.0.7", + "esprima": "^4.0.0" + } + }, + "json-buffer": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/json-buffer/-/json-buffer-3.0.0.tgz", + "integrity": "sha1-Wx85evx11ne96Lz8Dkfh+aPZqJg=", + "dev": true + }, + "json-schema-traverse": { + "version": "0.4.1", + "resolved": "https://registry.npmjs.org/json-schema-traverse/-/json-schema-traverse-0.4.1.tgz", + "integrity": "sha512-xbbCH5dCYU5T8LcEhhuh7HJ88HXuW3qsI3Y0zOZFKfZEHcpWiHU/Jxzk629Brsab/mMiHQti9wMP+845RPe3Vg==", + "dev": true + }, + "json-stable-stringify-without-jsonify": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/json-stable-stringify-without-jsonify/-/json-stable-stringify-without-jsonify-1.0.1.tgz", + "integrity": "sha1-nbe1lJatPzz+8wp1FC0tkwrXJlE=", + "dev": true + }, + "keyv": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/keyv/-/keyv-3.1.0.tgz", + "integrity": "sha512-9ykJ/46SN/9KPM/sichzQ7OvXyGDYKGTaDlKMGCAlg2UK8KRy4jb0d8sFc+0Tt0YYnThq8X2RZgCg74RPxgcVA==", + "dev": true, + "requires": { + "json-buffer": "3.0.0" + } + }, + "latest-version": { + "version": "5.1.0", + "resolved": "https://registry.npmjs.org/latest-version/-/latest-version-5.1.0.tgz", + "integrity": "sha512-weT+r0kTkRQdCdYCNtkMwWXQTMEswKrFBkm4ckQOMVhhqhIMI1UT2hMj+1iigIhgSZm5gTmrRXBNoGUgaTY1xA==", + "dev": true, + "requires": { + "package-json": "^6.3.0" + } + }, + "levn": { + "version": "0.3.0", + "resolved": "https://registry.npmjs.org/levn/-/levn-0.3.0.tgz", + "integrity": "sha1-OwmSTt+fCDwEkP3UwLxEIeBHZO4=", + "dev": true, + "requires": { + "prelude-ls": "~1.1.2", + "type-check": "~0.3.2" + } + }, + "lodash": { + "version": "4.17.15", + "resolved": "https://registry.npmjs.org/lodash/-/lodash-4.17.15.tgz", + "integrity": "sha512-8xOcRHvCjnocdS5cpwXQXVzmmh5e5+saE2QGoeQmbKmRS6J3VQppPOIt0MnmE+4xlZoumy0GPG0D0MVIQbNA1A==", + "dev": true + }, + "lowercase-keys": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/lowercase-keys/-/lowercase-keys-1.0.1.tgz", + "integrity": "sha512-G2Lj61tXDnVFFOi8VZds+SoQjtQC3dgokKdDG2mTm1tx4m50NUHBOZSBwQQHyy0V12A0JTG4icfZQH+xPyh8VA==", + "dev": true + }, + "make-dir": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/make-dir/-/make-dir-3.1.0.tgz", + "integrity": "sha512-g3FeP20LNwhALb/6Cz6Dd4F2ngze0jz7tbzrD2wAV+o9FeNHe4rL+yK2md0J/fiSf1sa1ADhXqi5+oVwOM/eGw==", + "dev": true, + "requires": { + "semver": "^6.0.0" + } + }, + "make-error": { + "version": "1.3.6", + "resolved": "https://registry.npmjs.org/make-error/-/make-error-1.3.6.tgz", + "integrity": "sha512-s8UhlNe7vPKomQhC1qFelMokr/Sc3AgNbso3n74mVPA5LTZwkB9NlXf4XPamLxJE8h0gh73rM94xvwRT2CVInw==", + "dev": true + }, + "mimic-fn": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/mimic-fn/-/mimic-fn-2.1.0.tgz", + "integrity": "sha512-OqbOk5oEQeAZ8WXWydlu9HJjz9WVdEIvamMCcXmuqUYjTknH/sqsWvhQ3vgwKFRR1HpjvNBKQ37nbJgYzGqGcg==", + "dev": true + }, + "mimic-response": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/mimic-response/-/mimic-response-1.0.1.tgz", + "integrity": "sha512-j5EctnkH7amfV/q5Hgmoal1g2QHFJRraOtmx0JpIqkxhBhI/lJSl1nMpQ45hVarwNETOoWEimndZ4QK0RHxuxQ==", + "dev": true + }, + "minimatch": { + "version": "3.0.4", + "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.0.4.tgz", + "integrity": "sha512-yJHVQEhyqPLUTgt9B83PXu6W3rx4MvvHvSUvToogpwoGDOUQ+yDrR0HRot+yOCdCO7u4hX3pWft6kWBBcqh0UA==", + "dev": true, + "requires": { + "brace-expansion": "^1.1.7" + } + }, + "minimist": { + "version": "1.2.5", + "resolved": "https://registry.npmjs.org/minimist/-/minimist-1.2.5.tgz", + "integrity": "sha512-FM9nNUYrRBAELZQT3xeZQ7fmMOBg6nWNmJKTcgsJeaLstP/UODVpGsr5OhXhhXg6f+qtJ8uiZ+PUxkDWcgIXLw==", + "dev": true + }, + "mkdirp": { + "version": "0.5.5", + "resolved": "https://registry.npmjs.org/mkdirp/-/mkdirp-0.5.5.tgz", + "integrity": "sha512-NKmAlESf6jMGym1++R0Ra7wvhV+wFW63FaSOFPwRahvea0gMUcGUhVeAg/0BC0wiv9ih5NYPB1Wn1UEI1/L+xQ==", + "dev": true, + "requires": { + "minimist": "^1.2.5" + } + }, + "ms": { + "version": "2.1.2", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.2.tgz", + "integrity": "sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w==", + "dev": true + }, + "multicast-dns": { + "version": "7.2.2", + "resolved": "https://registry.npmjs.org/multicast-dns/-/multicast-dns-7.2.2.tgz", + "integrity": "sha512-XqSMeO8EWV/nOXOpPV8ztIpNweVfE1dSpz6SQvDPp71HD74lMXjt4m/mWB1YBMG0kHtOodxRWc5WOb/UNN1A5g==", + "dev": true, + "requires": { + "dns-packet": "^4.0.0", + "thunky": "^1.0.2" + } + }, + "multicast-dns-service-types": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/multicast-dns-service-types/-/multicast-dns-service-types-1.1.0.tgz", + "integrity": "sha1-iZ8R2WhuXgXLkbNdXw5jt3PPyQE=", + "dev": true + }, + "mute-stream": { + "version": "0.0.8", + "resolved": "https://registry.npmjs.org/mute-stream/-/mute-stream-0.0.8.tgz", + "integrity": "sha512-nnbWWOkoWyUsTjKrhgD0dcz22mdkSnpYqbEjIm2nhwhuxlSkpywJmBo8h0ZqJdkp73mb90SssHkN4rsRaBAfAA==", + "dev": true + }, + "natural-compare": { + "version": "1.4.0", + "resolved": "https://registry.npmjs.org/natural-compare/-/natural-compare-1.4.0.tgz", + "integrity": "sha1-Sr6/7tdUHywnrPspvbvRXI1bpPc=", + "dev": true + }, + "nice-try": { + "version": "1.0.5", + "resolved": "https://registry.npmjs.org/nice-try/-/nice-try-1.0.5.tgz", + "integrity": "sha512-1nh45deeb5olNY7eX82BkPO7SSxR5SSYJiPTrTdFUVYwAl8CKMA5N9PjTYkHiRjisVcxcQ1HXdLhx2qxxJzLNQ==", + "dev": true + }, + "node-persist": { + "version": "0.0.11", + "resolved": "https://registry.npmjs.org/node-persist/-/node-persist-0.0.11.tgz", + "integrity": "sha1-1m66Pr72IPB5Uw+nsTB2qQZmWHQ=", + "dev": true, + "requires": { + "mkdirp": "~0.5.1", + "q": "~1.1.1" + } + }, + "nodemon": { + "version": "2.0.4", + "resolved": "https://registry.npmjs.org/nodemon/-/nodemon-2.0.4.tgz", + "integrity": "sha512-Ltced+hIfTmaS28Zjv1BM552oQ3dbwPqI4+zI0SLgq+wpJhSyqgYude/aZa/3i31VCQWMfXJVxvu86abcam3uQ==", + "dev": true, + "requires": { + "chokidar": "^3.2.2", + "debug": "^3.2.6", + "ignore-by-default": "^1.0.1", + "minimatch": "^3.0.4", + "pstree.remy": "^1.1.7", + "semver": "^5.7.1", + "supports-color": "^5.5.0", + "touch": "^3.1.0", + "undefsafe": "^2.0.2", + "update-notifier": "^4.0.0" + }, + "dependencies": { + "debug": { + "version": "3.2.6", + "resolved": "https://registry.npmjs.org/debug/-/debug-3.2.6.tgz", + "integrity": "sha512-mel+jf7nrtEl5Pn1Qx46zARXKDpBbvzezse7p7LqINmdoIk8PYP5SySaxEmYv6TZ0JyEKA1hsCId6DIhgITtWQ==", + "dev": true, + "requires": { + "ms": "^2.1.1" + } + }, + "semver": { + "version": "5.7.1", + "resolved": "https://registry.npmjs.org/semver/-/semver-5.7.1.tgz", + "integrity": "sha512-sauaDf/PZdVgrLTNYHRtpXa1iRiKcaebiKQ1BJdpQlWH2lCvexQdX55snPFyK7QzpudqbCI0qXFfOasHdyNDGQ==", + "dev": true + } + } + }, + "nopt": { + "version": "1.0.10", + "resolved": "https://registry.npmjs.org/nopt/-/nopt-1.0.10.tgz", + "integrity": "sha1-bd0hvSoxQXuScn3Vhfim83YI6+4=", + "dev": true, + "requires": { + "abbrev": "1" + } + }, + "normalize-path": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/normalize-path/-/normalize-path-3.0.0.tgz", + "integrity": "sha512-6eZs5Ls3WtCisHWp9S2GUy8dqkpGi4BVSz3GaqiE6ezub0512ESztXUwUB6C6IKbQkY2Pnb/mD4WYojCRwcwLA==", + "dev": true + }, + "normalize-url": { + "version": "4.5.0", + "resolved": "https://registry.npmjs.org/normalize-url/-/normalize-url-4.5.0.tgz", + "integrity": "sha512-2s47yzUxdexf1OhyRi4Em83iQk0aPvwTddtFz4hnSSw9dCEsLEGf6SwIO8ss/19S9iBb5sJaOuTvTGDeZI00BQ==", + "dev": true + }, + "object-inspect": { + "version": "1.7.0", + "resolved": "https://registry.npmjs.org/object-inspect/-/object-inspect-1.7.0.tgz", + "integrity": "sha512-a7pEHdh1xKIAgTySUGgLMx/xwDZskN1Ud6egYYN3EdRW4ZMPNEDUTF+hwy2LUC+Bl+SyLXANnwz/jyh/qutKUw==", + "dev": true + }, + "object-is": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/object-is/-/object-is-1.1.2.tgz", + "integrity": "sha512-5lHCz+0uufF6wZ7CRFWJN3hp8Jqblpgve06U5CMQ3f//6iDjPr2PEo9MWCjEssDsa+UZEL4PkFpr+BMop6aKzQ==", + "dev": true, + "requires": { + "define-properties": "^1.1.3", + "es-abstract": "^1.17.5" + } + }, + "object-keys": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/object-keys/-/object-keys-1.1.1.tgz", + "integrity": "sha512-NuAESUOUMrlIXOfHKzD6bpPu3tYt3xvjNdRIQ+FeT0lNb4K8WR70CaDxhuNguS2XG+GjkyMwOzsN5ZktImfhLA==", + "dev": true + }, + "object.assign": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/object.assign/-/object.assign-4.1.0.tgz", + "integrity": "sha512-exHJeq6kBKj58mqGyTQ9DFvrZC/eR6OwxzoM9YRoGBqrXYonaFyGiFMuc9VZrXf7DarreEwMpurG3dd+CNyW5w==", + "dev": true, + "requires": { + "define-properties": "^1.1.2", + "function-bind": "^1.1.1", + "has-symbols": "^1.0.0", + "object-keys": "^1.0.11" + } + }, + "once": { + "version": "1.4.0", + "resolved": "https://registry.npmjs.org/once/-/once-1.4.0.tgz", + "integrity": "sha1-WDsap3WWHUsROsF9nFC6753Xa9E=", + "dev": true, + "requires": { + "wrappy": "1" + } + }, + "onetime": { + "version": "5.1.0", + "resolved": "https://registry.npmjs.org/onetime/-/onetime-5.1.0.tgz", + "integrity": "sha512-5NcSkPHhwTVFIQN+TUqXoS5+dlElHXdpAWu9I0HP20YOtIi+aZ0Ct82jdlILDxjLEAWwvm+qj1m6aEtsDVmm6Q==", + "dev": true, + "requires": { + "mimic-fn": "^2.1.0" + } + }, + "optional": { + "version": "0.1.4", + "resolved": "https://registry.npmjs.org/optional/-/optional-0.1.4.tgz", + "integrity": "sha512-gtvrrCfkE08wKcgXaVwQVgwEQ8vel2dc5DDBn9RLQZ3YtmtkBss6A2HY6BnJH4N/4Ku97Ri/SF8sNWE2225WJw==" + }, + "optionator": { + "version": "0.8.3", + "resolved": "https://registry.npmjs.org/optionator/-/optionator-0.8.3.tgz", + "integrity": "sha512-+IW9pACdk3XWmmTXG8m3upGUJst5XRGzxMRjXzAuJ1XnIFNvfhjjIuYkDvysnPQ7qzqVzLt78BCruntqRhWQbA==", + "dev": true, + "requires": { + "deep-is": "~0.1.3", + "fast-levenshtein": "~2.0.6", + "levn": "~0.3.0", + "prelude-ls": "~1.1.2", + "type-check": "~0.3.2", + "word-wrap": "~1.2.3" + } + }, + "os-tmpdir": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/os-tmpdir/-/os-tmpdir-1.0.2.tgz", + "integrity": "sha1-u+Z0BseaqFxc/sdm/lc0VV36EnQ=", + "dev": true + }, + "p-cancelable": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/p-cancelable/-/p-cancelable-1.1.0.tgz", + "integrity": "sha512-s73XxOZ4zpt1edZYZzvhqFa6uvQc1vwUa0K0BdtIZgQMAJj9IbebH+JkgKZc9h+B05PKHLOTl4ajG1BmNrVZlw==", + "dev": true + }, + "package-json": { + "version": "6.5.0", + "resolved": "https://registry.npmjs.org/package-json/-/package-json-6.5.0.tgz", + "integrity": "sha512-k3bdm2n25tkyxcjSKzB5x8kfVxlMdgsbPr0GkZcwHsLpba6cBjqCt1KlcChKEvxHIcTB1FVMuwoijZ26xex5MQ==", + "dev": true, + "requires": { + "got": "^9.6.0", + "registry-auth-token": "^4.0.0", + "registry-url": "^5.0.0", + "semver": "^6.2.0" + } + }, + "parent-module": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/parent-module/-/parent-module-1.0.1.tgz", + "integrity": "sha512-GQ2EWRpQV8/o+Aw8YqtfZZPfNRWZYkbidE9k5rpl/hC3vtHHBfGm2Ifi6qWV+coDGkrUKZAxE3Lot5kcsRlh+g==", + "dev": true, + "requires": { + "callsites": "^3.0.0" + } + }, + "path-is-absolute": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/path-is-absolute/-/path-is-absolute-1.0.1.tgz", + "integrity": "sha1-F0uSaHNVNP+8es5r9TpanhtcX18=", + "dev": true + }, + "path-key": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/path-key/-/path-key-2.0.1.tgz", + "integrity": "sha1-QRyttXTFoUDTpLGRDUDYDMn0C0A=", + "dev": true + }, + "picomatch": { + "version": "2.2.2", + "resolved": "https://registry.npmjs.org/picomatch/-/picomatch-2.2.2.tgz", + "integrity": "sha512-q0M/9eZHzmr0AulXyPwNfZjtwZ/RBZlbN3K3CErVrk50T2ASYI7Bye0EvekFY3IP1Nt2DHu0re+V2ZHIpMkuWg==", + "dev": true + }, + "prelude-ls": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/prelude-ls/-/prelude-ls-1.1.2.tgz", + "integrity": "sha1-IZMqVJ9eUv/ZqCf1cOBL5iqX2lQ=", + "dev": true + }, + "prepend-http": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/prepend-http/-/prepend-http-2.0.0.tgz", + "integrity": "sha1-6SQ0v6XqjBn0HN/UAddBo8gZ2Jc=", + "dev": true + }, + "progress": { + "version": "2.0.3", + "resolved": "https://registry.npmjs.org/progress/-/progress-2.0.3.tgz", + "integrity": "sha512-7PiHtLll5LdnKIMw100I+8xJXR5gW2QwWYkT6iJva0bXitZKa/XMrSbdmg3r2Xnaidz9Qumd0VPaMrZlF9V9sA==", + "dev": true + }, + "pstree.remy": { + "version": "1.1.7", + "resolved": "https://registry.npmjs.org/pstree.remy/-/pstree.remy-1.1.7.tgz", + "integrity": "sha512-xsMgrUwRpuGskEzBFkH8NmTimbZ5PcPup0LA8JJkHIm2IMUbQcpo3yeLNWVrufEYjh8YwtSVh0xz6UeWc5Oh5A==", + "dev": true + }, + "pump": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/pump/-/pump-3.0.0.tgz", + "integrity": "sha512-LwZy+p3SFs1Pytd/jYct4wpv49HiYCqd9Rlc5ZVdk0V+8Yzv6jR5Blk3TRmPL1ft69TxP0IMZGJ+WPFU2BFhww==", + "dev": true, + "requires": { + "end-of-stream": "^1.1.0", + "once": "^1.3.1" + } + }, + "punycode": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/punycode/-/punycode-2.1.1.tgz", + "integrity": "sha512-XRsRjdf+j5ml+y/6GKHPZbrF/8p2Yga0JPtdqTIY2Xe5ohJPD9saDJJLPvp9+NSBprVvevdXZybnj2cv8OEd0A==", + "dev": true + }, + "pupa": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/pupa/-/pupa-2.0.1.tgz", + "integrity": "sha512-hEJH0s8PXLY/cdXh66tNEQGndDrIKNqNC5xmrysZy3i5C3oEoLna7YAOad+7u125+zH1HNXUmGEkrhb3c2VriA==", + "dev": true, + "requires": { + "escape-goat": "^2.0.0" + } + }, + "q": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/q/-/q-1.1.2.tgz", + "integrity": "sha1-Y1fikSBnAdmfGXq4TlforRlvKok=", + "dev": true + }, + "qrcode-terminal": { + "version": "0.12.0", + "resolved": "https://registry.npmjs.org/qrcode-terminal/-/qrcode-terminal-0.12.0.tgz", + "integrity": "sha512-EXtzRZmC+YGmGlDFbXKxQiMZNwCLEO6BANKXG4iCtSIM0yqc/pappSx3RIKr4r0uh5JsBckOXeKrB3Iz7mdQpQ==", + "dev": true + }, + "qs": { + "version": "6.9.4", + "resolved": "https://registry.npmjs.org/qs/-/qs-6.9.4.tgz", + "integrity": "sha512-A1kFqHekCTM7cz0udomYUoYNWjBebHm/5wzU/XqrBRBNWectVH0QIiN+NEcZ0Dte5hvzHwbr8+XQmguPhJ6WdQ==" + }, + "rc": { + "version": "1.2.8", + "resolved": "https://registry.npmjs.org/rc/-/rc-1.2.8.tgz", + "integrity": "sha512-y3bGgqKj3QBdxLbLkomlohkvsA8gdAiUQlSBJnBhfn+BPxg4bc62d8TcBW15wavDfgexCgccckhcZvywyQYPOw==", + "dev": true, + "requires": { + "deep-extend": "^0.6.0", + "ini": "~1.3.0", + "minimist": "^1.2.0", + "strip-json-comments": "~2.0.1" + }, + "dependencies": { + "strip-json-comments": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/strip-json-comments/-/strip-json-comments-2.0.1.tgz", + "integrity": "sha1-PFMZQukIwml8DsNEhYwobHygpgo=", + "dev": true + } + } + }, + "readdirp": { + "version": "3.4.0", + "resolved": "https://registry.npmjs.org/readdirp/-/readdirp-3.4.0.tgz", + "integrity": "sha512-0xe001vZBnJEK+uKcj8qOhyAKPzIT+gStxWr3LCB0DwcXR5NZJ3IaC+yGnHCYzB/S7ov3m3EEbZI2zeNvX+hGQ==", + "dev": true, + "requires": { + "picomatch": "^2.2.1" + } + }, + "regexp.prototype.flags": { + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/regexp.prototype.flags/-/regexp.prototype.flags-1.3.0.tgz", + "integrity": "sha512-2+Q0C5g951OlYlJz6yu5/M33IcsESLlLfsyIaLJaG4FA2r4yP8MvVMJUUP/fVBkSpbbbZlS5gynbEWLipiiXiQ==", + "dev": true, + "requires": { + "define-properties": "^1.1.3", + "es-abstract": "^1.17.0-next.1" + } + }, + "regexpp": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/regexpp/-/regexpp-3.1.0.tgz", + "integrity": "sha512-ZOIzd8yVsQQA7j8GCSlPGXwg5PfmA1mrq0JP4nGhh54LaKN3xdai/vHUDu74pKwV8OxseMS65u2NImosQcSD0Q==", + "dev": true + }, + "registry-auth-token": { + "version": "4.1.1", + "resolved": "https://registry.npmjs.org/registry-auth-token/-/registry-auth-token-4.1.1.tgz", + "integrity": "sha512-9bKS7nTl9+/A1s7tnPeGrUpRcVY+LUh7bfFgzpndALdPfXQBfQV77rQVtqgUV3ti4vc/Ik81Ex8UJDWDQ12zQA==", + "dev": true, + "requires": { + "rc": "^1.2.8" + } + }, + "registry-url": { + "version": "5.1.0", + "resolved": "https://registry.npmjs.org/registry-url/-/registry-url-5.1.0.tgz", + "integrity": "sha512-8acYXXTI0AkQv6RAOjE3vOaIXZkT9wo4LOFbBKYQEEnnMNBpKqdUrI6S4NT0KPIo/WVvJ5tE/X5LF/TQUf0ekw==", + "dev": true, + "requires": { + "rc": "^1.2.8" + } + }, + "resolve-from": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/resolve-from/-/resolve-from-4.0.0.tgz", + "integrity": "sha512-pb/MYmXstAkysRFx8piNI1tGFNQIFA3vkE3Gq4EuA1dF6gHp/+vgZqsCGJapvy8N3Q+4o7FwvquPJcnZ7RYy4g==", + "dev": true + }, + "responselike": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/responselike/-/responselike-1.0.2.tgz", + "integrity": "sha1-kYcg7ztjHFZCvgaPFa3lpG9Loec=", + "dev": true, + "requires": { + "lowercase-keys": "^1.0.0" + } + }, + "restore-cursor": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/restore-cursor/-/restore-cursor-3.1.0.tgz", + "integrity": "sha512-l+sSefzHpj5qimhFSE5a8nufZYAM3sBSVMAPtYkmC+4EH2anSGaEMXSD0izRQbu9nfyQ9y5JrVmp7E8oZrUjvA==", + "dev": true, + "requires": { + "onetime": "^5.1.0", + "signal-exit": "^3.0.2" + } + }, + "rimraf": { + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/rimraf/-/rimraf-3.0.2.tgz", + "integrity": "sha512-JZkJMZkAGFFPP2YqXZXPbMlMBgsxzE8ILs4lMIX/2o0L9UBw9O/Y3o6wFw/i9YLapcUJWwqbi3kdxIPdC62TIA==", + "dev": true, + "requires": { + "glob": "^7.1.3" + } + }, + "run-async": { + "version": "2.4.1", + "resolved": "https://registry.npmjs.org/run-async/-/run-async-2.4.1.tgz", + "integrity": "sha512-tvVnVv01b8c1RrA6Ep7JkStj85Guv/YrMcwqYQnwjsAS2cTmmPGBBjAjpCW7RrSodNSoE2/qg9O4bceNvUuDgQ==", + "dev": true + }, + "rxjs": { + "version": "6.5.5", + "resolved": "https://registry.npmjs.org/rxjs/-/rxjs-6.5.5.tgz", + "integrity": "sha512-WfQI+1gohdf0Dai/Bbmk5L5ItH5tYqm3ki2c5GdWhKjalzjg93N3avFjVStyZZz+A2Em+ZxKH5bNghw9UeylGQ==", + "dev": true, + "requires": { + "tslib": "^1.9.0" + } + }, + "safe-buffer": { + "version": "5.2.1", + "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.2.1.tgz", + "integrity": "sha512-rp3So07KcdmmKbGvgaNxQSJr7bGVSVk5S9Eq1F+ppbRo70+YeaDxkw5Dd8NPN+GD6bjnYm2VuPuCXmpuYvmCXQ==", + "dev": true + }, + "safer-buffer": { + "version": "2.1.2", + "resolved": "https://registry.npmjs.org/safer-buffer/-/safer-buffer-2.1.2.tgz", + "integrity": "sha512-YZo3K82SD7Riyi0E1EQPojLz7kpepnSQI9IyPbHHg1XXXevb5dJI7tpyN2ADxGcQbHG7vcyRHk0cbwqcQriUtg==", + "dev": true + }, + "semver": { + "version": "6.3.0", + "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.0.tgz", + "integrity": "sha512-b39TBaTSfV6yBrapU89p5fKekE2m/NwnDocOVruQFS1/veMgdzuPcnOM34M6CwxW8jH/lxEa5rBoDeUwu5HHTw==", + "dev": true + }, + "semver-diff": { + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/semver-diff/-/semver-diff-3.1.1.tgz", + "integrity": "sha512-GX0Ix/CJcHyB8c4ykpHGIAvLyOwOobtM/8d+TQkAd81/bEjgPHrfba41Vpesr7jX/t8Uh+R3EX9eAS5be+jQYg==", + "dev": true, + "requires": { + "semver": "^6.3.0" } }, - "mocha-logger": { - "version": "1.0.6", - "resolved": "https://registry.npmjs.org/mocha-logger/-/mocha-logger-1.0.6.tgz", - "integrity": "sha512-D7Z3r1RkyaJOnlgokODdzt9p4ut0m3DVzEKp3r3tgeXIpdxp54z049Vc0EEh5hkhudfRN0dfUD10Fcj2WuOO3w==", + "shebang-command": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/shebang-command/-/shebang-command-1.2.0.tgz", + "integrity": "sha1-RKrGW2lbAzmJaMOfNj/uXer98eo=", "dev": true, "requires": { - "mocha": "^5.1.1" + "shebang-regex": "^1.0.0" } }, - "ms": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz", - "integrity": "sha1-VgiurfwAvmwpAd9fmGF4jeDVl8g=", + "shebang-regex": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/shebang-regex/-/shebang-regex-1.0.0.tgz", + "integrity": "sha1-2kL0l0DAtC2yypcoVxyxkMmO/qM=", "dev": true }, - "multicast-dns": { - "version": "6.2.3", - "resolved": "https://registry.npmjs.org/multicast-dns/-/multicast-dns-6.2.3.tgz", - "integrity": "sha512-ji6J5enbMyGRHIAkAOu3WdV8nggqviKCEKtXcOqfphZZtQrmHKycfynJ2V7eVPUA4NhJ6V7Wf4TmGbTwKE9B6g==", + "side-channel": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/side-channel/-/side-channel-1.0.2.tgz", + "integrity": "sha512-7rL9YlPHg7Ancea1S96Pa8/QWb4BtXL/TZvS6B8XFetGBeuhAsfmUspK6DokBeZ64+Kj9TCNRD/30pVz1BvQNA==", "dev": true, "requires": { - "dns-packet": "^1.3.1", - "thunky": "^1.0.2" + "es-abstract": "^1.17.0-next.1", + "object-inspect": "^1.7.0" } }, - "multicast-dns-service-types": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/multicast-dns-service-types/-/multicast-dns-service-types-1.1.0.tgz", - "integrity": "sha1-iZ8R2WhuXgXLkbNdXw5jt3PPyQE=", + "signal-exit": { + "version": "3.0.3", + "resolved": "https://registry.npmjs.org/signal-exit/-/signal-exit-3.0.3.tgz", + "integrity": "sha512-VUJ49FC8U1OxwZLxIbTTrDvLnf/6TDgxZcK8wxR8zs13xpx7xbG60ndBlhNrFi2EMuFRoeDoJO7wthSLq42EjA==", "dev": true }, - "nan": { - "version": "2.11.1", - "resolved": "https://registry.npmjs.org/nan/-/nan-2.11.1.tgz", - "integrity": "sha512-iji6k87OSXa0CcrLl9z+ZiYSuR2o+c0bGuNmXdrhTQTakxytAFsC56SArGYoiHlJlFoHSnvmhpceZJaXkVuOtA==", - "dev": true - }, - "nock": { - "version": "9.6.1", - "resolved": "https://registry.npmjs.org/nock/-/nock-9.6.1.tgz", - "integrity": "sha512-EDgl/WgNQ0C1BZZlASOQkQdE6tAWXJi8QQlugqzN64JJkvZ7ILijZuG24r4vCC7yOfnm6HKpne5AGExLGCeBWg==", + "slice-ansi": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/slice-ansi/-/slice-ansi-2.1.0.tgz", + "integrity": "sha512-Qu+VC3EwYLldKa1fCxuuvULvSJOKEgk9pi8dZeCVK7TqBfUNTH4sFkk4joj8afVSfAYgJoSOetjx9QWOJ5mYoQ==", + "dev": true, "requires": { - "chai": "^4.1.2", - "debug": "^3.1.0", - "deep-equal": "^1.0.0", - "json-stringify-safe": "^5.0.1", - "lodash": "^4.17.5", - "mkdirp": "^0.5.0", - "propagate": "^1.0.0", - "qs": "^6.5.1", - "semver": "^5.5.0" + "ansi-styles": "^3.2.0", + "astral-regex": "^1.0.0", + "is-fullwidth-code-point": "^2.0.0" }, "dependencies": { - "debug": { - "version": "3.2.6", - "resolved": "https://registry.npmjs.org/debug/-/debug-3.2.6.tgz", - "integrity": "sha512-mel+jf7nrtEl5Pn1Qx46zARXKDpBbvzezse7p7LqINmdoIk8PYP5SySaxEmYv6TZ0JyEKA1hsCId6DIhgITtWQ==", - "requires": { - "ms": "^2.1.1" - } - }, - "ms": { - "version": "2.1.1", - "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.1.tgz", - "integrity": "sha512-tgp+dl5cGk28utYktBsrFqA7HKgrhgPsg6Z/EfhWI4gl1Hwq8B/GmY/0oXZ6nF8hDVesS/FpnYaD/kOWhYQvyg==" - }, - "semver": { - "version": "5.6.0", - "resolved": "https://registry.npmjs.org/semver/-/semver-5.6.0.tgz", - "integrity": "sha512-RS9R6R35NYgQn++fkDWaOmqGoj4Ek9gGs+DPxNUZKuwE183xjJroKvyo1IzVFeXvUrvmALy6FWD5xrdJT25gMg==" + "is-fullwidth-code-point": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-2.0.0.tgz", + "integrity": "sha1-o7MKXE8ZkYMWeqq5O+764937ZU8=", + "dev": true } } }, - "node-persist": { - "version": "0.0.11", - "resolved": "https://registry.npmjs.org/node-persist/-/node-persist-0.0.11.tgz", - "integrity": "sha1-1m66Pr72IPB5Uw+nsTB2qQZmWHQ=", + "source-map": { + "version": "0.6.1", + "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz", + "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==", + "dev": true + }, + "source-map-support": { + "version": "0.5.19", + "resolved": "https://registry.npmjs.org/source-map-support/-/source-map-support-0.5.19.tgz", + "integrity": "sha512-Wonm7zOCIJzBGQdB+thsPar0kYuCIzYvxZwlBa87yi/Mdjv7Tip2cyVbLj5o0cFPN4EVkuTwb3GDDyUx2DGnGw==", "dev": true, "requires": { - "mkdirp": "~0.5.1", - "q": "~1.1.1" + "buffer-from": "^1.0.0", + "source-map": "^0.6.0" } }, - "object-assign": { - "version": "4.1.1", - "resolved": "https://registry.npmjs.org/object-assign/-/object-assign-4.1.1.tgz", - "integrity": "sha1-IQmtx5ZYh8/AXLvUQsrIv7s2CGM=", + "sprintf-js": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/sprintf-js/-/sprintf-js-1.0.3.tgz", + "integrity": "sha1-BOaSb2YolTVPPdAVIDYzuFcpfiw=", "dev": true }, - "omggif": { - "version": "1.0.9", - "resolved": "https://registry.npmjs.org/omggif/-/omggif-1.0.9.tgz", - "integrity": "sha1-3LcCTazVDFK00wPwSALJHAV8dl8=" - }, - "once": { - "version": "1.4.0", - "resolved": "https://registry.npmjs.org/once/-/once-1.4.0.tgz", - "integrity": "sha1-WDsap3WWHUsROsF9nFC6753Xa9E=", + "string-width": { + "version": "4.2.0", + "resolved": "https://registry.npmjs.org/string-width/-/string-width-4.2.0.tgz", + "integrity": "sha512-zUz5JD+tgqtuDjMhwIg5uFVV3dtqZ9yQJlZVfq4I01/K5Paj5UHj7VyrQOJvzawSVlKpObApbfD0Ed6yJc+1eg==", "dev": true, "requires": { - "wrappy": "1" + "emoji-regex": "^8.0.0", + "is-fullwidth-code-point": "^3.0.0", + "strip-ansi": "^6.0.0" + }, + "dependencies": { + "strip-ansi": { + "version": "6.0.0", + "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-6.0.0.tgz", + "integrity": "sha512-AuvKTrTfQNYNIctbR1K/YGTR1756GycPsg7b9bdV9Duqur4gv6aKqHXah67Z8ImS7WEz5QVcOtlfW2rZEugt6w==", + "dev": true, + "requires": { + "ansi-regex": "^5.0.0" + } + } } }, - "optional": { - "version": "0.1.4", - "resolved": "https://registry.npmjs.org/optional/-/optional-0.1.4.tgz", - "integrity": "sha512-gtvrrCfkE08wKcgXaVwQVgwEQ8vel2dc5DDBn9RLQZ3YtmtkBss6A2HY6BnJH4N/4Ku97Ri/SF8sNWE2225WJw==" - }, - "pako": { - "version": "1.0.6", - "resolved": "https://registry.npmjs.org/pako/-/pako-1.0.6.tgz", - "integrity": "sha512-lQe48YPsMJAig+yngZ87Lus+NF+3mtu7DVOBu6b/gHO1YpKwIj5AWjZ/TOS7i46HD/UixzWb1zeWDZfGZ3iYcg==" - }, - "parse-bmfont-ascii": { - "version": "1.0.6", - "resolved": "https://registry.npmjs.org/parse-bmfont-ascii/-/parse-bmfont-ascii-1.0.6.tgz", - "integrity": "sha1-Eaw8P/WPfCAgqyJ2kHkQjU36AoU=" - }, - "parse-bmfont-binary": { - "version": "1.0.6", - "resolved": "https://registry.npmjs.org/parse-bmfont-binary/-/parse-bmfont-binary-1.0.6.tgz", - "integrity": "sha1-0Di0dtPp3Z2x4RoLDlOiJ5K2kAY=" - }, - "parse-bmfont-xml": { - "version": "1.1.4", - "resolved": "https://registry.npmjs.org/parse-bmfont-xml/-/parse-bmfont-xml-1.1.4.tgz", - "integrity": "sha512-bjnliEOmGv3y1aMEfREMBJ9tfL3WR0i0CKPj61DnSLaoxWR3nLrsQrEbCId/8rF4NyRF0cCqisSVXyQYWM+mCQ==", + "string.prototype.trimend": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/string.prototype.trimend/-/string.prototype.trimend-1.0.1.tgz", + "integrity": "sha512-LRPxFUaTtpqYsTeNKaFOw3R4bxIzWOnbQ837QfBylo8jIxtcbK/A/sMV7Q+OAV/vWo+7s25pOE10KYSjaSO06g==", + "dev": true, "requires": { - "xml-parse-from-string": "^1.0.0", - "xml2js": "^0.4.5" + "define-properties": "^1.1.3", + "es-abstract": "^1.17.5" } }, - "parse-headers": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/parse-headers/-/parse-headers-2.0.1.tgz", - "integrity": "sha1-aug6eqJanZtwCswoaYzR8e1+lTY=", + "string.prototype.trimleft": { + "version": "2.1.2", + "resolved": "https://registry.npmjs.org/string.prototype.trimleft/-/string.prototype.trimleft-2.1.2.tgz", + "integrity": "sha512-gCA0tza1JBvqr3bfAIFJGqfdRTyPae82+KTnm3coDXkZN9wnuW3HjGgN386D7hfv5CHQYCI022/rJPVlqXyHSw==", + "dev": true, "requires": { - "for-each": "^0.3.2", - "trim": "0.0.1" + "define-properties": "^1.1.3", + "es-abstract": "^1.17.5", + "string.prototype.trimstart": "^1.0.0" } }, - "path-is-absolute": { - "version": "1.0.1", - "resolved": "http://registry.npmjs.org/path-is-absolute/-/path-is-absolute-1.0.1.tgz", - "integrity": "sha1-F0uSaHNVNP+8es5r9TpanhtcX18=", - "dev": true - }, - "path-parse": { - "version": "1.0.6", - "resolved": "https://registry.npmjs.org/path-parse/-/path-parse-1.0.6.tgz", - "integrity": "sha512-GSmOT2EbHrINBf9SR7CDELwlJ8AENk3Qn7OikK4nFYAu3Ote2+JYNVvkpAEQm3/TLNEJFD/xZJjzyxg3KBWOzw==", - "dev": true - }, - "pathval": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/pathval/-/pathval-1.1.0.tgz", - "integrity": "sha1-uULm1L3mUwBe9rcTYd74cn0GReA=" - }, - "phin": { - "version": "2.9.3", - "resolved": "https://registry.npmjs.org/phin/-/phin-2.9.3.tgz", - "integrity": "sha512-CzFr90qM24ju5f88quFC/6qohjC144rehe5n6DH900lgXmUe86+xCKc10ev56gRKC4/BkHUoG4uSiQgBiIXwDA==" - }, - "pixelmatch": { - "version": "4.0.2", - "resolved": "https://registry.npmjs.org/pixelmatch/-/pixelmatch-4.0.2.tgz", - "integrity": "sha1-j0fc7FARtHe2fbA8JDvB8wheiFQ=", + "string.prototype.trimright": { + "version": "2.1.2", + "resolved": "https://registry.npmjs.org/string.prototype.trimright/-/string.prototype.trimright-2.1.2.tgz", + "integrity": "sha512-ZNRQ7sY3KroTaYjRS6EbNiiHrOkjihL9aQE/8gfQ4DtAC/aEBRHFJa44OmoWxGGqXuJlfKkZW4WcXErGr+9ZFg==", + "dev": true, "requires": { - "pngjs": "^3.0.0" + "define-properties": "^1.1.3", + "es-abstract": "^1.17.5", + "string.prototype.trimend": "^1.0.0" } }, - "pngjs": { - "version": "3.3.3", - "resolved": "https://registry.npmjs.org/pngjs/-/pngjs-3.3.3.tgz", - "integrity": "sha512-1n3Z4p3IOxArEs1VRXnZ/RXdfEniAUS9jb68g58FIXMNkPJeZd+Qh4Uq7/e0LVxAQGos1eIUrqrt4FpjdnEd+Q==" - }, - "process": { - "version": "0.5.2", - "resolved": "https://registry.npmjs.org/process/-/process-0.5.2.tgz", - "integrity": "sha1-FjjYqONML0QKkduVq5rrZ3/Bhc8=" - }, - "process-nextick-args": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/process-nextick-args/-/process-nextick-args-2.0.0.tgz", - "integrity": "sha512-MtEC1TqN0EU5nephaJ4rAtThHtC86dNN9qCuEhtshvpVBkAW5ZO7BASN9REnF9eoXGcRub+pFuKEpOHE+HbEMw==", - "dev": true - }, - "propagate": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/propagate/-/propagate-1.0.0.tgz", - "integrity": "sha1-AMLa7t2iDofjeCs0Stuhzd1q1wk=" - }, - "prr": { + "string.prototype.trimstart": { "version": "1.0.1", - "resolved": "https://registry.npmjs.org/prr/-/prr-1.0.1.tgz", - "integrity": "sha1-0/wRS6BplaRexok/SEzrHXj19HY=", - "dev": true + "resolved": "https://registry.npmjs.org/string.prototype.trimstart/-/string.prototype.trimstart-1.0.1.tgz", + "integrity": "sha512-XxZn+QpvrBI1FOcg6dIpxUPgWCPuNXvMD72aaRaUQv1eD4e/Qy8i/hFTe0BUmD60p/QA6bh1avmuPTfNjqVWRw==", + "dev": true, + "requires": { + "define-properties": "^1.1.3", + "es-abstract": "^1.17.5" + } }, - "q": { - "version": "1.1.2", - "resolved": "https://registry.npmjs.org/q/-/q-1.1.2.tgz", - "integrity": "sha1-Y1fikSBnAdmfGXq4TlforRlvKok=", - "dev": true + "strip-ansi": { + "version": "5.2.0", + "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-5.2.0.tgz", + "integrity": "sha512-DuRs1gKbBqsMKIZlrffwlug8MHkcnpjs5VPmL1PAh+mA30U0DTotfDZ0d2UUsXpPmPmMMJ6W773MaA3J+lbiWA==", + "dev": true, + "requires": { + "ansi-regex": "^4.1.0" + }, + "dependencies": { + "ansi-regex": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-4.1.0.tgz", + "integrity": "sha512-1apePfXM1UOSqw0o9IiFAovVz9M5S1Dg+4TrDwfMewQ6p/rmMueb7tWZjQ1rx4Loy1ArBggoqGpfqqdI4rondg==", + "dev": true + } + } }, - "qrcode-terminal": { - "version": "0.11.0", - "resolved": "https://registry.npmjs.org/qrcode-terminal/-/qrcode-terminal-0.11.0.tgz", - "integrity": "sha1-/8bCii/Av7RwUrR+I/T0RqX7254=", + "strip-json-comments": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/strip-json-comments/-/strip-json-comments-3.1.0.tgz", + "integrity": "sha512-e6/d0eBu7gHtdCqFt0xJr642LdToM5/cN4Qb9DbHjVx1CP5RyeM+zH7pbecEmDv/lBqb0QH+6Uqq75rxFPkM0w==", "dev": true }, - "qs": { - "version": "6.5.2", - "resolved": "https://registry.npmjs.org/qs/-/qs-6.5.2.tgz", - "integrity": "sha512-N5ZAX4/LxJmF+7wN74pUD6qAh9/wnvdQcjq9TZjevvXzSUo7bfmw91saqMjzGS2xq91/odN2dW/WOl7qQHNDGA==" - }, - "readable-stream": { - "version": "2.3.6", - "resolved": "http://registry.npmjs.org/readable-stream/-/readable-stream-2.3.6.tgz", - "integrity": "sha512-tQtKA9WIAhBF3+VLAseyMqZeBjW0AHJoxOtYqSUZNJxauErmLbVm2FW1y+J/YA9dUrAC39ITejlZWhVIwawkKw==", + "supports-color": { + "version": "5.5.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-5.5.0.tgz", + "integrity": "sha512-QjVjwdXIt408MIiAqCX4oUKsgU2EqAGzs2Ppkm4aQYbjm+ZEWEcW4SfFNTr4uMNZma0ey4f5lgLrkB0aX0QMow==", "dev": true, "requires": { - "core-util-is": "~1.0.0", - "inherits": "~2.0.3", - "isarray": "~1.0.0", - "process-nextick-args": "~2.0.0", - "safe-buffer": "~5.1.1", - "string_decoder": "~1.1.1", - "util-deprecate": "~1.0.1" + "has-flag": "^3.0.0" } }, - "regenerator-runtime": { - "version": "0.11.1", - "resolved": "https://registry.npmjs.org/regenerator-runtime/-/regenerator-runtime-0.11.1.tgz", - "integrity": "sha512-MguG95oij0fC3QV3URf4V2SDYGJhJnJGqvIIgdECeODCT98wSWDAJ94SSuVpYQUoTcGUIL6L4yNB7j1DFFHSBg==" - }, - "resolve": { - "version": "1.8.1", - "resolved": "https://registry.npmjs.org/resolve/-/resolve-1.8.1.tgz", - "integrity": "sha512-AicPrAC7Qu1JxPCZ9ZgCZlY35QgFnNqc+0LtbRNxnVw4TXvjQ72wnuL9JQcEBgXkI9JM8MsT9kaQoHcpCRJOYA==", + "table": { + "version": "5.4.6", + "resolved": "https://registry.npmjs.org/table/-/table-5.4.6.tgz", + "integrity": "sha512-wmEc8m4fjnob4gt5riFRtTu/6+4rSe12TpAELNSqHMfF3IqnA+CH37USM6/YR3qRZv7e56kAEAtd6nKZaxe0Ug==", "dev": true, "requires": { - "path-parse": "^1.0.5" + "ajv": "^6.10.2", + "lodash": "^4.17.14", + "slice-ansi": "^2.1.0", + "string-width": "^3.0.0" + }, + "dependencies": { + "emoji-regex": { + "version": "7.0.3", + "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-7.0.3.tgz", + "integrity": "sha512-CwBLREIQ7LvYFB0WyRvwhq5N5qPhc6PMjD6bYggFlI5YyDgl+0vxq5VHbMOFqLg7hfWzmu8T5Z1QofhmTIhItA==", + "dev": true + }, + "is-fullwidth-code-point": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-2.0.0.tgz", + "integrity": "sha1-o7MKXE8ZkYMWeqq5O+764937ZU8=", + "dev": true + }, + "string-width": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/string-width/-/string-width-3.1.0.tgz", + "integrity": "sha512-vafcv6KjVZKSgz06oM/H6GDBrAtz8vdhQakGjFIvNrHA6y3HCF1CInLy+QLq8dTJPQ1b+KDUqDFctkdRW44e1w==", + "dev": true, + "requires": { + "emoji-regex": "^7.0.1", + "is-fullwidth-code-point": "^2.0.0", + "strip-ansi": "^5.1.0" + } + } } }, - "resolve-from": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/resolve-from/-/resolve-from-2.0.0.tgz", - "integrity": "sha1-lICrIOlP+h2egKgEx+oUdhGWa1c=", + "term-size": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/term-size/-/term-size-2.2.0.tgz", + "integrity": "sha512-a6sumDlzyHVJWb8+YofY4TW112G6p2FCPEAFk+59gIYHv3XHRhm9ltVQ9kli4hNWeQBwSpe8cRN25x0ROunMOw==", "dev": true }, - "safe-buffer": { - "version": "5.1.2", - "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.1.2.tgz", - "integrity": "sha512-Gd2UZBJDkXlY7GbJxfsE8/nvKkUEU1G38c1siN6QP6a9PT9MmHB8GnpscSmMJSoF8LOIrt8ud/wPtojys4G6+g==", + "text-table": { + "version": "0.2.0", + "resolved": "https://registry.npmjs.org/text-table/-/text-table-0.2.0.tgz", + "integrity": "sha1-f17oI66AUgfACvLfSoTsP8+lcLQ=", "dev": true }, - "sax": { - "version": "1.2.4", - "resolved": "https://registry.npmjs.org/sax/-/sax-1.2.4.tgz", - "integrity": "sha512-NqVDv9TpANUjFm0N8uM5GxL36UgKi9/atZw+x7YFnQ8ckwFGKrl4xX4yWtrey3UJm5nP1kUbnYgLopqWNSRhWw==" - }, - "semver": { - "version": "5.0.3", - "resolved": "http://registry.npmjs.org/semver/-/semver-5.0.3.tgz", - "integrity": "sha1-d0Zt5YnNXTyV8TiqeLxWmjy10no=", + "through": { + "version": "2.3.8", + "resolved": "https://registry.npmjs.org/through/-/through-2.3.8.tgz", + "integrity": "sha1-DdTJ/6q8NXlgsbckEV1+Doai4fU=", "dev": true }, - "source-map": { - "version": "0.6.1", - "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz", - "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==", + "thunky": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/thunky/-/thunky-1.1.0.tgz", + "integrity": "sha512-eHY7nBftgThBqOyHGVN+l8gF0BucP09fMo0oO/Lb0w1OF80dJv+lDVpXG60WMQvkcxAkNybKsrEIE3ZtKGmPrA==", "dev": true }, - "source-map-support": { - "version": "0.5.9", - "resolved": "https://registry.npmjs.org/source-map-support/-/source-map-support-0.5.9.tgz", - "integrity": "sha512-gR6Rw4MvUlYy83vP0vxoVNzM6t8MUXqNuRsuBmBHQDu1Fh6X015FrLdgoDKcNdkwGubozq0P4N0Q37UyFVr1EA==", + "tmp": { + "version": "0.0.33", + "resolved": "https://registry.npmjs.org/tmp/-/tmp-0.0.33.tgz", + "integrity": "sha512-jRCJlojKnZ3addtTOjdIqoRuPEKBvNXcGYqzO6zWZX8KfKEpnGY5jfggJQ3EjKuu8D4bJRr0y+cYJFmYbImXGw==", "dev": true, "requires": { - "buffer-from": "^1.0.0", - "source-map": "^0.6.0" + "os-tmpdir": "~1.0.2" } }, - "sprintf-js": { - "version": "1.0.3", - "resolved": "https://registry.npmjs.org/sprintf-js/-/sprintf-js-1.0.3.tgz", - "integrity": "sha1-BOaSb2YolTVPPdAVIDYzuFcpfiw=", + "to-readable-stream": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/to-readable-stream/-/to-readable-stream-1.0.0.tgz", + "integrity": "sha512-Iq25XBt6zD5npPhlLVXGFN3/gyR2/qODcKNNyTMd4vbm39HUaOiAM4PMq0eMVC/Tkxz+Zjdsc55g9yyz+Yq00Q==", "dev": true }, - "string_decoder": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-1.1.1.tgz", - "integrity": "sha512-n/ShnvDi6FHbbVfviro+WojiFzv+s8MPMHBczVePfUpDJLwoLT0ht1l4YwBCbi8pJAveEEdnkHyPyTP/mzRfwg==", + "to-regex-range": { + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/to-regex-range/-/to-regex-range-5.0.1.tgz", + "integrity": "sha512-65P7iz6X5yEr1cwcgvQxbbIw7Uk3gOy5dIdtZ4rDveLqhrdJP+Li/Hx6tyK0NEb+2GCyneCMJiGqrADCSNk8sQ==", "dev": true, "requires": { - "safe-buffer": "~5.1.0" + "is-number": "^7.0.0" } }, - "strip-ansi": { - "version": "3.0.1", - "resolved": "http://registry.npmjs.org/strip-ansi/-/strip-ansi-3.0.1.tgz", - "integrity": "sha1-ajhfuIU9lS1f8F0Oiq+UJ43GPc8=", + "touch": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/touch/-/touch-3.1.0.tgz", + "integrity": "sha512-WBx8Uy5TLtOSRtIq+M03/sKDrXCLHxwDcquSP2c43Le03/9serjQBIztjRz6FkJez9D/hleyAXTBGLwwZUw9lA==", "dev": true, "requires": { - "ansi-regex": "^2.0.0" + "nopt": "~1.0.10" } }, - "supports-color": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-2.0.0.tgz", - "integrity": "sha1-U10EXOa2Nj+kARcIRimZXp3zJMc=", - "dev": true + "ts-node": { + "version": "8.10.1", + "resolved": "https://registry.npmjs.org/ts-node/-/ts-node-8.10.1.tgz", + "integrity": "sha512-bdNz1L4ekHiJul6SHtZWs1ujEKERJnHs4HxN7rjTyyVOFf3HaJ6sLqe6aPG62XTzAB/63pKRh5jTSWL0D7bsvw==", + "dev": true, + "requires": { + "arg": "^4.1.0", + "diff": "^4.0.1", + "make-error": "^1.1.1", + "source-map-support": "^0.5.17", + "yn": "3.1.1" + } }, - "tapable": { - "version": "0.2.8", - "resolved": "https://registry.npmjs.org/tapable/-/tapable-0.2.8.tgz", - "integrity": "sha1-mTcqXJmb8t8WCvwNdL7U9HlIzSI=", + "tslib": { + "version": "1.13.0", + "resolved": "https://registry.npmjs.org/tslib/-/tslib-1.13.0.tgz", + "integrity": "sha512-i/6DQjL8Xf3be4K/E6Wgpekn5Qasl1usyw++dAA35Ue5orEn65VIxOA+YvNNl9HV3qv70T7CNwjODHZrLwvd1Q==", "dev": true }, - "tern": { - "version": "0.22.3", - "resolved": "https://registry.npmjs.org/tern/-/tern-0.22.3.tgz", - "integrity": "sha512-A2C8GbR6uJWjHUwxtxF14oY1g8oJDEhM+n9ugRowX+jr8JHgNUeOLrYTOi/LV/JK9KHpxnYwyuhnal9YDXeeDQ==", + "tsutils": { + "version": "3.17.1", + "resolved": "https://registry.npmjs.org/tsutils/-/tsutils-3.17.1.tgz", + "integrity": "sha512-kzeQ5B8H3w60nFY2g8cJIuH7JDpsALXySGtwGJ0p2LSjLgay3NdIpqq5SoOBe46bKDW2iq25irHCr8wjomUS2g==", "dev": true, "requires": { - "acorn": "^5.4.0", - "enhanced-resolve": "^2.2.2", - "glob": "^7.1.1", - "minimatch": "^3.0.3", - "resolve-from": "2.0.0" + "tslib": "^1.8.1" } }, - "thunky": { + "tunnel": { + "version": "0.0.6", + "resolved": "https://registry.npmjs.org/tunnel/-/tunnel-0.0.6.tgz", + "integrity": "sha512-1h/Lnq9yajKY2PEbBadPXj3VxsDDu844OnaAo52UVmIzIvwwtBPIuNvkjuzBlTWpfJyUbG3ez0KSBibQkj4ojg==" + }, + "tweetnacl": { "version": "1.0.3", - "resolved": "https://registry.npmjs.org/thunky/-/thunky-1.0.3.tgz", - "integrity": "sha512-YwT8pjmNcAXBZqrubu22P4FYsh2D4dxRmnWBOL8Jk8bUcRUtc5326kx32tuTmFDAZtLOGEVNl8POAR8j896Iow==", + "resolved": "https://registry.npmjs.org/tweetnacl/-/tweetnacl-1.0.3.tgz", + "integrity": "sha512-6rt+RN7aOi1nGMyC4Xa5DdYiukl2UWCbcJft7YhxReBGQD7OAM8Pbxw6YMo4r2diNEA8FEmu32YOn9rhaiE5yw==", "dev": true }, - "timm": { - "version": "1.6.1", - "resolved": "https://registry.npmjs.org/timm/-/timm-1.6.1.tgz", - "integrity": "sha512-hqDTYi/bWuDxL2i6T3v6nrvkAQ/1Bc060GSkVEQZp02zTSTB4CHSKsOkliequCftQaNRcjRqUZmpGWs5FfhrNg==" + "type-check": { + "version": "0.3.2", + "resolved": "https://registry.npmjs.org/type-check/-/type-check-0.3.2.tgz", + "integrity": "sha1-WITKtRLPHTVeP7eE8wgEsrUg23I=", + "dev": true, + "requires": { + "prelude-ls": "~1.1.2" + } }, - "tinycolor2": { - "version": "1.4.1", - "resolved": "https://registry.npmjs.org/tinycolor2/-/tinycolor2-1.4.1.tgz", - "integrity": "sha1-9PrTM0R7wLB9TcjpIJ2POaisd+g=" + "type-fest": { + "version": "0.8.1", + "resolved": "https://registry.npmjs.org/type-fest/-/type-fest-0.8.1.tgz", + "integrity": "sha512-4dbzIzqvjtgiM5rw1k5rEHtBANKmdudhGyBEajN01fEyhaAIhsoKNy6y7+IN93IfpFtwY9iqi7kD+xwKhQsNJA==", + "dev": true }, - "trim": { - "version": "0.0.1", - "resolved": "https://registry.npmjs.org/trim/-/trim-0.0.1.tgz", - "integrity": "sha1-WFhUf2spB1fulczMZm+1AITEYN0=" + "typed-rest-client": { + "version": "1.7.3", + "resolved": "https://registry.npmjs.org/typed-rest-client/-/typed-rest-client-1.7.3.tgz", + "integrity": "sha512-CwTpx/TkRHGZoHkJhBcp4X8K3/WtlzSHVQR0OIFnt10j4tgy4ypgq/SrrgVpA1s6tAL49Q6J3R5C0Cgfh2ddqA==", + "requires": { + "qs": "^6.9.1", + "tunnel": "0.0.6", + "underscore": "1.8.3" + } }, - "ts-node": { - "version": "7.0.1", - "resolved": "https://registry.npmjs.org/ts-node/-/ts-node-7.0.1.tgz", - "integrity": "sha512-BVwVbPJRspzNh2yfslyT1PSbl5uIk03EZlb493RKHN4qej/D06n1cEhjlOJG69oFsE7OT8XjpTUcYf6pKTLMhw==", + "typedarray-to-buffer": { + "version": "3.1.5", + "resolved": "https://registry.npmjs.org/typedarray-to-buffer/-/typedarray-to-buffer-3.1.5.tgz", + "integrity": "sha512-zdu8XMNEDepKKR+XYOXAVPtWui0ly0NtohUscw+UmaHiAWT8hrV1rr//H6V+0DvJ3OQ19S979M0laLfX8rm82Q==", "dev": true, "requires": { - "arrify": "^1.0.0", - "buffer-from": "^1.1.0", - "diff": "^3.1.0", - "make-error": "^1.1.1", - "minimist": "^1.2.0", - "mkdirp": "^0.5.1", - "source-map-support": "^0.5.6", - "yn": "^2.0.0" + "is-typedarray": "^1.0.0" + } + }, + "typescript": { + "version": "3.9.2", + "resolved": "https://registry.npmjs.org/typescript/-/typescript-3.9.2.tgz", + "integrity": "sha512-q2ktq4n/uLuNNShyayit+DTobV2ApPEo/6so68JaD5ojvc/6GClBipedB9zNWYxRSAlZXAe405Rlijzl6qDiSw==", + "dev": true + }, + "undefsafe": { + "version": "2.0.3", + "resolved": "https://registry.npmjs.org/undefsafe/-/undefsafe-2.0.3.tgz", + "integrity": "sha512-nrXZwwXrD/T/JXeygJqdCO6NZZ1L66HrxM/Z7mIq2oPanoN0F1nLx3lwJMu6AwJY69hdixaFQOuoYsMjE5/C2A==", + "dev": true, + "requires": { + "debug": "^2.2.0" }, "dependencies": { - "minimist": { - "version": "1.2.0", - "resolved": "http://registry.npmjs.org/minimist/-/minimist-1.2.0.tgz", - "integrity": "sha1-o1AIsg9BOD7sH7kU9M1d95omQoQ=", + "debug": { + "version": "2.6.9", + "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz", + "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==", + "dev": true, + "requires": { + "ms": "2.0.0" + } + }, + "ms": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz", + "integrity": "sha1-VgiurfwAvmwpAd9fmGF4jeDVl8g=", "dev": true } } }, - "tslib": { - "version": "1.9.3", - "resolved": "https://registry.npmjs.org/tslib/-/tslib-1.9.3.tgz", - "integrity": "sha512-4krF8scpejhaOgqzBEcGM7yDIEfi0/8+8zDRZhNZZ2kjmHJ4hv3zCbQWxoJGz1iw5U0Jl0nma13xzHXcncMavQ==", - "dev": true + "underscore": { + "version": "1.8.3", + "resolved": "https://registry.npmjs.org/underscore/-/underscore-1.8.3.tgz", + "integrity": "sha1-Tz+1OxBuYJf8+ctBCfKl6b36UCI=" }, - "tslint": { - "version": "5.11.0", - "resolved": "https://registry.npmjs.org/tslint/-/tslint-5.11.0.tgz", - "integrity": "sha1-mPMMAurjzecAYgHkwzywi0hYHu0=", + "unique-string": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/unique-string/-/unique-string-2.0.0.tgz", + "integrity": "sha512-uNaeirEPvpZWSgzwsPGtU2zVSTrn/8L5q/IexZmH0eH6SA73CmAA5U4GwORTxQAZs95TAXLNqeLoPPNO5gZfWg==", "dev": true, "requires": { - "babel-code-frame": "^6.22.0", - "builtin-modules": "^1.1.1", - "chalk": "^2.3.0", - "commander": "^2.12.1", - "diff": "^3.2.0", - "glob": "^7.1.1", - "js-yaml": "^3.7.0", - "minimatch": "^3.0.4", - "resolve": "^1.3.2", - "semver": "^5.3.0", - "tslib": "^1.8.0", - "tsutils": "^2.27.2" + "crypto-random-string": "^2.0.0" + } + }, + "update-notifier": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/update-notifier/-/update-notifier-4.1.0.tgz", + "integrity": "sha512-w3doE1qtI0/ZmgeoDoARmI5fjDoT93IfKgEGqm26dGUOh8oNpaSTsGNdYRN/SjOuo10jcJGwkEL3mroKzktkew==", + "dev": true, + "requires": { + "boxen": "^4.2.0", + "chalk": "^3.0.0", + "configstore": "^5.0.1", + "has-yarn": "^2.1.0", + "import-lazy": "^2.1.0", + "is-ci": "^2.0.0", + "is-installed-globally": "^0.3.1", + "is-npm": "^4.0.0", + "is-yarn-global": "^0.3.0", + "latest-version": "^5.0.0", + "pupa": "^2.0.1", + "semver-diff": "^3.1.1", + "xdg-basedir": "^4.0.0" }, "dependencies": { "ansi-styles": { - "version": "3.2.1", - "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-3.2.1.tgz", - "integrity": "sha512-VT0ZI6kZRdTh8YyJw3SMbYm/u+NqfsAxEpWO0Pf9sq8/e94WxxOpPKx9FR1FlyCtOVDNOQ+8ntlqFxiRc+r5qA==", + "version": "4.2.1", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.2.1.tgz", + "integrity": "sha512-9VGjrMsG1vePxcSweQsN20KY/c4zN0h9fLjqAbwbPfahM3t+NL+M9HC8xeXG2I8pX5NoamTGNuomEUFI7fcUjA==", "dev": true, "requires": { - "color-convert": "^1.9.0" + "@types/color-name": "^1.1.1", + "color-convert": "^2.0.1" } }, "chalk": { - "version": "2.4.1", - "resolved": "https://registry.npmjs.org/chalk/-/chalk-2.4.1.tgz", - "integrity": "sha512-ObN6h1v2fTJSmUXoS3nMQ92LbDK9be4TV+6G+omQlGJFdcUX5heKi1LZ1YnRMIgwTLEj3E24bT6tYni50rlCfQ==", + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-3.0.0.tgz", + "integrity": "sha512-4D3B6Wf41KOYRFdszmDqMCGq5VV/uMAB273JILmO+3jAlh8X4qDtdtgCR3fxtbLEMzSx22QdhnDcJvu2u1fVwg==", "dev": true, "requires": { - "ansi-styles": "^3.2.1", - "escape-string-regexp": "^1.0.5", - "supports-color": "^5.3.0" + "ansi-styles": "^4.1.0", + "supports-color": "^7.1.0" } }, - "commander": { - "version": "2.19.0", - "resolved": "https://registry.npmjs.org/commander/-/commander-2.19.0.tgz", - "integrity": "sha512-6tvAOO+D6OENvRAh524Dh9jcfKTYDQAqvqezbCW82xj5X0pSrcpxtvRKHLG0yBY6SD7PSDrJaj+0AiOcKVd1Xg==", + "color-convert": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz", + "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==", + "dev": true, + "requires": { + "color-name": "~1.1.4" + } + }, + "color-name": { + "version": "1.1.4", + "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz", + "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==", "dev": true }, - "semver": { - "version": "5.6.0", - "resolved": "https://registry.npmjs.org/semver/-/semver-5.6.0.tgz", - "integrity": "sha512-RS9R6R35NYgQn++fkDWaOmqGoj4Ek9gGs+DPxNUZKuwE183xjJroKvyo1IzVFeXvUrvmALy6FWD5xrdJT25gMg==", + "has-flag": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz", + "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==", "dev": true }, "supports-color": { - "version": "5.5.0", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-5.5.0.tgz", - "integrity": "sha512-QjVjwdXIt408MIiAqCX4oUKsgU2EqAGzs2Ppkm4aQYbjm+ZEWEcW4SfFNTr4uMNZma0ey4f5lgLrkB0aX0QMow==", + "version": "7.1.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.1.0.tgz", + "integrity": "sha512-oRSIpR8pxT1Wr2FquTNnGet79b3BWljqOuoW/h4oBhxJ/HUbX5nX6JSruTkvXDCFMwDPvsaTTbvMLKZWSy0R5g==", "dev": true, "requires": { - "has-flag": "^3.0.0" + "has-flag": "^4.0.0" } } } }, - "tsutils": { - "version": "2.29.0", - "resolved": "https://registry.npmjs.org/tsutils/-/tsutils-2.29.0.tgz", - "integrity": "sha512-g5JVHCIJwzfISaXpXE1qvNalca5Jwob6FjI4AoPlqMusJ6ftFE7IkkFoMhVLRgK+4Kx3gkzb8UZK5t5yTTvEmA==", + "uri-js": { + "version": "4.2.2", + "resolved": "https://registry.npmjs.org/uri-js/-/uri-js-4.2.2.tgz", + "integrity": "sha512-KY9Frmirql91X2Qgjry0Wd4Y+YTdrdZheS8TFwvkbLWf/G5KNJDCh6pKL5OZctEW4+0Baa5idK2ZQuELRwPznQ==", "dev": true, "requires": { - "tslib": "^1.8.1" + "punycode": "^2.1.0" } }, - "tunnel": { - "version": "0.0.4", - "resolved": "http://registry.npmjs.org/tunnel/-/tunnel-0.0.4.tgz", - "integrity": "sha1-LTeFoVjBdMmhbcLARuxfxfF0IhM=" + "url-parse-lax": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/url-parse-lax/-/url-parse-lax-3.0.0.tgz", + "integrity": "sha1-FrXK/Afb42dsGxmZF3gj1lA6yww=", + "dev": true, + "requires": { + "prepend-http": "^2.0.0" + } }, - "type-detect": { - "version": "4.0.8", - "resolved": "https://registry.npmjs.org/type-detect/-/type-detect-4.0.8.tgz", - "integrity": "sha512-0fr/mIH1dlO+x7TlcMy+bIDqKPsw/70tVyeHW787goQjhmqaZe10uwLujubK9q9Lg6Fiho1KUKDYz0Z7k7g5/g==" + "v8-compile-cache": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/v8-compile-cache/-/v8-compile-cache-2.1.0.tgz", + "integrity": "sha512-usZBT3PW+LOjM25wbqIlZwPeJV+3OSz3M1k1Ws8snlW39dZyYL9lOGC5FgPVHfk0jKmjiDV8Z0mIbVQPiwFs7g==", + "dev": true }, - "typed-rest-client": { - "version": "1.0.11", - "resolved": "https://registry.npmjs.org/typed-rest-client/-/typed-rest-client-1.0.11.tgz", - "integrity": "sha512-Iz2/p1EkJp8laAIlW/4h+3u+eJqmslosrX2wK1ofM74fCnRpM/EAPM+psjcQKomlNQrInKLPp/JYnsH4ZuzhQQ==", + "which": { + "version": "1.3.1", + "resolved": "https://registry.npmjs.org/which/-/which-1.3.1.tgz", + "integrity": "sha512-HxJdYWq1MTIQbJ3nw0cqssHoTNU267KlrDuGZ1WYlxDStUtKUhOaJmh112/TZmHxxUfuJqPXSOm7tDyas0OSIQ==", + "dev": true, "requires": { - "nock": "9.6.1", - "tunnel": "0.0.4", - "underscore": "1.8.3" + "isexe": "^2.0.0" } }, - "typescript": { - "version": "3.1.6", - "resolved": "https://registry.npmjs.org/typescript/-/typescript-3.1.6.tgz", - "integrity": "sha512-tDMYfVtvpb96msS1lDX9MEdHrW4yOuZ4Kdc4Him9oU796XldPYF/t2+uKoX0BBa0hXXwDlqYQbXY5Rzjzc5hBA==", - "dev": true + "which-boxed-primitive": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/which-boxed-primitive/-/which-boxed-primitive-1.0.1.tgz", + "integrity": "sha512-7BT4TwISdDGBgaemWU0N0OU7FeAEJ9Oo2P1PHRm/FCWoEi2VLWC9b6xvxAA3C/NMpxg3HXVgi0sMmGbNUbNepQ==", + "dev": true, + "requires": { + "is-bigint": "^1.0.0", + "is-boolean-object": "^1.0.0", + "is-number-object": "^1.0.3", + "is-string": "^1.0.4", + "is-symbol": "^1.0.2" + } }, - "underscore": { - "version": "1.8.3", - "resolved": "https://registry.npmjs.org/underscore/-/underscore-1.8.3.tgz", - "integrity": "sha1-Tz+1OxBuYJf8+ctBCfKl6b36UCI=" + "which-collection": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/which-collection/-/which-collection-1.0.1.tgz", + "integrity": "sha512-W8xeTUwaln8i3K/cY1nGXzdnVZlidBcagyNFtBdD5kxnb4TvGKR7FfSIS3mYpwWS1QUCutfKz8IY8RjftB0+1A==", + "dev": true, + "requires": { + "is-map": "^2.0.1", + "is-set": "^2.0.1", + "is-weakmap": "^2.0.1", + "is-weakset": "^2.0.1" + } }, - "utif": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/utif/-/utif-2.0.1.tgz", - "integrity": "sha512-Z/S1fNKCicQTf375lIP9G8Sa1H/phcysstNrrSdZKj1f9g58J4NMgb5IgiEZN9/nLMPDwF0W7hdOe9Qq2IYoLg==", + "which-typed-array": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/which-typed-array/-/which-typed-array-1.1.2.tgz", + "integrity": "sha512-KT6okrd1tE6JdZAy3o2VhMoYPh3+J6EMZLyrxBQsZflI1QCZIxMrIYLkosd8Twf+YfknVIHmYQPgJt238p8dnQ==", + "dev": true, "requires": { - "pako": "^1.0.5" + "available-typed-arrays": "^1.0.2", + "es-abstract": "^1.17.5", + "foreach": "^2.0.5", + "function-bind": "^1.1.1", + "has-symbols": "^1.0.1", + "is-typed-array": "^1.1.3" } }, - "util-deprecate": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/util-deprecate/-/util-deprecate-1.0.2.tgz", - "integrity": "sha1-RQ1Nyfpw3nMnYvvS1KKJgUGaDM8=", + "widest-line": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/widest-line/-/widest-line-3.1.0.tgz", + "integrity": "sha512-NsmoXalsWVDMGupxZ5R08ka9flZjjiLvHVAWYOKtiKM8ujtZWr9cRffak+uSE48+Ob8ObalXpwyeUiyDD6QFgg==", + "dev": true, + "requires": { + "string-width": "^4.0.0" + } + }, + "word-wrap": { + "version": "1.2.3", + "resolved": "https://registry.npmjs.org/word-wrap/-/word-wrap-1.2.3.tgz", + "integrity": "sha512-Hz/mrNwitNRh/HUAtM/VT/5VH+ygD6DV7mYKZAtHOrbs8U7lvPS6xf7EJKMF0uW1KJCl0H701g3ZGus+muE5vQ==", "dev": true }, "wrappy": { @@ -1538,45 +2708,37 @@ "integrity": "sha1-tSQ9jz7BqjXxNkYFvA0QNuMKtp8=", "dev": true }, - "xhr": { - "version": "2.5.0", - "resolved": "https://registry.npmjs.org/xhr/-/xhr-2.5.0.tgz", - "integrity": "sha512-4nlO/14t3BNUZRXIXfXe+3N6w3s1KoxcJUUURctd64BLRe67E4gRwp4PjywtDY72fXpZ1y6Ch0VZQRY/gMPzzQ==", + "write": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/write/-/write-1.0.3.tgz", + "integrity": "sha512-/lg70HAjtkUgWPVZhZcm+T4hkL8Zbtp1nFNOn3lRrxnlv50SRBv7cR7RqR+GMsd3hUXy9hWBo4CHTbFTcOYwig==", + "dev": true, "requires": { - "global": "~4.3.0", - "is-function": "^1.0.1", - "parse-headers": "^2.0.0", - "xtend": "^4.0.0" + "mkdirp": "^0.5.1" } }, - "xml-parse-from-string": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/xml-parse-from-string/-/xml-parse-from-string-1.0.1.tgz", - "integrity": "sha1-qQKekp09vN7RafPG4oI42VpdWig=" - }, - "xml2js": { - "version": "0.4.19", - "resolved": "https://registry.npmjs.org/xml2js/-/xml2js-0.4.19.tgz", - "integrity": "sha512-esZnJZJOiJR9wWKMyuvSE1y6Dq5LCuJanqhxslH2bxM6duahNZ+HMpCLhBQGZkbX6xRf8x1Y2eJlgt2q3qo49Q==", + "write-file-atomic": { + "version": "3.0.3", + "resolved": "https://registry.npmjs.org/write-file-atomic/-/write-file-atomic-3.0.3.tgz", + "integrity": "sha512-AvHcyZ5JnSfq3ioSyjrBkH9yW4m7Ayk8/9My/DD9onKeu/94fwrMocemO2QAJFAlnnDN+ZDS+ZjAR5ua1/PV/Q==", + "dev": true, "requires": { - "sax": ">=0.6.0", - "xmlbuilder": "~9.0.1" + "imurmurhash": "^0.1.4", + "is-typedarray": "^1.0.0", + "signal-exit": "^3.0.2", + "typedarray-to-buffer": "^3.1.5" } }, - "xmlbuilder": { - "version": "9.0.7", - "resolved": "http://registry.npmjs.org/xmlbuilder/-/xmlbuilder-9.0.7.tgz", - "integrity": "sha1-Ey7mPS7FVlxVfiD0wi35rKaGsQ0=" - }, - "xtend": { - "version": "4.0.1", - "resolved": "https://registry.npmjs.org/xtend/-/xtend-4.0.1.tgz", - "integrity": "sha1-pcbVMr5lbiPbgg77lDofBJmNY68=" + "xdg-basedir": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/xdg-basedir/-/xdg-basedir-4.0.0.tgz", + "integrity": "sha512-PSNhEJDejZYV7h50BohL09Er9VaIefr2LMAf3OEmpCkjOi34eYyQYAXUTjEQtZJTKcF0E2UKTh+osDLsgNim9Q==", + "dev": true }, "yn": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/yn/-/yn-2.0.0.tgz", - "integrity": "sha1-5a2ryKz0CPY4X8dklWhMiOavaJo=", + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/yn/-/yn-3.1.1.tgz", + "integrity": "sha512-Ux4ygGWsu2c7isFWe8Yu1YluJmqVhxqK2cLXNQA5AcC3QfbGNpM7fu0Y8b/z16pXLnFxZYvWhd3fhBY9DLmC6Q==", "dev": true } } diff --git a/package.json b/package.json index 4276292..09b6b99 100644 --- a/package.json +++ b/package.json @@ -1,55 +1,53 @@ { + "displayName": "Homebridge Bloomsky", "name": "homebridge-bloomsky", - "version": "1.2", + "version": "1.2.0-alpha.2", "description": "Homebridge plugin for Bloomsky weather stations", - "main": "index.js", - "devDependencies": { - "@types/chai": "^4.1.6", - "@types/debug": "0.0.31", - "@types/ip": "0.0.31", - "@types/mocha": "^5.2.5", - "@types/node": "^10.12.0", - "@types/sharp": "^0.21.0", - "async-wait-until": "^1.2.4", - "chai": "^4.2.0", - "hap-nodejs": "^0.4.47", - "homebridge": ">=0.4.42", - "mocha": "^7.1.2", - "mocha-logger": "^1.0.6", - "tern": "^0.22.3", - "ts-node": "^7.0.1", - "tslint": "^5.11.0", - "typescript": "^3.1.3" - }, - "scripts": { - "test": "mocha -r ts-node/register **/*.spec.ts", - "standalone": "node standalone.js" - }, + "author": "Michael Henke", + "license": "Apache-2.0", "repository": { "type": "git", "url": "git+https://github.com/aphex3k/homebridge-bloomsky.git" }, - "keywords": [ - "homebridge-plugin", - "bloomsky" - ], - "author": "Michael Henke", - "license": "Apache-2.0", "bugs": { "url": "https://github.com/aphex3k/homebridge-bloomsky/issues" }, "homepage": "https://github.com/aphex3k/homebridge-bloomsky#readme", + "engines": { + "node": ">=10.17.0", + "homebridge": ">0.4.53", + "npm": ">=6.4.1" + }, + "main": "dist/index.js", + "scripts": { + "lint": "eslint src/**.ts", + "watch": "npm run build && npm link && nodemon", + "build": "rimraf ./dist && tsc --build tsconfig.json", + "prepublishOnly": "npm run lint && npm run build" + }, + "keywords": [ + "homebridge-plugin", + "bloomsky" + ], "dependencies": { "child_process": "^1.0.2", "ip": "^1.1.5", - "jimp": "^0.5.6", "optional": "^0.1.4", "typed-rest-client": "^1.0.9" }, - "engines": { - "node": ">=6.2.2", - "homebridge": ">=0.4.42", - "npm": ">=6.4.1" - }, - "optionalDependencies": {} + "devDependencies": { + "@types/chai": "^4.1.6", + "@types/debug": "0.0.31", + "@types/ip": "0.0.31", + "@types/node": "^14.0.1", + "@typescript-eslint/eslint-plugin": "^2.34.0", + "@typescript-eslint/parser": "^2.34.0", + "async-wait-until": "^1.2.4", + "eslint": "^6.8.0", + "homebridge": "^1.1.0", + "nodemon": "^2.0.4", + "rimraf": "^3.0.2", + "ts-node": "^8.10.1", + "typescript": "^3.9.2" + } } diff --git a/preview.jpeg b/preview.jpeg deleted file mode 100644 index 5c295ba..0000000 Binary files a/preview.jpeg and /dev/null differ diff --git a/src/AddressResponse.ts b/src/AddressResponse.ts deleted file mode 100644 index 7c6f238..0000000 --- a/src/AddressResponse.ts +++ /dev/null @@ -1,6 +0,0 @@ -declare class AddressResponse { - public address: string; - public type: string; -} - -export { AddressResponse}; diff --git a/src/AudioResponse.d.ts b/src/AudioResponse.d.ts deleted file mode 100644 index 3e37913..0000000 --- a/src/AudioResponse.d.ts +++ /dev/null @@ -1,7 +0,0 @@ -import { BaseResponse } from "./BaseResponse"; - -declare class AudioResponse extends BaseResponse { - -} - -export { AudioResponse }; diff --git a/src/BaseResponse.d.ts b/src/BaseResponse.d.ts deleted file mode 100644 index 981dd58..0000000 --- a/src/BaseResponse.d.ts +++ /dev/null @@ -1,10 +0,0 @@ -declare class BaseResponse { - public port: number; - // tslint:disable-next-line:variable-name - public srtp_key: Uint8Array; - // tslint:disable-next-line:variable-name - public srtp_salt: Uint8Array; - public ssrc: number; -} - -export { BaseResponse }; diff --git a/src/Bloomsky.ts b/src/Bloomsky.ts deleted file mode 100644 index 47af4dc..0000000 --- a/src/Bloomsky.ts +++ /dev/null @@ -1,566 +0,0 @@ -import * as Client from "typed-rest-client"; -import * as fs from "fs"; -import * as http from "http"; - -import API from "./homebridge"; -import { FFMPEG } from "./Ffmpeg"; -import { IHeaders } from "typed-rest-client/Interfaces"; -import { IStation } from "./Station"; -import { PlatformAccessory } from "./PlatformAccessory"; - -export { Bloomsky }; - -export default class Bloomsky { - public static Accessory: PlatformAccessory; - public static Service: HAPNodeJS.Service; - public static Characteristic: HAPNodeJS.Characteristic; - public static Hap: HAPNodeJS.HAPNodeJS; - public static UUIDGen: HAPNodeJS.uuid; - - public timeout: NodeJS.Timeout | undefined; - public accessories: PlatformAccessory[]; - - public log: (text: string) => void; - - private apiKey: string; - private apiUrl: string; - private vcodec: string; - private api: API | undefined; - private latestData: IStation[]; - private debug: boolean; - - // Platform constructor - // config may be null - // api may be null if launched from old homebridge version - constructor(log: (text: string) => void, config: any, api: API) { - if (Bloomsky.Accessory === undefined) { - throw Error("Accessory undefined"); - } - if (Bloomsky.Service === undefined) { - throw Error("Service undefined"); - } - if (Bloomsky.Characteristic === undefined) { - throw Error("Characteristic undefined"); - } - if (Bloomsky.Hap === undefined) { - throw Error("Hap undefined"); - } - if (Bloomsky.UUIDGen === undefined) { - throw Error("UUIDGen undefined"); - } - - this.log = log; - this.accessories = [] as PlatformAccessory[]; - this.apiKey = config.apiKey; - this.apiUrl = config.apiUrl || "https://api.bloomsky.com/api/skydata/"; - this.vcodec = config.vcodec || "libx264"; - this.latestData = [] as IStation[]; - this.debug = config.debug; - - this.log("Bloomsky Init"); - - const platform = this; - - if (api) { - // Save the API object as plugin needs to register new accessory via this object - platform.api = api; - - // Listen to event "didFinishLaunching", this means homebridge already finished loading cached accessories. - // Platform Plugin should only register new accessory that doesn't exist in homebridge after this event. - // Or start discover new accessories. - - platform.api.on( - "didFinishLaunching", - function () { - platform.log("didFinishLaunching"); - - platform.updateData().catch((clientError) => { - platform.log(clientError); - }); - }.bind(this) - ); - - platform.api.on("publishCameraAccessories", function () { - platform.log("publishCameraAccessories"); - }); - } else { - platform.updateData().catch((clientError) => { - platform.log(clientError); - }); - } - } - - // Function invoked when homebridge tries to restore cached accessory. - // Developer can configure accessory here (like setup event handler). - // Update current value. - public configureAccessory(accessory: PlatformAccessory) { - if (this.debug) { - this.log("configuring accessory... " + accessory.displayName); - } - - const platform = this; - const ffmpeg = this.getFfmpegForStationWithUuid(accessory.UUID); - - try { - accessory.configureCameraSource(ffmpeg); - } catch { - accessory.cameraSource = ffmpeg; - } - - for (const index in ffmpeg.services) { - if (ffmpeg.hasOwnProperty(index)) { - const service = ffmpeg.services[index]; - try { - accessory.removeService(service); - } catch { - if (this.debug) { - this.log("unable to remove existing camera service"); - } - } finally { - accessory.addService(service); - if (this.debug) { - this.log("added camera service: " + service.displayName); - } - } - } - } - - // Do not add any existing services... but this is a good place to add services to earlier registered accessories - - this.accessories.push(accessory); - // Set the accessory to reachable if plugin can currently process the accessory, - // otherwise set to false and update the reachability later by invoking - // accessory.updateReachability() - if (this.latestData != null && this.latestData.length > 0) { - if (this.debug) { - this.log("Configure Accessory " + accessory.displayName); - } - const stations = platform.latestData.filter( - (station) => - accessory.UUID === Bloomsky.UUIDGen.generate(station.DeviceID) - ); - - accessory.reachable = stations.length === 1 && stations[0] !== undefined; - - if (accessory.reachable) { - this.updateAccessory(stations[0]); - } - } else { - if (this.debug) { - this.log("Can't Configure Accessory " + accessory.displayName); - } - accessory.reachable = false; - } - } - - // add accessory dynamically from outside event - public addAccessory(station: IStation) { - if (this.debug) { - this.log("Add Accessory: " + station.DeviceID); - } - - const uuid = Bloomsky.UUIDGen.generate(station.DeviceID); - const newAccessory = new Bloomsky.Accessory(station.DeviceName, uuid); - const cameraSource = this.getFfmpegForStationWithUuid(uuid); - const countBefore = newAccessory.services.length; - - newAccessory.configureCameraSource(cameraSource); - - if (cameraSource.services.length === 0) { - throw Error("Camera Control came without services..."); - } else { - for (const service of newAccessory.services) { - if (this.debug) { - this.log( - service.UUID + - (service.subtype !== undefined ? "." + service.subtype : "") - ); - } - } - } - - if ( - newAccessory.services.length <= countBefore || - newAccessory.cameraSource !== cameraSource || - newAccessory.services.length < cameraSource.services.length - ) { - throw Error( - "Camera Control Service Registration failed... +" + - (cameraSource.services.length - countBefore) - ); - } else { - if (this.debug) { - this.log( - "Registered " + - (cameraSource.services.length - countBefore) + - " Camera Control Services" - ); - } - } - - newAccessory - .addService(Bloomsky.Service.TemperatureSensor, "Temperature") - .getCharacteristic(Bloomsky.Characteristic.CurrentTemperature) - .updateValue(station.Data.Temperature); - - newAccessory - .addService(Bloomsky.Service.LightSensor, "Luminance") - .getCharacteristic(Bloomsky.Characteristic.CurrentAmbientLightLevel) - .updateValue(station.Data.Luminance); - - newAccessory - .addService(Bloomsky.Service.HumiditySensor, "Humidity") - .getCharacteristic(Bloomsky.Characteristic.CurrentRelativeHumidity) - .updateValue(station.Data.Humidity); - - newAccessory - .addService(Bloomsky.Service.MotionSensor, "Rain") - .getCharacteristic(Bloomsky.Characteristic.MotionDetected) - .updateValue(station.Data.Rain); - - newAccessory - .addService(Bloomsky.Service.OccupancySensor, "Night") - .getCharacteristic(Bloomsky.Characteristic.OccupancyDetected) - .updateValue(station.Data.Night); - - // I only have a Sky 1 model so I can only make a guess about the battery level - // for this specific model. - if (station.Data.DeviceType === "SKY1") { - // clamp battery level between 0 and 100 - const batteryLevel = Math.max( - 0, - Math.min(100, (100 / 2600) * station.Data.Voltage) - ); - - const batteryService = newAccessory.addService( - Bloomsky.Service.BatteryService, - "Battery" - ); - batteryService - .getCharacteristic(Bloomsky.Characteristic.BatteryLevel) - .updateValue(batteryLevel); - batteryService - .getCharacteristic(Bloomsky.Characteristic.ChargingState) - .updateValue(2); - batteryService - .getCharacteristic(Bloomsky.Characteristic.StatusLowBattery) - .updateValue(batteryLevel < 20); - } - - let informationService = newAccessory.getService( - Bloomsky.Service.AccessoryInformation - ); - - if (!informationService) { - informationService = newAccessory.addService( - Bloomsky.Service.AccessoryInformation, - station.DeviceName - ); - } - informationService - .getCharacteristic(Bloomsky.Characteristic.Manufacturer) - .updateValue("Bloomsky"); - informationService - .getCharacteristic(Bloomsky.Characteristic.Model) - .updateValue(station.Data.DeviceType); - informationService - .getCharacteristic(Bloomsky.Characteristic.SerialNumber) - .updateValue(station.DeviceID); - informationService - .getCharacteristic(Bloomsky.Characteristic.Identify) - .updateValue(false); - informationService - .getCharacteristic(Bloomsky.Characteristic.Name) - .updateValue(station.DeviceName); - informationService - .getCharacteristic(Bloomsky.Characteristic.FirmwareRevision) - .updateValue(station.Data.DeviceType); - - if (this.debug) { - this.accessories.push(newAccessory); - } - - this.log("new accessory pushed..."); - - if (this.api !== undefined) { - // https://github.com/nfarina/homebridge/wiki/Supporting-IP-Camera - this.api.publishCameraAccessories( - "homebridge-bloomsky", - this.accessories - ); - } else { - throw TypeError("this.api UNDEFINED!!!"); - } - - if (this.debug) { - this.log("new accessory registered..."); - } - - if (this.debug) { - let output = ""; - for (const property in newAccessory) { - if (newAccessory.hasOwnProperty(property)) { - output += property + ": " + newAccessory[property] + "; "; - } - } - this.log(output); - } - } - - // add accessory dynamically from outside event - public updateAccessory(station: IStation) { - if (this.debug) { - this.log("Update Accessory"); - } - - const platform = this; - const stationUuid = Bloomsky.UUIDGen.generate(station.DeviceID); - const accessory = platform.accessories.filter( - (anyAccessory) => anyAccessory.UUID === stationUuid - )[0] as PlatformAccessory; - - accessory - .getService(Bloomsky.Service.TemperatureSensor) - .getCharacteristic(Bloomsky.Characteristic.CurrentTemperature) - .updateValue(station.Data.Temperature); - - accessory - .getService(Bloomsky.Service.LightSensor) - .getCharacteristic(Bloomsky.Characteristic.CurrentAmbientLightLevel) - .updateValue(station.Data.Luminance); - - accessory - .getService(Bloomsky.Service.HumiditySensor) - .getCharacteristic(Bloomsky.Characteristic.CurrentRelativeHumidity) - .updateValue(station.Data.Humidity); - - accessory - .getService(Bloomsky.Service.MotionSensor) - .getCharacteristic(Bloomsky.Characteristic.MotionDetected) - .updateValue(station.Data.Rain); - - accessory - .getService(Bloomsky.Service.OccupancySensor) - .getCharacteristic(Bloomsky.Characteristic.OccupancyDetected) - .updateValue(station.Data.Night); - - const informationService = accessory.getService( - Bloomsky.Service.AccessoryInformation - ); - informationService - .getCharacteristic(Bloomsky.Characteristic.Manufacturer) - .updateValue("Bloomsky"); - informationService - .getCharacteristic(Bloomsky.Characteristic.Model) - .updateValue(station.Data.DeviceType); - informationService - .getCharacteristic(Bloomsky.Characteristic.SerialNumber) - .updateValue(station.DeviceID); - informationService - .getCharacteristic(Bloomsky.Characteristic.Identify) - .updateValue(false); - informationService - .getCharacteristic(Bloomsky.Characteristic.Name) - .updateValue(station.DeviceName); - informationService - .getCharacteristic(Bloomsky.Characteristic.FirmwareRevision) - .updateValue(station.Data.DeviceType); - - // I only have a Sky 1 model so I can only make a guess about the battery level - // for this specific model. - if (station.Data.DeviceType === "SKY1") { - // clamp battery level between 0 and 100 - const batteryLevel = Math.max( - 0, - Math.min(100, (100 / 2600) * station.Data.Voltage) - ); - - const batteryService = accessory.getService( - Bloomsky.Service.BatteryService - ); - batteryService - .getCharacteristic(Bloomsky.Characteristic.BatteryLevel) - .updateValue(batteryLevel); - batteryService - .getCharacteristic(Bloomsky.Characteristic.ChargingState) - .updateValue(2); - batteryService - .getCharacteristic(Bloomsky.Characteristic.StatusLowBattery) - .updateValue(batteryLevel < 20); - } - - const file = fs.createWriteStream( - this.temporaryFilenameForStationUuid(accessory.UUID) - ); - file.on("finish", function () { - file.close(); - if (platform.debug) { - platform.log("temporary file updated..."); - } - }); - http.get(station.Data.ImageURL, function (response) { - response.pipe(file); - platform.log("temporary file written"); - }); - } - - // remove accessory dynamically from outside event - public removeAccessory() { - if (this.debug) { - this.log("Remove Accessory"); - } - - if (this.api !== undefined) { - this.api.unregisterPlatformAccessories( - "homebridge-bloomsky", - "Bloomsky", - this.accessories - ); - } - this.accessories = [] as PlatformAccessory[]; - } - - public temporaryFilenameForStationUuid(uuid: string): string { - return uuid + ".jpg"; - } - - public getFfmpegForStationWithUuid(uuid: string): FFMPEG { - const filename = this.temporaryFilenameForStationUuid(uuid); - - const ffmpeg = new FFMPEG( - Bloomsky.UUIDGen, - Bloomsky.Hap, - { - name: uuid, - videoConfig: { - debug: this.debug, - maxHeight: 640, - maxStreams: 1, - maxWidth: 640, - source: "-loop 1 -i " + filename, - vcodec: this.vcodec, - }, - }, - this.log, - "ffmpeg", - filename - ); - - return ffmpeg; - } - - private async updateData() { - if (this.apiKey === undefined) { - if (this.debug) { - this.log("Skipping updating data..."); - } - } else { - const platform = this; - - const requestOptions: Client.IRequestOptions = { - additionalHeaders: { Authorization: this.apiKey } as IHeaders, - }; - - const client = new Client.RestClient("NodeJS"); - - if (platform.debug) { - this.log("updateData"); - } - - const response = await client - .get(this.apiUrl + "?unit=intl", requestOptions) - .catch((clientError) => { - if (platform.debug) { - platform.log(clientError); - } - }); - - const error: any = response as any; - if (error !== undefined && error.detail) { - platform.log(error.detail); - } else if (response != null) { - if (response.result != null) { - platform.latestData = response.result; - } - - if (response != null && platform.latestData.length > 0) { - if (platform.accessories.length > 0) { - platform.updateExistingAccessories(); - } - platform.registerNewAccessories(); - platform.updateAccessoriesReachability(); - } - } - - platform.timeout = setTimeout( - function () { - platform.updateData().catch((clientError) => { - platform.log(clientError); - }); - }.bind(platform), - platform.debug ? 30000 : 150000 - ); // 2.5 minutes, 10 seconds for debugging - platform.timeout.unref(); - } - } - - private stationNeedsToBeRegistered(station: IStation) { - if (this.debug) { - this.log("stationNeedsToBeRegistered: " + station); - } - const stationUuid = Bloomsky.UUIDGen.generate(station.DeviceID).valueOf(); - return ( - this.accessories.filter( - (accessory) => accessory.UUID.valueOf() === stationUuid - ).length === 0 - ); - } - - private updateExistingAccessories() { - if (this.debug) { - this.log("updateExistingAccessories"); - } - const platform = this; - - if (this.debug) { - this.log(platform.latestData.toString()); - } - - const registeredAccessories = platform.latestData.filter( - (station) => !this.stationNeedsToBeRegistered(station) - ); - - for (let i = 0, len = registeredAccessories.length; i < len; i++) { - const station = registeredAccessories[i]; - platform.updateAccessory(station); - } - } - - private registerNewAccessories() { - if (this.debug) { - this.log("registerNewAccessories"); - } - const platform = this; - - if (platform.latestData.length === 0) { - return; - } - const unregisteredAccessories = platform.latestData.filter((station) => - this.stationNeedsToBeRegistered(station) - ); - - for (let i = 0, len = unregisteredAccessories.length; i < len; i++) { - platform.addAccessory(unregisteredAccessories[i]); - } - } - - private updateAccessoriesReachability() { - if (this.debug) { - this.log("Update Reachability"); - } - for (const accessory of this.accessories) { - // accessory.updateReachability(this.latestData != null); // Reachability update is no longer being supported - accessory.reachable = this.latestData != null; - } - } -} diff --git a/src/Ffmpeg.ts b/src/Ffmpeg.ts deleted file mode 100644 index 63f3b88..0000000 --- a/src/Ffmpeg.ts +++ /dev/null @@ -1,414 +0,0 @@ -import { spawn } from "child_process"; -import * as crypto from "crypto"; -import hapnodejs = require("hap-nodejs"); -import * as ip from "ip"; -import Jimp = require("jimp"); -import optional = require("optional"); -import { AddressResponse } from "./AddressResponse"; -import { AudioResponse } from "./AudioResponse"; -import { SessionInfo } from "./Session"; -import { SnapshotRequest } from "./SnapshotRequest"; -import { StreamController } from "./StreamController"; -import { StreamRequest } from "./StreamRequest"; -import { StreamResponse } from "./StreamResponse"; -import { VideoResponse } from "./VideoResponse"; - -export default class FFMPEG implements HAPNodeJS.CameraSource { - public streamController: any; - public streamControllers: StreamController[] = []; - public cameraControllers: any[] = []; - public pendingSessions: SessionInfo[] = []; - public ongoingSessions: SessionInfo[] = []; - public services: HAPNodeJS.Service[] = []; - public name: string; - public uuid: HAPNodeJS.uuid; - public service: any; - - private log: (text: string) => void; - private vcodec: string; - private videoProcessor: string; - private fps: number; - private maxBitrate: number; - private debug: boolean; - private ffmpegSource: string; - private ffmpegImageSource: string; - private stillImageFilename: string; - private sharp: any; - - constructor( - uuidfunc: HAPNodeJS.uuid, - hap: any, - cameraConfig: any, - log: (text: string) => void, - videoProcessor: string, - stillImageFilename: string) { - - if (uuidfunc === undefined) { throw Error("UUIDGen undefined"); } - if (hap.Service === undefined) { throw Error("Service undefined"); } - if (log === undefined) { throw Error("Log undefined"); } - if (hap.StreamController === undefined) { throw Error("StreamController undefined"); } - - if (cameraConfig.videoConfig.debug) { log("FFMPEG constructor"); } - - this.sharp = optional("sharp"); - - this.uuid = uuidfunc; - this.service = hap.Service; - this.log = log; - this.streamController = hap.StreamController; - - const ffmpegOpt = cameraConfig.videoConfig; - this.name = cameraConfig.name; - this.vcodec = ffmpegOpt.vcodec; - this.videoProcessor = videoProcessor || "ffmpeg"; - this.fps = ffmpegOpt.maxFPS || 10; - this.maxBitrate = ffmpegOpt.maxBitrate || 300; - this.debug = ffmpegOpt.debug || false; - - if (this.debug) { log("Debug loggin enabled..."); } - - if (!ffmpegOpt.source) { - throw new Error("Missing source for camera."); - } - - this.ffmpegSource = ffmpegOpt.source; - this.ffmpegImageSource = ffmpegOpt.stillImageSource; - this.stillImageFilename = stillImageFilename; - - const numberOfStreams: number = ffmpegOpt.maxStreams || 2; - - const options = { - audio: { - codecs: [ - { - samplerate: 24, // 8, 16, 24 KHz - type: "OPUS", // Audio Codec - }, - { - samplerate: 16, - type: "AAC-eld", - }, - ], - comfort_noise: false, - }, - disable_audio_proxy: false, // If proxy = true, you can opt out audio proxy via this - proxy: false, // Requires RTP/RTCP MUX Proxy - srtp: true, // Supports SRTP AES_CM_128_HMAC_SHA1_80 encryption - video: { - codec: { - levels: [0, 1, 2], // Enum, please refer StreamController.VideoCodecParamLevelTypes - profiles: [0, 1, 2], // Enum, please refer StreamController.VideoCodecParamProfileIDTypes - }, - resolutions: [ - [640, 640, 30], - [640, 640, 15], - [640, 480, 30], - [640, 480, 15], - [640, 360, 30], - [640, 360, 15], - [480, 360, 30], - [480, 360, 15], - [480, 270, 30], - [480, 270, 15], - [320, 240, 30], - [320, 240, 15], // Apple Watch requires this configuration - [320, 180, 30], - [320, 180, 15], - ], - }, - }; - - this.createCameraControlService(); - - if (this.cameraControllers.length < 1) { - throw Error("Did not push camera controller..."); - } - - this._createStreamControllers(numberOfStreams, options); - } - - public handleCloseConnection(connectionID: any) { - if (this.debug) { this.log("closing connection for " + this.streamControllers.length + " stream(s)..."); } - this.streamControllers.forEach(function(controller: StreamController) { - controller.handleCloseConnection(connectionID); - }); - } - - // Image request: {width: number, height: number} - // Please override this and invoke callback(error, image buffer) when the snapshot is ready - public handleSnapshotRequest(request: SnapshotRequest, callback: (error: any, Buffer) => any) { - - let dir = __dirname; - if (dir.endsWith("/lib")) { - dir = dir.replace("/lib", ""); - } - const path = dir + "/" + this.stillImageFilename; - - if (this.debug) { this.log("Delivering snapshot at path: " + path); } - - if (this.sharp == null) { - if (this.debug) { this.log("... using Jimp"); } - Jimp.read(path) - .then((image) => { - image - .resize(request.width, Jimp.AUTO) - .crop(0, (image.bitmap.height - request.height) / 2, request.width, request.height) - .quality(90) - .getBuffer(Jimp.MIME_JPEG, (error, buffer) => { - if (error !== null) { - if (this.debug) { this.log("Error getting buffer for snapshot: " + error); } - callback(error, undefined); - } else { - callback(undefined, buffer); - } - }); - }) - .catch((error) => { - if (this.debug) { this.log("Error reading snapshot at path: " + error); } - callback(error, undefined); - }); - } else { - if (this.debug) { this.log("... using Sharp"); } - this.sharp(path) - .resize(request.width, request.height) - .toBuffer() - .then((data) => callback(undefined, data)) - .catch((error) => callback(error, undefined)); - } - } - - public prepareStream(request: StreamRequest, callback: (response: StreamResponse) => void) { - if (this.debug) { this.log("prepareStream"); } - - const sessionInfo = {} as SessionInfo; - const sessionID = request.sessionID; - const targetAddress = request.targetAddress; - - sessionInfo.address = targetAddress; - - const response = {} as StreamResponse; - const videoInfo = request.video; - - if (videoInfo) { - const targetPort: number = videoInfo.port; - const srtpKey: Uint8Array = videoInfo.srtp_key; - const srtpSalt: Uint8Array = videoInfo.srtp_salt; - - if (this.debug) { this.log ("srtpKey.length=" + srtpKey.length + ", srtpSalt.length=" + srtpSalt.length); } - - // SSRC is a 32 bit integer that is unique per stream - const ssrcSource = crypto.randomBytes(4); - ssrcSource[0] = 0; - const ssrc = ssrcSource.readInt32BE(0, true); - - this.fps = videoInfo.fps || this.fps; - - const videoResp: VideoResponse = { - fps: videoInfo.fps, - height: videoInfo.height, - max_bit_rate: videoInfo.max_bit_rate, - port: targetPort, - srtp_key: srtpKey, - srtp_salt: srtpSalt, - ssrc, - width: videoInfo.width, - }; - - response.video = videoResp; - - sessionInfo.video_port = targetPort; - sessionInfo.video_srtp = Buffer.concat([srtpKey, srtpSalt]); - sessionInfo.video_ssrc = ssrc; - } - - const audioInfo = request.audio; - - if (audioInfo) { - const targetPort = audioInfo.port; - const srtpKey = audioInfo.srtp_key; - const srtpSalt = audioInfo.srtp_salt; - - // SSRC is a 32 bit integer that is unique per stream - const ssrcSource = crypto.randomBytes(4); - ssrcSource[0] = 0; - const ssrc = ssrcSource.readInt32BE(0, true); - - const audioResp: AudioResponse = { - port: targetPort, - srtp_key: srtpKey, - srtp_salt: srtpSalt, - ssrc, - }; - - response.audio = audioResp; - - sessionInfo.audio_port = targetPort; - sessionInfo.audio_port = Buffer.concat([srtpKey, srtpSalt]); - sessionInfo.audio_ssrc = ssrc; - } - - const currentAddress = ip.address(); - const addressResp: AddressResponse = { - address: currentAddress, - type: "v6", - }; - - if (ip.isV4Format(currentAddress)) { - addressResp.type = "v4"; - } - - response.address = addressResp; - this.pendingSessions[this.uuid.unparse(sessionID, 0)] = sessionInfo; - - callback(response); - } - - public handleStreamRequest(request: StreamRequest) { - if (this.debug) { this.log("handleStreamRequest"); } - const platform = this; - const sessionID = request.sessionID; - const requestType = request.type; - if (sessionID) { - const sessionIdentifier = this.uuid.unparse(sessionID, 0); - const sessionInfo = this.pendingSessions[sessionIdentifier]; - - if (requestType === "start" && sessionInfo) { - let width = 640; - let height = 640; - let fps = this.fps || 15; - let vbitrate = this.maxBitrate; - const vcodec = this.vcodec || "libx264"; - const packetsize = 1316; // 188 376 - - const videoInfo = request.video; - if (videoInfo) { - width = videoInfo.width; - height = videoInfo.height; - - const expectedFPS = videoInfo.fps; - if (expectedFPS < fps) { - fps = expectedFPS; - } - if (videoInfo.max_bit_rate < vbitrate) { - vbitrate = videoInfo.max_bit_rate; - } - } - - const targetAddress = sessionInfo.address; - const targetVideoPort = sessionInfo.video_port; - const videoKey = sessionInfo.video_srtp; - const videoSsrc = sessionInfo.video_ssrc; - - const ffmpegCommand = - "-threads 0 -an -re -r 1" + - " " + this.ffmpegSource + - " -vf fps=" + fps + - " -map 0:0" + - " -f mp4 -vcodec " + vcodec + - " -preset faster" + - " -pix_fmt yuv420p -an" + - " -r " + fps + - " -g " + (fps * 2) + - " -movflags frag_keyframe+empty_moov -tune stillimage" + - " -b:v " + vbitrate + "k" + - " -bufsize " + vbitrate + "k" + - " -maxrate " + vbitrate + "k" + - " -payload_type 99" + - " -ssrc " + videoSsrc + - " -f rtp" + - " -srtp_out_suite AES_CM_128_HMAC_SHA1_80" + - " -srtp_out_params " + videoKey.toString("base64") + - " srtp://" + targetAddress + ":" + targetVideoPort + - "?rtcpport=" + targetVideoPort + - "&localrtcpport=" + targetVideoPort + - "&pkt_size=" + packetsize; - - const ffmpeg = spawn(this.videoProcessor, ffmpegCommand.split(" "), {env: process.env}); - this.log( - "Start streaming video from " + this.name + " with " + width + "x" + height + "@" + vbitrate + "kBit"); - - if (this.debug) { - this.log("ffmpeg " + ffmpegCommand); - } - - ffmpeg.stdout.on("data", function(data) { - // Do not log to the console if debugging is turned off - if (platform.debug) { - platform.log(data.toString()); - } - }); - // Always setup hook on stderr. - // Without this streaming stops within one to two minutes. - ffmpeg.stderr.on("data", function(data) { - // Do not log to the console if debugging is turned off - if (platform.debug) { - platform.log(data.toString()); - } - }); - ffmpeg.on("error", function(error: any) { - platform.log("An error occurs while making stream request"); - if (platform.debug) { - platform.log(error); - } - }); - ffmpeg.on("close", (code) => { - if (code == null || code === 0 || code === 255) { - platform.log("Stopped streaming"); - } else { - platform.log("ERROR: FFmpeg exited with code " + code); - for (const controller of this.streamControllers) { - if (controller.sessionIdentifier === sessionID) { - controller.forceStop(); - } - } - } - }); - this.ongoingSessions[sessionIdentifier] = ffmpeg; - - delete this.pendingSessions[sessionIdentifier]; - - } else if (requestType === "stop") { - const ffmpegProcess = this.ongoingSessions[sessionIdentifier]; - if (ffmpegProcess) { - ffmpegProcess.kill("SIGTERM"); - } - delete this.ongoingSessions[sessionIdentifier]; - } - } - } - - public createCameraControlService() { - if (this.service.CameraControl === undefined) { - throw Error("CameraControl undefined"); - } - - if (this.debug) { this.log("createCameraControlService"); } - - const controlService = new this.service.CameraControl(); - - this.services.push(controlService); - this.cameraControllers.push(controlService); - - if (this.services.filter((s) => s === controlService).length < 1) { - throw Error ("Failed to register Camera Control Service..."); - } - } - - // Private - private _createStreamControllers(maxStreams, options) { - - if (this.debug) { this.log("_createStreamControllers"); } - - for (let i = 0; i < maxStreams; i++) { - if (this.debug) { this.log("adding StreamController #" + (i + 1) + "/" + maxStreams); } - const streamController = new this.streamController(i, options, this); - - this.services.push(streamController.service); - this.streamControllers.push(streamController); - } - - if (this.debug) { this.log(this.streamControllers.length + "/" + maxStreams + " stream controllers registered"); } - } -} - -export { FFMPEG }; diff --git a/src/PlatformAccessory.ts b/src/PlatformAccessory.ts index a018c5d..704ea74 100644 --- a/src/PlatformAccessory.ts +++ b/src/PlatformAccessory.ts @@ -1,66 +1,83 @@ -import * as hap from "hap-nodejs"; +import { Bloomsky } from "./platform"; +import { PlatformAccessory } from "homebridge"; +import { Station } from "./Station"; -import { EventEmitter } from "events"; +/** + * Platform Accessory + * An instance of this class is created for each accessory your platform registers + * Each accessory may expose multiple services of different service types. + */ +export class BloomskyPlatformAccessory { + constructor( + private readonly platform: Bloomsky, + private readonly accessory: PlatformAccessory, + station: Station + ) { + // set accessory information + this.accessory + .getService(this.platform.Service.AccessoryInformation)! + .setCharacteristic(this.platform.Characteristic.Manufacturer, "Bloomsky") + .setCharacteristic( + this.platform.Characteristic.Model, + station.Data.DeviceType + ) + .setCharacteristic( + this.platform.Characteristic.SerialNumber, + station.DeviceID + ) + .setCharacteristic(this.platform.Characteristic.Name, station.DeviceName); -// tslint:disable-next-line:interface-name -declare interface PlatformAccessory extends HAPNodeJS.Accessory { - displayName: string; - username: string; - pincode: string; - UUID: string; - aid: string; - bridged: boolean; - bridgedAccessories: HAPNodeJS.Accessory[]; - reachable: boolean; - category: HAPNodeJS.Accessory.Categories; - services: HAPNodeJS.Service[]; - cameraSource: HAPNodeJS.CameraSource; - Categories: typeof HAPNodeJS.Accessory.Categories; + // I only have a Sky 1 model so I can only make a guess about the battery level + // for this specific model. + if (station.Data.DeviceType === "SKY1") { + // clamp battery level between 0 and 100 + const batteryLevel = Math.max( + 0, + Math.min(100, (100 / 2600) * station.Data.Voltage) + ); - // tslint:disable-next-line:no-misused-new - new (displayName: string, category: string): PlatformAccessory; - // tslint:disable-next-line:unified-signatures - new (displayName: string, uuid: string, subtype: number): PlatformAccessory; - // tslint:disable-next-line:ban-types - addService( - service: HAPNodeJS.Service | Function | HAPNodeJS.PredefinedService - ): HAPNodeJS.Service; - addService( - service: HAPNodeJS.Service | HAPNodeJS.PredefinedService, - displayName: string - ): HAPNodeJS.Service; - // tslint:disable-next-line:unified-signatures - // addService(category: HAPNodeJS.Accessory.Categories, displayName: string): HAPNodeJS.Service; - removeService(service: HAPNodeJS.Service): HAPNodeJS.Service; - // tslint:disable-next-line:unified-signatures - removeService( - service: HAPNodeJS.Service, - displayName: string - ): HAPNodeJS.Service; - getService( - service: HAPNodeJS.Service | HAPNodeJS.PredefinedService - ): HAPNodeJS.Service; - // tslint:disable-next-line:unified-signatures - getService(name: string): HAPNodeJS.Service; - updateReachability(reachable: boolean): void; - addBridgedAccessory( - accessory: HAPNodeJS.Accessory, - deferUpdate: boolean - ): HAPNodeJS.Accessory; - addBridgedAccessories(accessories: HAPNodeJS.Accessory[]): void; - removeBridgedAccessory( - accessory: HAPNodeJS.Accessory, - deferUpdate: boolean - ): void; - removeBridgedAccessories(accessories: HAPNodeJS.Accessory[]): void; - getCharacteristicByIID(iid: string): HAPNodeJS.Characteristic; - getBridgedAccessoryByAID(aid: string): HAPNodeJS.Accessory; - findCharacteristic(aid: string, iid: string): HAPNodeJS.Accessory; - configureCameraSource(cameraSource: HAPNodeJS.CameraSource): void; - toHAP(opt: any): JSON; - publish(info: HAPNodeJS.PublishInfo, allowInsecureRequest: boolean): void; - destroy(): void; - setupURI(): string; -} + const batteryService = + this.accessory.getService(this.platform.Service.BatteryService) || + this.accessory.addService(this.platform.Service.BatteryService); + + batteryService + .getCharacteristic(this.platform.Characteristic.BatteryLevel) + .updateValue(batteryLevel); + batteryService + .getCharacteristic(this.platform.Characteristic.ChargingState) + .updateValue(2); + batteryService + .getCharacteristic(this.platform.Characteristic.StatusLowBattery) + .updateValue(batteryLevel < 20); + batteryService.setCharacteristic( + this.platform.Characteristic.Name, + station.DeviceName + ); + } + + this.accessory + .addService(this.platform.Service.TemperatureSensor) + .getCharacteristic(this.platform.Characteristic.CurrentTemperature) + .updateValue(station.Data.Temperature); + + this.accessory + .addService(this.platform.Service.LightSensor, "Luminance") + .getCharacteristic(this.platform.Characteristic.CurrentAmbientLightLevel) + .updateValue(station.Data.Luminance); -export { PlatformAccessory }; + this.accessory + .addService(this.platform.Service.HumiditySensor, "Humidity") + .getCharacteristic(this.platform.Characteristic.CurrentRelativeHumidity) + .updateValue(station.Data.Humidity); + + this.accessory + .addService(this.platform.Service.MotionSensor, "Rain") + .getCharacteristic(this.platform.Characteristic.MotionDetected) + .updateValue(station.Data.Rain); + + this.accessory + .addService(this.platform.Service.OccupancySensor, "Night") + .getCharacteristic(this.platform.Characteristic.OccupancyDetected) + .updateValue(station.Data.Night); + } +} diff --git a/src/Session.ts b/src/Session.ts deleted file mode 100644 index 491bdb4..0000000 --- a/src/Session.ts +++ /dev/null @@ -1,15 +0,0 @@ -declare class SessionInfo { - public address: any; - // tslint:disable-next-line:variable-name - public video_port: any; - // tslint:disable-next-line:variable-name - public video_srtp: Buffer; - // tslint:disable-next-line:variable-name - public video_ssrc: number; - // tslint:disable-next-line:variable-name - public audio_port: any; - // tslint:disable-next-line:variable-name - public audio_ssrc: number; -} - -export { SessionInfo }; diff --git a/src/SnapshotRequest.ts b/src/SnapshotRequest.ts deleted file mode 100644 index 081c163..0000000 --- a/src/SnapshotRequest.ts +++ /dev/null @@ -1,6 +0,0 @@ -declare class SnapshotRequest { - public width: number; - public height: number; -} - -export { SnapshotRequest }; diff --git a/src/Station.d.ts b/src/Station.d.ts new file mode 100644 index 0000000..0d6ff8b --- /dev/null +++ b/src/Station.d.ts @@ -0,0 +1,18 @@ +import { URL } from "url"; + +declare interface Station { + DeviceID: string; + DeviceName: string; + Data: StationData; +} + +declare interface StationData { + Temperature: number; + Luminance: number; + Humidity: number; + Rain: boolean; + Night: boolean; + Voltage: number; + DeviceType: string; + ImageURL: URL; +} diff --git a/src/Station.ts b/src/Station.ts deleted file mode 100644 index 829f3df..0000000 --- a/src/Station.ts +++ /dev/null @@ -1,18 +0,0 @@ -import { URL } from "url"; - -export declare interface IStation { - DeviceID: string; - DeviceName: string; - Data: IStationData; -} - -export declare interface IStationData { - Temperature: number; - Luminance: number; - Humidity: number; - Rain: boolean; - Night: boolean; - Voltage: number; - DeviceType: string; - ImageURL: URL; -} diff --git a/src/StreamController.ts b/src/StreamController.ts deleted file mode 100644 index 5c7a52b..0000000 --- a/src/StreamController.ts +++ /dev/null @@ -1,9 +0,0 @@ -declare class StreamController { - public service: HAPNodeJS.Service; - public sessionIdentifier: any; - constructor(identifier: any, options: any, cameraSource: HAPNodeJS.CameraSource); - public forceStop(): void; - public handleCloseConnection(connectionID): void; -} - -export { StreamController }; diff --git a/src/StreamRequest.ts b/src/StreamRequest.ts deleted file mode 100644 index d78ffc7..0000000 --- a/src/StreamRequest.ts +++ /dev/null @@ -1,12 +0,0 @@ -import { AudioResponse } from "./AudioResponse"; -import { VideoResponse } from "./VideoResponse"; - -declare class StreamRequest { - public sessionID: any; - public type: any; - public video: VideoResponse; - public targetAddress: string; - public audio: AudioResponse | undefined; -} - -export { StreamRequest }; diff --git a/src/StreamResponse.ts b/src/StreamResponse.ts deleted file mode 100644 index f94cffb..0000000 --- a/src/StreamResponse.ts +++ /dev/null @@ -1,11 +0,0 @@ -import { AddressResponse } from "./AddressResponse"; -import { AudioResponse } from "./AudioResponse"; -import { VideoResponse } from "./VideoResponse"; - -declare class StreamResponse { - public video: VideoResponse; - public audio: AudioResponse; - public address: AddressResponse; -} - -export { StreamResponse }; diff --git a/src/VideoResponse.d.ts b/src/VideoResponse.d.ts deleted file mode 100644 index 8948e50..0000000 --- a/src/VideoResponse.d.ts +++ /dev/null @@ -1,10 +0,0 @@ -import { BaseResponse } from "./BaseResponse"; - -declare class VideoResponse extends BaseResponse{ - width: number; - height: number; - fps: number; - max_bit_rate: number; -} - -export { VideoResponse } diff --git a/src/homebridge.d.ts b/src/homebridge.d.ts deleted file mode 100644 index bb6b1e8..0000000 --- a/src/homebridge.d.ts +++ /dev/null @@ -1,41 +0,0 @@ -import { EventEmitter } from "events"; - -declare class API extends EventEmitter { - constructor(); - - public accessory(name: any): any; - - public platform(name: any): any; - - public publishCameraAccessories(pluginName: any, accessories: any): void; - - public registerAccessory( - pluginName: any, - accessoryName: any, - constructor: any, - configurationRequestHandler: any - ): void; - - public registerPlatform( - pluginName: any, - platformName: any, - constructor: any, - dynamic: any - ): void; - - public registerPlatformAccessories( - pluginName: any, - platformName: any, - accessories: any - ): void; - - public unregisterPlatformAccessories( - pluginName: any, - platformName: any, - accessories: any - ): void; - - public updatePlatformAccessories(accessories: any): void; -} - -export default API; diff --git a/src/index.ts b/src/index.ts new file mode 100644 index 0000000..1e3916e --- /dev/null +++ b/src/index.ts @@ -0,0 +1,10 @@ +import { API } from "homebridge"; +import { Bloomsky } from "./platform"; +import { PLATFORM_NAME } from "./settings"; + +/** + * This method registers the platform with Homebridge + */ +export = (api: API) => { + api.registerPlatform(PLATFORM_NAME, Bloomsky); +}; diff --git a/src/platform.ts b/src/platform.ts new file mode 100644 index 0000000..b54b122 --- /dev/null +++ b/src/platform.ts @@ -0,0 +1,250 @@ +import * as Client from "typed-rest-client"; + +import { + API, + APIEvent, + CameraControllerOptions, + Characteristic, + DynamicPlatformPlugin, + Logger, + PlatformAccessory, + PlatformConfig, + Service, +} from "homebridge"; +import { PLATFORM_NAME, PLUGIN_NAME } from "./settings"; + +import { BloomskyFFMPEGStreamingDelegate } from "./streamingDelegate"; +import { BloomskyPlatformAccessory } from "./platformAccessory"; +import { EventEmitter } from "events"; +import { Station } from "./Station"; + +/** + * HomebridgePlatform + * This class is the main constructor for your plugin, this is where you should + * parse the user config and discover/register accessories with Homebridge. + */ +export class Bloomsky implements DynamicPlatformPlugin { + public readonly Service: typeof Service = this.api.hap.Service; + public readonly Characteristic: typeof Characteristic = this.api.hap + .Characteristic; + + // this is used to track restored cached accessories + public readonly accessories: PlatformAccessory[] = []; + + // plugin configuration data + private apiKey: string; + private apiUrl: string; + private vcodec: string; + private latestData: Station[]; + private timeout: NodeJS.Timeout | undefined; + + private emitters: EventEmitter[] = []; + + constructor( + public readonly log: Logger, + public readonly config: PlatformConfig, + public readonly api: API + ) { + this.log.debug("Finished initializing platform:", this.config.name); + + this.apiKey = config.apiKey; + this.apiUrl = config.apiUrl || "https://api.bloomsky.com/api/skydata/"; + this.vcodec = config.vcodec || "libx264"; + this.latestData = [] as Station[]; + + // When this event is fired it means Homebridge has restored all cached accessories from disk. + // Dynamic Platform plugins should only register new accessories after this event was fired, + // in order to ensure they weren't added to homebridge already. This event can also be used + // to start discovery of new accessories. + this.api.on(APIEvent.DID_FINISH_LAUNCHING, () => { + log.debug("Executed didFinishLaunching callback"); + // run the method to discover / register your devices as accessories + + this.discoverDevices(); + this.updateData(); + }); + } + + /** + * This function is invoked when homebridge restores cached accessories from disk at startup. + * It should be used to setup event handlers for characteristics and update respective values. + */ + configureAccessory(accessory: PlatformAccessory) { + this.log.info("Loading accessory from cache:", accessory.displayName); + + const streamingDelegate = new BloomskyFFMPEGStreamingDelegate(this.api.hap); + this.emitters[accessory.UUID] = streamingDelegate.bloomskyEvents; + + const options: CameraControllerOptions = { + cameraStreamCount: 2, // HomeKit requires at least 2 streams, but 1 is also just fine + delegate: streamingDelegate, + + streamingOptions: { + // srtp: true, // legacy option which will just enable AES_CM_128_HMAC_SHA1_80 (can still be used though) + supportedCryptoSuites: [ + this.api.hap.SRTPCryptoSuites.NONE, + this.api.hap.SRTPCryptoSuites.AES_CM_128_HMAC_SHA1_80, + ], // NONE is not supported by iOS just there for testing with Wireshark for example + video: { + codec: { + profiles: [ + this.api.hap.H264Profile.BASELINE, + this.api.hap.H264Profile.MAIN, + this.api.hap.H264Profile.HIGH, + ], + levels: [ + this.api.hap.H264Level.LEVEL3_1, + this.api.hap.H264Level.LEVEL3_2, + this.api.hap.H264Level.LEVEL4_0, + ], + }, + resolutions: [ + [1920, 1080, 30], // width, height, framerate + [1280, 960, 30], + [1280, 720, 30], + [1024, 768, 30], + [640, 480, 30], + [640, 360, 30], + [480, 360, 30], + [480, 270, 30], + [320, 240, 30], + [320, 240, 15], // Apple Watch requires this configuration (Apple Watch also seems to required OPUS @16K) + [320, 180, 30], + ], + }, + /* audio option is omitted, as it is not supported in this example; HAP-NodeJS will fake an appropriate audio codec + audio: { + comfort_noise: false, // optional, default false + codecs: [ + { + type: AudioStreamingCodecType.OPUS, + audioChannels: 1, // optional, default 1 + samplerate: [AudioStreamingSamplerate.KHZ_16, AudioStreamingSamplerate.KHZ_24], + // 16 and 24 must be present for AAC-ELD or OPUS + }, + ], + }, + // */ + }, + }; + + const cameraController = new this.api.hap.CameraController(options); + streamingDelegate.controller = cameraController; + + accessory.configureController(cameraController); + // add the restored accessory to the accessories cache so we can track if it has already been registered + this.accessories.push(accessory); + } + + /** + * This is an example method showing how to register discovered accessories. + * Accessories must only be registered once, previously created accessories + * must not be registered again to prevent "duplicate UUID" errors. + */ + discoverDevices() { + if (this.latestData.length === 0) { + return; + } + + // loop over the discovered devices and register each one if it has not already been registered + for (const device of this.latestData) { + // generate a unique id for the accessory this should be generated from + // something globally unique, but constant, for example, the device serial + // number or MAC address + const uuid = this.api.hap.uuid.generate(device.DeviceID); + + if (this.emitters[uuid]) { + const emitter = this.emitters[uuid] as EventEmitter; + emitter.emit("ImageURL", device.Data.ImageURL); + } + + // see if an accessory with the same uuid has already been registered and restored from + // the cached devices we stored in the `configureAccessory` method above + const existingAccessory = this.accessories.find( + (accessory) => accessory.UUID === uuid + ); + + if (existingAccessory) { + // the accessory already exists + this.log.info( + "Restoring existing accessory from cache:", + existingAccessory.displayName + ); + + // if you need to update the accessory.context then you should run `api.updatePlatformAccessories`. eg.: + existingAccessory.context.device = device; + + this.api.updatePlatformAccessories([existingAccessory]); + + // create the accessory handler for the restored accessory + // this is imported from `platformAccessory.ts` + new BloomskyPlatformAccessory(this, existingAccessory, device); + } else { + // the accessory does not yet exist, so we need to create it + this.log.info("Adding new accessory:", device.DeviceName); + + // create a new accessory + const accessory = new this.api.platformAccessory( + device.DeviceName, + uuid + ); + + // store a copy of the device object in the `accessory.context` + // the `context` property can be used to store any data about the accessory you may need + accessory.context.device = device; + + // create the accessory handler for the newly create accessory + // this is imported from `platformAccessory.ts` + new BloomskyPlatformAccessory(this, accessory, device); + + this.configureAccessory(accessory); + + // link the accessory to your platform + this.api.registerPlatformAccessories(PLUGIN_NAME, PLATFORM_NAME, [ + accessory, + ]); + } + } + } + + /** + * Fetch data from the API, then + * 1. register new devices + * 2. update values for existing devices + */ + private async updateData() { + const requestOptions: Client.IRequestOptions = { + additionalHeaders: { Authorization: this.apiKey }, + }; + + const client = new Client.RestClient("NodeJS"); + + const response = await client + .get(this.apiUrl + "?unit=intl", requestOptions) + .catch((clientError) => { + this.log.error(clientError); + }); + + const error: any = response as any; + if (error !== undefined && error.detail) { + this.log.error(error.detail); + } else if (response !== null) { + const r = response as Client.IRestResponse; + if (r.result !== null) { + this.latestData = r.result; + } + + this.discoverDevices(); + + this.timeout = setTimeout( + (() => { + this.updateData().catch((clientError) => { + this.log.error(clientError); + }); + }).bind(this), + 150000 + ); + this.timeout.unref(); + } + } +} diff --git a/src/settings.ts b/src/settings.ts new file mode 100644 index 0000000..ee3aee4 --- /dev/null +++ b/src/settings.ts @@ -0,0 +1,9 @@ +/** + * This is the name of the platform that users will use to register the plugin in the Homebridge config.json + */ +export const PLATFORM_NAME = "Bloomsky"; + +/** + * This must match the name of your plugin as defined the package.json + */ +export const PLUGIN_NAME = "homebridge-bloomsky"; diff --git a/src/streamingDelegate.ts b/src/streamingDelegate.ts new file mode 100644 index 0000000..1595750 --- /dev/null +++ b/src/streamingDelegate.ts @@ -0,0 +1,269 @@ +import { + CameraController, + CameraStreamingDelegate, + HAP, + PrepareStreamCallback, + PrepareStreamRequest, + PrepareStreamResponse, + SRTPCryptoSuites, + SnapshotRequest, + SnapshotRequestCallback, + StreamRequestCallback, + StreamRequestTypes, + StreamSessionIdentifier, + StreamingRequest, + VideoInfo, +} from 'homebridge'; +import { ChildProcess, spawn } from 'child_process'; + +import { EventEmitter } from 'events'; +import ip from 'ip'; + +type SessionInfo = { + address: string; // address of the HAP controller + + videoPort: number; + videoCryptoSuite: SRTPCryptoSuites; // should be saved if multiple suites are supported + videoSRTP: Buffer; // key and salt concatenated + videoSSRC: number; // rtp synchronisation source + + /* Won't be save as audio is not supported by this example + audioPort: number, + audioCryptoSuite: SRTPCryptoSuites, + audioSRTP: Buffer, + audioSSRC: number, + */ +}; + +const FFMPEGH264ProfileNames = ['baseline', 'main', 'high']; +const FFMPEGH264LevelNames = ['3.1', '3.2', '4.0']; + +export class BloomskyFFMPEGStreamingDelegate +implements CameraStreamingDelegate { + private ffmpegDebugOutput = true; + + public readonly bloomskyEvents = new EventEmitter(); + private imageUrl: string | undefined; + private readonly hap: HAP; + controller?: CameraController; + + // keep track of sessions + pendingSessions: Record = {}; + ongoingSessions: Record = {}; + + constructor(hap: HAP) { + this.hap = hap; + + this.bloomskyEvents.on('ImageURL', (url) => { + console.log('ImageURL', url); + this.imageUrl = url; + }); + } + + handleSnapshotRequest( + request: SnapshotRequest, + callback: SnapshotRequestCallback, + ): void { + const ffmpegCommand = this.imageUrl + ? `-loop 1 -i ${this.imageUrl} -vframes 1 -f mjpeg -` + : `-f lavfi -i testsrc=s=${request.width}x${request.height} -vframes 1 -f mjpeg -`; + const ffmpeg = spawn('ffmpeg', ffmpegCommand.split(' '), { + env: process.env, + }); + + const snapshotBuffers: Buffer[] = []; + + ffmpeg.stdout.on('data', (data) => snapshotBuffers.push(data)); + ffmpeg.stderr.on('data', (data) => { + if (this.ffmpegDebugOutput) { + console.log('SNAPSHOT: ' + String(data)); + } + }); + + ffmpeg.on('exit', (code, signal) => { + if (signal) { + console.log('Snapshot process was killed with signal: ' + signal); + callback(new Error('killed with signal ' + signal)); + } else if (code === 0) { + console.log( + `Successfully captured snapshot at ${request.width}x${request.height}`, + ); + callback(undefined, Buffer.concat(snapshotBuffers)); + } else { + console.log('Snapshot process exited with code ' + code); + callback(new Error('Snapshot process exited with code ' + code)); + } + }); + } + + // called when iOS request rtp setup + prepareStream( + request: PrepareStreamRequest, + callback: PrepareStreamCallback, + ): void { + const sessionId: StreamSessionIdentifier = request.sessionID; + const targetAddress = request.targetAddress; + + const video = request.video; + const videoPort = video.port; + + const videoCryptoSuite = video.srtpCryptoSuite; // could be used to support multiple crypto suite (or support no suite for debugging) + const videoSrtpKey = video.srtp_key; + const videoSrtpSalt = video.srtp_salt; + + const videoSSRC = this.hap.CameraController.generateSynchronisationSource(); + + const sessionInfo: SessionInfo = { + address: targetAddress, + + videoPort: videoPort, + videoCryptoSuite: videoCryptoSuite, + videoSRTP: Buffer.concat([videoSrtpKey, videoSrtpSalt]), + videoSSRC: videoSSRC, + }; + + const currentAddress = ip.address('public', request.addressVersion); // ipAddress version must match + const response: PrepareStreamResponse = { + address: currentAddress, + video: { + port: videoPort, + ssrc: videoSSRC, + + srtp_key: videoSrtpKey, + srtp_salt: videoSrtpSalt, + }, + // audio is omitted as we do not support audio in this example + }; + + this.pendingSessions[sessionId] = sessionInfo; + callback(undefined, response); + } + + // called when iOS device asks stream to start/stop/reconfigure + handleStreamRequest( + request: StreamingRequest, + callback: StreamRequestCallback, + ): void { + const sessionId = request.sessionID; + + switch (request.type) { + case StreamRequestTypes.START: + const sessionInfo = this.pendingSessions[sessionId]; + + const video: VideoInfo = request.video; + + const profile = FFMPEGH264ProfileNames[video.profile]; + const level = FFMPEGH264LevelNames[video.level]; + const width = video.width; + const height = video.height; + const fps = video.fps; + + const payloadType = video.pt; + const maxBitrate = video.max_bit_rate; + const rtcpInterval = video.rtcp_interval; // usually 0.5 + const mtu = video.mtu; // maximum transmission unit + + const address = sessionInfo.address; + const videoPort = sessionInfo.videoPort; + const ssrc = sessionInfo.videoSSRC; + const cryptoSuite = sessionInfo.videoCryptoSuite; + const videoSRTP = sessionInfo.videoSRTP.toString('base64'); + + console.log( + `Starting video stream (${width}x${height}, ${fps} fps, ${maxBitrate} kbps, ${mtu} mtu)...`, + ); + + const part1 = this.imageUrl + ? `-loop 1 -i ${this.imageUrl} -map 0:0 ` + : `-f lavfi -i testsrc=size=${width}x${height}:rate=${fps} -map 0:0 `; + let videoffmpegCommand = + part1 + + `-c:v libx264 -pix_fmt yuv420p -r ${fps} -an -sn -dn -b:v ${maxBitrate}k -bufsize ${ + 2 * maxBitrate + }k -maxrate ${maxBitrate}k ` + + `-payload_type ${payloadType} -ssrc ${ssrc} -f rtp `; // -profile:v ${profile} -level:v ${level} + + if (cryptoSuite === SRTPCryptoSuites.AES_CM_128_HMAC_SHA1_80) { + // actually ffmpeg just supports AES_CM_128_HMAC_SHA1_80 + videoffmpegCommand += `-srtp_out_suite AES_CM_128_HMAC_SHA1_80 -srtp_out_params ${videoSRTP} s`; + } + + videoffmpegCommand += `rtp://${address}:${videoPort}?rtcpport=${videoPort}&localrtcpport=${videoPort}&pkt_size=${mtu}`; + + if (this.ffmpegDebugOutput) { + console.log('FFMPEG command: ffmpeg ' + videoffmpegCommand); + } + + const ffmpegVideo = spawn('ffmpeg', videoffmpegCommand.split(' '), { + env: process.env, + }); + + let started = false; + ffmpegVideo.stderr.on('data', (data) => { + if (!started) { + started = true; + console.log('FFMPEG: received first frame'); + + callback(); // do not forget to execute callback once set up + } + + if (this.ffmpegDebugOutput) { + console.log('VIDEO: ' + String(data)); + } + }); + ffmpegVideo.on('error', (error) => { + console.log('[Video] Failed to start video stream: ' + error.message); + callback(new Error('ffmpeg process creation failed!')); + }); + ffmpegVideo.on('exit', (code, signal) => { + const message = + '[Video] ffmpeg exited with code: ' + + code + + ' and signal: ' + + signal; + + if (code == null || code === 255) { + console.log(message + ' (Video stream stopped!)'); + } else { + console.log(message + ' (error)'); + + if (!started) { + callback(new Error(message)); + } else { + this.controller!.forceStopStreamingSession(sessionId); + } + } + }); + + this.ongoingSessions[sessionId] = ffmpegVideo; + delete this.pendingSessions[sessionId]; + + break; + case StreamRequestTypes.RECONFIGURE: + // not supported by this example + console.log( + 'Received (unsupported) request to reconfigure to: ' + + JSON.stringify(request.video), + ); + callback(); + break; + case StreamRequestTypes.STOP: + const ffmpegProcess = this.ongoingSessions[sessionId]; + + try { + if (ffmpegProcess) { + ffmpegProcess.kill('SIGKILL'); + } + } catch (e) { + console.log('Error occurred terminating the video process!'); + console.log(e); + } + + delete this.ongoingSessions[sessionId]; + + console.log('Stopped streaming session!'); + callback(); + break; + } + } +} diff --git a/standalone.js b/standalone.js deleted file mode 100644 index 224ff37..0000000 --- a/standalone.js +++ /dev/null @@ -1,98 +0,0 @@ -"use strict"; - -const hap = require("hap-nodejs"); -const FFMPEG = require("./lib/Ffmpeg").FFMPEG; - -let conf = { - "username": "CC:22:3D:E3:CE:FF", - "pin": "876-54-321" -}; - -console.log("HAP-NodeJS starting..."); - -hap.init(); - -const station = { - "UTC": -7, - "CityName": "Los Angeles", - "Storm": {}, - "Searchable": false, - "DeviceName": "Donna Sky", - "RegisterTime": 1433814467, - "DST": 1, - "BoundedPoint": "", - "LON": -118.6919183, - "Point": {}, - "VideoList": [ - "http://s3.amazonaws.com/bskytimelapses/eaB1rJytnZSmmZu1_-7_2018-10-23.mp4", - "http://s3.amazonaws.com/bskytimelapses/eaB1rJytnZSmmZu1_-7_2018-10-24.mp4", - "http://s3.amazonaws.com/bskytimelapses/eaB1rJytnZSmmZu1_-7_2018-10-25.mp4", - "http://s3.amazonaws.com/bskytimelapses/eaB1rJytnZSmmZu1_-7_2018-10-26.mp4", - "http://s3.amazonaws.com/bskytimelapses/eaB1rJytnZSmmZu1_-7_2018-10-27.mp4" - ], - "VideoList_C": [ - "http://s3.amazonaws.com/bskytimelapses/eaB1rJytnZSmmZu1_-7_2018-10-23_C.mp4", - "http://s3.amazonaws.com/bskytimelapses/eaB1rJytnZSmmZu1_-7_2018-10-24_C.mp4", - "http://s3.amazonaws.com/bskytimelapses/eaB1rJytnZSmmZu1_-7_2018-10-25_C.mp4", - "http://s3.amazonaws.com/bskytimelapses/eaB1rJytnZSmmZu1_-7_2018-10-26_C.mp4", - "http://s3.amazonaws.com/bskytimelapses/eaB1rJytnZSmmZu1_-7_2018-10-27_C.mp4" - ], - "DeviceID": "123456789012", - "NumOfFollowers": 1, - "LAT": 34.0201613, - "ALT": 142, - "Data": { - "Luminance": 21, - "Temperature": 63.61, - "ImageURL": "http://s3-us-west-1.amazonaws.com/bskyimgs/eaB1rJytnZSmmZu1qJ1lqpWtnpGmmpo=.jpg", - "TS": 1540697959, - "Rain": true, - "Humidity": 99, - "Pressure": 295.27, - "DeviceType": "SKY1", - "Voltage": 2594, - "Night": true, - "UVIndex": "1", - "ImageTS": 1540690225 - }, - "FullAddress": "Pico Blvd, Los Angeles, CA, US", - "StreetName": "Pico Blvd", - "PreviewImageList": [ - "http://s3-us-west-1.amazonaws.com/bskyimgs/eaB1rJytnZSmmZu1qJ1lqpWqmJirn54=.jpg", - "http://s3-us-west-1.amazonaws.com/bskyimgs/eaB1rJytnZSmmZu1qJ1lqpWrlpamm5s=.jpg", - "http://s3-us-west-1.amazonaws.com/bskyimgs/eaB1rJytnZSmmZu1qJ1lqpWslZOloJg=.jpg", - "http://s3-us-west-1.amazonaws.com/bskyimgs/eaB1rJytnZSmmZu1qJ1lqpWsnpKompc=.jpg", - "http://s3-us-west-1.amazonaws.com/bskyimgs/eaB1rJytnZSmmZu1qJ1lqpWtnJSrnZw=.jpg" - ] -}; - -const uuid = hap.uuid.generate(station.DeviceID); -const cameraAccessory = new hap.Accessory(station.DeviceName, uuid, hap.Accessory.Categories.CAMERA); -const filename = uuid + ".jpg"; - -const cameraSource = new FFMPEG(hap.uuid, hap, { - name: uuid, - videoConfig: { - debug : true, - maxHeight: 640, - maxStreams: 2, - maxWidth: 640, - source: "-loop 1 -i " + filename, - stillImageSource: "-loop 1 -i " + filename, - vcodec : "h264", - }, -}, console.log, "ffmpeg", filename); -cameraAccessory.configureCameraSource(cameraSource); - -cameraAccessory.publish({ - username: conf.username, - pincode: conf.pin, - category: hap.Accessory.Categories.CAMERA -}, true); - -console.log("Scan this code with your HomeKit App on your iOS device to pair with Camera:"); -console.log(" "); -console.log(" ┌────────────┐ "); -console.log(` │ ${conf.pin} │ `); -console.log(" └────────────┘ "); -console.log(" "); diff --git a/test.spec.ts b/test.spec.ts deleted file mode 100644 index d4e44f5..0000000 --- a/test.spec.ts +++ /dev/null @@ -1,276 +0,0 @@ -import "mocha"; - -import * as fs from "fs"; -import * as hap from "hap-nodejs"; -import * as ip from "ip"; -import * as mlog from "mocha-logger"; -import * as waitUntil from "async-wait-until"; - -import API from "./src/homebridge"; -import { Bloomsky } from "./src/Bloomsky"; -import { EventEmitter } from "events"; -import FFMPEG from "./src/Ffmpeg"; -import { PlatformAccessory } from "./src/PlatformAccessory"; -import { StreamRequest } from "./src/StreamRequest"; -import { expect } from "chai"; - -const mockHomebridge = { - accessory: {} as PlatformAccessory, - api: new API(), - config: { - apiKey: "this-is-not-a-valid-api-key==", - // tslint:disable-next-line:max-line-length - apiUrl: - "https://gist.githubusercontent.com/aphex3k/d7d9b6399fc8701a32ff4fb87bdd91dc/raw/40b030a8b6b70f95bae3b38106609dfda47c0c46/api-result.json", - debug: true, - useIntl: true, - }, - hap, - log(logText: string) { - mlog.log(logText); - }, - registerPlatform(a: any, b: any, c: any, d: boolean) { - return d === true; - }, - version: "2.2", -}; - -describe("Mock Homebridge", () => { - it("should provide mock functionality", () => { - expect(mockHomebridge).to.not.be.equal(null); - expect(mockHomebridge).to.not.be.equal(undefined); - - expect(mockHomebridge.version).to.not.be.equal(null); - expect(mockHomebridge.version).to.not.be.equal(undefined); - - expect(mockHomebridge.hap).to.not.be.equal(null); - expect(mockHomebridge.hap).to.not.be.equal(undefined); - - expect(mockHomebridge.registerPlatform).to.not.be.equal(null); - expect(mockHomebridge.registerPlatform).to.not.be.equal(undefined); - - expect(mockHomebridge.log).to.not.be.equal(null); - expect(mockHomebridge.log).to.not.be.equal(undefined); - - expect(mockHomebridge.config).to.not.be.equal(null); - expect(mockHomebridge.config).to.not.be.equal(undefined); - - expect(mockHomebridge.config.apiUrl).to.not.be.equal(null); - expect(mockHomebridge.config.apiUrl).to.not.be.equal(undefined); - - expect(mockHomebridge.config.useIntl).to.be.equal(true); - - expect(mockHomebridge.hap.uuid).to.not.be.equal(null); - expect(mockHomebridge.hap.uuid).to.not.be.equal(undefined); - }); -}); - -describe("Bloomsky", () => { - const mock = mockHomebridge; - - it("should have a mock instance", function () { - expect(mock).to.not.be.equal(null); - expect(mock).to.not.be.equal(undefined); - }); - - Bloomsky.Accessory = mock.accessory; - Bloomsky.Service = hap.Service; - Bloomsky.Characteristic = hap.Characteristic; - Bloomsky.UUIDGen = hap.uuid; - Bloomsky.Hap = hap; - - const bloomsky = new Bloomsky(mock.log, mock.config, mock.api); - - it("constructor should create a new instance", function () { - expect(bloomsky).to.not.be.equal(null); - expect(bloomsky).to.not.be.equal(undefined); - }); - - it("should know about no accessories before loading from api", function () { - expect(bloomsky.accessories.length).to.be.equal(0); - }); - - it("should calculate a matching UUID for input", function () { - expect(Bloomsky.UUIDGen).to.not.be.equal(null); - expect(Bloomsky.UUIDGen).to.not.be.equal(undefined); - - const uuid = Bloomsky.UUIDGen.generate("test"); // a94a8fe5-ccb1-49ba-a1c4-c0873d391e98 - expect(uuid).to.not.be.equal(null); - expect(uuid).to.be.equal("a94a8fe5-ccb1-49ba-a1c4-c0873d391e98"); - }); - - // it("should know about exactly one accessory after loading from api", async function() { - // this.timeout(10000); - - // // since we are not testing in a full blown homebridge environment, trigger - // // didFinishLaunching event manually - // (mock.api as EventEmitter).emit("didFinishLaunching"); - - // try { - // const result = await waitUntil(() => { - // return bloomsky.accessories.length > 0; - // }, 10000); // ms - - // expect(bloomsky.accessories.length).to.be.equal(1); - // } catch (error) { - // expect(bloomsky.accessories.length).to.be.equal(1); - // } - - // const accessory = bloomsky.accessories[0]; - - // expect(accessory.UUID).to.be.equal("8d993ccd-f628-4e26-a170-a949ee2a3870"); - // }); - - // it("should only know about exactly one camera accessory", function() { - // const accessory = bloomsky.accessories[0]; - - // expect(accessory.category).to.not.be.equal(HAPNodeJS.Accessory.Categories.OTHER); - // expect(accessory.category).to.be.equal(HAPNodeJS.Accessory.Categories.CAMERA); - // expect(accessory.reachable).to.be.equal(true); - // }); - - // it("should know about an accessory with services attached", function() { - // const accessory = bloomsky.accessories[0]; - - // const temp = accessory.getService(Bloomsky.Service.TemperatureSensor); - // expect(temp).to.not.be.equal(undefined); - // expect(temp.UUID).to.be.equal(Bloomsky.Service.TemperatureSensor.UUID); - - // const light = accessory.getService(Bloomsky.Service.LightSensor); - // expect(light).to.not.be.equal(undefined); - // expect(light.UUID).to.be.equal(Bloomsky.Service.LightSensor.UUID); - - // const humidity = accessory.getService(Bloomsky.Service.HumiditySensor); - // expect(humidity).to.not.be.equal(undefined); - // expect(humidity.UUID).to.be.equal(Bloomsky.Service.HumiditySensor.UUID); - - // const motion = accessory.getService(Bloomsky.Service.MotionSensor); - // expect(motion).to.not.be.equal(undefined); - // expect(motion.UUID).to.be.equal(Bloomsky.Service.MotionSensor.UUID); - - // const night = accessory.getService(Bloomsky.Service.OccupancySensor); - // expect(night).to.not.be.equal(undefined); - // expect(night.UUID).to.be.equal(Bloomsky.Service.OccupancySensor.UUID); - - // const info = accessory.getService(Bloomsky.Service.AccessoryInformation); - // expect(info).to.not.be.equal(undefined); - // expect(info.UUID).to.be.equal(Bloomsky.Service.AccessoryInformation.UUID); - - // const battery = accessory.getService(Bloomsky.Service.BatteryService); - // expect(battery).to.not.be.equal(undefined); - // expect(battery.UUID).to.be.equal(Bloomsky.Service.BatteryService.UUID); - // }); - - // it("should have an accessory with a camera stream controller configured", function() { - // const accessory = bloomsky.accessories[0]; - - // expect(accessory.cameraSource).to.not.be.equal(undefined); - - // const cameraSource = accessory.cameraSource as FFMPEG; - - // expect(cameraSource.createCameraControlService).to.not.be.equal(undefined); - // expect(cameraSource.handleCloseConnection).to.not.be.equal(undefined); - // expect(cameraSource.handleSnapshotRequest).to.not.be.equal(undefined); - // expect(cameraSource.handleStreamRequest).to.not.be.equal(undefined); - // expect(cameraSource.prepareStream).to.not.be.equal(undefined); - // }); - - // it("should have one accessory that can handle snapshot requests", async function() { - - // this.timeout(10000); - - // try { - // const result = await waitUntil(() => { - // const testFilename = "8d993ccd-f628-4e26-a170-a949ee2a3870.jpg"; - // return fs.existsSync(testFilename) && fs.statSync(testFilename).size > 0; - // }, 3000); // ms - // } catch (error) { - // mock.log("the camera image should have been cached by now..."); - // expect(error).to.be.equal(undefined); - // } - - // const accessory = bloomsky.accessories[0]; - // const cameraSource = accessory.cameraSource as FFMPEG; - - // expect(cameraSource.createCameraControlService).to.not.be.equal(undefined); - - // const createCameraControlService = function() { cameraSource.createCameraControlService(); }; - // expect(createCameraControlService).to.not.throw(); - - // const handleSnapshotRequest = function() { - // cameraSource.handleSnapshotRequest({ - // height: 720, - // width: 1280, - // }, - // function(error, buffer) { - // if (error !== undefined) { - // mock.log(error); - // } - // expect(error).to.be.equal(undefined); - // expect(buffer.length).to.be.greaterThan(0); - // }); - // }; - // expect(handleSnapshotRequest).to.not.throw(); - // }); - - // it("should have one accessory that can handle stream requests", async function() { - - // this.timeout(10000); - - // try { - // const result = await waitUntil(() => { - // const testFilename = "8d993ccd-f628-4e26-a170-a949ee2a3870.jpg"; - // return fs.existsSync(testFilename) && fs.statSync(testFilename).size > 0; - // }, 3000); // ms - // } catch (error) { - // mock.log("the camera image should have been cached by now..."); - // expect(error).to.be.equal(undefined); - // } - - // const accessory = bloomsky.accessories[0]; - // const cameraSource = accessory.cameraSource as FFMPEG; - // const testSessionId = Bloomsky.UUIDGen.generate("testSessionId"); - // const request: StreamRequest = { - // audio: undefined, - // sessionID: testSessionId, - // targetAddress: ip.address(), - // type: "start", - // video: { - // fps: 30, - // height: 640, - // max_bit_rate: 600, - // port: 12345, - // srtp_key: Uint8Array.from(new Set([1, 2, 3, 4])), - // srtp_salt: Uint8Array.from(new Set([1, 2, 3, 4])), - // ssrc: 123, - // width: 640, - // }, - // }; - - // const prepareStream = function() { - // cameraSource.prepareStream(request, function(response) { - // mock.log("Stream Prepared"); - // }); - // }; - // expect(prepareStream).to.not.throw(); - - // const handleStreamRequest = function() { - // cameraSource.handleStreamRequest(request); - // }; - // expect(handleStreamRequest).to.not.throw(); - - // mock.log("waiting for stream..."); - // try { - // const result = await waitUntil(() => { - // return false; - // }, 550); // ms - // } catch (error) { - // mock.log("closing stream..."); - // } - - // const handleCloseConnection = function() { - // cameraSource.handleCloseConnection(testSessionId); - // }; - // expect(handleCloseConnection).to.not.throw(); - // }); -}); diff --git a/testing-config/api-result.json b/testing-config/api-result.json deleted file mode 100644 index efac1d3..0000000 --- a/testing-config/api-result.json +++ /dev/null @@ -1,55 +0,0 @@ -[ - { - "UTC": -7, - "CityName": "Los Angeles", - "Storm": {}, - "Searchable": false, - "DeviceName": "Donna Sky", - "RegisterTime": 1433814467, - "DST": 1, - "BoundedPoint": "", - "LON": -118.6919183, - "Point": {}, - "VideoList": [ - "http://s3.amazonaws.com/bskytimelapses/eaB1rJytnZSmmZu1_-7_2018-10-23.mp4", - "http://s3.amazonaws.com/bskytimelapses/eaB1rJytnZSmmZu1_-7_2018-10-24.mp4", - "http://s3.amazonaws.com/bskytimelapses/eaB1rJytnZSmmZu1_-7_2018-10-25.mp4", - "http://s3.amazonaws.com/bskytimelapses/eaB1rJytnZSmmZu1_-7_2018-10-26.mp4", - "http://s3.amazonaws.com/bskytimelapses/eaB1rJytnZSmmZu1_-7_2018-10-27.mp4" - ], - "VideoList_C": [ - "http://s3.amazonaws.com/bskytimelapses/eaB1rJytnZSmmZu1_-7_2018-10-23_C.mp4", - "http://s3.amazonaws.com/bskytimelapses/eaB1rJytnZSmmZu1_-7_2018-10-24_C.mp4", - "http://s3.amazonaws.com/bskytimelapses/eaB1rJytnZSmmZu1_-7_2018-10-25_C.mp4", - "http://s3.amazonaws.com/bskytimelapses/eaB1rJytnZSmmZu1_-7_2018-10-26_C.mp4", - "http://s3.amazonaws.com/bskytimelapses/eaB1rJytnZSmmZu1_-7_2018-10-27_C.mp4" - ], - "DeviceID": "123456789012", - "NumOfFollowers": 1, - "LAT": 34.0201613, - "ALT": 142, - "Data": { - "Luminance": 21, - "Temperature": 63.61, - "ImageURL": "http://s3-us-west-1.amazonaws.com/bskyimgs/eaB1rJytnZSmmZu1qJ1lqpWtnpGmmpo=.jpg", - "TS": 1540697959, - "Rain": true, - "Humidity": 99, - "Pressure": 295.27, - "DeviceType": "SKY1", - "Voltage": 2594, - "Night": true, - "UVIndex": "1", - "ImageTS": 1540690225 - }, - "FullAddress": "Pico Blvd, Los Angeles, CA, US", - "StreetName": "Pico Blvd", - "PreviewImageList": [ - "http://s3-us-west-1.amazonaws.com/bskyimgs/eaB1rJytnZSmmZu1qJ1lqpWqmJirn54=.jpg", - "http://s3-us-west-1.amazonaws.com/bskyimgs/eaB1rJytnZSmmZu1qJ1lqpWrlpamm5s=.jpg", - "http://s3-us-west-1.amazonaws.com/bskyimgs/eaB1rJytnZSmmZu1qJ1lqpWslZOloJg=.jpg", - "http://s3-us-west-1.amazonaws.com/bskyimgs/eaB1rJytnZSmmZu1qJ1lqpWsnpKompc=.jpg", - "http://s3-us-west-1.amazonaws.com/bskyimgs/eaB1rJytnZSmmZu1qJ1lqpWtnJSrnZw=.jpg" - ] - } -] \ No newline at end of file diff --git a/testing-config/config.json b/testing-config/config.json deleted file mode 100644 index 6599206..0000000 --- a/testing-config/config.json +++ /dev/null @@ -1,21 +0,0 @@ -{ - "bridge": { - "name": "Homebridge", - "username": "CC:22:3D:E3:CE:FF", - "pin": "876-54-321" - }, - - "description": "Testing configuration for an invalid user", - - "accessories": [ - ], - - "platforms": [ - { - "platform": "Bloomsky", - "apiKey": "this-is-not-a-valid-api-key==", - "apiUrl": "https://api.bloomsky.com/api/skydata/", - "debug": false - } - ] -} diff --git a/tsconfig.json b/tsconfig.json index 4546ef8..cb65045 100644 --- a/tsconfig.json +++ b/tsconfig.json @@ -1,14 +1,20 @@ { "compilerOptions": { - "declaration": true, // incompatible with --allowJs - "outDir": "./lib", + "target": "ES2018", // ~node10 + "module": "commonjs", + "moduleResolution": "Node", + "lib": ["es2015", "es2016", "es2017", "es2018"], + "declaration": true, + "declarationMap": true, + "sourceMap": true, + "outDir": "./dist", + "rootDir": "./src", "strict": true, + "esModuleInterop": true, "noImplicitAny": false, - "target": "ES5", - "lib": ["es2017"], "baseUrl": ".", "allowJs": false }, - "include": ["src"], - "exclude": ["node_modules", "src/test", "test"] + "include": ["src/"], + "exclude": ["**/*.spec.ts"] } diff --git a/tslint.json b/tslint.json deleted file mode 100644 index 6ced19f..0000000 --- a/tslint.json +++ /dev/null @@ -1,13 +0,0 @@ -{ - "defaultSeverity": "error", - "extends": [ - "tslint:recommended" - ], - "jsRules": {}, - "rules": { - "max-classes-per-file": [true, 99, "exclude-class-expressions"], - "only-arrow-functions": [false, "allow-declarations", "allow-named-functions"], - "no-misused-new": false - }, - "rulesDirectory": [] -} diff --git a/yarn.lock b/yarn.lock deleted file mode 100644 index 55abfdf..0000000 --- a/yarn.lock +++ /dev/null @@ -1,2039 +0,0 @@ -# THIS IS AN AUTOGENERATED FILE. DO NOT EDIT THIS FILE DIRECTLY. -# yarn lockfile v1 - - -"@babel/code-frame@^7.0.0": - version "7.8.3" - resolved "https://registry.yarnpkg.com/@babel/code-frame/-/code-frame-7.8.3.tgz#33e25903d7481181534e12ec0a25f16b6fcf419e" - integrity sha512-a9gxpmdXtZEInkCSHUJDLHZVBgb1QS0jhss4cPP93EW7s+uC5bikET2twEF3KV+7rDblJcmNvTR7VJejqd2C2g== - dependencies: - "@babel/highlight" "^7.8.3" - -"@babel/helper-validator-identifier@^7.9.0": - version "7.9.5" - resolved "https://registry.yarnpkg.com/@babel/helper-validator-identifier/-/helper-validator-identifier-7.9.5.tgz#90977a8e6fbf6b431a7dc31752eee233bf052d80" - integrity sha512-/8arLKUFq882w4tWGj9JYzRpAlZgiWUJ+dtteNTDqrRBz9Iguck9Rn3ykuBDoUwh2TO4tSAJlrxDUOXWklJe4g== - -"@babel/highlight@^7.8.3": - version "7.9.0" - resolved "https://registry.yarnpkg.com/@babel/highlight/-/highlight-7.9.0.tgz#4e9b45ccb82b79607271b2979ad82c7b68163079" - integrity sha512-lJZPilxX7Op3Nv/2cvFdnlepPXDxi29wxteT57Q965oc5R9v86ztx0jfxVrTcBk8C2kcPkkDa2Z4T3ZsPPVWsQ== - dependencies: - "@babel/helper-validator-identifier" "^7.9.0" - chalk "^2.0.0" - js-tokens "^4.0.0" - -"@babel/polyfill@^7.0.0": - version "7.8.7" - resolved "https://registry.yarnpkg.com/@babel/polyfill/-/polyfill-7.8.7.tgz#151ec24c7135481336168c3bd8b8bf0cf91c032f" - integrity sha512-LeSfP9bNZH2UOZgcGcZ0PIHUt1ZuHub1L3CVmEyqLxCeDLm4C5Gi8jRH8ZX2PNpDhQCo0z6y/+DIs2JlliXW8w== - dependencies: - core-js "^2.6.5" - regenerator-runtime "^0.13.4" - -"@jimp/bmp@^0.5.4": - version "0.5.4" - resolved "https://registry.yarnpkg.com/@jimp/bmp/-/bmp-0.5.4.tgz#b7b375aa774f26154912569864d5466e71333ef1" - integrity sha512-P/ezH1FuoM3FwS0Dm2ZGkph4x5/rPBzFLEZor7KQkmGUnYEIEG4o0BUcAWFmJOp2HgzbT6O2SfrpJNBOcVACzQ== - dependencies: - "@jimp/utils" "^0.5.0" - bmp-js "^0.1.0" - core-js "^2.5.7" - -"@jimp/core@^0.5.4": - version "0.5.4" - resolved "https://registry.yarnpkg.com/@jimp/core/-/core-0.5.4.tgz#69d2d9eef1a6a9d62127171e2688cf21bc0ee77c" - integrity sha512-n3uvHy2ndUKItmbhnRO8xmU8J6KR+v6CQxO9sbeUDpSc3VXc1PkqrA8ZsCVFCjnDFcGBXL+MJeCTyQzq5W9Crw== - dependencies: - "@jimp/utils" "^0.5.0" - any-base "^1.1.0" - buffer "^5.2.0" - core-js "^2.5.7" - exif-parser "^0.1.12" - file-type "^9.0.0" - load-bmfont "^1.3.1" - mkdirp "0.5.1" - phin "^2.9.1" - pixelmatch "^4.0.2" - tinycolor2 "^1.4.1" - -"@jimp/custom@^0.5.4": - version "0.5.4" - resolved "https://registry.yarnpkg.com/@jimp/custom/-/custom-0.5.4.tgz#393338efbf15d158ecf6639cb1b196c70411fddd" - integrity sha512-tLfyJoyouDl2J3RPFGfDzTtE+4S8ljqJUmLzy/cmx1n7+xS5TpLPdPskp7UaeAfNTqdF4CNAm94KYoxTZdj2mg== - dependencies: - "@jimp/core" "^0.5.4" - core-js "^2.5.7" - -"@jimp/gif@^0.5.0": - version "0.5.0" - resolved "https://registry.yarnpkg.com/@jimp/gif/-/gif-0.5.0.tgz#7543870b3d744c9758da76ca43fac4ee48fd6a00" - integrity sha512-HVB4c7b8r/yCpjhCjVNPRFLuujTav5UPmcQcFJjU6aIxmne6e29rAjRJEv3UMamHDGSu/96PzOsPZBO5U+ZGww== - dependencies: - "@jimp/utils" "^0.5.0" - core-js "^2.5.7" - omggif "^1.0.9" - -"@jimp/jpeg@^0.5.4": - version "0.5.4" - resolved "https://registry.yarnpkg.com/@jimp/jpeg/-/jpeg-0.5.4.tgz#ff52669f801e9d82041ba6322ee781c344e75241" - integrity sha512-YaPWm+YSGCThNE/jLMckM3Qs6uaMxd/VsHOnEaqu5tGA4GFbfVaWHjKqkNGAFuiNV+HdgKlNcCOF3of+elvzqQ== - dependencies: - "@jimp/utils" "^0.5.0" - core-js "^2.5.7" - jpeg-js "^0.3.4" - -"@jimp/plugin-blit@^0.5.4": - version "0.5.4" - resolved "https://registry.yarnpkg.com/@jimp/plugin-blit/-/plugin-blit-0.5.4.tgz#8c4f46e00c0a4ca9d5c592713de7575528485e59" - integrity sha512-WqDYOugv76hF1wnKy7+xPGf9PUbcm9vPW28/jHWn1hjbb2GnusJ2fVEFad76J/1SPfhrQ2Uebf2QCWJuLmOqZg== - dependencies: - "@jimp/utils" "^0.5.0" - core-js "^2.5.7" - -"@jimp/plugin-blur@^0.5.0": - version "0.5.0" - resolved "https://registry.yarnpkg.com/@jimp/plugin-blur/-/plugin-blur-0.5.0.tgz#c8222bdae8eb4cc86613c0adbcb26a92829739a2" - integrity sha512-5k0PXCA1RTJdITL7yMAyZ5tGQjKLHqFvwdXj/PCoBo5PuMyr0x6qfxmQEySixGk/ZHdDxMi80vYxHdKHjNNgjg== - dependencies: - "@jimp/utils" "^0.5.0" - core-js "^2.5.7" - -"@jimp/plugin-color@^0.5.5": - version "0.5.5" - resolved "https://registry.yarnpkg.com/@jimp/plugin-color/-/plugin-color-0.5.5.tgz#68f9652d5065d3380a9967911a7e529325d230d6" - integrity sha512-hWeOqNCmLguGYLhSvBrpfCvlijsMEVaLZAOod62s1rzWnujozyKOzm2eZe+W3To6mHbp5RGJNVrIwHBWMab4ug== - dependencies: - "@jimp/utils" "^0.5.0" - core-js "^2.5.7" - tinycolor2 "^1.4.1" - -"@jimp/plugin-contain@^0.5.4": - version "0.5.4" - resolved "https://registry.yarnpkg.com/@jimp/plugin-contain/-/plugin-contain-0.5.4.tgz#1dc258db36d50e23400e0644b7f2694fd74fbf60" - integrity sha512-8YJh4FI3S69unri0nJsWeqVLeVGA77N2R0Ws16iSuCCD/5UnWd9FeWRrSbKuidBG6TdMBaG2KUqSYZeHeH9GOQ== - dependencies: - "@jimp/utils" "^0.5.0" - core-js "^2.5.7" - -"@jimp/plugin-cover@^0.5.4": - version "0.5.4" - resolved "https://registry.yarnpkg.com/@jimp/plugin-cover/-/plugin-cover-0.5.4.tgz#a086243b151db9eef09e657fbe8bc3ef8683662e" - integrity sha512-2Rur7b44WiDDgizUI2M2uYWc1RmfhU5KjKS1xXruobjQ0tXkf5xlrPXSushq0hB6Ne0Ss6wv0+/6eQ8WeGHU2w== - dependencies: - "@jimp/utils" "^0.5.0" - core-js "^2.5.7" - -"@jimp/plugin-crop@^0.5.4": - version "0.5.4" - resolved "https://registry.yarnpkg.com/@jimp/plugin-crop/-/plugin-crop-0.5.4.tgz#124cf52aa07e36c7a33f39e2e86e78166c300ca7" - integrity sha512-6t0rqn4VazquGk48tO6hFBrQ+nkvC+A1RnR6UM/m8ZtG2/yjpwF0MXcpgJI1Fb+a4Ug7BY1fu2GPcZOhnAVK/g== - dependencies: - "@jimp/utils" "^0.5.0" - core-js "^2.5.7" - -"@jimp/plugin-displace@^0.5.0": - version "0.5.0" - resolved "https://registry.yarnpkg.com/@jimp/plugin-displace/-/plugin-displace-0.5.0.tgz#cb75d8588bdee45c1bdb1bec2323705d0e53d060" - integrity sha512-Bec7SQvnmKia4hOXEDjeNVx7vo/1bWqjuV6NO8xbNQcAO3gaCl91c9FjMDhsfAVb0Ou6imhbIuFPrLxorXsecQ== - dependencies: - "@jimp/utils" "^0.5.0" - core-js "^2.5.7" - -"@jimp/plugin-dither@^0.5.0": - version "0.5.0" - resolved "https://registry.yarnpkg.com/@jimp/plugin-dither/-/plugin-dither-0.5.0.tgz#0f1f6b7dcd5aba8f908bbd4b60685fc29cc6a3ed" - integrity sha512-We2WJQsD/Lm8oqBFp/vUv9/5r2avyenL+wNNu/s2b1HqA5O4sPGrjHy9K6vIov0NroQGCQ3bNznLkTmjiHKBcg== - dependencies: - "@jimp/utils" "^0.5.0" - core-js "^2.5.7" - -"@jimp/plugin-flip@^0.5.0": - version "0.5.0" - resolved "https://registry.yarnpkg.com/@jimp/plugin-flip/-/plugin-flip-0.5.0.tgz#4a973c9c4bdc6dbcc7da66204a2bb2b12feb9381" - integrity sha512-D/ehBQxLMNR7oNd80KXo4tnSET5zEm5mR70khYOTtTlfti/DlLp3qOdjPOzfLyAdqO7Ly4qCaXrIsnia+pfPrA== - dependencies: - "@jimp/utils" "^0.5.0" - core-js "^2.5.7" - -"@jimp/plugin-gaussian@^0.5.0": - version "0.5.0" - resolved "https://registry.yarnpkg.com/@jimp/plugin-gaussian/-/plugin-gaussian-0.5.0.tgz#02c9f07516108e01ba0f2938289b08e6e865c2c9" - integrity sha512-Ln4kgxblv0/YzLBDb/J8DYPLhDzKH87Y8yHh5UKv3H+LPKnLaEG3L4iKTE9ivvdocnjmrtTFMYcWv2ERSPeHcg== - dependencies: - "@jimp/utils" "^0.5.0" - core-js "^2.5.7" - -"@jimp/plugin-invert@^0.5.0": - version "0.5.0" - resolved "https://registry.yarnpkg.com/@jimp/plugin-invert/-/plugin-invert-0.5.0.tgz#4496d2d67ab498c8fa3e89c4b6dd5892e7f14b9b" - integrity sha512-/vyKeIi3T7puf+8ruWovTjzDC585EnTwJ+lGOOUYiNPsdn4JDFe1B3xd+Ayv9aCQbXDIlPElZaM9vd/+wqDiIQ== - dependencies: - "@jimp/utils" "^0.5.0" - core-js "^2.5.7" - -"@jimp/plugin-mask@^0.5.4": - version "0.5.4" - resolved "https://registry.yarnpkg.com/@jimp/plugin-mask/-/plugin-mask-0.5.4.tgz#ac4c2625e328818da1443c92bcb9cabb537c74ba" - integrity sha512-mUJ04pCrUWaJGXPjgoVbzhIQB8cVobj2ZEFlGO3BEAjyylYMrdJlNlsER8dd7UuJ2L/a4ocWtFDdsnuicnBghQ== - dependencies: - "@jimp/utils" "^0.5.0" - core-js "^2.5.7" - -"@jimp/plugin-normalize@^0.5.4": - version "0.5.4" - resolved "https://registry.yarnpkg.com/@jimp/plugin-normalize/-/plugin-normalize-0.5.4.tgz#d60aeb637bcaecadf654c9621e291d6eed12fa19" - integrity sha512-Q5W0oEz9wxsjuhvHAJynI/OqXZcmqEAuRONQId7Aw5ulCXSOg9C4y2a67EO7aZAt55T+zMVxI9UpVUpzVvO6hw== - dependencies: - "@jimp/utils" "^0.5.0" - core-js "^2.5.7" - -"@jimp/plugin-print@^0.5.4": - version "0.5.4" - resolved "https://registry.yarnpkg.com/@jimp/plugin-print/-/plugin-print-0.5.4.tgz#00524a7424a4e12a17764d349485dd1120a43728" - integrity sha512-DOZr5TY9WyMWFBD37oz7KpTEBVioFIHQF/gH5b3O5jjFyj4JPMkw7k3kVBve9lIrzIYrvLqe0wH59vyAwpeEFg== - dependencies: - "@jimp/utils" "^0.5.0" - core-js "^2.5.7" - load-bmfont "^1.4.0" - -"@jimp/plugin-resize@^0.5.4": - version "0.5.4" - resolved "https://registry.yarnpkg.com/@jimp/plugin-resize/-/plugin-resize-0.5.4.tgz#c9b2c4949ee080df3fa2ca587539e2ce8588b8af" - integrity sha512-lXNprNAT0QY1D1vG/1x6urUTlWuZe2dfL29P81ApW2Yfcio471+oqo45moX5FLS0q24xU600g7cHGf2/TzqSfA== - dependencies: - "@jimp/utils" "^0.5.0" - core-js "^2.5.7" - -"@jimp/plugin-rotate@^0.5.4": - version "0.5.4" - resolved "https://registry.yarnpkg.com/@jimp/plugin-rotate/-/plugin-rotate-0.5.4.tgz#6c4c560779bc3ebf291db9a5095158d32a2a4af3" - integrity sha512-SIdUpMc8clObMchy8TnjgHgcXEQM992z5KavgiuOnCuBlsmSHtE3MrXTOyMW0Dn3gqapV9Y5vygrLm/BVtCCsg== - dependencies: - "@jimp/utils" "^0.5.0" - core-js "^2.5.7" - -"@jimp/plugin-scale@^0.5.0": - version "0.5.0" - resolved "https://registry.yarnpkg.com/@jimp/plugin-scale/-/plugin-scale-0.5.0.tgz#095f937e5a4887481b3074f5cd6a144d8f4f815e" - integrity sha512-5InIOr3cNtrS5aQ/uaosNf28qLLc0InpNGKFmGFTv8oqZqLch6PtDTjDBZ1GGWsPdA/ljy4Qyy7mJO1QBmgQeQ== - dependencies: - "@jimp/utils" "^0.5.0" - core-js "^2.5.7" - -"@jimp/plugins@^0.5.5": - version "0.5.5" - resolved "https://registry.yarnpkg.com/@jimp/plugins/-/plugins-0.5.5.tgz#e97fa368d69ad7718d5a2a9b6ffa8e6cc1e4264d" - integrity sha512-9oF6LbSM/K7YkFCcxaPaD8NUkL/ZY8vT8NIGfQ/NpX+tKQtcsLHcRavHpUC+M1xXShv/QGx9OdBV/jgiu82QYg== - dependencies: - "@jimp/plugin-blit" "^0.5.4" - "@jimp/plugin-blur" "^0.5.0" - "@jimp/plugin-color" "^0.5.5" - "@jimp/plugin-contain" "^0.5.4" - "@jimp/plugin-cover" "^0.5.4" - "@jimp/plugin-crop" "^0.5.4" - "@jimp/plugin-displace" "^0.5.0" - "@jimp/plugin-dither" "^0.5.0" - "@jimp/plugin-flip" "^0.5.0" - "@jimp/plugin-gaussian" "^0.5.0" - "@jimp/plugin-invert" "^0.5.0" - "@jimp/plugin-mask" "^0.5.4" - "@jimp/plugin-normalize" "^0.5.4" - "@jimp/plugin-print" "^0.5.4" - "@jimp/plugin-resize" "^0.5.4" - "@jimp/plugin-rotate" "^0.5.4" - "@jimp/plugin-scale" "^0.5.0" - core-js "^2.5.7" - timm "^1.6.1" - -"@jimp/png@^0.5.4": - version "0.5.4" - resolved "https://registry.yarnpkg.com/@jimp/png/-/png-0.5.4.tgz#4ed02435ab8ac219b618e9578dfd60626b3b5dd4" - integrity sha512-J2NU7368zihF1HUZdmpXsL/Hhyf+I3ubmK+6Uz3Uoyvtk1VS7dO3L0io6fJQutfWmPZ4bvu6Ry022oHjbi6QCA== - dependencies: - "@jimp/utils" "^0.5.0" - core-js "^2.5.7" - pngjs "^3.3.3" - -"@jimp/tiff@^0.5.4": - version "0.5.4" - resolved "https://registry.yarnpkg.com/@jimp/tiff/-/tiff-0.5.4.tgz#ce5370283eba390ff32b6fd86b9259d7cf3e2315" - integrity sha512-hr7Zq3eWjAZ+itSwuAObIWMRNv7oHVM3xuEDC2ouP7HfE7woBtyhCyfA7u12KlgtM57gKWeogXqTlewRGVzx6g== - dependencies: - core-js "^2.5.7" - utif "^2.0.1" - -"@jimp/types@^0.5.4": - version "0.5.4" - resolved "https://registry.yarnpkg.com/@jimp/types/-/types-0.5.4.tgz#c312e415ec9c4a35770e89b9eee424a96be60ab8" - integrity sha512-nbZXM6TsdpnYHIBd8ZuoxGpvmxc2SqiggY30/bhOP/VJQoDBzm2v/20Ywz5M0snpIK2SdYG52eZPNjfjqUP39w== - dependencies: - "@jimp/bmp" "^0.5.4" - "@jimp/gif" "^0.5.0" - "@jimp/jpeg" "^0.5.4" - "@jimp/png" "^0.5.4" - "@jimp/tiff" "^0.5.4" - core-js "^2.5.7" - timm "^1.6.1" - -"@jimp/utils@^0.5.0": - version "0.5.0" - resolved "https://registry.yarnpkg.com/@jimp/utils/-/utils-0.5.0.tgz#ecb33259c75238053d6c7706a3e91f657dbabf91" - integrity sha512-7H9RFVU+Li2XmEko0GGyzy7m7JjSc7qa+m8l3fUzYg2GtwASApjKF/LSG2AUQCUmDKFLdfIEVjxvKvZUJFEmpw== - dependencies: - core-js "^2.5.7" - -"@types/chai@^4.1.6": - version "4.2.11" - resolved "https://registry.yarnpkg.com/@types/chai/-/chai-4.2.11.tgz#d3614d6c5f500142358e6ed24e1bf16657536c50" - integrity sha512-t7uW6eFafjO+qJ3BIV2gGUyZs27egcNRkUdalkud+Qa3+kg//f129iuOFivHDXQ+vnU3fDXuwgv0cqMCbcE8sw== - -"@types/color-name@^1.1.1": - version "1.1.1" - resolved "https://registry.yarnpkg.com/@types/color-name/-/color-name-1.1.1.tgz#1c1261bbeaa10a8055bbc5d8ab84b7b2afc846a0" - integrity sha512-rr+OQyAjxze7GgWrSaJwydHStIhHq2lvY3BOC2Mj7KnzI7XK0Uw1TOOdI9lDoajEbSWLiYgoo4f1R51erQfhPQ== - -"@types/debug@0.0.31": - version "0.0.31" - resolved "https://registry.yarnpkg.com/@types/debug/-/debug-0.0.31.tgz#bac8d8aab6a823e91deb7f79083b2a35fa638f33" - integrity sha512-LS1MCPaQKqspg7FvexuhmDbWUhE2yIJ+4AgVIyObfc06/UKZ8REgxGNjZc82wPLWmbeOm7S+gSsLgo75TanG4A== - -"@types/ip@0.0.31": - version "0.0.31" - resolved "https://registry.yarnpkg.com/@types/ip/-/ip-0.0.31.tgz#a363989e72dd11bb21f932d6fe96bd6a85b2b74b" - integrity sha512-oYk8aalgfCt7XfEu66Sjwz/aQjfRtQkjNSXwrUGqyRoQbOymAc156fUNTwn1cSCEEwuPPzMy7fGPmKcFLoaIkA== - dependencies: - "@types/node" "*" - -"@types/mocha@^5.2.5": - version "5.2.7" - resolved "https://registry.yarnpkg.com/@types/mocha/-/mocha-5.2.7.tgz#315d570ccb56c53452ff8638738df60726d5b6ea" - integrity sha512-NYrtPht0wGzhwe9+/idPaBB+TqkY9AhTvOLMkThm0IoEfLaiVQZwBwyJ5puCkO3AUCWrmcoePjp2mbFocKy4SQ== - -"@types/node@*": - version "14.0.4" - resolved "https://registry.yarnpkg.com/@types/node/-/node-14.0.4.tgz#43a63fc5edce226bed106b31b875165256271107" - integrity sha512-k3NqigXWRzQZVBDS5D1U70A5E8Qk4Kh+Ha/x4M8Bt9pF0X05eggfnC9+63Usc9Q928hRUIpIhTQaXsZwZBl4Ew== - -"@types/node@^10.12.0": - version "10.17.24" - resolved "https://registry.yarnpkg.com/@types/node/-/node-10.17.24.tgz#c57511e3a19c4b5e9692bb2995c40a3a52167944" - integrity sha512-5SCfvCxV74kzR3uWgTYiGxrd69TbT1I6+cMx1A5kEly/IVveJBimtAMlXiEyVFn5DvUFewQWxOOiJhlxeQwxgA== - -"@types/sharp@^0.21.0": - version "0.21.3" - resolved "https://registry.yarnpkg.com/@types/sharp/-/sharp-0.21.3.tgz#82f89f99536557e397c0c46f5ea50dcc1529fe35" - integrity sha512-wgCw1OO/iQ3w13WVRhx1fHoo5NDHq+444wqTnKcAWA9YMj1a9stoLlfLjW1mJJkFG1aRjeKd9KYhiYOJ3H7qEg== - dependencies: - "@types/node" "*" - -acorn@^5.4.0: - version "5.7.4" - resolved "https://registry.yarnpkg.com/acorn/-/acorn-5.7.4.tgz#3e8d8a9947d0599a1796d10225d7432f4a4acf5e" - integrity sha512-1D++VG7BhrtvQpNbBzovKNc1FLGGEE/oGe7b9xJm/RFHMBeUaUGpluV9RLjZa47YFdPcDAenEYuq9pQPcMdLJg== - -ansi-colors@3.2.3: - version "3.2.3" - resolved "https://registry.yarnpkg.com/ansi-colors/-/ansi-colors-3.2.3.tgz#57d35b8686e851e2cc04c403f1c00203976a1813" - integrity sha512-LEHHyuhlPY3TmuUYMh2oz89lTShfvgbmzaBcxve9t/9Wuy7Dwf4yoAKcND7KFT1HAQfqZ12qtc+DUrBMeKF9nw== - -ansi-regex@^3.0.0: - version "3.0.0" - resolved "https://registry.yarnpkg.com/ansi-regex/-/ansi-regex-3.0.0.tgz#ed0317c322064f79466c02966bddb605ab37d998" - integrity sha1-7QMXwyIGT3lGbAKWa922Bas32Zg= - -ansi-regex@^4.1.0: - version "4.1.0" - resolved "https://registry.yarnpkg.com/ansi-regex/-/ansi-regex-4.1.0.tgz#8b9f8f08cf1acb843756a839ca8c7e3168c51997" - integrity sha512-1apePfXM1UOSqw0o9IiFAovVz9M5S1Dg+4TrDwfMewQ6p/rmMueb7tWZjQ1rx4Loy1ArBggoqGpfqqdI4rondg== - -ansi-styles@^3.2.0, ansi-styles@^3.2.1: - version "3.2.1" - resolved "https://registry.yarnpkg.com/ansi-styles/-/ansi-styles-3.2.1.tgz#41fbb20243e50b12be0f04b8dedbf07520ce841d" - integrity sha512-VT0ZI6kZRdTh8YyJw3SMbYm/u+NqfsAxEpWO0Pf9sq8/e94WxxOpPKx9FR1FlyCtOVDNOQ+8ntlqFxiRc+r5qA== - dependencies: - color-convert "^1.9.0" - -ansi-styles@^4.1.0: - version "4.2.1" - resolved "https://registry.yarnpkg.com/ansi-styles/-/ansi-styles-4.2.1.tgz#90ae75c424d008d2624c5bf29ead3177ebfcf359" - integrity sha512-9VGjrMsG1vePxcSweQsN20KY/c4zN0h9fLjqAbwbPfahM3t+NL+M9HC8xeXG2I8pX5NoamTGNuomEUFI7fcUjA== - dependencies: - "@types/color-name" "^1.1.1" - color-convert "^2.0.1" - -any-base@^1.1.0: - version "1.1.0" - resolved "https://registry.yarnpkg.com/any-base/-/any-base-1.1.0.tgz#ae101a62bc08a597b4c9ab5b7089d456630549fe" - integrity sha512-uMgjozySS8adZZYePpaWs8cxB9/kdzmpX6SgJZ+wbz1K5eYk5QMYDVJaZKhxyIHUdnnJkfR7SVgStgH7LkGUyg== - -anymatch@~3.1.1: - version "3.1.1" - resolved "https://registry.yarnpkg.com/anymatch/-/anymatch-3.1.1.tgz#c55ecf02185e2469259399310c173ce31233b142" - integrity sha512-mM8522psRCqzV+6LhomX5wgp25YVibjh8Wj23I5RPkPppSVSjyKD2A2mBJmWGa+KN7f2D6LNh9jkBCeyLktzjg== - dependencies: - normalize-path "^3.0.0" - picomatch "^2.0.4" - -argparse@^1.0.7: - version "1.0.10" - resolved "https://registry.yarnpkg.com/argparse/-/argparse-1.0.10.tgz#bcd6791ea5ae09725e17e5ad988134cd40b3d911" - integrity sha512-o5Roy6tNG4SL/FOkCAN6RzjiakZS25RLYFrcMttJqbdd8BWrnA+fGz57iN5Pb06pvBGvl5gQ0B48dJlslXvoTg== - dependencies: - sprintf-js "~1.0.2" - -array-filter@^1.0.0: - version "1.0.0" - resolved "https://registry.yarnpkg.com/array-filter/-/array-filter-1.0.0.tgz#baf79e62e6ef4c2a4c0b831232daffec251f9d83" - integrity sha1-uveeYubvTCpMC4MSMtr/7CUfnYM= - -array-flatten@^2.1.2: - version "2.1.2" - resolved "https://registry.yarnpkg.com/array-flatten/-/array-flatten-2.1.2.tgz#24ef80a28c1a893617e2149b0c6d0d788293b099" - integrity sha512-hNfzcOV8W4NdualtqBFPyVO+54DSJuZGY9qT4pRroB6S9e3iiido2ISIC5h9R2sPJ8H3FHCIiEnsv1lPXO3KtQ== - -arrify@^1.0.0: - version "1.0.1" - resolved "https://registry.yarnpkg.com/arrify/-/arrify-1.0.1.tgz#898508da2226f380df904728456849c1501a4b0d" - integrity sha1-iYUI2iIm84DfkEcoRWhJwVAaSw0= - -assertion-error@^1.1.0: - version "1.1.0" - resolved "https://registry.yarnpkg.com/assertion-error/-/assertion-error-1.1.0.tgz#e60b6b0e8f301bd97e5375215bda406c85118c0b" - integrity sha512-jgsaNduz+ndvGyFt3uSuWqvy4lCnIJiovtouQN5JZHOKCS2QuhEdbcQHFhVksz2N2U9hXJo8odG7ETyWlEeuDw== - -async-wait-until@^1.2.4: - version "1.2.4" - resolved "https://registry.yarnpkg.com/async-wait-until/-/async-wait-until-1.2.4.tgz#55a6c29145b8037742a629b0ae0b69b5e2988404" - integrity sha512-H7ZR3cu1THxrJiDgevu+PgbyT0o5P/9nsCZj70ckruJCMWt/UOQmGo65wKWvEQN69MJk140x5/Z01ZQjzfwyOw== - -available-typed-arrays@^1.0.0, available-typed-arrays@^1.0.2: - version "1.0.2" - resolved "https://registry.yarnpkg.com/available-typed-arrays/-/available-typed-arrays-1.0.2.tgz#6b098ca9d8039079ee3f77f7b783c4480ba513f5" - integrity sha512-XWX3OX8Onv97LMk/ftVyBibpGwY5a8SmuxZPzeOxqmuEqUCOM9ZE+uIaD1VNJ5QnvU2UQusvmKbuM1FR8QWGfQ== - dependencies: - array-filter "^1.0.0" - -balanced-match@^1.0.0: - version "1.0.0" - resolved "https://registry.yarnpkg.com/balanced-match/-/balanced-match-1.0.0.tgz#89b4d199ab2bee49de164ea02b89ce462d71b767" - integrity sha1-ibTRmasr7kneFk6gK4nORi1xt2c= - -base64-js@^1.0.2: - version "1.3.1" - resolved "https://registry.yarnpkg.com/base64-js/-/base64-js-1.3.1.tgz#58ece8cb75dd07e71ed08c736abc5fac4dbf8df1" - integrity sha512-mLQ4i2QO1ytvGWFWmcngKO//JXAQueZvwEKtjgQFM4jIK0kU+ytMfplL8j+n5mspOfjHwoAg+9yhb7BwAHm36g== - -binary-extensions@^2.0.0: - version "2.0.0" - resolved "https://registry.yarnpkg.com/binary-extensions/-/binary-extensions-2.0.0.tgz#23c0df14f6a88077f5f986c0d167ec03c3d5537c" - integrity sha512-Phlt0plgpIIBOGTT/ehfFnbNlfsDEiqmzE2KRXoX1bLIlir4X/MR+zSyBEkL05ffWgnRSf/DXv+WrUAVr93/ow== - -bmp-js@^0.1.0: - version "0.1.0" - resolved "https://registry.yarnpkg.com/bmp-js/-/bmp-js-0.1.0.tgz#e05a63f796a6c1ff25f4771ec7adadc148c07233" - integrity sha1-4Fpj95amwf8l9Hcex62twUjAcjM= - -bonjour-hap@^3.5.1, bonjour-hap@~3.5.8: - version "3.5.10" - resolved "https://registry.yarnpkg.com/bonjour-hap/-/bonjour-hap-3.5.10.tgz#a9cd35dabf8eb75e9bfc54871d19d0c4ee41ed4e" - integrity sha512-vaqa4uUST8K5rj9QGe6GaSJ+6rQ24KzgkjdyZvoTpbKBti5xL/m8H9Dp9VmPdo434OAetqU5PKAn5izucrKEBA== - dependencies: - array-flatten "^2.1.2" - deep-equal "^2.0.2" - ip "^1.1.5" - multicast-dns "^7.2.2" - multicast-dns-service-types "^1.1.0" - -brace-expansion@^1.1.7: - version "1.1.11" - resolved "https://registry.yarnpkg.com/brace-expansion/-/brace-expansion-1.1.11.tgz#3c7fcbf529d87226f3d2f52b966ff5271eb441dd" - integrity sha512-iCuPHDFgrHX7H2vEI/5xpz07zSHB00TpugqhmYtVmMO6518mCuRMoOYFldEBl0g187ufozdaHgWKcYFb61qGiA== - dependencies: - balanced-match "^1.0.0" - concat-map "0.0.1" - -braces@~3.0.2: - version "3.0.2" - resolved "https://registry.yarnpkg.com/braces/-/braces-3.0.2.tgz#3454e1a462ee8d599e236df336cd9ea4f8afe107" - integrity sha512-b8um+L1RzM3WDSzvhm6gIz1yfTbBt6YTlcEKAvsmqCZZFw46z626lVj9j1yEPW33H5H+lBQpZMP1k8l+78Ha0A== - dependencies: - fill-range "^7.0.1" - -browser-stdout@1.3.1: - version "1.3.1" - resolved "https://registry.yarnpkg.com/browser-stdout/-/browser-stdout-1.3.1.tgz#baa559ee14ced73452229bad7326467c61fabd60" - integrity sha512-qhAVI1+Av2X7qelOfAIYwXONood6XlZE/fXaBSmW/T5SzLAmCgzi+eiWE7fUvbHaeNBQH13UftjpXxsfLkMpgw== - -buffer-equal@0.0.1: - version "0.0.1" - resolved "https://registry.yarnpkg.com/buffer-equal/-/buffer-equal-0.0.1.tgz#91bc74b11ea405bc916bc6aa908faafa5b4aac4b" - integrity sha1-kbx0sR6kBbyRa8aqkI+q+ltKrEs= - -buffer-from@^1.0.0, buffer-from@^1.1.0: - version "1.1.1" - resolved "https://registry.yarnpkg.com/buffer-from/-/buffer-from-1.1.1.tgz#32713bc028f75c02fdb710d7c7bcec1f2c6070ef" - integrity sha512-MQcXEUbCKtEo7bhqEs6560Hyd4XaovZlO/k9V3hjVUF/zwW7KBVdSK4gIt/bzwS9MbR5qob+F5jusZsb0YQK2A== - -buffer-shims@^1.0.0: - version "1.0.0" - resolved "https://registry.yarnpkg.com/buffer-shims/-/buffer-shims-1.0.0.tgz#9978ce317388c649ad8793028c3477ef044a8b51" - integrity sha1-mXjOMXOIxkmth5MCjDR37wRKi1E= - -buffer@^5.2.0: - version "5.6.0" - resolved "https://registry.yarnpkg.com/buffer/-/buffer-5.6.0.tgz#a31749dc7d81d84db08abf937b6b8c4033f62786" - integrity sha512-/gDYp/UtU0eA1ys8bOs9J6a+E/KWIY+DZ+Q2WESNUA0jFRsJOc0SNUO6xJ5SGA1xueg3NL65W6s+NY5l9cunuw== - dependencies: - base64-js "^1.0.2" - ieee754 "^1.1.4" - -builtin-modules@^1.1.1: - version "1.1.1" - resolved "https://registry.yarnpkg.com/builtin-modules/-/builtin-modules-1.1.1.tgz#270f076c5a72c02f5b65a47df94c5fe3a278892f" - integrity sha1-Jw8HbFpywC9bZaR9+Uxf46J4iS8= - -camelcase@^5.0.0: - version "5.3.1" - resolved "https://registry.yarnpkg.com/camelcase/-/camelcase-5.3.1.tgz#e3c9b31569e106811df242f715725a1f4c494320" - integrity sha512-L28STB170nwWS63UjtlEOE3dldQApaJXZkOI1uMFfzf3rRuPegHaHesyee+YxQ+W6SvRDQV6UrdOdRiR153wJg== - -chai@^4.2.0: - version "4.2.0" - resolved "https://registry.yarnpkg.com/chai/-/chai-4.2.0.tgz#760aa72cf20e3795e84b12877ce0e83737aa29e5" - integrity sha512-XQU3bhBukrOsQCuwZndwGcCVQHyZi53fQ6Ys1Fym7E4olpIqqZZhhoFJoaKVvV17lWQoXYwgWN2nF5crA8J2jw== - dependencies: - assertion-error "^1.1.0" - check-error "^1.0.2" - deep-eql "^3.0.1" - get-func-name "^2.0.0" - pathval "^1.1.0" - type-detect "^4.0.5" - -chalk@^2.0.0, chalk@^2.3.0, chalk@^2.4.2: - version "2.4.2" - resolved "https://registry.yarnpkg.com/chalk/-/chalk-2.4.2.tgz#cd42541677a54333cf541a49108c1432b44c9424" - integrity sha512-Mti+f9lpJNcwF4tWV8/OrTTtF1gZi+f8FqlyAdouralcFWFQWF2+NgCHShjkCb+IFBLq9buZwE1xckQU4peSuQ== - dependencies: - ansi-styles "^3.2.1" - escape-string-regexp "^1.0.5" - supports-color "^5.3.0" - -chalk@^3.0.0: - version "3.0.0" - resolved "https://registry.yarnpkg.com/chalk/-/chalk-3.0.0.tgz#3f73c2bf526591f574cc492c51e2456349f844e4" - integrity sha512-4D3B6Wf41KOYRFdszmDqMCGq5VV/uMAB273JILmO+3jAlh8X4qDtdtgCR3fxtbLEMzSx22QdhnDcJvu2u1fVwg== - dependencies: - ansi-styles "^4.1.0" - supports-color "^7.1.0" - -check-error@^1.0.2: - version "1.0.2" - resolved "https://registry.yarnpkg.com/check-error/-/check-error-1.0.2.tgz#574d312edd88bb5dd8912e9286dd6c0aed4aac82" - integrity sha1-V00xLt2Iu13YkS6Sht1sCu1KrII= - -child_process@^1.0.2: - version "1.0.2" - resolved "https://registry.yarnpkg.com/child_process/-/child_process-1.0.2.tgz#b1f7e7fc73d25e7fd1d455adc94e143830182b5a" - integrity sha1-sffn/HPSXn/R1FWtyU4UODAYK1o= - -chokidar@3.3.0: - version "3.3.0" - resolved "https://registry.yarnpkg.com/chokidar/-/chokidar-3.3.0.tgz#12c0714668c55800f659e262d4962a97faf554a6" - integrity sha512-dGmKLDdT3Gdl7fBUe8XK+gAtGmzy5Fn0XkkWQuYxGIgWVPPse2CxFA5mtrlD0TOHaHjEUqkWNyP1XdHoJES/4A== - dependencies: - anymatch "~3.1.1" - braces "~3.0.2" - glob-parent "~5.1.0" - is-binary-path "~2.1.0" - is-glob "~4.0.1" - normalize-path "~3.0.0" - readdirp "~3.2.0" - optionalDependencies: - fsevents "~2.1.1" - -cliui@^5.0.0: - version "5.0.0" - resolved "https://registry.yarnpkg.com/cliui/-/cliui-5.0.0.tgz#deefcfdb2e800784aa34f46fa08e06851c7bbbc5" - integrity sha512-PYeGSEmmHM6zvoef2w8TPzlrnNpXIjTipYK780YswmIP9vjxmd6Y2a3CB2Ks6/AU8NHjZugXvo8w3oWM2qnwXA== - dependencies: - string-width "^3.1.0" - strip-ansi "^5.2.0" - wrap-ansi "^5.1.0" - -color-convert@^1.9.0: - version "1.9.3" - resolved "https://registry.yarnpkg.com/color-convert/-/color-convert-1.9.3.tgz#bb71850690e1f136567de629d2d5471deda4c1e8" - integrity sha512-QfAUtd+vFdAtFQcC8CCyYt1fYWxSqAiK2cSD6zDB8N3cpsEBAvRxp9zOGg6G/SHHJYAT88/az/IuDGALsNVbGg== - dependencies: - color-name "1.1.3" - -color-convert@^2.0.1: - version "2.0.1" - resolved "https://registry.yarnpkg.com/color-convert/-/color-convert-2.0.1.tgz#72d3a68d598c9bdb3af2ad1e84f21d896abd4de3" - integrity sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ== - dependencies: - color-name "~1.1.4" - -color-name@1.1.3: - version "1.1.3" - resolved "https://registry.yarnpkg.com/color-name/-/color-name-1.1.3.tgz#a7d0558bd89c42f795dd42328f740831ca53bc25" - integrity sha1-p9BVi9icQveV3UIyj3QIMcpTvCU= - -color-name@~1.1.4: - version "1.1.4" - resolved "https://registry.yarnpkg.com/color-name/-/color-name-1.1.4.tgz#c2a09a87acbde69543de6f63fa3995c826c536a2" - integrity sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA== - -commander@2.15.1: - version "2.15.1" - resolved "https://registry.yarnpkg.com/commander/-/commander-2.15.1.tgz#df46e867d0fc2aec66a34662b406a9ccafff5b0f" - integrity sha512-VlfT9F3V0v+jr4yxPc5gg9s62/fIVWsd2Bk2iD435um1NlGMYdVCq+MjcXnhYq2icNOizHr1kK+5TI6H0Hy0ag== - -commander@5.0.0: - version "5.0.0" - resolved "https://registry.yarnpkg.com/commander/-/commander-5.0.0.tgz#dbf1909b49e5044f8fdaf0adc809f0c0722bdfd0" - integrity sha512-JrDGPAKjMGSP1G0DUoaceEJ3DZgAfr/q6X7FVk4+U5KxUSKviYGM2k6zWkfyyBHy5rAtzgYJFa1ro2O9PtoxwQ== - -commander@^2.12.1: - version "2.20.3" - resolved "https://registry.yarnpkg.com/commander/-/commander-2.20.3.tgz#fd485e84c03eb4881c20722ba48035e8531aeb33" - integrity sha512-GpVkmM8vF2vQUkj2LvZmD35JxeJOLCwJ9cUkugyk2nuhbv3+mJvpLYYt+0+USMxE+oj+ey/lJEnhZw75x/OMcQ== - -concat-map@0.0.1: - version "0.0.1" - resolved "https://registry.yarnpkg.com/concat-map/-/concat-map-0.0.1.tgz#d8a96bd77fd68df7793a73036a3ba0d5405d477b" - integrity sha1-2Klr13/Wjfd5OnMDajug1UBdR3s= - -core-js@^2.5.7, core-js@^2.6.5: - version "2.6.11" - resolved "https://registry.yarnpkg.com/core-js/-/core-js-2.6.11.tgz#38831469f9922bded8ee21c9dc46985e0399308c" - integrity sha512-5wjnpaT/3dV+XB4borEsnAYQchn00XSgTAWKDkEqv+K8KevjbzmofK6hfJ9TZIlpj2N0xQpazy7PiRQiWHqzWg== - -core-util-is@~1.0.0: - version "1.0.2" - resolved "https://registry.yarnpkg.com/core-util-is/-/core-util-is-1.0.2.tgz#b5fd54220aa2bc5ab57aab7140c940754503c1a7" - integrity sha1-tf1UIgqivFq1eqtxQMlAdUUDwac= - -debug@3.1.0: - version "3.1.0" - resolved "https://registry.yarnpkg.com/debug/-/debug-3.1.0.tgz#5bb5a0672628b64149566ba16819e61518c67261" - integrity sha512-OX8XqP7/1a9cqkxYw2yXss15f26NKWBpDXQd0/uK/KPqdQhxbPa994hnzjcE2VqQpDslf55723cKPUOGSmMY3g== - dependencies: - ms "2.0.0" - -debug@3.2.6: - version "3.2.6" - resolved "https://registry.yarnpkg.com/debug/-/debug-3.2.6.tgz#e83d17de16d8a7efb7717edbe5fb10135eee629b" - integrity sha512-mel+jf7nrtEl5Pn1Qx46zARXKDpBbvzezse7p7LqINmdoIk8PYP5SySaxEmYv6TZ0JyEKA1hsCId6DIhgITtWQ== - dependencies: - ms "^2.1.1" - -debug@^2.2.0: - version "2.6.9" - resolved "https://registry.yarnpkg.com/debug/-/debug-2.6.9.tgz#5d128515df134ff327e90a4c93f4e077a536341f" - integrity sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA== - dependencies: - ms "2.0.0" - -debug@^4.1.1: - version "4.1.1" - resolved "https://registry.yarnpkg.com/debug/-/debug-4.1.1.tgz#3b72260255109c6b589cee050f1d516139664791" - integrity sha512-pYAIzeRo8J6KPEaJ0VWOh5Pzkbw/RetuzehGM7QRRX5he4fPHx2rdKMB256ehJCkX+XRQm16eZLqLNS8RSZXZw== - dependencies: - ms "^2.1.1" - -decamelize@^1.2.0: - version "1.2.0" - resolved "https://registry.yarnpkg.com/decamelize/-/decamelize-1.2.0.tgz#f6534d15148269b20352e7bee26f501f9a191290" - integrity sha1-9lNNFRSCabIDUue+4m9QH5oZEpA= - -decimal.js@^10.2.0: - version "10.2.0" - resolved "https://registry.yarnpkg.com/decimal.js/-/decimal.js-10.2.0.tgz#39466113a9e036111d02f82489b5fd6b0b5ed231" - integrity sha512-vDPw+rDgn3bZe1+F/pyEwb1oMG2XTlRVgAa6B4KccTEpYgF8w6eQllVbQcfIJnZyvzFtFpxnpGtx8dd7DJp/Rw== - -decimal.js@^7.2.3: - version "7.5.1" - resolved "https://registry.yarnpkg.com/decimal.js/-/decimal.js-7.5.1.tgz#cf4cf5eeb9faa24fc4ee6af361faebb7bfcca2ce" - integrity sha512-1K5Y6MykxQYfHBcFfAj2uBaLmwreq4MsjsvrlgcEOvg+X82IeeXlIVIVkBMiypksu+yo9vcYP6lfU3qTedofSQ== - -deep-eql@^3.0.1: - version "3.0.1" - resolved "https://registry.yarnpkg.com/deep-eql/-/deep-eql-3.0.1.tgz#dfc9404400ad1c8fe023e7da1df1c147c4b444df" - integrity sha512-+QeIQyN5ZuO+3Uk5DYh6/1eKO0m0YmJFGNmFHGACpf1ClL1nmlV/p4gNgbl2pJGxgXb4faqo6UE+M5ACEMyVcw== - dependencies: - type-detect "^4.0.0" - -deep-equal@^2.0.2: - version "2.0.3" - resolved "https://registry.yarnpkg.com/deep-equal/-/deep-equal-2.0.3.tgz#cad1c15277ad78a5c01c49c2dee0f54de8a6a7b0" - integrity sha512-Spqdl4H+ky45I9ByyJtXteOm9CaIrPmnIPmOhrkKGNYWeDgCvJ8jNYVCTjChxW4FqGuZnLHADc8EKRMX6+CgvA== - dependencies: - es-abstract "^1.17.5" - es-get-iterator "^1.1.0" - is-arguments "^1.0.4" - is-date-object "^1.0.2" - is-regex "^1.0.5" - isarray "^2.0.5" - object-is "^1.1.2" - object-keys "^1.1.1" - object.assign "^4.1.0" - regexp.prototype.flags "^1.3.0" - side-channel "^1.0.2" - which-boxed-primitive "^1.0.1" - which-collection "^1.0.1" - which-typed-array "^1.1.2" - -define-properties@^1.1.2, define-properties@^1.1.3: - version "1.1.3" - resolved "https://registry.yarnpkg.com/define-properties/-/define-properties-1.1.3.tgz#cf88da6cbee26fe6db7094f61d870cbd84cee9f1" - integrity sha512-3MqfYKj2lLzdMSf8ZIZE/V+Zuy+BgD6f164e8K2w7dgnpKArBDerGYpM46IYYcjnkdPNMjPk9A6VFB8+3SKlXQ== - dependencies: - object-keys "^1.0.12" - -diff@3.5.0, diff@^3.1.0: - version "3.5.0" - resolved "https://registry.yarnpkg.com/diff/-/diff-3.5.0.tgz#800c0dd1e0a8bfbc95835c202ad220fe317e5a12" - integrity sha512-A46qtFgd+g7pDZinpnwiRJtxbC1hpgf0uzP3iG89scHk0AUC7A1TGxf5OiiOUv/JMZR8GOt8hL900hV0bOy5xA== - -diff@^4.0.1: - version "4.0.2" - resolved "https://registry.yarnpkg.com/diff/-/diff-4.0.2.tgz#60f3aecb89d5fae520c11aa19efc2bb982aade7d" - integrity sha512-58lmxKSA4BNyLz+HHMUzlOEpg09FV+ev6ZMe3vJihgdxzgcwZ8VoEEPmALCZG9LmqfVoNMMKpttIYTVG6uDY7A== - -dns-packet@^4.0.0: - version "4.2.0" - resolved "https://registry.yarnpkg.com/dns-packet/-/dns-packet-4.2.0.tgz#3fd6f5ff5a4ec3194ed0b15312693ffe8776b343" - integrity sha512-bn1AKpfkFbm0MIioOMHZ5qJzl2uypdBwI4nYNsqvhjsegBhcKJUlCrMPWLx6JEezRjxZmxhtIz/FkBEur2l8Cw== - dependencies: - ip "^1.1.5" - safe-buffer "^5.1.1" - -dom-walk@^0.1.0: - version "0.1.2" - resolved "https://registry.yarnpkg.com/dom-walk/-/dom-walk-0.1.2.tgz#0c548bef048f4d1f2a97249002236060daa3fd84" - integrity sha512-6QvTW9mrGeIegrFXdtQi9pk7O/nSK6lSdXW2eqUspN5LWD7UTji2Fqw5V2YLjBpHEoU9Xl/eUWNpDeZvoyOv2w== - -emoji-regex@^7.0.1: - version "7.0.3" - resolved "https://registry.yarnpkg.com/emoji-regex/-/emoji-regex-7.0.3.tgz#933a04052860c85e83c122479c4748a8e4c72156" - integrity sha512-CwBLREIQ7LvYFB0WyRvwhq5N5qPhc6PMjD6bYggFlI5YyDgl+0vxq5VHbMOFqLg7hfWzmu8T5Z1QofhmTIhItA== - -enhanced-resolve@^2.2.2: - version "2.3.0" - resolved "https://registry.yarnpkg.com/enhanced-resolve/-/enhanced-resolve-2.3.0.tgz#a115c32504b6302e85a76269d7a57ccdd962e359" - integrity sha1-oRXDJQS2MC6Fp2Jp16V8zdli41k= - dependencies: - graceful-fs "^4.1.2" - memory-fs "^0.3.0" - object-assign "^4.0.1" - tapable "^0.2.3" - -errno@^0.1.3: - version "0.1.7" - resolved "https://registry.yarnpkg.com/errno/-/errno-0.1.7.tgz#4684d71779ad39af177e3f007996f7c67c852618" - integrity sha512-MfrRBDWzIWifgq6tJj60gkAwtLNb6sQPlcFrSOflcP1aFmmruKQ2wRnze/8V6kgyz7H3FF8Npzv78mZ7XLLflg== - dependencies: - prr "~1.0.1" - -es-abstract@^1.17.0-next.1, es-abstract@^1.17.4, es-abstract@^1.17.5: - version "1.17.5" - resolved "https://registry.yarnpkg.com/es-abstract/-/es-abstract-1.17.5.tgz#d8c9d1d66c8981fb9200e2251d799eee92774ae9" - integrity sha512-BR9auzDbySxOcfog0tLECW8l28eRGpDpU3Dm3Hp4q/N+VtLTmyj4EUN088XZWQDW/hzj6sYRDXeOFsaAODKvpg== - dependencies: - es-to-primitive "^1.2.1" - function-bind "^1.1.1" - has "^1.0.3" - has-symbols "^1.0.1" - is-callable "^1.1.5" - is-regex "^1.0.5" - object-inspect "^1.7.0" - object-keys "^1.1.1" - object.assign "^4.1.0" - string.prototype.trimleft "^2.1.1" - string.prototype.trimright "^2.1.1" - -es-get-iterator@^1.1.0: - version "1.1.0" - resolved "https://registry.yarnpkg.com/es-get-iterator/-/es-get-iterator-1.1.0.tgz#bb98ad9d6d63b31aacdc8f89d5d0ee57bcb5b4c8" - integrity sha512-UfrmHuWQlNMTs35e1ypnvikg6jCz3SK8v8ImvmDsh36fCVUR1MqoFDiyn0/k52C8NqO3YsO8Oe0azeesNuqSsQ== - dependencies: - es-abstract "^1.17.4" - has-symbols "^1.0.1" - is-arguments "^1.0.4" - is-map "^2.0.1" - is-set "^2.0.1" - is-string "^1.0.5" - isarray "^2.0.5" - -es-to-primitive@^1.2.1: - version "1.2.1" - resolved "https://registry.yarnpkg.com/es-to-primitive/-/es-to-primitive-1.2.1.tgz#e55cd4c9cdc188bcefb03b366c736323fc5c898a" - integrity sha512-QCOllgZJtaUo9miYBcLChTUaHNjJF3PYs1VidD7AwiEj1kYxKeQTctLAezAOH5ZKRH0g2IgPn6KwB4IT8iRpvA== - dependencies: - is-callable "^1.1.4" - is-date-object "^1.0.1" - is-symbol "^1.0.2" - -escape-string-regexp@1.0.5, escape-string-regexp@^1.0.5: - version "1.0.5" - resolved "https://registry.yarnpkg.com/escape-string-regexp/-/escape-string-regexp-1.0.5.tgz#1b61c0562190a8dff6ae3bb2cf0200ca130b86d4" - integrity sha1-G2HAViGQqN/2rjuyzwIAyhMLhtQ= - -esprima@^4.0.0: - version "4.0.1" - resolved "https://registry.yarnpkg.com/esprima/-/esprima-4.0.1.tgz#13b04cdb3e6c5d19df91ab6987a8695619b0aa71" - integrity sha512-eGuFFw7Upda+g4p+QHvnW0RyTX/SVeJBDM/gCtMARO0cLuT2HcEKnTPvhjV6aGeqrCB/sbNop0Kszm0jsaWU4A== - -exif-parser@^0.1.12: - version "0.1.12" - resolved "https://registry.yarnpkg.com/exif-parser/-/exif-parser-0.1.12.tgz#58a9d2d72c02c1f6f02a0ef4a9166272b7760922" - integrity sha1-WKnS1ywCwfbwKg70qRZicrd2CSI= - -fast-srp-hap@2.0.1: - version "2.0.1" - resolved "https://registry.yarnpkg.com/fast-srp-hap/-/fast-srp-hap-2.0.1.tgz#00cbd4f92cbd031ca6437b64ae81bab6d3aeb4f8" - integrity sha512-dClwnyfRd3BZxu3KAdhvAayozq7fLazXGlDc4HAHJV1M+olqGKAT52pygXQu5UiDSHxz/WB3KRvsojqQ5zmXOA== - -fast-srp-hap@^1.0.1: - version "1.2.0" - resolved "https://registry.yarnpkg.com/fast-srp-hap/-/fast-srp-hap-1.2.0.tgz#99f558c20c171786966ce70d21f3d4004b484928" - integrity sha512-WgC3eJEaQo94pq6Ua+l4zdceMLkDXvhZ4OpyQsFdlTFDH7GwJ6fikr+C/mkKzaIxbnODkqee8cOd0KjuW2ebKQ== - -file-type@^9.0.0: - version "9.0.0" - resolved "https://registry.yarnpkg.com/file-type/-/file-type-9.0.0.tgz#a68d5ad07f486414dfb2c8866f73161946714a18" - integrity sha512-Qe/5NJrgIOlwijpq3B7BEpzPFcgzggOTagZmkXQY4LA6bsXKTUstK7Wp12lEJ/mLKTpvIZxmIuRcLYWT6ov9lw== - -fill-range@^7.0.1: - version "7.0.1" - resolved "https://registry.yarnpkg.com/fill-range/-/fill-range-7.0.1.tgz#1919a6a7c75fe38b2c7c77e5198535da9acdda40" - integrity sha512-qOo9F+dMUmC2Lcb4BbVvnKJxTPjCm+RRpe4gDuGrzkL7mEVl/djYSu2OdQ2Pa302N4oqkSg9ir6jaLWJ2USVpQ== - dependencies: - to-regex-range "^5.0.1" - -find-up@3.0.0, find-up@^3.0.0: - version "3.0.0" - resolved "https://registry.yarnpkg.com/find-up/-/find-up-3.0.0.tgz#49169f1d7993430646da61ecc5ae355c21c97b73" - integrity sha512-1yD6RmLI1XBfxugvORwlck6f75tYL+iR0jqwsOrOxMZyGYqUuDhJ0l4AXdO1iX/FTs9cBAMEk1gWSEx1kSbylg== - dependencies: - locate-path "^3.0.0" - -flat@^4.1.0: - version "4.1.0" - resolved "https://registry.yarnpkg.com/flat/-/flat-4.1.0.tgz#090bec8b05e39cba309747f1d588f04dbaf98db2" - integrity sha512-Px/TiLIznH7gEDlPXcUD4KnBusa6kR6ayRUVcnEAbreRIuhkqow/mun59BuRXwoYk7ZQOLW1ZM05ilIvK38hFw== - dependencies: - is-buffer "~2.0.3" - -foreach@^2.0.5: - version "2.0.5" - resolved "https://registry.yarnpkg.com/foreach/-/foreach-2.0.5.tgz#0bee005018aeb260d0a3af3ae658dd0136ec1b99" - integrity sha1-C+4AUBiusmDQo6865ljdATbsG5k= - -fs.realpath@^1.0.0: - version "1.0.0" - resolved "https://registry.yarnpkg.com/fs.realpath/-/fs.realpath-1.0.0.tgz#1504ad2523158caa40db4a2787cb01411994ea4f" - integrity sha1-FQStJSMVjKpA20onh8sBQRmU6k8= - -fsevents@~2.1.1: - version "2.1.3" - resolved "https://registry.yarnpkg.com/fsevents/-/fsevents-2.1.3.tgz#fb738703ae8d2f9fe900c33836ddebee8b97f23e" - integrity sha512-Auw9a4AxqWpa9GUfj370BMPzzyncfBABW8Mab7BGWBYDj4Isgq+cDKtx0i6u9jcX9pQDnswsaaOTgTmA5pEjuQ== - -function-bind@^1.1.1: - version "1.1.1" - resolved "https://registry.yarnpkg.com/function-bind/-/function-bind-1.1.1.tgz#a56899d3ea3c9bab874bb9773b7c5ede92f4895d" - integrity sha512-yIovAzMX49sF8Yl58fSCWJ5svSLuaibPxXQJFLmBObTuCr0Mf1KiPopGM9NiFjiYBCbfaa2Fh6breQ6ANVTI0A== - -futoin-hkdf@~1.3.2: - version "1.3.2" - resolved "https://registry.yarnpkg.com/futoin-hkdf/-/futoin-hkdf-1.3.2.tgz#cd9a09153e3db7d166b9717f872991a4950430cd" - integrity sha512-3EVi3ETTyJg5PSXlxLCaUVVn0pSbDf62L3Gwxne7Uq+d8adOSNWQAad4gg7WToHkcgnCJb3Wlb1P8r4Evj4GPw== - -get-caller-file@^2.0.1: - version "2.0.5" - resolved "https://registry.yarnpkg.com/get-caller-file/-/get-caller-file-2.0.5.tgz#4f94412a82db32f36e3b0b9741f8a97feb031f7e" - integrity sha512-DyFP3BM/3YHTQOCUL/w0OZHR0lpKeGrxotcHWcqNEdnltqFwXVfhEBQ94eIo34AfQpo0rGki4cyIiftY06h2Fg== - -get-func-name@^2.0.0: - version "2.0.0" - resolved "https://registry.yarnpkg.com/get-func-name/-/get-func-name-2.0.0.tgz#ead774abee72e20409433a066366023dd6887a41" - integrity sha1-6td0q+5y4gQJQzoGY2YCPdaIekE= - -glob-parent@~5.1.0: - version "5.1.1" - resolved "https://registry.yarnpkg.com/glob-parent/-/glob-parent-5.1.1.tgz#b6c1ef417c4e5663ea498f1c45afac6916bbc229" - integrity sha512-FnI+VGOpnlGHWZxthPGR+QhR78fuiK0sNLkHQv+bL9fQi57lNNdquIbna/WrfROrolq8GK5Ek6BiMwqL/voRYQ== - dependencies: - is-glob "^4.0.1" - -glob@7.1.2: - version "7.1.2" - resolved "https://registry.yarnpkg.com/glob/-/glob-7.1.2.tgz#c19c9df9a028702d678612384a6552404c636d15" - integrity sha512-MJTUg1kjuLeQCJ+ccE4Vpa6kKVXkPYJ2mOCQyUuKLcLQsdrMCpBPUi8qVE6+YuaJkozeA9NusTAw3hLr8Xe5EQ== - dependencies: - fs.realpath "^1.0.0" - inflight "^1.0.4" - inherits "2" - minimatch "^3.0.4" - once "^1.3.0" - path-is-absolute "^1.0.0" - -glob@7.1.3: - version "7.1.3" - resolved "https://registry.yarnpkg.com/glob/-/glob-7.1.3.tgz#3960832d3f1574108342dafd3a67b332c0969df1" - integrity sha512-vcfuiIxogLV4DlGBHIUOwI0IbrJ8HWPc4MU7HzviGeNho/UJDfi6B5p3sHeWIQ0KGIU0Jpxi5ZHxemQfLkkAwQ== - dependencies: - fs.realpath "^1.0.0" - inflight "^1.0.4" - inherits "2" - minimatch "^3.0.4" - once "^1.3.0" - path-is-absolute "^1.0.0" - -glob@^7.1.1: - version "7.1.6" - resolved "https://registry.yarnpkg.com/glob/-/glob-7.1.6.tgz#141f33b81a7c2492e125594307480c46679278a6" - integrity sha512-LwaxwyZ72Lk7vZINtNNrywX0ZuLyStrdDtabefZKAY5ZGJhVtgdznluResxNmPitE0SAO+O26sWTHeKSI2wMBA== - dependencies: - fs.realpath "^1.0.0" - inflight "^1.0.4" - inherits "2" - minimatch "^3.0.4" - once "^1.3.0" - path-is-absolute "^1.0.0" - -global@~4.3.0: - version "4.3.2" - resolved "https://registry.yarnpkg.com/global/-/global-4.3.2.tgz#e76989268a6c74c38908b1305b10fc0e394e9d0f" - integrity sha1-52mJJopsdMOJCLEwWxD8DjlOnQ8= - dependencies: - min-document "^2.19.0" - process "~0.5.1" - -graceful-fs@^4.1.2: - version "4.2.4" - resolved "https://registry.yarnpkg.com/graceful-fs/-/graceful-fs-4.2.4.tgz#2256bde14d3632958c465ebc96dc467ca07a29fb" - integrity sha512-WjKPNJF79dtJAVniUlGGWHYGz2jWxT6VhN/4m1NdkbZ2nOsEF+cI1Edgql5zCRhs/VsQYRvrXctxktVXZUkixw== - -growl@1.10.5: - version "1.10.5" - resolved "https://registry.yarnpkg.com/growl/-/growl-1.10.5.tgz#f2735dc2283674fa67478b10181059355c369e5e" - integrity sha512-qBr4OuELkhPenW6goKVXiv47US3clb3/IbuWF9KNKEijAy9oeHxU9IgzjvJhHkUzhaj7rOUD7+YGWqUjLp5oSA== - -hap-nodejs@^0.4.47: - version "0.4.53" - resolved "https://registry.yarnpkg.com/hap-nodejs/-/hap-nodejs-0.4.53.tgz#86e263a54b7f90f6c6246b8d96870eff40eaa5a9" - integrity sha512-6i7m/sugXm/6jP9fLaGUbOtmvxvzcYCfyZFK9dv6kLeavCJparlIn50g+6hc6ljxq0d7Q1mH+pawCPUEq4ZC8Q== - dependencies: - bonjour-hap "^3.5.1" - buffer-shims "^1.0.0" - debug "^2.2.0" - decimal.js "^7.2.3" - fast-srp-hap "^1.0.1" - ip "^1.1.3" - node-persist "^0.0.11" - tweetnacl "^1.0.1" - -hap-nodejs@^0.7.3: - version "0.7.3" - resolved "https://registry.yarnpkg.com/hap-nodejs/-/hap-nodejs-0.7.3.tgz#aef573b743f3ac0c8bc36254ddf23ddda95fe947" - integrity sha512-kCPwdRizCPJk43eTSMtW2LtCh+it8rTYW7aGkhW8qFKPS4z5JQilpggvVJvdfmSy5l+L5F0/UyKwkeM/KsdrHA== - dependencies: - bonjour-hap "~3.5.8" - debug "^4.1.1" - decimal.js "^10.2.0" - fast-srp-hap "2.0.1" - futoin-hkdf "~1.3.2" - ip "^1.1.3" - node-persist "^0.0.11" - tweetnacl "^1.0.3" - -has-flag@^3.0.0: - version "3.0.0" - resolved "https://registry.yarnpkg.com/has-flag/-/has-flag-3.0.0.tgz#b5d454dc2199ae225699f3467e5a07f3b955bafd" - integrity sha1-tdRU3CGZriJWmfNGfloH87lVuv0= - -has-flag@^4.0.0: - version "4.0.0" - resolved "https://registry.yarnpkg.com/has-flag/-/has-flag-4.0.0.tgz#944771fd9c81c81265c4d6941860da06bb59479b" - integrity sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ== - -has-symbols@^1.0.0, has-symbols@^1.0.1: - version "1.0.1" - resolved "https://registry.yarnpkg.com/has-symbols/-/has-symbols-1.0.1.tgz#9f5214758a44196c406d9bd76cebf81ec2dd31e8" - integrity sha512-PLcsoqu++dmEIZB+6totNFKq/7Do+Z0u4oT0zKOJNl3lYK6vGwwu2hjHs+68OEZbTjiUE9bgOABXbP/GvrS0Kg== - -has@^1.0.3: - version "1.0.3" - resolved "https://registry.yarnpkg.com/has/-/has-1.0.3.tgz#722d7cbfc1f6aa8241f16dd814e011e1f41e8796" - integrity sha512-f2dvO0VU6Oej7RkWJGrehjbzMAjFp5/VKPp5tTpWIV4JHHZK1/BxbFRtf/siA2SWTe09caDmVtYYzWEIbBS4zw== - dependencies: - function-bind "^1.1.1" - -he@1.1.1: - version "1.1.1" - resolved "https://registry.yarnpkg.com/he/-/he-1.1.1.tgz#93410fd21b009735151f8868c2f271f3427e23fd" - integrity sha1-k0EP0hsAlzUVH4howvJx80J+I/0= - -he@1.2.0: - version "1.2.0" - resolved "https://registry.yarnpkg.com/he/-/he-1.2.0.tgz#84ae65fa7eafb165fddb61566ae14baf05664f0f" - integrity sha512-F/1DnUGPopORZi0ni+CvrCgHQ5FyEAHRLSApuYWMmrbSwoN2Mn/7k+Gl38gJnR7yyDZk6WLXwiGod1JOWNDKGw== - -homebridge@>=0.4.42: - version "1.1.0" - resolved "https://registry.yarnpkg.com/homebridge/-/homebridge-1.1.0.tgz#f3e96657d482baaa978e80e886dbc9e52c0c9a75" - integrity sha512-OMs+1A2G6lkMOrAk0o1nmj8S3XkhwrInVwRDiyLB3aHRQS02KQ/Egv1stV9vDhjib86v3y3MLHIYYzbxKHLjPA== - dependencies: - chalk "^3.0.0" - commander "5.0.0" - hap-nodejs "^0.7.3" - node-persist "^0.0.11" - qrcode-terminal "^0.12.0" - semver "^7.3.2" - source-map-support "^0.5.19" - -ieee754@^1.1.4: - version "1.1.13" - resolved "https://registry.yarnpkg.com/ieee754/-/ieee754-1.1.13.tgz#ec168558e95aa181fd87d37f55c32bbcb6708b84" - integrity sha512-4vf7I2LYV/HaWerSo3XmlMkp5eZ83i+/CDluXi/IGTs/O1sejBNhTtnxzmRZfvOUqj7lZjqHkeTvpgSFDlWZTg== - -inflight@^1.0.4: - version "1.0.6" - resolved "https://registry.yarnpkg.com/inflight/-/inflight-1.0.6.tgz#49bd6331d7d02d0c09bc910a1075ba8165b56df9" - integrity sha1-Sb1jMdfQLQwJvJEKEHW6gWW1bfk= - dependencies: - once "^1.3.0" - wrappy "1" - -inherits@2, inherits@~2.0.3: - version "2.0.4" - resolved "https://registry.yarnpkg.com/inherits/-/inherits-2.0.4.tgz#0fa2c64f932917c3433a0ded55363aae37416b7c" - integrity sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ== - -ip@^1.1.3, ip@^1.1.5: - version "1.1.5" - resolved "https://registry.yarnpkg.com/ip/-/ip-1.1.5.tgz#bdded70114290828c0a039e72ef25f5aaec4354a" - integrity sha1-vd7XARQpCCjAoDnnLvJfWq7ENUo= - -is-arguments@^1.0.4: - version "1.0.4" - resolved "https://registry.yarnpkg.com/is-arguments/-/is-arguments-1.0.4.tgz#3faf966c7cba0ff437fb31f6250082fcf0448cf3" - integrity sha512-xPh0Rmt8NE65sNzvyUmWgI1tz3mKq74lGA0mL8LYZcoIzKOzDh6HmrYm3d18k60nHerC8A9Km8kYu87zfSFnLA== - -is-bigint@^1.0.0: - version "1.0.0" - resolved "https://registry.yarnpkg.com/is-bigint/-/is-bigint-1.0.0.tgz#73da8c33208d00f130e9b5e15d23eac9215601c4" - integrity sha512-t5mGUXC/xRheCK431ylNiSkGGpBp8bHENBcENTkDT6ppwPzEVxNGZRvgvmOEfbWkFhA7D2GEuE2mmQTr78sl2g== - -is-binary-path@~2.1.0: - version "2.1.0" - resolved "https://registry.yarnpkg.com/is-binary-path/-/is-binary-path-2.1.0.tgz#ea1f7f3b80f064236e83470f86c09c254fb45b09" - integrity sha512-ZMERYes6pDydyuGidse7OsHxtbI7WVeUEozgR/g7rd0xUimYNlvZRE/K2MgZTjWy725IfelLeVcEM97mmtRGXw== - dependencies: - binary-extensions "^2.0.0" - -is-boolean-object@^1.0.0: - version "1.0.1" - resolved "https://registry.yarnpkg.com/is-boolean-object/-/is-boolean-object-1.0.1.tgz#10edc0900dd127697a92f6f9807c7617d68ac48e" - integrity sha512-TqZuVwa/sppcrhUCAYkGBk7w0yxfQQnxq28fjkO53tnK9FQXmdwz2JS5+GjsWQ6RByES1K40nI+yDic5c9/aAQ== - -is-buffer@~2.0.3: - version "2.0.4" - resolved "https://registry.yarnpkg.com/is-buffer/-/is-buffer-2.0.4.tgz#3e572f23c8411a5cfd9557c849e3665e0b290623" - integrity sha512-Kq1rokWXOPXWuaMAqZiJW4XxsmD9zGx9q4aePabbn3qCRGedtH7Cm+zV8WETitMfu1wdh+Rvd6w5egwSngUX2A== - -is-callable@^1.1.4, is-callable@^1.1.5: - version "1.1.5" - resolved "https://registry.yarnpkg.com/is-callable/-/is-callable-1.1.5.tgz#f7e46b596890456db74e7f6e976cb3273d06faab" - integrity sha512-ESKv5sMCJB2jnHTWZ3O5itG+O128Hsus4K4Qh1h2/cgn2vbgnLSVqfV46AeJA9D5EeeLa9w81KUXMtn34zhX+Q== - -is-date-object@^1.0.1, is-date-object@^1.0.2: - version "1.0.2" - resolved "https://registry.yarnpkg.com/is-date-object/-/is-date-object-1.0.2.tgz#bda736f2cd8fd06d32844e7743bfa7494c3bfd7e" - integrity sha512-USlDT524woQ08aoZFzh3/Z6ch9Y/EWXEHQ/AaRN0SkKq4t2Jw2R2339tSXmwuVoY7LLlBCbOIlx2myP/L5zk0g== - -is-extglob@^2.1.1: - version "2.1.1" - resolved "https://registry.yarnpkg.com/is-extglob/-/is-extglob-2.1.1.tgz#a88c02535791f02ed37c76a1b9ea9773c833f8c2" - integrity sha1-qIwCU1eR8C7TfHahueqXc8gz+MI= - -is-fullwidth-code-point@^2.0.0: - version "2.0.0" - resolved "https://registry.yarnpkg.com/is-fullwidth-code-point/-/is-fullwidth-code-point-2.0.0.tgz#a3b30a5c4f199183167aaab93beefae3ddfb654f" - integrity sha1-o7MKXE8ZkYMWeqq5O+764937ZU8= - -is-function@^1.0.1: - version "1.0.2" - resolved "https://registry.yarnpkg.com/is-function/-/is-function-1.0.2.tgz#4f097f30abf6efadac9833b17ca5dc03f8144e08" - integrity sha512-lw7DUp0aWXYg+CBCN+JKkcE0Q2RayZnSvnZBlwgxHBQhqt5pZNVy4Ri7H9GmmXkdu7LUthszM+Tor1u/2iBcpQ== - -is-glob@^4.0.1, is-glob@~4.0.1: - version "4.0.1" - resolved "https://registry.yarnpkg.com/is-glob/-/is-glob-4.0.1.tgz#7567dbe9f2f5e2467bc77ab83c4a29482407a5dc" - integrity sha512-5G0tKtBTFImOqDnLB2hG6Bp2qcKEFduo4tZu9MT/H6NQv/ghhy30o55ufafxJ/LdH79LLs2Kfrn85TLKyA7BUg== - dependencies: - is-extglob "^2.1.1" - -is-map@^2.0.1: - version "2.0.1" - resolved "https://registry.yarnpkg.com/is-map/-/is-map-2.0.1.tgz#520dafc4307bb8ebc33b813de5ce7c9400d644a1" - integrity sha512-T/S49scO8plUiAOA2DBTBG3JHpn1yiw0kRp6dgiZ0v2/6twi5eiB0rHtHFH9ZIrvlWc6+4O+m4zg5+Z833aXgw== - -is-number-object@^1.0.3: - version "1.0.4" - resolved "https://registry.yarnpkg.com/is-number-object/-/is-number-object-1.0.4.tgz#36ac95e741cf18b283fc1ddf5e83da798e3ec197" - integrity sha512-zohwelOAur+5uXtk8O3GPQ1eAcu4ZX3UwxQhUlfFFMNpUd83gXgjbhJh6HmB6LUNV/ieOLQuDwJO3dWJosUeMw== - -is-number@^7.0.0: - version "7.0.0" - resolved "https://registry.yarnpkg.com/is-number/-/is-number-7.0.0.tgz#7535345b896734d5f80c4d06c50955527a14f12b" - integrity sha512-41Cifkg6e8TylSpdtTpeLVMqvSBEVzTttHvERD741+pnZ8ANv0004MRL43QKPDlK9cGvNp6NZWZUBlbGXYxxng== - -is-regex@^1.0.5: - version "1.0.5" - resolved "https://registry.yarnpkg.com/is-regex/-/is-regex-1.0.5.tgz#39d589a358bf18967f726967120b8fc1aed74eae" - integrity sha512-vlKW17SNq44owv5AQR3Cq0bQPEb8+kF3UKZ2fiZNOWtztYE5i0CzCZxFDwO58qAOWtxdBRVO/V5Qin1wjCqFYQ== - dependencies: - has "^1.0.3" - -is-set@^2.0.1: - version "2.0.1" - resolved "https://registry.yarnpkg.com/is-set/-/is-set-2.0.1.tgz#d1604afdab1724986d30091575f54945da7e5f43" - integrity sha512-eJEzOtVyenDs1TMzSQ3kU3K+E0GUS9sno+F0OBT97xsgcJsF9nXMBtkT9/kut5JEpM7oL7X/0qxR17K3mcwIAA== - -is-string@^1.0.4, is-string@^1.0.5: - version "1.0.5" - resolved "https://registry.yarnpkg.com/is-string/-/is-string-1.0.5.tgz#40493ed198ef3ff477b8c7f92f644ec82a5cd3a6" - integrity sha512-buY6VNRjhQMiF1qWDouloZlQbRhDPCebwxSjxMjxgemYT46YMd2NR0/H+fBhEfWX4A/w9TBJ+ol+okqJKFE6vQ== - -is-symbol@^1.0.2: - version "1.0.3" - resolved "https://registry.yarnpkg.com/is-symbol/-/is-symbol-1.0.3.tgz#38e1014b9e6329be0de9d24a414fd7441ec61937" - integrity sha512-OwijhaRSgqvhm/0ZdAcXNZt9lYdKFpcRDT5ULUuYXPoT794UNOdU+gpT6Rzo7b4V2HUl/op6GqY894AZwv9faQ== - dependencies: - has-symbols "^1.0.1" - -is-typed-array@^1.1.3: - version "1.1.3" - resolved "https://registry.yarnpkg.com/is-typed-array/-/is-typed-array-1.1.3.tgz#a4ff5a5e672e1a55f99c7f54e59597af5c1df04d" - integrity sha512-BSYUBOK/HJibQ30wWkWold5txYwMUXQct9YHAQJr8fSwvZoiglcqB0pd7vEN23+Tsi9IUEjztdOSzl4qLVYGTQ== - dependencies: - available-typed-arrays "^1.0.0" - es-abstract "^1.17.4" - foreach "^2.0.5" - has-symbols "^1.0.1" - -is-weakmap@^2.0.1: - version "2.0.1" - resolved "https://registry.yarnpkg.com/is-weakmap/-/is-weakmap-2.0.1.tgz#5008b59bdc43b698201d18f62b37b2ca243e8cf2" - integrity sha512-NSBR4kH5oVj1Uwvv970ruUkCV7O1mzgVFO4/rev2cLRda9Tm9HrL70ZPut4rOHgY0FNrUu9BCbXA2sdQ+x0chA== - -is-weakset@^2.0.1: - version "2.0.1" - resolved "https://registry.yarnpkg.com/is-weakset/-/is-weakset-2.0.1.tgz#e9a0af88dbd751589f5e50d80f4c98b780884f83" - integrity sha512-pi4vhbhVHGLxohUw7PhGsueT4vRGFoXhP7+RGN0jKIv9+8PWYCQTqtADngrxOm2g46hoH0+g8uZZBzMrvVGDmw== - -isarray@^2.0.5: - version "2.0.5" - resolved "https://registry.yarnpkg.com/isarray/-/isarray-2.0.5.tgz#8af1e4c1221244cc62459faf38940d4e644a5723" - integrity sha512-xHjhDr3cNBK0BzdUJSPXZntQUx/mwMS5Rw4A7lPJ90XGAO6ISP/ePDNuo0vhqOZU+UD5JoodwCAAoZQd3FeAKw== - -isarray@~1.0.0: - version "1.0.0" - resolved "https://registry.yarnpkg.com/isarray/-/isarray-1.0.0.tgz#bb935d48582cba168c06834957a54a3e07124f11" - integrity sha1-u5NdSFgsuhaMBoNJV6VKPgcSTxE= - -isexe@^2.0.0: - version "2.0.0" - resolved "https://registry.yarnpkg.com/isexe/-/isexe-2.0.0.tgz#e8fbf374dc556ff8947a10dcb0572d633f2cfa10" - integrity sha1-6PvzdNxVb/iUehDcsFctYz8s+hA= - -jimp@^0.5.6: - version "0.5.6" - resolved "https://registry.yarnpkg.com/jimp/-/jimp-0.5.6.tgz#dd114decd060927ae439f2e0980df619c179f912" - integrity sha512-H0nHTu6KgAgQzDxa38ew2dXbnRzKm1w5uEyhMIxqwCQVjwgarOjjkV/avbNLxfxRHAFaNp4rGIc/qm8P+uhX9A== - dependencies: - "@babel/polyfill" "^7.0.0" - "@jimp/custom" "^0.5.4" - "@jimp/plugins" "^0.5.5" - "@jimp/types" "^0.5.4" - core-js "^2.5.7" - -jpeg-js@^0.3.4: - version "0.3.7" - resolved "https://registry.yarnpkg.com/jpeg-js/-/jpeg-js-0.3.7.tgz#471a89d06011640592d314158608690172b1028d" - integrity sha512-9IXdWudL61npZjvLuVe/ktHiA41iE8qFyLB+4VDTblEsWBzeg8WQTlktdUK4CdncUqtUgUg0bbOmTE2bKBKaBQ== - -js-tokens@^4.0.0: - version "4.0.0" - resolved "https://registry.yarnpkg.com/js-tokens/-/js-tokens-4.0.0.tgz#19203fb59991df98e3a287050d4647cdeaf32499" - integrity sha512-RdJUflcE3cUzKiMqQgsCu06FPu9UdIJO0beYbPhHN4k6apgJtifcoCtT9bcxOpYBtpD2kCM6Sbzg4CausW/PKQ== - -js-yaml@3.13.1, js-yaml@^3.13.1: - version "3.13.1" - resolved "https://registry.yarnpkg.com/js-yaml/-/js-yaml-3.13.1.tgz#aff151b30bfdfa8e49e05da22e7415e9dfa37847" - integrity sha512-YfbcO7jXDdyj0DGxYVSlSeQNHbD7XPWvrVWeVUujrQEoZzWJIRrCPoyk6kL6IAjAG2IolMK4T0hNUe0HOUs5Jw== - dependencies: - argparse "^1.0.7" - esprima "^4.0.0" - -load-bmfont@^1.3.1, load-bmfont@^1.4.0: - version "1.4.0" - resolved "https://registry.yarnpkg.com/load-bmfont/-/load-bmfont-1.4.0.tgz#75f17070b14a8c785fe7f5bee2e6fd4f98093b6b" - integrity sha512-kT63aTAlNhZARowaNYcY29Fn/QYkc52M3l6V1ifRcPewg2lvUZDAj7R6dXjOL9D0sict76op3T5+odumDSF81g== - dependencies: - buffer-equal "0.0.1" - mime "^1.3.4" - parse-bmfont-ascii "^1.0.3" - parse-bmfont-binary "^1.0.5" - parse-bmfont-xml "^1.1.4" - phin "^2.9.1" - xhr "^2.0.1" - xtend "^4.0.0" - -locate-path@^3.0.0: - version "3.0.0" - resolved "https://registry.yarnpkg.com/locate-path/-/locate-path-3.0.0.tgz#dbec3b3ab759758071b58fe59fc41871af21400e" - integrity sha512-7AO748wWnIhNqAuaty2ZWHkQHRSNfPVIsPIfwEOWO22AmaoVrWavlOcMR5nzTLNYvp36X220/maaRsrec1G65A== - dependencies: - p-locate "^3.0.0" - path-exists "^3.0.0" - -lodash@^4.17.15: - version "4.17.15" - resolved "https://registry.yarnpkg.com/lodash/-/lodash-4.17.15.tgz#b447f6670a0455bbfeedd11392eff330ea097548" - integrity sha512-8xOcRHvCjnocdS5cpwXQXVzmmh5e5+saE2QGoeQmbKmRS6J3VQppPOIt0MnmE+4xlZoumy0GPG0D0MVIQbNA1A== - -log-symbols@3.0.0: - version "3.0.0" - resolved "https://registry.yarnpkg.com/log-symbols/-/log-symbols-3.0.0.tgz#f3a08516a5dea893336a7dee14d18a1cfdab77c4" - integrity sha512-dSkNGuI7iG3mfvDzUuYZyvk5dD9ocYCYzNU6CYDE6+Xqd+gwme6Z00NS3dUh8mq/73HaEtT7m6W+yUPtU6BZnQ== - dependencies: - chalk "^2.4.2" - -make-error@^1.1.1: - version "1.3.6" - resolved "https://registry.yarnpkg.com/make-error/-/make-error-1.3.6.tgz#2eb2e37ea9b67c4891f684a1394799af484cf7a2" - integrity sha512-s8UhlNe7vPKomQhC1qFelMokr/Sc3AgNbso3n74mVPA5LTZwkB9NlXf4XPamLxJE8h0gh73rM94xvwRT2CVInw== - -memory-fs@^0.3.0: - version "0.3.0" - resolved "https://registry.yarnpkg.com/memory-fs/-/memory-fs-0.3.0.tgz#7bcc6b629e3a43e871d7e29aca6ae8a7f15cbb20" - integrity sha1-e8xrYp46Q+hx1+Kaymrop/FcuyA= - dependencies: - errno "^0.1.3" - readable-stream "^2.0.1" - -mime@^1.3.4: - version "1.6.0" - resolved "https://registry.yarnpkg.com/mime/-/mime-1.6.0.tgz#32cd9e5c64553bd58d19a568af452acff04981b1" - integrity sha512-x0Vn8spI+wuJ1O6S7gnbaQg8Pxh4NNHb7KSINmEWKiPE4RKOplvijn+NkmYmmRgP68mc70j2EbeTFRsrswaQeg== - -min-document@^2.19.0: - version "2.19.0" - resolved "https://registry.yarnpkg.com/min-document/-/min-document-2.19.0.tgz#7bd282e3f5842ed295bb748cdd9f1ffa2c824685" - integrity sha1-e9KC4/WELtKVu3SM3Z8f+iyCRoU= - dependencies: - dom-walk "^0.1.0" - -minimatch@3.0.4, minimatch@^3.0.3, minimatch@^3.0.4: - version "3.0.4" - resolved "https://registry.yarnpkg.com/minimatch/-/minimatch-3.0.4.tgz#5166e286457f03306064be5497e8dbb0c3d32083" - integrity sha512-yJHVQEhyqPLUTgt9B83PXu6W3rx4MvvHvSUvToogpwoGDOUQ+yDrR0HRot+yOCdCO7u4hX3pWft6kWBBcqh0UA== - dependencies: - brace-expansion "^1.1.7" - -minimist@0.0.8: - version "0.0.8" - resolved "https://registry.yarnpkg.com/minimist/-/minimist-0.0.8.tgz#857fcabfc3397d2625b8228262e86aa7a011b05d" - integrity sha1-hX/Kv8M5fSYluCKCYuhqp6ARsF0= - -minimist@^1.2.0, minimist@^1.2.5: - version "1.2.5" - resolved "https://registry.yarnpkg.com/minimist/-/minimist-1.2.5.tgz#67d66014b66a6a8aaa0c083c5fd58df4e4e97602" - integrity sha512-FM9nNUYrRBAELZQT3xeZQ7fmMOBg6nWNmJKTcgsJeaLstP/UODVpGsr5OhXhhXg6f+qtJ8uiZ+PUxkDWcgIXLw== - -mkdirp@0.5.1: - version "0.5.1" - resolved "https://registry.yarnpkg.com/mkdirp/-/mkdirp-0.5.1.tgz#30057438eac6cf7f8c4767f38648d6697d75c903" - integrity sha1-MAV0OOrGz3+MR2fzhkjWaX11yQM= - dependencies: - minimist "0.0.8" - -mkdirp@0.5.5, mkdirp@^0.5.1, mkdirp@~0.5.1: - version "0.5.5" - resolved "https://registry.yarnpkg.com/mkdirp/-/mkdirp-0.5.5.tgz#d91cefd62d1436ca0f41620e251288d420099def" - integrity sha512-NKmAlESf6jMGym1++R0Ra7wvhV+wFW63FaSOFPwRahvea0gMUcGUhVeAg/0BC0wiv9ih5NYPB1Wn1UEI1/L+xQ== - dependencies: - minimist "^1.2.5" - -mocha-logger@^1.0.6: - version "1.0.6" - resolved "https://registry.yarnpkg.com/mocha-logger/-/mocha-logger-1.0.6.tgz#512217f3b4cd8be036154e655118c5160784154a" - integrity sha512-D7Z3r1RkyaJOnlgokODdzt9p4ut0m3DVzEKp3r3tgeXIpdxp54z049Vc0EEh5hkhudfRN0dfUD10Fcj2WuOO3w== - dependencies: - mocha "^5.1.1" - -mocha@^5.1.1: - version "5.2.0" - resolved "https://registry.yarnpkg.com/mocha/-/mocha-5.2.0.tgz#6d8ae508f59167f940f2b5b3c4a612ae50c90ae6" - integrity sha512-2IUgKDhc3J7Uug+FxMXuqIyYzH7gJjXECKe/w43IGgQHTSj3InJi+yAA7T24L9bQMRKiUEHxEX37G5JpVUGLcQ== - dependencies: - browser-stdout "1.3.1" - commander "2.15.1" - debug "3.1.0" - diff "3.5.0" - escape-string-regexp "1.0.5" - glob "7.1.2" - growl "1.10.5" - he "1.1.1" - minimatch "3.0.4" - mkdirp "0.5.1" - supports-color "5.4.0" - -mocha@^7.1.2: - version "7.1.2" - resolved "https://registry.yarnpkg.com/mocha/-/mocha-7.1.2.tgz#8e40d198acf91a52ace122cd7599c9ab857b29e6" - integrity sha512-o96kdRKMKI3E8U0bjnfqW4QMk12MwZ4mhdBTf+B5a1q9+aq2HRnj+3ZdJu0B/ZhJeK78MgYuv6L8d/rA5AeBJA== - dependencies: - ansi-colors "3.2.3" - browser-stdout "1.3.1" - chokidar "3.3.0" - debug "3.2.6" - diff "3.5.0" - escape-string-regexp "1.0.5" - find-up "3.0.0" - glob "7.1.3" - growl "1.10.5" - he "1.2.0" - js-yaml "3.13.1" - log-symbols "3.0.0" - minimatch "3.0.4" - mkdirp "0.5.5" - ms "2.1.1" - node-environment-flags "1.0.6" - object.assign "4.1.0" - strip-json-comments "2.0.1" - supports-color "6.0.0" - which "1.3.1" - wide-align "1.1.3" - yargs "13.3.2" - yargs-parser "13.1.2" - yargs-unparser "1.6.0" - -ms@2.0.0: - version "2.0.0" - resolved "https://registry.yarnpkg.com/ms/-/ms-2.0.0.tgz#5608aeadfc00be6c2901df5f9861788de0d597c8" - integrity sha1-VgiurfwAvmwpAd9fmGF4jeDVl8g= - -ms@2.1.1: - version "2.1.1" - resolved "https://registry.yarnpkg.com/ms/-/ms-2.1.1.tgz#30a5864eb3ebb0a66f2ebe6d727af06a09d86e0a" - integrity sha512-tgp+dl5cGk28utYktBsrFqA7HKgrhgPsg6Z/EfhWI4gl1Hwq8B/GmY/0oXZ6nF8hDVesS/FpnYaD/kOWhYQvyg== - -ms@^2.1.1: - version "2.1.2" - resolved "https://registry.yarnpkg.com/ms/-/ms-2.1.2.tgz#d09d1f357b443f493382a8eb3ccd183872ae6009" - integrity sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w== - -multicast-dns-service-types@^1.1.0: - version "1.1.0" - resolved "https://registry.yarnpkg.com/multicast-dns-service-types/-/multicast-dns-service-types-1.1.0.tgz#899f11d9686e5e05cb91b35d5f0e63b773cfc901" - integrity sha1-iZ8R2WhuXgXLkbNdXw5jt3PPyQE= - -multicast-dns@^7.2.2: - version "7.2.2" - resolved "https://registry.yarnpkg.com/multicast-dns/-/multicast-dns-7.2.2.tgz#5731da04f47d1e435ac457e5ac7b4b39d866a5a1" - integrity sha512-XqSMeO8EWV/nOXOpPV8ztIpNweVfE1dSpz6SQvDPp71HD74lMXjt4m/mWB1YBMG0kHtOodxRWc5WOb/UNN1A5g== - dependencies: - dns-packet "^4.0.0" - thunky "^1.0.2" - -node-environment-flags@1.0.6: - version "1.0.6" - resolved "https://registry.yarnpkg.com/node-environment-flags/-/node-environment-flags-1.0.6.tgz#a30ac13621f6f7d674260a54dede048c3982c088" - integrity sha512-5Evy2epuL+6TM0lCQGpFIj6KwiEsGh1SrHUhTbNX+sLbBtjidPZFAnVK9y5yU1+h//RitLbRHTIMyxQPtxMdHw== - dependencies: - object.getownpropertydescriptors "^2.0.3" - semver "^5.7.0" - -node-persist@^0.0.11: - version "0.0.11" - resolved "https://registry.yarnpkg.com/node-persist/-/node-persist-0.0.11.tgz#d66eba3ebef620f079530fa7b13076a906665874" - integrity sha1-1m66Pr72IPB5Uw+nsTB2qQZmWHQ= - dependencies: - mkdirp "~0.5.1" - q "~1.1.1" - -normalize-path@^3.0.0, normalize-path@~3.0.0: - version "3.0.0" - resolved "https://registry.yarnpkg.com/normalize-path/-/normalize-path-3.0.0.tgz#0dcd69ff23a1c9b11fd0978316644a0388216a65" - integrity sha512-6eZs5Ls3WtCisHWp9S2GUy8dqkpGi4BVSz3GaqiE6ezub0512ESztXUwUB6C6IKbQkY2Pnb/mD4WYojCRwcwLA== - -object-assign@^4.0.1: - version "4.1.1" - resolved "https://registry.yarnpkg.com/object-assign/-/object-assign-4.1.1.tgz#2109adc7965887cfc05cbbd442cac8bfbb360863" - integrity sha1-IQmtx5ZYh8/AXLvUQsrIv7s2CGM= - -object-inspect@^1.7.0: - version "1.7.0" - resolved "https://registry.yarnpkg.com/object-inspect/-/object-inspect-1.7.0.tgz#f4f6bd181ad77f006b5ece60bd0b6f398ff74a67" - integrity sha512-a7pEHdh1xKIAgTySUGgLMx/xwDZskN1Ud6egYYN3EdRW4ZMPNEDUTF+hwy2LUC+Bl+SyLXANnwz/jyh/qutKUw== - -object-is@^1.1.2: - version "1.1.2" - resolved "https://registry.yarnpkg.com/object-is/-/object-is-1.1.2.tgz#c5d2e87ff9e119f78b7a088441519e2eec1573b6" - integrity sha512-5lHCz+0uufF6wZ7CRFWJN3hp8Jqblpgve06U5CMQ3f//6iDjPr2PEo9MWCjEssDsa+UZEL4PkFpr+BMop6aKzQ== - dependencies: - define-properties "^1.1.3" - es-abstract "^1.17.5" - -object-keys@^1.0.11, object-keys@^1.0.12, object-keys@^1.1.1: - version "1.1.1" - resolved "https://registry.yarnpkg.com/object-keys/-/object-keys-1.1.1.tgz#1c47f272df277f3b1daf061677d9c82e2322c60e" - integrity sha512-NuAESUOUMrlIXOfHKzD6bpPu3tYt3xvjNdRIQ+FeT0lNb4K8WR70CaDxhuNguS2XG+GjkyMwOzsN5ZktImfhLA== - -object.assign@4.1.0, object.assign@^4.1.0: - version "4.1.0" - resolved "https://registry.yarnpkg.com/object.assign/-/object.assign-4.1.0.tgz#968bf1100d7956bb3ca086f006f846b3bc4008da" - integrity sha512-exHJeq6kBKj58mqGyTQ9DFvrZC/eR6OwxzoM9YRoGBqrXYonaFyGiFMuc9VZrXf7DarreEwMpurG3dd+CNyW5w== - dependencies: - define-properties "^1.1.2" - function-bind "^1.1.1" - has-symbols "^1.0.0" - object-keys "^1.0.11" - -object.getownpropertydescriptors@^2.0.3: - version "2.1.0" - resolved "https://registry.yarnpkg.com/object.getownpropertydescriptors/-/object.getownpropertydescriptors-2.1.0.tgz#369bf1f9592d8ab89d712dced5cb81c7c5352649" - integrity sha512-Z53Oah9A3TdLoblT7VKJaTDdXdT+lQO+cNpKVnya5JDe9uLvzu1YyY1yFDFrcxrlRgWrEFH0jJtD/IbuwjcEVg== - dependencies: - define-properties "^1.1.3" - es-abstract "^1.17.0-next.1" - -omggif@^1.0.9: - version "1.0.10" - resolved "https://registry.yarnpkg.com/omggif/-/omggif-1.0.10.tgz#ddaaf90d4a42f532e9e7cb3a95ecdd47f17c7b19" - integrity sha512-LMJTtvgc/nugXj0Vcrrs68Mn2D1r0zf630VNtqtpI1FEO7e+O9FP4gqs9AcnBaSEeoHIPm28u6qgPR0oyEpGSw== - -once@^1.3.0: - version "1.4.0" - resolved "https://registry.yarnpkg.com/once/-/once-1.4.0.tgz#583b1aa775961d4b113ac17d9c50baef9dd76bd1" - integrity sha1-WDsap3WWHUsROsF9nFC6753Xa9E= - dependencies: - wrappy "1" - -optional@^0.1.4: - version "0.1.4" - resolved "https://registry.yarnpkg.com/optional/-/optional-0.1.4.tgz#cdb1a9bedc737d2025f690ceeb50e049444fd5b3" - integrity sha512-gtvrrCfkE08wKcgXaVwQVgwEQ8vel2dc5DDBn9RLQZ3YtmtkBss6A2HY6BnJH4N/4Ku97Ri/SF8sNWE2225WJw== - -p-limit@^2.0.0: - version "2.3.0" - resolved "https://registry.yarnpkg.com/p-limit/-/p-limit-2.3.0.tgz#3dd33c647a214fdfffd835933eb086da0dc21db1" - integrity sha512-//88mFWSJx8lxCzwdAABTJL2MyWB12+eIY7MDL2SqLmAkeKU9qxRvWuSyTjm3FUmpBEMuFfckAIqEaVGUDxb6w== - dependencies: - p-try "^2.0.0" - -p-locate@^3.0.0: - version "3.0.0" - resolved "https://registry.yarnpkg.com/p-locate/-/p-locate-3.0.0.tgz#322d69a05c0264b25997d9f40cd8a891ab0064a4" - integrity sha512-x+12w/To+4GFfgJhBEpiDcLozRJGegY+Ei7/z0tSLkMmxGZNybVMSfWj9aJn8Z5Fc7dBUNJOOVgPv2H7IwulSQ== - dependencies: - p-limit "^2.0.0" - -p-try@^2.0.0: - version "2.2.0" - resolved "https://registry.yarnpkg.com/p-try/-/p-try-2.2.0.tgz#cb2868540e313d61de58fafbe35ce9004d5540e6" - integrity sha512-R4nPAVTAU0B9D35/Gk3uJf/7XYbQcyohSKdvAxIRSNghFl4e71hVoGnBNQz9cWaXxO2I10KTC+3jMdvvoKw6dQ== - -pako@^1.0.5: - version "1.0.11" - resolved "https://registry.yarnpkg.com/pako/-/pako-1.0.11.tgz#6c9599d340d54dfd3946380252a35705a6b992bf" - integrity sha512-4hLB8Py4zZce5s4yd9XzopqwVv/yGNhV1Bl8NTmCq1763HeK2+EwVTv+leGeL13Dnh2wfbqowVPXCIO0z4taYw== - -parse-bmfont-ascii@^1.0.3: - version "1.0.6" - resolved "https://registry.yarnpkg.com/parse-bmfont-ascii/-/parse-bmfont-ascii-1.0.6.tgz#11ac3c3ff58f7c2020ab22769079108d4dfa0285" - integrity sha1-Eaw8P/WPfCAgqyJ2kHkQjU36AoU= - -parse-bmfont-binary@^1.0.5: - version "1.0.6" - resolved "https://registry.yarnpkg.com/parse-bmfont-binary/-/parse-bmfont-binary-1.0.6.tgz#d038b476d3e9dd9db1e11a0b0e53a22792b69006" - integrity sha1-0Di0dtPp3Z2x4RoLDlOiJ5K2kAY= - -parse-bmfont-xml@^1.1.4: - version "1.1.4" - resolved "https://registry.yarnpkg.com/parse-bmfont-xml/-/parse-bmfont-xml-1.1.4.tgz#015319797e3e12f9e739c4d513872cd2fa35f389" - integrity sha512-bjnliEOmGv3y1aMEfREMBJ9tfL3WR0i0CKPj61DnSLaoxWR3nLrsQrEbCId/8rF4NyRF0cCqisSVXyQYWM+mCQ== - dependencies: - xml-parse-from-string "^1.0.0" - xml2js "^0.4.5" - -parse-headers@^2.0.0: - version "2.0.3" - resolved "https://registry.yarnpkg.com/parse-headers/-/parse-headers-2.0.3.tgz#5e8e7512383d140ba02f0c7aa9f49b4399c92515" - integrity sha512-QhhZ+DCCit2Coi2vmAKbq5RGTRcQUOE2+REgv8vdyu7MnYx2eZztegqtTx99TZ86GTIwqiy3+4nQTWZ2tgmdCA== - -path-exists@^3.0.0: - version "3.0.0" - resolved "https://registry.yarnpkg.com/path-exists/-/path-exists-3.0.0.tgz#ce0ebeaa5f78cb18925ea7d810d7b59b010fd515" - integrity sha1-zg6+ql94yxiSXqfYENe1mwEP1RU= - -path-is-absolute@^1.0.0: - version "1.0.1" - resolved "https://registry.yarnpkg.com/path-is-absolute/-/path-is-absolute-1.0.1.tgz#174b9268735534ffbc7ace6bf53a5a9e1b5c5f5f" - integrity sha1-F0uSaHNVNP+8es5r9TpanhtcX18= - -path-parse@^1.0.6: - version "1.0.6" - resolved "https://registry.yarnpkg.com/path-parse/-/path-parse-1.0.6.tgz#d62dbb5679405d72c4737ec58600e9ddcf06d24c" - integrity sha512-GSmOT2EbHrINBf9SR7CDELwlJ8AENk3Qn7OikK4nFYAu3Ote2+JYNVvkpAEQm3/TLNEJFD/xZJjzyxg3KBWOzw== - -pathval@^1.1.0: - version "1.1.0" - resolved "https://registry.yarnpkg.com/pathval/-/pathval-1.1.0.tgz#b942e6d4bde653005ef6b71361def8727d0645e0" - integrity sha1-uULm1L3mUwBe9rcTYd74cn0GReA= - -phin@^2.9.1: - version "2.9.3" - resolved "https://registry.yarnpkg.com/phin/-/phin-2.9.3.tgz#f9b6ac10a035636fb65dfc576aaaa17b8743125c" - integrity sha512-CzFr90qM24ju5f88quFC/6qohjC144rehe5n6DH900lgXmUe86+xCKc10ev56gRKC4/BkHUoG4uSiQgBiIXwDA== - -picomatch@^2.0.4: - version "2.2.2" - resolved "https://registry.yarnpkg.com/picomatch/-/picomatch-2.2.2.tgz#21f333e9b6b8eaff02468f5146ea406d345f4dad" - integrity sha512-q0M/9eZHzmr0AulXyPwNfZjtwZ/RBZlbN3K3CErVrk50T2ASYI7Bye0EvekFY3IP1Nt2DHu0re+V2ZHIpMkuWg== - -pixelmatch@^4.0.2: - version "4.0.2" - resolved "https://registry.yarnpkg.com/pixelmatch/-/pixelmatch-4.0.2.tgz#8f47dcec5011b477b67db03c243bc1f3085e8854" - integrity sha1-j0fc7FARtHe2fbA8JDvB8wheiFQ= - dependencies: - pngjs "^3.0.0" - -pngjs@^3.0.0, pngjs@^3.3.3: - version "3.4.0" - resolved "https://registry.yarnpkg.com/pngjs/-/pngjs-3.4.0.tgz#99ca7d725965fb655814eaf65f38f12bbdbf555f" - integrity sha512-NCrCHhWmnQklfH4MtJMRjZ2a8c80qXeMlQMv2uVp9ISJMTt562SbGd6n2oq0PaPgKm7Z6pL9E2UlLIhC+SHL3w== - -process-nextick-args@~2.0.0: - version "2.0.1" - resolved "https://registry.yarnpkg.com/process-nextick-args/-/process-nextick-args-2.0.1.tgz#7820d9b16120cc55ca9ae7792680ae7dba6d7fe2" - integrity sha512-3ouUOpQhtgrbOa17J7+uxOTpITYWaGP7/AhoR3+A+/1e9skrzelGi/dXzEYyvbxubEF6Wn2ypscTKiKJFFn1ag== - -process@~0.5.1: - version "0.5.2" - resolved "https://registry.yarnpkg.com/process/-/process-0.5.2.tgz#1638d8a8e34c2f440a91db95ab9aeb677fc185cf" - integrity sha1-FjjYqONML0QKkduVq5rrZ3/Bhc8= - -prr@~1.0.1: - version "1.0.1" - resolved "https://registry.yarnpkg.com/prr/-/prr-1.0.1.tgz#d3fc114ba06995a45ec6893f484ceb1d78f5f476" - integrity sha1-0/wRS6BplaRexok/SEzrHXj19HY= - -q@~1.1.1: - version "1.1.2" - resolved "https://registry.yarnpkg.com/q/-/q-1.1.2.tgz#6357e291206701d99f197ab84e57e8ad196f2a89" - integrity sha1-Y1fikSBnAdmfGXq4TlforRlvKok= - -qrcode-terminal@^0.12.0: - version "0.12.0" - resolved "https://registry.yarnpkg.com/qrcode-terminal/-/qrcode-terminal-0.12.0.tgz#bb5b699ef7f9f0505092a3748be4464fe71b5819" - integrity sha512-EXtzRZmC+YGmGlDFbXKxQiMZNwCLEO6BANKXG4iCtSIM0yqc/pappSx3RIKr4r0uh5JsBckOXeKrB3Iz7mdQpQ== - -qs@^6.9.1: - version "6.9.4" - resolved "https://registry.yarnpkg.com/qs/-/qs-6.9.4.tgz#9090b290d1f91728d3c22e54843ca44aea5ab687" - integrity sha512-A1kFqHekCTM7cz0udomYUoYNWjBebHm/5wzU/XqrBRBNWectVH0QIiN+NEcZ0Dte5hvzHwbr8+XQmguPhJ6WdQ== - -readable-stream@^2.0.1: - version "2.3.7" - resolved "https://registry.yarnpkg.com/readable-stream/-/readable-stream-2.3.7.tgz#1eca1cf711aef814c04f62252a36a62f6cb23b57" - integrity sha512-Ebho8K4jIbHAxnuxi7o42OrZgF/ZTNcsZj6nRKyUmkhLFq8CHItp/fy6hQZuZmP/n3yZ9VBUbp4zz/mX8hmYPw== - dependencies: - core-util-is "~1.0.0" - inherits "~2.0.3" - isarray "~1.0.0" - process-nextick-args "~2.0.0" - safe-buffer "~5.1.1" - string_decoder "~1.1.1" - util-deprecate "~1.0.1" - -readdirp@~3.2.0: - version "3.2.0" - resolved "https://registry.yarnpkg.com/readdirp/-/readdirp-3.2.0.tgz#c30c33352b12c96dfb4b895421a49fd5a9593839" - integrity sha512-crk4Qu3pmXwgxdSgGhgA/eXiJAPQiX4GMOZZMXnqKxHX7TaoL+3gQVo/WeuAiogr07DpnfjIMpXXa+PAIvwPGQ== - dependencies: - picomatch "^2.0.4" - -regenerator-runtime@^0.13.4: - version "0.13.5" - resolved "https://registry.yarnpkg.com/regenerator-runtime/-/regenerator-runtime-0.13.5.tgz#d878a1d094b4306d10b9096484b33ebd55e26697" - integrity sha512-ZS5w8CpKFinUzOwW3c83oPeVXoNsrLsaCoLtJvAClH135j/R77RuymhiSErhm2lKcwSCIpmvIWSbDkIfAqKQlA== - -regexp.prototype.flags@^1.3.0: - version "1.3.0" - resolved "https://registry.yarnpkg.com/regexp.prototype.flags/-/regexp.prototype.flags-1.3.0.tgz#7aba89b3c13a64509dabcf3ca8d9fbb9bdf5cb75" - integrity sha512-2+Q0C5g951OlYlJz6yu5/M33IcsESLlLfsyIaLJaG4FA2r4yP8MvVMJUUP/fVBkSpbbbZlS5gynbEWLipiiXiQ== - dependencies: - define-properties "^1.1.3" - es-abstract "^1.17.0-next.1" - -require-directory@^2.1.1: - version "2.1.1" - resolved "https://registry.yarnpkg.com/require-directory/-/require-directory-2.1.1.tgz#8c64ad5fd30dab1c976e2344ffe7f792a6a6df42" - integrity sha1-jGStX9MNqxyXbiNE/+f3kqam30I= - -require-main-filename@^2.0.0: - version "2.0.0" - resolved "https://registry.yarnpkg.com/require-main-filename/-/require-main-filename-2.0.0.tgz#d0b329ecc7cc0f61649f62215be69af54aa8989b" - integrity sha512-NKN5kMDylKuldxYLSUfrbo5Tuzh4hd+2E8NPPX02mZtn1VuREQToYe/ZdlJy+J3uCpfaiGF05e7B8W0iXbQHmg== - -resolve-from@2.0.0: - version "2.0.0" - resolved "https://registry.yarnpkg.com/resolve-from/-/resolve-from-2.0.0.tgz#9480ab20e94ffa1d9e80a804c7ea147611966b57" - integrity sha1-lICrIOlP+h2egKgEx+oUdhGWa1c= - -resolve@^1.3.2: - version "1.17.0" - resolved "https://registry.yarnpkg.com/resolve/-/resolve-1.17.0.tgz#b25941b54968231cc2d1bb76a79cb7f2c0bf8444" - integrity sha512-ic+7JYiV8Vi2yzQGFWOkiZD5Z9z7O2Zhm9XMaTxdJExKasieFCr+yXZ/WmXsckHiKl12ar0y6XiXDx3m4RHn1w== - dependencies: - path-parse "^1.0.6" - -safe-buffer@^5.1.1: - version "5.2.1" - resolved "https://registry.yarnpkg.com/safe-buffer/-/safe-buffer-5.2.1.tgz#1eaf9fa9bdb1fdd4ec75f58f9cdb4e6b7827eec6" - integrity sha512-rp3So07KcdmmKbGvgaNxQSJr7bGVSVk5S9Eq1F+ppbRo70+YeaDxkw5Dd8NPN+GD6bjnYm2VuPuCXmpuYvmCXQ== - -safe-buffer@~5.1.0, safe-buffer@~5.1.1: - version "5.1.2" - resolved "https://registry.yarnpkg.com/safe-buffer/-/safe-buffer-5.1.2.tgz#991ec69d296e0313747d59bdfd2b745c35f8828d" - integrity sha512-Gd2UZBJDkXlY7GbJxfsE8/nvKkUEU1G38c1siN6QP6a9PT9MmHB8GnpscSmMJSoF8LOIrt8ud/wPtojys4G6+g== - -sax@>=0.6.0: - version "1.2.4" - resolved "https://registry.yarnpkg.com/sax/-/sax-1.2.4.tgz#2816234e2378bddc4e5354fab5caa895df7100d9" - integrity sha512-NqVDv9TpANUjFm0N8uM5GxL36UgKi9/atZw+x7YFnQ8ckwFGKrl4xX4yWtrey3UJm5nP1kUbnYgLopqWNSRhWw== - -semver@^5.3.0, semver@^5.7.0: - version "5.7.1" - resolved "https://registry.yarnpkg.com/semver/-/semver-5.7.1.tgz#a954f931aeba508d307bbf069eff0c01c96116f7" - integrity sha512-sauaDf/PZdVgrLTNYHRtpXa1iRiKcaebiKQ1BJdpQlWH2lCvexQdX55snPFyK7QzpudqbCI0qXFfOasHdyNDGQ== - -semver@^7.3.2: - version "7.3.2" - resolved "https://registry.yarnpkg.com/semver/-/semver-7.3.2.tgz#604962b052b81ed0786aae84389ffba70ffd3938" - integrity sha512-OrOb32TeeambH6UrhtShmF7CRDqhL6/5XpPNp2DuRH6+9QLw/orhp72j87v8Qa1ScDkvrrBNpZcDejAirJmfXQ== - -set-blocking@^2.0.0: - version "2.0.0" - resolved "https://registry.yarnpkg.com/set-blocking/-/set-blocking-2.0.0.tgz#045f9782d011ae9a6803ddd382b24392b3d890f7" - integrity sha1-BF+XgtARrppoA93TgrJDkrPYkPc= - -side-channel@^1.0.2: - version "1.0.2" - resolved "https://registry.yarnpkg.com/side-channel/-/side-channel-1.0.2.tgz#df5d1abadb4e4bf4af1cd8852bf132d2f7876947" - integrity sha512-7rL9YlPHg7Ancea1S96Pa8/QWb4BtXL/TZvS6B8XFetGBeuhAsfmUspK6DokBeZ64+Kj9TCNRD/30pVz1BvQNA== - dependencies: - es-abstract "^1.17.0-next.1" - object-inspect "^1.7.0" - -source-map-support@^0.5.19, source-map-support@^0.5.6: - version "0.5.19" - resolved "https://registry.yarnpkg.com/source-map-support/-/source-map-support-0.5.19.tgz#a98b62f86dcaf4f67399648c085291ab9e8fed61" - integrity sha512-Wonm7zOCIJzBGQdB+thsPar0kYuCIzYvxZwlBa87yi/Mdjv7Tip2cyVbLj5o0cFPN4EVkuTwb3GDDyUx2DGnGw== - dependencies: - buffer-from "^1.0.0" - source-map "^0.6.0" - -source-map@^0.6.0: - version "0.6.1" - resolved "https://registry.yarnpkg.com/source-map/-/source-map-0.6.1.tgz#74722af32e9614e9c287a8d0bbde48b5e2f1a263" - integrity sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g== - -sprintf-js@~1.0.2: - version "1.0.3" - resolved "https://registry.yarnpkg.com/sprintf-js/-/sprintf-js-1.0.3.tgz#04e6926f662895354f3dd015203633b857297e2c" - integrity sha1-BOaSb2YolTVPPdAVIDYzuFcpfiw= - -"string-width@^1.0.2 || 2": - version "2.1.1" - resolved "https://registry.yarnpkg.com/string-width/-/string-width-2.1.1.tgz#ab93f27a8dc13d28cac815c462143a6d9012ae9e" - integrity sha512-nOqH59deCq9SRHlxq1Aw85Jnt4w6KvLKqWVik6oA9ZklXLNIOlqg4F2yrT1MVaTjAqvVwdfeZ7w7aCvJD7ugkw== - dependencies: - is-fullwidth-code-point "^2.0.0" - strip-ansi "^4.0.0" - -string-width@^3.0.0, string-width@^3.1.0: - version "3.1.0" - resolved "https://registry.yarnpkg.com/string-width/-/string-width-3.1.0.tgz#22767be21b62af1081574306f69ac51b62203961" - integrity sha512-vafcv6KjVZKSgz06oM/H6GDBrAtz8vdhQakGjFIvNrHA6y3HCF1CInLy+QLq8dTJPQ1b+KDUqDFctkdRW44e1w== - dependencies: - emoji-regex "^7.0.1" - is-fullwidth-code-point "^2.0.0" - strip-ansi "^5.1.0" - -string.prototype.trimend@^1.0.0: - version "1.0.1" - resolved "https://registry.yarnpkg.com/string.prototype.trimend/-/string.prototype.trimend-1.0.1.tgz#85812a6b847ac002270f5808146064c995fb6913" - integrity sha512-LRPxFUaTtpqYsTeNKaFOw3R4bxIzWOnbQ837QfBylo8jIxtcbK/A/sMV7Q+OAV/vWo+7s25pOE10KYSjaSO06g== - dependencies: - define-properties "^1.1.3" - es-abstract "^1.17.5" - -string.prototype.trimleft@^2.1.1: - version "2.1.2" - resolved "https://registry.yarnpkg.com/string.prototype.trimleft/-/string.prototype.trimleft-2.1.2.tgz#4408aa2e5d6ddd0c9a80739b087fbc067c03b3cc" - integrity sha512-gCA0tza1JBvqr3bfAIFJGqfdRTyPae82+KTnm3coDXkZN9wnuW3HjGgN386D7hfv5CHQYCI022/rJPVlqXyHSw== - dependencies: - define-properties "^1.1.3" - es-abstract "^1.17.5" - string.prototype.trimstart "^1.0.0" - -string.prototype.trimright@^2.1.1: - version "2.1.2" - resolved "https://registry.yarnpkg.com/string.prototype.trimright/-/string.prototype.trimright-2.1.2.tgz#c76f1cef30f21bbad8afeb8db1511496cfb0f2a3" - integrity sha512-ZNRQ7sY3KroTaYjRS6EbNiiHrOkjihL9aQE/8gfQ4DtAC/aEBRHFJa44OmoWxGGqXuJlfKkZW4WcXErGr+9ZFg== - dependencies: - define-properties "^1.1.3" - es-abstract "^1.17.5" - string.prototype.trimend "^1.0.0" - -string.prototype.trimstart@^1.0.0: - version "1.0.1" - resolved "https://registry.yarnpkg.com/string.prototype.trimstart/-/string.prototype.trimstart-1.0.1.tgz#14af6d9f34b053f7cfc89b72f8f2ee14b9039a54" - integrity sha512-XxZn+QpvrBI1FOcg6dIpxUPgWCPuNXvMD72aaRaUQv1eD4e/Qy8i/hFTe0BUmD60p/QA6bh1avmuPTfNjqVWRw== - dependencies: - define-properties "^1.1.3" - es-abstract "^1.17.5" - -string_decoder@~1.1.1: - version "1.1.1" - resolved "https://registry.yarnpkg.com/string_decoder/-/string_decoder-1.1.1.tgz#9cf1611ba62685d7030ae9e4ba34149c3af03fc8" - integrity sha512-n/ShnvDi6FHbbVfviro+WojiFzv+s8MPMHBczVePfUpDJLwoLT0ht1l4YwBCbi8pJAveEEdnkHyPyTP/mzRfwg== - dependencies: - safe-buffer "~5.1.0" - -strip-ansi@^4.0.0: - version "4.0.0" - resolved "https://registry.yarnpkg.com/strip-ansi/-/strip-ansi-4.0.0.tgz#a8479022eb1ac368a871389b635262c505ee368f" - integrity sha1-qEeQIusaw2iocTibY1JixQXuNo8= - dependencies: - ansi-regex "^3.0.0" - -strip-ansi@^5.0.0, strip-ansi@^5.1.0, strip-ansi@^5.2.0: - version "5.2.0" - resolved "https://registry.yarnpkg.com/strip-ansi/-/strip-ansi-5.2.0.tgz#8c9a536feb6afc962bdfa5b104a5091c1ad9c0ae" - integrity sha512-DuRs1gKbBqsMKIZlrffwlug8MHkcnpjs5VPmL1PAh+mA30U0DTotfDZ0d2UUsXpPmPmMMJ6W773MaA3J+lbiWA== - dependencies: - ansi-regex "^4.1.0" - -strip-json-comments@2.0.1: - version "2.0.1" - resolved "https://registry.yarnpkg.com/strip-json-comments/-/strip-json-comments-2.0.1.tgz#3c531942e908c2697c0ec344858c286c7ca0a60a" - integrity sha1-PFMZQukIwml8DsNEhYwobHygpgo= - -supports-color@5.4.0: - version "5.4.0" - resolved "https://registry.yarnpkg.com/supports-color/-/supports-color-5.4.0.tgz#1c6b337402c2137605efe19f10fec390f6faab54" - integrity sha512-zjaXglF5nnWpsq470jSv6P9DwPvgLkuapYmfDm3JWOm0vkNTVF2tI4UrN2r6jH1qM/uc/WtxYY1hYoA2dOKj5w== - dependencies: - has-flag "^3.0.0" - -supports-color@6.0.0: - version "6.0.0" - resolved "https://registry.yarnpkg.com/supports-color/-/supports-color-6.0.0.tgz#76cfe742cf1f41bb9b1c29ad03068c05b4c0e40a" - integrity sha512-on9Kwidc1IUQo+bQdhi8+Tijpo0e1SS6RoGo2guUwn5vdaxw8RXOF9Vb2ws+ihWOmh4JnCJOvaziZWP1VABaLg== - dependencies: - has-flag "^3.0.0" - -supports-color@^5.3.0: - version "5.5.0" - resolved "https://registry.yarnpkg.com/supports-color/-/supports-color-5.5.0.tgz#e2e69a44ac8772f78a1ec0b35b689df6530efc8f" - integrity sha512-QjVjwdXIt408MIiAqCX4oUKsgU2EqAGzs2Ppkm4aQYbjm+ZEWEcW4SfFNTr4uMNZma0ey4f5lgLrkB0aX0QMow== - dependencies: - has-flag "^3.0.0" - -supports-color@^7.1.0: - version "7.1.0" - resolved "https://registry.yarnpkg.com/supports-color/-/supports-color-7.1.0.tgz#68e32591df73e25ad1c4b49108a2ec507962bfd1" - integrity sha512-oRSIpR8pxT1Wr2FquTNnGet79b3BWljqOuoW/h4oBhxJ/HUbX5nX6JSruTkvXDCFMwDPvsaTTbvMLKZWSy0R5g== - dependencies: - has-flag "^4.0.0" - -tapable@^0.2.3: - version "0.2.9" - resolved "https://registry.yarnpkg.com/tapable/-/tapable-0.2.9.tgz#af2d8bbc9b04f74ee17af2b4d9048f807acd18a8" - integrity sha512-2wsvQ+4GwBvLPLWsNfLCDYGsW6xb7aeC6utq2Qh0PFwgEy7K7dsma9Jsmb2zSQj7GvYAyUGSntLtsv++GmgL1A== - -tern@^0.22.3: - version "0.22.3" - resolved "https://registry.yarnpkg.com/tern/-/tern-0.22.3.tgz#43b509c664d93b8e0aa37468b5a1ec2713833299" - integrity sha512-A2C8GbR6uJWjHUwxtxF14oY1g8oJDEhM+n9ugRowX+jr8JHgNUeOLrYTOi/LV/JK9KHpxnYwyuhnal9YDXeeDQ== - dependencies: - acorn "^5.4.0" - enhanced-resolve "^2.2.2" - glob "^7.1.1" - minimatch "^3.0.3" - resolve-from "2.0.0" - -thunky@^1.0.2: - version "1.1.0" - resolved "https://registry.yarnpkg.com/thunky/-/thunky-1.1.0.tgz#5abaf714a9405db0504732bbccd2cedd9ef9537d" - integrity sha512-eHY7nBftgThBqOyHGVN+l8gF0BucP09fMo0oO/Lb0w1OF80dJv+lDVpXG60WMQvkcxAkNybKsrEIE3ZtKGmPrA== - -timm@^1.6.1: - version "1.6.2" - resolved "https://registry.yarnpkg.com/timm/-/timm-1.6.2.tgz#dfd8c6719f7ba1fcfc6295a32670a1c6d166c0bd" - integrity sha512-IH3DYDL1wMUwmIlVmMrmesw5lZD6N+ZOAFWEyLrtpoL9Bcrs9u7M/vyOnHzDD2SMs4irLkVjqxZbHrXStS/Nmw== - -tinycolor2@^1.4.1: - version "1.4.1" - resolved "https://registry.yarnpkg.com/tinycolor2/-/tinycolor2-1.4.1.tgz#f4fad333447bc0b07d4dc8e9209d8f39a8ac77e8" - integrity sha1-9PrTM0R7wLB9TcjpIJ2POaisd+g= - -to-regex-range@^5.0.1: - version "5.0.1" - resolved "https://registry.yarnpkg.com/to-regex-range/-/to-regex-range-5.0.1.tgz#1648c44aae7c8d988a326018ed72f5b4dd0392e4" - integrity sha512-65P7iz6X5yEr1cwcgvQxbbIw7Uk3gOy5dIdtZ4rDveLqhrdJP+Li/Hx6tyK0NEb+2GCyneCMJiGqrADCSNk8sQ== - dependencies: - is-number "^7.0.0" - -ts-node@^7.0.1: - version "7.0.1" - resolved "https://registry.yarnpkg.com/ts-node/-/ts-node-7.0.1.tgz#9562dc2d1e6d248d24bc55f773e3f614337d9baf" - integrity sha512-BVwVbPJRspzNh2yfslyT1PSbl5uIk03EZlb493RKHN4qej/D06n1cEhjlOJG69oFsE7OT8XjpTUcYf6pKTLMhw== - dependencies: - arrify "^1.0.0" - buffer-from "^1.1.0" - diff "^3.1.0" - make-error "^1.1.1" - minimist "^1.2.0" - mkdirp "^0.5.1" - source-map-support "^0.5.6" - yn "^2.0.0" - -tslib@^1.8.0, tslib@^1.8.1: - version "1.13.0" - resolved "https://registry.yarnpkg.com/tslib/-/tslib-1.13.0.tgz#c881e13cc7015894ed914862d276436fa9a47043" - integrity sha512-i/6DQjL8Xf3be4K/E6Wgpekn5Qasl1usyw++dAA35Ue5orEn65VIxOA+YvNNl9HV3qv70T7CNwjODHZrLwvd1Q== - -tslint@^5.11.0: - version "5.20.1" - resolved "https://registry.yarnpkg.com/tslint/-/tslint-5.20.1.tgz#e401e8aeda0152bc44dd07e614034f3f80c67b7d" - integrity sha512-EcMxhzCFt8k+/UP5r8waCf/lzmeSyVlqxqMEDQE7rWYiQky8KpIBz1JAoYXfROHrPZ1XXd43q8yQnULOLiBRQg== - dependencies: - "@babel/code-frame" "^7.0.0" - builtin-modules "^1.1.1" - chalk "^2.3.0" - commander "^2.12.1" - diff "^4.0.1" - glob "^7.1.1" - js-yaml "^3.13.1" - minimatch "^3.0.4" - mkdirp "^0.5.1" - resolve "^1.3.2" - semver "^5.3.0" - tslib "^1.8.0" - tsutils "^2.29.0" - -tsutils@^2.29.0: - version "2.29.0" - resolved "https://registry.yarnpkg.com/tsutils/-/tsutils-2.29.0.tgz#32b488501467acbedd4b85498673a0812aca0b99" - integrity sha512-g5JVHCIJwzfISaXpXE1qvNalca5Jwob6FjI4AoPlqMusJ6ftFE7IkkFoMhVLRgK+4Kx3gkzb8UZK5t5yTTvEmA== - dependencies: - tslib "^1.8.1" - -tunnel@0.0.6: - version "0.0.6" - resolved "https://registry.yarnpkg.com/tunnel/-/tunnel-0.0.6.tgz#72f1314b34a5b192db012324df2cc587ca47f92c" - integrity sha512-1h/Lnq9yajKY2PEbBadPXj3VxsDDu844OnaAo52UVmIzIvwwtBPIuNvkjuzBlTWpfJyUbG3ez0KSBibQkj4ojg== - -tweetnacl@^1.0.1, tweetnacl@^1.0.3: - version "1.0.3" - resolved "https://registry.yarnpkg.com/tweetnacl/-/tweetnacl-1.0.3.tgz#ac0af71680458d8a6378d0d0d050ab1407d35596" - integrity sha512-6rt+RN7aOi1nGMyC4Xa5DdYiukl2UWCbcJft7YhxReBGQD7OAM8Pbxw6YMo4r2diNEA8FEmu32YOn9rhaiE5yw== - -type-detect@^4.0.0, type-detect@^4.0.5: - version "4.0.8" - resolved "https://registry.yarnpkg.com/type-detect/-/type-detect-4.0.8.tgz#7646fb5f18871cfbb7749e69bd39a6388eb7450c" - integrity sha512-0fr/mIH1dlO+x7TlcMy+bIDqKPsw/70tVyeHW787goQjhmqaZe10uwLujubK9q9Lg6Fiho1KUKDYz0Z7k7g5/g== - -typed-rest-client@^1.0.9: - version "1.7.3" - resolved "https://registry.yarnpkg.com/typed-rest-client/-/typed-rest-client-1.7.3.tgz#1beb263b86b14d34596f6127c6172dd5fd652e7b" - integrity sha512-CwTpx/TkRHGZoHkJhBcp4X8K3/WtlzSHVQR0OIFnt10j4tgy4ypgq/SrrgVpA1s6tAL49Q6J3R5C0Cgfh2ddqA== - dependencies: - qs "^6.9.1" - tunnel "0.0.6" - underscore "1.8.3" - -typescript@^3.1.3: - version "3.9.3" - resolved "https://registry.yarnpkg.com/typescript/-/typescript-3.9.3.tgz#d3ac8883a97c26139e42df5e93eeece33d610b8a" - integrity sha512-D/wqnB2xzNFIcoBG9FG8cXRDjiqSTbG2wd8DMZeQyJlP1vfTkIxH4GKveWaEBYySKIg+USu+E+EDIR47SqnaMQ== - -underscore@1.8.3: - version "1.8.3" - resolved "https://registry.yarnpkg.com/underscore/-/underscore-1.8.3.tgz#4f3fb53b106e6097fcf9cb4109f2a5e9bdfa5022" - integrity sha1-Tz+1OxBuYJf8+ctBCfKl6b36UCI= - -utif@^2.0.1: - version "2.0.1" - resolved "https://registry.yarnpkg.com/utif/-/utif-2.0.1.tgz#9e1582d9bbd20011a6588548ed3266298e711759" - integrity sha512-Z/S1fNKCicQTf375lIP9G8Sa1H/phcysstNrrSdZKj1f9g58J4NMgb5IgiEZN9/nLMPDwF0W7hdOe9Qq2IYoLg== - dependencies: - pako "^1.0.5" - -util-deprecate@~1.0.1: - version "1.0.2" - resolved "https://registry.yarnpkg.com/util-deprecate/-/util-deprecate-1.0.2.tgz#450d4dc9fa70de732762fbd2d4a28981419a0ccf" - integrity sha1-RQ1Nyfpw3nMnYvvS1KKJgUGaDM8= - -which-boxed-primitive@^1.0.1: - version "1.0.1" - resolved "https://registry.yarnpkg.com/which-boxed-primitive/-/which-boxed-primitive-1.0.1.tgz#cbe8f838ebe91ba2471bb69e9edbda67ab5a5ec1" - integrity sha512-7BT4TwISdDGBgaemWU0N0OU7FeAEJ9Oo2P1PHRm/FCWoEi2VLWC9b6xvxAA3C/NMpxg3HXVgi0sMmGbNUbNepQ== - dependencies: - is-bigint "^1.0.0" - is-boolean-object "^1.0.0" - is-number-object "^1.0.3" - is-string "^1.0.4" - is-symbol "^1.0.2" - -which-collection@^1.0.1: - version "1.0.1" - resolved "https://registry.yarnpkg.com/which-collection/-/which-collection-1.0.1.tgz#70eab71ebbbd2aefaf32f917082fc62cdcb70906" - integrity sha512-W8xeTUwaln8i3K/cY1nGXzdnVZlidBcagyNFtBdD5kxnb4TvGKR7FfSIS3mYpwWS1QUCutfKz8IY8RjftB0+1A== - dependencies: - is-map "^2.0.1" - is-set "^2.0.1" - is-weakmap "^2.0.1" - is-weakset "^2.0.1" - -which-module@^2.0.0: - version "2.0.0" - resolved "https://registry.yarnpkg.com/which-module/-/which-module-2.0.0.tgz#d9ef07dce77b9902b8a3a8fa4b31c3e3f7e6e87a" - integrity sha1-2e8H3Od7mQK4o6j6SzHD4/fm6Ho= - -which-typed-array@^1.1.2: - version "1.1.2" - resolved "https://registry.yarnpkg.com/which-typed-array/-/which-typed-array-1.1.2.tgz#e5f98e56bda93e3dac196b01d47c1156679c00b2" - integrity sha512-KT6okrd1tE6JdZAy3o2VhMoYPh3+J6EMZLyrxBQsZflI1QCZIxMrIYLkosd8Twf+YfknVIHmYQPgJt238p8dnQ== - dependencies: - available-typed-arrays "^1.0.2" - es-abstract "^1.17.5" - foreach "^2.0.5" - function-bind "^1.1.1" - has-symbols "^1.0.1" - is-typed-array "^1.1.3" - -which@1.3.1: - version "1.3.1" - resolved "https://registry.yarnpkg.com/which/-/which-1.3.1.tgz#a45043d54f5805316da8d62f9f50918d3da70b0a" - integrity sha512-HxJdYWq1MTIQbJ3nw0cqssHoTNU267KlrDuGZ1WYlxDStUtKUhOaJmh112/TZmHxxUfuJqPXSOm7tDyas0OSIQ== - dependencies: - isexe "^2.0.0" - -wide-align@1.1.3: - version "1.1.3" - resolved "https://registry.yarnpkg.com/wide-align/-/wide-align-1.1.3.tgz#ae074e6bdc0c14a431e804e624549c633b000457" - integrity sha512-QGkOQc8XL6Bt5PwnsExKBPuMKBxnGxWWW3fU55Xt4feHozMUhdUMaBCk290qpm/wG5u/RSKzwdAC4i51YigihA== - dependencies: - string-width "^1.0.2 || 2" - -wrap-ansi@^5.1.0: - version "5.1.0" - resolved "https://registry.yarnpkg.com/wrap-ansi/-/wrap-ansi-5.1.0.tgz#1fd1f67235d5b6d0fee781056001bfb694c03b09" - integrity sha512-QC1/iN/2/RPVJ5jYK8BGttj5z83LmSKmvbvrXPNCLZSEb32KKVDJDl/MOt2N01qU2H/FkzEa9PKto1BqDjtd7Q== - dependencies: - ansi-styles "^3.2.0" - string-width "^3.0.0" - strip-ansi "^5.0.0" - -wrappy@1: - version "1.0.2" - resolved "https://registry.yarnpkg.com/wrappy/-/wrappy-1.0.2.tgz#b5243d8f3ec1aa35f1364605bc0d1036e30ab69f" - integrity sha1-tSQ9jz7BqjXxNkYFvA0QNuMKtp8= - -xhr@^2.0.1: - version "2.5.0" - resolved "https://registry.yarnpkg.com/xhr/-/xhr-2.5.0.tgz#bed8d1676d5ca36108667692b74b316c496e49dd" - integrity sha512-4nlO/14t3BNUZRXIXfXe+3N6w3s1KoxcJUUURctd64BLRe67E4gRwp4PjywtDY72fXpZ1y6Ch0VZQRY/gMPzzQ== - dependencies: - global "~4.3.0" - is-function "^1.0.1" - parse-headers "^2.0.0" - xtend "^4.0.0" - -xml-parse-from-string@^1.0.0: - version "1.0.1" - resolved "https://registry.yarnpkg.com/xml-parse-from-string/-/xml-parse-from-string-1.0.1.tgz#a9029e929d3dbcded169f3c6e28238d95a5d5a28" - integrity sha1-qQKekp09vN7RafPG4oI42VpdWig= - -xml2js@^0.4.5: - version "0.4.23" - resolved "https://registry.yarnpkg.com/xml2js/-/xml2js-0.4.23.tgz#a0c69516752421eb2ac758ee4d4ccf58843eac66" - integrity sha512-ySPiMjM0+pLDftHgXY4By0uswI3SPKLDw/i3UXbnO8M/p28zqexCUoPmQFrYD+/1BzhGJSs2i1ERWKJAtiLrug== - dependencies: - sax ">=0.6.0" - xmlbuilder "~11.0.0" - -xmlbuilder@~11.0.0: - version "11.0.1" - resolved "https://registry.yarnpkg.com/xmlbuilder/-/xmlbuilder-11.0.1.tgz#be9bae1c8a046e76b31127726347d0ad7002beb3" - integrity sha512-fDlsI/kFEx7gLvbecc0/ohLG50fugQp8ryHzMTuW9vSa1GJ0XYWKnhsUx7oie3G98+r56aTQIUB4kht42R3JvA== - -xtend@^4.0.0: - version "4.0.2" - resolved "https://registry.yarnpkg.com/xtend/-/xtend-4.0.2.tgz#bb72779f5fa465186b1f438f674fa347fdb5db54" - integrity sha512-LKYU1iAXJXUgAXn9URjiu+MWhyUXHsvfp7mcuYm9dSUKK0/CjtrUwFAxD82/mCWbtLsGjFIad0wIsod4zrTAEQ== - -y18n@^4.0.0: - version "4.0.0" - resolved "https://registry.yarnpkg.com/y18n/-/y18n-4.0.0.tgz#95ef94f85ecc81d007c264e190a120f0a3c8566b" - integrity sha512-r9S/ZyXu/Xu9q1tYlpsLIsa3EeLXXk0VwlxqTcFRfg9EhMW+17kbt9G0NrgCmhGb5vT2hyhJZLfDGx+7+5Uj/w== - -yargs-parser@13.1.2, yargs-parser@^13.1.2: - version "13.1.2" - resolved "https://registry.yarnpkg.com/yargs-parser/-/yargs-parser-13.1.2.tgz#130f09702ebaeef2650d54ce6e3e5706f7a4fb38" - integrity sha512-3lbsNRf/j+A4QuSZfDRA7HRSfWrzO0YjqTJd5kjAq37Zep1CEgaYmrH9Q3GwPiB9cHyd1Y1UwggGhJGoxipbzg== - dependencies: - camelcase "^5.0.0" - decamelize "^1.2.0" - -yargs-unparser@1.6.0: - version "1.6.0" - resolved "https://registry.yarnpkg.com/yargs-unparser/-/yargs-unparser-1.6.0.tgz#ef25c2c769ff6bd09e4b0f9d7c605fb27846ea9f" - integrity sha512-W9tKgmSn0DpSatfri0nx52Joq5hVXgeLiqR/5G0sZNDoLZFOr/xjBUDcShCOGNsBnEMNo1KAMBkTej1Hm62HTw== - dependencies: - flat "^4.1.0" - lodash "^4.17.15" - yargs "^13.3.0" - -yargs@13.3.2, yargs@^13.3.0: - version "13.3.2" - resolved "https://registry.yarnpkg.com/yargs/-/yargs-13.3.2.tgz#ad7ffefec1aa59565ac915f82dccb38a9c31a2dd" - integrity sha512-AX3Zw5iPruN5ie6xGRIDgqkT+ZhnRlZMLMHAs8tg7nRruy2Nb+i5o9bwghAogtM08q1dpr2LVoS8KSTMYpWXUw== - dependencies: - cliui "^5.0.0" - find-up "^3.0.0" - get-caller-file "^2.0.1" - require-directory "^2.1.1" - require-main-filename "^2.0.0" - set-blocking "^2.0.0" - string-width "^3.0.0" - which-module "^2.0.0" - y18n "^4.0.0" - yargs-parser "^13.1.2" - -yn@^2.0.0: - version "2.0.0" - resolved "https://registry.yarnpkg.com/yn/-/yn-2.0.0.tgz#e5adabc8acf408f6385fc76495684c88e6af689a" - integrity sha1-5a2ryKz0CPY4X8dklWhMiOavaJo=