Commit 27b1c37ad61d8309e3d7fe7a0bd78f5556e8decd

Authored by Adhidarma Hadiwinoto
1 parent 7352d9b074
Exists in master

Development snapshot

Showing 13 changed files with 3943 additions and 115 deletions Side-by-side Diff

... ... @@ -0,0 +1,12 @@
  1 +"use strict";
  2 +
  3 +process.chdir(__dirname);
  4 +
  5 +const fs = require('fs');
  6 +fs.writeFileSync('pid.txt', process.pid);
  7 +
  8 +const apiserver = require('komodo-sdk/api-server');
  9 +const pullgw = require('komodo-sdk/gateway/pull');
  10 +const partner = require('./lib/partner-mkios');
  11 +
  12 +pullgw.setPartner(partner);
... ... @@ -0,0 +1,58 @@
  1 +"use strict";
  2 +
  3 +const logger = require('komodo-sdk/logger');
  4 +const sqlite3 = require('sqlite3').verbose();
  5 +const moment = require('moment');
  6 +const cron = require('cron');
  7 +
  8 +const db = new sqlite3.Database('data.sqlite', (err) => {
  9 + if (err) {
  10 + logger.warn('Error connecting to local database', {err: err});
  11 + process.exit(2);
  12 + }
  13 +
  14 + logger.info('Local database connected');
  15 +
  16 + initTables();
  17 + cleanup();
  18 +
  19 +});
  20 +
  21 +function getConnection() { return db; }
  22 +
  23 +function initTables() {
  24 + logger.verbose('Preparing database tables');
  25 + db.serialize(function() {
  26 + db.run('CREATE TABLE IF NOT EXISTS sms( created TEXT, direction TEXT, imsi TEXT, partner TEXT, msg TEXT )');
  27 + db.run('CREATE INDEX IF NOT EXISTS idx_sms_created ON sms(created)');
  28 +
  29 + db.run('CREATE TABLE IF NOT EXISTS pendingtrx ( created TEXT, created_date TEXT, trx_id TEXT, destination TEXT, product TEXT )');
  30 + db.run('CREATE INDEX IF NOT EXISTS idx_pendingtrx_created ON pendingtrx(created)');
  31 + db.run('CREATE UNIQUE INDEX IF NOT EXISTS idx_pendingtrx_created_date ON pendingtrx(created_date, destination, product)');
  32 + db.run('CREATE UNIQUE INDEX IF NOT EXISTS idx_pendingtrx_trx_id ON pendingtrx(trx_id)');
  33 + })
  34 +}
  35 +
  36 +function cleanup(max_days) {
  37 + logger.info('Doing database cleanup');
  38 +
  39 + if (!max_days) {
  40 + max_days = 7;
  41 + }
  42 +
  43 + const oldest = moment().add(-1 * max_days, 'days').format('YYYY-MM-DD');
  44 + db.serialize(function() {
  45 + db.run('DELETE FROM sms WHERE created < ?', oldest);
  46 + db.run('DELETE FROM pendingtrx WHERE created_date < ?', oldest);
  47 + db.run('VACUUM');
  48 + });
  49 +}
  50 +
  51 +const cleanCronJob = new cron.CronJob({
  52 + cronTime: '00 00 00 * * *',
  53 + onTick: function() { cleanup(); },
  54 + start: false
  55 +})
  56 +
  57 +exports.getConnection = getConnection;
  58 +exports.cleanup = cleanup;
... ... @@ -0,0 +1,240 @@
  1 +"use strict";
  2 +
  3 +const fs = require('fs');
  4 +const EventEmitter = require('events');
  5 +const os = require('os');
  6 +
  7 +const moment = require('moment');
  8 +
  9 +const SerialPort = require('serialport');
  10 +const Readline = require('@serialport/parser-readline');
  11 +const Delimiter = require('@serialport/parser-delimiter');
  12 +const jsesc = require('jsesc');
  13 +
  14 +const logger = require('komodo-sdk/logger');
  15 +
  16 +const smsParser = require('./sms-parser');
  17 +
  18 +const SIGNAL_STRENGTH_INTERVAL_MS = 60 * 1000;
  19 +
  20 +fs.existsSync('logs/') || fs.mkdirSync('logs/');
  21 +const debugLogWriter = process.env.KOMODO_DEBUG_MODEM ? fs.createWriteStream('logs/log-debug-modem.txt', { flags: 'a' }) : null;
  22 +
  23 +function debugLog(msg) {
  24 + if (debugLogWriter) {
  25 + debugLogWriter.write(msg + os.EOL);
  26 + }
  27 +}
  28 +
  29 +
  30 +class Modem extends EventEmitter {
  31 + constructor(portName) {
  32 + super();
  33 + this.portName = portName;
  34 + }
  35 +
  36 + open(cb) {
  37 + const self = this;
  38 +
  39 + this.port = new SerialPort('/home/adhisimon/ttyUSB0ksa');
  40 +
  41 + this.port.on('error', function(err) {
  42 + if (cb) cb(err);
  43 + });
  44 +
  45 + this.port.on('open', function() {
  46 + self.disableEcho(function() {
  47 + self.getIMSI(function() {
  48 + self.emit('open');
  49 + self.getSignalStrength(cb);
  50 +
  51 + setInterval(function() {
  52 + self.getSignalStrength();
  53 + }, SIGNAL_STRENGTH_INTERVAL_MS)
  54 +
  55 + })
  56 + });
  57 +
  58 + });
  59 +
  60 +
  61 + }
  62 +
  63 + resetParserToDefault() {
  64 + const self = this;
  65 + //this.port.unpipe(this.parser);
  66 + if (this.parser) { this.port.unpipe(this.parser)};
  67 + this.parser = this.port.pipe(new Readline());
  68 +
  69 + this.parser.on('data', function(data) {
  70 + if (!data) return;
  71 +
  72 + debugLog('PARSER-DEFAULT: ' + data);
  73 +
  74 + if (data.indexOf('+CMTI:') === 0) {
  75 + self.onSMS(data);
  76 + }
  77 + else if (data.indexOf('+CUSD:') === 0) {
  78 + self.onUSSDResponse(data);
  79 + }
  80 + if (data.indexOf('+CSQ:') === 0) {
  81 + debugLog('*** Got CSQ signal strength response');
  82 + self.onSignalStrength(data);
  83 + }
  84 +
  85 + });
  86 + }
  87 +
  88 + _write(...args) {
  89 + debugLog('COMMAND: ' + args[0]);
  90 + this.port.write(...args);
  91 + this.port.drain();
  92 + }
  93 +
  94 + write(data) {
  95 + debugLog('COMMAND: ' + data);
  96 + this.port.write(data);
  97 + this.port.drain();
  98 + }
  99 +
  100 + getPort() {
  101 + return this.port;
  102 + }
  103 +
  104 + onUSSDResponse(data) {
  105 + debugLog('USSD-RESPONSE: ' + data);
  106 + this.emit('ussd response', data);
  107 + }
  108 +
  109 + onSMS(data) {
  110 + const self = this;
  111 + const port = this.port;
  112 +
  113 + const matches = data.match(/,(\d+)\s*$/);
  114 + if (!matches || matches.length < 2) {
  115 + return;
  116 + }
  117 +
  118 + const slot = matches[1];
  119 + //console.log('*** Ada SMS masuk di slot ' + slot);
  120 +
  121 + if (!slot) {
  122 + debugLog('*** Gagal deteksi slot sms')
  123 + return;
  124 + }
  125 +
  126 + if (this.parser) { this.port.unpipe(this.parser)};
  127 + const parser = this.port.pipe(new Delimiter({ delimiter: '\r\nOK\r\n' }))
  128 +
  129 + parser.on('data', function(data) {
  130 + self.parseSMS(data);
  131 + self.port.unpipe(parser);
  132 + self.resetParserToDefault();
  133 +
  134 + self.write('AT+CMGD=' + slot + '\r');
  135 + })
  136 +
  137 + this.write('AT+CMGR=' + slot + '\r');
  138 + }
  139 +
  140 + parseSMS(data) {
  141 + data = data.toString().trim();
  142 + //debugLog(jsesc(data, {wrap: true}));
  143 + debugLog('SMS-READ: ' + data);
  144 + const sms = smsParser.parseModemResponse(data);
  145 + this.emit('incoming sms', sms);
  146 + }
  147 +
  148 + disableEcho(cb) {
  149 + const self = this;
  150 +
  151 + if (this.parser) { this.port.unpipe(this.parser)};
  152 + const parser = this.port.pipe(new Delimiter({ delimiter: '\nOK\r\n' }));
  153 +
  154 + parser.on('data', function(data) {
  155 + const value = data.toString().replace(/^\s+/, '').replace(/\s+$/, '');
  156 +
  157 + debugLog('PARSER-DISABLEECHO: echo disabled');
  158 +
  159 + self.port.unpipe(parser);
  160 + self.resetParserToDefault();
  161 +
  162 + if (cb) {
  163 + cb(null, value);
  164 + }
  165 + })
  166 +
  167 + this.write('ATE0\r');
  168 + }
  169 +
  170 + getIMSI(cb) {
  171 + const self = this;
  172 + const port = this.port;
  173 +
  174 + if (this.parser) { this.port.unpipe(this.parser)};
  175 + const parser = this.port.pipe(new Delimiter({ delimiter: '\r\nOK\r\n' }))
  176 +
  177 + parser.on('data', function(data) {
  178 + self.imsi = data.toString().replace(/^\s+/, '').replace(/\s+$/, '');
  179 + debugLog('PARSER-IMSI: ' + self.imsi);
  180 +
  181 + self.port.unpipe(parser);
  182 + self.resetParserToDefault();
  183 +
  184 + self.emit('imsi', self.imsi);
  185 +
  186 + if (cb) {
  187 + cb(null, self.imsi);
  188 + }
  189 + })
  190 +
  191 + this.write('AT+CIMI\r');
  192 + }
  193 +
  194 + getCOPS(cb) {
  195 + const self = this;
  196 +
  197 + /*
  198 + const parser = this.port.pipe(new Delimiter({ delimiter: '\r\nOK\r\n' }))
  199 +
  200 + parser.on('data', function(data) {
  201 + const value = data.toString().replace(/^\s+/, '').replace(/\s+$/, '');
  202 + debugLog('PARSER-COPS: ' + value);
  203 + self.port.unpipe(parser);
  204 + if (cb) {
  205 + cb(null, value);
  206 + }
  207 + })
  208 + */
  209 +
  210 + //console.log('MODEM: sending AT+COPS?');
  211 + this.write('AT+COPS?\r');
  212 + }
  213 +
  214 + sendUSSD(cmd, cb) {
  215 + const self = this;
  216 + const port = this.port;
  217 +
  218 + //console.log('MODEM: ' + moment().format('HH:mm:ss') + ' *** Sending USSD command ' + cmd);
  219 + this.write('AT+CUSD=1,"' + cmd + '",15\r');
  220 + }
  221 +
  222 + onSignalStrength(data) {
  223 + if (typeof data !== 'string') {
  224 + debugLog('*** onSignalStrength data is not a string');
  225 + return;
  226 + }
  227 + const matches = data.match(/: (\d+),/);
  228 + if (matches.length < 2) return;
  229 +
  230 + this.emit('signal strength', Number(matches[1]));
  231 + }
  232 +
  233 + getSignalStrength(cb) {
  234 + this.write('AT+CSQ\r');
  235 +
  236 + if (cb) { cb() };
  237 + }
  238 +}
  239 +
  240 +module.exports = Modem;
lib/modem/sms-parser.js
... ... @@ -0,0 +1,44 @@
  1 +"use strict";
  2 +
  3 +const moment = require('moment');
  4 +
  5 +function parseHeader(header) {
  6 + if (typeof header !== 'string') {
  7 + return;
  8 + }
  9 +
  10 + const values = header.split(',');
  11 + return {
  12 + sender: typeof values[1] === 'string' ? values[1].replace(/"/g, '') : null,
  13 + created: typeof values[3] === 'string' && typeof values[4] === 'string' ? moment(values[3] + ' ' + values[4], 'YY/MM/DD HH:mm:ss+SS').format('YYYY-MM-DD HH:mm:ss') : null
  14 + }
  15 +}
  16 +
  17 +function parseModemResponse(data) {
  18 + const sms = {
  19 + sender: null,
  20 + created: null,
  21 + msg: null
  22 + }
  23 +
  24 + const lines = data.split(/\r\n/);
  25 +
  26 + if (lines < 2) {
  27 + return;
  28 + }
  29 +
  30 + const header_string = lines[0] ? lines[0] : null;
  31 + const header = parseHeader(header_string);
  32 + if (!header) {
  33 + return;
  34 + }
  35 +
  36 + return {
  37 + sender: header.sender,
  38 + created: header.created,
  39 + msg: lines.slice(1).join("\n")
  40 + }
  41 +}
  42 +
  43 +exports.parseHeader = parseHeader;
  44 +exports.parseModemResponse = parseModemResponse;
lib/partner-mkios.js
... ... @@ -0,0 +1,262 @@
  1 +"use strict";
  2 +
  3 +const Modem = require('./modem');
  4 +
  5 +const pullgw = require('komodo-sdk/gateway/pull');
  6 +
  7 +const config = require('komodo-sdk/config');
  8 +const logger = require('komodo-sdk/logger');
  9 +const matrix = require('komodo-sdk/matrix');
  10 +
  11 +matrix.modem = {};
  12 +matrix.not_ready = true;
  13 +matrix.stock = {};
  14 +
  15 +const db = require('./local-db').getConnection();
  16 +const pendingArchive = require('./pending-archive');
  17 +const patternMatcher = require('./pattern-rule-matcher');
  18 +const smsHandler = require('./sms-handler');
  19 +
  20 +const modem = new Modem(config.partner.modem.dev);
  21 +
  22 +const resumeHandlers = {};
  23 +
  24 +let last_trx_id = null;
  25 +
  26 +modem.on('open', function() {
  27 + logger.info('Modem opened');
  28 + modem.sendUSSD('*776*' + config.partner.pin + '#', function() {});
  29 +})
  30 +
  31 +modem.on('imsi', function(imsi) {
  32 + logger.verbose('IMSI: ' + imsi);
  33 + matrix.modem.imsi = imsi;
  34 +})
  35 +
  36 +
  37 +function onIncomingSMS(sms) {
  38 + logger.info('Incoming SMS', {sms: sms});
  39 + db.run("INSERT INTO sms VALUES (?, 'IN', ?, ?, ?)", sms.created, matrix.modem.imsi, sms.sender, sms.msg, function(err) {
  40 + if (err) {
  41 + logger.warn('Error inserting sms to local database');
  42 + }
  43 + });
  44 +
  45 + if (!smsHandler.isAllowedSender(sms.sender)) {
  46 + logger.verbose('Ignoring SMS from unknown sender', {sender: sms.sender});
  47 + return;
  48 + }
  49 +
  50 + const stocks = smsHandler.getMultiStockBalance(sms.msg);
  51 + if (stocks && Array.isArray(stocks) && stocks.length) {
  52 + stocks.forEach(function(stock) {
  53 + const vals = stock.split('=');
  54 + updateStock(vals[0], vals[1]);
  55 + })
  56 + }
  57 + else {
  58 + const stock = smsHandler.getStockBalance(sms.msg);
  59 + if (stock.name && stock.balance) {
  60 + updateStock(stock.name, stock.balance);
  61 + }
  62 + }
  63 +
  64 + const destination = smsHandler.getDestination(sms.msg);
  65 + if (!destination) {
  66 + logger.verbose('Ignoring SMS with unknown trx destination');
  67 + return;
  68 + }
  69 +
  70 + const product = smsHandler.getProduct(sms.msg);
  71 + if (!product) {
  72 + logger.verbose('Ignoring SMS with unknown trx product');
  73 + return;
  74 + }
  75 +
  76 + const trx_date = smsHandler.getTrxDate(sms.msg);
  77 + if (!trx_date) {
  78 + logger.verbose('Ignoring SMS with unknown trx date');
  79 + return;
  80 + }
  81 +
  82 + logger.verbose('SMS message parsed and extracted', {destination: destination, product: product, trx_date: trx_date});
  83 + pendingArchive.get(destination, product, trx_date, function(err, trx_id) {
  84 + if (!trx_id) {
  85 + logger.verbose('No pending trx suits with SMS', {destination: destination, product: product, trx_date: trx_date});
  86 + return;
  87 + }
  88 +
  89 + deleteResumeHandler(trx_id);
  90 + pendingArchive.remove(trx_id);
  91 +
  92 + report({
  93 + trx_id: trx_id,
  94 + rc: smsHandler.getRc(sms.msg) || '68',
  95 + sn: smsHandler.getSn(sms.msg),
  96 + message: 'SMS: ' + sms.msg
  97 + })
  98 + })
  99 +
  100 +}
  101 +modem.on('incoming sms', onIncomingSMS);
  102 +
  103 +modem.on('signal strength', function(signal_strength) {
  104 + matrix.modem.signal_strength = signal_strength;
  105 + logger.verbose('Signal strength: ' + signal_strength);
  106 +})
  107 +
  108 +modem.on('ussd response', function(data) {
  109 + logger.verbose('Got USSD response', {response: data});
  110 +
  111 + if (!last_trx_id) return;
  112 +
  113 +
  114 + const rc = getRcFromMessage(data, config.ussd_parser.rc) || '68';
  115 + if (rc !== '68') {
  116 + onTrxFinish(last_trx_id);
  117 + }
  118 +
  119 + report({
  120 + trx_id: last_trx_id,
  121 + rc: rc,
  122 + sn: getSnFromMessage(data),
  123 + message: data
  124 + });
  125 +
  126 + const stock_name = getStockProductFromMessage(data);
  127 + const stock_balance = getStockBalanceFromMesssage(data);
  128 +
  129 + updateStock(stock_name, stock_balance);
  130 + last_trx_id = null;
  131 +})
  132 +
  133 +
  134 +logger.info('Opening MODEM');
  135 +modem.open(function(err) {
  136 + if (err) {
  137 + logger.warn('Error opening modem port', {err: err});
  138 + process.exit(1);
  139 + }
  140 +
  141 + logger.info('Modem open successfully');
  142 + matrix.not_ready = false;
  143 +})
  144 +
  145 +function updateStock(stock_name, stock_balance) {
  146 + if (stock_name && (stock_balance !== undefined || stock_balance !== null)) {
  147 + logger.verbose('Updating stock', {stock_name: stock_name, stock_balance: stock_balance});
  148 +
  149 + const new_stock_name = config && config.remote_product_alias && config.remote_product_alias[stock_name] ? config.remote_product_alias[stock_name] : stock_name;
  150 +
  151 + matrix.stock[new_stock_name] = Number(stock_balance);
  152 +
  153 + logger.verbose('Stock balance updated', {stock: matrix.stock});
  154 + }
  155 +}
  156 +
  157 +function getRcFromMessage(msg, rules) {
  158 + if (!rules || !Array.isArray(rules)) {
  159 + return '68';
  160 + }
  161 +
  162 + for (let rule of rules) {
  163 + if (!rule.pattern) return '68';
  164 +
  165 + const re = new RegExp(rule.pattern);
  166 + if (msg.search(re) >= 0) {
  167 + return rule.rc ? rule.rc : '68';
  168 + }
  169 + }
  170 +
  171 + return '68';
  172 +}
  173 +
  174 +function getPatternMatchFromMessage(msg, rules) {
  175 + if (!rules || !Array.isArray(rules)) {
  176 + return;
  177 + }
  178 +
  179 + for (let rule of rules) {
  180 + if (!rule.pattern) return;
  181 +
  182 + const re = new RegExp(rule.pattern);
  183 + const matches = msg.match(re);
  184 +
  185 + if (matches && matches.length >= 2) {
  186 + return matches[1];
  187 + }
  188 + }
  189 +}
  190 +
  191 +function getSnFromMessage(msg, rules) {
  192 + return patternMatcher(msg, config.ussd_parser.sn);
  193 +}
  194 +
  195 +function getStockProductFromMessage(msg, rules) {
  196 + return patternMatcher(msg, config.ussd_parser.stock.product);
  197 +}
  198 +
  199 +function getStockBalanceFromMesssage(msg, rules) {
  200 + return patternMatcher(msg, config.ussd_parser.stock.balance);
  201 +}
  202 +
  203 +function suspendPull(trx_id) {
  204 + logger.verbose('Set modem to not ready so no other task can be entered and registering delayed resume');
  205 + matrix.not_ready = true;
  206 +
  207 + resumeHandlers['trx' + trx_id] = setTimeout(function() {
  208 + logger.verbose('Resuming supsended modem', {trx_id: trx_id});
  209 + matrix.not_ready = false;
  210 + report({
  211 + trx_id: trx_id,
  212 + rc: '68',
  213 + message: 'USSD timeout'
  214 + })
  215 + }, Number(config.partner.modem.suspend_time_ms) || 30000)
  216 +}
  217 +
  218 +function deleteResumeHandler(trx_id) {
  219 + if (resumeHandlers['trx' + trx_id]) {
  220 + logger.verbose('Unregistering delayed resume of trx id ' + trx_id);
  221 + clearTimeout(resumeHandlers['trx' + trx_id]);
  222 + delete resumeHandlers['trx' + trx_id];
  223 + }
  224 +}
  225 +
  226 +function onTrxFinish(trx_id) {
  227 + deleteResumeHandler(trx_id);
  228 + pendingArchive.remove(trx_id);
  229 + matrix.not_ready = false;
  230 +}
  231 +
  232 +function buy(task) {
  233 + suspendPull(task.trx_id);
  234 + last_trx_id = task.trx_id;
  235 +
  236 + pendingArchive.put(task, function(err) {
  237 + if (err) {
  238 + logger.verbose('Error inserting task to pending archive', {trx_id: task.trx_id, destination: task.destination, product: task.product, err: err});
  239 + onTrxFinish(task.trx_id);
  240 + report({
  241 + trx_id: task.trx_id,
  242 + rc: '40',
  243 + message: 'INTERNAL: Gagal melakukan transaksi. Mungkin ada transaksi dengan nomor dengan produk yang sama yang masih diproses. Silahkan ulangi beberapa saat lagi.'
  244 + });
  245 +
  246 + return;
  247 + }
  248 +
  249 + const ussd_command = task.remote_product.split(',')[0].replace("<DESTINATION>", task.destination).replace("<PIN>", config.partner.pin);
  250 + logger.verbose('Going to execute USSD', {trx_id: task.trx_id, destination: task.destination, product: task.product, ussd: ussd_command});
  251 +
  252 + modem.sendUSSD(ussd_command, function() {});
  253 + })
  254 +
  255 +
  256 +}
  257 +
  258 +function report(data) {
  259 + pullgw.report(data);
  260 +}
  261 +
  262 +exports.buy = buy;
lib/pattern-rule-matcher.js
... ... @@ -0,0 +1,20 @@
  1 +"use strict";
  2 +
  3 +function getPatternMatchFromMessage(msg, rules) {
  4 + if (!rules || !Array.isArray(rules)) {
  5 + return;
  6 + }
  7 +
  8 + for (let rule of rules) {
  9 + if (!rule.pattern) return;
  10 +
  11 + const re = new RegExp(rule.pattern, rule.flags);
  12 + const matches = msg.match(re);
  13 +
  14 + if (matches && matches.length >= 2) {
  15 + return (rule.prefix || '') + matches[1] + (rule.suffix || '');
  16 + }
  17 + }
  18 +}
  19 +
  20 +module.exports = getPatternMatchFromMessage;
lib/pattern-rule-value.js
... ... @@ -0,0 +1,18 @@
  1 +"use strict";
  2 +
  3 +module.exports = function(msg, rules) {
  4 + if (!rules || !Array.isArray(rules)) {
  5 + return null;
  6 + }
  7 +
  8 + for (let rule of rules) {
  9 + if (!rule.pattern || !rule.value) return null;
  10 +
  11 + const re = new RegExp(rule.pattern, rule.flags);
  12 + if (msg.search(re) >= 0) {
  13 + return rule.value;
  14 + }
  15 + }
  16 +
  17 + return null;
  18 +}
lib/pending-archive.js
... ... @@ -0,0 +1,88 @@
  1 +"use strict";
  2 +
  3 +const moment = require('moment');
  4 +
  5 +const logger = require('komodo-sdk/logger');
  6 +const db = require('./local-db').getConnection();
  7 +
  8 +function put(task, cb) {
  9 + logger.verbose('PENDING-ARCHIVE: Trying to put trx into table', {trx_id: task.trx_id, destination: task.destination, product: task.product});
  10 +
  11 + const query = `
  12 + INSERT INTO pendingtrx (
  13 + created,
  14 + created_date,
  15 + trx_id,
  16 + destination,
  17 + product
  18 + )
  19 + VALUES (
  20 + ?,
  21 + ?,
  22 + ?,
  23 + ?,
  24 + ?
  25 + )
  26 + `.trim();
  27 +
  28 + const values = [
  29 + moment().format('YYYY-MM-DD HH:mm:ss'),
  30 + moment().format('YYYY-MM-DD'),
  31 + task.trx_id,
  32 + task.destination,
  33 + task.remote_product.split(',')[1]
  34 + ];
  35 +
  36 + db.run(query, values, function(err) {
  37 + if (err) {
  38 + if (typeof cb === 'function') cb(err);
  39 + return;
  40 + }
  41 +
  42 + if (typeof cb === 'function') cb(null);
  43 + })
  44 +}
  45 +
  46 +function get(destination, product, created_date, cb) {
  47 + if (typeof cb !== 'function') return;
  48 +
  49 + logger.verbose('PENDING-ARCHIVE: Trying to get trx from table', {destination: destination, product: product, created_date: created_date});
  50 +
  51 +
  52 + const query = "SELECT trx_id FROM pendingtrx WHERE created_date = ? AND destination = ? AND product = ? ";
  53 + db.get(query, created_date, destination, product, function (err, row) {
  54 + if (err) {
  55 + logger.warn('PENDING-ARCHIVE: Error retrieving', {destination: destination, product: product, created_date: created_date, err: err});
  56 + cb(err);
  57 + return;
  58 + }
  59 +
  60 + if (!row) {
  61 + //logger.warn('PENDING-ARCHIVE: Invalid row (empty) when retrieving', {destination: destination, product: product, created_date: created_date});
  62 + cb(null, null);
  63 + return;
  64 + }
  65 +
  66 + if (!row.trx_id) {
  67 + cb(null, null);
  68 + return;
  69 + }
  70 +
  71 + cb(null, row.trx_id);
  72 + })
  73 +}
  74 +
  75 +function remove(trx_id, cb) {
  76 + logger.verbose('PENDING-ARCHIVE: Delete trx from table', {trx_id: trx_id});
  77 +
  78 + const query = "DELETE FROM pendingtrx WHERE trx_id = ?";
  79 + db.run(query, trx_id, function(err) {
  80 + if (err) logger.warn('PENDING-ARCHIVE: Error on deleting trx', {trx_id: trx_id, err: err});
  81 + });
  82 +
  83 + if (typeof cb === 'function') cb(null);
  84 +}
  85 +
  86 +exports.put = put;
  87 +exports.get = get;
  88 +exports.remove = remove;
... ... @@ -0,0 +1,68 @@
  1 +"use strict";
  2 +
  3 +const config = require('komodo-sdk/config');
  4 +const logger = require('komodo-sdk/logger');
  5 +
  6 +const patternMatcher = require('./pattern-rule-matcher');
  7 +const patternValue = require('./pattern-rule-value');
  8 +
  9 +function isAllowedSender(sender) {
  10 + if (!config || !config.sms_parser || !config.sms_parser.allowed_sender || !Array.isArray(config.sms_parser.allowed_sender)) return;
  11 + return config.sms_parser.allowed_sender.indexOf(sender) >= 0;
  12 +}
  13 +
  14 +function getDestination(msg) {
  15 + const result = patternMatcher(msg, config.sms_parser.destination);
  16 + if (result && typeof result === 'string') {
  17 + return result.replace(/^62/, '0');
  18 + }
  19 +}
  20 +
  21 +function getProduct(msg) {
  22 + const product_on_msg = patternMatcher(msg, config.sms_parser.product);
  23 + return product_on_msg && config.remote_product_alias ? config.remote_product_alias[product_on_msg] || product_on_msg : product_on_msg || null;
  24 +}
  25 +
  26 +function getTrxDate(msg) {
  27 + return patternMatcher(msg, config.sms_parser.trx_date);
  28 +}
  29 +
  30 +function getSn(msg) {
  31 + return patternMatcher(msg, config.sms_parser.sn);
  32 +}
  33 +
  34 +function getRc(msg) {
  35 + return patternValue(msg, config.sms_parser.rc) || '68';
  36 +}
  37 +
  38 +function getStockBalance(msg) {
  39 + return {
  40 + name: patternMatcher(msg, config.sms_parser.stock.product),
  41 + balance: patternMatcher(msg, config.sms_parser.stock.balance)
  42 + }
  43 +}
  44 +
  45 +function getMultiStockBalance(msg) {
  46 + if (!config || !config.sms_parser || !config.sms_parser.stock || !config.sms_parser.stock.multistock) return;
  47 +
  48 + if (config.sms_parser.stock.multistock.must_have_pattern) {
  49 + const re = new RegExp(config.sms_parser.stock.multistock.must_have_pattern)
  50 + if (msg.search(re) < 0) {
  51 + return;
  52 + }
  53 + }
  54 +
  55 + const re = new RegExp(config.sms_parser.stock.multistock.pattern, config.sms_parser.stock.multistock.flags);
  56 + const stocks = msg.match(re);
  57 + logger.verbose('SMS-HANDLER: Got multistock', {stocks: stocks});
  58 + return stocks;
  59 +}
  60 +
  61 +exports.isAllowedSender = isAllowedSender;
  62 +exports.getDestination = getDestination;
  63 +exports.getProduct = getProduct;
  64 +exports.getTrxDate = getTrxDate;
  65 +exports.getSn = getSn;
  66 +exports.getRc = getRc;
  67 +exports.getStockBalance = getStockBalance;
  68 +exports.getMultiStockBalance = getMultiStockBalance;
Changes suppressed. Click to show
... ... @@ -4,6 +4,17 @@
4 4 "lockfileVersion": 1,
5 5 "requires": true,
6 6 "dependencies": {
  7 + "@cloudcmd/copy-file": {
  8 + "version": "1.1.1",
  9 + "resolved": "https://registry.npmjs.org/@cloudcmd/copy-file/-/copy-file-1.1.1.tgz",
  10 + "integrity": "sha512-t6pTJdsV0qhh9YX22/Npsv95GqVABc5GRInSK7JSSNIpPLq9TM+K7odYzcOuQRPZAD9OHxZfbYsB4WJOalzqng==",
  11 + "requires": {
  12 + "es6-promisify": "6.0.0",
  13 + "pipe-io": "3.0.3",
  14 + "wraptile": "2.0.0",
  15 + "zames": "2.0.0"
  16 + }
  17 + },
7 18 "@serialport/parser-byte-length": {
8 19 "version": "1.0.5",
9 20 "resolved": "https://registry.npmjs.org/@serialport/parser-byte-length/-/parser-byte-length-1.0.5.tgz",
... ... @@ -53,6 +64,36 @@
53 64 "safe-buffer": "5.1.2"
54 65 }
55 66 },
  67 + "a-sync-waterfall": {
  68 + "version": "1.0.0",
  69 + "resolved": "https://registry.npmjs.org/a-sync-waterfall/-/a-sync-waterfall-1.0.0.tgz",
  70 + "integrity": "sha1-OOgxnXk3niRiiEW1O5ZyKyng5Hw="
  71 + },
  72 + "abbrev": {
  73 + "version": "1.1.1",
  74 + "resolved": "https://registry.npmjs.org/abbrev/-/abbrev-1.1.1.tgz",
  75 + "integrity": "sha512-nne9/IiQ/hzIhY6pdDnbBtz7DjPTKrY00P/zvPSm5pOFkl6xuGrGnXn/VtTNNfNtAfZ9/1RtehkszU9qcTii0Q=="
  76 + },
  77 + "accepts": {
  78 + "version": "1.3.5",
  79 + "resolved": "https://registry.npmjs.org/accepts/-/accepts-1.3.5.tgz",
  80 + "integrity": "sha1-63d99gEXI6OxTopywIBcjoZ0a9I=",
  81 + "requires": {
  82 + "mime-types": "2.1.19",
  83 + "negotiator": "0.6.1"
  84 + }
  85 + },
  86 + "ajv": {
  87 + "version": "5.5.2",
  88 + "resolved": "https://registry.npmjs.org/ajv/-/ajv-5.5.2.tgz",
  89 + "integrity": "sha1-c7Xuyj+rZT49P5Qis0GtQiBdyWU=",
  90 + "requires": {
  91 + "co": "4.6.0",
  92 + "fast-deep-equal": "1.1.0",
  93 + "fast-json-stable-stringify": "2.0.0",
  94 + "json-schema-traverse": "0.3.1"
  95 + }
  96 + },
56 97 "ansi-bgblack": {
57 98 "version": "0.1.1",
58 99 "resolved": "https://registry.npmjs.org/ansi-bgblack/-/ansi-bgblack-0.1.1.tgz",
... ... @@ -305,6 +346,16 @@
305 346 "ansi-wrap": "0.1.0"
306 347 }
307 348 },
  349 + "anymatch": {
  350 + "version": "2.0.0",
  351 + "resolved": "https://registry.npmjs.org/anymatch/-/anymatch-2.0.0.tgz",
  352 + "integrity": "sha512-5teOsQWABXHHBFP9y3skS5P3d/WfWXpv3FUpy+LorMrNYaT9pI4oLMQX7jzQ2KklNpGpWHzdCXTDT2Y3XGlZBw==",
  353 + "optional": true,
  354 + "requires": {
  355 + "micromatch": "3.1.10",
  356 + "normalize-path": "2.1.1"
  357 + }
  358 + },
308 359 "aproba": {
309 360 "version": "1.2.0",
310 361 "resolved": "https://registry.npmjs.org/aproba/-/aproba-1.2.0.tgz",
... ... @@ -319,6 +370,11 @@
319 370 "readable-stream": "2.3.6"
320 371 }
321 372 },
  373 + "arr-diff": {
  374 + "version": "4.0.0",
  375 + "resolved": "https://registry.npmjs.org/arr-diff/-/arr-diff-4.0.0.tgz",
  376 + "integrity": "sha1-1kYQdP6/7HHn4VI1dhoyml3HxSA="
  377 + },
322 378 "arr-flatten": {
323 379 "version": "1.1.0",
324 380 "resolved": "https://registry.npmjs.org/arr-flatten/-/arr-flatten-1.1.0.tgz",
... ... @@ -342,6 +398,121 @@
342 398 }
343 399 }
344 400 },
  401 + "arr-union": {
  402 + "version": "3.1.0",
  403 + "resolved": "https://registry.npmjs.org/arr-union/-/arr-union-3.1.0.tgz",
  404 + "integrity": "sha1-45sJrqne+Gao8gbiiK9jkZuuOcQ="
  405 + },
  406 + "array-flatten": {
  407 + "version": "1.1.1",
  408 + "resolved": "https://registry.npmjs.org/array-flatten/-/array-flatten-1.1.1.tgz",
  409 + "integrity": "sha1-ml9pkFGx5wczKPKgCJaLZOopVdI="
  410 + },
  411 + "array-unique": {
  412 + "version": "0.3.2",
  413 + "resolved": "https://registry.npmjs.org/array-unique/-/array-unique-0.3.2.tgz",
  414 + "integrity": "sha1-qJS3XUvE9s1nnvMkSp/Y9Gri1Cg="
  415 + },
  416 + "asap": {
  417 + "version": "2.0.6",
  418 + "resolved": "https://registry.npmjs.org/asap/-/asap-2.0.6.tgz",
  419 + "integrity": "sha1-5QNHYR1+aQlDIIu9r+vLwvuGbUY="
  420 + },
  421 + "asn1": {
  422 + "version": "0.2.3",
  423 + "resolved": "https://registry.npmjs.org/asn1/-/asn1-0.2.3.tgz",
  424 + "integrity": "sha1-2sh4dxPJlmhJ/IGAd36+nB3fO4Y="
  425 + },
  426 + "assert-plus": {
  427 + "version": "1.0.0",
  428 + "resolved": "https://registry.npmjs.org/assert-plus/-/assert-plus-1.0.0.tgz",
  429 + "integrity": "sha1-8S4PPF13sLHN2RRpQuTpbB5N1SU="
  430 + },
  431 + "assign-symbols": {
  432 + "version": "1.0.0",
  433 + "resolved": "https://registry.npmjs.org/assign-symbols/-/assign-symbols-1.0.0.tgz",
  434 + "integrity": "sha1-WWZ/QfrdTyDMvCu5a41Pf3jsA2c="
  435 + },
  436 + "async": {
  437 + "version": "1.0.0",
  438 + "resolved": "https://registry.npmjs.org/async/-/async-1.0.0.tgz",
  439 + "integrity": "sha1-+PwEyjoTeErenhZBr5hXjPvWR6k="
  440 + },
  441 + "async-each": {
  442 + "version": "1.0.1",
  443 + "resolved": "https://registry.npmjs.org/async-each/-/async-each-1.0.1.tgz",
  444 + "integrity": "sha1-GdOGodntxufByF04iu28xW0zYC0=",
  445 + "optional": true
  446 + },
  447 + "asynckit": {
  448 + "version": "0.4.0",
  449 + "resolved": "https://registry.npmjs.org/asynckit/-/asynckit-0.4.0.tgz",
  450 + "integrity": "sha1-x57Zf380y48robyXkLzDZkdLS3k="
  451 + },
  452 + "atob": {
  453 + "version": "2.1.1",
  454 + "resolved": "https://registry.npmjs.org/atob/-/atob-2.1.1.tgz",
  455 + "integrity": "sha1-ri1acpR38onWDdf5amMUoi3Wwio="
  456 + },
  457 + "aws-sign2": {
  458 + "version": "0.7.0",
  459 + "resolved": "https://registry.npmjs.org/aws-sign2/-/aws-sign2-0.7.0.tgz",
  460 + "integrity": "sha1-tG6JCTSpWR8tL2+G1+ap8bP+dqg="
  461 + },
  462 + "aws4": {
  463 + "version": "1.7.0",
  464 + "resolved": "https://registry.npmjs.org/aws4/-/aws4-1.7.0.tgz",
  465 + "integrity": "sha512-32NDda82rhwD9/JBCCkB+MRYDp0oSvlo2IL6rQWA10PQi7tDUM3eqMSltXmY+Oyl/7N3P3qNtAlv7X0d9bI28w=="
  466 + },
  467 + "balanced-match": {
  468 + "version": "1.0.0",
  469 + "resolved": "https://registry.npmjs.org/balanced-match/-/balanced-match-1.0.0.tgz",
  470 + "integrity": "sha1-ibTRmasr7kneFk6gK4nORi1xt2c="
  471 + },
  472 + "base": {
  473 + "version": "0.11.2",
  474 + "resolved": "https://registry.npmjs.org/base/-/base-0.11.2.tgz",
  475 + "integrity": "sha512-5T6P4xPgpp0YDFvSWwEZ4NoE3aM4QBQXDzmVbraCkFj8zHM+mba8SyqB5DbZWyR7mYHo6Y7BdQo3MoA4m0TeQg==",
  476 + "requires": {
  477 + "cache-base": "1.0.1",
  478 + "class-utils": "0.3.6",
  479 + "component-emitter": "1.2.1",
  480 + "define-property": "1.0.0",
  481 + "isobject": "3.0.1",
  482 + "mixin-deep": "1.3.1",
  483 + "pascalcase": "0.1.1"
  484 + }
  485 + },
  486 + "basic-auth": {
  487 + "version": "2.0.0",
  488 + "resolved": "https://registry.npmjs.org/basic-auth/-/basic-auth-2.0.0.tgz",
  489 + "integrity": "sha1-AV2z81PgLlY3d1X5YnQuiYHnu7o=",
  490 + "requires": {
  491 + "safe-buffer": "5.1.1"
  492 + },
  493 + "dependencies": {
  494 + "safe-buffer": {
  495 + "version": "5.1.1",
  496 + "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.1.1.tgz",
  497 + "integrity": "sha512-kKvNJn6Mm93gAczWVJg7wH+wGYWNrDHdWvpUmHyEsgCtIwwo3bqPtV4tR5tuPaUhTOo/kvhVwd8XwwOllGYkbg=="
  498 + }
  499 + }
  500 + },
  501 + "bcrypt-pbkdf": {
  502 + "version": "1.0.2",
  503 + "resolved": "https://registry.npmjs.org/bcrypt-pbkdf/-/bcrypt-pbkdf-1.0.2.tgz",
  504 + "integrity": "sha1-pDAdOJtqQ/m2f/PKEaP2Y342Dp4=",
  505 + "optional": true,
  506 + "requires": {
  507 + "tweetnacl": "0.14.5"
  508 + }
  509 + },
  510 + "binary-extensions": {
  511 + "version": "1.11.0",
  512 + "resolved": "https://registry.npmjs.org/binary-extensions/-/binary-extensions-1.11.0.tgz",
  513 + "integrity": "sha1-RqoXUftqL5PuXmibsQh9SxTGwgU=",
  514 + "optional": true
  515 + },
345 516 "bindings": {
346 517 "version": "1.3.0",
347 518 "resolved": "https://registry.npmjs.org/bindings/-/bindings-1.3.0.tgz",
... ... @@ -356,6 +527,59 @@
356 527 "safe-buffer": "5.1.2"
357 528 }
358 529 },
  530 + "body-parser": {
  531 + "version": "1.18.3",
  532 + "resolved": "https://registry.npmjs.org/body-parser/-/body-parser-1.18.3.tgz",
  533 + "integrity": "sha1-WykhmP/dVTs6DyDe0FkrlWlVyLQ=",
  534 + "requires": {
  535 + "bytes": "3.0.0",
  536 + "content-type": "1.0.4",
  537 + "debug": "2.6.9",
  538 + "depd": "1.1.2",
  539 + "http-errors": "1.6.3",
  540 + "iconv-lite": "0.4.23",
  541 + "on-finished": "2.3.0",
  542 + "qs": "6.5.2",
  543 + "raw-body": "2.3.3",
  544 + "type-is": "1.6.16"
  545 + },
  546 + "dependencies": {
  547 + "debug": {
  548 + "version": "2.6.9",
  549 + "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz",
  550 + "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==",
  551 + "requires": {
  552 + "ms": "2.0.0"
  553 + }
  554 + }
  555 + }
  556 + },
  557 + "brace-expansion": {
  558 + "version": "1.1.11",
  559 + "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.11.tgz",
  560 + "integrity": "sha512-iCuPHDFgrHX7H2vEI/5xpz07zSHB00TpugqhmYtVmMO6518mCuRMoOYFldEBl0g187ufozdaHgWKcYFb61qGiA==",
  561 + "requires": {
  562 + "balanced-match": "1.0.0",
  563 + "concat-map": "0.0.1"
  564 + }
  565 + },
  566 + "braces": {
  567 + "version": "2.3.2",
  568 + "resolved": "https://registry.npmjs.org/braces/-/braces-2.3.2.tgz",
  569 + "integrity": "sha512-aNdbnj9P8PjdXU4ybaWLK2IF3jc/EoDYbC7AazW6to3TRsfXxscC9UXOB5iDiEQrkyIbWp2SLQda4+QAa7nc3w==",
  570 + "requires": {
  571 + "arr-flatten": "1.1.0",
  572 + "array-unique": "0.3.2",
  573 + "extend-shallow": "2.0.1",
  574 + "fill-range": "4.0.0",
  575 + "isobject": "3.0.1",
  576 + "repeat-element": "1.1.2",
  577 + "snapdragon": "0.8.2",
  578 + "snapdragon-node": "2.1.1",
  579 + "split-string": "3.1.0",
  580 + "to-regex": "3.0.2"
  581 + }
  582 + },
359 583 "buffer-alloc": {
360 584 "version": "1.2.0",
361 585 "resolved": "https://registry.npmjs.org/buffer-alloc/-/buffer-alloc-1.2.0.tgz",
... ... @@ -375,6 +599,72 @@
375 599 "resolved": "https://registry.npmjs.org/buffer-fill/-/buffer-fill-1.0.0.tgz",
376 600 "integrity": "sha1-+PeLdniYiO858gXNY39o5wISKyw="
377 601 },
  602 + "bytes": {
  603 + "version": "3.0.0",
  604 + "resolved": "https://registry.npmjs.org/bytes/-/bytes-3.0.0.tgz",
  605 + "integrity": "sha1-0ygVQE1olpn4Wk6k+odV3ROpYEg="
  606 + },
  607 + "bytewise": {
  608 + "version": "1.1.0",
  609 + "resolved": "https://registry.npmjs.org/bytewise/-/bytewise-1.1.0.tgz",
  610 + "integrity": "sha1-HRPL/3F65xWAlKqIGzXQgbOHJT4=",
  611 + "requires": {
  612 + "bytewise-core": "1.2.3",
  613 + "typewise": "1.0.3"
  614 + }
  615 + },
  616 + "bytewise-core": {
  617 + "version": "1.2.3",
  618 + "resolved": "https://registry.npmjs.org/bytewise-core/-/bytewise-core-1.2.3.tgz",
  619 + "integrity": "sha1-P7QQx+kVWOsasiqCg0V3qmvWHUI=",
  620 + "requires": {
  621 + "typewise-core": "1.2.0"
  622 + }
  623 + },
  624 + "cache-base": {
  625 + "version": "1.0.1",
  626 + "resolved": "https://registry.npmjs.org/cache-base/-/cache-base-1.0.1.tgz",
  627 + "integrity": "sha512-AKcdTnFSWATd5/GCPRxr2ChwIJ85CeyrEyjRHlKxQ56d4XJMGym0uAiKn0xbLOGOl3+yRpOTi484dVCEc5AUzQ==",
  628 + "requires": {
  629 + "collection-visit": "1.0.0",
  630 + "component-emitter": "1.2.1",
  631 + "get-value": "2.0.6",
  632 + "has-value": "1.0.0",
  633 + "isobject": "3.0.1",
  634 + "set-value": "2.0.0",
  635 + "to-object-path": "0.3.0",
  636 + "union-value": "1.0.0",
  637 + "unset-value": "1.0.0"
  638 + },
  639 + "dependencies": {
  640 + "set-value": {
  641 + "version": "2.0.0",
  642 + "resolved": "https://registry.npmjs.org/set-value/-/set-value-2.0.0.tgz",
  643 + "integrity": "sha512-hw0yxk9GT/Hr5yJEYnHNKYXkIA8mVJgd9ditYZCe16ZczcaELYYcfvaXesNACk2O8O0nTiPQcQhGUQj8JLzeeg==",
  644 + "requires": {
  645 + "extend-shallow": "2.0.1",
  646 + "is-extendable": "0.1.1",
  647 + "is-plain-object": "2.0.4",
  648 + "split-string": "3.1.0"
  649 + }
  650 + }
  651 + }
  652 + },
  653 + "camelcase": {
  654 + "version": "2.1.1",
  655 + "resolved": "https://registry.npmjs.org/camelcase/-/camelcase-2.1.1.tgz",
  656 + "integrity": "sha1-fB0W1nmhu+WcoCys7PsBHiAfWh8="
  657 + },
  658 + "caseless": {
  659 + "version": "0.12.0",
  660 + "resolved": "https://registry.npmjs.org/caseless/-/caseless-0.12.0.tgz",
  661 + "integrity": "sha1-G2gcIf+EAzyCZUMJBolCDRhxUdw="
  662 + },
  663 + "charenc": {
  664 + "version": "0.0.2",
  665 + "resolved": "https://registry.npmjs.org/charenc/-/charenc-0.0.2.tgz",
  666 + "integrity": "sha1-wKHS86cJLgN3S/qD8UwPxXkKhmc="
  667 + },
378 668 "choices-separator": {
379 669 "version": "2.0.0",
380 670 "resolved": "https://registry.npmjs.org/choices-separator/-/choices-separator-2.0.0.tgz",
... ... @@ -395,11 +685,119 @@
395 685 }
396 686 }
397 687 },
  688 + "chokidar": {
  689 + "version": "2.0.4",
  690 + "resolved": "https://registry.npmjs.org/chokidar/-/chokidar-2.0.4.tgz",
  691 + "integrity": "sha512-z9n7yt9rOvIJrMhvDtDictKrkFHeihkNl6uWMmZlmL6tJtX9Cs+87oK+teBx+JIgzvbX3yZHT3eF8vpbDxHJXQ==",
  692 + "optional": true,
  693 + "requires": {
  694 + "anymatch": "2.0.0",
  695 + "async-each": "1.0.1",
  696 + "braces": "2.3.2",
  697 + "fsevents": "1.2.4",
  698 + "glob-parent": "3.1.0",
  699 + "inherits": "2.0.3",
  700 + "is-binary-path": "1.0.1",
  701 + "is-glob": "4.0.0",
  702 + "lodash.debounce": "4.0.8",
  703 + "normalize-path": "2.1.1",
  704 + "path-is-absolute": "1.0.1",
  705 + "readdirp": "2.1.0",
  706 + "upath": "1.1.0"
  707 + }
  708 + },
398 709 "chownr": {
399 710 "version": "1.0.1",
400 711 "resolved": "https://registry.npmjs.org/chownr/-/chownr-1.0.1.tgz",
401 712 "integrity": "sha1-4qdQQqlVGQi+vSW4Uj1fl2nXkYE="
402 713 },
  714 + "circular-buffer": {
  715 + "version": "0.0.6",
  716 + "resolved": "https://registry.npmjs.org/circular-buffer/-/circular-buffer-0.0.6.tgz",
  717 + "integrity": "sha1-6c+iujGdNw3idDtgCMpTnN3r9TY="
  718 + },
  719 + "class-utils": {
  720 + "version": "0.3.6",
  721 + "resolved": "https://registry.npmjs.org/class-utils/-/class-utils-0.3.6.tgz",
  722 + "integrity": "sha512-qOhPa/Fj7s6TY8H8esGu5QNpMMQxz79h+urzrNYN6mn+9BnxlDGf5QZ+XeCDsxSjPqsSR56XOZOJmpeurnLMeg==",
  723 + "requires": {
  724 + "arr-union": "3.1.0",
  725 + "define-property": "0.2.5",
  726 + "isobject": "3.0.1",
  727 + "static-extend": "0.1.2"
  728 + },
  729 + "dependencies": {
  730 + "define-property": {
  731 + "version": "0.2.5",
  732 + "resolved": "https://registry.npmjs.org/define-property/-/define-property-0.2.5.tgz",
  733 + "integrity": "sha1-w1se+RjsPJkPmlvFe+BKrOxcgRY=",
  734 + "requires": {
  735 + "is-descriptor": "0.1.6"
  736 + }
  737 + },
  738 + "is-accessor-descriptor": {
  739 + "version": "0.1.6",
  740 + "resolved": "https://registry.npmjs.org/is-accessor-descriptor/-/is-accessor-descriptor-0.1.6.tgz",
  741 + "integrity": "sha1-qeEss66Nh2cn7u84Q/igiXtcmNY=",
  742 + "requires": {
  743 + "kind-of": "3.2.2"
  744 + },
  745 + "dependencies": {
  746 + "kind-of": {
  747 + "version": "3.2.2",
  748 + "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-3.2.2.tgz",
  749 + "integrity": "sha1-MeohpzS6ubuw8yRm2JOupR5KPGQ=",
  750 + "requires": {
  751 + "is-buffer": "1.1.6"
  752 + }
  753 + }
  754 + }
  755 + },
  756 + "is-data-descriptor": {
  757 + "version": "0.1.4",
  758 + "resolved": "https://registry.npmjs.org/is-data-descriptor/-/is-data-descriptor-0.1.4.tgz",
  759 + "integrity": "sha1-C17mSDiOLIYCgueT8YVv7D8wG1Y=",
  760 + "requires": {
  761 + "kind-of": "3.2.2"
  762 + },
  763 + "dependencies": {
  764 + "kind-of": {
  765 + "version": "3.2.2",
  766 + "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-3.2.2.tgz",
  767 + "integrity": "sha1-MeohpzS6ubuw8yRm2JOupR5KPGQ=",
  768 + "requires": {
  769 + "is-buffer": "1.1.6"
  770 + }
  771 + }
  772 + }
  773 + },
  774 + "is-descriptor": {
  775 + "version": "0.1.6",
  776 + "resolved": "https://registry.npmjs.org/is-descriptor/-/is-descriptor-0.1.6.tgz",
  777 + "integrity": "sha512-avDYr0SB3DwO9zsMov0gKCESFYqCnE4hq/4z3TdUlukEy5t9C0YRq7HLrsN52NAcqXKaepeCD0n+B0arnVG3Hg==",
  778 + "requires": {
  779 + "is-accessor-descriptor": "0.1.6",
  780 + "is-data-descriptor": "0.1.4",
  781 + "kind-of": "5.1.0"
  782 + }
  783 + },
  784 + "kind-of": {
  785 + "version": "5.1.0",
  786 + "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-5.1.0.tgz",
  787 + "integrity": "sha512-NGEErnH6F2vUuXDh+OlbcKW7/wOcfdRHaZ7VWtqCztfHri/++YKmP51OdWeGPuqCOba6kk2OTe5d02VmTB80Pw=="
  788 + }
  789 + }
  790 + },
  791 + "cliui": {
  792 + "version": "3.2.0",
  793 + "resolved": "https://registry.npmjs.org/cliui/-/cliui-3.2.0.tgz",
  794 + "integrity": "sha1-EgYBU3qRbSmUD5NNo7SNWFo5IT0=",
  795 + "requires": {
  796 + "string-width": "1.0.2",
  797 + "strip-ansi": "3.0.1",
  798 + "wrap-ansi": "2.1.0"
  799 + }
  800 + },
403 801 "clone-deep": {
404 802 "version": "1.0.0",
405 803 "resolved": "https://registry.npmjs.org/clone-deep/-/clone-deep-1.0.0.tgz",
... ... @@ -418,6 +816,11 @@
418 816 }
419 817 }
420 818 },
  819 + "co": {
  820 + "version": "4.6.0",
  821 + "resolved": "https://registry.npmjs.org/co/-/co-4.6.0.tgz",
  822 + "integrity": "sha1-bqa989hTrlTMuOR7+gvz+QMfsYQ="
  823 + },
421 824 "code-point-at": {
422 825 "version": "1.1.0",
423 826 "resolved": "https://registry.npmjs.org/code-point-at/-/code-point-at-1.1.0.tgz",
... ... @@ -432,6 +835,19 @@
432 835 "object-visit": "1.0.1"
433 836 }
434 837 },
  838 + "colors": {
  839 + "version": "1.0.3",
  840 + "resolved": "https://registry.npmjs.org/colors/-/colors-1.0.3.tgz",
  841 + "integrity": "sha1-BDP0TYCWgP3rYO0mDxsMJi6CpAs="
  842 + },
  843 + "combined-stream": {
  844 + "version": "1.0.6",
  845 + "resolved": "https://registry.npmjs.org/combined-stream/-/combined-stream-1.0.6.tgz",
  846 + "integrity": "sha1-cj599ugBrFYTETp+RFqbactjKBg=",
  847 + "requires": {
  848 + "delayed-stream": "1.0.0"
  849 + }
  850 + },
435 851 "commander": {
436 852 "version": "2.16.0",
437 853 "resolved": "https://registry.npmjs.org/commander/-/commander-2.16.0.tgz",
... ... @@ -442,11 +858,36 @@
442 858 "resolved": "https://registry.npmjs.org/component-emitter/-/component-emitter-1.2.1.tgz",
443 859 "integrity": "sha1-E3kY1teCg/ffemt8WmPhQOaUJeY="
444 860 },
  861 + "concat-map": {
  862 + "version": "0.0.1",
  863 + "resolved": "https://registry.npmjs.org/concat-map/-/concat-map-0.0.1.tgz",
  864 + "integrity": "sha1-2Klr13/Wjfd5OnMDajug1UBdR3s="
  865 + },
445 866 "console-control-strings": {
446 867 "version": "1.1.0",
447 868 "resolved": "https://registry.npmjs.org/console-control-strings/-/console-control-strings-1.1.0.tgz",
448 869 "integrity": "sha1-PXz0Rk22RG6mRL9LOVB/mFEAjo4="
449 870 },
  871 + "content-disposition": {
  872 + "version": "0.5.2",
  873 + "resolved": "https://registry.npmjs.org/content-disposition/-/content-disposition-0.5.2.tgz",
  874 + "integrity": "sha1-DPaLud318r55YcOoUXjLhdunjLQ="
  875 + },
  876 + "content-type": {
  877 + "version": "1.0.4",
  878 + "resolved": "https://registry.npmjs.org/content-type/-/content-type-1.0.4.tgz",
  879 + "integrity": "sha512-hIP3EEPs8tB9AT1L+NUqtwOAps4mk2Zob89MWXMHjHWg9milF/j4osnnQLXBCBFBk/tvIG/tUc9mOUJiPBhPXA=="
  880 + },
  881 + "cookie": {
  882 + "version": "0.3.1",
  883 + "resolved": "https://registry.npmjs.org/cookie/-/cookie-0.3.1.tgz",
  884 + "integrity": "sha1-5+Ch+e9DtMi6klxcWpboBtFoc7s="
  885 + },
  886 + "cookie-signature": {
  887 + "version": "1.0.6",
  888 + "resolved": "https://registry.npmjs.org/cookie-signature/-/cookie-signature-1.0.6.tgz",
  889 + "integrity": "sha1-4wOogrNCzD7oylE6eZmXNNqzriw="
  890 + },
450 891 "copy-descriptor": {
451 892 "version": "0.1.1",
452 893 "resolved": "https://registry.npmjs.org/copy-descriptor/-/copy-descriptor-0.1.1.tgz",
... ... @@ -457,6 +898,42 @@
457 898 "resolved": "https://registry.npmjs.org/core-util-is/-/core-util-is-1.0.2.tgz",
458 899 "integrity": "sha1-tf1UIgqivFq1eqtxQMlAdUUDwac="
459 900 },
  901 + "crc": {
  902 + "version": "3.4.4",
  903 + "resolved": "https://registry.npmjs.org/crc/-/crc-3.4.4.tgz",
  904 + "integrity": "sha1-naHpgOO9RPxck79as9ozeNheRms="
  905 + },
  906 + "cron": {
  907 + "version": "1.3.0",
  908 + "resolved": "https://registry.npmjs.org/cron/-/cron-1.3.0.tgz",
  909 + "integrity": "sha512-K/SF7JlgMmNjcThWxkKvsHhey2EDB4CeOEWJ9aXWj3fbQJppsvTPIeyLdHfNq5IbbsMUUjRW1nr5dSO95f2E4w==",
  910 + "requires": {
  911 + "moment-timezone": "0.5.21"
  912 + }
  913 + },
  914 + "crypt": {
  915 + "version": "0.0.2",
  916 + "resolved": "https://registry.npmjs.org/crypt/-/crypt-0.0.2.tgz",
  917 + "integrity": "sha1-iNf/fsDfuG9xPch7u0LQRNPmxBs="
  918 + },
  919 + "currify": {
  920 + "version": "2.0.6",
  921 + "resolved": "https://registry.npmjs.org/currify/-/currify-2.0.6.tgz",
  922 + "integrity": "sha512-F0lbcoBkA2FMcejFeHJkDEhQ1AvVkTpkn9PMzJch+7mHy5WdteZ9t+nhT6cOdga4uRay3rjvprgp8tUkixFy8w=="
  923 + },
  924 + "cycle": {
  925 + "version": "1.0.3",
  926 + "resolved": "https://registry.npmjs.org/cycle/-/cycle-1.0.3.tgz",
  927 + "integrity": "sha1-IegLK+hYD5i0aPN5QwZisEbDStI="
  928 + },
  929 + "dashdash": {
  930 + "version": "1.14.1",
  931 + "resolved": "https://registry.npmjs.org/dashdash/-/dashdash-1.14.1.tgz",
  932 + "integrity": "sha1-hTz6D3y+L+1d4gMmuN1YEDX24vA=",
  933 + "requires": {
  934 + "assert-plus": "1.0.0"
  935 + }
  936 + },
460 937 "debug": {
461 938 "version": "3.1.0",
462 939 "resolved": "https://registry.npmjs.org/debug/-/debug-3.1.0.tgz",
... ... @@ -465,6 +942,16 @@
465 942 "ms": "2.0.0"
466 943 }
467 944 },
  945 + "decamelize": {
  946 + "version": "1.2.0",
  947 + "resolved": "https://registry.npmjs.org/decamelize/-/decamelize-1.2.0.tgz",
  948 + "integrity": "sha1-9lNNFRSCabIDUue+4m9QH5oZEpA="
  949 + },
  950 + "decode-uri-component": {
  951 + "version": "0.2.0",
  952 + "resolved": "https://registry.npmjs.org/decode-uri-component/-/decode-uri-component-0.2.0.tgz",
  953 + "integrity": "sha1-6zkTMzRYd1y4TNGh+uBiEGu4dUU="
  954 + },
468 955 "decompress-response": {
469 956 "version": "3.3.0",
470 957 "resolved": "https://registry.npmjs.org/decompress-response/-/decompress-response-3.3.0.tgz",
... ... @@ -486,16 +973,65 @@
486 973 "is-descriptor": "1.0.2"
487 974 }
488 975 },
  976 + "delayed-stream": {
  977 + "version": "1.0.0",
  978 + "resolved": "https://registry.npmjs.org/delayed-stream/-/delayed-stream-1.0.0.tgz",
  979 + "integrity": "sha1-3zrhmayt+31ECqrgsp4icrJOxhk="
  980 + },
489 981 "delegates": {
490 982 "version": "1.0.0",
491 983 "resolved": "https://registry.npmjs.org/delegates/-/delegates-1.0.0.tgz",
492 984 "integrity": "sha1-hMbhWbgZBP3KWaDvRM2HDTElD5o="
493 985 },
  986 + "depd": {
  987 + "version": "1.1.2",
  988 + "resolved": "https://registry.npmjs.org/depd/-/depd-1.1.2.tgz",
  989 + "integrity": "sha1-m81S4UwJd2PnSbJ0xDRu0uVgtak="
  990 + },
  991 + "destroy": {
  992 + "version": "1.0.4",
  993 + "resolved": "https://registry.npmjs.org/destroy/-/destroy-1.0.4.tgz",
  994 + "integrity": "sha1-l4hXRCxEdJ5CBmE+N5RiBYJqvYA="
  995 + },
494 996 "detect-libc": {
495 997 "version": "1.0.3",
496 998 "resolved": "https://registry.npmjs.org/detect-libc/-/detect-libc-1.0.3.tgz",
497 999 "integrity": "sha1-+hN8S9aY7fVc1c0CrFWfkaTEups="
498 1000 },
  1001 + "dot-object": {
  1002 + "version": "1.7.0",
  1003 + "resolved": "https://registry.npmjs.org/dot-object/-/dot-object-1.7.0.tgz",
  1004 + "integrity": "sha512-X91KaxzQmhQvfokXCdM8EkJVDHe5HlffhT4eaS6CsLk8Nhs9ChA6KWmrt8kgCz5rmLKzoOEP2tmRK/kBvomFwg==",
  1005 + "requires": {
  1006 + "commander": "2.16.0",
  1007 + "glob": "7.1.2"
  1008 + }
  1009 + },
  1010 + "double-ended-queue": {
  1011 + "version": "2.1.0-0",
  1012 + "resolved": "https://registry.npmjs.org/double-ended-queue/-/double-ended-queue-2.1.0-0.tgz",
  1013 + "integrity": "sha1-ED01J/0xUo9AGIEwyEHv3XgmTlw="
  1014 + },
  1015 + "ecc-jsbn": {
  1016 + "version": "0.1.2",
  1017 + "resolved": "https://registry.npmjs.org/ecc-jsbn/-/ecc-jsbn-0.1.2.tgz",
  1018 + "integrity": "sha1-OoOpBOVDUyh4dMVkt1SThoSamMk=",
  1019 + "optional": true,
  1020 + "requires": {
  1021 + "jsbn": "0.1.1",
  1022 + "safer-buffer": "2.1.2"
  1023 + }
  1024 + },
  1025 + "ee-first": {
  1026 + "version": "1.1.1",
  1027 + "resolved": "https://registry.npmjs.org/ee-first/-/ee-first-1.1.1.tgz",
  1028 + "integrity": "sha1-WQxhFWsK4vTwJVcyoViyZrxWsh0="
  1029 + },
  1030 + "encodeurl": {
  1031 + "version": "1.0.2",
  1032 + "resolved": "https://registry.npmjs.org/encodeurl/-/encodeurl-1.0.2.tgz",
  1033 + "integrity": "sha1-rT/0yG7C0CkyL1oCw6mmBslbP1k="
  1034 + },
499 1035 "end-of-stream": {
500 1036 "version": "1.4.1",
501 1037 "resolved": "https://registry.npmjs.org/end-of-stream/-/end-of-stream-1.4.1.tgz",
... ... @@ -509,61 +1045,1079 @@
509 1045 "resolved": "https://registry.npmjs.org/error-symbol/-/error-symbol-0.1.0.tgz",
510 1046 "integrity": "sha1-Ck2uN9YA0VopukU9jvkg8YRDM/Y="
511 1047 },
512   - "expand-template": {
513   - "version": "1.1.1",
514   - "resolved": "https://registry.npmjs.org/expand-template/-/expand-template-1.1.1.tgz",
515   - "integrity": "sha512-cebqLtV8KOZfw0UI8TEFWxtczxxC1jvyUvx6H4fyp1K1FN7A4Q+uggVUlOsI1K8AGU0rwOGqP8nCapdrw8CYQg=="
516   - },
517   - "extend-shallow": {
518   - "version": "2.0.1",
519   - "resolved": "https://registry.npmjs.org/extend-shallow/-/extend-shallow-2.0.1.tgz",
520   - "integrity": "sha1-Ua99YUrZqfYQ6huvu5idaxxWiQ8=",
521   - "requires": {
522   - "is-extendable": "0.1.1"
523   - }
524   - },
525   - "for-in": {
526   - "version": "1.0.2",
527   - "resolved": "https://registry.npmjs.org/for-in/-/for-in-1.0.2.tgz",
528   - "integrity": "sha1-gQaNKVqBQuwKxybG4iAMMPttXoA="
  1048 + "es6-promisify": {
  1049 + "version": "6.0.0",
  1050 + "resolved": "https://registry.npmjs.org/es6-promisify/-/es6-promisify-6.0.0.tgz",
  1051 + "integrity": "sha512-8Tbqjrb8lC85dd81haajYwuRmiU2rkqNAFnlvQOJeeKqdUloIlI+JcUqeJruV4rCm5Y7oNU7jfs2FbmxhRR/2g=="
529 1052 },
530   - "for-own": {
531   - "version": "1.0.0",
532   - "resolved": "https://registry.npmjs.org/for-own/-/for-own-1.0.0.tgz",
533   - "integrity": "sha1-xjMy9BXO3EsE2/5wz4NklMU8tEs=",
  1053 + "escape-html": {
  1054 + "version": "1.0.3",
  1055 + "resolved": "https://registry.npmjs.org/escape-html/-/escape-html-1.0.3.tgz",
  1056 + "integrity": "sha1-Aljq5NPQwJdN4cFpGI7wBR0dGYg="
  1057 + },
  1058 + "etag": {
  1059 + "version": "1.8.1",
  1060 + "resolved": "https://registry.npmjs.org/etag/-/etag-1.8.1.tgz",
  1061 + "integrity": "sha1-Qa4u62XvpiJorr/qg6x9eSmbCIc="
  1062 + },
  1063 + "expand-brackets": {
  1064 + "version": "2.1.4",
  1065 + "resolved": "https://registry.npmjs.org/expand-brackets/-/expand-brackets-2.1.4.tgz",
  1066 + "integrity": "sha1-t3c14xXOMPa27/D4OwQVGiJEliI=",
  1067 + "optional": true,
  1068 + "requires": {
  1069 + "debug": "2.6.9",
  1070 + "define-property": "0.2.5",
  1071 + "extend-shallow": "2.0.1",
  1072 + "posix-character-classes": "0.1.1",
  1073 + "regex-not": "1.0.2",
  1074 + "snapdragon": "0.8.2",
  1075 + "to-regex": "3.0.2"
  1076 + },
  1077 + "dependencies": {
  1078 + "debug": {
  1079 + "version": "2.6.9",
  1080 + "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz",
  1081 + "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==",
  1082 + "optional": true,
  1083 + "requires": {
  1084 + "ms": "2.0.0"
  1085 + }
  1086 + },
  1087 + "define-property": {
  1088 + "version": "0.2.5",
  1089 + "resolved": "https://registry.npmjs.org/define-property/-/define-property-0.2.5.tgz",
  1090 + "integrity": "sha1-w1se+RjsPJkPmlvFe+BKrOxcgRY=",
  1091 + "optional": true,
  1092 + "requires": {
  1093 + "is-descriptor": "0.1.6"
  1094 + }
  1095 + },
  1096 + "is-accessor-descriptor": {
  1097 + "version": "0.1.6",
  1098 + "resolved": "https://registry.npmjs.org/is-accessor-descriptor/-/is-accessor-descriptor-0.1.6.tgz",
  1099 + "integrity": "sha1-qeEss66Nh2cn7u84Q/igiXtcmNY=",
  1100 + "optional": true,
  1101 + "requires": {
  1102 + "kind-of": "3.2.2"
  1103 + },
  1104 + "dependencies": {
  1105 + "kind-of": {
  1106 + "version": "3.2.2",
  1107 + "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-3.2.2.tgz",
  1108 + "integrity": "sha1-MeohpzS6ubuw8yRm2JOupR5KPGQ=",
  1109 + "optional": true,
  1110 + "requires": {
  1111 + "is-buffer": "1.1.6"
  1112 + }
  1113 + }
  1114 + }
  1115 + },
  1116 + "is-data-descriptor": {
  1117 + "version": "0.1.4",
  1118 + "resolved": "https://registry.npmjs.org/is-data-descriptor/-/is-data-descriptor-0.1.4.tgz",
  1119 + "integrity": "sha1-C17mSDiOLIYCgueT8YVv7D8wG1Y=",
  1120 + "optional": true,
  1121 + "requires": {
  1122 + "kind-of": "3.2.2"
  1123 + },
  1124 + "dependencies": {
  1125 + "kind-of": {
  1126 + "version": "3.2.2",
  1127 + "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-3.2.2.tgz",
  1128 + "integrity": "sha1-MeohpzS6ubuw8yRm2JOupR5KPGQ=",
  1129 + "optional": true,
  1130 + "requires": {
  1131 + "is-buffer": "1.1.6"
  1132 + }
  1133 + }
  1134 + }
  1135 + },
  1136 + "is-descriptor": {
  1137 + "version": "0.1.6",
  1138 + "resolved": "https://registry.npmjs.org/is-descriptor/-/is-descriptor-0.1.6.tgz",
  1139 + "integrity": "sha512-avDYr0SB3DwO9zsMov0gKCESFYqCnE4hq/4z3TdUlukEy5t9C0YRq7HLrsN52NAcqXKaepeCD0n+B0arnVG3Hg==",
  1140 + "optional": true,
  1141 + "requires": {
  1142 + "is-accessor-descriptor": "0.1.6",
  1143 + "is-data-descriptor": "0.1.4",
  1144 + "kind-of": "5.1.0"
  1145 + }
  1146 + },
  1147 + "kind-of": {
  1148 + "version": "5.1.0",
  1149 + "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-5.1.0.tgz",
  1150 + "integrity": "sha512-NGEErnH6F2vUuXDh+OlbcKW7/wOcfdRHaZ7VWtqCztfHri/++YKmP51OdWeGPuqCOba6kk2OTe5d02VmTB80Pw==",
  1151 + "optional": true
  1152 + }
  1153 + }
  1154 + },
  1155 + "expand-template": {
  1156 + "version": "1.1.1",
  1157 + "resolved": "https://registry.npmjs.org/expand-template/-/expand-template-1.1.1.tgz",
  1158 + "integrity": "sha512-cebqLtV8KOZfw0UI8TEFWxtczxxC1jvyUvx6H4fyp1K1FN7A4Q+uggVUlOsI1K8AGU0rwOGqP8nCapdrw8CYQg=="
  1159 + },
  1160 + "express": {
  1161 + "version": "4.16.3",
  1162 + "resolved": "https://registry.npmjs.org/express/-/express-4.16.3.tgz",
  1163 + "integrity": "sha1-avilAjUNsyRuzEvs9rWjTSL37VM=",
  1164 + "requires": {
  1165 + "accepts": "1.3.5",
  1166 + "array-flatten": "1.1.1",
  1167 + "body-parser": "1.18.2",
  1168 + "content-disposition": "0.5.2",
  1169 + "content-type": "1.0.4",
  1170 + "cookie": "0.3.1",
  1171 + "cookie-signature": "1.0.6",
  1172 + "debug": "2.6.9",
  1173 + "depd": "1.1.2",
  1174 + "encodeurl": "1.0.2",
  1175 + "escape-html": "1.0.3",
  1176 + "etag": "1.8.1",
  1177 + "finalhandler": "1.1.1",
  1178 + "fresh": "0.5.2",
  1179 + "merge-descriptors": "1.0.1",
  1180 + "methods": "1.1.2",
  1181 + "on-finished": "2.3.0",
  1182 + "parseurl": "1.3.2",
  1183 + "path-to-regexp": "0.1.7",
  1184 + "proxy-addr": "2.0.4",
  1185 + "qs": "6.5.1",
  1186 + "range-parser": "1.2.0",
  1187 + "safe-buffer": "5.1.1",
  1188 + "send": "0.16.2",
  1189 + "serve-static": "1.13.2",
  1190 + "setprototypeof": "1.1.0",
  1191 + "statuses": "1.4.0",
  1192 + "type-is": "1.6.16",
  1193 + "utils-merge": "1.0.1",
  1194 + "vary": "1.1.2"
  1195 + },
  1196 + "dependencies": {
  1197 + "body-parser": {
  1198 + "version": "1.18.2",
  1199 + "resolved": "https://registry.npmjs.org/body-parser/-/body-parser-1.18.2.tgz",
  1200 + "integrity": "sha1-h2eKGdhLR9hZuDGZvVm84iKxBFQ=",
  1201 + "requires": {
  1202 + "bytes": "3.0.0",
  1203 + "content-type": "1.0.4",
  1204 + "debug": "2.6.9",
  1205 + "depd": "1.1.2",
  1206 + "http-errors": "1.6.3",
  1207 + "iconv-lite": "0.4.19",
  1208 + "on-finished": "2.3.0",
  1209 + "qs": "6.5.1",
  1210 + "raw-body": "2.3.2",
  1211 + "type-is": "1.6.16"
  1212 + }
  1213 + },
  1214 + "debug": {
  1215 + "version": "2.6.9",
  1216 + "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz",
  1217 + "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==",
  1218 + "requires": {
  1219 + "ms": "2.0.0"
  1220 + }
  1221 + },
  1222 + "iconv-lite": {
  1223 + "version": "0.4.19",
  1224 + "resolved": "https://registry.npmjs.org/iconv-lite/-/iconv-lite-0.4.19.tgz",
  1225 + "integrity": "sha512-oTZqweIP51xaGPI4uPa56/Pri/480R+mo7SeU+YETByQNhDG55ycFyNLIgta9vXhILrxXDmF7ZGhqZIcuN0gJQ=="
  1226 + },
  1227 + "qs": {
  1228 + "version": "6.5.1",
  1229 + "resolved": "https://registry.npmjs.org/qs/-/qs-6.5.1.tgz",
  1230 + "integrity": "sha512-eRzhrN1WSINYCDCbrz796z37LOe3m5tmW7RQf6oBntukAG1nmovJvhnwHHRMAfeoItc1m2Hk02WER2aQ/iqs+A=="
  1231 + },
  1232 + "raw-body": {
  1233 + "version": "2.3.2",
  1234 + "resolved": "https://registry.npmjs.org/raw-body/-/raw-body-2.3.2.tgz",
  1235 + "integrity": "sha1-vNYMd9Prk83gBQKVw/N5OJvIj4k=",
  1236 + "requires": {
  1237 + "bytes": "3.0.0",
  1238 + "http-errors": "1.6.2",
  1239 + "iconv-lite": "0.4.19",
  1240 + "unpipe": "1.0.0"
  1241 + },
  1242 + "dependencies": {
  1243 + "depd": {
  1244 + "version": "1.1.1",
  1245 + "resolved": "https://registry.npmjs.org/depd/-/depd-1.1.1.tgz",
  1246 + "integrity": "sha1-V4O04cRZ8G+lyif5kfPQbnoxA1k="
  1247 + },
  1248 + "http-errors": {
  1249 + "version": "1.6.2",
  1250 + "resolved": "https://registry.npmjs.org/http-errors/-/http-errors-1.6.2.tgz",
  1251 + "integrity": "sha1-CgAsyFcHGSp+eUbO7cERVfYOxzY=",
  1252 + "requires": {
  1253 + "depd": "1.1.1",
  1254 + "inherits": "2.0.3",
  1255 + "setprototypeof": "1.0.3",
  1256 + "statuses": "1.4.0"
  1257 + }
  1258 + },
  1259 + "setprototypeof": {
  1260 + "version": "1.0.3",
  1261 + "resolved": "https://registry.npmjs.org/setprototypeof/-/setprototypeof-1.0.3.tgz",
  1262 + "integrity": "sha1-ZlZ+NwQ+608E2RvWWMDL77VbjgQ="
  1263 + }
  1264 + }
  1265 + },
  1266 + "safe-buffer": {
  1267 + "version": "5.1.1",
  1268 + "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.1.1.tgz",
  1269 + "integrity": "sha512-kKvNJn6Mm93gAczWVJg7wH+wGYWNrDHdWvpUmHyEsgCtIwwo3bqPtV4tR5tuPaUhTOo/kvhVwd8XwwOllGYkbg=="
  1270 + },
  1271 + "statuses": {
  1272 + "version": "1.4.0",
  1273 + "resolved": "https://registry.npmjs.org/statuses/-/statuses-1.4.0.tgz",
  1274 + "integrity": "sha512-zhSCtt8v2NDrRlPQpCNtw/heZLtfUDqxBM1udqikb/Hbk52LK4nQSwr10u77iopCW5LsyHpuXS0GnEc48mLeew=="
  1275 + }
  1276 + }
  1277 + },
  1278 + "express-session": {
  1279 + "version": "1.15.6",
  1280 + "resolved": "https://registry.npmjs.org/express-session/-/express-session-1.15.6.tgz",
  1281 + "integrity": "sha512-r0nrHTCYtAMrFwZ0kBzZEXa1vtPVrw0dKvGSrKP4dahwBQ1BJpF2/y1Pp4sCD/0kvxV4zZeclyvfmw0B4RMJQA==",
  1282 + "requires": {
  1283 + "cookie": "0.3.1",
  1284 + "cookie-signature": "1.0.6",
  1285 + "crc": "3.4.4",
  1286 + "debug": "2.6.9",
  1287 + "depd": "1.1.2",
  1288 + "on-headers": "1.0.1",
  1289 + "parseurl": "1.3.2",
  1290 + "uid-safe": "2.1.5",
  1291 + "utils-merge": "1.0.1"
  1292 + },
  1293 + "dependencies": {
  1294 + "debug": {
  1295 + "version": "2.6.9",
  1296 + "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz",
  1297 + "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==",
  1298 + "requires": {
  1299 + "ms": "2.0.0"
  1300 + }
  1301 + }
  1302 + }
  1303 + },
  1304 + "extend": {
  1305 + "version": "3.0.2",
  1306 + "resolved": "https://registry.npmjs.org/extend/-/extend-3.0.2.tgz",
  1307 + "integrity": "sha512-fjquC59cD7CyW6urNXK0FBufkZcoiGG80wTuPujX590cB5Ttln20E2UB4S/WARVqhXffZl2LNgS+gQdPIIim/g=="
  1308 + },
  1309 + "extend-shallow": {
  1310 + "version": "2.0.1",
  1311 + "resolved": "https://registry.npmjs.org/extend-shallow/-/extend-shallow-2.0.1.tgz",
  1312 + "integrity": "sha1-Ua99YUrZqfYQ6huvu5idaxxWiQ8=",
  1313 + "requires": {
  1314 + "is-extendable": "0.1.1"
  1315 + }
  1316 + },
  1317 + "extglob": {
  1318 + "version": "2.0.4",
  1319 + "resolved": "https://registry.npmjs.org/extglob/-/extglob-2.0.4.tgz",
  1320 + "integrity": "sha512-Nmb6QXkELsuBr24CJSkilo6UHHgbekK5UiZgfE6UHD3Eb27YC6oD+bhcT+tJ6cl8dmsgdQxnWlcry8ksBIBLpw==",
  1321 + "optional": true,
  1322 + "requires": {
  1323 + "array-unique": "0.3.2",
  1324 + "define-property": "1.0.0",
  1325 + "expand-brackets": "2.1.4",
  1326 + "extend-shallow": "2.0.1",
  1327 + "fragment-cache": "0.2.1",
  1328 + "regex-not": "1.0.2",
  1329 + "snapdragon": "0.8.2",
  1330 + "to-regex": "3.0.2"
  1331 + }
  1332 + },
  1333 + "extsprintf": {
  1334 + "version": "1.3.0",
  1335 + "resolved": "https://registry.npmjs.org/extsprintf/-/extsprintf-1.3.0.tgz",
  1336 + "integrity": "sha1-lpGEQOMEGnpBT4xS48V06zw+HgU="
  1337 + },
  1338 + "eyes": {
  1339 + "version": "0.1.8",
  1340 + "resolved": "https://registry.npmjs.org/eyes/-/eyes-0.1.8.tgz",
  1341 + "integrity": "sha1-Ys8SAjTGg3hdkCNIqADvPgzCC8A="
  1342 + },
  1343 + "fast-deep-equal": {
  1344 + "version": "1.1.0",
  1345 + "resolved": "https://registry.npmjs.org/fast-deep-equal/-/fast-deep-equal-1.1.0.tgz",
  1346 + "integrity": "sha1-wFNHeBfIa1HaqFPIHgWbcz0CNhQ="
  1347 + },
  1348 + "fast-json-stable-stringify": {
  1349 + "version": "2.0.0",
  1350 + "resolved": "https://registry.npmjs.org/fast-json-stable-stringify/-/fast-json-stable-stringify-2.0.0.tgz",
  1351 + "integrity": "sha1-1RQsDK7msRifh9OnYREGT4bIu/I="
  1352 + },
  1353 + "fill-range": {
  1354 + "version": "4.0.0",
  1355 + "resolved": "https://registry.npmjs.org/fill-range/-/fill-range-4.0.0.tgz",
  1356 + "integrity": "sha1-1USBHUKPmOsGpj3EAtJAPDKMOPc=",
  1357 + "requires": {
  1358 + "extend-shallow": "2.0.1",
  1359 + "is-number": "3.0.0",
  1360 + "repeat-string": "1.6.1",
  1361 + "to-regex-range": "2.1.1"
  1362 + },
  1363 + "dependencies": {
  1364 + "is-number": {
  1365 + "version": "3.0.0",
  1366 + "resolved": "https://registry.npmjs.org/is-number/-/is-number-3.0.0.tgz",
  1367 + "integrity": "sha1-JP1iAaR4LPUFYcgQJ2r8fRLXEZU=",
  1368 + "requires": {
  1369 + "kind-of": "3.2.2"
  1370 + }
  1371 + }
  1372 + }
  1373 + },
  1374 + "finalhandler": {
  1375 + "version": "1.1.1",
  1376 + "resolved": "https://registry.npmjs.org/finalhandler/-/finalhandler-1.1.1.tgz",
  1377 + "integrity": "sha512-Y1GUDo39ez4aHAw7MysnUD5JzYX+WaIj8I57kO3aEPT1fFRL4sr7mjei97FgnwhAyyzRYmQZaTHb2+9uZ1dPtg==",
  1378 + "requires": {
  1379 + "debug": "2.6.9",
  1380 + "encodeurl": "1.0.2",
  1381 + "escape-html": "1.0.3",
  1382 + "on-finished": "2.3.0",
  1383 + "parseurl": "1.3.2",
  1384 + "statuses": "1.4.0",
  1385 + "unpipe": "1.0.0"
  1386 + },
  1387 + "dependencies": {
  1388 + "debug": {
  1389 + "version": "2.6.9",
  1390 + "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz",
  1391 + "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==",
  1392 + "requires": {
  1393 + "ms": "2.0.0"
  1394 + }
  1395 + },
  1396 + "statuses": {
  1397 + "version": "1.4.0",
  1398 + "resolved": "https://registry.npmjs.org/statuses/-/statuses-1.4.0.tgz",
  1399 + "integrity": "sha512-zhSCtt8v2NDrRlPQpCNtw/heZLtfUDqxBM1udqikb/Hbk52LK4nQSwr10u77iopCW5LsyHpuXS0GnEc48mLeew=="
  1400 + }
  1401 + }
  1402 + },
  1403 + "for-in": {
  1404 + "version": "1.0.2",
  1405 + "resolved": "https://registry.npmjs.org/for-in/-/for-in-1.0.2.tgz",
  1406 + "integrity": "sha1-gQaNKVqBQuwKxybG4iAMMPttXoA="
  1407 + },
  1408 + "for-own": {
  1409 + "version": "1.0.0",
  1410 + "resolved": "https://registry.npmjs.org/for-own/-/for-own-1.0.0.tgz",
  1411 + "integrity": "sha1-xjMy9BXO3EsE2/5wz4NklMU8tEs=",
534 1412 "requires": {
535 1413 "for-in": "1.0.2"
536 1414 }
537 1415 },
538   - "fs-constants": {
539   - "version": "1.0.0",
540   - "resolved": "https://registry.npmjs.org/fs-constants/-/fs-constants-1.0.0.tgz",
541   - "integrity": "sha512-y6OAwoSIf7FyjMIv94u+b5rdheZEjzR63GTyZJm5qh4Bi+2YgwLCcI/fPFZkL5PSixOt6ZNKm+w+Hfp/Bciwow=="
  1416 + "forever-agent": {
  1417 + "version": "0.6.1",
  1418 + "resolved": "https://registry.npmjs.org/forever-agent/-/forever-agent-0.6.1.tgz",
  1419 + "integrity": "sha1-+8cfDEGt6zf5bFd60e1C2P2sypE="
  1420 + },
  1421 + "form-data": {
  1422 + "version": "2.3.2",
  1423 + "resolved": "https://registry.npmjs.org/form-data/-/form-data-2.3.2.tgz",
  1424 + "integrity": "sha1-SXBJi+YEwgwAXU9cI67NIda0kJk=",
  1425 + "requires": {
  1426 + "asynckit": "0.4.0",
  1427 + "combined-stream": "1.0.6",
  1428 + "mime-types": "2.1.19"
  1429 + }
  1430 + },
  1431 + "forwarded": {
  1432 + "version": "0.1.2",
  1433 + "resolved": "https://registry.npmjs.org/forwarded/-/forwarded-0.1.2.tgz",
  1434 + "integrity": "sha1-mMI9qxF1ZXuMBXPozszZGw/xjIQ="
  1435 + },
  1436 + "fragment-cache": {
  1437 + "version": "0.2.1",
  1438 + "resolved": "https://registry.npmjs.org/fragment-cache/-/fragment-cache-0.2.1.tgz",
  1439 + "integrity": "sha1-QpD60n8T6Jvn8zeZxrxaCr//DRk=",
  1440 + "requires": {
  1441 + "map-cache": "0.2.2"
  1442 + }
  1443 + },
  1444 + "fresh": {
  1445 + "version": "0.5.2",
  1446 + "resolved": "https://registry.npmjs.org/fresh/-/fresh-0.5.2.tgz",
  1447 + "integrity": "sha1-PYyt2Q2XZWn6g1qx+OSyOhBWBac="
  1448 + },
  1449 + "fs-constants": {
  1450 + "version": "1.0.0",
  1451 + "resolved": "https://registry.npmjs.org/fs-constants/-/fs-constants-1.0.0.tgz",
  1452 + "integrity": "sha512-y6OAwoSIf7FyjMIv94u+b5rdheZEjzR63GTyZJm5qh4Bi+2YgwLCcI/fPFZkL5PSixOt6ZNKm+w+Hfp/Bciwow=="
  1453 + },
  1454 + "fs-copy-file": {
  1455 + "version": "2.1.2",
  1456 + "resolved": "https://registry.npmjs.org/fs-copy-file/-/fs-copy-file-2.1.2.tgz",
  1457 + "integrity": "sha512-h5h3i58/mr86CSJvDLGV0ZEIUj4QfdfKt0NFX6AH4sRTRjs2/d5U1EQt5C9fUV6ZSi7MeSfZRW3LX9HttLXHeg==",
  1458 + "requires": {
  1459 + "@cloudcmd/copy-file": "1.1.1"
  1460 + }
  1461 + },
  1462 + "fs-minipass": {
  1463 + "version": "1.2.5",
  1464 + "resolved": "https://registry.npmjs.org/fs-minipass/-/fs-minipass-1.2.5.tgz",
  1465 + "integrity": "sha512-JhBl0skXjUPCFH7x6x61gQxrKyXsxB5gcgePLZCwfyCGGsTISMoIeObbrvVeP6Xmyaudw4TT43qV2Gz+iyd2oQ==",
  1466 + "requires": {
  1467 + "minipass": "2.3.3"
  1468 + }
  1469 + },
  1470 + "fs.realpath": {
  1471 + "version": "1.0.0",
  1472 + "resolved": "https://registry.npmjs.org/fs.realpath/-/fs.realpath-1.0.0.tgz",
  1473 + "integrity": "sha1-FQStJSMVjKpA20onh8sBQRmU6k8="
  1474 + },
  1475 + "fsevents": {
  1476 + "version": "1.2.4",
  1477 + "resolved": "https://registry.npmjs.org/fsevents/-/fsevents-1.2.4.tgz",
  1478 + "integrity": "sha512-z8H8/diyk76B7q5wg+Ud0+CqzcAF3mBBI/bA5ne5zrRUUIvNkJY//D3BqyH571KuAC4Nr7Rw7CjWX4r0y9DvNg==",
  1479 + "optional": true,
  1480 + "requires": {
  1481 + "nan": "2.10.0",
  1482 + "node-pre-gyp": "0.10.0"
  1483 + },
  1484 + "dependencies": {
  1485 + "abbrev": {
  1486 + "version": "1.1.1",
  1487 + "bundled": true,
  1488 + "optional": true
  1489 + },
  1490 + "ansi-regex": {
  1491 + "version": "2.1.1",
  1492 + "bundled": true
  1493 + },
  1494 + "aproba": {
  1495 + "version": "1.2.0",
  1496 + "bundled": true,
  1497 + "optional": true
  1498 + },
  1499 + "are-we-there-yet": {
  1500 + "version": "1.1.4",
  1501 + "bundled": true,
  1502 + "optional": true,
  1503 + "requires": {
  1504 + "delegates": "1.0.0",
  1505 + "readable-stream": "2.3.6"
  1506 + }
  1507 + },
  1508 + "balanced-match": {
  1509 + "version": "1.0.0",
  1510 + "bundled": true
  1511 + },
  1512 + "brace-expansion": {
  1513 + "version": "1.1.11",
  1514 + "bundled": true,
  1515 + "requires": {
  1516 + "balanced-match": "1.0.0",
  1517 + "concat-map": "0.0.1"
  1518 + }
  1519 + },
  1520 + "chownr": {
  1521 + "version": "1.0.1",
  1522 + "bundled": true,
  1523 + "optional": true
  1524 + },
  1525 + "code-point-at": {
  1526 + "version": "1.1.0",
  1527 + "bundled": true
  1528 + },
  1529 + "concat-map": {
  1530 + "version": "0.0.1",
  1531 + "bundled": true
  1532 + },
  1533 + "console-control-strings": {
  1534 + "version": "1.1.0",
  1535 + "bundled": true
  1536 + },
  1537 + "core-util-is": {
  1538 + "version": "1.0.2",
  1539 + "bundled": true,
  1540 + "optional": true
  1541 + },
  1542 + "debug": {
  1543 + "version": "2.6.9",
  1544 + "bundled": true,
  1545 + "optional": true,
  1546 + "requires": {
  1547 + "ms": "2.0.0"
  1548 + }
  1549 + },
  1550 + "deep-extend": {
  1551 + "version": "0.5.1",
  1552 + "bundled": true,
  1553 + "optional": true
  1554 + },
  1555 + "delegates": {
  1556 + "version": "1.0.0",
  1557 + "bundled": true,
  1558 + "optional": true
  1559 + },
  1560 + "detect-libc": {
  1561 + "version": "1.0.3",
  1562 + "bundled": true,
  1563 + "optional": true
  1564 + },
  1565 + "fs-minipass": {
  1566 + "version": "1.2.5",
  1567 + "bundled": true,
  1568 + "optional": true,
  1569 + "requires": {
  1570 + "minipass": "2.2.4"
  1571 + }
  1572 + },
  1573 + "fs.realpath": {
  1574 + "version": "1.0.0",
  1575 + "bundled": true,
  1576 + "optional": true
  1577 + },
  1578 + "gauge": {
  1579 + "version": "2.7.4",
  1580 + "bundled": true,
  1581 + "optional": true,
  1582 + "requires": {
  1583 + "aproba": "1.2.0",
  1584 + "console-control-strings": "1.1.0",
  1585 + "has-unicode": "2.0.1",
  1586 + "object-assign": "4.1.1",
  1587 + "signal-exit": "3.0.2",
  1588 + "string-width": "1.0.2",
  1589 + "strip-ansi": "3.0.1",
  1590 + "wide-align": "1.1.2"
  1591 + }
  1592 + },
  1593 + "glob": {
  1594 + "version": "7.1.2",
  1595 + "bundled": true,
  1596 + "optional": true,
  1597 + "requires": {
  1598 + "fs.realpath": "1.0.0",
  1599 + "inflight": "1.0.6",
  1600 + "inherits": "2.0.3",
  1601 + "minimatch": "3.0.4",
  1602 + "once": "1.4.0",
  1603 + "path-is-absolute": "1.0.1"
  1604 + }
  1605 + },
  1606 + "has-unicode": {
  1607 + "version": "2.0.1",
  1608 + "bundled": true,
  1609 + "optional": true
  1610 + },
  1611 + "iconv-lite": {
  1612 + "version": "0.4.21",
  1613 + "bundled": true,
  1614 + "optional": true,
  1615 + "requires": {
  1616 + "safer-buffer": "2.1.2"
  1617 + }
  1618 + },
  1619 + "ignore-walk": {
  1620 + "version": "3.0.1",
  1621 + "bundled": true,
  1622 + "optional": true,
  1623 + "requires": {
  1624 + "minimatch": "3.0.4"
  1625 + }
  1626 + },
  1627 + "inflight": {
  1628 + "version": "1.0.6",
  1629 + "bundled": true,
  1630 + "optional": true,
  1631 + "requires": {
  1632 + "once": "1.4.0",
  1633 + "wrappy": "1.0.2"
  1634 + }
  1635 + },
  1636 + "inherits": {
  1637 + "version": "2.0.3",
  1638 + "bundled": true
  1639 + },
  1640 + "ini": {
  1641 + "version": "1.3.5",
  1642 + "bundled": true,
  1643 + "optional": true
  1644 + },
  1645 + "is-fullwidth-code-point": {
  1646 + "version": "1.0.0",
  1647 + "bundled": true,
  1648 + "requires": {
  1649 + "number-is-nan": "1.0.1"
  1650 + }
  1651 + },
  1652 + "isarray": {
  1653 + "version": "1.0.0",
  1654 + "bundled": true,
  1655 + "optional": true
  1656 + },
  1657 + "minimatch": {
  1658 + "version": "3.0.4",
  1659 + "bundled": true,
  1660 + "requires": {
  1661 + "brace-expansion": "1.1.11"
  1662 + }
  1663 + },
  1664 + "minimist": {
  1665 + "version": "0.0.8",
  1666 + "bundled": true
  1667 + },
  1668 + "minipass": {
  1669 + "version": "2.2.4",
  1670 + "bundled": true,
  1671 + "requires": {
  1672 + "safe-buffer": "5.1.1",
  1673 + "yallist": "3.0.2"
  1674 + }
  1675 + },
  1676 + "minizlib": {
  1677 + "version": "1.1.0",
  1678 + "bundled": true,
  1679 + "optional": true,
  1680 + "requires": {
  1681 + "minipass": "2.2.4"
  1682 + }
  1683 + },
  1684 + "mkdirp": {
  1685 + "version": "0.5.1",
  1686 + "bundled": true,
  1687 + "requires": {
  1688 + "minimist": "0.0.8"
  1689 + }
  1690 + },
  1691 + "ms": {
  1692 + "version": "2.0.0",
  1693 + "bundled": true,
  1694 + "optional": true
  1695 + },
  1696 + "needle": {
  1697 + "version": "2.2.0",
  1698 + "bundled": true,
  1699 + "optional": true,
  1700 + "requires": {
  1701 + "debug": "2.6.9",
  1702 + "iconv-lite": "0.4.21",
  1703 + "sax": "1.2.4"
  1704 + }
  1705 + },
  1706 + "node-pre-gyp": {
  1707 + "version": "0.10.0",
  1708 + "bundled": true,
  1709 + "optional": true,
  1710 + "requires": {
  1711 + "detect-libc": "1.0.3",
  1712 + "mkdirp": "0.5.1",
  1713 + "needle": "2.2.0",
  1714 + "nopt": "4.0.1",
  1715 + "npm-packlist": "1.1.10",
  1716 + "npmlog": "4.1.2",
  1717 + "rc": "1.2.7",
  1718 + "rimraf": "2.6.2",
  1719 + "semver": "5.5.0",
  1720 + "tar": "4.4.1"
  1721 + }
  1722 + },
  1723 + "nopt": {
  1724 + "version": "4.0.1",
  1725 + "bundled": true,
  1726 + "optional": true,
  1727 + "requires": {
  1728 + "abbrev": "1.1.1",
  1729 + "osenv": "0.1.5"
  1730 + }
  1731 + },
  1732 + "npm-bundled": {
  1733 + "version": "1.0.3",
  1734 + "bundled": true,
  1735 + "optional": true
  1736 + },
  1737 + "npm-packlist": {
  1738 + "version": "1.1.10",
  1739 + "bundled": true,
  1740 + "optional": true,
  1741 + "requires": {
  1742 + "ignore-walk": "3.0.1",
  1743 + "npm-bundled": "1.0.3"
  1744 + }
  1745 + },
  1746 + "npmlog": {
  1747 + "version": "4.1.2",
  1748 + "bundled": true,
  1749 + "optional": true,
  1750 + "requires": {
  1751 + "are-we-there-yet": "1.1.4",
  1752 + "console-control-strings": "1.1.0",
  1753 + "gauge": "2.7.4",
  1754 + "set-blocking": "2.0.0"
  1755 + }
  1756 + },
  1757 + "number-is-nan": {
  1758 + "version": "1.0.1",
  1759 + "bundled": true
  1760 + },
  1761 + "object-assign": {
  1762 + "version": "4.1.1",
  1763 + "bundled": true,
  1764 + "optional": true
  1765 + },
  1766 + "once": {
  1767 + "version": "1.4.0",
  1768 + "bundled": true,
  1769 + "requires": {
  1770 + "wrappy": "1.0.2"
  1771 + }
  1772 + },
  1773 + "os-homedir": {
  1774 + "version": "1.0.2",
  1775 + "bundled": true,
  1776 + "optional": true
  1777 + },
  1778 + "os-tmpdir": {
  1779 + "version": "1.0.2",
  1780 + "bundled": true,
  1781 + "optional": true
  1782 + },
  1783 + "osenv": {
  1784 + "version": "0.1.5",
  1785 + "bundled": true,
  1786 + "optional": true,
  1787 + "requires": {
  1788 + "os-homedir": "1.0.2",
  1789 + "os-tmpdir": "1.0.2"
  1790 + }
  1791 + },
  1792 + "path-is-absolute": {
  1793 + "version": "1.0.1",
  1794 + "bundled": true,
  1795 + "optional": true
  1796 + },
  1797 + "process-nextick-args": {
  1798 + "version": "2.0.0",
  1799 + "bundled": true,
  1800 + "optional": true
  1801 + },
  1802 + "rc": {
  1803 + "version": "1.2.7",
  1804 + "bundled": true,
  1805 + "optional": true,
  1806 + "requires": {
  1807 + "deep-extend": "0.5.1",
  1808 + "ini": "1.3.5",
  1809 + "minimist": "1.2.0",
  1810 + "strip-json-comments": "2.0.1"
  1811 + },
  1812 + "dependencies": {
  1813 + "minimist": {
  1814 + "version": "1.2.0",
  1815 + "bundled": true,
  1816 + "optional": true
  1817 + }
  1818 + }
  1819 + },
  1820 + "readable-stream": {
  1821 + "version": "2.3.6",
  1822 + "bundled": true,
  1823 + "optional": true,
  1824 + "requires": {
  1825 + "core-util-is": "1.0.2",
  1826 + "inherits": "2.0.3",
  1827 + "isarray": "1.0.0",
  1828 + "process-nextick-args": "2.0.0",
  1829 + "safe-buffer": "5.1.1",
  1830 + "string_decoder": "1.1.1",
  1831 + "util-deprecate": "1.0.2"
  1832 + }
  1833 + },
  1834 + "rimraf": {
  1835 + "version": "2.6.2",
  1836 + "bundled": true,
  1837 + "optional": true,
  1838 + "requires": {
  1839 + "glob": "7.1.2"
  1840 + }
  1841 + },
  1842 + "safe-buffer": {
  1843 + "version": "5.1.1",
  1844 + "bundled": true
  1845 + },
  1846 + "safer-buffer": {
  1847 + "version": "2.1.2",
  1848 + "bundled": true,
  1849 + "optional": true
  1850 + },
  1851 + "sax": {
  1852 + "version": "1.2.4",
  1853 + "bundled": true,
  1854 + "optional": true
  1855 + },
  1856 + "semver": {
  1857 + "version": "5.5.0",
  1858 + "bundled": true,
  1859 + "optional": true
  1860 + },
  1861 + "set-blocking": {
  1862 + "version": "2.0.0",
  1863 + "bundled": true,
  1864 + "optional": true
  1865 + },
  1866 + "signal-exit": {
  1867 + "version": "3.0.2",
  1868 + "bundled": true,
  1869 + "optional": true
  1870 + },
  1871 + "string-width": {
  1872 + "version": "1.0.2",
  1873 + "bundled": true,
  1874 + "requires": {
  1875 + "code-point-at": "1.1.0",
  1876 + "is-fullwidth-code-point": "1.0.0",
  1877 + "strip-ansi": "3.0.1"
  1878 + }
  1879 + },
  1880 + "string_decoder": {
  1881 + "version": "1.1.1",
  1882 + "bundled": true,
  1883 + "optional": true,
  1884 + "requires": {
  1885 + "safe-buffer": "5.1.1"
  1886 + }
  1887 + },
  1888 + "strip-ansi": {
  1889 + "version": "3.0.1",
  1890 + "bundled": true,
  1891 + "requires": {
  1892 + "ansi-regex": "2.1.1"
  1893 + }
  1894 + },
  1895 + "strip-json-comments": {
  1896 + "version": "2.0.1",
  1897 + "bundled": true,
  1898 + "optional": true
  1899 + },
  1900 + "tar": {
  1901 + "version": "4.4.1",
  1902 + "bundled": true,
  1903 + "optional": true,
  1904 + "requires": {
  1905 + "chownr": "1.0.1",
  1906 + "fs-minipass": "1.2.5",
  1907 + "minipass": "2.2.4",
  1908 + "minizlib": "1.1.0",
  1909 + "mkdirp": "0.5.1",
  1910 + "safe-buffer": "5.1.1",
  1911 + "yallist": "3.0.2"
  1912 + }
  1913 + },
  1914 + "util-deprecate": {
  1915 + "version": "1.0.2",
  1916 + "bundled": true,
  1917 + "optional": true
  1918 + },
  1919 + "wide-align": {
  1920 + "version": "1.1.2",
  1921 + "bundled": true,
  1922 + "optional": true,
  1923 + "requires": {
  1924 + "string-width": "1.0.2"
  1925 + }
  1926 + },
  1927 + "wrappy": {
  1928 + "version": "1.0.2",
  1929 + "bundled": true
  1930 + },
  1931 + "yallist": {
  1932 + "version": "3.0.2",
  1933 + "bundled": true
  1934 + }
  1935 + }
  1936 + },
  1937 + "gauge": {
  1938 + "version": "2.7.4",
  1939 + "resolved": "https://registry.npmjs.org/gauge/-/gauge-2.7.4.tgz",
  1940 + "integrity": "sha1-LANAXHU4w51+s3sxcCLjJfsBi/c=",
  1941 + "requires": {
  1942 + "aproba": "1.2.0",
  1943 + "console-control-strings": "1.1.0",
  1944 + "has-unicode": "2.0.1",
  1945 + "object-assign": "4.1.1",
  1946 + "signal-exit": "3.0.2",
  1947 + "string-width": "1.0.2",
  1948 + "strip-ansi": "3.0.1",
  1949 + "wide-align": "1.1.3"
  1950 + }
  1951 + },
  1952 + "get-value": {
  1953 + "version": "2.0.6",
  1954 + "resolved": "https://registry.npmjs.org/get-value/-/get-value-2.0.6.tgz",
  1955 + "integrity": "sha1-3BXKHGcjh8p2vTesCjlbogQqLCg="
  1956 + },
  1957 + "getpass": {
  1958 + "version": "0.1.7",
  1959 + "resolved": "https://registry.npmjs.org/getpass/-/getpass-0.1.7.tgz",
  1960 + "integrity": "sha1-Xv+OPmhNVprkyysSgmBOi6YhSfo=",
  1961 + "requires": {
  1962 + "assert-plus": "1.0.0"
  1963 + }
  1964 + },
  1965 + "github-from-package": {
  1966 + "version": "0.0.0",
  1967 + "resolved": "https://registry.npmjs.org/github-from-package/-/github-from-package-0.0.0.tgz",
  1968 + "integrity": "sha1-l/tdlr/eiXMxPyDoKI75oWf6ZM4="
  1969 + },
  1970 + "glob": {
  1971 + "version": "7.1.2",
  1972 + "resolved": "https://registry.npmjs.org/glob/-/glob-7.1.2.tgz",
  1973 + "integrity": "sha512-MJTUg1kjuLeQCJ+ccE4Vpa6kKVXkPYJ2mOCQyUuKLcLQsdrMCpBPUi8qVE6+YuaJkozeA9NusTAw3hLr8Xe5EQ==",
  1974 + "requires": {
  1975 + "fs.realpath": "1.0.0",
  1976 + "inflight": "1.0.6",
  1977 + "inherits": "2.0.3",
  1978 + "minimatch": "3.0.4",
  1979 + "once": "1.4.0",
  1980 + "path-is-absolute": "1.0.1"
  1981 + }
  1982 + },
  1983 + "glob-parent": {
  1984 + "version": "3.1.0",
  1985 + "resolved": "https://registry.npmjs.org/glob-parent/-/glob-parent-3.1.0.tgz",
  1986 + "integrity": "sha1-nmr2KZ2NO9K9QEMIMr0RPfkGxa4=",
  1987 + "optional": true,
  1988 + "requires": {
  1989 + "is-glob": "3.1.0",
  1990 + "path-dirname": "1.0.2"
  1991 + },
  1992 + "dependencies": {
  1993 + "is-glob": {
  1994 + "version": "3.1.0",
  1995 + "resolved": "https://registry.npmjs.org/is-glob/-/is-glob-3.1.0.tgz",
  1996 + "integrity": "sha1-e6WuJCF4BKxwcHuWkiVnSGzD6Eo=",
  1997 + "optional": true,
  1998 + "requires": {
  1999 + "is-extglob": "2.1.1"
  2000 + }
  2001 + }
  2002 + }
  2003 + },
  2004 + "graceful-fs": {
  2005 + "version": "4.1.11",
  2006 + "resolved": "https://registry.npmjs.org/graceful-fs/-/graceful-fs-4.1.11.tgz",
  2007 + "integrity": "sha1-Dovf5NHduIVNZOBOp8AOKgJuVlg=",
  2008 + "optional": true
  2009 + },
  2010 + "har-schema": {
  2011 + "version": "2.0.0",
  2012 + "resolved": "https://registry.npmjs.org/har-schema/-/har-schema-2.0.0.tgz",
  2013 + "integrity": "sha1-qUwiJOvKwEeCoNkDVSHyRzW37JI="
  2014 + },
  2015 + "har-validator": {
  2016 + "version": "5.0.3",
  2017 + "resolved": "https://registry.npmjs.org/har-validator/-/har-validator-5.0.3.tgz",
  2018 + "integrity": "sha1-ukAsJmGU8VlW7xXg/PJCmT9qff0=",
  2019 + "requires": {
  2020 + "ajv": "5.5.2",
  2021 + "har-schema": "2.0.0"
  2022 + }
  2023 + },
  2024 + "has-unicode": {
  2025 + "version": "2.0.1",
  2026 + "resolved": "https://registry.npmjs.org/has-unicode/-/has-unicode-2.0.1.tgz",
  2027 + "integrity": "sha1-4Ob+aijPUROIVeCG0Wkedx3iqLk="
  2028 + },
  2029 + "has-value": {
  2030 + "version": "1.0.0",
  2031 + "resolved": "https://registry.npmjs.org/has-value/-/has-value-1.0.0.tgz",
  2032 + "integrity": "sha1-GLKB2lhbHFxR3vJMkw7SmgvmsXc=",
  2033 + "requires": {
  2034 + "get-value": "2.0.6",
  2035 + "has-values": "1.0.0",
  2036 + "isobject": "3.0.1"
  2037 + }
  2038 + },
  2039 + "has-values": {
  2040 + "version": "1.0.0",
  2041 + "resolved": "https://registry.npmjs.org/has-values/-/has-values-1.0.0.tgz",
  2042 + "integrity": "sha1-lbC2P+whRmGab+V/51Yo1aOe/k8=",
  2043 + "requires": {
  2044 + "is-number": "3.0.0",
  2045 + "kind-of": "4.0.0"
  2046 + },
  2047 + "dependencies": {
  2048 + "is-number": {
  2049 + "version": "3.0.0",
  2050 + "resolved": "https://registry.npmjs.org/is-number/-/is-number-3.0.0.tgz",
  2051 + "integrity": "sha1-JP1iAaR4LPUFYcgQJ2r8fRLXEZU=",
  2052 + "requires": {
  2053 + "kind-of": "3.2.2"
  2054 + },
  2055 + "dependencies": {
  2056 + "kind-of": {
  2057 + "version": "3.2.2",
  2058 + "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-3.2.2.tgz",
  2059 + "integrity": "sha1-MeohpzS6ubuw8yRm2JOupR5KPGQ=",
  2060 + "requires": {
  2061 + "is-buffer": "1.1.6"
  2062 + }
  2063 + }
  2064 + }
  2065 + },
  2066 + "kind-of": {
  2067 + "version": "4.0.0",
  2068 + "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-4.0.0.tgz",
  2069 + "integrity": "sha1-IIE989cSkosgc3hpGkUGb65y3Vc=",
  2070 + "requires": {
  2071 + "is-buffer": "1.1.6"
  2072 + }
  2073 + }
  2074 + }
  2075 + },
  2076 + "http-errors": {
  2077 + "version": "1.6.3",
  2078 + "resolved": "https://registry.npmjs.org/http-errors/-/http-errors-1.6.3.tgz",
  2079 + "integrity": "sha1-i1VoC7S+KDoLW/TqLjhYC+HZMg0=",
  2080 + "requires": {
  2081 + "depd": "1.1.2",
  2082 + "inherits": "2.0.3",
  2083 + "setprototypeof": "1.1.0",
  2084 + "statuses": "1.5.0"
  2085 + }
542 2086 },
543   - "gauge": {
544   - "version": "2.7.4",
545   - "resolved": "https://registry.npmjs.org/gauge/-/gauge-2.7.4.tgz",
546   - "integrity": "sha1-LANAXHU4w51+s3sxcCLjJfsBi/c=",
  2087 + "http-signature": {
  2088 + "version": "1.2.0",
  2089 + "resolved": "https://registry.npmjs.org/http-signature/-/http-signature-1.2.0.tgz",
  2090 + "integrity": "sha1-muzZJRFHcvPZW2WmCruPfBj7rOE=",
547 2091 "requires": {
548   - "aproba": "1.2.0",
549   - "console-control-strings": "1.1.0",
550   - "has-unicode": "2.0.1",
551   - "object-assign": "4.1.1",
552   - "signal-exit": "3.0.2",
553   - "string-width": "1.0.2",
554   - "strip-ansi": "3.0.1",
555   - "wide-align": "1.1.3"
  2092 + "assert-plus": "1.0.0",
  2093 + "jsprim": "1.4.1",
  2094 + "sshpk": "1.14.2"
556 2095 }
557 2096 },
558   - "github-from-package": {
559   - "version": "0.0.0",
560   - "resolved": "https://registry.npmjs.org/github-from-package/-/github-from-package-0.0.0.tgz",
561   - "integrity": "sha1-l/tdlr/eiXMxPyDoKI75oWf6ZM4="
  2097 + "iconv-lite": {
  2098 + "version": "0.4.23",
  2099 + "resolved": "https://registry.npmjs.org/iconv-lite/-/iconv-lite-0.4.23.tgz",
  2100 + "integrity": "sha512-neyTUVFtahjf0mB3dZT77u+8O0QB89jFdnBkd5P1JgYPbPaia3gXXOVL2fq8VyU2gMMD7SaN7QukTB/pmXYvDA==",
  2101 + "requires": {
  2102 + "safer-buffer": "2.1.2"
  2103 + }
562 2104 },
563   - "has-unicode": {
564   - "version": "2.0.1",
565   - "resolved": "https://registry.npmjs.org/has-unicode/-/has-unicode-2.0.1.tgz",
566   - "integrity": "sha1-4Ob+aijPUROIVeCG0Wkedx3iqLk="
  2105 + "ignore-walk": {
  2106 + "version": "3.0.1",
  2107 + "resolved": "https://registry.npmjs.org/ignore-walk/-/ignore-walk-3.0.1.tgz",
  2108 + "integrity": "sha512-DTVlMx3IYPe0/JJcYP7Gxg7ttZZu3IInhuEhbchuqneY9wWe5Ojy2mXLBaQFUQmo0AW2r3qG7m1mg86js+gnlQ==",
  2109 + "requires": {
  2110 + "minimatch": "3.0.4"
  2111 + }
  2112 + },
  2113 + "inflight": {
  2114 + "version": "1.0.6",
  2115 + "resolved": "https://registry.npmjs.org/inflight/-/inflight-1.0.6.tgz",
  2116 + "integrity": "sha1-Sb1jMdfQLQwJvJEKEHW6gWW1bfk=",
  2117 + "requires": {
  2118 + "once": "1.4.0",
  2119 + "wrappy": "1.0.2"
  2120 + }
567 2121 },
568 2122 "info-symbol": {
569 2123 "version": "0.1.0",
... ... @@ -580,6 +2134,16 @@
580 2134 "resolved": "https://registry.npmjs.org/ini/-/ini-1.3.5.tgz",
581 2135 "integrity": "sha512-RZY5huIKCMRWDUqZlEi72f/lmXKMvuszcMBduliQ3nnWbx9X/ZBQO7DijMEYS9EhHBb2qacRUMtC7svLwe0lcw=="
582 2136 },
  2137 + "invert-kv": {
  2138 + "version": "1.0.0",
  2139 + "resolved": "https://registry.npmjs.org/invert-kv/-/invert-kv-1.0.0.tgz",
  2140 + "integrity": "sha1-EEqOSqym09jNFXqO+L+rLXo//bY="
  2141 + },
  2142 + "ipaddr.js": {
  2143 + "version": "1.8.0",
  2144 + "resolved": "https://registry.npmjs.org/ipaddr.js/-/ipaddr.js-1.8.0.tgz",
  2145 + "integrity": "sha1-6qM9bd16zo9/b+DJygRA5wZzix4="
  2146 + },
583 2147 "is-accessor-descriptor": {
584 2148 "version": "1.0.0",
585 2149 "resolved": "https://registry.npmjs.org/is-accessor-descriptor/-/is-accessor-descriptor-1.0.0.tgz",
... ... @@ -595,6 +2159,15 @@
595 2159 }
596 2160 }
597 2161 },
  2162 + "is-binary-path": {
  2163 + "version": "1.0.1",
  2164 + "resolved": "https://registry.npmjs.org/is-binary-path/-/is-binary-path-1.0.1.tgz",
  2165 + "integrity": "sha1-dfFmQrSA8YenEcgUFh/TpKdlWJg=",
  2166 + "optional": true,
  2167 + "requires": {
  2168 + "binary-extensions": "1.11.0"
  2169 + }
  2170 + },
598 2171 "is-buffer": {
599 2172 "version": "1.1.6",
600 2173 "resolved": "https://registry.npmjs.org/is-buffer/-/is-buffer-1.1.6.tgz",
... ... @@ -637,6 +2210,11 @@
637 2210 "resolved": "https://registry.npmjs.org/is-extendable/-/is-extendable-0.1.1.tgz",
638 2211 "integrity": "sha1-YrEQ4omkcUGOPsNqYX1HLjAd/Ik="
639 2212 },
  2213 + "is-extglob": {
  2214 + "version": "2.1.1",
  2215 + "resolved": "https://registry.npmjs.org/is-extglob/-/is-extglob-2.1.1.tgz",
  2216 + "integrity": "sha1-qIwCU1eR8C7TfHahueqXc8gz+MI="
  2217 + },
640 2218 "is-fullwidth-code-point": {
641 2219 "version": "1.0.0",
642 2220 "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-1.0.0.tgz",
... ... @@ -645,6 +2223,15 @@
645 2223 "number-is-nan": "1.0.1"
646 2224 }
647 2225 },
  2226 + "is-glob": {
  2227 + "version": "4.0.0",
  2228 + "resolved": "https://registry.npmjs.org/is-glob/-/is-glob-4.0.0.tgz",
  2229 + "integrity": "sha1-lSHHaEXMJhCoUgPd8ICpWML/q8A=",
  2230 + "optional": true,
  2231 + "requires": {
  2232 + "is-extglob": "2.1.1"
  2233 + }
  2234 + },
648 2235 "is-number": {
649 2236 "version": "6.0.0",
650 2237 "resolved": "https://registry.npmjs.org/is-number/-/is-number-6.0.0.tgz",
... ... @@ -658,6 +2245,11 @@
658 2245 "isobject": "3.0.1"
659 2246 }
660 2247 },
  2248 + "is-typedarray": {
  2249 + "version": "1.0.0",
  2250 + "resolved": "https://registry.npmjs.org/is-typedarray/-/is-typedarray-1.0.0.tgz",
  2251 + "integrity": "sha1-5HnICFjfDBsR3dppQPlgEfzaSpo="
  2252 + },
661 2253 "is-windows": {
662 2254 "version": "1.0.2",
663 2255 "resolved": "https://registry.npmjs.org/is-windows/-/is-windows-1.0.2.tgz",
... ... @@ -673,11 +2265,53 @@
673 2265 "resolved": "https://registry.npmjs.org/isobject/-/isobject-3.0.1.tgz",
674 2266 "integrity": "sha1-TkMekrEalzFjaqH5yNHMvP2reN8="
675 2267 },
  2268 + "isstream": {
  2269 + "version": "0.1.2",
  2270 + "resolved": "https://registry.npmjs.org/isstream/-/isstream-0.1.2.tgz",
  2271 + "integrity": "sha1-R+Y/evVa+m+S4VAOaQ64uFKcCZo="
  2272 + },
  2273 + "jsbn": {
  2274 + "version": "0.1.1",
  2275 + "resolved": "https://registry.npmjs.org/jsbn/-/jsbn-0.1.1.tgz",
  2276 + "integrity": "sha1-peZUwuWi3rXyAdls77yoDA7y9RM=",
  2277 + "optional": true
  2278 + },
676 2279 "jsesc": {
677 2280 "version": "2.5.1",
678 2281 "resolved": "https://registry.npmjs.org/jsesc/-/jsesc-2.5.1.tgz",
679 2282 "integrity": "sha1-5CGiqOINawgZ3yiQj3glJrlt0f4="
680 2283 },
  2284 + "json-query": {
  2285 + "version": "2.2.2",
  2286 + "resolved": "https://registry.npmjs.org/json-query/-/json-query-2.2.2.tgz",
  2287 + "integrity": "sha1-tlWLijeUzNIXkmqjgCQyS3e0irE="
  2288 + },
  2289 + "json-schema": {
  2290 + "version": "0.2.3",
  2291 + "resolved": "https://registry.npmjs.org/json-schema/-/json-schema-0.2.3.tgz",
  2292 + "integrity": "sha1-tIDIkuWaLwWVTOcnvT8qTogvnhM="
  2293 + },
  2294 + "json-schema-traverse": {
  2295 + "version": "0.3.1",
  2296 + "resolved": "https://registry.npmjs.org/json-schema-traverse/-/json-schema-traverse-0.3.1.tgz",
  2297 + "integrity": "sha1-NJptRMU6Ud6JtAgFxdXlm0F9M0A="
  2298 + },
  2299 + "json-stringify-safe": {
  2300 + "version": "5.0.1",
  2301 + "resolved": "https://registry.npmjs.org/json-stringify-safe/-/json-stringify-safe-5.0.1.tgz",
  2302 + "integrity": "sha1-Epai1Y/UXxmg9s4B1lcB4sc1tus="
  2303 + },
  2304 + "jsprim": {
  2305 + "version": "1.4.1",
  2306 + "resolved": "https://registry.npmjs.org/jsprim/-/jsprim-1.4.1.tgz",
  2307 + "integrity": "sha1-MT5mvB5cwG5Di8G3SZwuXFastqI=",
  2308 + "requires": {
  2309 + "assert-plus": "1.0.0",
  2310 + "extsprintf": "1.3.0",
  2311 + "json-schema": "0.2.3",
  2312 + "verror": "1.10.0"
  2313 + }
  2314 + },
681 2315 "kind-of": {
682 2316 "version": "3.2.2",
683 2317 "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-3.2.2.tgz",
... ... @@ -691,6 +2325,39 @@
691 2325 "resolved": "https://registry.npmjs.org/koalas/-/koalas-1.0.2.tgz",
692 2326 "integrity": "sha1-MYQz8HQjXbePrlZhoCqMpT7ilc0="
693 2327 },
  2328 + "komodo-sdk": {
  2329 + "version": "git+http://gitlab.kodesumber.com/komodo/komodo-sdk.git#db02042ec8d5d0f3ed3a1df491d0868f71fc7841",
  2330 + "requires": {
  2331 + "array-unique": "0.3.2",
  2332 + "basic-auth": "2.0.0",
  2333 + "body-parser": "1.18.3",
  2334 + "dot-object": "1.7.0",
  2335 + "express": "4.16.3",
  2336 + "express-session": "1.15.6",
  2337 + "fs-copy-file": "2.1.2",
  2338 + "json-query": "2.2.2",
  2339 + "lru-cache": "4.1.3",
  2340 + "macaddress": "0.2.9",
  2341 + "moment": "2.22.2",
  2342 + "node-machine-id": "1.1.10",
  2343 + "node-natural-sort": "0.8.7",
  2344 + "numeral": "2.0.6",
  2345 + "nunjucks": "3.1.3",
  2346 + "pkginfo": "0.4.1",
  2347 + "redis": "2.8.0",
  2348 + "request": "2.87.0",
  2349 + "sha1": "1.1.1",
  2350 + "simple-git": "1.96.0",
  2351 + "sort-object": "3.0.2",
  2352 + "strftime": "0.10.0",
  2353 + "string-natural-compare": "2.0.2",
  2354 + "uniqid": "4.1.1",
  2355 + "uuid": "3.3.2",
  2356 + "winston": "2.4.3",
  2357 + "winston-circular-buffer": "1.0.0",
  2358 + "winston-daily-rotate-file": "1.7.2"
  2359 + }
  2360 + },
694 2361 "lazy-cache": {
695 2362 "version": "2.0.2",
696 2363 "resolved": "https://registry.npmjs.org/lazy-cache/-/lazy-cache-2.0.2.tgz",
... ... @@ -699,6 +2366,20 @@
699 2366 "set-getter": "0.1.0"
700 2367 }
701 2368 },
  2369 + "lcid": {
  2370 + "version": "1.0.0",
  2371 + "resolved": "https://registry.npmjs.org/lcid/-/lcid-1.0.0.tgz",
  2372 + "integrity": "sha1-MIrMr6C8SDo4Z7S28rlQYlHRuDU=",
  2373 + "requires": {
  2374 + "invert-kv": "1.0.0"
  2375 + }
  2376 + },
  2377 + "lodash.debounce": {
  2378 + "version": "4.0.8",
  2379 + "resolved": "https://registry.npmjs.org/lodash.debounce/-/lodash.debounce-4.0.8.tgz",
  2380 + "integrity": "sha1-gteb/zCmfEAF/9XiUVMArZyk168=",
  2381 + "optional": true
  2382 + },
702 2383 "log-ok": {
703 2384 "version": "0.1.1",
704 2385 "resolved": "https://registry.npmjs.org/log-ok/-/log-ok-0.1.1.tgz",
... ... @@ -722,6 +2403,25 @@
722 2403 "warning-symbol": "0.1.0"
723 2404 }
724 2405 },
  2406 + "lru-cache": {
  2407 + "version": "4.1.3",
  2408 + "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-4.1.3.tgz",
  2409 + "integrity": "sha512-fFEhvcgzuIoJVUF8fYr5KR0YqxD238zgObTps31YdADwPPAp82a4M8TrckkWyx7ekNlf9aBcVn81cFwwXngrJA==",
  2410 + "requires": {
  2411 + "pseudomap": "1.0.2",
  2412 + "yallist": "2.1.2"
  2413 + }
  2414 + },
  2415 + "macaddress": {
  2416 + "version": "0.2.9",
  2417 + "resolved": "https://registry.npmjs.org/macaddress/-/macaddress-0.2.9.tgz",
  2418 + "integrity": "sha512-k4F1JUof6cQXxNFzx3thLby4oJzXTXQueAOOts944Vqizn+Rjc2QNFenT9FJSLU1CH3PmrHRSyZs2E+Cqw+P2w=="
  2419 + },
  2420 + "map-cache": {
  2421 + "version": "0.2.2",
  2422 + "resolved": "https://registry.npmjs.org/map-cache/-/map-cache-0.2.2.tgz",
  2423 + "integrity": "sha1-wyq9C9ZSXZsFFkW7TyasXcmKDb8="
  2424 + },
725 2425 "map-visit": {
726 2426 "version": "1.0.0",
727 2427 "resolved": "https://registry.npmjs.org/map-visit/-/map-visit-1.0.0.tgz",
... ... @@ -730,16 +2430,158 @@
730 2430 "object-visit": "1.0.1"
731 2431 }
732 2432 },
  2433 + "media-typer": {
  2434 + "version": "0.3.0",
  2435 + "resolved": "https://registry.npmjs.org/media-typer/-/media-typer-0.3.0.tgz",
  2436 + "integrity": "sha1-hxDXrwqmJvj/+hzgAWhUUmMlV0g="
  2437 + },
  2438 + "merge-descriptors": {
  2439 + "version": "1.0.1",
  2440 + "resolved": "https://registry.npmjs.org/merge-descriptors/-/merge-descriptors-1.0.1.tgz",
  2441 + "integrity": "sha1-sAqqVW3YtEVoFQ7J0blT8/kMu2E="
  2442 + },
  2443 + "methods": {
  2444 + "version": "1.1.2",
  2445 + "resolved": "https://registry.npmjs.org/methods/-/methods-1.1.2.tgz",
  2446 + "integrity": "sha1-VSmk1nZUE07cxSZmVoNbD4Ua/O4="
  2447 + },
  2448 + "micromatch": {
  2449 + "version": "3.1.10",
  2450 + "resolved": "https://registry.npmjs.org/micromatch/-/micromatch-3.1.10.tgz",
  2451 + "integrity": "sha512-MWikgl9n9M3w+bpsY3He8L+w9eF9338xRl8IAO5viDizwSzziFEyUzo2xrrloB64ADbTf8uA8vRqqttDTOmccg==",
  2452 + "optional": true,
  2453 + "requires": {
  2454 + "arr-diff": "4.0.0",
  2455 + "array-unique": "0.3.2",
  2456 + "braces": "2.3.2",
  2457 + "define-property": "2.0.2",
  2458 + "extend-shallow": "3.0.2",
  2459 + "extglob": "2.0.4",
  2460 + "fragment-cache": "0.2.1",
  2461 + "kind-of": "6.0.2",
  2462 + "nanomatch": "1.2.13",
  2463 + "object.pick": "1.3.0",
  2464 + "regex-not": "1.0.2",
  2465 + "snapdragon": "0.8.2",
  2466 + "to-regex": "3.0.2"
  2467 + },
  2468 + "dependencies": {
  2469 + "define-property": {
  2470 + "version": "2.0.2",
  2471 + "resolved": "https://registry.npmjs.org/define-property/-/define-property-2.0.2.tgz",
  2472 + "integrity": "sha512-jwK2UV4cnPpbcG7+VRARKTZPUWowwXA8bzH5NP6ud0oeAxyYPuGZUAC7hMugpCdz4BeSZl2Dl9k66CHJ/46ZYQ==",
  2473 + "optional": true,
  2474 + "requires": {
  2475 + "is-descriptor": "1.0.2",
  2476 + "isobject": "3.0.1"
  2477 + }
  2478 + },
  2479 + "extend-shallow": {
  2480 + "version": "3.0.2",
  2481 + "resolved": "https://registry.npmjs.org/extend-shallow/-/extend-shallow-3.0.2.tgz",
  2482 + "integrity": "sha1-Jqcarwc7OfshJxcnRhMcJwQCjbg=",
  2483 + "optional": true,
  2484 + "requires": {
  2485 + "assign-symbols": "1.0.0",
  2486 + "is-extendable": "1.0.1"
  2487 + }
  2488 + },
  2489 + "is-extendable": {
  2490 + "version": "1.0.1",
  2491 + "resolved": "https://registry.npmjs.org/is-extendable/-/is-extendable-1.0.1.tgz",
  2492 + "integrity": "sha512-arnXMxT1hhoKo9k1LZdmlNyJdDDfy2v0fXjFlmok4+i8ul/6WlbVge9bhM74OpNPQPMGUToDtz+KXa1PneJxOA==",
  2493 + "optional": true,
  2494 + "requires": {
  2495 + "is-plain-object": "2.0.4"
  2496 + }
  2497 + },
  2498 + "kind-of": {
  2499 + "version": "6.0.2",
  2500 + "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-6.0.2.tgz",
  2501 + "integrity": "sha512-s5kLOcnH0XqDO+FvuaLX8DDjZ18CGFk7VygH40QoKPUQhW4e2rvM0rwUq0t8IQDOwYSeLK01U90OjzBTme2QqA==",
  2502 + "optional": true
  2503 + }
  2504 + }
  2505 + },
  2506 + "mime": {
  2507 + "version": "1.4.1",
  2508 + "resolved": "https://registry.npmjs.org/mime/-/mime-1.4.1.tgz",
  2509 + "integrity": "sha512-KI1+qOZu5DcW6wayYHSzR/tXKCDC5Om4s1z2QJjDULzLcmf3DvzS7oluY4HCTrc+9FiKmWUgeNLg7W3uIQvxtQ=="
  2510 + },
  2511 + "mime-db": {
  2512 + "version": "1.35.0",
  2513 + "resolved": "https://registry.npmjs.org/mime-db/-/mime-db-1.35.0.tgz",
  2514 + "integrity": "sha512-JWT/IcCTsB0Io3AhWUMjRqucrHSPsSf2xKLaRldJVULioggvkJvggZ3VXNNSRkCddE6D+BUI4HEIZIA2OjwIvg=="
  2515 + },
  2516 + "mime-types": {
  2517 + "version": "2.1.19",
  2518 + "resolved": "https://registry.npmjs.org/mime-types/-/mime-types-2.1.19.tgz",
  2519 + "integrity": "sha512-P1tKYHVSZ6uFo26mtnve4HQFE3koh1UWVkp8YUC+ESBHe945xWSoXuHHiGarDqcEZ+whpCDnlNw5LON0kLo+sw==",
  2520 + "requires": {
  2521 + "mime-db": "1.35.0"
  2522 + }
  2523 + },
733 2524 "mimic-response": {
734 2525 "version": "1.0.1",
735 2526 "resolved": "https://registry.npmjs.org/mimic-response/-/mimic-response-1.0.1.tgz",
736 2527 "integrity": "sha512-j5EctnkH7amfV/q5Hgmoal1g2QHFJRraOtmx0JpIqkxhBhI/lJSl1nMpQ45hVarwNETOoWEimndZ4QK0RHxuxQ=="
737 2528 },
  2529 + "minimatch": {
  2530 + "version": "3.0.4",
  2531 + "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.0.4.tgz",
  2532 + "integrity": "sha512-yJHVQEhyqPLUTgt9B83PXu6W3rx4MvvHvSUvToogpwoGDOUQ+yDrR0HRot+yOCdCO7u4hX3pWft6kWBBcqh0UA==",
  2533 + "requires": {
  2534 + "brace-expansion": "1.1.11"
  2535 + }
  2536 + },
738 2537 "minimist": {
739 2538 "version": "1.2.0",
740 2539 "resolved": "https://registry.npmjs.org/minimist/-/minimist-1.2.0.tgz",
741 2540 "integrity": "sha1-o1AIsg9BOD7sH7kU9M1d95omQoQ="
742 2541 },
  2542 + "minipass": {
  2543 + "version": "2.3.3",
  2544 + "resolved": "https://registry.npmjs.org/minipass/-/minipass-2.3.3.tgz",
  2545 + "integrity": "sha512-/jAn9/tEX4gnpyRATxgHEOV6xbcyxgT7iUnxo9Y3+OB0zX00TgKIv/2FZCf5brBbICcwbLqVv2ImjvWWrQMSYw==",
  2546 + "requires": {
  2547 + "safe-buffer": "5.1.2",
  2548 + "yallist": "3.0.2"
  2549 + },
  2550 + "dependencies": {
  2551 + "yallist": {
  2552 + "version": "3.0.2",
  2553 + "resolved": "https://registry.npmjs.org/yallist/-/yallist-3.0.2.tgz",
  2554 + "integrity": "sha1-hFK0u36Dx8GI2AQcGoN8dz1ti7k="
  2555 + }
  2556 + }
  2557 + },
  2558 + "minizlib": {
  2559 + "version": "1.1.0",
  2560 + "resolved": "https://registry.npmjs.org/minizlib/-/minizlib-1.1.0.tgz",
  2561 + "integrity": "sha512-4T6Ur/GctZ27nHfpt9THOdRZNgyJ9FZchYO1ceg5S8Q3DNLCKYy44nCZzgCJgcvx2UM8czmqak5BCxJMrq37lA==",
  2562 + "requires": {
  2563 + "minipass": "2.3.3"
  2564 + }
  2565 + },
  2566 + "mixin-deep": {
  2567 + "version": "1.3.1",
  2568 + "resolved": "https://registry.npmjs.org/mixin-deep/-/mixin-deep-1.3.1.tgz",
  2569 + "integrity": "sha512-8ZItLHeEgaqEvd5lYBXfm4EZSFCX29Jb9K+lAHhDKzReKBQKj3R+7NOF6tjqYi9t4oI8VUfaWITJQm86wnXGNQ==",
  2570 + "requires": {
  2571 + "for-in": "1.0.2",
  2572 + "is-extendable": "1.0.1"
  2573 + },
  2574 + "dependencies": {
  2575 + "is-extendable": {
  2576 + "version": "1.0.1",
  2577 + "resolved": "https://registry.npmjs.org/is-extendable/-/is-extendable-1.0.1.tgz",
  2578 + "integrity": "sha512-arnXMxT1hhoKo9k1LZdmlNyJdDDfy2v0fXjFlmok4+i8ul/6WlbVge9bhM74OpNPQPMGUToDtz+KXa1PneJxOA==",
  2579 + "requires": {
  2580 + "is-plain-object": "2.0.4"
  2581 + }
  2582 + }
  2583 + }
  2584 + },
743 2585 "mixin-object": {
744 2586 "version": "2.0.1",
745 2587 "resolved": "https://registry.npmjs.org/mixin-object/-/mixin-object-2.0.1.tgz",
... ... @@ -776,6 +2618,14 @@
776 2618 "resolved": "https://registry.npmjs.org/moment/-/moment-2.22.2.tgz",
777 2619 "integrity": "sha1-PCV/mDn8DpP/UxSWMiOeuQeD/2Y="
778 2620 },
  2621 + "moment-timezone": {
  2622 + "version": "0.5.21",
  2623 + "resolved": "https://registry.npmjs.org/moment-timezone/-/moment-timezone-0.5.21.tgz",
  2624 + "integrity": "sha512-j96bAh4otsgj3lKydm3K7kdtA3iKf2m6MY2iSYCzCm5a1zmHo1g+aK3068dDEeocLZQIS9kU8bsdQHLqEvgW0A==",
  2625 + "requires": {
  2626 + "moment": "2.22.2"
  2627 + }
  2628 + },
779 2629 "ms": {
780 2630 "version": "2.0.0",
781 2631 "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz",
... ... @@ -791,6 +2641,87 @@
791 2641 "resolved": "https://registry.npmjs.org/nan/-/nan-2.10.0.tgz",
792 2642 "integrity": "sha512-bAdJv7fBLhWC+/Bls0Oza+mvTaNQtP+1RyhhhvD95pgUJz6XM5IzgmxOkItJ9tkoCiplvAnXI1tNmmUD/eScyA=="
793 2643 },
  2644 + "nanomatch": {
  2645 + "version": "1.2.13",
  2646 + "resolved": "https://registry.npmjs.org/nanomatch/-/nanomatch-1.2.13.tgz",
  2647 + "integrity": "sha512-fpoe2T0RbHwBTBUOftAfBPaDEi06ufaUai0mE6Yn1kacc3SnTErfb/h+X94VXzI64rKFHYImXSvdwGGCmwOqCA==",
  2648 + "optional": true,
  2649 + "requires": {
  2650 + "arr-diff": "4.0.0",
  2651 + "array-unique": "0.3.2",
  2652 + "define-property": "2.0.2",
  2653 + "extend-shallow": "3.0.2",
  2654 + "fragment-cache": "0.2.1",
  2655 + "is-windows": "1.0.2",
  2656 + "kind-of": "6.0.2",
  2657 + "object.pick": "1.3.0",
  2658 + "regex-not": "1.0.2",
  2659 + "snapdragon": "0.8.2",
  2660 + "to-regex": "3.0.2"
  2661 + },
  2662 + "dependencies": {
  2663 + "define-property": {
  2664 + "version": "2.0.2",
  2665 + "resolved": "https://registry.npmjs.org/define-property/-/define-property-2.0.2.tgz",
  2666 + "integrity": "sha512-jwK2UV4cnPpbcG7+VRARKTZPUWowwXA8bzH5NP6ud0oeAxyYPuGZUAC7hMugpCdz4BeSZl2Dl9k66CHJ/46ZYQ==",
  2667 + "optional": true,
  2668 + "requires": {
  2669 + "is-descriptor": "1.0.2",
  2670 + "isobject": "3.0.1"
  2671 + }
  2672 + },
  2673 + "extend-shallow": {
  2674 + "version": "3.0.2",
  2675 + "resolved": "https://registry.npmjs.org/extend-shallow/-/extend-shallow-3.0.2.tgz",
  2676 + "integrity": "sha1-Jqcarwc7OfshJxcnRhMcJwQCjbg=",
  2677 + "optional": true,
  2678 + "requires": {
  2679 + "assign-symbols": "1.0.0",
  2680 + "is-extendable": "1.0.1"
  2681 + }
  2682 + },
  2683 + "is-extendable": {
  2684 + "version": "1.0.1",
  2685 + "resolved": "https://registry.npmjs.org/is-extendable/-/is-extendable-1.0.1.tgz",
  2686 + "integrity": "sha512-arnXMxT1hhoKo9k1LZdmlNyJdDDfy2v0fXjFlmok4+i8ul/6WlbVge9bhM74OpNPQPMGUToDtz+KXa1PneJxOA==",
  2687 + "optional": true,
  2688 + "requires": {
  2689 + "is-plain-object": "2.0.4"
  2690 + }
  2691 + },
  2692 + "kind-of": {
  2693 + "version": "6.0.2",
  2694 + "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-6.0.2.tgz",
  2695 + "integrity": "sha512-s5kLOcnH0XqDO+FvuaLX8DDjZ18CGFk7VygH40QoKPUQhW4e2rvM0rwUq0t8IQDOwYSeLK01U90OjzBTme2QqA==",
  2696 + "optional": true
  2697 + }
  2698 + }
  2699 + },
  2700 + "needle": {
  2701 + "version": "2.2.1",
  2702 + "resolved": "https://registry.npmjs.org/needle/-/needle-2.2.1.tgz",
  2703 + "integrity": "sha512-t/ZswCM9JTWjAdXS9VpvqhI2Ct2sL2MdY4fUXqGJaGBk13ge99ObqRksRTbBE56K+wxUXwwfZYOuZHifFW9q+Q==",
  2704 + "requires": {
  2705 + "debug": "2.6.9",
  2706 + "iconv-lite": "0.4.23",
  2707 + "sax": "1.2.4"
  2708 + },
  2709 + "dependencies": {
  2710 + "debug": {
  2711 + "version": "2.6.9",
  2712 + "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz",
  2713 + "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==",
  2714 + "requires": {
  2715 + "ms": "2.0.0"
  2716 + }
  2717 + }
  2718 + }
  2719 + },
  2720 + "negotiator": {
  2721 + "version": "0.6.1",
  2722 + "resolved": "https://registry.npmjs.org/negotiator/-/negotiator-0.6.1.tgz",
  2723 + "integrity": "sha1-KzJxhOiZIQEXeyhWP7XnECrNDKk="
  2724 + },
794 2725 "node-abi": {
795 2726 "version": "2.4.3",
796 2727 "resolved": "https://registry.npmjs.org/node-abi/-/node-abi-2.4.3.tgz",
... ... @@ -799,11 +2730,69 @@
799 2730 "semver": "5.5.0"
800 2731 }
801 2732 },
  2733 + "node-machine-id": {
  2734 + "version": "1.1.10",
  2735 + "resolved": "https://registry.npmjs.org/node-machine-id/-/node-machine-id-1.1.10.tgz",
  2736 + "integrity": "sha512-6SVxo3Ic2Qc09z1rCJh3No7ubizPLszImsMQnZZWfzeOC6SYU4orN214++c3ikB8uaP/A6dwSlO88A3ohI5oNA=="
  2737 + },
  2738 + "node-natural-sort": {
  2739 + "version": "0.8.7",
  2740 + "resolved": "https://registry.npmjs.org/node-natural-sort/-/node-natural-sort-0.8.7.tgz",
  2741 + "integrity": "sha512-rMaLlHV5BlnRhIl6jUfgqdLY5U0NJkIxUdOsmpz3Txwh7js4+GwTiomhO8W4rp3SvX1zZ56mx13zfEWESr+qqA=="
  2742 + },
  2743 + "node-pre-gyp": {
  2744 + "version": "0.10.3",
  2745 + "resolved": "https://registry.npmjs.org/node-pre-gyp/-/node-pre-gyp-0.10.3.tgz",
  2746 + "integrity": "sha512-d1xFs+C/IPS8Id0qPTZ4bUT8wWryfR/OzzAFxweG+uLN85oPzyo2Iw6bVlLQ/JOdgNonXLCoRyqDzDWq4iw72A==",
  2747 + "requires": {
  2748 + "detect-libc": "1.0.3",
  2749 + "mkdirp": "0.5.1",
  2750 + "needle": "2.2.1",
  2751 + "nopt": "4.0.1",
  2752 + "npm-packlist": "1.1.11",
  2753 + "npmlog": "4.1.2",
  2754 + "rc": "1.2.8",
  2755 + "rimraf": "2.6.2",
  2756 + "semver": "5.5.0",
  2757 + "tar": "4.4.4"
  2758 + }
  2759 + },
802 2760 "noop-logger": {
803 2761 "version": "0.1.1",
804 2762 "resolved": "https://registry.npmjs.org/noop-logger/-/noop-logger-0.1.1.tgz",
805 2763 "integrity": "sha1-lKKxYzxPExdVMAfYlm/Q6EG2pMI="
806 2764 },
  2765 + "nopt": {
  2766 + "version": "4.0.1",
  2767 + "resolved": "https://registry.npmjs.org/nopt/-/nopt-4.0.1.tgz",
  2768 + "integrity": "sha1-0NRoWv1UFRk8jHUFYC0NF81kR00=",
  2769 + "requires": {
  2770 + "abbrev": "1.1.1",
  2771 + "osenv": "0.1.5"
  2772 + }
  2773 + },
  2774 + "normalize-path": {
  2775 + "version": "2.1.1",
  2776 + "resolved": "https://registry.npmjs.org/normalize-path/-/normalize-path-2.1.1.tgz",
  2777 + "integrity": "sha1-GrKLVW4Zg2Oowab35vogE3/mrtk=",
  2778 + "requires": {
  2779 + "remove-trailing-separator": "1.1.0"
  2780 + }
  2781 + },
  2782 + "npm-bundled": {
  2783 + "version": "1.0.3",
  2784 + "resolved": "https://registry.npmjs.org/npm-bundled/-/npm-bundled-1.0.3.tgz",
  2785 + "integrity": "sha512-ByQ3oJ/5ETLyglU2+8dBObvhfWXX8dtPZDMePCahptliFX2iIuhyEszyFk401PZUNQH20vvdW5MLjJxkwU80Ow=="
  2786 + },
  2787 + "npm-packlist": {
  2788 + "version": "1.1.11",
  2789 + "resolved": "https://registry.npmjs.org/npm-packlist/-/npm-packlist-1.1.11.tgz",
  2790 + "integrity": "sha512-CxKlZ24urLkJk+9kCm48RTQ7L4hsmgSVzEk0TLGPzzyuFxD7VNgy5Sl24tOLMzQv773a/NeJ1ce1DKeacqffEA==",
  2791 + "requires": {
  2792 + "ignore-walk": "3.0.1",
  2793 + "npm-bundled": "1.0.3"
  2794 + }
  2795 + },
807 2796 "npmlog": {
808 2797 "version": "4.1.2",
809 2798 "resolved": "https://registry.npmjs.org/npmlog/-/npmlog-4.1.2.tgz",
... ... @@ -820,6 +2809,28 @@
820 2809 "resolved": "https://registry.npmjs.org/number-is-nan/-/number-is-nan-1.0.1.tgz",
821 2810 "integrity": "sha1-CXtgK1NCKlIsGvuHkDGDNpQaAR0="
822 2811 },
  2812 + "numeral": {
  2813 + "version": "2.0.6",
  2814 + "resolved": "https://registry.npmjs.org/numeral/-/numeral-2.0.6.tgz",
  2815 + "integrity": "sha1-StCAk21EPCVhrtnyGX7//iX05QY="
  2816 + },
  2817 + "nunjucks": {
  2818 + "version": "3.1.3",
  2819 + "resolved": "https://registry.npmjs.org/nunjucks/-/nunjucks-3.1.3.tgz",
  2820 + "integrity": "sha512-UtlKKAzg9vdtvURdNy9DjGhiB7qYf2R7Ez+hsucOQG5gYJexSggXSSZ+9IpSDyKOlWu/4rMVPH2oVoANOSqNKA==",
  2821 + "requires": {
  2822 + "a-sync-waterfall": "1.0.0",
  2823 + "asap": "2.0.6",
  2824 + "chokidar": "2.0.4",
  2825 + "postinstall-build": "5.0.1",
  2826 + "yargs": "3.32.0"
  2827 + }
  2828 + },
  2829 + "oauth-sign": {
  2830 + "version": "0.8.2",
  2831 + "resolved": "https://registry.npmjs.org/oauth-sign/-/oauth-sign-0.8.2.tgz",
  2832 + "integrity": "sha1-Rqarfwrq2N6unsBWV4C31O/rnUM="
  2833 + },
823 2834 "object-assign": {
824 2835 "version": "4.1.1",
825 2836 "resolved": "https://registry.npmjs.org/object-assign/-/object-assign-4.1.1.tgz",
... ... @@ -886,6 +2897,27 @@
886 2897 "isobject": "3.0.1"
887 2898 }
888 2899 },
  2900 + "object.pick": {
  2901 + "version": "1.3.0",
  2902 + "resolved": "https://registry.npmjs.org/object.pick/-/object.pick-1.3.0.tgz",
  2903 + "integrity": "sha1-h6EKxMFpS9Lhy/U1kaZhQftd10c=",
  2904 + "requires": {
  2905 + "isobject": "3.0.1"
  2906 + }
  2907 + },
  2908 + "on-finished": {
  2909 + "version": "2.3.0",
  2910 + "resolved": "https://registry.npmjs.org/on-finished/-/on-finished-2.3.0.tgz",
  2911 + "integrity": "sha1-IPEzZIGwg811M3mSoWlxqi2QaUc=",
  2912 + "requires": {
  2913 + "ee-first": "1.1.1"
  2914 + }
  2915 + },
  2916 + "on-headers": {
  2917 + "version": "1.0.1",
  2918 + "resolved": "https://registry.npmjs.org/on-headers/-/on-headers-1.0.1.tgz",
  2919 + "integrity": "sha1-ko9dD0cNSTQmUepnlLCFfBAGk/c="
  2920 + },
889 2921 "once": {
890 2922 "version": "1.4.0",
891 2923 "resolved": "https://registry.npmjs.org/once/-/once-1.4.0.tgz",
... ... @@ -899,11 +2931,85 @@
899 2931 "resolved": "https://registry.npmjs.org/os-homedir/-/os-homedir-1.0.2.tgz",
900 2932 "integrity": "sha1-/7xJiDNuDoM94MFox+8VISGqf7M="
901 2933 },
  2934 + "os-locale": {
  2935 + "version": "1.4.0",
  2936 + "resolved": "https://registry.npmjs.org/os-locale/-/os-locale-1.4.0.tgz",
  2937 + "integrity": "sha1-IPnxeuKe00XoveWDsT0gCYA8FNk=",
  2938 + "requires": {
  2939 + "lcid": "1.0.0"
  2940 + }
  2941 + },
  2942 + "os-tmpdir": {
  2943 + "version": "1.0.2",
  2944 + "resolved": "https://registry.npmjs.org/os-tmpdir/-/os-tmpdir-1.0.2.tgz",
  2945 + "integrity": "sha1-u+Z0BseaqFxc/sdm/lc0VV36EnQ="
  2946 + },
  2947 + "osenv": {
  2948 + "version": "0.1.5",
  2949 + "resolved": "https://registry.npmjs.org/osenv/-/osenv-0.1.5.tgz",
  2950 + "integrity": "sha512-0CWcCECdMVc2Rw3U5w9ZjqX6ga6ubk1xDVKxtBQPK7wis/0F2r9T6k4ydGYhecl7YUBxBVxhL5oisPsNxAPe2g==",
  2951 + "requires": {
  2952 + "os-homedir": "1.0.2",
  2953 + "os-tmpdir": "1.0.2"
  2954 + }
  2955 + },
  2956 + "parseurl": {
  2957 + "version": "1.3.2",
  2958 + "resolved": "https://registry.npmjs.org/parseurl/-/parseurl-1.3.2.tgz",
  2959 + "integrity": "sha1-/CidTtiZMRlGDBViUyYs3I3mW/M="
  2960 + },
  2961 + "pascalcase": {
  2962 + "version": "0.1.1",
  2963 + "resolved": "https://registry.npmjs.org/pascalcase/-/pascalcase-0.1.1.tgz",
  2964 + "integrity": "sha1-s2PlXoAGym/iF4TS2yK9FdeRfxQ="
  2965 + },
  2966 + "path-dirname": {
  2967 + "version": "1.0.2",
  2968 + "resolved": "https://registry.npmjs.org/path-dirname/-/path-dirname-1.0.2.tgz",
  2969 + "integrity": "sha1-zDPSTVJeCZpTiMAzbG4yuRYGCeA=",
  2970 + "optional": true
  2971 + },
  2972 + "path-is-absolute": {
  2973 + "version": "1.0.1",
  2974 + "resolved": "https://registry.npmjs.org/path-is-absolute/-/path-is-absolute-1.0.1.tgz",
  2975 + "integrity": "sha1-F0uSaHNVNP+8es5r9TpanhtcX18="
  2976 + },
  2977 + "path-to-regexp": {
  2978 + "version": "0.1.7",
  2979 + "resolved": "https://registry.npmjs.org/path-to-regexp/-/path-to-regexp-0.1.7.tgz",
  2980 + "integrity": "sha1-32BBeABfUi8V60SQ5yR6G/qmf4w="
  2981 + },
  2982 + "performance-now": {
  2983 + "version": "2.1.0",
  2984 + "resolved": "https://registry.npmjs.org/performance-now/-/performance-now-2.1.0.tgz",
  2985 + "integrity": "sha1-Ywn04OX6kT7BxpMHrjZLSzd8nns="
  2986 + },
  2987 + "pipe-io": {
  2988 + "version": "3.0.3",
  2989 + "resolved": "https://registry.npmjs.org/pipe-io/-/pipe-io-3.0.3.tgz",
  2990 + "integrity": "sha512-7s7HlpMq6WAvd+Xbc2C6NQKEIkDbaSUm0CYtNsjidfyOpbTJmFcvzon47VkMJ6nszEj/X4t4lQs5bqeXgrzMgg=="
  2991 + },
  2992 + "pkginfo": {
  2993 + "version": "0.4.1",
  2994 + "resolved": "https://registry.npmjs.org/pkginfo/-/pkginfo-0.4.1.tgz",
  2995 + "integrity": "sha1-tUGO8EOd5UJfxJlQQtztFPsqhP8="
  2996 + },
902 2997 "pointer-symbol": {
903 2998 "version": "1.0.0",
904 2999 "resolved": "https://registry.npmjs.org/pointer-symbol/-/pointer-symbol-1.0.0.tgz",
905 3000 "integrity": "sha1-YPkRAgTqepKbYmRKITFVQ8uz1Ec="
906 3001 },
  3002 + "posix-character-classes": {
  3003 + "version": "0.1.1",
  3004 + "resolved": "https://registry.npmjs.org/posix-character-classes/-/posix-character-classes-0.1.1.tgz",
  3005 + "integrity": "sha1-AerA/jta9xoqbAL+q7jB/vfgDqs=",
  3006 + "optional": true
  3007 + },
  3008 + "postinstall-build": {
  3009 + "version": "5.0.1",
  3010 + "resolved": "https://registry.npmjs.org/postinstall-build/-/postinstall-build-5.0.1.tgz",
  3011 + "integrity": "sha1-uRepB5smF42aJK9aXNjLSpkdEbk="
  3012 + },
907 3013 "prebuild-install": {
908 3014 "version": "4.0.0",
909 3015 "resolved": "https://registry.npmjs.org/prebuild-install/-/prebuild-install-4.0.0.tgz",
... ... @@ -1096,6 +3202,20 @@
1096 3202 }
1097 3203 }
1098 3204 },
  3205 + "proxy-addr": {
  3206 + "version": "2.0.4",
  3207 + "resolved": "https://registry.npmjs.org/proxy-addr/-/proxy-addr-2.0.4.tgz",
  3208 + "integrity": "sha512-5erio2h9jp5CHGwcybmxmVqHmnCBZeewlfJ0pex+UW7Qny7OOZXTtH56TGNyBizkgiOwhJtMKrVzDTeKcySZwA==",
  3209 + "requires": {
  3210 + "forwarded": "0.1.2",
  3211 + "ipaddr.js": "1.8.0"
  3212 + }
  3213 + },
  3214 + "pseudomap": {
  3215 + "version": "1.0.2",
  3216 + "resolved": "https://registry.npmjs.org/pseudomap/-/pseudomap-1.0.2.tgz",
  3217 + "integrity": "sha1-8FKijacOYYkX7wqKw0wa5aaChrM="
  3218 + },
1099 3219 "pump": {
1100 3220 "version": "2.0.1",
1101 3221 "resolved": "https://registry.npmjs.org/pump/-/pump-2.0.1.tgz",
... ... @@ -1105,6 +3225,16 @@
1105 3225 "once": "1.4.0"
1106 3226 }
1107 3227 },
  3228 + "punycode": {
  3229 + "version": "1.4.1",
  3230 + "resolved": "https://registry.npmjs.org/punycode/-/punycode-1.4.1.tgz",
  3231 + "integrity": "sha1-wNWmOycYgArY4esPpSachN1BhF4="
  3232 + },
  3233 + "qs": {
  3234 + "version": "6.5.2",
  3235 + "resolved": "https://registry.npmjs.org/qs/-/qs-6.5.2.tgz",
  3236 + "integrity": "sha512-N5ZAX4/LxJmF+7wN74pUD6qAh9/wnvdQcjq9TZjevvXzSUo7bfmw91saqMjzGS2xq91/odN2dW/WOl7qQHNDGA=="
  3237 + },
1108 3238 "radio-symbol": {
1109 3239 "version": "2.0.0",
1110 3240 "resolved": "https://registry.npmjs.org/radio-symbol/-/radio-symbol-2.0.0.tgz",
... ... @@ -1115,6 +3245,27 @@
1115 3245 "is-windows": "1.0.2"
1116 3246 }
1117 3247 },
  3248 + "random-bytes": {
  3249 + "version": "1.0.0",
  3250 + "resolved": "https://registry.npmjs.org/random-bytes/-/random-bytes-1.0.0.tgz",
  3251 + "integrity": "sha1-T2ih3Arli9P7lYSMMDJNt11kNgs="
  3252 + },
  3253 + "range-parser": {
  3254 + "version": "1.2.0",
  3255 + "resolved": "https://registry.npmjs.org/range-parser/-/range-parser-1.2.0.tgz",
  3256 + "integrity": "sha1-9JvmtIeJTdxA3MlKMi9hEJLgDV4="
  3257 + },
  3258 + "raw-body": {
  3259 + "version": "2.3.3",
  3260 + "resolved": "https://registry.npmjs.org/raw-body/-/raw-body-2.3.3.tgz",
  3261 + "integrity": "sha512-9esiElv1BrZoI3rCDuOuKCBRbuApGGaDPQfjSflGxdy4oyzqghxu6klEkkVIvBje+FF0BX9coEv8KqW6X/7njw==",
  3262 + "requires": {
  3263 + "bytes": "3.0.0",
  3264 + "http-errors": "1.6.3",
  3265 + "iconv-lite": "0.4.23",
  3266 + "unpipe": "1.0.0"
  3267 + }
  3268 + },
1118 3269 "rc": {
1119 3270 "version": "1.2.8",
1120 3271 "resolved": "https://registry.npmjs.org/rc/-/rc-1.2.8.tgz",
... ... @@ -1140,6 +3291,18 @@
1140 3291 "util-deprecate": "1.0.2"
1141 3292 }
1142 3293 },
  3294 + "readdirp": {
  3295 + "version": "2.1.0",
  3296 + "resolved": "https://registry.npmjs.org/readdirp/-/readdirp-2.1.0.tgz",
  3297 + "integrity": "sha1-TtCtBg3zBzMAxIRANz9y0cxkLXg=",
  3298 + "optional": true,
  3299 + "requires": {
  3300 + "graceful-fs": "4.1.11",
  3301 + "minimatch": "3.0.4",
  3302 + "readable-stream": "2.3.6",
  3303 + "set-immediate-shim": "1.0.1"
  3304 + }
  3305 + },
1143 3306 "readline-ui": {
1144 3307 "version": "2.2.3",
1145 3308 "resolved": "https://registry.npmjs.org/readline-ui/-/readline-ui-2.2.3.tgz",
... ... @@ -1209,100 +3372,583 @@
1209 3372 "resolved": "https://registry.npmjs.org/is-number/-/is-number-3.0.0.tgz",
1210 3373 "integrity": "sha1-JP1iAaR4LPUFYcgQJ2r8fRLXEZU=",
1211 3374 "requires": {
1212   - "kind-of": "3.2.2"
  3375 + "kind-of": "3.2.2"
  3376 + }
  3377 + }
  3378 + }
  3379 + },
  3380 + "redis": {
  3381 + "version": "2.8.0",
  3382 + "resolved": "https://registry.npmjs.org/redis/-/redis-2.8.0.tgz",
  3383 + "integrity": "sha512-M1OkonEQwtRmZv4tEWF2VgpG0JWJ8Fv1PhlgT5+B+uNq2cA3Rt1Yt/ryoR+vQNOQcIEgdCdfH0jr3bDpihAw1A==",
  3384 + "requires": {
  3385 + "double-ended-queue": "2.1.0-0",
  3386 + "redis-commands": "1.3.5",
  3387 + "redis-parser": "2.6.0"
  3388 + }
  3389 + },
  3390 + "redis-commands": {
  3391 + "version": "1.3.5",
  3392 + "resolved": "https://registry.npmjs.org/redis-commands/-/redis-commands-1.3.5.tgz",
  3393 + "integrity": "sha512-foGF8u6MXGFF++1TZVC6icGXuMYPftKXt1FBT2vrfU9ZATNtZJ8duRC5d1lEfE8hyVe3jhelHGB91oB7I6qLsA=="
  3394 + },
  3395 + "redis-parser": {
  3396 + "version": "2.6.0",
  3397 + "resolved": "https://registry.npmjs.org/redis-parser/-/redis-parser-2.6.0.tgz",
  3398 + "integrity": "sha1-Uu0J2srBCPGmMcB+m2mUHnoZUEs="
  3399 + },
  3400 + "regex-not": {
  3401 + "version": "1.0.2",
  3402 + "resolved": "https://registry.npmjs.org/regex-not/-/regex-not-1.0.2.tgz",
  3403 + "integrity": "sha512-J6SDjUgDxQj5NusnOtdFxDwN/+HWykR8GELwctJ7mdqhcyy1xEc4SRFHUXvxTp661YaVKAjfRLZ9cCqS6tn32A==",
  3404 + "requires": {
  3405 + "extend-shallow": "3.0.2",
  3406 + "safe-regex": "1.1.0"
  3407 + },
  3408 + "dependencies": {
  3409 + "extend-shallow": {
  3410 + "version": "3.0.2",
  3411 + "resolved": "https://registry.npmjs.org/extend-shallow/-/extend-shallow-3.0.2.tgz",
  3412 + "integrity": "sha1-Jqcarwc7OfshJxcnRhMcJwQCjbg=",
  3413 + "requires": {
  3414 + "assign-symbols": "1.0.0",
  3415 + "is-extendable": "1.0.1"
  3416 + }
  3417 + },
  3418 + "is-extendable": {
  3419 + "version": "1.0.1",
  3420 + "resolved": "https://registry.npmjs.org/is-extendable/-/is-extendable-1.0.1.tgz",
  3421 + "integrity": "sha512-arnXMxT1hhoKo9k1LZdmlNyJdDDfy2v0fXjFlmok4+i8ul/6WlbVge9bhM74OpNPQPMGUToDtz+KXa1PneJxOA==",
  3422 + "requires": {
  3423 + "is-plain-object": "2.0.4"
  3424 + }
  3425 + }
  3426 + }
  3427 + },
  3428 + "remove-trailing-separator": {
  3429 + "version": "1.1.0",
  3430 + "resolved": "https://registry.npmjs.org/remove-trailing-separator/-/remove-trailing-separator-1.1.0.tgz",
  3431 + "integrity": "sha1-wkvOKig62tW8P1jg1IJJuSN52O8="
  3432 + },
  3433 + "repeat-element": {
  3434 + "version": "1.1.2",
  3435 + "resolved": "https://registry.npmjs.org/repeat-element/-/repeat-element-1.1.2.tgz",
  3436 + "integrity": "sha1-7wiaF40Ug7quTZPrmLT55OEdmQo="
  3437 + },
  3438 + "repeat-string": {
  3439 + "version": "1.6.1",
  3440 + "resolved": "https://registry.npmjs.org/repeat-string/-/repeat-string-1.6.1.tgz",
  3441 + "integrity": "sha1-jcrkcOHIirwtYA//Sndihtp15jc="
  3442 + },
  3443 + "request": {
  3444 + "version": "2.87.0",
  3445 + "resolved": "https://registry.npmjs.org/request/-/request-2.87.0.tgz",
  3446 + "integrity": "sha512-fcogkm7Az5bsS6Sl0sibkbhcKsnyon/jV1kF3ajGmF0c8HrttdKTPRT9hieOaQHA5HEq6r8OyWOo/o781C1tNw==",
  3447 + "requires": {
  3448 + "aws-sign2": "0.7.0",
  3449 + "aws4": "1.7.0",
  3450 + "caseless": "0.12.0",
  3451 + "combined-stream": "1.0.6",
  3452 + "extend": "3.0.2",
  3453 + "forever-agent": "0.6.1",
  3454 + "form-data": "2.3.2",
  3455 + "har-validator": "5.0.3",
  3456 + "http-signature": "1.2.0",
  3457 + "is-typedarray": "1.0.0",
  3458 + "isstream": "0.1.2",
  3459 + "json-stringify-safe": "5.0.1",
  3460 + "mime-types": "2.1.19",
  3461 + "oauth-sign": "0.8.2",
  3462 + "performance-now": "2.1.0",
  3463 + "qs": "6.5.2",
  3464 + "safe-buffer": "5.1.2",
  3465 + "tough-cookie": "2.3.4",
  3466 + "tunnel-agent": "0.6.0",
  3467 + "uuid": "3.3.2"
  3468 + }
  3469 + },
  3470 + "resolve-url": {
  3471 + "version": "0.2.1",
  3472 + "resolved": "https://registry.npmjs.org/resolve-url/-/resolve-url-0.2.1.tgz",
  3473 + "integrity": "sha1-LGN/53yJOv0qZj/iGqkIAGjiBSo="
  3474 + },
  3475 + "ret": {
  3476 + "version": "0.1.15",
  3477 + "resolved": "https://registry.npmjs.org/ret/-/ret-0.1.15.tgz",
  3478 + "integrity": "sha512-TTlYpa+OL+vMMNG24xSlQGEJ3B/RzEfUlLct7b5G/ytav+wPrplCpVMFuwzXbkecJrb6IYo1iFb0S9v37754mg=="
  3479 + },
  3480 + "rimraf": {
  3481 + "version": "2.6.2",
  3482 + "resolved": "https://registry.npmjs.org/rimraf/-/rimraf-2.6.2.tgz",
  3483 + "integrity": "sha512-lreewLK/BlghmxtfH36YYVg1i8IAce4TI7oao75I1g245+6BctqTVQiBP3YUJ9C6DQOXJmkYR9X9fCLtCOJc5w==",
  3484 + "requires": {
  3485 + "glob": "7.1.2"
  3486 + }
  3487 + },
  3488 + "safe-buffer": {
  3489 + "version": "5.1.2",
  3490 + "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.1.2.tgz",
  3491 + "integrity": "sha512-Gd2UZBJDkXlY7GbJxfsE8/nvKkUEU1G38c1siN6QP6a9PT9MmHB8GnpscSmMJSoF8LOIrt8ud/wPtojys4G6+g=="
  3492 + },
  3493 + "safe-regex": {
  3494 + "version": "1.1.0",
  3495 + "resolved": "https://registry.npmjs.org/safe-regex/-/safe-regex-1.1.0.tgz",
  3496 + "integrity": "sha1-QKNmnzsHfR6UPURinhV91IAjvy4=",
  3497 + "requires": {
  3498 + "ret": "0.1.15"
  3499 + }
  3500 + },
  3501 + "safer-buffer": {
  3502 + "version": "2.1.2",
  3503 + "resolved": "https://registry.npmjs.org/safer-buffer/-/safer-buffer-2.1.2.tgz",
  3504 + "integrity": "sha512-YZo3K82SD7Riyi0E1EQPojLz7kpepnSQI9IyPbHHg1XXXevb5dJI7tpyN2ADxGcQbHG7vcyRHk0cbwqcQriUtg=="
  3505 + },
  3506 + "sax": {
  3507 + "version": "1.2.4",
  3508 + "resolved": "https://registry.npmjs.org/sax/-/sax-1.2.4.tgz",
  3509 + "integrity": "sha512-NqVDv9TpANUjFm0N8uM5GxL36UgKi9/atZw+x7YFnQ8ckwFGKrl4xX4yWtrey3UJm5nP1kUbnYgLopqWNSRhWw=="
  3510 + },
  3511 + "semver": {
  3512 + "version": "5.5.0",
  3513 + "resolved": "https://registry.npmjs.org/semver/-/semver-5.5.0.tgz",
  3514 + "integrity": "sha512-4SJ3dm0WAwWy/NVeioZh5AntkdJoWKxHxcmyP622fOkgHa4z3R0TdBJICINyaSDE6uNwVc8gZr+ZinwZAH4xIA=="
  3515 + },
  3516 + "send": {
  3517 + "version": "0.16.2",
  3518 + "resolved": "https://registry.npmjs.org/send/-/send-0.16.2.tgz",
  3519 + "integrity": "sha512-E64YFPUssFHEFBvpbbjr44NCLtI1AohxQ8ZSiJjQLskAdKuriYEP6VyGEsRDH8ScozGpkaX1BGvhanqCwkcEZw==",
  3520 + "requires": {
  3521 + "debug": "2.6.9",
  3522 + "depd": "1.1.2",
  3523 + "destroy": "1.0.4",
  3524 + "encodeurl": "1.0.2",
  3525 + "escape-html": "1.0.3",
  3526 + "etag": "1.8.1",
  3527 + "fresh": "0.5.2",
  3528 + "http-errors": "1.6.3",
  3529 + "mime": "1.4.1",
  3530 + "ms": "2.0.0",
  3531 + "on-finished": "2.3.0",
  3532 + "range-parser": "1.2.0",
  3533 + "statuses": "1.4.0"
  3534 + },
  3535 + "dependencies": {
  3536 + "debug": {
  3537 + "version": "2.6.9",
  3538 + "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz",
  3539 + "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==",
  3540 + "requires": {
  3541 + "ms": "2.0.0"
  3542 + }
  3543 + },
  3544 + "statuses": {
  3545 + "version": "1.4.0",
  3546 + "resolved": "https://registry.npmjs.org/statuses/-/statuses-1.4.0.tgz",
  3547 + "integrity": "sha512-zhSCtt8v2NDrRlPQpCNtw/heZLtfUDqxBM1udqikb/Hbk52LK4nQSwr10u77iopCW5LsyHpuXS0GnEc48mLeew=="
  3548 + }
  3549 + }
  3550 + },
  3551 + "serialport": {
  3552 + "version": "6.2.2",
  3553 + "resolved": "https://registry.npmjs.org/serialport/-/serialport-6.2.2.tgz",
  3554 + "integrity": "sha512-BQqTR06ZXKwKB6rUjeANm3aIZo0rqNbQsrQX5zKEDcNY4rxiu5dvdcfIOaAGuZkhW7jAKJsgKC5TjeURtLVuOQ==",
  3555 + "requires": {
  3556 + "@serialport/parser-byte-length": "1.0.5",
  3557 + "@serialport/parser-cctalk": "1.0.5",
  3558 + "@serialport/parser-delimiter": "1.0.5",
  3559 + "@serialport/parser-readline": "1.0.5",
  3560 + "@serialport/parser-ready": "1.0.5",
  3561 + "@serialport/parser-regex": "1.0.5",
  3562 + "bindings": "1.3.0",
  3563 + "commander": "2.16.0",
  3564 + "debug": "3.1.0",
  3565 + "nan": "2.10.0",
  3566 + "prebuild-install": "4.0.0",
  3567 + "promirepl": "1.0.1",
  3568 + "prompt-list": "3.2.0",
  3569 + "safe-buffer": "5.1.2"
  3570 + }
  3571 + },
  3572 + "serve-static": {
  3573 + "version": "1.13.2",
  3574 + "resolved": "https://registry.npmjs.org/serve-static/-/serve-static-1.13.2.tgz",
  3575 + "integrity": "sha512-p/tdJrO4U387R9oMjb1oj7qSMaMfmOyd4j9hOFoxZe2baQszgHcSWjuya/CiT5kgZZKRudHNOA0pYXOl8rQ5nw==",
  3576 + "requires": {
  3577 + "encodeurl": "1.0.2",
  3578 + "escape-html": "1.0.3",
  3579 + "parseurl": "1.3.2",
  3580 + "send": "0.16.2"
  3581 + }
  3582 + },
  3583 + "set-blocking": {
  3584 + "version": "2.0.0",
  3585 + "resolved": "https://registry.npmjs.org/set-blocking/-/set-blocking-2.0.0.tgz",
  3586 + "integrity": "sha1-BF+XgtARrppoA93TgrJDkrPYkPc="
  3587 + },
  3588 + "set-getter": {
  3589 + "version": "0.1.0",
  3590 + "resolved": "https://registry.npmjs.org/set-getter/-/set-getter-0.1.0.tgz",
  3591 + "integrity": "sha1-12nBgsnVpR9AkUXy+6guXoboA3Y=",
  3592 + "requires": {
  3593 + "to-object-path": "0.3.0"
  3594 + }
  3595 + },
  3596 + "set-immediate-shim": {
  3597 + "version": "1.0.1",
  3598 + "resolved": "https://registry.npmjs.org/set-immediate-shim/-/set-immediate-shim-1.0.1.tgz",
  3599 + "integrity": "sha1-SysbJ+uAip+NzEgaWOXlb1mfP2E=",
  3600 + "optional": true
  3601 + },
  3602 + "set-value": {
  3603 + "version": "3.0.0",
  3604 + "resolved": "https://registry.npmjs.org/set-value/-/set-value-3.0.0.tgz",
  3605 + "integrity": "sha512-tqkg9wJ2TOsxbzIMG5NMAmzjdbDTAD0in7XuUzmFpJE4Ipi2QFBfgC2Z1/gfxcAmWCPsuutiEJyDIMRsrjrMOQ==",
  3606 + "requires": {
  3607 + "is-plain-object": "2.0.4"
  3608 + }
  3609 + },
  3610 + "setprototypeof": {
  3611 + "version": "1.1.0",
  3612 + "resolved": "https://registry.npmjs.org/setprototypeof/-/setprototypeof-1.1.0.tgz",
  3613 + "integrity": "sha512-BvE/TwpZX4FXExxOxZyRGQQv651MSwmWKZGqvmPcRIjDqWub67kTKuIMx43cZZrS/cBBzwBcNDWoFxt2XEFIpQ=="
  3614 + },
  3615 + "sha1": {
  3616 + "version": "1.1.1",
  3617 + "resolved": "https://registry.npmjs.org/sha1/-/sha1-1.1.1.tgz",
  3618 + "integrity": "sha1-rdqnqTFo85PxnrKxUJFhjicA+Eg=",
  3619 + "requires": {
  3620 + "charenc": "0.0.2",
  3621 + "crypt": "0.0.2"
  3622 + }
  3623 + },
  3624 + "shallow-clone": {
  3625 + "version": "1.0.0",
  3626 + "resolved": "https://registry.npmjs.org/shallow-clone/-/shallow-clone-1.0.0.tgz",
  3627 + "integrity": "sha512-oeXreoKR/SyNJtRJMAKPDSvd28OqEwG4eR/xc856cRGBII7gX9lvAqDxusPm0846z/w/hWYjI1NpKwJ00NHzRA==",
  3628 + "requires": {
  3629 + "is-extendable": "0.1.1",
  3630 + "kind-of": "5.1.0",
  3631 + "mixin-object": "2.0.1"
  3632 + },
  3633 + "dependencies": {
  3634 + "kind-of": {
  3635 + "version": "5.1.0",
  3636 + "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-5.1.0.tgz",
  3637 + "integrity": "sha512-NGEErnH6F2vUuXDh+OlbcKW7/wOcfdRHaZ7VWtqCztfHri/++YKmP51OdWeGPuqCOba6kk2OTe5d02VmTB80Pw=="
  3638 + }
  3639 + }
  3640 + },
  3641 + "should": {
  3642 + "version": "13.2.3",
  3643 + "resolved": "https://registry.npmjs.org/should/-/should-13.2.3.tgz",
  3644 + "integrity": "sha512-ggLesLtu2xp+ZxI+ysJTmNjh2U0TsC+rQ/pfED9bUZZ4DKefP27D+7YJVVTvKsmjLpIi9jAa7itwDGkDDmt1GQ==",
  3645 + "dev": true,
  3646 + "requires": {
  3647 + "should-equal": "2.0.0",
  3648 + "should-format": "3.0.3",
  3649 + "should-type": "1.4.0",
  3650 + "should-type-adaptors": "1.1.0",
  3651 + "should-util": "1.0.0"
  3652 + }
  3653 + },
  3654 + "should-equal": {
  3655 + "version": "2.0.0",
  3656 + "resolved": "https://registry.npmjs.org/should-equal/-/should-equal-2.0.0.tgz",
  3657 + "integrity": "sha512-ZP36TMrK9euEuWQYBig9W55WPC7uo37qzAEmbjHz4gfyuXrEUgF8cUvQVO+w+d3OMfPvSRQJ22lSm8MQJ43LTA==",
  3658 + "dev": true,
  3659 + "requires": {
  3660 + "should-type": "1.4.0"
  3661 + }
  3662 + },
  3663 + "should-format": {
  3664 + "version": "3.0.3",
  3665 + "resolved": "https://registry.npmjs.org/should-format/-/should-format-3.0.3.tgz",
  3666 + "integrity": "sha1-m/yPdPo5IFxT04w01xcwPidxJPE=",
  3667 + "dev": true,
  3668 + "requires": {
  3669 + "should-type": "1.4.0",
  3670 + "should-type-adaptors": "1.1.0"
  3671 + }
  3672 + },
  3673 + "should-type": {
  3674 + "version": "1.4.0",
  3675 + "resolved": "https://registry.npmjs.org/should-type/-/should-type-1.4.0.tgz",
  3676 + "integrity": "sha1-B1bYzoRt/QmEOmlHcZ36DUz/XPM=",
  3677 + "dev": true
  3678 + },
  3679 + "should-type-adaptors": {
  3680 + "version": "1.1.0",
  3681 + "resolved": "https://registry.npmjs.org/should-type-adaptors/-/should-type-adaptors-1.1.0.tgz",
  3682 + "integrity": "sha512-JA4hdoLnN+kebEp2Vs8eBe9g7uy0zbRo+RMcU0EsNy+R+k049Ki+N5tT5Jagst2g7EAja+euFuoXFCa8vIklfA==",
  3683 + "dev": true,
  3684 + "requires": {
  3685 + "should-type": "1.4.0",
  3686 + "should-util": "1.0.0"
  3687 + }
  3688 + },
  3689 + "should-util": {
  3690 + "version": "1.0.0",
  3691 + "resolved": "https://registry.npmjs.org/should-util/-/should-util-1.0.0.tgz",
  3692 + "integrity": "sha1-yYzaN0qmsZDfi6h8mInCtNtiAGM=",
  3693 + "dev": true
  3694 + },
  3695 + "signal-exit": {
  3696 + "version": "3.0.2",
  3697 + "resolved": "https://registry.npmjs.org/signal-exit/-/signal-exit-3.0.2.tgz",
  3698 + "integrity": "sha1-tf3AjxKH6hF4Yo5BXiUTK3NkbG0="
  3699 + },
  3700 + "simple-concat": {
  3701 + "version": "1.0.0",
  3702 + "resolved": "https://registry.npmjs.org/simple-concat/-/simple-concat-1.0.0.tgz",
  3703 + "integrity": "sha1-c0TLuLbib7J9ZrL8hvn21Zl1IcY="
  3704 + },
  3705 + "simple-get": {
  3706 + "version": "2.8.1",
  3707 + "resolved": "https://registry.npmjs.org/simple-get/-/simple-get-2.8.1.tgz",
  3708 + "integrity": "sha512-lSSHRSw3mQNUGPAYRqo7xy9dhKmxFXIjLjp4KHpf99GEH2VH7C3AM+Qfx6du6jhfUi6Vm7XnbEVEf7Wb6N8jRw==",
  3709 + "requires": {
  3710 + "decompress-response": "3.3.0",
  3711 + "once": "1.4.0",
  3712 + "simple-concat": "1.0.0"
  3713 + }
  3714 + },
  3715 + "simple-git": {
  3716 + "version": "1.96.0",
  3717 + "resolved": "https://registry.npmjs.org/simple-git/-/simple-git-1.96.0.tgz",
  3718 + "integrity": "sha512-+gXuzJFpGtK9zCa7rPMMNs8AF2weWMsB0Vlyym5VkFX2VGQ3VBzKhnxPN//PWrGuPFGQ/u0F1yL6rZoPhj/KPQ==",
  3719 + "requires": {
  3720 + "debug": "3.1.0"
  3721 + }
  3722 + },
  3723 + "snapdragon": {
  3724 + "version": "0.8.2",
  3725 + "resolved": "https://registry.npmjs.org/snapdragon/-/snapdragon-0.8.2.tgz",
  3726 + "integrity": "sha512-FtyOnWN/wCHTVXOMwvSv26d+ko5vWlIDD6zoUJ7LW8vh+ZBC8QdljveRP+crNrtBwioEUWy/4dMtbBjA4ioNlg==",
  3727 + "requires": {
  3728 + "base": "0.11.2",
  3729 + "debug": "2.6.9",
  3730 + "define-property": "0.2.5",
  3731 + "extend-shallow": "2.0.1",
  3732 + "map-cache": "0.2.2",
  3733 + "source-map": "0.5.7",
  3734 + "source-map-resolve": "0.5.2",
  3735 + "use": "3.1.1"
  3736 + },
  3737 + "dependencies": {
  3738 + "debug": {
  3739 + "version": "2.6.9",
  3740 + "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz",
  3741 + "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==",
  3742 + "requires": {
  3743 + "ms": "2.0.0"
  3744 + }
  3745 + },
  3746 + "define-property": {
  3747 + "version": "0.2.5",
  3748 + "resolved": "https://registry.npmjs.org/define-property/-/define-property-0.2.5.tgz",
  3749 + "integrity": "sha1-w1se+RjsPJkPmlvFe+BKrOxcgRY=",
  3750 + "requires": {
  3751 + "is-descriptor": "0.1.6"
  3752 + }
  3753 + },
  3754 + "is-accessor-descriptor": {
  3755 + "version": "0.1.6",
  3756 + "resolved": "https://registry.npmjs.org/is-accessor-descriptor/-/is-accessor-descriptor-0.1.6.tgz",
  3757 + "integrity": "sha1-qeEss66Nh2cn7u84Q/igiXtcmNY=",
  3758 + "requires": {
  3759 + "kind-of": "3.2.2"
  3760 + },
  3761 + "dependencies": {
  3762 + "kind-of": {
  3763 + "version": "3.2.2",
  3764 + "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-3.2.2.tgz",
  3765 + "integrity": "sha1-MeohpzS6ubuw8yRm2JOupR5KPGQ=",
  3766 + "requires": {
  3767 + "is-buffer": "1.1.6"
  3768 + }
  3769 + }
  3770 + }
  3771 + },
  3772 + "is-data-descriptor": {
  3773 + "version": "0.1.4",
  3774 + "resolved": "https://registry.npmjs.org/is-data-descriptor/-/is-data-descriptor-0.1.4.tgz",
  3775 + "integrity": "sha1-C17mSDiOLIYCgueT8YVv7D8wG1Y=",
  3776 + "requires": {
  3777 + "kind-of": "3.2.2"
  3778 + },
  3779 + "dependencies": {
  3780 + "kind-of": {
  3781 + "version": "3.2.2",
  3782 + "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-3.2.2.tgz",
  3783 + "integrity": "sha1-MeohpzS6ubuw8yRm2JOupR5KPGQ=",
  3784 + "requires": {
  3785 + "is-buffer": "1.1.6"
  3786 + }
  3787 + }
  3788 + }
  3789 + },
  3790 + "is-descriptor": {
  3791 + "version": "0.1.6",
  3792 + "resolved": "https://registry.npmjs.org/is-descriptor/-/is-descriptor-0.1.6.tgz",
  3793 + "integrity": "sha512-avDYr0SB3DwO9zsMov0gKCESFYqCnE4hq/4z3TdUlukEy5t9C0YRq7HLrsN52NAcqXKaepeCD0n+B0arnVG3Hg==",
  3794 + "requires": {
  3795 + "is-accessor-descriptor": "0.1.6",
  3796 + "is-data-descriptor": "0.1.4",
  3797 + "kind-of": "5.1.0"
1213 3798 }
  3799 + },
  3800 + "kind-of": {
  3801 + "version": "5.1.0",
  3802 + "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-5.1.0.tgz",
  3803 + "integrity": "sha512-NGEErnH6F2vUuXDh+OlbcKW7/wOcfdRHaZ7VWtqCztfHri/++YKmP51OdWeGPuqCOba6kk2OTe5d02VmTB80Pw=="
1214 3804 }
1215 3805 }
1216 3806 },
1217   - "safe-buffer": {
1218   - "version": "5.1.2",
1219   - "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.1.2.tgz",
1220   - "integrity": "sha512-Gd2UZBJDkXlY7GbJxfsE8/nvKkUEU1G38c1siN6QP6a9PT9MmHB8GnpscSmMJSoF8LOIrt8ud/wPtojys4G6+g=="
1221   - },
1222   - "semver": {
1223   - "version": "5.5.0",
1224   - "resolved": "https://registry.npmjs.org/semver/-/semver-5.5.0.tgz",
1225   - "integrity": "sha512-4SJ3dm0WAwWy/NVeioZh5AntkdJoWKxHxcmyP622fOkgHa4z3R0TdBJICINyaSDE6uNwVc8gZr+ZinwZAH4xIA=="
  3807 + "snapdragon-node": {
  3808 + "version": "2.1.1",
  3809 + "resolved": "https://registry.npmjs.org/snapdragon-node/-/snapdragon-node-2.1.1.tgz",
  3810 + "integrity": "sha512-O27l4xaMYt/RSQ5TR3vpWCAB5Kb/czIcqUFOM/C4fYcLnbZUc1PkjTAMjof2pBWaSTwOUd6qUHcFGVGj7aIwnw==",
  3811 + "requires": {
  3812 + "define-property": "1.0.0",
  3813 + "isobject": "3.0.1",
  3814 + "snapdragon-util": "3.0.1"
  3815 + }
1226 3816 },
1227   - "serialport": {
1228   - "version": "6.2.2",
1229   - "resolved": "https://registry.npmjs.org/serialport/-/serialport-6.2.2.tgz",
1230   - "integrity": "sha512-BQqTR06ZXKwKB6rUjeANm3aIZo0rqNbQsrQX5zKEDcNY4rxiu5dvdcfIOaAGuZkhW7jAKJsgKC5TjeURtLVuOQ==",
  3817 + "snapdragon-util": {
  3818 + "version": "3.0.1",
  3819 + "resolved": "https://registry.npmjs.org/snapdragon-util/-/snapdragon-util-3.0.1.tgz",
  3820 + "integrity": "sha512-mbKkMdQKsjX4BAL4bRYTj21edOf8cN7XHdYUJEe+Zn99hVEYcMvKPct1IqNe7+AZPirn8BCDOQBHQZknqmKlZQ==",
1231 3821 "requires": {
1232   - "@serialport/parser-byte-length": "1.0.5",
1233   - "@serialport/parser-cctalk": "1.0.5",
1234   - "@serialport/parser-delimiter": "1.0.5",
1235   - "@serialport/parser-readline": "1.0.5",
1236   - "@serialport/parser-ready": "1.0.5",
1237   - "@serialport/parser-regex": "1.0.5",
1238   - "bindings": "1.3.0",
1239   - "commander": "2.16.0",
1240   - "debug": "3.1.0",
1241   - "nan": "2.10.0",
1242   - "prebuild-install": "4.0.0",
1243   - "promirepl": "1.0.1",
1244   - "prompt-list": "3.2.0",
1245   - "safe-buffer": "5.1.2"
  3822 + "kind-of": "3.2.2"
1246 3823 }
1247 3824 },
1248   - "set-blocking": {
1249   - "version": "2.0.0",
1250   - "resolved": "https://registry.npmjs.org/set-blocking/-/set-blocking-2.0.0.tgz",
1251   - "integrity": "sha1-BF+XgtARrppoA93TgrJDkrPYkPc="
  3825 + "sort-asc": {
  3826 + "version": "0.2.0",
  3827 + "resolved": "https://registry.npmjs.org/sort-asc/-/sort-asc-0.2.0.tgz",
  3828 + "integrity": "sha1-AKSelHvCXVEL/eLLuN/9qfUOsvw="
1252 3829 },
1253   - "set-getter": {
1254   - "version": "0.1.0",
1255   - "resolved": "https://registry.npmjs.org/set-getter/-/set-getter-0.1.0.tgz",
1256   - "integrity": "sha1-12nBgsnVpR9AkUXy+6guXoboA3Y=",
  3830 + "sort-desc": {
  3831 + "version": "0.2.0",
  3832 + "resolved": "https://registry.npmjs.org/sort-desc/-/sort-desc-0.2.0.tgz",
  3833 + "integrity": "sha1-KAwb2vxld4h87brR7S5BwDeXZkY="
  3834 + },
  3835 + "sort-object": {
  3836 + "version": "3.0.2",
  3837 + "resolved": "https://registry.npmjs.org/sort-object/-/sort-object-3.0.2.tgz",
  3838 + "integrity": "sha1-2vK2k/YR990qIbgrgF5OrCMPdV4=",
1257 3839 "requires": {
1258   - "to-object-path": "0.3.0"
  3840 + "bytewise": "1.1.0",
  3841 + "get-value": "2.0.6",
  3842 + "is-extendable": "0.1.1",
  3843 + "sort-asc": "0.2.0",
  3844 + "sort-desc": "0.2.0",
  3845 + "union-value": "0.2.4"
  3846 + },
  3847 + "dependencies": {
  3848 + "set-value": {
  3849 + "version": "0.4.3",
  3850 + "resolved": "https://registry.npmjs.org/set-value/-/set-value-0.4.3.tgz",
  3851 + "integrity": "sha1-fbCPnT0i3H945Trzw79GZuzfzPE=",
  3852 + "requires": {
  3853 + "extend-shallow": "2.0.1",
  3854 + "is-extendable": "0.1.1",
  3855 + "is-plain-object": "2.0.4",
  3856 + "to-object-path": "0.3.0"
  3857 + }
  3858 + },
  3859 + "union-value": {
  3860 + "version": "0.2.4",
  3861 + "resolved": "https://registry.npmjs.org/union-value/-/union-value-0.2.4.tgz",
  3862 + "integrity": "sha1-c3UVJ4ZnkFfns3qmdug0aPwCdPA=",
  3863 + "requires": {
  3864 + "arr-union": "3.1.0",
  3865 + "get-value": "2.0.6",
  3866 + "is-extendable": "0.1.1",
  3867 + "set-value": "0.4.3"
  3868 + }
  3869 + }
1259 3870 }
1260 3871 },
1261   - "set-value": {
1262   - "version": "3.0.0",
1263   - "resolved": "https://registry.npmjs.org/set-value/-/set-value-3.0.0.tgz",
1264   - "integrity": "sha512-tqkg9wJ2TOsxbzIMG5NMAmzjdbDTAD0in7XuUzmFpJE4Ipi2QFBfgC2Z1/gfxcAmWCPsuutiEJyDIMRsrjrMOQ==",
  3872 + "source-map": {
  3873 + "version": "0.5.7",
  3874 + "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.5.7.tgz",
  3875 + "integrity": "sha1-igOdLRAh0i0eoUyA2OpGi6LvP8w="
  3876 + },
  3877 + "source-map-resolve": {
  3878 + "version": "0.5.2",
  3879 + "resolved": "https://registry.npmjs.org/source-map-resolve/-/source-map-resolve-0.5.2.tgz",
  3880 + "integrity": "sha512-MjqsvNwyz1s0k81Goz/9vRBe9SZdB09Bdw+/zYyO+3CuPk6fouTaxscHkgtE8jKvf01kVfl8riHzERQ/kefaSA==",
1265 3881 "requires": {
1266   - "is-plain-object": "2.0.4"
  3882 + "atob": "2.1.1",
  3883 + "decode-uri-component": "0.2.0",
  3884 + "resolve-url": "0.2.1",
  3885 + "source-map-url": "0.4.0",
  3886 + "urix": "0.1.0"
1267 3887 }
1268 3888 },
1269   - "shallow-clone": {
1270   - "version": "1.0.0",
1271   - "resolved": "https://registry.npmjs.org/shallow-clone/-/shallow-clone-1.0.0.tgz",
1272   - "integrity": "sha512-oeXreoKR/SyNJtRJMAKPDSvd28OqEwG4eR/xc856cRGBII7gX9lvAqDxusPm0846z/w/hWYjI1NpKwJ00NHzRA==",
  3889 + "source-map-url": {
  3890 + "version": "0.4.0",
  3891 + "resolved": "https://registry.npmjs.org/source-map-url/-/source-map-url-0.4.0.tgz",
  3892 + "integrity": "sha1-PpNdfd1zYxuXZZlW1VEo6HtQhKM="
  3893 + },
  3894 + "split-string": {
  3895 + "version": "3.1.0",
  3896 + "resolved": "https://registry.npmjs.org/split-string/-/split-string-3.1.0.tgz",
  3897 + "integrity": "sha512-NzNVhJDYpwceVVii8/Hu6DKfD2G+NrQHlS/V/qgv763EYudVwEcMQNxd2lh+0VrUByXN/oJkl5grOhYWvQUYiw==",
1273 3898 "requires": {
1274   - "is-extendable": "0.1.1",
1275   - "kind-of": "5.1.0",
1276   - "mixin-object": "2.0.1"
  3899 + "extend-shallow": "3.0.2"
1277 3900 },
1278 3901 "dependencies": {
1279   - "kind-of": {
1280   - "version": "5.1.0",
1281   - "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-5.1.0.tgz",
1282   - "integrity": "sha512-NGEErnH6F2vUuXDh+OlbcKW7/wOcfdRHaZ7VWtqCztfHri/++YKmP51OdWeGPuqCOba6kk2OTe5d02VmTB80Pw=="
  3902 + "extend-shallow": {
  3903 + "version": "3.0.2",
  3904 + "resolved": "https://registry.npmjs.org/extend-shallow/-/extend-shallow-3.0.2.tgz",
  3905 + "integrity": "sha1-Jqcarwc7OfshJxcnRhMcJwQCjbg=",
  3906 + "requires": {
  3907 + "assign-symbols": "1.0.0",
  3908 + "is-extendable": "1.0.1"
  3909 + }
  3910 + },
  3911 + "is-extendable": {
  3912 + "version": "1.0.1",
  3913 + "resolved": "https://registry.npmjs.org/is-extendable/-/is-extendable-1.0.1.tgz",
  3914 + "integrity": "sha512-arnXMxT1hhoKo9k1LZdmlNyJdDDfy2v0fXjFlmok4+i8ul/6WlbVge9bhM74OpNPQPMGUToDtz+KXa1PneJxOA==",
  3915 + "requires": {
  3916 + "is-plain-object": "2.0.4"
  3917 + }
1283 3918 }
1284 3919 }
1285 3920 },
1286   - "signal-exit": {
1287   - "version": "3.0.2",
1288   - "resolved": "https://registry.npmjs.org/signal-exit/-/signal-exit-3.0.2.tgz",
1289   - "integrity": "sha1-tf3AjxKH6hF4Yo5BXiUTK3NkbG0="
1290   - },
1291   - "simple-concat": {
1292   - "version": "1.0.0",
1293   - "resolved": "https://registry.npmjs.org/simple-concat/-/simple-concat-1.0.0.tgz",
1294   - "integrity": "sha1-c0TLuLbib7J9ZrL8hvn21Zl1IcY="
  3921 + "sqlite3": {
  3922 + "version": "4.0.2",
  3923 + "resolved": "https://registry.npmjs.org/sqlite3/-/sqlite3-4.0.2.tgz",
  3924 + "integrity": "sha512-51ferIRwYOhzUEtogqOa/y9supADlAht98bF/gbIi6WkzRJX6Yioldxbzj1MV4yV+LgdKD/kkHwFTeFXOG4htA==",
  3925 + "requires": {
  3926 + "nan": "2.10.0",
  3927 + "node-pre-gyp": "0.10.3",
  3928 + "request": "2.87.0"
  3929 + }
1295 3930 },
1296   - "simple-get": {
1297   - "version": "2.8.1",
1298   - "resolved": "https://registry.npmjs.org/simple-get/-/simple-get-2.8.1.tgz",
1299   - "integrity": "sha512-lSSHRSw3mQNUGPAYRqo7xy9dhKmxFXIjLjp4KHpf99GEH2VH7C3AM+Qfx6du6jhfUi6Vm7XnbEVEf7Wb6N8jRw==",
  3931 + "sshpk": {
  3932 + "version": "1.14.2",
  3933 + "resolved": "https://registry.npmjs.org/sshpk/-/sshpk-1.14.2.tgz",
  3934 + "integrity": "sha1-xvxhZIo9nE52T9P8306hBeSSupg=",
1300 3935 "requires": {
1301   - "decompress-response": "3.3.0",
1302   - "once": "1.4.0",
1303   - "simple-concat": "1.0.0"
  3936 + "asn1": "0.2.3",
  3937 + "assert-plus": "1.0.0",
  3938 + "bcrypt-pbkdf": "1.0.2",
  3939 + "dashdash": "1.14.1",
  3940 + "ecc-jsbn": "0.1.2",
  3941 + "getpass": "0.1.7",
  3942 + "jsbn": "0.1.1",
  3943 + "safer-buffer": "2.1.2",
  3944 + "tweetnacl": "0.14.5"
1304 3945 }
1305 3946 },
  3947 + "stack-trace": {
  3948 + "version": "0.0.10",
  3949 + "resolved": "https://registry.npmjs.org/stack-trace/-/stack-trace-0.0.10.tgz",
  3950 + "integrity": "sha1-VHxws0fo0ytOEI6hoqFZ5f3eGcA="
  3951 + },
1306 3952 "static-extend": {
1307 3953 "version": "0.1.2",
1308 3954 "resolved": "https://registry.npmjs.org/static-extend/-/static-extend-0.1.2.tgz",
... ... @@ -1373,6 +4019,21 @@
1373 4019 }
1374 4020 }
1375 4021 },
  4022 + "statuses": {
  4023 + "version": "1.5.0",
  4024 + "resolved": "https://registry.npmjs.org/statuses/-/statuses-1.5.0.tgz",
  4025 + "integrity": "sha1-Fhx9rBd2Wf2YEfQ3cfqZOBR4Yow="
  4026 + },
  4027 + "strftime": {
  4028 + "version": "0.10.0",
  4029 + "resolved": "https://registry.npmjs.org/strftime/-/strftime-0.10.0.tgz",
  4030 + "integrity": "sha1-s/D6QZKVICpaKJ9ta+n0kJphcZM="
  4031 + },
  4032 + "string-natural-compare": {
  4033 + "version": "2.0.2",
  4034 + "resolved": "https://registry.npmjs.org/string-natural-compare/-/string-natural-compare-2.0.2.tgz",
  4035 + "integrity": "sha1-xc5OJ4q10SZa5vxVQ1rre3b8sAE="
  4036 + },
1376 4037 "string-width": {
1377 4038 "version": "1.0.2",
1378 4039 "resolved": "https://registry.npmjs.org/string-width/-/string-width-1.0.2.tgz",
... ... @@ -1414,6 +4075,27 @@
1414 4075 "resolved": "https://registry.npmjs.org/success-symbol/-/success-symbol-0.1.0.tgz",
1415 4076 "integrity": "sha1-JAIuSG878c3KCUKDt2nEctO3KJc="
1416 4077 },
  4078 + "tar": {
  4079 + "version": "4.4.4",
  4080 + "resolved": "https://registry.npmjs.org/tar/-/tar-4.4.4.tgz",
  4081 + "integrity": "sha512-mq9ixIYfNF9SK0IS/h2HKMu8Q2iaCuhDDsZhdEag/FHv8fOaYld4vN7ouMgcSSt5WKZzPs8atclTcJm36OTh4w==",
  4082 + "requires": {
  4083 + "chownr": "1.0.1",
  4084 + "fs-minipass": "1.2.5",
  4085 + "minipass": "2.3.3",
  4086 + "minizlib": "1.1.0",
  4087 + "mkdirp": "0.5.1",
  4088 + "safe-buffer": "5.1.2",
  4089 + "yallist": "3.0.2"
  4090 + },
  4091 + "dependencies": {
  4092 + "yallist": {
  4093 + "version": "3.0.2",
  4094 + "resolved": "https://registry.npmjs.org/yallist/-/yallist-3.0.2.tgz",
  4095 + "integrity": "sha1-hFK0u36Dx8GI2AQcGoN8dz1ti7k="
  4096 + }
  4097 + }
  4098 + },
1417 4099 "tar-fs": {
1418 4100 "version": "1.16.3",
1419 4101 "resolved": "https://registry.npmjs.org/tar-fs/-/tar-fs-1.16.3.tgz",
... ... @@ -1488,6 +4170,64 @@
1488 4170 "kind-of": "3.2.2"
1489 4171 }
1490 4172 },
  4173 + "to-regex": {
  4174 + "version": "3.0.2",
  4175 + "resolved": "https://registry.npmjs.org/to-regex/-/to-regex-3.0.2.tgz",
  4176 + "integrity": "sha512-FWtleNAtZ/Ki2qtqej2CXTOayOH9bHDQF+Q48VpWyDXjbYxA4Yz8iDB31zXOBUlOHHKidDbqGVrTUvQMPmBGBw==",
  4177 + "requires": {
  4178 + "define-property": "2.0.2",
  4179 + "extend-shallow": "3.0.2",
  4180 + "regex-not": "1.0.2",
  4181 + "safe-regex": "1.1.0"
  4182 + },
  4183 + "dependencies": {
  4184 + "define-property": {
  4185 + "version": "2.0.2",
  4186 + "resolved": "https://registry.npmjs.org/define-property/-/define-property-2.0.2.tgz",
  4187 + "integrity": "sha512-jwK2UV4cnPpbcG7+VRARKTZPUWowwXA8bzH5NP6ud0oeAxyYPuGZUAC7hMugpCdz4BeSZl2Dl9k66CHJ/46ZYQ==",
  4188 + "requires": {
  4189 + "is-descriptor": "1.0.2",
  4190 + "isobject": "3.0.1"
  4191 + }
  4192 + },
  4193 + "extend-shallow": {
  4194 + "version": "3.0.2",
  4195 + "resolved": "https://registry.npmjs.org/extend-shallow/-/extend-shallow-3.0.2.tgz",
  4196 + "integrity": "sha1-Jqcarwc7OfshJxcnRhMcJwQCjbg=",
  4197 + "requires": {
  4198 + "assign-symbols": "1.0.0",
  4199 + "is-extendable": "1.0.1"
  4200 + }
  4201 + },
  4202 + "is-extendable": {
  4203 + "version": "1.0.1",
  4204 + "resolved": "https://registry.npmjs.org/is-extendable/-/is-extendable-1.0.1.tgz",
  4205 + "integrity": "sha512-arnXMxT1hhoKo9k1LZdmlNyJdDDfy2v0fXjFlmok4+i8ul/6WlbVge9bhM74OpNPQPMGUToDtz+KXa1PneJxOA==",
  4206 + "requires": {
  4207 + "is-plain-object": "2.0.4"
  4208 + }
  4209 + }
  4210 + }
  4211 + },
  4212 + "to-regex-range": {
  4213 + "version": "2.1.1",
  4214 + "resolved": "https://registry.npmjs.org/to-regex-range/-/to-regex-range-2.1.1.tgz",
  4215 + "integrity": "sha1-fIDBe53+vlmeJzZ+DU3VWQFB2zg=",
  4216 + "requires": {
  4217 + "is-number": "3.0.0",
  4218 + "repeat-string": "1.6.1"
  4219 + },
  4220 + "dependencies": {
  4221 + "is-number": {
  4222 + "version": "3.0.0",
  4223 + "resolved": "https://registry.npmjs.org/is-number/-/is-number-3.0.0.tgz",
  4224 + "integrity": "sha1-JP1iAaR4LPUFYcgQJ2r8fRLXEZU=",
  4225 + "requires": {
  4226 + "kind-of": "3.2.2"
  4227 + }
  4228 + }
  4229 + }
  4230 + },
1491 4231 "toggle-array": {
1492 4232 "version": "1.0.1",
1493 4233 "resolved": "https://registry.npmjs.org/toggle-array/-/toggle-array-1.0.1.tgz",
... ... @@ -1496,6 +4236,14 @@
1496 4236 "isobject": "3.0.1"
1497 4237 }
1498 4238 },
  4239 + "tough-cookie": {
  4240 + "version": "2.3.4",
  4241 + "resolved": "https://registry.npmjs.org/tough-cookie/-/tough-cookie-2.3.4.tgz",
  4242 + "integrity": "sha512-TZ6TTfI5NtZnuyy/Kecv+CnoROnyXn2DN97LontgQpCwsX2XyLYCC0ENhYkehSOwAp8rTQKc/NUIF7BkQ5rKLA==",
  4243 + "requires": {
  4244 + "punycode": "1.4.1"
  4245 + }
  4246 + },
1499 4247 "tunnel-agent": {
1500 4248 "version": "0.6.0",
1501 4249 "resolved": "https://registry.npmjs.org/tunnel-agent/-/tunnel-agent-0.6.0.tgz",
... ... @@ -1504,11 +4252,161 @@
1504 4252 "safe-buffer": "5.1.2"
1505 4253 }
1506 4254 },
  4255 + "tweetnacl": {
  4256 + "version": "0.14.5",
  4257 + "resolved": "https://registry.npmjs.org/tweetnacl/-/tweetnacl-0.14.5.tgz",
  4258 + "integrity": "sha1-WuaBd/GS1EViadEIr6k/+HQ/T2Q=",
  4259 + "optional": true
  4260 + },
  4261 + "type-is": {
  4262 + "version": "1.6.16",
  4263 + "resolved": "https://registry.npmjs.org/type-is/-/type-is-1.6.16.tgz",
  4264 + "integrity": "sha512-HRkVv/5qY2G6I8iab9cI7v1bOIdhm94dVjQCPFElW9W+3GeDOSHmy2EBYe4VTApuzolPcmgFTN3ftVJRKR2J9Q==",
  4265 + "requires": {
  4266 + "media-typer": "0.3.0",
  4267 + "mime-types": "2.1.19"
  4268 + }
  4269 + },
  4270 + "typewise": {
  4271 + "version": "1.0.3",
  4272 + "resolved": "https://registry.npmjs.org/typewise/-/typewise-1.0.3.tgz",
  4273 + "integrity": "sha1-EGeTZUCvl5N8xdz5kiSG6fooRlE=",
  4274 + "requires": {
  4275 + "typewise-core": "1.2.0"
  4276 + }
  4277 + },
  4278 + "typewise-core": {
  4279 + "version": "1.2.0",
  4280 + "resolved": "https://registry.npmjs.org/typewise-core/-/typewise-core-1.2.0.tgz",
  4281 + "integrity": "sha1-l+uRgFx/VdL5QXSPpQ0xXZke8ZU="
  4282 + },
  4283 + "uid-safe": {
  4284 + "version": "2.1.5",
  4285 + "resolved": "https://registry.npmjs.org/uid-safe/-/uid-safe-2.1.5.tgz",
  4286 + "integrity": "sha512-KPHm4VL5dDXKz01UuEd88Df+KzynaohSL9fBh096KWAxSKZQDI2uBrVqtvRM4rwrIrRRKsdLNML/lnaaVSRioA==",
  4287 + "requires": {
  4288 + "random-bytes": "1.0.0"
  4289 + }
  4290 + },
  4291 + "union-value": {
  4292 + "version": "1.0.0",
  4293 + "resolved": "https://registry.npmjs.org/union-value/-/union-value-1.0.0.tgz",
  4294 + "integrity": "sha1-XHHDTLW61dzr4+oM0IIHulqhrqQ=",
  4295 + "requires": {
  4296 + "arr-union": "3.1.0",
  4297 + "get-value": "2.0.6",
  4298 + "is-extendable": "0.1.1",
  4299 + "set-value": "0.4.3"
  4300 + },
  4301 + "dependencies": {
  4302 + "set-value": {
  4303 + "version": "0.4.3",
  4304 + "resolved": "https://registry.npmjs.org/set-value/-/set-value-0.4.3.tgz",
  4305 + "integrity": "sha1-fbCPnT0i3H945Trzw79GZuzfzPE=",
  4306 + "requires": {
  4307 + "extend-shallow": "2.0.1",
  4308 + "is-extendable": "0.1.1",
  4309 + "is-plain-object": "2.0.4",
  4310 + "to-object-path": "0.3.0"
  4311 + }
  4312 + }
  4313 + }
  4314 + },
  4315 + "uniqid": {
  4316 + "version": "4.1.1",
  4317 + "resolved": "https://registry.npmjs.org/uniqid/-/uniqid-4.1.1.tgz",
  4318 + "integrity": "sha1-iSIN32t1GuUrX3JISGNShZa7hME=",
  4319 + "requires": {
  4320 + "macaddress": "0.2.9"
  4321 + }
  4322 + },
  4323 + "unpipe": {
  4324 + "version": "1.0.0",
  4325 + "resolved": "https://registry.npmjs.org/unpipe/-/unpipe-1.0.0.tgz",
  4326 + "integrity": "sha1-sr9O6FFKrmFltIF4KdIbLvSZBOw="
  4327 + },
  4328 + "unset-value": {
  4329 + "version": "1.0.0",
  4330 + "resolved": "https://registry.npmjs.org/unset-value/-/unset-value-1.0.0.tgz",
  4331 + "integrity": "sha1-g3aHP30jNRef+x5vw6jtDfyKtVk=",
  4332 + "requires": {
  4333 + "has-value": "0.3.1",
  4334 + "isobject": "3.0.1"
  4335 + },
  4336 + "dependencies": {
  4337 + "has-value": {
  4338 + "version": "0.3.1",
  4339 + "resolved": "https://registry.npmjs.org/has-value/-/has-value-0.3.1.tgz",
  4340 + "integrity": "sha1-ex9YutpiyoJ+wKIHgCVlSEWZXh8=",
  4341 + "requires": {
  4342 + "get-value": "2.0.6",
  4343 + "has-values": "0.1.4",
  4344 + "isobject": "2.1.0"
  4345 + },
  4346 + "dependencies": {
  4347 + "isobject": {
  4348 + "version": "2.1.0",
  4349 + "resolved": "https://registry.npmjs.org/isobject/-/isobject-2.1.0.tgz",
  4350 + "integrity": "sha1-8GVWEJaj8dou9GJy+BXIQNh+DIk=",
  4351 + "requires": {
  4352 + "isarray": "1.0.0"
  4353 + }
  4354 + }
  4355 + }
  4356 + },
  4357 + "has-values": {
  4358 + "version": "0.1.4",
  4359 + "resolved": "https://registry.npmjs.org/has-values/-/has-values-0.1.4.tgz",
  4360 + "integrity": "sha1-bWHeldkd/Km5oCCJrThL/49it3E="
  4361 + }
  4362 + }
  4363 + },
  4364 + "upath": {
  4365 + "version": "1.1.0",
  4366 + "resolved": "https://registry.npmjs.org/upath/-/upath-1.1.0.tgz",
  4367 + "integrity": "sha512-bzpH/oBhoS/QI/YtbkqCg6VEiPYjSZtrHQM6/QnJS6OL9pKUFLqb3aFh4Scvwm45+7iAgiMkLhSbaZxUqmrprw==",
  4368 + "optional": true
  4369 + },
  4370 + "urix": {
  4371 + "version": "0.1.0",
  4372 + "resolved": "https://registry.npmjs.org/urix/-/urix-0.1.0.tgz",
  4373 + "integrity": "sha1-2pN/emLiH+wf0Y1Js1wpNQZ6bHI="
  4374 + },
  4375 + "use": {
  4376 + "version": "3.1.1",
  4377 + "resolved": "https://registry.npmjs.org/use/-/use-3.1.1.tgz",
  4378 + "integrity": "sha512-cwESVXlO3url9YWlFW/TA9cshCEhtu7IKJ/p5soJ/gGpj7vbvFrAY/eIioQ6Dw23KjZhYgiIo8HOs1nQ2vr/oQ=="
  4379 + },
1507 4380 "util-deprecate": {
1508 4381 "version": "1.0.2",
1509 4382 "resolved": "https://registry.npmjs.org/util-deprecate/-/util-deprecate-1.0.2.tgz",
1510 4383 "integrity": "sha1-RQ1Nyfpw3nMnYvvS1KKJgUGaDM8="
1511 4384 },
  4385 + "utils-merge": {
  4386 + "version": "1.0.1",
  4387 + "resolved": "https://registry.npmjs.org/utils-merge/-/utils-merge-1.0.1.tgz",
  4388 + "integrity": "sha1-n5VxD1CiZ5R7LMwSR0HBAoQn5xM="
  4389 + },
  4390 + "uuid": {
  4391 + "version": "3.3.2",
  4392 + "resolved": "https://registry.npmjs.org/uuid/-/uuid-3.3.2.tgz",
  4393 + "integrity": "sha512-yXJmeNaw3DnnKAOKJE51sL/ZaYfWJRl1pK9dr19YFCu0ObS231AB1/LbqTKRAQ5kw8A90rA6fr4riOUpTZvQZA=="
  4394 + },
  4395 + "vary": {
  4396 + "version": "1.1.2",
  4397 + "resolved": "https://registry.npmjs.org/vary/-/vary-1.1.2.tgz",
  4398 + "integrity": "sha1-IpnwLG3tMNSllhsLn3RSShj2NPw="
  4399 + },
  4400 + "verror": {
  4401 + "version": "1.10.0",
  4402 + "resolved": "https://registry.npmjs.org/verror/-/verror-1.10.0.tgz",
  4403 + "integrity": "sha1-OhBcoXBTr1XW4nDB+CiGguGNpAA=",
  4404 + "requires": {
  4405 + "assert-plus": "1.0.0",
  4406 + "core-util-is": "1.0.2",
  4407 + "extsprintf": "1.3.0"
  4408 + }
  4409 + },
1512 4410 "warning-symbol": {
1513 4411 "version": "0.1.0",
1514 4412 "resolved": "https://registry.npmjs.org/warning-symbol/-/warning-symbol-0.1.0.tgz",
... ... @@ -1546,15 +4444,98 @@
1546 4444 }
1547 4445 }
1548 4446 },
  4447 + "winston": {
  4448 + "version": "2.4.3",
  4449 + "resolved": "https://registry.npmjs.org/winston/-/winston-2.4.3.tgz",
  4450 + "integrity": "sha512-GYKuysPz2pxYAVJD2NPsDLP5Z79SDEzPm9/j4tCjkF/n89iBNGBMJcR+dMUqxgPNgoSs6fVygPi+Vl2oxIpBuw==",
  4451 + "requires": {
  4452 + "async": "1.0.0",
  4453 + "colors": "1.0.3",
  4454 + "cycle": "1.0.3",
  4455 + "eyes": "0.1.8",
  4456 + "isstream": "0.1.2",
  4457 + "stack-trace": "0.0.10"
  4458 + }
  4459 + },
  4460 + "winston-circular-buffer": {
  4461 + "version": "1.0.0",
  4462 + "resolved": "https://registry.npmjs.org/winston-circular-buffer/-/winston-circular-buffer-1.0.0.tgz",
  4463 + "integrity": "sha1-6ZH3W5n/IFVR4O5HK3XSAdvT4ns=",
  4464 + "requires": {
  4465 + "circular-buffer": "0.0.6"
  4466 + }
  4467 + },
  4468 + "winston-daily-rotate-file": {
  4469 + "version": "1.7.2",
  4470 + "resolved": "https://registry.npmjs.org/winston-daily-rotate-file/-/winston-daily-rotate-file-1.7.2.tgz",
  4471 + "integrity": "sha1-ZQK/opeCT9mC2l5WR8dThXjS+aA=",
  4472 + "requires": {
  4473 + "mkdirp": "0.5.1"
  4474 + }
  4475 + },
  4476 + "wrap-ansi": {
  4477 + "version": "2.1.0",
  4478 + "resolved": "https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-2.1.0.tgz",
  4479 + "integrity": "sha1-2Pw9KE3QV5T+hJc8rs3Rz4JP3YU=",
  4480 + "requires": {
  4481 + "string-width": "1.0.2",
  4482 + "strip-ansi": "3.0.1"
  4483 + }
  4484 + },
1549 4485 "wrappy": {
1550 4486 "version": "1.0.2",
1551 4487 "resolved": "https://registry.npmjs.org/wrappy/-/wrappy-1.0.2.tgz",
1552 4488 "integrity": "sha1-tSQ9jz7BqjXxNkYFvA0QNuMKtp8="
1553 4489 },
  4490 + "wraptile": {
  4491 + "version": "2.0.0",
  4492 + "resolved": "https://registry.npmjs.org/wraptile/-/wraptile-2.0.0.tgz",
  4493 + "integrity": "sha512-Jzt4wTT0DJGucp4VewhbT6YutpOfBh6Ab4r5hKWTvFYsNTCxPi0U8wOsesDk1CQ+VcHyaP36BzCiKRJTROJiTQ=="
  4494 + },
1554 4495 "xtend": {
1555 4496 "version": "4.0.1",
1556 4497 "resolved": "https://registry.npmjs.org/xtend/-/xtend-4.0.1.tgz",
1557 4498 "integrity": "sha1-pcbVMr5lbiPbgg77lDofBJmNY68="
  4499 + },
  4500 + "y18n": {
  4501 + "version": "3.2.1",
  4502 + "resolved": "https://registry.npmjs.org/y18n/-/y18n-3.2.1.tgz",
  4503 + "integrity": "sha1-bRX7qITAhnnA136I53WegR4H+kE="
  4504 + },
  4505 + "yallist": {
  4506 + "version": "2.1.2",
  4507 + "resolved": "https://registry.npmjs.org/yallist/-/yallist-2.1.2.tgz",
  4508 + "integrity": "sha1-HBH5IY8HYImkfdUS+TxmmaaoHVI="
  4509 + },
  4510 + "yargs": {
  4511 + "version": "3.32.0",
  4512 + "resolved": "https://registry.npmjs.org/yargs/-/yargs-3.32.0.tgz",
  4513 + "integrity": "sha1-AwiOnr+edWtpdRYR0qXvWRSCyZU=",
  4514 + "requires": {
  4515 + "camelcase": "2.1.1",
  4516 + "cliui": "3.2.0",
  4517 + "decamelize": "1.2.0",
  4518 + "os-locale": "1.4.0",
  4519 + "string-width": "1.0.2",
  4520 + "window-size": "0.1.4",
  4521 + "y18n": "3.2.1"
  4522 + },
  4523 + "dependencies": {
  4524 + "window-size": {
  4525 + "version": "0.1.4",
  4526 + "resolved": "https://registry.npmjs.org/window-size/-/window-size-0.1.4.tgz",
  4527 + "integrity": "sha1-+OGqHuWlPsW/FR/6CXQqatdpeHY="
  4528 + }
  4529 + }
  4530 + },
  4531 + "zames": {
  4532 + "version": "2.0.0",
  4533 + "resolved": "https://registry.npmjs.org/zames/-/zames-2.0.0.tgz",
  4534 + "integrity": "sha512-o9xURXaNLqnkZwk9f9uxraL/k1vXdcYDtJtmesJi0lcpyzkJKhBVyg3ohLfdXEDeHWj/7DfZ6/axINQyaKZGOQ==",
  4535 + "requires": {
  4536 + "currify": "2.0.6",
  4537 + "es6-promisify": "6.0.0"
  4538 + }
1558 4539 }
1559 4540 }
1560 4541 }
... ... @@ -22,8 +22,14 @@
22 22 "author": "Adhidarma Hadiwinoto <me@adhisimon.org>",
23 23 "license": "SEE LICENSE IN LICENSE.txt",
24 24 "dependencies": {
  25 + "cron": "^1.3.0",
25 26 "jsesc": "^2.5.1",
  27 + "komodo-sdk": "git+http://gitlab.kodesumber.com/komodo/komodo-sdk.git",
26 28 "moment": "^2.22.2",
27   - "serialport": "^6.2.2"
  29 + "serialport": "^6.2.2",
  30 + "sqlite3": "^4.0.2"
  31 + },
  32 + "devDependencies": {
  33 + "should": "^13.2.3"
28 34 }
29 35 }
... ... @@ -0,0 +1 @@
  1 +28464
0 2 \ No newline at end of file
... ... @@ -0,0 +1,30 @@
  1 +"use strict";
  2 +
  3 +const should = require('should');
  4 +const patternRuleMatcher = require("./lib/pattern-rule-matcher");
  5 +
  6 +describe("#pattern-rule-matcher", function() {
  7 +
  8 + describe('#mkios', function() {
  9 +
  10 + it('should return correct trx date', function() {
  11 + const rules = [
  12 + { "pattern": "pada\\s+(.+?) \\d" }
  13 + ];
  14 +
  15 + patternRuleMatcher('Transaksi ke 811236393 pada 2018-08-01 16:40:57 senilai SimPATI: 5 gagal. Error 14: Nomer tidak ditemukan.', rules).should.equal('2018-08-01');
  16 + })
  17 +
  18 + it('should return correct product', function() {
  19 + const rules = [
  20 + { "pattern": "senilai SimPATI: (\\d+) " },
  21 + { "pattern": "senilai <\\d+> untuk"},
  22 + { "pattern": "Transaksi bulk <(\\d+) IDR>"}
  23 + ];
  24 +
  25 + patternRuleMatcher('Transaksi ke 811236393 pada 2018-08-01 16:40:57 senilai SimPATI: 5 gagal. Error 14: Nomer tidak ditemukan.', rules).should.equal('5');
  26 + })
  27 +
  28 + })
  29 +
  30 +})