├── .gitignore ├── README.md ├── cli.js ├── index.js ├── package-lock.json ├── package.json └── yarn.lock /.gitignore: -------------------------------------------------------------------------------- 1 | node_modules 2 | -------------------------------------------------------------------------------- /README.md: -------------------------------------------------------------------------------- 1 | Install 2 | === 3 | ``` 4 | npm i -g homebridge-homekit-controller 5 | 6 | ``` 7 | 8 | Pair devices 9 | === 10 | - Discover devices 11 | ``` 12 | homekit [network interface] 13 | ``` 14 | 15 | example 16 | 17 | ``` 18 | homekit 19 | ``` 20 | 21 | or 22 | 23 | ``` 24 | homekit wlan0 25 | ``` 26 | 27 | - Select device, and enter code to pair (including `-`, example `123-45-678`) 28 | - Enter filename to save pairing's informations JSON 29 | - Inside the JSON file, you can find 30 | 31 | ``` 32 | { 33 | "service": { 34 | "id": "device id", 35 | "name": "device name", 36 | "address": "device ip", 37 | "port": device-port 38 | }, 39 | "pairingData": { 40 | "AccessoryPairingID": "xxx", 41 | "AccessoryLTPK": "xxx", 42 | "iOSDevicePairingID": "xxx", 43 | "iOSDeviceLTSK": "xxx", 44 | "iOSDeviceLTPK": "xxx" 45 | }, 46 | "accessories": { 47 | "accessories": [...] 48 | } 49 | } 50 | ``` 51 | - Note down the `"service"`, `"pairingData"`, and `"aid"` & `"iid"` under `"accessories"`. 52 | - Get all the UUID here [https://gist.github.com/mplewis/def678dc4b6e63a86905](https://gist.github.com/mplewis/def678dc4b6e63a86905) 53 | - Currently, I support `Switch`, `Motion sensor`, `Temperature sensor` and `Humidity sensor`. I will try to add more services! 54 | 55 | 56 | Config 57 | === 58 | ``` 59 | { 60 | "platforms": [ 61 | { 62 | "platform": "HomeKitController", 63 | "services": [ 64 | { 65 | "id": "device id", 66 | "name": "device name", 67 | "address": "device ip", 68 | "port": "device port", 69 | "pairingData": { 70 | "AccessoryPairingID": "xxx", 71 | "AccessoryLTPK": "xxx", 72 | "iOSDevicePairingID": "xxx", 73 | "iOSDeviceLTSK": "xxx", 74 | "iOSDeviceLTPK": "xxx" 75 | }, 76 | "accessories": [ 77 | { 78 | "aid": "characteristic aid", 79 | "iid": "characteristic iid", 80 | "type" : "service type (eg. 00000082-0000-1000-8000-0026BB765291)", 81 | "name": "Humidity Sensor 1" 82 | } 83 | ] 84 | } 85 | ] 86 | } 87 | ] 88 | } 89 | ``` 90 | 91 | -------------------------------------------------------------------------------- /cli.js: -------------------------------------------------------------------------------- 1 | #!/usr/bin/env node 2 | 3 | const sodium = require('libsodium-wrappers'); 4 | 5 | (async() => { 6 | await sodium.ready; 7 | 8 | const {IPDiscovery, HttpClient} = require('hap-controller'); 9 | const term = require( 'terminal-kit' ).terminal; 10 | 11 | const fs = require('fs'); 12 | 13 | 14 | const discover = () => ( 15 | new Promise((resolve, reject) => { 16 | term.clear(); 17 | const ipDiscovery = new IPDiscovery(process.argv[2]); 18 | const discoveryTimeout = 30; 19 | const services = []; 20 | ipDiscovery.on('serviceUp', (service) => { 21 | services.push(service); 22 | }); 23 | ipDiscovery.start(); 24 | 25 | let discoveryTime = 0; 26 | progressBar = term.progressBar({ 27 | width: 70, 28 | percent: true, 29 | eta: true, 30 | title: "Discovering services", 31 | titleSize: 29 32 | }); 33 | 34 | const discoveryInterval = setInterval(() => { 35 | discoveryTime++; 36 | progressBar.update(discoveryTime / discoveryTimeout); 37 | 38 | if(discoveryTime >= discoveryTimeout) 39 | { 40 | clearInterval(discoveryInterval); 41 | ipDiscovery.stop(); 42 | 43 | resolve(services); 44 | } 45 | }, 1000); 46 | }) 47 | ); 48 | 49 | 50 | const services = await discover(); 51 | if(services.length === 0) 52 | { 53 | process.exit(); 54 | } 55 | 56 | const selectService = (services) => ( 57 | new Promise((resolve, reject) => { 58 | term.clear(); 59 | term('Please select a service:'); 60 | const serviceMenuItems = services.map(service => `${service.name} (${service.id})`); 61 | 62 | term.singleColumnMenu(serviceMenuItems, (error, response) => { 63 | const service = services[response.selectedIndex]; 64 | resolve(service); 65 | }); 66 | }) 67 | ) 68 | 69 | const service = await selectService(services); 70 | 71 | const pairService = (service) => ( 72 | new Promise((resolve, reject) => { 73 | term.clear(); 74 | term('Enter PIN for ' + service.name + ' (XXX-XX-XXX): ') 75 | term.inputField({ 76 | 77 | }, async (error, input) => { 78 | const ipClient = new HttpClient( 79 | service.id, 80 | service.address, 81 | service.port 82 | ); 83 | 84 | await ipClient.pairSetup(input); 85 | 86 | resolve(ipClient); 87 | }); 88 | }) 89 | ) 90 | 91 | const client = await pairService(service); 92 | 93 | const saveServiceData = (service, client) => ( 94 | new Promise((resolve, reject) => { 95 | term.clear(); 96 | 97 | const pairingData = client.getLongTermData(); 98 | term('Enter service data file name for saving: '); 99 | 100 | term.inputField({ 101 | default: `${service.id}.json`.replace(/:/g, '-') 102 | }, async (error, input) => { 103 | const accessories = await client.getAccessories(); 104 | const data = { 105 | service: { 106 | id: service.id, 107 | name: service.name, 108 | address: service.address, 109 | port: service.port, 110 | }, 111 | pairingData, 112 | accessories 113 | } 114 | 115 | fs.writeFileSync(input, JSON.stringify(data)); 116 | resolve(data); 117 | }); 118 | }) 119 | ) 120 | 121 | 122 | 123 | const data = await saveServiceData(service, client); 124 | term.clear(); 125 | console.log(data) 126 | process.exit(); 127 | 128 | 129 | // const dataFile = 'data.json'; 130 | // const serviceId = '07:04:16:30:05:14'; 131 | // const servicePin = '151-21-988'; 132 | 133 | // let data = {}; 134 | // /* 135 | // [id] => { 136 | // address, 137 | // port, 138 | // pairingData, 139 | // accessories 140 | // } 141 | // */ 142 | // if(fs.existsSync(dataFile)) 143 | // { 144 | // data = JSON.parse(fs.readFileSync(dataFile)); 145 | // const serviceData = data[serviceId]; 146 | 147 | 148 | 149 | // const ipClient = new HttpClient( 150 | // serviceId, 151 | // serviceData.address, 152 | // serviceData.port, 153 | // serviceData.pairingData 154 | // ); 155 | 156 | 157 | // ipClient.getAccessories().then((accessories) => { 158 | // console.log('Got accessories -> try persit data'); 159 | // data[serviceId].accessories = accessories; 160 | // console.log(accessories); 161 | 162 | // fs.writeFileSync(dataFile, JSON.stringify(data)); 163 | 164 | // console.log('OK'); 165 | // process.exit(); 166 | // }).catch((e) => console.error('getAccessories e', e)); 167 | 168 | 169 | // /* 170 | // data = JSON.parse(fs.readFileSync(dataFile)); 171 | 172 | // console.log('Try connect ' + serviceId); 173 | // const serviceData = data[serviceId]; 174 | 175 | // console.log({ 176 | // id: serviceId, 177 | // address: serviceData.address, 178 | // port: serviceData.port, 179 | // pairingData: serviceData.pairingData 180 | // }) 181 | 182 | // const ipSubscriberClient = new HttpClient( 183 | // serviceId, 184 | // serviceData.address, 185 | // serviceData.port, 186 | // serviceData.pairingData 187 | // ); 188 | 189 | // ipSubscriberClient.on('event', (ev) => { 190 | // console.log('[event]', ev); 191 | // }); 192 | 193 | 194 | // ipSubscriberClient.subscribeCharacteristics(['2.10']).then((conn) => { 195 | // connection = conn; 196 | // }).catch((e) => console.error('subscribeCharacteristics', e)); 197 | 198 | // const ipClient = new HttpClient( 199 | // serviceId, 200 | // serviceData.address, 201 | // serviceData.port, 202 | // serviceData.pairingData 203 | // ); 204 | // ipClient.setCharacteristics({ 205 | // '2.10': true 206 | // }).then(() => { 207 | // ipClient.getCharacteristics( 208 | // ['2.10'], 209 | // { 210 | // meta: true, 211 | // perms: true, 212 | // type: true, 213 | // ev: true, 214 | // } 215 | // ).then((characteristics) => { 216 | // console.log(characteristics); 217 | // }).catch((e) => console.error('getCharacteristics', e)); 218 | // }).catch((e) => console.error('setCharacteristics', e)); 219 | 220 | 221 | // */ 222 | // } else { 223 | // console.log('No data -> try discover'); 224 | // const ipDiscovery = new IPDiscovery(); 225 | // ipDiscovery.on('serviceUp', (service) => { 226 | // console.log('Discovered ' + service.id + ' -> try pair'); 227 | 228 | // data[service.id] = { 229 | // address: service.address, 230 | // port: service.port, 231 | // pairingData: {}, 232 | // accessories: {} 233 | // }; 234 | 235 | // const ipClient = new HttpClient(service.id, service.address, service.port); 236 | 237 | 238 | // ipClient.pairSetup(servicePin).then((r) => { 239 | 240 | 241 | // const pairingData = ipClient.getLongTermData(); 242 | // console.log('pairingData', pairingData); 243 | // console.log('Paired ' + service.id + ' -> try get accessories'); 244 | 245 | // data[service.id].pairingData = pairingData; 246 | 247 | 248 | 249 | // ipClient.getAccessories().then((accessories) => { 250 | // console.log('Got ' + service.id + ' accessories -> try persit data'); 251 | // console.log(accessories); 252 | // data[service.id].accessories = accessories; 253 | 254 | // fs.writeFileSync(dataFile, JSON.stringify(data)); 255 | 256 | // console.log('OK'); 257 | // process.exit(); 258 | // }).catch((e) => console.error('getAccessories', e)); 259 | 260 | // }).catch((e) => console.error('pairSetup', e)); 261 | // }); 262 | // ipDiscovery.start(); 263 | // } 264 | 265 | 266 | })(); 267 | 268 | 269 | 270 | -------------------------------------------------------------------------------- /index.js: -------------------------------------------------------------------------------- 1 | "use strict"; 2 | 3 | const sodium = require('libsodium-wrappers'); 4 | const {HttpClient} = require('hap-controller'); 5 | 6 | var Service, Characteristic, HomebridgeAPI; 7 | 8 | module.exports = (homebridge) => { 9 | Service = homebridge.hap.Service; 10 | Characteristic = homebridge.hap.Characteristic; 11 | HomebridgeAPI = homebridge; 12 | homebridge.registerPlatform("homekit-controller", "HomeKitController", ControllerPlatform); 13 | } 14 | 15 | const sleep = (seconds) => new Promise(resolver => setTimeout(resolver, seconds * 1000)) 16 | 17 | function ControllerPlatform(log, config) { 18 | this.log = log; 19 | // this.log = () => {}; 20 | this.config = config; 21 | this.hbAccessories = []; 22 | this.clients = []; 23 | 24 | const services = this.config.services; 25 | 26 | for(var service of services) 27 | { 28 | const accessories = service.accessories; 29 | 30 | const client = new HttpClient( 31 | service.id, 32 | service.address, 33 | service.port, 34 | service.pairingData 35 | ) 36 | client.accessoryNames = {} 37 | client.cachedValue = {} 38 | 39 | for(var accessory of accessories) 40 | { 41 | const characteristic = accessory.aid + '.' + accessory.iid; 42 | 43 | client.accessoryNames[characteristic] = accessory.name 44 | 45 | if(accessory.type === '00000049-0000-1000-8000-0026BB765291') 46 | { 47 | // Switch 48 | const hbService = new Service.Switch(accessory.name); 49 | 50 | hbService.getCharacteristic(Characteristic.On) 51 | .on('set', async (value, callback) => { 52 | try { 53 | await client.setCharacteristics({ 54 | [characteristic]: value 55 | }); 56 | 57 | client.cachedValue[characteristic] = value 58 | 59 | this.log('[set] Switch ' + client.accessoryNames[characteristic] + ' setCharacteristics ' + characteristic + ' -> ' + value + ' => ok') 60 | callback(null); 61 | } catch(e){ 62 | callback(null); 63 | this.log('[set] Switch ' + client.accessoryNames[characteristic] + ' setCharacteristics ' + characteristic + ' -> ' + value + ' => error', e) 64 | } 65 | }) 66 | .on('get', async (callback) => { 67 | try { 68 | let callbacked = false 69 | 70 | if(client.cachedValue && client.cachedValue[characteristic]) 71 | { 72 | this.log('[get] Switch ' + client.accessoryNames[characteristic] + ' cachedValue ' + characteristic + ' = ' + client.cachedValue[characteristic] + ' => ok') 73 | callback(null, client.cachedValue[characteristic]) 74 | callbacked = true 75 | return 76 | } 77 | 78 | 79 | const result = await client.getCharacteristics([characteristic]) 80 | 81 | client.cachedValue = client.cachedValue || {} 82 | client.cachedValue[characteristic] = result.characteristics[0].value 83 | 84 | this.log('[get] Switch ' + client.accessoryNames[characteristic] + ' getCharacteristics ' + characteristic + ' = ' + result.characteristics[0].value + ' => ok') 85 | 86 | if(!callbacked) 87 | { 88 | callback(null, result.characteristics[0].value) 89 | } 90 | } catch(e) { 91 | callback(null, false); 92 | this.log('[get] Switch ' + client.accessoryNames[characteristic] + ' getCharacteristics ' + characteristic + ' => error', e) 93 | } 94 | }); 95 | 96 | 97 | const hbAccessory = { 98 | name: accessory.name, 99 | type: accessory.type, 100 | serviceId: service.id, 101 | characteristic 102 | } 103 | 104 | hbAccessory.getServices = () => [hbService]; 105 | 106 | this.hbAccessories.push(hbAccessory); 107 | } 108 | else if(accessory.type === '00000011-0000-1000-8000-0026BB765291') 109 | { 110 | // Temperature 111 | const hbService = new Service.TemperatureSensor(accessory.name); 112 | 113 | hbService.getCharacteristic(Characteristic.CurrentTemperature) 114 | .on('get', async (callback) => { 115 | try { 116 | let callbacked = false 117 | if(client.cachedValue && client.cachedValue[characteristic]) 118 | { 119 | this.log('[get] Temperature ' + client.accessoryNames[characteristic] + ' cachedValue ' + characteristic + ' = ' + client.cachedValue[characteristic] + ' => ok') 120 | callback(null, client.cachedValue[characteristic]) 121 | callbacked = true 122 | return 123 | } 124 | 125 | const result = await client.getCharacteristics([characteristic]) 126 | 127 | 128 | client.cachedValue[characteristic] = result.characteristics[0].value 129 | 130 | this.log('[get] Temperature ' + client.accessoryNames[characteristic] + ' getCharacteristics ' + characteristic + ' = ' + result.characteristics[0].value + ' => ok') 131 | 132 | if(!callbacked) 133 | { 134 | callback(null, result.characteristics[0].value) 135 | } 136 | } catch(e) { 137 | callback(false); 138 | this.log('[get] Temperature ' + client.accessoryNames[characteristic] + ' getCharacteristics ' + characteristic + ' => error', e) 139 | } 140 | }); 141 | 142 | 143 | const hbAccessory = { 144 | name: accessory.name, 145 | type: accessory.type, 146 | serviceId: service.id, 147 | characteristic 148 | } 149 | 150 | hbAccessory.getServices = () => [hbService]; 151 | 152 | this.hbAccessories.push(hbAccessory); 153 | } 154 | else if(accessory.type === '00000082-0000-1000-8000-0026BB765291') 155 | { 156 | // Humidity 157 | const hbService = new Service.HumiditySensor(accessory.name); 158 | 159 | hbService.getCharacteristic(Characteristic.CurrentRelativeHumidity) 160 | .on('get', async (callback) => { 161 | try { 162 | 163 | let callbacked = false 164 | if(client.cachedValue && client.cachedValue[characteristic]) 165 | { 166 | this.log('[get] Humidity ' + client.accessoryNames[characteristic] + ' cachedValue ' + characteristic + ' = ' + client.cachedValue[characteristic] + ' => ok') 167 | callback(null, client.cachedValue[characteristic]) 168 | callbacked = true 169 | return 170 | } 171 | 172 | const result = await client.getCharacteristics([characteristic]) 173 | 174 | 175 | client.cachedValue = client.cachedValue || {} 176 | client.cachedValue[characteristic] = result.characteristics[0].value 177 | 178 | 179 | this.log('[get] Humidity ' + client.accessoryNames[characteristic] + ' getCharacteristics ' + characteristic + ' = ' + result.characteristics[0].value + ' => ok') 180 | 181 | if(!callbacked) 182 | { 183 | callback(null, result.characteristics[0].value) 184 | } 185 | } catch(e) { 186 | callback(false); 187 | this.log('[get] Humidity ' + client.accessoryNames[characteristic] + ' getCharacteristics ' + characteristic + ' => error', e) 188 | } 189 | }); 190 | 191 | 192 | const hbAccessory = { 193 | name: accessory.name, 194 | type: accessory.type, 195 | serviceId: service.id, 196 | characteristic 197 | } 198 | 199 | hbAccessory.getServices = () => [hbService]; 200 | 201 | this.hbAccessories.push(hbAccessory); 202 | } 203 | else if(accessory.type === '00000085-0000-1000-8000-0026BB765291') 204 | { 205 | // Motion 206 | const hbService = new Service.MotionSensor(accessory.name); 207 | 208 | hbService.getCharacteristic(Characteristic.MotionDetected) 209 | .on('get', async (callback) => { 210 | try { 211 | /* 212 | // no cache due to race conditions 213 | let callbacked = false 214 | if(client.cachedValue && client.cachedValue[characteristic]) 215 | { 216 | this.log('Motion cachedValue ' + characteristic + ' = ' + client.cachedValue[characteristic] + ' => ok') 217 | callback(null, client.cachedValue[characteristic]) 218 | callbacked = true 219 | return 220 | } 221 | 222 | 223 | const result = await client.getCharacteristics([characteristic]) 224 | 225 | 226 | client.cachedValue = client.cachedValue || {} 227 | client.cachedValue[characteristic] = result.characteristics[0].value 228 | 229 | 230 | this.log('Motion getCharacteristics ' + characteristic + ' = ' + result.characteristics[0].value + ' => ok') 231 | 232 | if(!callbacked) 233 | { 234 | callback(null, result.characteristics[0].value) 235 | } 236 | */ 237 | 238 | const result = await client.getCharacteristics([characteristic]) 239 | this.log('[get] Motion ' + client.accessoryNames[characteristic] + ' getCharacteristics ' + characteristic + ' = ' + result.characteristics[0].value + ' => ok') 240 | 241 | callback(null, result.characteristics[0].value) 242 | } catch(e) { 243 | callback(false); 244 | this.log('[get] Motion ' + client.accessoryNames[characteristic] + ' getCharacteristics ' + characteristic + ' => error', e) 245 | } 246 | }); 247 | 248 | 249 | 250 | const hbAccessory = { 251 | name: accessory.name, 252 | type: accessory.type, 253 | serviceId: service.id, 254 | characteristic 255 | } 256 | 257 | hbAccessory.getServices = () => [hbService]; 258 | 259 | this.hbAccessories.push(hbAccessory); 260 | } 261 | } 262 | 263 | this.clients[service.id] = client; 264 | } 265 | } 266 | 267 | ControllerPlatform.prototype.accessories = async function(callback) { 268 | await sodium.ready; 269 | 270 | this.log("accessories") 271 | 272 | const update = async (accessoryType = null) => { 273 | this.log("update") 274 | for(let hbAccessory of this.hbAccessories) 275 | { 276 | const type = hbAccessory.type; 277 | if((accessoryType === null || accessoryType === type) && type === '00000049-0000-1000-8000-0026BB765291') 278 | { 279 | // Switch 280 | const name = hbAccessory.name; 281 | const hbService = hbAccessory.getServices()[0]; 282 | const characteristic = hbAccessory.characteristic; 283 | const serviceId = hbAccessory.serviceId; 284 | const client = this.clients[serviceId]; 285 | 286 | try { 287 | const result = await client.getCharacteristics([characteristic]) 288 | this.log('[update] Switch ' + name + ' getCharacteristics ' + characteristic + ' -> ' + result.characteristics[0].value + ' = ok') 289 | 290 | if(!client.cachedValue || client.cachedValue[characteristic] !== result.characteristics[0].value) 291 | { 292 | client.cachedValue = client.cachedValue || {} 293 | client.cachedValue[characteristic] = result.characteristics[0].value 294 | 295 | hbService.setCharacteristic(Characteristic.On, result.characteristics[0].value); 296 | } 297 | } catch(e) { 298 | this.log('[update] Switch ' + name + ' getCharacteristics ' + characteristic + ' = error', e) 299 | } 300 | 301 | 302 | 303 | try { 304 | client 305 | .on('event', event => { 306 | this.log('[event] Switch ' + name + ' got event', event); 307 | 308 | if(event.characteristics && event.characteristics[0]) 309 | { 310 | if(characteristic === event.characteristics[0].aid + '.' + event.characteristics[0].iid) 311 | { 312 | if(!client.cachedValue || client.cachedValue[characteristic] !== result.characteristics[0].value) 313 | { 314 | 315 | client.cachedValue = client.cachedValue || {} 316 | client.cachedValue[characteristic] = event.characteristics[0].value 317 | 318 | this.log('[event] Switch ' + name + ' setCharacteristic', characteristic, event.characteristics[0].value); 319 | 320 | hbService.setCharacteristic(Characteristic.On, event.characteristics[0].value); 321 | } 322 | } 323 | } 324 | }) 325 | .on('disconnect', async () => { 326 | this.log('[disconnect] Switch ' + name + ' disconnected'); 327 | 328 | // let reconnected = false 329 | // while(!reconnected) 330 | // { 331 | // await delay(1) 332 | 333 | // try { 334 | // this.log('Switch ' + name + ' reconnecting') 335 | // await client.subscribeCharacteristics([characteristic]) 336 | // this.log('Switch ' + name + ' update subscribeCharacteristics ' + characteristic + ' = ok') 337 | // reconnected = true 338 | // } catch(e) { 339 | // this.log('Switch ' + name + ' update subscribeCharacteristics ' + characteristic + ' = error', e) 340 | // } 341 | // } 342 | }) 343 | 344 | const connection = await client.subscribeCharacteristics([characteristic]) 345 | 346 | this.log('[update] Switch ' + name + ' subscribeCharacteristics ' + characteristic + ' = ok') 347 | } catch(e) { 348 | this.log('[update] Switch ' + name + ' subscribeCharacteristics ' + characteristic + ' = error', e) 349 | } 350 | } 351 | else if((accessoryType === null || accessoryType === type) && type === '00000011-0000-1000-8000-0026BB765291') 352 | { 353 | // Temperature 354 | const name = hbAccessory.name; 355 | const hbService = hbAccessory.getServices()[0]; 356 | const characteristic = hbAccessory.characteristic; 357 | const serviceId = hbAccessory.serviceId; 358 | const client = this.clients[serviceId]; 359 | 360 | try { 361 | const result = await client.getCharacteristics([characteristic]) 362 | this.log('[update] Temperature ' + name + ' getCharacteristics ' + characteristic + ' -> ' + result.characteristics[0].value + ' = ok') 363 | 364 | if(!client.cachedValue || client.cachedValue[characteristic] !== result.characteristics[0].value) 365 | { 366 | client.cachedValue = client.cachedValue || {} 367 | client.cachedValue[characteristic] = result.characteristics[0].value 368 | 369 | hbService.setCharacteristic(Characteristic.CurrentTemperature, result.characteristics[0].value); 370 | } 371 | } catch(e) { 372 | this.log('[update] Temperature ' + name + ' getCharacteristics ' + characteristic + ' = error', e) 373 | } 374 | 375 | try { 376 | client 377 | .on('event', event => { 378 | this.log('[event] Temperature ' + name + ' got event', event); 379 | 380 | if(event.characteristics && event.characteristics[0]) 381 | { 382 | if(characteristic === event.characteristics[0].aid + '.' + event.characteristics[0].iid) 383 | { 384 | if(!client.cachedValue || client.cachedValue[characteristic] !== event.characteristics[0].value) 385 | { 386 | client.cachedValue = client.cachedValue || {} 387 | client.cachedValue[characteristic] = result.characteristics[0].value 388 | 389 | this.log('[event] Temperature ' + name + ' setCharacteristic', characteristic, event.characteristics[0].value); 390 | 391 | hbService.setCharacteristic(Characteristic.CurrentTemperature, event.characteristics[0].value); 392 | } 393 | } 394 | } 395 | }) 396 | .on('disconnect', async () => { 397 | this.log('[disconnect] Switch ' + name + ' disconnected'); 398 | 399 | // let reconnected = false 400 | // while(!reconnected) 401 | // { 402 | // await delay(1) 403 | 404 | // try { 405 | // this.log('Temperature ' + name + ' reconnecting') 406 | // await client.subscribeCharacteristics([characteristic]) 407 | // this.log('Temperature ' + name + ' update subscribeCharacteristics ' + characteristic + ' = ok') 408 | // reconnected = true 409 | // } catch(e) { 410 | // this.log('Temperature ' + name + ' update subscribeCharacteristics ' + characteristic + ' = error', e) 411 | // } 412 | // } 413 | }) 414 | 415 | const connection = await client.subscribeCharacteristics([characteristic]) 416 | 417 | this.log('[update] Temperature ' + name + ' subscribeCharacteristics ' + characteristic + ' = ok') 418 | } catch(e) { 419 | this.log('[update] Temperature ' + name + ' subscribeCharacteristics ' + characteristic + ' = error', e) 420 | } 421 | } 422 | else if((accessoryType === null || accessoryType === type) && type === '00000082-0000-1000-8000-0026BB765291') 423 | { 424 | // Humidity 425 | const name = hbAccessory.name; 426 | const hbService = hbAccessory.getServices()[0]; 427 | const characteristic = hbAccessory.characteristic; 428 | const serviceId = hbAccessory.serviceId; 429 | const client = this.clients[serviceId]; 430 | 431 | try { 432 | const result = await client.getCharacteristics([characteristic]) 433 | this.log('[update] Humidity ' + hbAccessory.name + ' getCharacteristics ' + characteristic + ' -> ' + result.characteristics[0].value + ' = ok') 434 | 435 | if(!client.cachedValue || client.cachedValue[characteristic] !== result.characteristics[0].value) 436 | { 437 | client.cachedValue = client.cachedValue || {} 438 | client.cachedValue[characteristic] = result.characteristics[0].value 439 | 440 | hbService.setCharacteristic(Characteristic.CurrentRelativeHumidity, result.characteristics[0].value); 441 | } 442 | } catch(e) { 443 | this.log('[update] Humidity ' + hbAccessory.name + ' getCharacteristics ' + characteristic + ' = error', e) 444 | } 445 | 446 | 447 | try { 448 | client 449 | .on('event', event => { 450 | this.log('[event] Humidity ' + name + ' got event', event); 451 | 452 | if(event.characteristics && event.characteristics[0]) 453 | { 454 | if(characteristic === event.characteristics[0].aid + '.' + event.characteristics[0].iid) 455 | { 456 | if(!client.cachedValue || client.cachedValue[characteristic] !== event.characteristics[0].value) 457 | { 458 | client.cachedValue = client.cachedValue || {} 459 | client.cachedValue[characteristic] = result.characteristics[0].value 460 | 461 | this.log('[event] Humidity ' + name + ' setCharacteristic', characteristic, event.characteristics[0].value); 462 | 463 | hbService.setCharacteristic(Characteristic.CurrentRelativeHumidity, event.characteristics[0].value); 464 | } 465 | } 466 | } 467 | }) 468 | .on('disconnect', async () => { 469 | this.log('[disconnect] Humidity ' + name + ' disconnected'); 470 | 471 | 472 | // let reconnected = false 473 | // while(!reconnected) 474 | // { 475 | // await delay(1) 476 | 477 | // try { 478 | // this.log('Humidity ' + name + ' reconnecting') 479 | // await client.subscribeCharacteristics([characteristic]) 480 | // this.log('Humidity ' + name + ' update subscribeCharacteristics ' + characteristic + ' = ok') 481 | // reconnected = true 482 | // } catch(e) { 483 | // this.log('Humidity ' + name + ' update subscribeCharacteristics ' + characteristic + ' = error', e) 484 | // } 485 | // } 486 | }) 487 | 488 | const connection = await client.subscribeCharacteristics([characteristic]) 489 | 490 | this.log('[update] Humidity ' + name + ' subscribeCharacteristics ' + characteristic + ' = ok') 491 | } catch(e) { 492 | this.log('[update] Humidity ' + name + ' subscribeCharacteristics ' + characteristic + ' = error', e) 493 | } 494 | } 495 | else if((accessoryType === null || accessoryType === type) && type === '00000085-0000-1000-8000-0026BB765291') 496 | { 497 | // Motion 498 | const name = hbAccessory.name; 499 | const hbService = hbAccessory.getServices()[0]; 500 | const characteristic = hbAccessory.characteristic; 501 | const serviceId = hbAccessory.serviceId; 502 | const client = this.clients[serviceId]; 503 | 504 | try { 505 | const result = await client.getCharacteristics([characteristic]) 506 | this.log('[update] Motion ' + hbAccessory.name + ' getCharacteristics ' + characteristic + ' -> ' + result.characteristics[0].value + ' = ok') 507 | 508 | 509 | /* 510 | client.cachedValue = client.cachedValue || {} 511 | client.cachedValue[characteristic] = result.characteristics[0].value 512 | */ 513 | 514 | hbService.setCharacteristic(Characteristic.MotionDetected, result.characteristics[0].value); 515 | } catch(e) { 516 | this.log('[update] Motion ' + hbAccessory.name + ' getCharacteristics ' + characteristic + ' = error', e) 517 | } 518 | 519 | 520 | try { 521 | client 522 | .on('event', event => { 523 | this.log('[event] Motion ' + name + ' got event', event); 524 | 525 | if(event.characteristics && event.characteristics[0]) 526 | { 527 | if(characteristic === event.characteristics[0].aid + '.' + event.characteristics[0].iid) 528 | { 529 | /* 530 | client.cachedValue = client.cachedValue || {} 531 | client.cachedValue[characteristic] = event.characteristics[0].value 532 | */ 533 | 534 | this.log('[event] Motion ' + name + ' setCharacteristic', characteristic, event.characteristics[0].value); 535 | hbService.setCharacteristic(Characteristic.MotionDetected, event.characteristics[0].value); 536 | } 537 | } 538 | }) 539 | .on('disconnect', async () => { 540 | this.log('[disconnect] Motion ' + name + ' disconnected'); 541 | 542 | // let reconnected = false 543 | // while(reconnected) 544 | // { 545 | // await delay(1) 546 | 547 | // try { 548 | // this.log('Motion ' + name + ' reconnecting') 549 | // await client.subscribeCharacteristics([characteristic]) 550 | // this.log('Motion ' + name + ' update subscribeCharacteristics ' + characteristic + ' = ok') 551 | // reconnected = true 552 | // } catch(e) { 553 | // this.log('Motion ' + name + ' update subscribeCharacteristics ' + characteristic + ' = error', e) 554 | // } 555 | 556 | 557 | // } 558 | }) 559 | 560 | const connection = await client.subscribeCharacteristics([characteristic]) 561 | 562 | this.log('[update] Motion ' + name + ' subscribeCharacteristics ' + characteristic + ' = ok') 563 | } catch(e) { 564 | this.log('[update] Motion ' + name + ' subscribeCharacteristics ' + characteristic + ' = error', e) 565 | } 566 | } 567 | } 568 | } 569 | 570 | update(null) 571 | 572 | 573 | callback(this.hbAccessories); 574 | } 575 | -------------------------------------------------------------------------------- /package-lock.json: -------------------------------------------------------------------------------- 1 | { 2 | "name": "homebridge-homekit-controller", 3 | "version": "0.0.1", 4 | "lockfileVersion": 1, 5 | "requires": true, 6 | "dependencies": { 7 | "@abandonware/bluetooth-hci-socket": { 8 | "version": "0.5.3-4", 9 | "resolved": "https://registry.npmjs.org/@abandonware/bluetooth-hci-socket/-/bluetooth-hci-socket-0.5.3-4.tgz", 10 | "integrity": "sha512-hxYIj1qBZVyayJDuN1yhZPzNvuSlCSoFEiWRSZ8nqSvKGQzBddWRTASmlQqVn15G4hHVkjk0xDXjzwUkEgaDyA==", 11 | "optional": true, 12 | "requires": { 13 | "debug": "^4.1.0", 14 | "nan": "^2.14.0", 15 | "node-pre-gyp": "^0.13.0", 16 | "usb": "^1.6.0" 17 | } 18 | }, 19 | "@abandonware/noble": { 20 | "version": "1.9.2-5", 21 | "resolved": "https://registry.npmjs.org/@abandonware/noble/-/noble-1.9.2-5.tgz", 22 | "integrity": "sha512-Y1eyxDoA9kvKeAgd6mQ9c4qDbqQbqlPR56LkbtlAqptGB4HT/8KQweqqyTsj4CtdhbvCAt1G+J+2nE35WU9fBg==", 23 | "requires": { 24 | "@abandonware/bluetooth-hci-socket": "^0.5.3-3", 25 | "debug": "^4.1.1", 26 | "napi-thread-safe-callback": "0.0.6", 27 | "node-addon-api": "^1.1.0" 28 | } 29 | }, 30 | "@cronvel/get-pixels": { 31 | "version": "3.3.1", 32 | "resolved": "https://registry.npmjs.org/@cronvel/get-pixels/-/get-pixels-3.3.1.tgz", 33 | "integrity": "sha512-jgDb8vGPkpjRDbiYyHTI2Bna4HJysjPNSiERzBnRJjCR/YqC3u0idTae0tmNECsaZLOpAWmlK9wiIwnLGIT9Bg==", 34 | "requires": { 35 | "jpeg-js": "^0.1.1", 36 | "ndarray": "^1.0.13", 37 | "ndarray-pack": "^1.1.1", 38 | "node-bitmap": "0.0.1", 39 | "omggif": "^1.0.5", 40 | "pngjs": "^2.0.0" 41 | } 42 | }, 43 | "abbrev": { 44 | "version": "1.1.1", 45 | "resolved": "https://registry.npmjs.org/abbrev/-/abbrev-1.1.1.tgz", 46 | "integrity": "sha512-nne9/IiQ/hzIhY6pdDnbBtz7DjPTKrY00P/zvPSm5pOFkl6xuGrGnXn/VtTNNfNtAfZ9/1RtehkszU9qcTii0Q==", 47 | "optional": true 48 | }, 49 | "ansi-regex": { 50 | "version": "2.1.1", 51 | "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-2.1.1.tgz", 52 | "integrity": "sha1-w7M6te42DYbg5ijwRorn7yfWVN8=", 53 | "optional": true 54 | }, 55 | "aproba": { 56 | "version": "1.2.0", 57 | "resolved": "https://registry.npmjs.org/aproba/-/aproba-1.2.0.tgz", 58 | "integrity": "sha512-Y9J6ZjXtoYh8RnXVCMOU/ttDmk1aBjunq9vO0ta5x85WDQiQfUF9sIPBITdbiiIVcBo03Hi3jMxigBtsddlXRw==", 59 | "optional": true 60 | }, 61 | "are-we-there-yet": { 62 | "version": "1.1.5", 63 | "resolved": "https://registry.npmjs.org/are-we-there-yet/-/are-we-there-yet-1.1.5.tgz", 64 | "integrity": "sha512-5hYdAkZlcG8tOLujVDTgCT+uPX0VnpAH28gWsLfzpXYm7wP6mp5Q/gYyR7YQ0cKVJcXJnl3j2kpBan13PtQf6w==", 65 | "optional": true, 66 | "requires": { 67 | "delegates": "^1.0.0", 68 | "readable-stream": "^2.0.6" 69 | } 70 | }, 71 | "balanced-match": { 72 | "version": "1.0.0", 73 | "resolved": "https://registry.npmjs.org/balanced-match/-/balanced-match-1.0.0.tgz", 74 | "integrity": "sha1-ibTRmasr7kneFk6gK4nORi1xt2c=", 75 | "optional": true 76 | }, 77 | "bindings": { 78 | "version": "1.5.0", 79 | "resolved": "https://registry.npmjs.org/bindings/-/bindings-1.5.0.tgz", 80 | "integrity": "sha512-p2q/t/mhvuOj/UeLlV6566GD/guowlr0hHxClI0W9m7MWYkL1F0hLo+0Aexs9HSPCtR1SXQ0TD3MMKrXZajbiQ==", 81 | "optional": true, 82 | "requires": { 83 | "file-uri-to-path": "1.0.0" 84 | } 85 | }, 86 | "bl": { 87 | "version": "3.0.0", 88 | "resolved": "https://registry.npmjs.org/bl/-/bl-3.0.0.tgz", 89 | "integrity": "sha512-EUAyP5UHU5hxF8BPT0LKW8gjYLhq1DQIcneOX/pL/m2Alo+OYDQAJlHq+yseMP50Os2nHXOSic6Ss3vSQeyf4A==", 90 | "optional": true, 91 | "requires": { 92 | "readable-stream": "^3.0.1" 93 | }, 94 | "dependencies": { 95 | "readable-stream": { 96 | "version": "3.6.0", 97 | "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-3.6.0.tgz", 98 | "integrity": "sha512-BViHy7LKeTz4oNnkcLJ+lVSL6vpiFeX6/d3oSH8zCW7UxP2onchk+vTGB143xuFjHS3deTgkKoXXymXqymiIdA==", 99 | "optional": true, 100 | "requires": { 101 | "inherits": "^2.0.3", 102 | "string_decoder": "^1.1.1", 103 | "util-deprecate": "^1.0.1" 104 | } 105 | } 106 | } 107 | }, 108 | "brace-expansion": { 109 | "version": "1.1.11", 110 | "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.11.tgz", 111 | "integrity": "sha512-iCuPHDFgrHX7H2vEI/5xpz07zSHB00TpugqhmYtVmMO6518mCuRMoOYFldEBl0g187ufozdaHgWKcYFb61qGiA==", 112 | "optional": true, 113 | "requires": { 114 | "balanced-match": "^1.0.0", 115 | "concat-map": "0.0.1" 116 | } 117 | }, 118 | "chownr": { 119 | "version": "1.1.4", 120 | "resolved": "https://registry.npmjs.org/chownr/-/chownr-1.1.4.tgz", 121 | "integrity": "sha512-jJ0bqzaylmJtVnNgzTeSOs8DPavpbYgEr/b0YL8/2GO3xJEhInFmhKMUnEJQjZumK7KXGFhUy89PrsJWlakBVg==", 122 | "optional": true 123 | }, 124 | "chroma-js": { 125 | "version": "2.1.0", 126 | "resolved": "https://registry.npmjs.org/chroma-js/-/chroma-js-2.1.0.tgz", 127 | "integrity": "sha512-uiRdh4ZZy+UTPSrAdp8hqEdVb1EllLtTHOt5TMaOjJUvi+O54/83Fc5K2ld1P+TJX+dw5B+8/sCgzI6eaur/lg==", 128 | "requires": { 129 | "cross-env": "^6.0.3" 130 | } 131 | }, 132 | "code-point-at": { 133 | "version": "1.1.0", 134 | "resolved": "https://registry.npmjs.org/code-point-at/-/code-point-at-1.1.0.tgz", 135 | "integrity": "sha1-DQcLTQQ6W+ozovGkDi7bPZpMz3c=", 136 | "optional": true 137 | }, 138 | "concat-map": { 139 | "version": "0.0.1", 140 | "resolved": "https://registry.npmjs.org/concat-map/-/concat-map-0.0.1.tgz", 141 | "integrity": "sha1-2Klr13/Wjfd5OnMDajug1UBdR3s=", 142 | "optional": true 143 | }, 144 | "console-control-strings": { 145 | "version": "1.1.0", 146 | "resolved": "https://registry.npmjs.org/console-control-strings/-/console-control-strings-1.1.0.tgz", 147 | "integrity": "sha1-PXz0Rk22RG6mRL9LOVB/mFEAjo4=", 148 | "optional": true 149 | }, 150 | "core-util-is": { 151 | "version": "1.0.2", 152 | "resolved": "https://registry.npmjs.org/core-util-is/-/core-util-is-1.0.2.tgz", 153 | "integrity": "sha1-tf1UIgqivFq1eqtxQMlAdUUDwac=", 154 | "optional": true 155 | }, 156 | "cross-env": { 157 | "version": "6.0.3", 158 | "resolved": "https://registry.npmjs.org/cross-env/-/cross-env-6.0.3.tgz", 159 | "integrity": "sha512-+KqxF6LCvfhWvADcDPqo64yVIB31gv/jQulX2NGzKS/g3GEVz6/pt4wjHFtFWsHMddebWD/sDthJemzM4MaAag==", 160 | "requires": { 161 | "cross-spawn": "^7.0.0" 162 | } 163 | }, 164 | "cross-spawn": { 165 | "version": "7.0.1", 166 | "resolved": "https://registry.npmjs.org/cross-spawn/-/cross-spawn-7.0.1.tgz", 167 | "integrity": "sha512-u7v4o84SwFpD32Z8IIcPZ6z1/ie24O6RU3RbtL5Y316l3KuHVPx9ItBgWQ6VlfAFnRnTtMUrsQ9MUUTuEZjogg==", 168 | "requires": { 169 | "path-key": "^3.1.0", 170 | "shebang-command": "^2.0.0", 171 | "which": "^2.0.1" 172 | } 173 | }, 174 | "cwise-compiler": { 175 | "version": "1.1.3", 176 | "resolved": "https://registry.npmjs.org/cwise-compiler/-/cwise-compiler-1.1.3.tgz", 177 | "integrity": "sha1-9NZnQQ6FDToxOn0tt7HlBbsDTMU=", 178 | "requires": { 179 | "uniq": "^1.0.0" 180 | } 181 | }, 182 | "debug": { 183 | "version": "4.1.1", 184 | "resolved": "https://registry.npmjs.org/debug/-/debug-4.1.1.tgz", 185 | "integrity": "sha512-pYAIzeRo8J6KPEaJ0VWOh5Pzkbw/RetuzehGM7QRRX5he4fPHx2rdKMB256ehJCkX+XRQm16eZLqLNS8RSZXZw==", 186 | "requires": { 187 | "ms": "^2.1.1" 188 | } 189 | }, 190 | "decompress-response": { 191 | "version": "4.2.1", 192 | "resolved": "https://registry.npmjs.org/decompress-response/-/decompress-response-4.2.1.tgz", 193 | "integrity": "sha512-jOSne2qbyE+/r8G1VU+G/82LBs2Fs4LAsTiLSHOCOMZQl2OKZ6i8i4IyHemTe+/yIXOtTcRQMzPcgyhoFlqPkw==", 194 | "optional": true, 195 | "requires": { 196 | "mimic-response": "^2.0.0" 197 | } 198 | }, 199 | "deep-extend": { 200 | "version": "0.6.0", 201 | "resolved": "https://registry.npmjs.org/deep-extend/-/deep-extend-0.6.0.tgz", 202 | "integrity": "sha512-LOHxIOaPYdHlJRtCQfDIVZtfw/ufM8+rVj649RIHzcm/vGwQRXFt6OPqIFWsm2XEMrNIEtWR64sY1LEKD2vAOA==", 203 | "optional": true 204 | }, 205 | "delegates": { 206 | "version": "1.0.0", 207 | "resolved": "https://registry.npmjs.org/delegates/-/delegates-1.0.0.tgz", 208 | "integrity": "sha1-hMbhWbgZBP3KWaDvRM2HDTElD5o=", 209 | "optional": true 210 | }, 211 | "detect-libc": { 212 | "version": "1.0.3", 213 | "resolved": "https://registry.npmjs.org/detect-libc/-/detect-libc-1.0.3.tgz", 214 | "integrity": "sha1-+hN8S9aY7fVc1c0CrFWfkaTEups=", 215 | "optional": true 216 | }, 217 | "dnssd": { 218 | "version": "0.4.1", 219 | "resolved": "https://registry.npmjs.org/dnssd/-/dnssd-0.4.1.tgz", 220 | "integrity": "sha512-mEz5Ii+o+k3kYHTXY6fTLOjCwraX8TQowIgUySAbEYuGqtSMbfBc/tvDZ8wGPywnmlLE6/XeXi6qPcAKVTvPUQ==" 221 | }, 222 | "end-of-stream": { 223 | "version": "1.4.4", 224 | "resolved": "https://registry.npmjs.org/end-of-stream/-/end-of-stream-1.4.4.tgz", 225 | "integrity": "sha512-+uw1inIHVPQoaVuHzRyXd21icM+cnt4CzD5rW+NC1wjOUSTOs+Te7FOv7AhN7vS9x/oIyhLP5PR1H+phQAHu5Q==", 226 | "optional": true, 227 | "requires": { 228 | "once": "^1.4.0" 229 | } 230 | }, 231 | "expand-template": { 232 | "version": "2.0.3", 233 | "resolved": "https://registry.npmjs.org/expand-template/-/expand-template-2.0.3.tgz", 234 | "integrity": "sha512-XYfuKMvj4O35f/pOXLObndIRvyQ+/+6AhODh+OKWj9S9498pHHn/IMszH+gt0fBCRWMNfk1ZSp5x3AifmnI2vg==", 235 | "optional": true 236 | }, 237 | "fast-srp-hap": { 238 | "version": "1.0.1", 239 | "resolved": "https://registry.npmjs.org/fast-srp-hap/-/fast-srp-hap-1.0.1.tgz", 240 | "integrity": "sha1-N3Ek0Za8alFXquWze/X6NbtK0tk=" 241 | }, 242 | "file-uri-to-path": { 243 | "version": "1.0.0", 244 | "resolved": "https://registry.npmjs.org/file-uri-to-path/-/file-uri-to-path-1.0.0.tgz", 245 | "integrity": "sha512-0Zt+s3L7Vf1biwWZ29aARiVYLx7iMGnEUl9x33fbB/j3jR81u/O2LbqK+Bm1CDSNDKVtJ/YjwY7TUd5SkeLQLw==", 246 | "optional": true 247 | }, 248 | "fs-constants": { 249 | "version": "1.0.0", 250 | "resolved": "https://registry.npmjs.org/fs-constants/-/fs-constants-1.0.0.tgz", 251 | "integrity": "sha512-y6OAwoSIf7FyjMIv94u+b5rdheZEjzR63GTyZJm5qh4Bi+2YgwLCcI/fPFZkL5PSixOt6ZNKm+w+Hfp/Bciwow==", 252 | "optional": true 253 | }, 254 | "fs-minipass": { 255 | "version": "1.2.7", 256 | "resolved": "https://registry.npmjs.org/fs-minipass/-/fs-minipass-1.2.7.tgz", 257 | "integrity": "sha512-GWSSJGFy4e9GUeCcbIkED+bgAoFyj7XF1mV8rma3QW4NIqX9Kyx79N/PF61H5udOV3aY1IaMLs6pGbH71nlCTA==", 258 | "optional": true, 259 | "requires": { 260 | "minipass": "^2.6.0" 261 | } 262 | }, 263 | "fs.realpath": { 264 | "version": "1.0.0", 265 | "resolved": "https://registry.npmjs.org/fs.realpath/-/fs.realpath-1.0.0.tgz", 266 | "integrity": "sha1-FQStJSMVjKpA20onh8sBQRmU6k8=", 267 | "optional": true 268 | }, 269 | "gauge": { 270 | "version": "2.7.4", 271 | "resolved": "https://registry.npmjs.org/gauge/-/gauge-2.7.4.tgz", 272 | "integrity": "sha1-LANAXHU4w51+s3sxcCLjJfsBi/c=", 273 | "optional": true, 274 | "requires": { 275 | "aproba": "^1.0.3", 276 | "console-control-strings": "^1.0.0", 277 | "has-unicode": "^2.0.0", 278 | "object-assign": "^4.1.0", 279 | "signal-exit": "^3.0.0", 280 | "string-width": "^1.0.1", 281 | "strip-ansi": "^3.0.1", 282 | "wide-align": "^1.1.0" 283 | } 284 | }, 285 | "github-from-package": { 286 | "version": "0.0.0", 287 | "resolved": "https://registry.npmjs.org/github-from-package/-/github-from-package-0.0.0.tgz", 288 | "integrity": "sha1-l/tdlr/eiXMxPyDoKI75oWf6ZM4=", 289 | "optional": true 290 | }, 291 | "glob": { 292 | "version": "7.1.6", 293 | "resolved": "https://registry.npmjs.org/glob/-/glob-7.1.6.tgz", 294 | "integrity": "sha512-LwaxwyZ72Lk7vZINtNNrywX0ZuLyStrdDtabefZKAY5ZGJhVtgdznluResxNmPitE0SAO+O26sWTHeKSI2wMBA==", 295 | "optional": true, 296 | "requires": { 297 | "fs.realpath": "^1.0.0", 298 | "inflight": "^1.0.4", 299 | "inherits": "2", 300 | "minimatch": "^3.0.4", 301 | "once": "^1.3.0", 302 | "path-is-absolute": "^1.0.0" 303 | } 304 | }, 305 | "hap-controller": { 306 | "version": "github:MartinPham/hap-controller-node#978fbacd16d685aad95e93453d2d3255a79dcc47", 307 | "from": "github:MartinPham/hap-controller-node#patch-2", 308 | "requires": { 309 | "@abandonware/noble": "^1.9.2-5", 310 | "dnssd": "^0.4.1", 311 | "fast-srp-hap": "^1.0.1", 312 | "hkdf": "0.0.2", 313 | "http-parser-js": "^0.5.2", 314 | "libsodium-wrappers": "^0.7.6", 315 | "uuid": "^3.4.0" 316 | } 317 | }, 318 | "has-unicode": { 319 | "version": "2.0.1", 320 | "resolved": "https://registry.npmjs.org/has-unicode/-/has-unicode-2.0.1.tgz", 321 | "integrity": "sha1-4Ob+aijPUROIVeCG0Wkedx3iqLk=", 322 | "optional": true 323 | }, 324 | "hkdf": { 325 | "version": "0.0.2", 326 | "resolved": "https://registry.npmjs.org/hkdf/-/hkdf-0.0.2.tgz", 327 | "integrity": "sha1-L422Ff3vhwIB+C0rYZym00fQZH4=" 328 | }, 329 | "http-parser-js": { 330 | "version": "0.5.2", 331 | "resolved": "https://registry.npmjs.org/http-parser-js/-/http-parser-js-0.5.2.tgz", 332 | "integrity": "sha512-opCO9ASqg5Wy2FNo7A0sxy71yGbbkJJXLdgMK04Tcypw9jr2MgWbyubb0+WdmDmGnFflO7fRbqbaihh/ENDlRQ==" 333 | }, 334 | "iconv-lite": { 335 | "version": "0.4.24", 336 | "resolved": "https://registry.npmjs.org/iconv-lite/-/iconv-lite-0.4.24.tgz", 337 | "integrity": "sha512-v3MXnZAcvnywkTUEZomIActle7RXXeedOR31wwl7VlyoXO4Qi9arvSenNQWne1TcRwhCL1HwLI21bEqdpj8/rA==", 338 | "optional": true, 339 | "requires": { 340 | "safer-buffer": ">= 2.1.2 < 3" 341 | } 342 | }, 343 | "ignore-walk": { 344 | "version": "3.0.3", 345 | "resolved": "https://registry.npmjs.org/ignore-walk/-/ignore-walk-3.0.3.tgz", 346 | "integrity": "sha512-m7o6xuOaT1aqheYHKf8W6J5pYH85ZI9w077erOzLje3JsB1gkafkAhHHY19dqjulgIZHFm32Cp5uNZgcQqdJKw==", 347 | "optional": true, 348 | "requires": { 349 | "minimatch": "^3.0.4" 350 | } 351 | }, 352 | "inflight": { 353 | "version": "1.0.6", 354 | "resolved": "https://registry.npmjs.org/inflight/-/inflight-1.0.6.tgz", 355 | "integrity": "sha1-Sb1jMdfQLQwJvJEKEHW6gWW1bfk=", 356 | "optional": true, 357 | "requires": { 358 | "once": "^1.3.0", 359 | "wrappy": "1" 360 | } 361 | }, 362 | "inherits": { 363 | "version": "2.0.4", 364 | "resolved": "https://registry.npmjs.org/inherits/-/inherits-2.0.4.tgz", 365 | "integrity": "sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ==", 366 | "optional": true 367 | }, 368 | "ini": { 369 | "version": "1.3.5", 370 | "resolved": "https://registry.npmjs.org/ini/-/ini-1.3.5.tgz", 371 | "integrity": "sha512-RZY5huIKCMRWDUqZlEi72f/lmXKMvuszcMBduliQ3nnWbx9X/ZBQO7DijMEYS9EhHBb2qacRUMtC7svLwe0lcw==", 372 | "optional": true 373 | }, 374 | "iota-array": { 375 | "version": "1.0.0", 376 | "resolved": "https://registry.npmjs.org/iota-array/-/iota-array-1.0.0.tgz", 377 | "integrity": "sha1-ge9X/l0FgUzVjCSDYyqZwwoOgIc=" 378 | }, 379 | "is-buffer": { 380 | "version": "1.1.6", 381 | "resolved": "https://registry.npmjs.org/is-buffer/-/is-buffer-1.1.6.tgz", 382 | "integrity": "sha512-NcdALwpXkTm5Zvvbk7owOUSvVvBKDgKP5/ewfXEznmQFfs4ZRmanOeKBTjRVjka3QFoN6XJ+9F3USqfHqTaU5w==" 383 | }, 384 | "is-fullwidth-code-point": { 385 | "version": "1.0.0", 386 | "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-1.0.0.tgz", 387 | "integrity": "sha1-754xOG8DGn8NZDr4L95QxFfvAMs=", 388 | "optional": true, 389 | "requires": { 390 | "number-is-nan": "^1.0.0" 391 | } 392 | }, 393 | "isarray": { 394 | "version": "1.0.0", 395 | "resolved": "https://registry.npmjs.org/isarray/-/isarray-1.0.0.tgz", 396 | "integrity": "sha1-u5NdSFgsuhaMBoNJV6VKPgcSTxE=", 397 | "optional": true 398 | }, 399 | "isexe": { 400 | "version": "2.0.0", 401 | "resolved": "https://registry.npmjs.org/isexe/-/isexe-2.0.0.tgz", 402 | "integrity": "sha1-6PvzdNxVb/iUehDcsFctYz8s+hA=" 403 | }, 404 | "jpeg-js": { 405 | "version": "0.1.2", 406 | "resolved": "https://registry.npmjs.org/jpeg-js/-/jpeg-js-0.1.2.tgz", 407 | "integrity": "sha1-E1uZLAV1yYXPoPSUoyJ+0jhYPs4=" 408 | }, 409 | "lazyness": { 410 | "version": "1.1.1", 411 | "resolved": "https://registry.npmjs.org/lazyness/-/lazyness-1.1.1.tgz", 412 | "integrity": "sha512-rYHC6l6LeRlJSt5jxpqN8z/49gZ0CqLi89HAGzJjHahCFlqEjFGFN9O15hmzSzUGFl7zN/vOWduv/+0af3r/kQ==" 413 | }, 414 | "libsodium": { 415 | "version": "0.7.6", 416 | "resolved": "https://registry.npmjs.org/libsodium/-/libsodium-0.7.6.tgz", 417 | "integrity": "sha512-hPb/04sEuLcTRdWDtd+xH3RXBihpmbPCsKW/Jtf4PsvdyKh+D6z2D2gvp/5BfoxseP+0FCOg66kE+0oGUE/loQ==" 418 | }, 419 | "libsodium-wrappers": { 420 | "version": "0.7.6", 421 | "resolved": "https://registry.npmjs.org/libsodium-wrappers/-/libsodium-wrappers-0.7.6.tgz", 422 | "integrity": "sha512-OUO2CWW5bHdLr6hkKLHIKI4raEkZrf3QHkhXsJ1yCh6MZ3JDA7jFD3kCATNquuGSG6MjjPHQIQms0y0gBDzjQg==", 423 | "requires": { 424 | "libsodium": "0.7.6" 425 | } 426 | }, 427 | "mimic-response": { 428 | "version": "2.0.0", 429 | "resolved": "https://registry.npmjs.org/mimic-response/-/mimic-response-2.0.0.tgz", 430 | "integrity": "sha512-8ilDoEapqA4uQ3TwS0jakGONKXVJqpy+RpM+3b7pLdOjghCrEiGp9SRkFbUHAmZW9vdnrENWHjaweIoTIJExSQ==", 431 | "optional": true 432 | }, 433 | "minimatch": { 434 | "version": "3.0.4", 435 | "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.0.4.tgz", 436 | "integrity": "sha512-yJHVQEhyqPLUTgt9B83PXu6W3rx4MvvHvSUvToogpwoGDOUQ+yDrR0HRot+yOCdCO7u4hX3pWft6kWBBcqh0UA==", 437 | "optional": true, 438 | "requires": { 439 | "brace-expansion": "^1.1.7" 440 | } 441 | }, 442 | "minimist": { 443 | "version": "0.0.8", 444 | "resolved": "https://registry.npmjs.org/minimist/-/minimist-0.0.8.tgz", 445 | "integrity": "sha1-hX/Kv8M5fSYluCKCYuhqp6ARsF0=", 446 | "optional": true 447 | }, 448 | "minipass": { 449 | "version": "2.9.0", 450 | "resolved": "https://registry.npmjs.org/minipass/-/minipass-2.9.0.tgz", 451 | "integrity": "sha512-wxfUjg9WebH+CUDX/CdbRlh5SmfZiy/hpkxaRI16Y9W56Pa75sWgd/rvFilSgrauD9NyFymP/+JFV3KwzIsJeg==", 452 | "optional": true, 453 | "requires": { 454 | "safe-buffer": "^5.1.2", 455 | "yallist": "^3.0.0" 456 | } 457 | }, 458 | "minizlib": { 459 | "version": "1.3.3", 460 | "resolved": "https://registry.npmjs.org/minizlib/-/minizlib-1.3.3.tgz", 461 | "integrity": "sha512-6ZYMOEnmVsdCeTJVE0W9ZD+pVnE8h9Hma/iOwwRDsdQoePpoX56/8B6z3P9VNwppJuBKNRuFDRNRqRWexT9G9Q==", 462 | "optional": true, 463 | "requires": { 464 | "minipass": "^2.9.0" 465 | } 466 | }, 467 | "mkdirp": { 468 | "version": "0.5.1", 469 | "resolved": "https://registry.npmjs.org/mkdirp/-/mkdirp-0.5.1.tgz", 470 | "integrity": "sha1-MAV0OOrGz3+MR2fzhkjWaX11yQM=", 471 | "optional": true, 472 | "requires": { 473 | "minimist": "0.0.8" 474 | } 475 | }, 476 | "ms": { 477 | "version": "2.1.2", 478 | "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.2.tgz", 479 | "integrity": "sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w==" 480 | }, 481 | "nan": { 482 | "version": "2.14.0", 483 | "resolved": "https://registry.npmjs.org/nan/-/nan-2.14.0.tgz", 484 | "integrity": "sha512-INOFj37C7k3AfaNTtX8RhsTw7qRy7eLET14cROi9+5HAVbbHuIWUHEauBv5qT4Av2tWasiTY1Jw6puUNqRJXQg==", 485 | "optional": true 486 | }, 487 | "napi-build-utils": { 488 | "version": "1.0.1", 489 | "resolved": "https://registry.npmjs.org/napi-build-utils/-/napi-build-utils-1.0.1.tgz", 490 | "integrity": "sha512-boQj1WFgQH3v4clhu3mTNfP+vOBxorDlE8EKiMjUlLG3C4qAESnn9AxIOkFgTR2c9LtzNjPrjS60cT27ZKBhaA==", 491 | "optional": true 492 | }, 493 | "napi-thread-safe-callback": { 494 | "version": "0.0.6", 495 | "resolved": "https://registry.npmjs.org/napi-thread-safe-callback/-/napi-thread-safe-callback-0.0.6.tgz", 496 | "integrity": "sha512-X7uHCOCdY4u0yamDxDrv3jF2NtYc8A1nvPzBQgvpoSX+WB3jAe2cVNsY448V1ucq7Whf9Wdy02HEUoLW5rJKWg==" 497 | }, 498 | "ndarray": { 499 | "version": "1.0.19", 500 | "resolved": "https://registry.npmjs.org/ndarray/-/ndarray-1.0.19.tgz", 501 | "integrity": "sha512-B4JHA4vdyZU30ELBw3g7/p9bZupyew5a7tX1Y/gGeF2hafrPaQZhgrGQfsvgfYbgdFZjYwuEcnaobeM/WMW+HQ==", 502 | "requires": { 503 | "iota-array": "^1.0.0", 504 | "is-buffer": "^1.0.2" 505 | } 506 | }, 507 | "ndarray-pack": { 508 | "version": "1.2.1", 509 | "resolved": "https://registry.npmjs.org/ndarray-pack/-/ndarray-pack-1.2.1.tgz", 510 | "integrity": "sha1-jK6+qqJNXs9w/4YCBjeXfajuWFo=", 511 | "requires": { 512 | "cwise-compiler": "^1.1.2", 513 | "ndarray": "^1.0.13" 514 | } 515 | }, 516 | "needle": { 517 | "version": "2.3.2", 518 | "resolved": "https://registry.npmjs.org/needle/-/needle-2.3.2.tgz", 519 | "integrity": "sha512-DUzITvPVDUy6vczKKYTnWc/pBZ0EnjMJnQ3y+Jo5zfKFimJs7S3HFCxCRZYB9FUZcrzUQr3WsmvZgddMEIZv6w==", 520 | "optional": true, 521 | "requires": { 522 | "debug": "^3.2.6", 523 | "iconv-lite": "^0.4.4", 524 | "sax": "^1.2.4" 525 | }, 526 | "dependencies": { 527 | "debug": { 528 | "version": "3.2.6", 529 | "resolved": "https://registry.npmjs.org/debug/-/debug-3.2.6.tgz", 530 | "integrity": "sha512-mel+jf7nrtEl5Pn1Qx46zARXKDpBbvzezse7p7LqINmdoIk8PYP5SySaxEmYv6TZ0JyEKA1hsCId6DIhgITtWQ==", 531 | "optional": true, 532 | "requires": { 533 | "ms": "^2.1.1" 534 | } 535 | } 536 | } 537 | }, 538 | "nextgen-events": { 539 | "version": "1.3.0", 540 | "resolved": "https://registry.npmjs.org/nextgen-events/-/nextgen-events-1.3.0.tgz", 541 | "integrity": "sha512-eBz5mrO4Hw2eenPVm0AVPHuAzg/RZetAWMI547RH8O9+a0UYhCysiZ3KoNWslnWNlHetb9kzowEshsKsmFo2YQ==" 542 | }, 543 | "node-abi": { 544 | "version": "2.15.0", 545 | "resolved": "https://registry.npmjs.org/node-abi/-/node-abi-2.15.0.tgz", 546 | "integrity": "sha512-FeLpTS0F39U7hHZU1srAK4Vx+5AHNVOTP+hxBNQknR/54laTHSFIJkDWDqiquY1LeLUgTfPN7sLPhMubx0PLAg==", 547 | "optional": true, 548 | "requires": { 549 | "semver": "^5.4.1" 550 | } 551 | }, 552 | "node-addon-api": { 553 | "version": "1.7.1", 554 | "resolved": "https://registry.npmjs.org/node-addon-api/-/node-addon-api-1.7.1.tgz", 555 | "integrity": "sha512-2+DuKodWvwRTrCfKOeR24KIc5unKjOh8mz17NCzVnHWfjAdDqbfbjqh7gUT+BkXBRQM52+xCHciKWonJ3CbJMQ==" 556 | }, 557 | "node-bitmap": { 558 | "version": "0.0.1", 559 | "resolved": "https://registry.npmjs.org/node-bitmap/-/node-bitmap-0.0.1.tgz", 560 | "integrity": "sha1-GA6scAPgxwdhjvMTaPYvhLKmkJE=" 561 | }, 562 | "node-pre-gyp": { 563 | "version": "0.13.0", 564 | "resolved": "https://registry.npmjs.org/node-pre-gyp/-/node-pre-gyp-0.13.0.tgz", 565 | "integrity": "sha512-Md1D3xnEne8b/HGVQkZZwV27WUi1ZRuZBij24TNaZwUPU3ZAFtvT6xxJGaUVillfmMKnn5oD1HoGsp2Ftik7SQ==", 566 | "optional": true, 567 | "requires": { 568 | "detect-libc": "^1.0.2", 569 | "mkdirp": "^0.5.1", 570 | "needle": "^2.2.1", 571 | "nopt": "^4.0.1", 572 | "npm-packlist": "^1.1.6", 573 | "npmlog": "^4.0.2", 574 | "rc": "^1.2.7", 575 | "rimraf": "^2.6.1", 576 | "semver": "^5.3.0", 577 | "tar": "^4" 578 | } 579 | }, 580 | "noop-logger": { 581 | "version": "0.1.1", 582 | "resolved": "https://registry.npmjs.org/noop-logger/-/noop-logger-0.1.1.tgz", 583 | "integrity": "sha1-lKKxYzxPExdVMAfYlm/Q6EG2pMI=", 584 | "optional": true 585 | }, 586 | "nopt": { 587 | "version": "4.0.1", 588 | "resolved": "https://registry.npmjs.org/nopt/-/nopt-4.0.1.tgz", 589 | "integrity": "sha1-0NRoWv1UFRk8jHUFYC0NF81kR00=", 590 | "optional": true, 591 | "requires": { 592 | "abbrev": "1", 593 | "osenv": "^0.1.4" 594 | } 595 | }, 596 | "npm-bundled": { 597 | "version": "1.1.1", 598 | "resolved": "https://registry.npmjs.org/npm-bundled/-/npm-bundled-1.1.1.tgz", 599 | "integrity": "sha512-gqkfgGePhTpAEgUsGEgcq1rqPXA+tv/aVBlgEzfXwA1yiUJF7xtEt3CtVwOjNYQOVknDk0F20w58Fnm3EtG0fA==", 600 | "optional": true, 601 | "requires": { 602 | "npm-normalize-package-bin": "^1.0.1" 603 | } 604 | }, 605 | "npm-normalize-package-bin": { 606 | "version": "1.0.1", 607 | "resolved": "https://registry.npmjs.org/npm-normalize-package-bin/-/npm-normalize-package-bin-1.0.1.tgz", 608 | "integrity": "sha512-EPfafl6JL5/rU+ot6P3gRSCpPDW5VmIzX959Ob1+ySFUuuYHWHekXpwdUZcKP5C+DS4GEtdJluwBjnsNDl+fSA==", 609 | "optional": true 610 | }, 611 | "npm-packlist": { 612 | "version": "1.4.8", 613 | "resolved": "https://registry.npmjs.org/npm-packlist/-/npm-packlist-1.4.8.tgz", 614 | "integrity": "sha512-5+AZgwru5IevF5ZdnFglB5wNlHG1AOOuw28WhUq8/8emhBmLv6jX5by4WJCh7lW0uSYZYS6DXqIsyZVIXRZU9A==", 615 | "optional": true, 616 | "requires": { 617 | "ignore-walk": "^3.0.1", 618 | "npm-bundled": "^1.0.1", 619 | "npm-normalize-package-bin": "^1.0.1" 620 | } 621 | }, 622 | "npmlog": { 623 | "version": "4.1.2", 624 | "resolved": "https://registry.npmjs.org/npmlog/-/npmlog-4.1.2.tgz", 625 | "integrity": "sha512-2uUqazuKlTaSI/dC8AzicUck7+IrEaOnN/e0jd3Xtt1KcGpwx30v50mL7oPyr/h9bL3E4aZccVwpwP+5W9Vjkg==", 626 | "optional": true, 627 | "requires": { 628 | "are-we-there-yet": "~1.1.2", 629 | "console-control-strings": "~1.1.0", 630 | "gauge": "~2.7.3", 631 | "set-blocking": "~2.0.0" 632 | } 633 | }, 634 | "number-is-nan": { 635 | "version": "1.0.1", 636 | "resolved": "https://registry.npmjs.org/number-is-nan/-/number-is-nan-1.0.1.tgz", 637 | "integrity": "sha1-CXtgK1NCKlIsGvuHkDGDNpQaAR0=", 638 | "optional": true 639 | }, 640 | "object-assign": { 641 | "version": "4.1.1", 642 | "resolved": "https://registry.npmjs.org/object-assign/-/object-assign-4.1.1.tgz", 643 | "integrity": "sha1-IQmtx5ZYh8/AXLvUQsrIv7s2CGM=", 644 | "optional": true 645 | }, 646 | "omggif": { 647 | "version": "1.0.10", 648 | "resolved": "https://registry.npmjs.org/omggif/-/omggif-1.0.10.tgz", 649 | "integrity": "sha512-LMJTtvgc/nugXj0Vcrrs68Mn2D1r0zf630VNtqtpI1FEO7e+O9FP4gqs9AcnBaSEeoHIPm28u6qgPR0oyEpGSw==" 650 | }, 651 | "once": { 652 | "version": "1.4.0", 653 | "resolved": "https://registry.npmjs.org/once/-/once-1.4.0.tgz", 654 | "integrity": "sha1-WDsap3WWHUsROsF9nFC6753Xa9E=", 655 | "optional": true, 656 | "requires": { 657 | "wrappy": "1" 658 | } 659 | }, 660 | "os-homedir": { 661 | "version": "1.0.2", 662 | "resolved": "https://registry.npmjs.org/os-homedir/-/os-homedir-1.0.2.tgz", 663 | "integrity": "sha1-/7xJiDNuDoM94MFox+8VISGqf7M=", 664 | "optional": true 665 | }, 666 | "os-tmpdir": { 667 | "version": "1.0.2", 668 | "resolved": "https://registry.npmjs.org/os-tmpdir/-/os-tmpdir-1.0.2.tgz", 669 | "integrity": "sha1-u+Z0BseaqFxc/sdm/lc0VV36EnQ=", 670 | "optional": true 671 | }, 672 | "osenv": { 673 | "version": "0.1.5", 674 | "resolved": "https://registry.npmjs.org/osenv/-/osenv-0.1.5.tgz", 675 | "integrity": "sha512-0CWcCECdMVc2Rw3U5w9ZjqX6ga6ubk1xDVKxtBQPK7wis/0F2r9T6k4ydGYhecl7YUBxBVxhL5oisPsNxAPe2g==", 676 | "optional": true, 677 | "requires": { 678 | "os-homedir": "^1.0.0", 679 | "os-tmpdir": "^1.0.0" 680 | } 681 | }, 682 | "path-is-absolute": { 683 | "version": "1.0.1", 684 | "resolved": "https://registry.npmjs.org/path-is-absolute/-/path-is-absolute-1.0.1.tgz", 685 | "integrity": "sha1-F0uSaHNVNP+8es5r9TpanhtcX18=", 686 | "optional": true 687 | }, 688 | "path-key": { 689 | "version": "3.1.1", 690 | "resolved": "https://registry.npmjs.org/path-key/-/path-key-3.1.1.tgz", 691 | "integrity": "sha512-ojmeN0qd+y0jszEtoY48r0Peq5dwMEkIlCOu6Q5f41lfkswXuKtYrhgoTpLnyIcHm24Uhqx+5Tqm2InSwLhE6Q==" 692 | }, 693 | "pngjs": { 694 | "version": "2.3.1", 695 | "resolved": "https://registry.npmjs.org/pngjs/-/pngjs-2.3.1.tgz", 696 | "integrity": "sha1-EdHhK5y2TWPjDBQ6Mw9MH1Z9qF8=" 697 | }, 698 | "prebuild-install": { 699 | "version": "5.3.3", 700 | "resolved": "https://registry.npmjs.org/prebuild-install/-/prebuild-install-5.3.3.tgz", 701 | "integrity": "sha512-GV+nsUXuPW2p8Zy7SarF/2W/oiK8bFQgJcncoJ0d7kRpekEA0ftChjfEaF9/Y+QJEc/wFR7RAEa8lYByuUIe2g==", 702 | "optional": true, 703 | "requires": { 704 | "detect-libc": "^1.0.3", 705 | "expand-template": "^2.0.3", 706 | "github-from-package": "0.0.0", 707 | "minimist": "^1.2.0", 708 | "mkdirp": "^0.5.1", 709 | "napi-build-utils": "^1.0.1", 710 | "node-abi": "^2.7.0", 711 | "noop-logger": "^0.1.1", 712 | "npmlog": "^4.0.1", 713 | "pump": "^3.0.0", 714 | "rc": "^1.2.7", 715 | "simple-get": "^3.0.3", 716 | "tar-fs": "^2.0.0", 717 | "tunnel-agent": "^0.6.0", 718 | "which-pm-runs": "^1.0.0" 719 | }, 720 | "dependencies": { 721 | "minimist": { 722 | "version": "1.2.0", 723 | "resolved": "https://registry.npmjs.org/minimist/-/minimist-1.2.0.tgz", 724 | "integrity": "sha1-o1AIsg9BOD7sH7kU9M1d95omQoQ=", 725 | "optional": true 726 | } 727 | } 728 | }, 729 | "process-nextick-args": { 730 | "version": "2.0.1", 731 | "resolved": "https://registry.npmjs.org/process-nextick-args/-/process-nextick-args-2.0.1.tgz", 732 | "integrity": "sha512-3ouUOpQhtgrbOa17J7+uxOTpITYWaGP7/AhoR3+A+/1e9skrzelGi/dXzEYyvbxubEF6Wn2ypscTKiKJFFn1ag==", 733 | "optional": true 734 | }, 735 | "pump": { 736 | "version": "3.0.0", 737 | "resolved": "https://registry.npmjs.org/pump/-/pump-3.0.0.tgz", 738 | "integrity": "sha512-LwZy+p3SFs1Pytd/jYct4wpv49HiYCqd9Rlc5ZVdk0V+8Yzv6jR5Blk3TRmPL1ft69TxP0IMZGJ+WPFU2BFhww==", 739 | "optional": true, 740 | "requires": { 741 | "end-of-stream": "^1.1.0", 742 | "once": "^1.3.1" 743 | } 744 | }, 745 | "rc": { 746 | "version": "1.2.8", 747 | "resolved": "https://registry.npmjs.org/rc/-/rc-1.2.8.tgz", 748 | "integrity": "sha512-y3bGgqKj3QBdxLbLkomlohkvsA8gdAiUQlSBJnBhfn+BPxg4bc62d8TcBW15wavDfgexCgccckhcZvywyQYPOw==", 749 | "optional": true, 750 | "requires": { 751 | "deep-extend": "^0.6.0", 752 | "ini": "~1.3.0", 753 | "minimist": "^1.2.0", 754 | "strip-json-comments": "~2.0.1" 755 | }, 756 | "dependencies": { 757 | "minimist": { 758 | "version": "1.2.0", 759 | "resolved": "https://registry.npmjs.org/minimist/-/minimist-1.2.0.tgz", 760 | "integrity": "sha1-o1AIsg9BOD7sH7kU9M1d95omQoQ=", 761 | "optional": true 762 | } 763 | } 764 | }, 765 | "readable-stream": { 766 | "version": "2.3.7", 767 | "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-2.3.7.tgz", 768 | "integrity": "sha512-Ebho8K4jIbHAxnuxi7o42OrZgF/ZTNcsZj6nRKyUmkhLFq8CHItp/fy6hQZuZmP/n3yZ9VBUbp4zz/mX8hmYPw==", 769 | "optional": true, 770 | "requires": { 771 | "core-util-is": "~1.0.0", 772 | "inherits": "~2.0.3", 773 | "isarray": "~1.0.0", 774 | "process-nextick-args": "~2.0.0", 775 | "safe-buffer": "~5.1.1", 776 | "string_decoder": "~1.1.1", 777 | "util-deprecate": "~1.0.1" 778 | } 779 | }, 780 | "rimraf": { 781 | "version": "2.7.1", 782 | "resolved": "https://registry.npmjs.org/rimraf/-/rimraf-2.7.1.tgz", 783 | "integrity": "sha512-uWjbaKIK3T1OSVptzX7Nl6PvQ3qAGtKEtVRjRuazjfL3Bx5eI409VZSqgND+4UNnmzLVdPj9FqFJNPqBZFve4w==", 784 | "optional": true, 785 | "requires": { 786 | "glob": "^7.1.3" 787 | } 788 | }, 789 | "safe-buffer": { 790 | "version": "5.1.2", 791 | "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.1.2.tgz", 792 | "integrity": "sha512-Gd2UZBJDkXlY7GbJxfsE8/nvKkUEU1G38c1siN6QP6a9PT9MmHB8GnpscSmMJSoF8LOIrt8ud/wPtojys4G6+g==", 793 | "optional": true 794 | }, 795 | "safer-buffer": { 796 | "version": "2.1.2", 797 | "resolved": "https://registry.npmjs.org/safer-buffer/-/safer-buffer-2.1.2.tgz", 798 | "integrity": "sha512-YZo3K82SD7Riyi0E1EQPojLz7kpepnSQI9IyPbHHg1XXXevb5dJI7tpyN2ADxGcQbHG7vcyRHk0cbwqcQriUtg==", 799 | "optional": true 800 | }, 801 | "sax": { 802 | "version": "1.2.4", 803 | "resolved": "https://registry.npmjs.org/sax/-/sax-1.2.4.tgz", 804 | "integrity": "sha512-NqVDv9TpANUjFm0N8uM5GxL36UgKi9/atZw+x7YFnQ8ckwFGKrl4xX4yWtrey3UJm5nP1kUbnYgLopqWNSRhWw==", 805 | "optional": true 806 | }, 807 | "semver": { 808 | "version": "5.7.1", 809 | "resolved": "https://registry.npmjs.org/semver/-/semver-5.7.1.tgz", 810 | "integrity": "sha512-sauaDf/PZdVgrLTNYHRtpXa1iRiKcaebiKQ1BJdpQlWH2lCvexQdX55snPFyK7QzpudqbCI0qXFfOasHdyNDGQ==", 811 | "optional": true 812 | }, 813 | "set-blocking": { 814 | "version": "2.0.0", 815 | "resolved": "https://registry.npmjs.org/set-blocking/-/set-blocking-2.0.0.tgz", 816 | "integrity": "sha1-BF+XgtARrppoA93TgrJDkrPYkPc=", 817 | "optional": true 818 | }, 819 | "setimmediate": { 820 | "version": "1.0.5", 821 | "resolved": "https://registry.npmjs.org/setimmediate/-/setimmediate-1.0.5.tgz", 822 | "integrity": "sha1-KQy7Iy4waULX1+qbg3Mqt4VvgoU=" 823 | }, 824 | "seventh": { 825 | "version": "0.7.34", 826 | "resolved": "https://registry.npmjs.org/seventh/-/seventh-0.7.34.tgz", 827 | "integrity": "sha512-9YR6YjZIckltwsfomtsUuyHEGSx7gNHdXDX+hPmvVeHJLiGpFnLRm3izKWCVjb70cYZYUfdlA9osUEqtH/J6uQ==", 828 | "requires": { 829 | "setimmediate": "^1.0.5" 830 | } 831 | }, 832 | "shebang-command": { 833 | "version": "2.0.0", 834 | "resolved": "https://registry.npmjs.org/shebang-command/-/shebang-command-2.0.0.tgz", 835 | "integrity": "sha512-kHxr2zZpYtdmrN1qDjrrX/Z1rR1kG8Dx+gkpK1G4eXmvXswmcE1hTWBWYUzlraYw1/yZp6YuDY77YtvbN0dmDA==", 836 | "requires": { 837 | "shebang-regex": "^3.0.0" 838 | } 839 | }, 840 | "shebang-regex": { 841 | "version": "3.0.0", 842 | "resolved": "https://registry.npmjs.org/shebang-regex/-/shebang-regex-3.0.0.tgz", 843 | "integrity": "sha512-7++dFhtcx3353uBaq8DDR4NuxBetBzC7ZQOhmTQInHEd6bSrXdiEyzCvG07Z44UYdLShWUyXt5M/yhz8ekcb1A==" 844 | }, 845 | "signal-exit": { 846 | "version": "3.0.2", 847 | "resolved": "https://registry.npmjs.org/signal-exit/-/signal-exit-3.0.2.tgz", 848 | "integrity": "sha1-tf3AjxKH6hF4Yo5BXiUTK3NkbG0=", 849 | "optional": true 850 | }, 851 | "simple-concat": { 852 | "version": "1.0.0", 853 | "resolved": "https://registry.npmjs.org/simple-concat/-/simple-concat-1.0.0.tgz", 854 | "integrity": "sha1-c0TLuLbib7J9ZrL8hvn21Zl1IcY=", 855 | "optional": true 856 | }, 857 | "simple-get": { 858 | "version": "3.1.0", 859 | "resolved": "https://registry.npmjs.org/simple-get/-/simple-get-3.1.0.tgz", 860 | "integrity": "sha512-bCR6cP+aTdScaQCnQKbPKtJOKDp/hj9EDLJo3Nw4y1QksqaovlW/bnptB6/c1e+qmNIDHRK+oXFDdEqBT8WzUA==", 861 | "optional": true, 862 | "requires": { 863 | "decompress-response": "^4.2.0", 864 | "once": "^1.3.1", 865 | "simple-concat": "^1.0.0" 866 | } 867 | }, 868 | "string-kit": { 869 | "version": "0.11.6", 870 | "resolved": "https://registry.npmjs.org/string-kit/-/string-kit-0.11.6.tgz", 871 | "integrity": "sha512-rI3KOfSgFg02+BSP/ocUl8E3hoqV8C8OsMHUZhIy2BHfP8V0HV0iGwM67Zzepv+U9XryH01tHO8EAIaIK66Eqg==" 872 | }, 873 | "string-width": { 874 | "version": "1.0.2", 875 | "resolved": "https://registry.npmjs.org/string-width/-/string-width-1.0.2.tgz", 876 | "integrity": "sha1-EYvfW4zcUaKn5w0hHgfisLmxB9M=", 877 | "optional": true, 878 | "requires": { 879 | "code-point-at": "^1.0.0", 880 | "is-fullwidth-code-point": "^1.0.0", 881 | "strip-ansi": "^3.0.0" 882 | } 883 | }, 884 | "string_decoder": { 885 | "version": "1.1.1", 886 | "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-1.1.1.tgz", 887 | "integrity": "sha512-n/ShnvDi6FHbbVfviro+WojiFzv+s8MPMHBczVePfUpDJLwoLT0ht1l4YwBCbi8pJAveEEdnkHyPyTP/mzRfwg==", 888 | "optional": true, 889 | "requires": { 890 | "safe-buffer": "~5.1.0" 891 | } 892 | }, 893 | "strip-ansi": { 894 | "version": "3.0.1", 895 | "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-3.0.1.tgz", 896 | "integrity": "sha1-ajhfuIU9lS1f8F0Oiq+UJ43GPc8=", 897 | "optional": true, 898 | "requires": { 899 | "ansi-regex": "^2.0.0" 900 | } 901 | }, 902 | "strip-json-comments": { 903 | "version": "2.0.1", 904 | "resolved": "https://registry.npmjs.org/strip-json-comments/-/strip-json-comments-2.0.1.tgz", 905 | "integrity": "sha1-PFMZQukIwml8DsNEhYwobHygpgo=", 906 | "optional": true 907 | }, 908 | "tar": { 909 | "version": "4.4.13", 910 | "resolved": "https://registry.npmjs.org/tar/-/tar-4.4.13.tgz", 911 | "integrity": "sha512-w2VwSrBoHa5BsSyH+KxEqeQBAllHhccyMFVHtGtdMpF4W7IRWfZjFiQceJPChOeTsSDVUpER2T8FA93pr0L+QA==", 912 | "optional": true, 913 | "requires": { 914 | "chownr": "^1.1.1", 915 | "fs-minipass": "^1.2.5", 916 | "minipass": "^2.8.6", 917 | "minizlib": "^1.2.1", 918 | "mkdirp": "^0.5.0", 919 | "safe-buffer": "^5.1.2", 920 | "yallist": "^3.0.3" 921 | } 922 | }, 923 | "tar-fs": { 924 | "version": "2.0.0", 925 | "resolved": "https://registry.npmjs.org/tar-fs/-/tar-fs-2.0.0.tgz", 926 | "integrity": "sha512-vaY0obB6Om/fso8a8vakQBzwholQ7v5+uy+tF3Ozvxv1KNezmVQAiWtcNmMHFSFPqL3dJA8ha6gdtFbfX9mcxA==", 927 | "optional": true, 928 | "requires": { 929 | "chownr": "^1.1.1", 930 | "mkdirp": "^0.5.1", 931 | "pump": "^3.0.0", 932 | "tar-stream": "^2.0.0" 933 | } 934 | }, 935 | "tar-stream": { 936 | "version": "2.1.0", 937 | "resolved": "https://registry.npmjs.org/tar-stream/-/tar-stream-2.1.0.tgz", 938 | "integrity": "sha512-+DAn4Nb4+gz6WZigRzKEZl1QuJVOLtAwwF+WUxy1fJ6X63CaGaUAxJRD2KEn1OMfcbCjySTYpNC6WmfQoIEOdw==", 939 | "optional": true, 940 | "requires": { 941 | "bl": "^3.0.0", 942 | "end-of-stream": "^1.4.1", 943 | "fs-constants": "^1.0.0", 944 | "inherits": "^2.0.3", 945 | "readable-stream": "^3.1.1" 946 | }, 947 | "dependencies": { 948 | "readable-stream": { 949 | "version": "3.6.0", 950 | "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-3.6.0.tgz", 951 | "integrity": "sha512-BViHy7LKeTz4oNnkcLJ+lVSL6vpiFeX6/d3oSH8zCW7UxP2onchk+vTGB143xuFjHS3deTgkKoXXymXqymiIdA==", 952 | "optional": true, 953 | "requires": { 954 | "inherits": "^2.0.3", 955 | "string_decoder": "^1.1.1", 956 | "util-deprecate": "^1.0.1" 957 | } 958 | } 959 | } 960 | }, 961 | "terminal-kit": { 962 | "version": "1.33.3", 963 | "resolved": "https://registry.npmjs.org/terminal-kit/-/terminal-kit-1.33.3.tgz", 964 | "integrity": "sha512-ANF4LPt1rS+4edwsH1xUTkyZXv8gF5ZIz9Q4KFstnXfk4JUE9l93nVuDQNNuJbIpcDcCN6VSyjaiOEprGBLNSw==", 965 | "requires": { 966 | "@cronvel/get-pixels": "^3.3.1", 967 | "chroma-js": "^2.1.0", 968 | "lazyness": "^1.1.1", 969 | "ndarray": "^1.0.19", 970 | "nextgen-events": "^1.3.0", 971 | "seventh": "^0.7.31", 972 | "string-kit": "^0.11.6", 973 | "tree-kit": "^0.6.2" 974 | } 975 | }, 976 | "tree-kit": { 977 | "version": "0.6.2", 978 | "resolved": "https://registry.npmjs.org/tree-kit/-/tree-kit-0.6.2.tgz", 979 | "integrity": "sha512-95UzJA0EMbFfu5sGUUOoXixQMUGkwu82nGM4lmqLyQl+R4H3FK+lS0nT8TZJ5x7JhSHy+saVn7/AOqh6d+tmOg==" 980 | }, 981 | "tunnel-agent": { 982 | "version": "0.6.0", 983 | "resolved": "https://registry.npmjs.org/tunnel-agent/-/tunnel-agent-0.6.0.tgz", 984 | "integrity": "sha1-J6XeoGs2sEoKmWZ3SykIaPD8QP0=", 985 | "optional": true, 986 | "requires": { 987 | "safe-buffer": "^5.0.1" 988 | } 989 | }, 990 | "uniq": { 991 | "version": "1.0.1", 992 | "resolved": "https://registry.npmjs.org/uniq/-/uniq-1.0.1.tgz", 993 | "integrity": "sha1-sxxa6CVIRKOoKBVBzisEuGWnNP8=" 994 | }, 995 | "usb": { 996 | "version": "1.6.2", 997 | "resolved": "https://registry.npmjs.org/usb/-/usb-1.6.2.tgz", 998 | "integrity": "sha512-KcovLXRQuH63iEtnqXyDQGOi5dXHpLM5lZBIUsqSJQToua8nL2sVCieQTkzQBfLe5mCuvk40MgKciI61lgevWw==", 999 | "optional": true, 1000 | "requires": { 1001 | "bindings": "^1.4.0", 1002 | "nan": "2.13.2", 1003 | "prebuild-install": "^5.3.3" 1004 | }, 1005 | "dependencies": { 1006 | "nan": { 1007 | "version": "2.13.2", 1008 | "resolved": "https://registry.npmjs.org/nan/-/nan-2.13.2.tgz", 1009 | "integrity": "sha512-TghvYc72wlMGMVMluVo9WRJc0mB8KxxF/gZ4YYFy7V2ZQX9l7rgbPg7vjS9mt6U5HXODVFVI2bOduCzwOMv/lw==", 1010 | "optional": true 1011 | } 1012 | } 1013 | }, 1014 | "util-deprecate": { 1015 | "version": "1.0.2", 1016 | "resolved": "https://registry.npmjs.org/util-deprecate/-/util-deprecate-1.0.2.tgz", 1017 | "integrity": "sha1-RQ1Nyfpw3nMnYvvS1KKJgUGaDM8=", 1018 | "optional": true 1019 | }, 1020 | "uuid": { 1021 | "version": "3.4.0", 1022 | "resolved": "https://registry.npmjs.org/uuid/-/uuid-3.4.0.tgz", 1023 | "integrity": "sha512-HjSDRw6gZE5JMggctHBcjVak08+KEVhSIiDzFnT9S9aegmp85S/bReBVTb4QTFaRNptJ9kuYaNhnbNEOkbKb/A==" 1024 | }, 1025 | "which": { 1026 | "version": "2.0.2", 1027 | "resolved": "https://registry.npmjs.org/which/-/which-2.0.2.tgz", 1028 | "integrity": "sha512-BLI3Tl1TW3Pvl70l3yq3Y64i+awpwXqsGBYWkkqMtnbXgrMD+yj7rhW0kuEDxzJaYXGjEW5ogapKNMEKNMjibA==", 1029 | "requires": { 1030 | "isexe": "^2.0.0" 1031 | } 1032 | }, 1033 | "which-pm-runs": { 1034 | "version": "1.0.0", 1035 | "resolved": "https://registry.npmjs.org/which-pm-runs/-/which-pm-runs-1.0.0.tgz", 1036 | "integrity": "sha1-Zws6+8VS4LVd9rd4DKdGFfI60cs=", 1037 | "optional": true 1038 | }, 1039 | "wide-align": { 1040 | "version": "1.1.3", 1041 | "resolved": "https://registry.npmjs.org/wide-align/-/wide-align-1.1.3.tgz", 1042 | "integrity": "sha512-QGkOQc8XL6Bt5PwnsExKBPuMKBxnGxWWW3fU55Xt4feHozMUhdUMaBCk290qpm/wG5u/RSKzwdAC4i51YigihA==", 1043 | "optional": true, 1044 | "requires": { 1045 | "string-width": "^1.0.2 || 2" 1046 | } 1047 | }, 1048 | "wrappy": { 1049 | "version": "1.0.2", 1050 | "resolved": "https://registry.npmjs.org/wrappy/-/wrappy-1.0.2.tgz", 1051 | "integrity": "sha1-tSQ9jz7BqjXxNkYFvA0QNuMKtp8=", 1052 | "optional": true 1053 | }, 1054 | "yallist": { 1055 | "version": "3.1.1", 1056 | "resolved": "https://registry.npmjs.org/yallist/-/yallist-3.1.1.tgz", 1057 | "integrity": "sha512-a4UGQaWPH59mOXUYnAG2ewncQS4i4F43Tv3JoAM+s2VDAmS9NsK8GpDMLrCHPksFT7h3K6TOoUNn2pb7RoXx4g==", 1058 | "optional": true 1059 | } 1060 | } 1061 | } 1062 | -------------------------------------------------------------------------------- /package.json: -------------------------------------------------------------------------------- 1 | { 2 | "name": "homebridge-homekit-controller", 3 | "repository": { 4 | "type": "git", 5 | "url": "git+https://github.com/martinpham/homebridge-homekit-controller.git" 6 | }, 7 | "bin": { 8 | "homekit": "./cli.js" 9 | }, 10 | "version": "0.0.1", 11 | "description": "Homebridge Homekit controller", 12 | "license": "ISC", 13 | "keywords": [ 14 | "homebridge-plugin", 15 | "homebridge", 16 | "api", 17 | "homekit" 18 | ], 19 | "engines": { 20 | "node": ">=0.12.0", 21 | "homebridge": ">=0.2.0" 22 | }, 23 | "dependencies": { 24 | "hap-controller": "MartinPham/hap-controller-node.git#patch-2", 25 | "libsodium-wrappers": "^0.7.6", 26 | "terminal-kit": "^1.33.3" 27 | } 28 | } 29 | -------------------------------------------------------------------------------- /yarn.lock: -------------------------------------------------------------------------------- 1 | # THIS IS AN AUTOGENERATED FILE. DO NOT EDIT THIS FILE DIRECTLY. 2 | # yarn lockfile v1 3 | 4 | 5 | "@abandonware/bluetooth-hci-socket@^0.5.3-3": 6 | version "0.5.3-4" 7 | resolved "https://registry.yarnpkg.com/@abandonware/bluetooth-hci-socket/-/bluetooth-hci-socket-0.5.3-4.tgz#23a8f8141d217c898c17b94870cb0b26ebd547af" 8 | integrity sha512-hxYIj1qBZVyayJDuN1yhZPzNvuSlCSoFEiWRSZ8nqSvKGQzBddWRTASmlQqVn15G4hHVkjk0xDXjzwUkEgaDyA== 9 | dependencies: 10 | debug "^4.1.0" 11 | nan "^2.14.0" 12 | node-pre-gyp "^0.13.0" 13 | optionalDependencies: 14 | usb "^1.6.0" 15 | 16 | "@abandonware/noble@^1.9.2-5": 17 | version "1.9.2-5" 18 | resolved "https://registry.yarnpkg.com/@abandonware/noble/-/noble-1.9.2-5.tgz#c5fcbe8af7ccd55fe8175d784af4c0a8d0b51703" 19 | integrity sha512-Y1eyxDoA9kvKeAgd6mQ9c4qDbqQbqlPR56LkbtlAqptGB4HT/8KQweqqyTsj4CtdhbvCAt1G+J+2nE35WU9fBg== 20 | dependencies: 21 | debug "^4.1.1" 22 | napi-thread-safe-callback "0.0.6" 23 | node-addon-api "^1.1.0" 24 | optionalDependencies: 25 | "@abandonware/bluetooth-hci-socket" "^0.5.3-3" 26 | 27 | "@cronvel/get-pixels@^3.3.1": 28 | version "3.3.1" 29 | resolved "https://registry.yarnpkg.com/@cronvel/get-pixels/-/get-pixels-3.3.1.tgz#cd8bfd7d9985fb282aa8ad765137454ecfacafbe" 30 | integrity sha512-jgDb8vGPkpjRDbiYyHTI2Bna4HJysjPNSiERzBnRJjCR/YqC3u0idTae0tmNECsaZLOpAWmlK9wiIwnLGIT9Bg== 31 | dependencies: 32 | jpeg-js "^0.1.1" 33 | ndarray "^1.0.13" 34 | ndarray-pack "^1.1.1" 35 | node-bitmap "0.0.1" 36 | omggif "^1.0.5" 37 | pngjs "^2.0.0" 38 | 39 | abbrev@1: 40 | version "1.1.1" 41 | resolved "https://registry.yarnpkg.com/abbrev/-/abbrev-1.1.1.tgz#f8f2c887ad10bf67f634f005b6987fed3179aac8" 42 | integrity sha512-nne9/IiQ/hzIhY6pdDnbBtz7DjPTKrY00P/zvPSm5pOFkl6xuGrGnXn/VtTNNfNtAfZ9/1RtehkszU9qcTii0Q== 43 | 44 | ansi-regex@^2.0.0: 45 | version "2.1.1" 46 | resolved "https://registry.yarnpkg.com/ansi-regex/-/ansi-regex-2.1.1.tgz#c3b33ab5ee360d86e0e628f0468ae7ef27d654df" 47 | integrity sha1-w7M6te42DYbg5ijwRorn7yfWVN8= 48 | 49 | ansi-regex@^3.0.0: 50 | version "3.0.0" 51 | resolved "https://registry.yarnpkg.com/ansi-regex/-/ansi-regex-3.0.0.tgz#ed0317c322064f79466c02966bddb605ab37d998" 52 | integrity sha1-7QMXwyIGT3lGbAKWa922Bas32Zg= 53 | 54 | aproba@^1.0.3: 55 | version "1.2.0" 56 | resolved "https://registry.yarnpkg.com/aproba/-/aproba-1.2.0.tgz#6802e6264efd18c790a1b0d517f0f2627bf2c94a" 57 | integrity sha512-Y9J6ZjXtoYh8RnXVCMOU/ttDmk1aBjunq9vO0ta5x85WDQiQfUF9sIPBITdbiiIVcBo03Hi3jMxigBtsddlXRw== 58 | 59 | are-we-there-yet@~1.1.2: 60 | version "1.1.5" 61 | resolved "https://registry.yarnpkg.com/are-we-there-yet/-/are-we-there-yet-1.1.5.tgz#4b35c2944f062a8bfcda66410760350fe9ddfc21" 62 | integrity sha512-5hYdAkZlcG8tOLujVDTgCT+uPX0VnpAH28gWsLfzpXYm7wP6mp5Q/gYyR7YQ0cKVJcXJnl3j2kpBan13PtQf6w== 63 | dependencies: 64 | delegates "^1.0.0" 65 | readable-stream "^2.0.6" 66 | 67 | balanced-match@^1.0.0: 68 | version "1.0.0" 69 | resolved "https://registry.yarnpkg.com/balanced-match/-/balanced-match-1.0.0.tgz#89b4d199ab2bee49de164ea02b89ce462d71b767" 70 | integrity sha1-ibTRmasr7kneFk6gK4nORi1xt2c= 71 | 72 | bindings@^1.4.0: 73 | version "1.5.0" 74 | resolved "https://registry.yarnpkg.com/bindings/-/bindings-1.5.0.tgz#10353c9e945334bc0511a6d90b38fbc7c9c504df" 75 | integrity sha512-p2q/t/mhvuOj/UeLlV6566GD/guowlr0hHxClI0W9m7MWYkL1F0hLo+0Aexs9HSPCtR1SXQ0TD3MMKrXZajbiQ== 76 | dependencies: 77 | file-uri-to-path "1.0.0" 78 | 79 | bl@^3.0.0: 80 | version "3.0.0" 81 | resolved "https://registry.yarnpkg.com/bl/-/bl-3.0.0.tgz#3611ec00579fd18561754360b21e9f784500ff88" 82 | integrity sha512-EUAyP5UHU5hxF8BPT0LKW8gjYLhq1DQIcneOX/pL/m2Alo+OYDQAJlHq+yseMP50Os2nHXOSic6Ss3vSQeyf4A== 83 | dependencies: 84 | readable-stream "^3.0.1" 85 | 86 | brace-expansion@^1.1.7: 87 | version "1.1.11" 88 | resolved "https://registry.yarnpkg.com/brace-expansion/-/brace-expansion-1.1.11.tgz#3c7fcbf529d87226f3d2f52b966ff5271eb441dd" 89 | integrity sha512-iCuPHDFgrHX7H2vEI/5xpz07zSHB00TpugqhmYtVmMO6518mCuRMoOYFldEBl0g187ufozdaHgWKcYFb61qGiA== 90 | dependencies: 91 | balanced-match "^1.0.0" 92 | concat-map "0.0.1" 93 | 94 | chownr@^1.1.1: 95 | version "1.1.3" 96 | resolved "https://registry.yarnpkg.com/chownr/-/chownr-1.1.3.tgz#42d837d5239688d55f303003a508230fa6727142" 97 | integrity sha512-i70fVHhmV3DtTl6nqvZOnIjbY0Pe4kAUjwHj8z0zAdgBtYrJyYwLKCCuRBQ5ppkyL0AkN7HKRnETdmdp1zqNXw== 98 | 99 | chroma-js@^2.1.0: 100 | version "2.1.0" 101 | resolved "https://registry.yarnpkg.com/chroma-js/-/chroma-js-2.1.0.tgz#c0be48a21fe797ef8965608c1c4f911ef2da49d5" 102 | integrity sha512-uiRdh4ZZy+UTPSrAdp8hqEdVb1EllLtTHOt5TMaOjJUvi+O54/83Fc5K2ld1P+TJX+dw5B+8/sCgzI6eaur/lg== 103 | dependencies: 104 | cross-env "^6.0.3" 105 | 106 | code-point-at@^1.0.0: 107 | version "1.1.0" 108 | resolved "https://registry.yarnpkg.com/code-point-at/-/code-point-at-1.1.0.tgz#0d070b4d043a5bea33a2f1a40e2edb3d9a4ccf77" 109 | integrity sha1-DQcLTQQ6W+ozovGkDi7bPZpMz3c= 110 | 111 | concat-map@0.0.1: 112 | version "0.0.1" 113 | resolved "https://registry.yarnpkg.com/concat-map/-/concat-map-0.0.1.tgz#d8a96bd77fd68df7793a73036a3ba0d5405d477b" 114 | integrity sha1-2Klr13/Wjfd5OnMDajug1UBdR3s= 115 | 116 | console-control-strings@^1.0.0, console-control-strings@~1.1.0: 117 | version "1.1.0" 118 | resolved "https://registry.yarnpkg.com/console-control-strings/-/console-control-strings-1.1.0.tgz#3d7cf4464db6446ea644bf4b39507f9851008e8e" 119 | integrity sha1-PXz0Rk22RG6mRL9LOVB/mFEAjo4= 120 | 121 | core-util-is@~1.0.0: 122 | version "1.0.2" 123 | resolved "https://registry.yarnpkg.com/core-util-is/-/core-util-is-1.0.2.tgz#b5fd54220aa2bc5ab57aab7140c940754503c1a7" 124 | integrity sha1-tf1UIgqivFq1eqtxQMlAdUUDwac= 125 | 126 | cross-env@^6.0.3: 127 | version "6.0.3" 128 | resolved "https://registry.yarnpkg.com/cross-env/-/cross-env-6.0.3.tgz#4256b71e49b3a40637a0ce70768a6ef5c72ae941" 129 | integrity sha512-+KqxF6LCvfhWvADcDPqo64yVIB31gv/jQulX2NGzKS/g3GEVz6/pt4wjHFtFWsHMddebWD/sDthJemzM4MaAag== 130 | dependencies: 131 | cross-spawn "^7.0.0" 132 | 133 | cross-spawn@^7.0.0: 134 | version "7.0.1" 135 | resolved "https://registry.yarnpkg.com/cross-spawn/-/cross-spawn-7.0.1.tgz#0ab56286e0f7c24e153d04cc2aa027e43a9a5d14" 136 | integrity sha512-u7v4o84SwFpD32Z8IIcPZ6z1/ie24O6RU3RbtL5Y316l3KuHVPx9ItBgWQ6VlfAFnRnTtMUrsQ9MUUTuEZjogg== 137 | dependencies: 138 | path-key "^3.1.0" 139 | shebang-command "^2.0.0" 140 | which "^2.0.1" 141 | 142 | cwise-compiler@^1.1.2: 143 | version "1.1.3" 144 | resolved "https://registry.yarnpkg.com/cwise-compiler/-/cwise-compiler-1.1.3.tgz#f4d667410e850d3a313a7d2db7b1e505bb034cc5" 145 | integrity sha1-9NZnQQ6FDToxOn0tt7HlBbsDTMU= 146 | dependencies: 147 | uniq "^1.0.0" 148 | 149 | debug@^3.2.6: 150 | version "3.2.6" 151 | resolved "https://registry.yarnpkg.com/debug/-/debug-3.2.6.tgz#e83d17de16d8a7efb7717edbe5fb10135eee629b" 152 | integrity sha512-mel+jf7nrtEl5Pn1Qx46zARXKDpBbvzezse7p7LqINmdoIk8PYP5SySaxEmYv6TZ0JyEKA1hsCId6DIhgITtWQ== 153 | dependencies: 154 | ms "^2.1.1" 155 | 156 | debug@^4.1.0, debug@^4.1.1: 157 | version "4.1.1" 158 | resolved "https://registry.yarnpkg.com/debug/-/debug-4.1.1.tgz#3b72260255109c6b589cee050f1d516139664791" 159 | integrity sha512-pYAIzeRo8J6KPEaJ0VWOh5Pzkbw/RetuzehGM7QRRX5he4fPHx2rdKMB256ehJCkX+XRQm16eZLqLNS8RSZXZw== 160 | dependencies: 161 | ms "^2.1.1" 162 | 163 | decompress-response@^4.2.0: 164 | version "4.2.1" 165 | resolved "https://registry.yarnpkg.com/decompress-response/-/decompress-response-4.2.1.tgz#414023cc7a302da25ce2ec82d0d5238ccafd8986" 166 | integrity sha512-jOSne2qbyE+/r8G1VU+G/82LBs2Fs4LAsTiLSHOCOMZQl2OKZ6i8i4IyHemTe+/yIXOtTcRQMzPcgyhoFlqPkw== 167 | dependencies: 168 | mimic-response "^2.0.0" 169 | 170 | deep-extend@^0.6.0: 171 | version "0.6.0" 172 | resolved "https://registry.yarnpkg.com/deep-extend/-/deep-extend-0.6.0.tgz#c4fa7c95404a17a9c3e8ca7e1537312b736330ac" 173 | integrity sha512-LOHxIOaPYdHlJRtCQfDIVZtfw/ufM8+rVj649RIHzcm/vGwQRXFt6OPqIFWsm2XEMrNIEtWR64sY1LEKD2vAOA== 174 | 175 | delegates@^1.0.0: 176 | version "1.0.0" 177 | resolved "https://registry.yarnpkg.com/delegates/-/delegates-1.0.0.tgz#84c6e159b81904fdca59a0ef44cd870d31250f9a" 178 | integrity sha1-hMbhWbgZBP3KWaDvRM2HDTElD5o= 179 | 180 | detect-libc@^1.0.2, detect-libc@^1.0.3: 181 | version "1.0.3" 182 | resolved "https://registry.yarnpkg.com/detect-libc/-/detect-libc-1.0.3.tgz#fa137c4bd698edf55cd5cd02ac559f91a4c4ba9b" 183 | integrity sha1-+hN8S9aY7fVc1c0CrFWfkaTEups= 184 | 185 | dnssd@^0.4.1: 186 | version "0.4.1" 187 | resolved "https://registry.yarnpkg.com/dnssd/-/dnssd-0.4.1.tgz#0c9a726bc5deaf0ed416b05ef57be80dbba5c585" 188 | integrity sha512-mEz5Ii+o+k3kYHTXY6fTLOjCwraX8TQowIgUySAbEYuGqtSMbfBc/tvDZ8wGPywnmlLE6/XeXi6qPcAKVTvPUQ== 189 | 190 | end-of-stream@^1.1.0, end-of-stream@^1.4.1: 191 | version "1.4.4" 192 | resolved "https://registry.yarnpkg.com/end-of-stream/-/end-of-stream-1.4.4.tgz#5ae64a5f45057baf3626ec14da0ca5e4b2431eb0" 193 | integrity sha512-+uw1inIHVPQoaVuHzRyXd21icM+cnt4CzD5rW+NC1wjOUSTOs+Te7FOv7AhN7vS9x/oIyhLP5PR1H+phQAHu5Q== 194 | dependencies: 195 | once "^1.4.0" 196 | 197 | expand-template@^2.0.3: 198 | version "2.0.3" 199 | resolved "https://registry.yarnpkg.com/expand-template/-/expand-template-2.0.3.tgz#6e14b3fcee0f3a6340ecb57d2e8918692052a47c" 200 | integrity sha512-XYfuKMvj4O35f/pOXLObndIRvyQ+/+6AhODh+OKWj9S9498pHHn/IMszH+gt0fBCRWMNfk1ZSp5x3AifmnI2vg== 201 | 202 | fast-srp-hap@^1.0.1: 203 | version "1.0.1" 204 | resolved "https://registry.yarnpkg.com/fast-srp-hap/-/fast-srp-hap-1.0.1.tgz#377124d196bc6a5157aae5b37bf5fa35bb4ad2d9" 205 | integrity sha1-N3Ek0Za8alFXquWze/X6NbtK0tk= 206 | 207 | file-uri-to-path@1.0.0: 208 | version "1.0.0" 209 | resolved "https://registry.yarnpkg.com/file-uri-to-path/-/file-uri-to-path-1.0.0.tgz#553a7b8446ff6f684359c445f1e37a05dacc33dd" 210 | integrity sha512-0Zt+s3L7Vf1biwWZ29aARiVYLx7iMGnEUl9x33fbB/j3jR81u/O2LbqK+Bm1CDSNDKVtJ/YjwY7TUd5SkeLQLw== 211 | 212 | fs-constants@^1.0.0: 213 | version "1.0.0" 214 | resolved "https://registry.yarnpkg.com/fs-constants/-/fs-constants-1.0.0.tgz#6be0de9be998ce16af8afc24497b9ee9b7ccd9ad" 215 | integrity sha512-y6OAwoSIf7FyjMIv94u+b5rdheZEjzR63GTyZJm5qh4Bi+2YgwLCcI/fPFZkL5PSixOt6ZNKm+w+Hfp/Bciwow== 216 | 217 | fs-minipass@^1.2.5: 218 | version "1.2.7" 219 | resolved "https://registry.yarnpkg.com/fs-minipass/-/fs-minipass-1.2.7.tgz#ccff8570841e7fe4265693da88936c55aed7f7c7" 220 | integrity sha512-GWSSJGFy4e9GUeCcbIkED+bgAoFyj7XF1mV8rma3QW4NIqX9Kyx79N/PF61H5udOV3aY1IaMLs6pGbH71nlCTA== 221 | dependencies: 222 | minipass "^2.6.0" 223 | 224 | fs.realpath@^1.0.0: 225 | version "1.0.0" 226 | resolved "https://registry.yarnpkg.com/fs.realpath/-/fs.realpath-1.0.0.tgz#1504ad2523158caa40db4a2787cb01411994ea4f" 227 | integrity sha1-FQStJSMVjKpA20onh8sBQRmU6k8= 228 | 229 | gauge@~2.7.3: 230 | version "2.7.4" 231 | resolved "https://registry.yarnpkg.com/gauge/-/gauge-2.7.4.tgz#2c03405c7538c39d7eb37b317022e325fb018bf7" 232 | integrity sha1-LANAXHU4w51+s3sxcCLjJfsBi/c= 233 | dependencies: 234 | aproba "^1.0.3" 235 | console-control-strings "^1.0.0" 236 | has-unicode "^2.0.0" 237 | object-assign "^4.1.0" 238 | signal-exit "^3.0.0" 239 | string-width "^1.0.1" 240 | strip-ansi "^3.0.1" 241 | wide-align "^1.1.0" 242 | 243 | github-from-package@0.0.0: 244 | version "0.0.0" 245 | resolved "https://registry.yarnpkg.com/github-from-package/-/github-from-package-0.0.0.tgz#97fb5d96bfde8973313f20e8288ef9a167fa64ce" 246 | integrity sha1-l/tdlr/eiXMxPyDoKI75oWf6ZM4= 247 | 248 | glob@^7.1.3: 249 | version "7.1.6" 250 | resolved "https://registry.yarnpkg.com/glob/-/glob-7.1.6.tgz#141f33b81a7c2492e125594307480c46679278a6" 251 | integrity sha512-LwaxwyZ72Lk7vZINtNNrywX0ZuLyStrdDtabefZKAY5ZGJhVtgdznluResxNmPitE0SAO+O26sWTHeKSI2wMBA== 252 | dependencies: 253 | fs.realpath "^1.0.0" 254 | inflight "^1.0.4" 255 | inherits "2" 256 | minimatch "^3.0.4" 257 | once "^1.3.0" 258 | path-is-absolute "^1.0.0" 259 | 260 | hap-controller@MartinPham/hap-controller-node.git#patch-2: 261 | version "0.2.0" 262 | resolved "https://codeload.github.com/MartinPham/hap-controller-node/tar.gz/978fbacd16d685aad95e93453d2d3255a79dcc47" 263 | dependencies: 264 | "@abandonware/noble" "^1.9.2-5" 265 | dnssd "^0.4.1" 266 | fast-srp-hap "^1.0.1" 267 | hkdf "0.0.2" 268 | http-parser-js "^0.5.2" 269 | libsodium-wrappers "^0.7.6" 270 | uuid "^3.4.0" 271 | 272 | has-unicode@^2.0.0: 273 | version "2.0.1" 274 | resolved "https://registry.yarnpkg.com/has-unicode/-/has-unicode-2.0.1.tgz#e0e6fe6a28cf51138855e086d1691e771de2a8b9" 275 | integrity sha1-4Ob+aijPUROIVeCG0Wkedx3iqLk= 276 | 277 | hkdf@0.0.2: 278 | version "0.0.2" 279 | resolved "https://registry.yarnpkg.com/hkdf/-/hkdf-0.0.2.tgz#2f8db615fdef870201f82d2b619ca6d347d0647e" 280 | integrity sha1-L422Ff3vhwIB+C0rYZym00fQZH4= 281 | 282 | http-parser-js@^0.5.2: 283 | version "0.5.2" 284 | resolved "https://registry.yarnpkg.com/http-parser-js/-/http-parser-js-0.5.2.tgz#da2e31d237b393aae72ace43882dd7e270a8ff77" 285 | integrity sha512-opCO9ASqg5Wy2FNo7A0sxy71yGbbkJJXLdgMK04Tcypw9jr2MgWbyubb0+WdmDmGnFflO7fRbqbaihh/ENDlRQ== 286 | 287 | iconv-lite@^0.4.4: 288 | version "0.4.24" 289 | resolved "https://registry.yarnpkg.com/iconv-lite/-/iconv-lite-0.4.24.tgz#2022b4b25fbddc21d2f524974a474aafe733908b" 290 | integrity sha512-v3MXnZAcvnywkTUEZomIActle7RXXeedOR31wwl7VlyoXO4Qi9arvSenNQWne1TcRwhCL1HwLI21bEqdpj8/rA== 291 | dependencies: 292 | safer-buffer ">= 2.1.2 < 3" 293 | 294 | ignore-walk@^3.0.1: 295 | version "3.0.3" 296 | resolved "https://registry.yarnpkg.com/ignore-walk/-/ignore-walk-3.0.3.tgz#017e2447184bfeade7c238e4aefdd1e8f95b1e37" 297 | integrity sha512-m7o6xuOaT1aqheYHKf8W6J5pYH85ZI9w077erOzLje3JsB1gkafkAhHHY19dqjulgIZHFm32Cp5uNZgcQqdJKw== 298 | dependencies: 299 | minimatch "^3.0.4" 300 | 301 | inflight@^1.0.4: 302 | version "1.0.6" 303 | resolved "https://registry.yarnpkg.com/inflight/-/inflight-1.0.6.tgz#49bd6331d7d02d0c09bc910a1075ba8165b56df9" 304 | integrity sha1-Sb1jMdfQLQwJvJEKEHW6gWW1bfk= 305 | dependencies: 306 | once "^1.3.0" 307 | wrappy "1" 308 | 309 | inherits@2, inherits@^2.0.3, inherits@~2.0.3: 310 | version "2.0.4" 311 | resolved "https://registry.yarnpkg.com/inherits/-/inherits-2.0.4.tgz#0fa2c64f932917c3433a0ded55363aae37416b7c" 312 | integrity sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ== 313 | 314 | ini@~1.3.0: 315 | version "1.3.5" 316 | resolved "https://registry.yarnpkg.com/ini/-/ini-1.3.5.tgz#eee25f56db1c9ec6085e0c22778083f596abf927" 317 | integrity sha512-RZY5huIKCMRWDUqZlEi72f/lmXKMvuszcMBduliQ3nnWbx9X/ZBQO7DijMEYS9EhHBb2qacRUMtC7svLwe0lcw== 318 | 319 | iota-array@^1.0.0: 320 | version "1.0.0" 321 | resolved "https://registry.yarnpkg.com/iota-array/-/iota-array-1.0.0.tgz#81ef57fe5d05814cd58c2483632a99c30a0e8087" 322 | integrity sha1-ge9X/l0FgUzVjCSDYyqZwwoOgIc= 323 | 324 | is-buffer@^1.0.2: 325 | version "1.1.6" 326 | resolved "https://registry.yarnpkg.com/is-buffer/-/is-buffer-1.1.6.tgz#efaa2ea9daa0d7ab2ea13a97b2b8ad51fefbe8be" 327 | integrity sha512-NcdALwpXkTm5Zvvbk7owOUSvVvBKDgKP5/ewfXEznmQFfs4ZRmanOeKBTjRVjka3QFoN6XJ+9F3USqfHqTaU5w== 328 | 329 | is-fullwidth-code-point@^1.0.0: 330 | version "1.0.0" 331 | resolved "https://registry.yarnpkg.com/is-fullwidth-code-point/-/is-fullwidth-code-point-1.0.0.tgz#ef9e31386f031a7f0d643af82fde50c457ef00cb" 332 | integrity sha1-754xOG8DGn8NZDr4L95QxFfvAMs= 333 | dependencies: 334 | number-is-nan "^1.0.0" 335 | 336 | is-fullwidth-code-point@^2.0.0: 337 | version "2.0.0" 338 | resolved "https://registry.yarnpkg.com/is-fullwidth-code-point/-/is-fullwidth-code-point-2.0.0.tgz#a3b30a5c4f199183167aaab93beefae3ddfb654f" 339 | integrity sha1-o7MKXE8ZkYMWeqq5O+764937ZU8= 340 | 341 | isarray@~1.0.0: 342 | version "1.0.0" 343 | resolved "https://registry.yarnpkg.com/isarray/-/isarray-1.0.0.tgz#bb935d48582cba168c06834957a54a3e07124f11" 344 | integrity sha1-u5NdSFgsuhaMBoNJV6VKPgcSTxE= 345 | 346 | isexe@^2.0.0: 347 | version "2.0.0" 348 | resolved "https://registry.yarnpkg.com/isexe/-/isexe-2.0.0.tgz#e8fbf374dc556ff8947a10dcb0572d633f2cfa10" 349 | integrity sha1-6PvzdNxVb/iUehDcsFctYz8s+hA= 350 | 351 | jpeg-js@^0.1.1: 352 | version "0.1.2" 353 | resolved "https://registry.yarnpkg.com/jpeg-js/-/jpeg-js-0.1.2.tgz#135b992c0575c985cfa0f494a3227ed238583ece" 354 | integrity sha1-E1uZLAV1yYXPoPSUoyJ+0jhYPs4= 355 | 356 | lazyness@^1.1.1: 357 | version "1.1.1" 358 | resolved "https://registry.yarnpkg.com/lazyness/-/lazyness-1.1.1.tgz#d5a7b63a217254bcd559f9b17753c92b70a84d81" 359 | integrity sha512-rYHC6l6LeRlJSt5jxpqN8z/49gZ0CqLi89HAGzJjHahCFlqEjFGFN9O15hmzSzUGFl7zN/vOWduv/+0af3r/kQ== 360 | 361 | libsodium-wrappers@^0.7.6: 362 | version "0.7.6" 363 | resolved "https://registry.yarnpkg.com/libsodium-wrappers/-/libsodium-wrappers-0.7.6.tgz#baed4c16d4bf9610104875ad8a8e164d259d48fb" 364 | integrity sha512-OUO2CWW5bHdLr6hkKLHIKI4raEkZrf3QHkhXsJ1yCh6MZ3JDA7jFD3kCATNquuGSG6MjjPHQIQms0y0gBDzjQg== 365 | dependencies: 366 | libsodium "0.7.6" 367 | 368 | libsodium@0.7.6: 369 | version "0.7.6" 370 | resolved "https://registry.yarnpkg.com/libsodium/-/libsodium-0.7.6.tgz#018b80c5728054817845fbffa554274441bda277" 371 | integrity sha512-hPb/04sEuLcTRdWDtd+xH3RXBihpmbPCsKW/Jtf4PsvdyKh+D6z2D2gvp/5BfoxseP+0FCOg66kE+0oGUE/loQ== 372 | 373 | mimic-response@^2.0.0: 374 | version "2.0.0" 375 | resolved "https://registry.yarnpkg.com/mimic-response/-/mimic-response-2.0.0.tgz#996a51c60adf12cb8a87d7fb8ef24c2f3d5ebb46" 376 | integrity sha512-8ilDoEapqA4uQ3TwS0jakGONKXVJqpy+RpM+3b7pLdOjghCrEiGp9SRkFbUHAmZW9vdnrENWHjaweIoTIJExSQ== 377 | 378 | minimatch@^3.0.4: 379 | version "3.0.4" 380 | resolved "https://registry.yarnpkg.com/minimatch/-/minimatch-3.0.4.tgz#5166e286457f03306064be5497e8dbb0c3d32083" 381 | integrity sha512-yJHVQEhyqPLUTgt9B83PXu6W3rx4MvvHvSUvToogpwoGDOUQ+yDrR0HRot+yOCdCO7u4hX3pWft6kWBBcqh0UA== 382 | dependencies: 383 | brace-expansion "^1.1.7" 384 | 385 | minimist@0.0.8: 386 | version "0.0.8" 387 | resolved "https://registry.yarnpkg.com/minimist/-/minimist-0.0.8.tgz#857fcabfc3397d2625b8228262e86aa7a011b05d" 388 | integrity sha1-hX/Kv8M5fSYluCKCYuhqp6ARsF0= 389 | 390 | minimist@^1.2.0: 391 | version "1.2.0" 392 | resolved "https://registry.yarnpkg.com/minimist/-/minimist-1.2.0.tgz#a35008b20f41383eec1fb914f4cd5df79a264284" 393 | integrity sha1-o1AIsg9BOD7sH7kU9M1d95omQoQ= 394 | 395 | minipass@^2.6.0, minipass@^2.8.6, minipass@^2.9.0: 396 | version "2.9.0" 397 | resolved "https://registry.yarnpkg.com/minipass/-/minipass-2.9.0.tgz#e713762e7d3e32fed803115cf93e04bca9fcc9a6" 398 | integrity sha512-wxfUjg9WebH+CUDX/CdbRlh5SmfZiy/hpkxaRI16Y9W56Pa75sWgd/rvFilSgrauD9NyFymP/+JFV3KwzIsJeg== 399 | dependencies: 400 | safe-buffer "^5.1.2" 401 | yallist "^3.0.0" 402 | 403 | minizlib@^1.2.1: 404 | version "1.3.3" 405 | resolved "https://registry.yarnpkg.com/minizlib/-/minizlib-1.3.3.tgz#2290de96818a34c29551c8a8d301216bd65a861d" 406 | integrity sha512-6ZYMOEnmVsdCeTJVE0W9ZD+pVnE8h9Hma/iOwwRDsdQoePpoX56/8B6z3P9VNwppJuBKNRuFDRNRqRWexT9G9Q== 407 | dependencies: 408 | minipass "^2.9.0" 409 | 410 | mkdirp@^0.5.0, mkdirp@^0.5.1: 411 | version "0.5.1" 412 | resolved "https://registry.yarnpkg.com/mkdirp/-/mkdirp-0.5.1.tgz#30057438eac6cf7f8c4767f38648d6697d75c903" 413 | integrity sha1-MAV0OOrGz3+MR2fzhkjWaX11yQM= 414 | dependencies: 415 | minimist "0.0.8" 416 | 417 | ms@^2.1.1: 418 | version "2.1.2" 419 | resolved "https://registry.yarnpkg.com/ms/-/ms-2.1.2.tgz#d09d1f357b443f493382a8eb3ccd183872ae6009" 420 | integrity sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w== 421 | 422 | nan@2.13.2: 423 | version "2.13.2" 424 | resolved "https://registry.yarnpkg.com/nan/-/nan-2.13.2.tgz#f51dc7ae66ba7d5d55e1e6d4d8092e802c9aefe7" 425 | integrity sha512-TghvYc72wlMGMVMluVo9WRJc0mB8KxxF/gZ4YYFy7V2ZQX9l7rgbPg7vjS9mt6U5HXODVFVI2bOduCzwOMv/lw== 426 | 427 | nan@^2.14.0: 428 | version "2.14.0" 429 | resolved "https://registry.yarnpkg.com/nan/-/nan-2.14.0.tgz#7818f722027b2459a86f0295d434d1fc2336c52c" 430 | integrity sha512-INOFj37C7k3AfaNTtX8RhsTw7qRy7eLET14cROi9+5HAVbbHuIWUHEauBv5qT4Av2tWasiTY1Jw6puUNqRJXQg== 431 | 432 | napi-build-utils@^1.0.1: 433 | version "1.0.1" 434 | resolved "https://registry.yarnpkg.com/napi-build-utils/-/napi-build-utils-1.0.1.tgz#1381a0f92c39d66bf19852e7873432fc2123e508" 435 | integrity sha512-boQj1WFgQH3v4clhu3mTNfP+vOBxorDlE8EKiMjUlLG3C4qAESnn9AxIOkFgTR2c9LtzNjPrjS60cT27ZKBhaA== 436 | 437 | napi-thread-safe-callback@0.0.6: 438 | version "0.0.6" 439 | resolved "https://registry.yarnpkg.com/napi-thread-safe-callback/-/napi-thread-safe-callback-0.0.6.tgz#ef86a149b5312e480f74e89a614e6d9e3b17b456" 440 | integrity sha512-X7uHCOCdY4u0yamDxDrv3jF2NtYc8A1nvPzBQgvpoSX+WB3jAe2cVNsY448V1ucq7Whf9Wdy02HEUoLW5rJKWg== 441 | 442 | ndarray-pack@^1.1.1: 443 | version "1.2.1" 444 | resolved "https://registry.yarnpkg.com/ndarray-pack/-/ndarray-pack-1.2.1.tgz#8caebeaaa24d5ecf70ff86020637977da8ee585a" 445 | integrity sha1-jK6+qqJNXs9w/4YCBjeXfajuWFo= 446 | dependencies: 447 | cwise-compiler "^1.1.2" 448 | ndarray "^1.0.13" 449 | 450 | ndarray@^1.0.13, ndarray@^1.0.19: 451 | version "1.0.19" 452 | resolved "https://registry.yarnpkg.com/ndarray/-/ndarray-1.0.19.tgz#6785b5f5dfa58b83e31ae5b2a058cfd1ab3f694e" 453 | integrity sha512-B4JHA4vdyZU30ELBw3g7/p9bZupyew5a7tX1Y/gGeF2hafrPaQZhgrGQfsvgfYbgdFZjYwuEcnaobeM/WMW+HQ== 454 | dependencies: 455 | iota-array "^1.0.0" 456 | is-buffer "^1.0.2" 457 | 458 | needle@^2.2.1: 459 | version "2.3.2" 460 | resolved "https://registry.yarnpkg.com/needle/-/needle-2.3.2.tgz#3342dea100b7160960a450dc8c22160ac712a528" 461 | integrity sha512-DUzITvPVDUy6vczKKYTnWc/pBZ0EnjMJnQ3y+Jo5zfKFimJs7S3HFCxCRZYB9FUZcrzUQr3WsmvZgddMEIZv6w== 462 | dependencies: 463 | debug "^3.2.6" 464 | iconv-lite "^0.4.4" 465 | sax "^1.2.4" 466 | 467 | nextgen-events@^1.3.0: 468 | version "1.3.0" 469 | resolved "https://registry.yarnpkg.com/nextgen-events/-/nextgen-events-1.3.0.tgz#a32665d1ab6f026448b19d75c4603ec20292fa22" 470 | integrity sha512-eBz5mrO4Hw2eenPVm0AVPHuAzg/RZetAWMI547RH8O9+a0UYhCysiZ3KoNWslnWNlHetb9kzowEshsKsmFo2YQ== 471 | 472 | node-abi@^2.7.0: 473 | version "2.14.0" 474 | resolved "https://registry.yarnpkg.com/node-abi/-/node-abi-2.14.0.tgz#24650e24e8ffad2b61352519263f0cf4e2ddbfe9" 475 | integrity sha512-y54KGgEOHnRHlGQi7E5UiryRkH8bmksmQLj/9iLAjoje743YS+KaKB/sDYXgqtT0J16JT3c3AYJZNI98aU/kYg== 476 | dependencies: 477 | semver "^5.4.1" 478 | 479 | node-addon-api@^1.1.0: 480 | version "1.7.1" 481 | resolved "https://registry.yarnpkg.com/node-addon-api/-/node-addon-api-1.7.1.tgz#cf813cd69bb8d9100f6bdca6755fc268f54ac492" 482 | integrity sha512-2+DuKodWvwRTrCfKOeR24KIc5unKjOh8mz17NCzVnHWfjAdDqbfbjqh7gUT+BkXBRQM52+xCHciKWonJ3CbJMQ== 483 | 484 | node-bitmap@0.0.1: 485 | version "0.0.1" 486 | resolved "https://registry.yarnpkg.com/node-bitmap/-/node-bitmap-0.0.1.tgz#180eac7003e0c707618ef31368f62f84b2a69091" 487 | integrity sha1-GA6scAPgxwdhjvMTaPYvhLKmkJE= 488 | 489 | node-pre-gyp@^0.13.0: 490 | version "0.13.0" 491 | resolved "https://registry.yarnpkg.com/node-pre-gyp/-/node-pre-gyp-0.13.0.tgz#df9ab7b68dd6498137717838e4f92a33fc9daa42" 492 | integrity sha512-Md1D3xnEne8b/HGVQkZZwV27WUi1ZRuZBij24TNaZwUPU3ZAFtvT6xxJGaUVillfmMKnn5oD1HoGsp2Ftik7SQ== 493 | dependencies: 494 | detect-libc "^1.0.2" 495 | mkdirp "^0.5.1" 496 | needle "^2.2.1" 497 | nopt "^4.0.1" 498 | npm-packlist "^1.1.6" 499 | npmlog "^4.0.2" 500 | rc "^1.2.7" 501 | rimraf "^2.6.1" 502 | semver "^5.3.0" 503 | tar "^4" 504 | 505 | noop-logger@^0.1.1: 506 | version "0.1.1" 507 | resolved "https://registry.yarnpkg.com/noop-logger/-/noop-logger-0.1.1.tgz#94a2b1633c4f1317553007d8966fd0e841b6a4c2" 508 | integrity sha1-lKKxYzxPExdVMAfYlm/Q6EG2pMI= 509 | 510 | nopt@^4.0.1: 511 | version "4.0.1" 512 | resolved "https://registry.yarnpkg.com/nopt/-/nopt-4.0.1.tgz#d0d4685afd5415193c8c7505602d0d17cd64474d" 513 | integrity sha1-0NRoWv1UFRk8jHUFYC0NF81kR00= 514 | dependencies: 515 | abbrev "1" 516 | osenv "^0.1.4" 517 | 518 | npm-bundled@^1.0.1: 519 | version "1.1.1" 520 | resolved "https://registry.yarnpkg.com/npm-bundled/-/npm-bundled-1.1.1.tgz#1edd570865a94cdb1bc8220775e29466c9fb234b" 521 | integrity sha512-gqkfgGePhTpAEgUsGEgcq1rqPXA+tv/aVBlgEzfXwA1yiUJF7xtEt3CtVwOjNYQOVknDk0F20w58Fnm3EtG0fA== 522 | dependencies: 523 | npm-normalize-package-bin "^1.0.1" 524 | 525 | npm-normalize-package-bin@^1.0.1: 526 | version "1.0.1" 527 | resolved "https://registry.yarnpkg.com/npm-normalize-package-bin/-/npm-normalize-package-bin-1.0.1.tgz#6e79a41f23fd235c0623218228da7d9c23b8f6e2" 528 | integrity sha512-EPfafl6JL5/rU+ot6P3gRSCpPDW5VmIzX959Ob1+ySFUuuYHWHekXpwdUZcKP5C+DS4GEtdJluwBjnsNDl+fSA== 529 | 530 | npm-packlist@^1.1.6: 531 | version "1.4.8" 532 | resolved "https://registry.yarnpkg.com/npm-packlist/-/npm-packlist-1.4.8.tgz#56ee6cc135b9f98ad3d51c1c95da22bbb9b2ef3e" 533 | integrity sha512-5+AZgwru5IevF5ZdnFglB5wNlHG1AOOuw28WhUq8/8emhBmLv6jX5by4WJCh7lW0uSYZYS6DXqIsyZVIXRZU9A== 534 | dependencies: 535 | ignore-walk "^3.0.1" 536 | npm-bundled "^1.0.1" 537 | npm-normalize-package-bin "^1.0.1" 538 | 539 | npmlog@^4.0.1, npmlog@^4.0.2: 540 | version "4.1.2" 541 | resolved "https://registry.yarnpkg.com/npmlog/-/npmlog-4.1.2.tgz#08a7f2a8bf734604779a9efa4ad5cc717abb954b" 542 | integrity sha512-2uUqazuKlTaSI/dC8AzicUck7+IrEaOnN/e0jd3Xtt1KcGpwx30v50mL7oPyr/h9bL3E4aZccVwpwP+5W9Vjkg== 543 | dependencies: 544 | are-we-there-yet "~1.1.2" 545 | console-control-strings "~1.1.0" 546 | gauge "~2.7.3" 547 | set-blocking "~2.0.0" 548 | 549 | number-is-nan@^1.0.0: 550 | version "1.0.1" 551 | resolved "https://registry.yarnpkg.com/number-is-nan/-/number-is-nan-1.0.1.tgz#097b602b53422a522c1afb8790318336941a011d" 552 | integrity sha1-CXtgK1NCKlIsGvuHkDGDNpQaAR0= 553 | 554 | object-assign@^4.1.0: 555 | version "4.1.1" 556 | resolved "https://registry.yarnpkg.com/object-assign/-/object-assign-4.1.1.tgz#2109adc7965887cfc05cbbd442cac8bfbb360863" 557 | integrity sha1-IQmtx5ZYh8/AXLvUQsrIv7s2CGM= 558 | 559 | omggif@^1.0.5: 560 | version "1.0.10" 561 | resolved "https://registry.yarnpkg.com/omggif/-/omggif-1.0.10.tgz#ddaaf90d4a42f532e9e7cb3a95ecdd47f17c7b19" 562 | integrity sha512-LMJTtvgc/nugXj0Vcrrs68Mn2D1r0zf630VNtqtpI1FEO7e+O9FP4gqs9AcnBaSEeoHIPm28u6qgPR0oyEpGSw== 563 | 564 | once@^1.3.0, once@^1.3.1, once@^1.4.0: 565 | version "1.4.0" 566 | resolved "https://registry.yarnpkg.com/once/-/once-1.4.0.tgz#583b1aa775961d4b113ac17d9c50baef9dd76bd1" 567 | integrity sha1-WDsap3WWHUsROsF9nFC6753Xa9E= 568 | dependencies: 569 | wrappy "1" 570 | 571 | os-homedir@^1.0.0: 572 | version "1.0.2" 573 | resolved "https://registry.yarnpkg.com/os-homedir/-/os-homedir-1.0.2.tgz#ffbc4988336e0e833de0c168c7ef152121aa7fb3" 574 | integrity sha1-/7xJiDNuDoM94MFox+8VISGqf7M= 575 | 576 | os-tmpdir@^1.0.0: 577 | version "1.0.2" 578 | resolved "https://registry.yarnpkg.com/os-tmpdir/-/os-tmpdir-1.0.2.tgz#bbe67406c79aa85c5cfec766fe5734555dfa1274" 579 | integrity sha1-u+Z0BseaqFxc/sdm/lc0VV36EnQ= 580 | 581 | osenv@^0.1.4: 582 | version "0.1.5" 583 | resolved "https://registry.yarnpkg.com/osenv/-/osenv-0.1.5.tgz#85cdfafaeb28e8677f416e287592b5f3f49ea410" 584 | integrity sha512-0CWcCECdMVc2Rw3U5w9ZjqX6ga6ubk1xDVKxtBQPK7wis/0F2r9T6k4ydGYhecl7YUBxBVxhL5oisPsNxAPe2g== 585 | dependencies: 586 | os-homedir "^1.0.0" 587 | os-tmpdir "^1.0.0" 588 | 589 | path-is-absolute@^1.0.0: 590 | version "1.0.1" 591 | resolved "https://registry.yarnpkg.com/path-is-absolute/-/path-is-absolute-1.0.1.tgz#174b9268735534ffbc7ace6bf53a5a9e1b5c5f5f" 592 | integrity sha1-F0uSaHNVNP+8es5r9TpanhtcX18= 593 | 594 | path-key@^3.1.0: 595 | version "3.1.1" 596 | resolved "https://registry.yarnpkg.com/path-key/-/path-key-3.1.1.tgz#581f6ade658cbba65a0d3380de7753295054f375" 597 | integrity sha512-ojmeN0qd+y0jszEtoY48r0Peq5dwMEkIlCOu6Q5f41lfkswXuKtYrhgoTpLnyIcHm24Uhqx+5Tqm2InSwLhE6Q== 598 | 599 | pngjs@^2.0.0: 600 | version "2.3.1" 601 | resolved "https://registry.yarnpkg.com/pngjs/-/pngjs-2.3.1.tgz#11d1e12b9cb64d63e30c143a330f4c1f567da85f" 602 | integrity sha1-EdHhK5y2TWPjDBQ6Mw9MH1Z9qF8= 603 | 604 | prebuild-install@^5.3.3: 605 | version "5.3.3" 606 | resolved "https://registry.yarnpkg.com/prebuild-install/-/prebuild-install-5.3.3.tgz#ef4052baac60d465f5ba6bf003c9c1de79b9da8e" 607 | integrity sha512-GV+nsUXuPW2p8Zy7SarF/2W/oiK8bFQgJcncoJ0d7kRpekEA0ftChjfEaF9/Y+QJEc/wFR7RAEa8lYByuUIe2g== 608 | dependencies: 609 | detect-libc "^1.0.3" 610 | expand-template "^2.0.3" 611 | github-from-package "0.0.0" 612 | minimist "^1.2.0" 613 | mkdirp "^0.5.1" 614 | napi-build-utils "^1.0.1" 615 | node-abi "^2.7.0" 616 | noop-logger "^0.1.1" 617 | npmlog "^4.0.1" 618 | pump "^3.0.0" 619 | rc "^1.2.7" 620 | simple-get "^3.0.3" 621 | tar-fs "^2.0.0" 622 | tunnel-agent "^0.6.0" 623 | which-pm-runs "^1.0.0" 624 | 625 | process-nextick-args@~2.0.0: 626 | version "2.0.1" 627 | resolved "https://registry.yarnpkg.com/process-nextick-args/-/process-nextick-args-2.0.1.tgz#7820d9b16120cc55ca9ae7792680ae7dba6d7fe2" 628 | integrity sha512-3ouUOpQhtgrbOa17J7+uxOTpITYWaGP7/AhoR3+A+/1e9skrzelGi/dXzEYyvbxubEF6Wn2ypscTKiKJFFn1ag== 629 | 630 | pump@^3.0.0: 631 | version "3.0.0" 632 | resolved "https://registry.yarnpkg.com/pump/-/pump-3.0.0.tgz#b4a2116815bde2f4e1ea602354e8c75565107a64" 633 | integrity sha512-LwZy+p3SFs1Pytd/jYct4wpv49HiYCqd9Rlc5ZVdk0V+8Yzv6jR5Blk3TRmPL1ft69TxP0IMZGJ+WPFU2BFhww== 634 | dependencies: 635 | end-of-stream "^1.1.0" 636 | once "^1.3.1" 637 | 638 | rc@^1.2.7: 639 | version "1.2.8" 640 | resolved "https://registry.yarnpkg.com/rc/-/rc-1.2.8.tgz#cd924bf5200a075b83c188cd6b9e211b7fc0d3ed" 641 | integrity sha512-y3bGgqKj3QBdxLbLkomlohkvsA8gdAiUQlSBJnBhfn+BPxg4bc62d8TcBW15wavDfgexCgccckhcZvywyQYPOw== 642 | dependencies: 643 | deep-extend "^0.6.0" 644 | ini "~1.3.0" 645 | minimist "^1.2.0" 646 | strip-json-comments "~2.0.1" 647 | 648 | readable-stream@^2.0.6: 649 | version "2.3.7" 650 | resolved "https://registry.yarnpkg.com/readable-stream/-/readable-stream-2.3.7.tgz#1eca1cf711aef814c04f62252a36a62f6cb23b57" 651 | integrity sha512-Ebho8K4jIbHAxnuxi7o42OrZgF/ZTNcsZj6nRKyUmkhLFq8CHItp/fy6hQZuZmP/n3yZ9VBUbp4zz/mX8hmYPw== 652 | dependencies: 653 | core-util-is "~1.0.0" 654 | inherits "~2.0.3" 655 | isarray "~1.0.0" 656 | process-nextick-args "~2.0.0" 657 | safe-buffer "~5.1.1" 658 | string_decoder "~1.1.1" 659 | util-deprecate "~1.0.1" 660 | 661 | readable-stream@^3.0.1, readable-stream@^3.1.1: 662 | version "3.5.0" 663 | resolved "https://registry.yarnpkg.com/readable-stream/-/readable-stream-3.5.0.tgz#465d70e6d1087f6162d079cd0b5db7fbebfd1606" 664 | integrity sha512-gSz026xs2LfxBPudDuI41V1lka8cxg64E66SGe78zJlsUofOg/yqwezdIcdfwik6B4h8LFmWPA9ef9X3FiNFLA== 665 | dependencies: 666 | inherits "^2.0.3" 667 | string_decoder "^1.1.1" 668 | util-deprecate "^1.0.1" 669 | 670 | rimraf@^2.6.1: 671 | version "2.7.1" 672 | resolved "https://registry.yarnpkg.com/rimraf/-/rimraf-2.7.1.tgz#35797f13a7fdadc566142c29d4f07ccad483e3ec" 673 | integrity sha512-uWjbaKIK3T1OSVptzX7Nl6PvQ3qAGtKEtVRjRuazjfL3Bx5eI409VZSqgND+4UNnmzLVdPj9FqFJNPqBZFve4w== 674 | dependencies: 675 | glob "^7.1.3" 676 | 677 | safe-buffer@^5.0.1, safe-buffer@^5.1.2, safe-buffer@~5.2.0: 678 | version "5.2.0" 679 | resolved "https://registry.yarnpkg.com/safe-buffer/-/safe-buffer-5.2.0.tgz#b74daec49b1148f88c64b68d49b1e815c1f2f519" 680 | integrity sha512-fZEwUGbVl7kouZs1jCdMLdt95hdIv0ZeHg6L7qPeciMZhZ+/gdesW4wgTARkrFWEpspjEATAzUGPG8N2jJiwbg== 681 | 682 | safe-buffer@~5.1.0, safe-buffer@~5.1.1: 683 | version "5.1.2" 684 | resolved "https://registry.yarnpkg.com/safe-buffer/-/safe-buffer-5.1.2.tgz#991ec69d296e0313747d59bdfd2b745c35f8828d" 685 | integrity sha512-Gd2UZBJDkXlY7GbJxfsE8/nvKkUEU1G38c1siN6QP6a9PT9MmHB8GnpscSmMJSoF8LOIrt8ud/wPtojys4G6+g== 686 | 687 | "safer-buffer@>= 2.1.2 < 3": 688 | version "2.1.2" 689 | resolved "https://registry.yarnpkg.com/safer-buffer/-/safer-buffer-2.1.2.tgz#44fa161b0187b9549dd84bb91802f9bd8385cd6a" 690 | integrity sha512-YZo3K82SD7Riyi0E1EQPojLz7kpepnSQI9IyPbHHg1XXXevb5dJI7tpyN2ADxGcQbHG7vcyRHk0cbwqcQriUtg== 691 | 692 | sax@^1.2.4: 693 | version "1.2.4" 694 | resolved "https://registry.yarnpkg.com/sax/-/sax-1.2.4.tgz#2816234e2378bddc4e5354fab5caa895df7100d9" 695 | integrity sha512-NqVDv9TpANUjFm0N8uM5GxL36UgKi9/atZw+x7YFnQ8ckwFGKrl4xX4yWtrey3UJm5nP1kUbnYgLopqWNSRhWw== 696 | 697 | semver@^5.3.0, semver@^5.4.1: 698 | version "5.7.1" 699 | resolved "https://registry.yarnpkg.com/semver/-/semver-5.7.1.tgz#a954f931aeba508d307bbf069eff0c01c96116f7" 700 | integrity sha512-sauaDf/PZdVgrLTNYHRtpXa1iRiKcaebiKQ1BJdpQlWH2lCvexQdX55snPFyK7QzpudqbCI0qXFfOasHdyNDGQ== 701 | 702 | set-blocking@~2.0.0: 703 | version "2.0.0" 704 | resolved "https://registry.yarnpkg.com/set-blocking/-/set-blocking-2.0.0.tgz#045f9782d011ae9a6803ddd382b24392b3d890f7" 705 | integrity sha1-BF+XgtARrppoA93TgrJDkrPYkPc= 706 | 707 | setimmediate@^1.0.5: 708 | version "1.0.5" 709 | resolved "https://registry.yarnpkg.com/setimmediate/-/setimmediate-1.0.5.tgz#290cbb232e306942d7d7ea9b83732ab7856f8285" 710 | integrity sha1-KQy7Iy4waULX1+qbg3Mqt4VvgoU= 711 | 712 | seventh@^0.7.31: 713 | version "0.7.34" 714 | resolved "https://registry.yarnpkg.com/seventh/-/seventh-0.7.34.tgz#737525cb9a54e56e5e259f7face7efe4d4aa4fac" 715 | integrity sha512-9YR6YjZIckltwsfomtsUuyHEGSx7gNHdXDX+hPmvVeHJLiGpFnLRm3izKWCVjb70cYZYUfdlA9osUEqtH/J6uQ== 716 | dependencies: 717 | setimmediate "^1.0.5" 718 | 719 | shebang-command@^2.0.0: 720 | version "2.0.0" 721 | resolved "https://registry.yarnpkg.com/shebang-command/-/shebang-command-2.0.0.tgz#ccd0af4f8835fbdc265b82461aaf0c36663f34ea" 722 | integrity sha512-kHxr2zZpYtdmrN1qDjrrX/Z1rR1kG8Dx+gkpK1G4eXmvXswmcE1hTWBWYUzlraYw1/yZp6YuDY77YtvbN0dmDA== 723 | dependencies: 724 | shebang-regex "^3.0.0" 725 | 726 | shebang-regex@^3.0.0: 727 | version "3.0.0" 728 | resolved "https://registry.yarnpkg.com/shebang-regex/-/shebang-regex-3.0.0.tgz#ae16f1644d873ecad843b0307b143362d4c42172" 729 | integrity sha512-7++dFhtcx3353uBaq8DDR4NuxBetBzC7ZQOhmTQInHEd6bSrXdiEyzCvG07Z44UYdLShWUyXt5M/yhz8ekcb1A== 730 | 731 | signal-exit@^3.0.0: 732 | version "3.0.2" 733 | resolved "https://registry.yarnpkg.com/signal-exit/-/signal-exit-3.0.2.tgz#b5fdc08f1287ea1178628e415e25132b73646c6d" 734 | integrity sha1-tf3AjxKH6hF4Yo5BXiUTK3NkbG0= 735 | 736 | simple-concat@^1.0.0: 737 | version "1.0.0" 738 | resolved "https://registry.yarnpkg.com/simple-concat/-/simple-concat-1.0.0.tgz#7344cbb8b6e26fb27d66b2fc86f9f6d5997521c6" 739 | integrity sha1-c0TLuLbib7J9ZrL8hvn21Zl1IcY= 740 | 741 | simple-get@^3.0.3: 742 | version "3.1.0" 743 | resolved "https://registry.yarnpkg.com/simple-get/-/simple-get-3.1.0.tgz#b45be062435e50d159540b576202ceec40b9c6b3" 744 | integrity sha512-bCR6cP+aTdScaQCnQKbPKtJOKDp/hj9EDLJo3Nw4y1QksqaovlW/bnptB6/c1e+qmNIDHRK+oXFDdEqBT8WzUA== 745 | dependencies: 746 | decompress-response "^4.2.0" 747 | once "^1.3.1" 748 | simple-concat "^1.0.0" 749 | 750 | string-kit@^0.11.6: 751 | version "0.11.6" 752 | resolved "https://registry.yarnpkg.com/string-kit/-/string-kit-0.11.6.tgz#daee376e8e3b036f6c359912f1f3eb064304d392" 753 | integrity sha512-rI3KOfSgFg02+BSP/ocUl8E3hoqV8C8OsMHUZhIy2BHfP8V0HV0iGwM67Zzepv+U9XryH01tHO8EAIaIK66Eqg== 754 | 755 | string-width@^1.0.1: 756 | version "1.0.2" 757 | resolved "https://registry.yarnpkg.com/string-width/-/string-width-1.0.2.tgz#118bdf5b8cdc51a2a7e70d211e07e2b0b9b107d3" 758 | integrity sha1-EYvfW4zcUaKn5w0hHgfisLmxB9M= 759 | dependencies: 760 | code-point-at "^1.0.0" 761 | is-fullwidth-code-point "^1.0.0" 762 | strip-ansi "^3.0.0" 763 | 764 | "string-width@^1.0.2 || 2": 765 | version "2.1.1" 766 | resolved "https://registry.yarnpkg.com/string-width/-/string-width-2.1.1.tgz#ab93f27a8dc13d28cac815c462143a6d9012ae9e" 767 | integrity sha512-nOqH59deCq9SRHlxq1Aw85Jnt4w6KvLKqWVik6oA9ZklXLNIOlqg4F2yrT1MVaTjAqvVwdfeZ7w7aCvJD7ugkw== 768 | dependencies: 769 | is-fullwidth-code-point "^2.0.0" 770 | strip-ansi "^4.0.0" 771 | 772 | string_decoder@^1.1.1: 773 | version "1.3.0" 774 | resolved "https://registry.yarnpkg.com/string_decoder/-/string_decoder-1.3.0.tgz#42f114594a46cf1a8e30b0a84f56c78c3edac21e" 775 | integrity sha512-hkRX8U1WjJFd8LsDJ2yQ/wWWxaopEsABU1XfkM8A+j0+85JAGppt16cr1Whg6KIbb4okU6Mql6BOj+uup/wKeA== 776 | dependencies: 777 | safe-buffer "~5.2.0" 778 | 779 | string_decoder@~1.1.1: 780 | version "1.1.1" 781 | resolved "https://registry.yarnpkg.com/string_decoder/-/string_decoder-1.1.1.tgz#9cf1611ba62685d7030ae9e4ba34149c3af03fc8" 782 | integrity sha512-n/ShnvDi6FHbbVfviro+WojiFzv+s8MPMHBczVePfUpDJLwoLT0ht1l4YwBCbi8pJAveEEdnkHyPyTP/mzRfwg== 783 | dependencies: 784 | safe-buffer "~5.1.0" 785 | 786 | strip-ansi@^3.0.0, strip-ansi@^3.0.1: 787 | version "3.0.1" 788 | resolved "https://registry.yarnpkg.com/strip-ansi/-/strip-ansi-3.0.1.tgz#6a385fb8853d952d5ff05d0e8aaf94278dc63dcf" 789 | integrity sha1-ajhfuIU9lS1f8F0Oiq+UJ43GPc8= 790 | dependencies: 791 | ansi-regex "^2.0.0" 792 | 793 | strip-ansi@^4.0.0: 794 | version "4.0.0" 795 | resolved "https://registry.yarnpkg.com/strip-ansi/-/strip-ansi-4.0.0.tgz#a8479022eb1ac368a871389b635262c505ee368f" 796 | integrity sha1-qEeQIusaw2iocTibY1JixQXuNo8= 797 | dependencies: 798 | ansi-regex "^3.0.0" 799 | 800 | strip-json-comments@~2.0.1: 801 | version "2.0.1" 802 | resolved "https://registry.yarnpkg.com/strip-json-comments/-/strip-json-comments-2.0.1.tgz#3c531942e908c2697c0ec344858c286c7ca0a60a" 803 | integrity sha1-PFMZQukIwml8DsNEhYwobHygpgo= 804 | 805 | tar-fs@^2.0.0: 806 | version "2.0.0" 807 | resolved "https://registry.yarnpkg.com/tar-fs/-/tar-fs-2.0.0.tgz#677700fc0c8b337a78bee3623fdc235f21d7afad" 808 | integrity sha512-vaY0obB6Om/fso8a8vakQBzwholQ7v5+uy+tF3Ozvxv1KNezmVQAiWtcNmMHFSFPqL3dJA8ha6gdtFbfX9mcxA== 809 | dependencies: 810 | chownr "^1.1.1" 811 | mkdirp "^0.5.1" 812 | pump "^3.0.0" 813 | tar-stream "^2.0.0" 814 | 815 | tar-stream@^2.0.0: 816 | version "2.1.0" 817 | resolved "https://registry.yarnpkg.com/tar-stream/-/tar-stream-2.1.0.tgz#d1aaa3661f05b38b5acc9b7020efdca5179a2cc3" 818 | integrity sha512-+DAn4Nb4+gz6WZigRzKEZl1QuJVOLtAwwF+WUxy1fJ6X63CaGaUAxJRD2KEn1OMfcbCjySTYpNC6WmfQoIEOdw== 819 | dependencies: 820 | bl "^3.0.0" 821 | end-of-stream "^1.4.1" 822 | fs-constants "^1.0.0" 823 | inherits "^2.0.3" 824 | readable-stream "^3.1.1" 825 | 826 | tar@^4: 827 | version "4.4.13" 828 | resolved "https://registry.yarnpkg.com/tar/-/tar-4.4.13.tgz#43b364bc52888d555298637b10d60790254ab525" 829 | integrity sha512-w2VwSrBoHa5BsSyH+KxEqeQBAllHhccyMFVHtGtdMpF4W7IRWfZjFiQceJPChOeTsSDVUpER2T8FA93pr0L+QA== 830 | dependencies: 831 | chownr "^1.1.1" 832 | fs-minipass "^1.2.5" 833 | minipass "^2.8.6" 834 | minizlib "^1.2.1" 835 | mkdirp "^0.5.0" 836 | safe-buffer "^5.1.2" 837 | yallist "^3.0.3" 838 | 839 | terminal-kit@^1.33.3: 840 | version "1.33.3" 841 | resolved "https://registry.yarnpkg.com/terminal-kit/-/terminal-kit-1.33.3.tgz#9b007bed353dfae7eb70ce0fe0ee2e02e6a56346" 842 | integrity sha512-ANF4LPt1rS+4edwsH1xUTkyZXv8gF5ZIz9Q4KFstnXfk4JUE9l93nVuDQNNuJbIpcDcCN6VSyjaiOEprGBLNSw== 843 | dependencies: 844 | "@cronvel/get-pixels" "^3.3.1" 845 | chroma-js "^2.1.0" 846 | lazyness "^1.1.1" 847 | ndarray "^1.0.19" 848 | nextgen-events "^1.3.0" 849 | seventh "^0.7.31" 850 | string-kit "^0.11.6" 851 | tree-kit "^0.6.2" 852 | 853 | tree-kit@^0.6.2: 854 | version "0.6.2" 855 | resolved "https://registry.yarnpkg.com/tree-kit/-/tree-kit-0.6.2.tgz#3608b7b4fb913a608192cb5abf6154e3921f3592" 856 | integrity sha512-95UzJA0EMbFfu5sGUUOoXixQMUGkwu82nGM4lmqLyQl+R4H3FK+lS0nT8TZJ5x7JhSHy+saVn7/AOqh6d+tmOg== 857 | 858 | tunnel-agent@^0.6.0: 859 | version "0.6.0" 860 | resolved "https://registry.yarnpkg.com/tunnel-agent/-/tunnel-agent-0.6.0.tgz#27a5dea06b36b04a0a9966774b290868f0fc40fd" 861 | integrity sha1-J6XeoGs2sEoKmWZ3SykIaPD8QP0= 862 | dependencies: 863 | safe-buffer "^5.0.1" 864 | 865 | uniq@^1.0.0: 866 | version "1.0.1" 867 | resolved "https://registry.yarnpkg.com/uniq/-/uniq-1.0.1.tgz#b31c5ae8254844a3a8281541ce2b04b865a734ff" 868 | integrity sha1-sxxa6CVIRKOoKBVBzisEuGWnNP8= 869 | 870 | usb@^1.6.0: 871 | version "1.6.2" 872 | resolved "https://registry.yarnpkg.com/usb/-/usb-1.6.2.tgz#4ed7f0d8631c70192b33635f6a4e700d9e6bfe62" 873 | integrity sha512-KcovLXRQuH63iEtnqXyDQGOi5dXHpLM5lZBIUsqSJQToua8nL2sVCieQTkzQBfLe5mCuvk40MgKciI61lgevWw== 874 | dependencies: 875 | bindings "^1.4.0" 876 | nan "2.13.2" 877 | prebuild-install "^5.3.3" 878 | 879 | util-deprecate@^1.0.1, util-deprecate@~1.0.1: 880 | version "1.0.2" 881 | resolved "https://registry.yarnpkg.com/util-deprecate/-/util-deprecate-1.0.2.tgz#450d4dc9fa70de732762fbd2d4a28981419a0ccf" 882 | integrity sha1-RQ1Nyfpw3nMnYvvS1KKJgUGaDM8= 883 | 884 | uuid@^3.4.0: 885 | version "3.4.0" 886 | resolved "https://registry.yarnpkg.com/uuid/-/uuid-3.4.0.tgz#b23e4358afa8a202fe7a100af1f5f883f02007ee" 887 | integrity sha512-HjSDRw6gZE5JMggctHBcjVak08+KEVhSIiDzFnT9S9aegmp85S/bReBVTb4QTFaRNptJ9kuYaNhnbNEOkbKb/A== 888 | 889 | which-pm-runs@^1.0.0: 890 | version "1.0.0" 891 | resolved "https://registry.yarnpkg.com/which-pm-runs/-/which-pm-runs-1.0.0.tgz#670b3afbc552e0b55df6b7780ca74615f23ad1cb" 892 | integrity sha1-Zws6+8VS4LVd9rd4DKdGFfI60cs= 893 | 894 | which@^2.0.1: 895 | version "2.0.2" 896 | resolved "https://registry.yarnpkg.com/which/-/which-2.0.2.tgz#7c6a8dd0a636a0327e10b59c9286eee93f3f51b1" 897 | integrity sha512-BLI3Tl1TW3Pvl70l3yq3Y64i+awpwXqsGBYWkkqMtnbXgrMD+yj7rhW0kuEDxzJaYXGjEW5ogapKNMEKNMjibA== 898 | dependencies: 899 | isexe "^2.0.0" 900 | 901 | wide-align@^1.1.0: 902 | version "1.1.3" 903 | resolved "https://registry.yarnpkg.com/wide-align/-/wide-align-1.1.3.tgz#ae074e6bdc0c14a431e804e624549c633b000457" 904 | integrity sha512-QGkOQc8XL6Bt5PwnsExKBPuMKBxnGxWWW3fU55Xt4feHozMUhdUMaBCk290qpm/wG5u/RSKzwdAC4i51YigihA== 905 | dependencies: 906 | string-width "^1.0.2 || 2" 907 | 908 | wrappy@1: 909 | version "1.0.2" 910 | resolved "https://registry.yarnpkg.com/wrappy/-/wrappy-1.0.2.tgz#b5243d8f3ec1aa35f1364605bc0d1036e30ab69f" 911 | integrity sha1-tSQ9jz7BqjXxNkYFvA0QNuMKtp8= 912 | 913 | yallist@^3.0.0, yallist@^3.0.3: 914 | version "3.1.1" 915 | resolved "https://registry.yarnpkg.com/yallist/-/yallist-3.1.1.tgz#dbb7daf9bfd8bac9ab45ebf602b8cbad0d5d08fd" 916 | integrity sha512-a4UGQaWPH59mOXUYnAG2ewncQS4i4F43Tv3JoAM+s2VDAmS9NsK8GpDMLrCHPksFT7h3K6TOoUNn2pb7RoXx4g== 917 | --------------------------------------------------------------------------------