diff --git a/.travis.yml b/.travis.yml index b92f2c940..868f1ec80 100644 --- a/.travis.yml +++ b/.travis.yml @@ -1,3 +1,3 @@ language: node_js node_js: - - "8.0.0" \ No newline at end of file + - "8.11.2" \ No newline at end of file diff --git a/appveyor.yml b/appveyor.yml index ddb5521a9..e9069ae41 100644 --- a/appveyor.yml +++ b/appveyor.yml @@ -2,7 +2,7 @@ init: - git config --global core.autocrlf input environment: - nodejs_version: "6" + nodejs_version: "9" install: - ps: Install-Product node $env:nodejs_version diff --git a/core/budfox/budfox.js b/core/budfox/budfox.js index 8ae305518..26d371f8e 100644 --- a/core/budfox/budfox.js +++ b/core/budfox/budfox.js @@ -30,6 +30,24 @@ var BudFox = function(config) { // BudFox data flow: + // relay a marketUpdate event + this.marketDataProvider.on( + 'marketUpdate', + e => this.emit('marketUpdate', e) + ); + + // relay a marketStart event + this.marketDataProvider.on( + 'marketStart', + e => this.emit('marketStart', e) + ); + + // Output the candles + this.candleManager.on( + 'candles', + this.pushCandles + ); + // on every `tick` retrieve trade data this.heart.on( 'tick', @@ -42,26 +60,7 @@ var BudFox = function(config) { this.candleManager.processTrades ); - // Output the candles - this.candleManager.on( - 'candles', - this.pushCandles - ); - this.heart.pump(); - - // Budfox also reports: - - // Trades & last trade - // - // this.marketDataProvider.on( - // 'trades', - // this.broadcast('trades') - // ); - // this.marketDataProvider.on( - // 'trades', - // this.broadcastTrade - // ); } var Readable = require('stream').Readable; @@ -76,18 +75,4 @@ BudFox.prototype.pushCandles = function(candles) { _.each(candles, this.push); } -// BudFox.prototype.broadcastTrade = function(trades) { -// _.defer(function() { -// this.emit('trade', trades.last); -// }.bind(this)); -// } - -// BudFox.prototype.broadcast = function(message) { -// return function(payload) { -// _.defer(function() { -// this.emit(message, payload); -// }.bind(this)); -// }.bind(this); -// } - module.exports = BudFox; diff --git a/core/budfox/candleCreator.js b/core/budfox/candleCreator.js index c5f39e353..36c094041 100644 --- a/core/budfox/candleCreator.js +++ b/core/budfox/candleCreator.js @@ -109,7 +109,7 @@ CandleCreator.prototype.calculateCandles = function() { // catch error from high volume getTrades if (this.lastTrade !== undefined) - // create a string referencing to minute this trade happened in + // create a string referencing the minute this trade happened in var lastMinute = this.lastTrade.date.format('YYYY-MM-DD HH:mm'); var candles = _.map(this.buckets, function(bucket, name) { diff --git a/core/budfox/candleManager.js b/core/budfox/candleManager.js index a37801f45..b90cc692d 100644 --- a/core/budfox/candleManager.js +++ b/core/budfox/candleManager.js @@ -10,7 +10,6 @@ var util = require(__dirname + '/../util'); var dirs = util.dirs(); var config = util.getConfig(); var log = require(dirs.core + 'log'); -var cp = require(dirs.core + 'cp'); var CandleCreator = require(dirs.budfox + 'candleCreator'); @@ -21,10 +20,6 @@ var Manager = function() { this.candleCreator .on('candles', this.relayCandles); - - this.messageFirstCandle = _.once(candle => { - cp.firstCandle(candle); - }) }; util.makeEventEmitter(Manager); @@ -34,12 +29,6 @@ Manager.prototype.processTrades = function(tradeBatch) { Manager.prototype.relayCandles = function(candles) { this.emit('candles', candles); - - if(!_.size(candles)) - return; - - this.messageFirstCandle(_.first(candles)); - cp.lastCandle(_.last(candles)); } module.exports = Manager; diff --git a/core/budfox/marketDataProvider.js b/core/budfox/marketDataProvider.js index 7542375cf..6576f20e7 100644 --- a/core/budfox/marketDataProvider.js +++ b/core/budfox/marketDataProvider.js @@ -10,7 +10,6 @@ const util = require(__dirname + '/../util'); const MarketFetcher = require('./marketFetcher'); const dirs = util.dirs(); -const cp = require(dirs.core + 'cp'); const Manager = function(config) { @@ -33,14 +32,14 @@ Manager.prototype.retrieve = function() { Manager.prototype.relayTrades = function(batch) { - this.emit('trades', batch); + this.sendMarketStart(batch); + this.emit('marketUpdate', batch.last.date); - this.sendStartAt(batch); - cp.update(batch.last.date.format()); + this.emit('trades', batch); } -Manager.prototype.sendStartAt = _.once(function(batch) { - cp.startAt(batch.first.date.format()) +Manager.prototype.sendMarketStart = _.once(function(batch) { + this.emit('marketStart', batch.first.date); }); module.exports = Manager; \ No newline at end of file diff --git a/core/budfox/marketFetcher.js b/core/budfox/marketFetcher.js index d6700e54f..3e0c5e944 100644 --- a/core/budfox/marketFetcher.js +++ b/core/budfox/marketFetcher.js @@ -6,23 +6,24 @@ // - `trades batch` - all new trades. // - `trade` - the most recent trade after every fetch -var _ = require('lodash'); -var moment = require('moment'); -var utc = moment.utc; -var util = require(__dirname + '/../util'); +const _ = require('lodash'); +const moment = require('moment'); +const utc = moment.utc; +const util = require(__dirname + '/../util'); +const dirs = util.dirs(); -var config = util.getConfig(); -var log = require(util.dirs().core + 'log'); -var exchangeChecker = require(util.dirs().core + 'exchangeChecker'); +const config = util.getConfig(); +const log = require(dirs.core + 'log'); +const exchangeChecker = require(dirs.gekko + 'exchange/exchangeChecker'); -var TradeBatcher = require(util.dirs().budfox + 'tradeBatcher'); +const TradeBatcher = require(util.dirs().budfox + 'tradeBatcher'); -var Fetcher = function(config) { +const Fetcher = function(config) { if(!_.isObject(config)) throw 'TradeFetcher expects a config'; - var exchangeName = config.watch.exchange.toLowerCase(); - var DataProvider = require(util.dirs().gekko + 'exchanges/' + exchangeName); + const exchangeName = config.watch.exchange.toLowerCase(); + const DataProvider = require(util.dirs().gekko + 'exchange/wrappers/' + exchangeName); _.bindAll(this); // Create a public dataProvider object which can retrieve live diff --git a/core/candleBatcher.js b/core/candleBatcher.js index 713fd4c10..dd64d456b 100644 --- a/core/candleBatcher.js +++ b/core/candleBatcher.js @@ -18,6 +18,7 @@ var CandleBatcher = function(candleSize) { this.candleSize = candleSize; this.smallCandles = []; + this.calculatedCandles = []; _.bindAll(this); } @@ -28,22 +29,37 @@ CandleBatcher.prototype.write = function(candles) { if(!_.isArray(candles)) throw 'candles is not an array'; + this.emitted = 0; + _.each(candles, function(candle) { this.smallCandles.push(candle); this.check(); }, this); + + return this.emitted; } CandleBatcher.prototype.check = function() { if(_.size(this.smallCandles) % this.candleSize !== 0) return; - this.emit('candle', this.calculate()); + this.emitted++; + this.calculatedCandles.push(this.calculate()); this.smallCandles = []; } +CandleBatcher.prototype.flush = function() { + _.each( + this.calculatedCandles, + candle => this.emit('candle', candle) + ); + + this.calculatedCandles = []; +} + CandleBatcher.prototype.calculate = function() { - var first = this.smallCandles.shift(); + // remove the id property of the small candle + var { id, ...first } = this.smallCandles.shift(); first.vwp = first.vwp * first.volume; diff --git a/core/cp.js b/core/cp.js deleted file mode 100644 index 91ae5e598..000000000 --- a/core/cp.js +++ /dev/null @@ -1,90 +0,0 @@ -// functions that emit data to the parent process. -// -// noops if this gekko instance is not a child process! - -var _ = require('lodash'); -var util = require('./util'); -var config = util.getConfig(); -var dirs = util.dirs(); -var moment = require('moment'); - -var ENV = util.gekkoEnv(); - -var message = (type, payload) => { - payload.type = type; - process.send(payload); -} - -var cp = { - // string like: '2016-12-03T22:23:00.000Z' - update: latest => message('update', { latest }), - startAt: startAt => message('startAt', { startAt }), - - // object like: - // - // { - // start: '2016-12-03T22:23:00.000Z', - // open: 765, - // high: 765, - // low: 765, - // close: 765, - // vwp: 765, - // volume: 0, - // trades: 0 - // } - lastCandle: lastCandle => message('lastCandle', { lastCandle }), - firstCandle: firstCandle => message('firstCandle', { firstCandle }), - - // object like: - // - // { - // action: 'buy', - // price: 942.80838846, - // portfolio: { asset: 1.07839516, currency: 0, balance: false }, - // balance: 1016.7200029226638, - // date: - // } - trade: trade => message('trade', { trade }), - // object like: - // { - // currency: 'USDT', - // asset: 'BTC', - // startTime: '2017-03-25 19:41:00', - // endTime: '2017-03-25 20:01:00', - // timespan: '20 minutes', - // market: -0.316304880517734, - // balance: 1016.7200029226638, - // profit: -26.789997197336106, - // relativeProfit: -2.5672966425099304, - // yearlyProfit: '-704041.12634599', - // relativeYearlyProfit: '-67468.55576516', - // startPrice: 945.80000002, - // endPrice: 942.80838846, - // trades: 10, - // startBalance: 1043.5100001199999, - // sharpe: -2.676305165560598 - // } - report: report => message('report', { report }), - - // object like: - // { - // entryAt: Moment<'2017-03-25 19:41:00'>, - // entryPrice: 10.21315498, - // entryBalance: 98.19707799420277, - // exitAt: Moment<'2017-03-25 19:41:00'> - // exitPrice: 10.22011632, - // exitBalance: 97.9692176, - // duration: 3600000, - // pnl: -0.2278603942027786, - // profit: -0.2320439659276161, - // } - roundtrip: roundtrip => message('roundtrip', { roundtrip }), -} - -if(ENV !== 'child-process') { - _.each(cp, (val, key) => { - cp[key] = _.noop; - }); -} - -module.exports = cp; \ No newline at end of file diff --git a/core/emitter.js b/core/emitter.js new file mode 100644 index 000000000..409c5d943 --- /dev/null +++ b/core/emitter.js @@ -0,0 +1,34 @@ +// Gekko uses a custom event emitter within the GekkoStream (the plugins) to guarantee +// the correct order of events that are triggered by eachother. Turns sync events from +// LIFO into a FIFO stack based model. +// +// More details here: https://forum.gekko.wizb.it/thread-56579.html + +const util = require('util'); +const events = require('events'); +const NativeEventEmitter = events.EventEmitter; + +const GekkoEventEmitter = function() { + NativeEventEmitter.call(this); + this.defferedEvents = []; +} + +util.inherits(GekkoEventEmitter, NativeEventEmitter); + +// push to stack +GekkoEventEmitter.prototype.deferredEmit = function(name, payload) { + this.defferedEvents.push({name, payload}); +} + +// resolve FIFO +GekkoEventEmitter.prototype.broadcastDeferredEmit = function() { + if(this.defferedEvents.length === 0) + return false; + + const event = this.defferedEvents.shift(); + + this.emit(event.name, event.payload); + return true; +} + +module.exports = GekkoEventEmitter; \ No newline at end of file diff --git a/core/error.js b/core/error.js deleted file mode 100644 index aafdec49c..000000000 --- a/core/error.js +++ /dev/null @@ -1,25 +0,0 @@ -const _ = require('lodash'); - -let RetryError = function(message) { - _.bindAll(this); - - this.name = "RetryError"; - this.message = message; -} - -RetryError.prototype = new Error(); - -let AbortError = function(message) { - _.bindAll(this); - - this.name = "AbortError"; - this.message = message; -} - -AbortError.prototype = new Error(); - -module.exports = { - 'RetryError': RetryError, - 'AbortError': AbortError -}; - diff --git a/core/eventLogger.js b/core/eventLogger.js deleted file mode 100644 index addc5fc2c..000000000 --- a/core/eventLogger.js +++ /dev/null @@ -1,32 +0,0 @@ -var _ = require('lodash'); - -var util = require('./util'); -var dirs = util.dirs(); -var log = require(dirs.core + 'log'); - -var EventLogger = function() { - _.bindAll(this); -} - -var subscriptions = require(dirs.core + 'subscriptions'); -_.each(subscriptions, function(subscription) { - EventLogger.prototype[subscription.handler] = function(e) { - if(subscription.event === 'tick') - log.empty(); - - if(_.has(e, 'data')) - log.debug( - '\tnew event:', - subscription.event, - '(' + _.size(e.data), - 'items)' - ); - else - log.debug( - '\tnew event:', - subscription.event - ); - } -}); - -module.exports = EventLogger; diff --git a/core/gekkoStream.js b/core/gekkoStream.js index eadda12ab..e4d2c40bd 100644 --- a/core/gekkoStream.js +++ b/core/gekkoStream.js @@ -1,18 +1,26 @@ // Small writable stream wrapper that // passes data to all `candleConsumers`. -var Writable = require('stream').Writable; -var _ = require('lodash'); -var async = require('async'); +const Writable = require('stream').Writable; +const _ = require('lodash'); +const async = require('async'); +const moment = require('moment'); -var util = require('./util'); -var env = util.gekkoEnv(); -var mode = util.gekkoMode(); +const util = require('./util'); +const env = util.gekkoEnv(); +const mode = util.gekkoMode(); +const config = util.getConfig(); +const log = require(util.dirs().core + 'log'); -var Gekko = function(candleConsumers) { - this.candleConsumers = candleConsumers; +var Gekko = function(plugins) { + this.plugins = plugins; + this.candleConsumers = plugins + .filter(plugin => plugin.processCandle); Writable.call(this, {objectMode: true}); + this.producers = this.plugins + .filter(p => p.meta.emits); + this.finalize = _.bind(this.finalize, this); } @@ -20,11 +28,57 @@ Gekko.prototype = Object.create(Writable.prototype, { constructor: { value: Gekko } }); -Gekko.prototype._write = function(chunk, encoding, _done) { - var done = _.after(this.candleConsumers.length, _done); - _.each(this.candleConsumers, function(c) { - c.processCandle(chunk, done); - }); +if(config.debug) { + // decorate with more debug information + Gekko.prototype._write = function(chunk, encoding, _done) { + + const start = moment(); + var relayed = false; + var at = null; + + const timer = setTimeout(() => { + if(!relayed) + log.error([ + `The plugin "${at}" has not processed a candle for 1 second.`, + `This will cause Gekko to slow down or stop working completely.` + ].join(' ')); + }, 1000); + + const flushEvents = _.after(this.candleConsumers.length, () => { + relayed = true; + clearInterval(timer); + this.flushDefferedEvents(); + _done(); + }); + _.each(this.candleConsumers, function(c) { + at = c.meta.name; + c.processCandle(chunk, flushEvents); + }, this); + } +} else { + // skip decoration + Gekko.prototype._write = function(chunk, encoding, _done) { + const flushEvents = _.after(this.candleConsumers.length, () => { + this.flushDefferedEvents(); + _done(); + }); + _.each(this.candleConsumers, function(c) { + c.processCandle(chunk, flushEvents); + }, this); + } +} + +Gekko.prototype.flushDefferedEvents = function() { + const broadcasted = _.find( + this.producers, + producer => producer.broadcastDeferredEmit() + ); + + // If we braodcasted anything we might have + // triggered more events, recurse until we + // have fully broadcasted everything. + if(broadcasted) + this.flushDefferedEvents(); } Gekko.prototype.finalize = function() { @@ -41,12 +95,12 @@ Gekko.prototype.finalize = function() { Gekko.prototype.shutdown = function() { async.eachSeries( - this.candleConsumers, + this.plugins, function(c, callback) { if (c.finalize) c.finalize(callback); else callback(); }, - function() { + () => { // If we are a child process, we signal to the parent to kill the child once it is done // so that is has time to process all remaining events (and send report data) if (env === 'child-process') process.send('done'); diff --git a/core/log.js b/core/log.js index cfd13fe50..122fb336d 100644 --- a/core/log.js +++ b/core/log.js @@ -16,7 +16,7 @@ var silent = config.silent; var sendToParent = function() { var send = method => (...args) => { - process.send({'log': args.join(' ')}); + process.send({log: method, message: args.join(' ')}); } return { diff --git a/core/markets/importer.js b/core/markets/importer.js index 14df16ad1..7e1dfdfbc 100644 --- a/core/markets/importer.js +++ b/core/markets/importer.js @@ -4,7 +4,7 @@ var config = util.getConfig(); var dirs = util.dirs(); var log = require(dirs.core + 'log'); var moment = require('moment'); -var cp = require(dirs.core + 'cp'); +var gekkoEnv = util.gekkoEnv(); var adapter = config[config.adapter]; var daterange = config.importer.daterange; @@ -29,7 +29,7 @@ if(!to.isValid()) var TradeBatcher = require(dirs.budfox + 'tradeBatcher'); var CandleManager = require(dirs.budfox + 'candleManager'); -var exchangeChecker = require(dirs.core + 'exchangeChecker'); +var exchangeChecker = require(dirs.gekko + 'exchange/exchangeChecker'); var error = exchangeChecker.cantFetchFullHistory(config.watch); if(error) @@ -104,10 +104,10 @@ Market.prototype.processTrades = function(trades) { return; } - if(_.size(trades)) { + if(_.size(trades) && gekkoEnv === 'child-process') { let lastAtTS = _.last(trades).date; let lastAt = moment.unix(lastAtTS).utc().format(); - cp.update(lastAt); + process.send({event: 'marketUpdate', payload: lastAt}); } setTimeout(this.get, 1000); diff --git a/core/markets/leech.js b/core/markets/leech.js index 11be19e97..5c0499f29 100644 --- a/core/markets/leech.js +++ b/core/markets/leech.js @@ -9,8 +9,7 @@ const util = require('../util'); const dirs = util.dirs(); const config = util.getConfig(); -const exchangeChecker = require(dirs.core + 'exchangeChecker'); -const cp = require(dirs.core + 'cp'); +const exchangeChecker = require(dirs.gekko + 'exchange/exchangeChecker'); const adapter = config[config.adapter]; const Reader = require(dirs.gekko + adapter.path + '/reader'); @@ -75,7 +74,6 @@ Market.prototype.processCandles = function(err, candles) { return; } - // TODO: // verify that the correct amount of candles was passed: // @@ -87,14 +85,7 @@ Market.prototype.processCandles = function(err, candles) { this.push(c); }, this); - this.sendStartAt(_.first(candles)); - cp.lastCandle(_.last(candles)); - this.latestTs = _.last(candles).start.unix() + 1; } -Market.prototype.sendStartAt = _.once(function(candle) { - cp.firstCandle(candle); -}); - module.exports = Market; diff --git a/core/markets/realtime.js b/core/markets/realtime.js index 6c49a99fb..2c3950514 100644 --- a/core/markets/realtime.js +++ b/core/markets/realtime.js @@ -1,10 +1,10 @@ -var _ = require('lodash'); +const _ = require('lodash'); -var util = require('../util'); -var dirs = util.dirs(); +const util = require('../util'); +const dirs = util.dirs(); -var exchangeChecker = require(dirs.core + 'exchangeChecker'); -var config = util.getConfig(); +const exchangeChecker = require(dirs.gekko + 'exchange/exchangeChecker'); +const config = util.getConfig(); const slug = config.watch.exchange.toLowerCase(); const exchange = exchangeChecker.getExchangeCapabilities(slug); @@ -12,7 +12,7 @@ const exchange = exchangeChecker.getExchangeCapabilities(slug); if(!exchange) util.die(`Unsupported exchange: ${slug}`) -var error = exchangeChecker.cantMonitor(config.watch); +const error = exchangeChecker.cantMonitor(config.watch); if(error) util.die(error, true); diff --git a/core/pipeline.js b/core/pipeline.js index 6590f23b3..dd0cfe092 100644 --- a/core/pipeline.js +++ b/core/pipeline.js @@ -44,6 +44,8 @@ var pipeline = (settings) => { // and how they should hooked up to consumers. var subscriptions = require(dirs.gekko + 'subscriptions'); + var market; + // Instantiate each enabled plugin var loadPlugins = function(next) { // load all plugins @@ -74,7 +76,6 @@ var pipeline = (settings) => { // Subscribe all plugins to other emitting plugins var subscribePlugins = function(next) { - // events broadcasted by plugins var pluginSubscriptions = _.filter( subscriptions, @@ -88,8 +89,9 @@ var pipeline = (settings) => { pluginSubscriptions.filter(s => _.isArray(s.emitter)), subscription => { var singleEventEmitters = subscription.emitter - .filter(s => _.size(plugins.filter(p => p.meta.slug === s) - )); + .filter( + s => _.size(plugins.filter(p => p.meta.slug === s)) + ); if(_.size(singleEventEmitters) > 1) { var error = `Multiple plugins are broadcasting`; @@ -107,19 +109,22 @@ var pipeline = (settings) => { _.each(plugins, function(plugin) { _.each(pluginSubscriptions, function(sub) { - if(_.has(plugin, sub.handler)) { + if(plugin[sub.handler]) { // if a plugin wants to listen // to something disabled if(!emitters[sub.emitter]) { - return log.warn([ - plugin.meta.name, - 'wanted to listen to the', - sub.emitter + ',', - 'however the', - sub.emitter, - 'is disabled.' - ].join(' ')); + if(!plugin.meta.greedy) { + log.warn([ + plugin.meta.name, + 'wanted to listen to the', + sub.emitter + ',', + 'however the', + sub.emitter, + 'is disabled.' + ].join(' ')); + } + return; } // attach handler @@ -143,12 +148,10 @@ var pipeline = (settings) => { _.each(plugins, function(plugin) { _.each(marketSubscriptions, function(sub) { - // for now, only subscribe to candles - if(sub.event !== 'candle') - return; - - if(_.has(plugin, sub.handler)) - candleConsumers.push(plugin); + if(plugin[sub.handler]) { + if(sub.event === 'candle') + candleConsumers.push(plugin); + } }); }); @@ -156,7 +159,6 @@ var pipeline = (settings) => { next(); } - // TODO: move this somewhere where it makes more sense var prepareMarket = function(next) { if(mode === 'backtest' && config.backtest.daterange === 'scan') require(dirs.core + 'prepareDateRange')(next); @@ -164,6 +166,47 @@ var pipeline = (settings) => { next(); } + var setupMarket = function(next) { + // load a market based on the config (or fallback to mode) + let marketType; + if(config.market) + marketType = config.market.type; + else + marketType = mode; + + var Market = require(dirs.markets + marketType); + + market = new Market(config); + + next(); + } + + var subscribePluginsToMarket = function(next) { + + // events broadcasted by the market + var marketSubscriptions = _.filter( + subscriptions, + {emitter: 'market'} + ); + + _.each(plugins, function(plugin) { + _.each(marketSubscriptions, function(sub) { + + if(sub.event === 'candle') + // these are handled via the market stream + return; + + if(plugin[sub.handler]) { + market.on(sub.event, plugin[sub.handler]); + } + + }); + }); + + next(); + + } + log.info('Setting up Gekko in', mode, 'mode'); log.info(''); @@ -172,30 +215,23 @@ var pipeline = (settings) => { loadPlugins, referenceEmitters, subscribePlugins, - prepareMarket + prepareMarket, + setupMarket, + subscribePluginsToMarket ], function() { - // load a market based on the config (or fallback to mode) - let marketType; - if(config.market) - marketType = config.market.type; - else - marketType = mode; - - var Market = require(dirs.markets + marketType); - var market = new Market(config); - var gekko = new GekkoStream(candleConsumers); + var gekkoStream = new GekkoStream(plugins); market - .pipe(gekko) + .pipe(gekkoStream) // convert JS objects to JSON string // .pipe(new require('stringify-stream')()) // output to standard out // .pipe(process.stdout); - market.on('end', gekko.finalize); + market.on('end', gekkoStream.finalize); } ); diff --git a/core/pluginUtil.js b/core/pluginUtil.js index e3a5dbacc..1c28c977a 100644 --- a/core/pluginUtil.js +++ b/core/pluginUtil.js @@ -1,5 +1,6 @@ var _ = require('lodash'); var async = require('async'); +var Emitter = require('./emitter'); var util = require(__dirname + '/util'); @@ -8,6 +9,7 @@ var log = require(util.dirs().core + 'log'); var config = util.getConfig(); var pluginDir = util.dirs().plugins; var gekkoMode = util.gekkoMode(); +var inherits = require('util').inherits; var pluginHelper = { // Checks whether we can load a module @@ -92,12 +94,18 @@ var pluginHelper = { var Constructor = require(pluginDir + plugin.slug); if(plugin.async) { + inherits(Constructor, Emitter); var instance = new Constructor(util.defer(function(err) { next(err, instance); }), plugin); + Emitter.call(instance); + instance.meta = plugin; } else { + inherits(Constructor, Emitter); var instance = new Constructor(plugin); + Emitter.call(instance); + instance.meta = plugin; _.defer(function() { next(null, instance); diff --git a/core/tools/candleLoader.js b/core/tools/candleLoader.js index 5aa6b85cf..9311a1072 100644 --- a/core/tools/candleLoader.js +++ b/core/tools/candleLoader.js @@ -82,6 +82,7 @@ const handleCandles = (err, data) => { DONE = true; batcher.write(data); + batcher.flush(); if(DONE) { reader.close(); diff --git a/core/tools/dataStitcher.js b/core/tools/dataStitcher.js index b9756826a..119f330f3 100644 --- a/core/tools/dataStitcher.js +++ b/core/tools/dataStitcher.js @@ -2,7 +2,7 @@ var _ = require('lodash'); var fs = require('fs'); var moment = require('moment'); -var util = require('../../core/util'); +var util = require('../util'); var config = util.getConfig(); var dirs = util.dirs(); var log = require(dirs.core + '/log'); @@ -18,9 +18,14 @@ Stitcher.prototype.ago = function(ts) { } Stitcher.prototype.verifyExchange = function() { - var exchangeChecker = require(dirs.core + 'exchangeChecker'); - var slug = config.watch.exchange.toLowerCase(); - var exchange = exchangeChecker.getExchangeCapabilities(slug); + const exchangeChecker = require(dirs.gekko + 'exchange/exchangeChecker'); + const slug = config.watch.exchange.toLowerCase(); + let exchange; + try { + exchange = exchangeChecker.getExchangeCapabilities(slug); + } catch(e) { + util.die(e.message); + } if(!exchange) util.die(`Unsupported exchange: ${slug}`); @@ -180,7 +185,7 @@ Stitcher.prototype.prepareHistoricalData = function(done) { Stitcher.prototype.checkExchangeTrades = function(since, next) { var provider = config.watch.exchange.toLowerCase(); - var DataProvider = require(util.dirs().gekko + 'exchanges/' + provider); + var DataProvider = require(util.dirs().gekko + 'exchange/wrappers/' + provider); var exchangeConfig = config.watch; diff --git a/core/util.js b/core/util.js index d4fac292d..6b0ab1c77 100644 --- a/core/util.js +++ b/core/util.js @@ -4,8 +4,6 @@ var path = require('path'); var fs = require('fs'); var semver = require('semver'); var program = require('commander'); -var retry = require('retry'); -var Errors = require('./error'); var startTime = moment(); @@ -17,19 +15,6 @@ var _gekkoEnv = false; var _args = false; -var retryHelper = function(fn, options, callback) { - var operation = retry.operation(options); - operation.attempt(function(currentAttempt) { - fn(function(err, result) { - if (!(err instanceof Errors.AbortError) && operation.retry(err)) { - return; - } - - callback(err ? err.message : null, result); - }); - }); -} - // helper functions var util = { getConfig: function() { @@ -98,11 +83,18 @@ var util = { else if(_gekkoEnv === 'child-process') var log = m => process.send({type: 'error', error: m}); + var instanceName; + + if(util.gekkoEnv() === 'standalone') + instanceName = 'Gekko'; + else + instanceName = 'This Gekko instance'; + if(m) { if(soft) { log('\n ERROR: ' + m + '\n\n'); } else { - log('\n\nGekko encountered an error and can\'t continue'); + log(`\n${instanceName} encountered an error and can\'t continue`); log('\nError:\n'); log(m, '\n\n'); log('\nMeta debug info:\n'); @@ -119,7 +111,7 @@ var util = { gekko: ROOT, core: ROOT + 'core/', markets: ROOT + 'core/markets/', - exchanges: ROOT + 'exchanges/', + exchanges: ROOT + 'exchange/wrappers/', plugins: ROOT + 'plugins/', methods: ROOT + 'strategies/', indicators: ROOT + 'strategies/indicators/', @@ -176,19 +168,6 @@ var util = { getStartTime: function() { return startTime; }, - retry: function(fn, callback) { - var options = { - retries: 5, - factor: 1.2, - minTimeout: 1 * 1000, - maxTimeout: 3 * 1000 - }; - - retryHelper(fn, options, callback); - }, - retryCustom: function(options, fn, callback) { - retryHelper(fn, options, callback); - }, } // NOTE: those options are only used diff --git a/core/workers/pipeline/child.js b/core/workers/pipeline/child.js index 2eb12bf6c..d1abfbb1e 100644 --- a/core/workers/pipeline/child.js +++ b/core/workers/pipeline/child.js @@ -50,6 +50,15 @@ process.on('message', function(m) { }); process.on('disconnect', function() { - console.log("disconnect"); + console.log('disconnect'); process.exit(-1); -}) \ No newline at end of file +}) + +process + .on('unhandledRejection', (message, p) => { + process.send({type: 'error', message: message}); + }) + .on('uncaughtException', err => { + process.send({type: 'error', error: err}); + process.exit(1); + }); \ No newline at end of file diff --git a/core/workers/pipeline/messageHandlers/backtestHandler.js b/core/workers/pipeline/messageHandlers/backtestHandler.js index 7e3e68fc1..6ee3afab1 100644 --- a/core/workers/pipeline/messageHandlers/backtestHandler.js +++ b/core/workers/pipeline/messageHandlers/backtestHandler.js @@ -1,41 +1,25 @@ -// listen to all messages and internally queue -// all candles and trades, when done report them -// all back at once +// Relay the backtest message it when it comes in. module.exports = done => { - var trades = []; - var roundtrips = [] - var candles = []; - var report = false; + let backtest; return { message: message => { + if(message.type === 'error') { + done(message.error); + } - if(message.type === 'candle') - candles.push(message.candle); - - else if(message.type === 'trade') - trades.push(message.trade); - - else if(message.type === 'roundtrip') - roundtrips.push(message.roundtrip); - - else if(message.type === 'report') - report = message.report; - - else if(message.log) - console.log(message.log); + if(message.backtest) { + done(null, message.backtest); + } }, exit: status => { - if(status !== 0) - done('Child process has died.'); - else - done(null, { - trades: trades, - candles: candles, - report: report, - roundtrips: roundtrips - }); + if(status !== 0) { + if(backtest) + console.error('Child process died after finishing backtest'); + else + done('Child process has died.'); + } } } } \ No newline at end of file diff --git a/core/workers/pipeline/messageHandlers/importerHandler.js b/core/workers/pipeline/messageHandlers/importerHandler.js index 8b97543df..7c54287bf 100644 --- a/core/workers/pipeline/messageHandlers/importerHandler.js +++ b/core/workers/pipeline/messageHandlers/importerHandler.js @@ -3,15 +3,14 @@ module.exports = cb => { return { message: message => { - if(message.type === 'update') + if(message.event === 'marketUpdate') cb(null, { done: false, - latest: message.latest + latest: message.payload }) else if(message.type === 'error') { cb(message.error); - console.error(message.error); } else if(message.type === 'log') diff --git a/core/workers/pipeline/messageHandlers/realtimeHandler.js b/core/workers/pipeline/messageHandlers/realtimeHandler.js index 6af801736..5ada6e6d2 100644 --- a/core/workers/pipeline/messageHandlers/realtimeHandler.js +++ b/core/workers/pipeline/messageHandlers/realtimeHandler.js @@ -8,7 +8,6 @@ module.exports = cb => { if(message.type === 'error') { cb(message.error); - console.error(message.error); } else diff --git a/core/workers/pipeline/parent.js b/core/workers/pipeline/parent.js index 6a9f33180..d24488a1f 100644 --- a/core/workers/pipeline/parent.js +++ b/core/workers/pipeline/parent.js @@ -19,7 +19,6 @@ module.exports = (mode, config, callback) => { }; child.on('message', function(m) { - if(m === 'ready') return child.send(message); diff --git a/docs/commandline/plugins.md b/docs/commandline/plugins.md index 77ae30d27..ba123b1a7 100644 --- a/docs/commandline/plugins.md +++ b/docs/commandline/plugins.md @@ -20,7 +20,7 @@ To configure a plugin, open up your `config.js` file with a text editor and conf If you want Gekko to provide automated trading advice you need to configure this in Gekko. Note that this is a different plugin than the "trader" which is a responsible for actually creating orders based on this advice. (So if you want automated trading you need both this advice as well as the auto trader). -Documentation about strategies in Gekko can be found [here](../strategies/example_strategies.md). +Documentation about strategies in Gekko can be found [here](../strategies/introduction.md). ### Trader diff --git a/docs/commandline/tradebot.md b/docs/commandline/tradebot.md index 8792f1236..8b6fce25c 100644 --- a/docs/commandline/tradebot.md +++ b/docs/commandline/tradebot.md @@ -16,7 +16,10 @@ First, set up Gekko for commandline usage (see [this document](./about_the_comma - `candleWriter` - (optional) also store market data to disk. - `tradingAdvisor` - configure the strategy and candle properties. - `trader` - configure Gekko access to your exchange account. +- `performanceAnalyzer` - enable. -Turn off the paperTrader (to not get conflicting profit reports). +Turn off the paperTrader (there can only be 1 trade plugin active per instance). -Once done, run Gekko in live mode. +Once done, run Gekko like so: + + node gekko --config your-config-file.js diff --git a/docs/extending/add_a_plugin.md b/docs/extending/add_a_plugin.md index 5bf1293c8..05760494f 100644 --- a/docs/extending/add_a_plugin.md +++ b/docs/extending/add_a_plugin.md @@ -21,66 +21,11 @@ Note that in order to use custom plugins, you have to run Gekko over [the comman *And more! Take a look in the `gekko/plugins folder.`* -## What kind of events can I listen to? - -Note that these are low level internal events to the plugin system, they have overlap with the websocket events being streamed to the UI but are not the same. - -- `candle`: Every time Gekko calculated a new 1 minute candle from the market. -- `advice`: Every time the trading strategy has new advice. -- `trade`: Every time a trading plugin (either the live trader or the paper trader) has completed a trade. -- `portfolioUpdate`: Is broadcasted once a trading plugin has an updated portflio. - -Each of these events contains a javascript object describing the latest data. - ## Implementing a new plugin If you want to add your own plugin you need to expose a constructor function inside `plugins/[slugname of plugin].js`. The object needs methods based on which event you want -to listen to: - -- market feed / candle: `processCandle(candle, callback)`. - This method will be fed a minute candles like: - - { - start: [moment object of the start time of the candle], - open: [number, open of candle], - high: [number, high of candle], - low: [number, low of candle], - close: [number, close of candle], - vwp: [number, average weighted price of candle], - volume: [number, total volume volume], - trades: [number, amount of trades] - } - - As well as a callback method. You are required to call this method - once you are done processing the candle. - -- advice feed / advice `processAdvice(advice)`: - This method will be fed an advice like: - - { - recommendation: [position to take, either long or short], - portfolio: [amount of portfolio you should move to position] **DECREPATED** - } - -- trading feed / trade `processTrade(trade)`: - This method will be fed a trade like: - - { - action: [either "buy" or "sell"], - price: [number, price that was sold at], - date: [moment object, exchange time trade completed at], - portfolio: [object containing amount in currency and asset], - balance: [number, total worth of portfolio] - } - -- trading feed / portfolioUpdate `portfolioUpdate(portfolio)`: - This method will be fed an portfolioUpdate like: - - { - currency: [number, portfolio amount of currency], - asset: [number, portfolio amount of asset] - } +to listen to. All events can be found in [the events page](../architecture/events.md). You also need to add an entry for your plugin inside `plugins.js` which registers your plugin for use with Gekko. Finally you need to add a configuration object to `sample-config.js` with at least: diff --git a/docs/extending/add_an_exchange.md b/docs/extending/add_an_exchange.md index d11754cb8..23508309f 100644 --- a/docs/extending/add_an_exchange.md +++ b/docs/extending/add_an_exchange.md @@ -67,19 +67,23 @@ This should create a buy / sell order at the exchange for [amount] of [asset] at this.exchange.getOrder(order, callback); -The order will be something that the manager previously received via the `sell` or `buy` methods. The callback should have the parameters `err` and `order`. Order is an object with properties `price`, `amount` and `date`. Price is the (volume weighted) average price of all trades necesarry to execute the order. Amount is the amount of currency traded and Date is a moment object of the last trade part of this order. +Will only be called on orders that have been completed. The order will be something that the manager previously received via the `sell` or `buy` methods. The callback should have the parameters `err` and `order`. Order is an object with properties `price`, `amount` and `date`. Price is the (volume weighted) average price of all trades necesarry to execute the order. Amount is the amount of currency traded and Date is a moment object of the last trade part of this order. ### checkOrder this.exchange.checkOrder(order, callback); -The order will be something that the manager previously received via the `sell` or `buy` methods. The callback should have the parameters `err` and `filled`. Filled is a boolean that is true when the order is already filled and false when it is not. Currently partially filled orders should be treated as not filled. +The order will be something that the manager previously received via the `sell` or `buy` methods. The callback should have the parameters `err` and a `result` object. The result object will have two or three properties: + +- `open`: whether this order is currently in the orderbook. +- `completed`: whether this order has executed (filled completely). +- `filledAmount`: the amount of the order that has been filled. This property is only needed when both `open` is true and `completed` is false. ### cancelOrder this.exchange.cancelOrder(order, callback); -The order will be something that the manager previously received via the `sell` or `buy` methods. The callback should have the parameterer `err`. +The order will be something that the manager previously received via the `sell` or `buy` methods. The callback should have the parameterers `err` and `filled`, `filled` last one should be true if the order was filled before it could be cancelled. ## Trading method's expectations @@ -89,20 +93,26 @@ The trading method analyzes exchange data to determine what to do. The trading m this.watcher.getTrades(since, callback, descending); - If since is truthy, Gekko requests as much trades as the exchange can give (up to ~10,000 trades, if the exchange supports more you can [create an importer](../features/importing.md)). The callback expects an error and a `trades` object. Trades is an array of trade objects in chronological order (0 is older trade, 1 is newer trade). Each trade object needs to have: - a `date` property (unix timestamp in either string or int) -- a `price` property (float) which represents the price in [currency] per 1 [asset]. ` +- a `price` property (float) which represents the price in [currency] per 1 [asset]. - an `amount` proprty (float) which represent the amount of [asset]. - a `tid` property (float) which represents the tradeID. +## Error handling + +It is the responsibility of the wrapper to handle errors and retry the call in case of a temporary error. Gekko exposes a retry helper you can use to implement an exponential backoff retry strategy. Your wrapper does need pass a proper error object explaining whether the call can be retried or not. If the error is fatal (for example private API calls with invalid API keys) the wrapper is expected to upstream this error. If the error is retryable (exchange is overloaded or a network error) an error should be passed with the property `notFatal` set to true. If the exchange replied with another error that might be temporary (for example an `Insufficiant funds` erorr right after Gekko canceled an order, which might be caused by the exchange not having updated the balance yet) the error object can be extended with an `retry` property indicating that the call can be retried for n times but after that the error should be considered fatal. -### Recompiling Gekko UI +For implementation refer to the bitfinex implementation, in a gist this is what a common flow looks like: -Once you added your exchange you can use it with Gekko! However if you want the new exchange to show up in the web interface you need to recompile the frontend (so your updated `exchanges.js` file is used by the webapp). [Read here](https://gekko.wizb.it/docs/internals/gekko_ui.html#Developing-for-the-Gekko-UI-frontend) how to do that. +- (async call) `exchange.buy`, then +- handle the response and normalize the error so the retry helper understands it, then +- the retry helper will determine whether the call needs to be retried, then + - based on the error it will retry (nonFatal or retry) + - if no error it will pass it to your handle function that normalizes the output ## Capabilities diff --git a/docs/gekko-broker/introduction.md b/docs/gekko-broker/introduction.md new file mode 100644 index 000000000..daa144f99 --- /dev/null +++ b/docs/gekko-broker/introduction.md @@ -0,0 +1,66 @@ +# Gekko Broker + +Order execution library for bitcoin and crypto exchanges. This library is Gekko's execution engine for all live orders (simulated orders do not through Gekko Broker, they go through the paper trader). This library is intended for developers of trading systems in need for advanced order types on multiple exchanges over a unified API. + +## Introduction + +This library makes it easy to do (advanced) orders all crypto exchanges where Gekko can live trade at. See the complete list here: https://gekko.wizb.it/docs/introduction/supported_exchanges.html + +This library allows you to: + +- Get basic market data + - ticker (BBO) + - ~orderbook~ (TODO) + - historical trades +- Get portfolio data +- Do an (advanced) order: + - Submit the order to the exchange + - Receive events about the status of the order: + - submitted + - open (accepted) + - partially filled + - rejected + - completed + - Mutate the order + - cancel + - amend + - move + - move limit +- Tracks orders submitted through the library. + +## Status + +Early WIP. All communication is via the REST APIs of exchanges. Not all exchanges are supported. + +Currently supported exchanges: + +- Binance +- GDAX +- Poloniex +- Coinfalcon +- Kraken + +## Order types + +This library aims to offer advanced order types, even on exchanges that do not natively support them by tracking the market and supplimenting native order support on specific exchanges. + +Working: + +- Base orders + - [Sticky Order](./sticky_order.md) + +TODO: + +- Base orders: + - Limit Order + - Market Order +- Triggers: + - Stop + - If Touched (stop but opposite direction) + +### TODO + +- finish all exchange integrations that gekko supports +- finish all order types and triggers (under todo) +- implement websocket support (per exchange) +- use native move API calls wherever possible (poloniex) diff --git a/docs/gekko-broker/sticky_order.md b/docs/gekko-broker/sticky_order.md new file mode 100644 index 000000000..db3ae582c --- /dev/null +++ b/docs/gekko-broker/sticky_order.md @@ -0,0 +1,48 @@ +# Sticky Order + +An advanced order that stays at the top of the book (until the optional limit). The order will automatically stick to the best BBO until the complete amount has been filled. + +TODO: + +- implement fallback for when this order is alone at the top, some spread before everyone else +- finalize API +- add more events / ways to debug +- pull ticker data out of this order market data should flow from the broker (so we can easier move to at least public websocket streams). + +## Example usage + + const Broker = require('gekko-broker'); + + const gdax = new Broker({ + currency: 'EUR', + asset: 'BTC', + + exchange: 'gdax', + + // Enables access to private endpoints. + // Needed to create orders and fetch portfolio + private: true, + + key: 'x', + secret: 'y', + passphrase: 'z' + }); + + gdax.portfolio.setBalances(console.log); + + const type = 'sticky'; + const amount = 0.5; + const side = 'buy'; + const limit = 6555; + + const order = gdax.createOrder(type, side, amount, { limit }); + order.on('statusChange', status => console.log(status)); + order.on('filled', result => console.log(result)); + order.on('completed', () => { + order.createSummary(summary => console.log) + }); + + // mutate like so + + // order.moveAmount(1); + // order.moveLimit(6666); \ No newline at end of file diff --git a/docs/gekko-broker/wrapper_api.md b/docs/gekko-broker/wrapper_api.md new file mode 100644 index 000000000..e28ba87fe --- /dev/null +++ b/docs/gekko-broker/wrapper_api.md @@ -0,0 +1,22 @@ +# Wrapper API + +Gekko Broker is a library that sits between trading applications and Gekko Broker Exchange Wrappers. Which means it has two APIs to communicate with other code: + +![diagram describing Gekko Broker API interface](https://user-images.githubusercontent.com/969743/41892153-566293a0-7941-11e8-9998-7a5b5b554ffd.png) + +This document descibres the API layer between the exchange wrappers and Gekko Broker. + +## Wrapper API spec + +The current API documentation is currently located [here](../extending/add_an_exchange.md). + +## Wrapper API Changelog + +### Gekko 0.5.x to Gekko (Broker) 0.6.0 + +NOTE: this API design might still have minor changes leading up to the release of Gekko 0.6. See [this thread](https://forum.gekko.wizb.it/thread-57279-post-59207.html) for more information. + +- The wrapper files are now nested different (from `gekko/exchhanges` to `gekkobroker/wrappers` (which equals `gekko/exchange/wrappers` for Gekko users). +- cancelOrder now requires a second parameter to be passed (that indicates whether the order was filled before it was canceled), see [details](https://github.com/askmike/gekko/commit/0e301f7d66e24ec97327f5f01380f691cc2d3725#diff-dbfe320ca090e208be32459d98fc11ed). +- checkOrder now expects an object with a few properties to be returned, see [details](https://github.com/askmike/gekko/commit/e0d4a7362cd74b4b4f50759b1012ce489ea44a0c#diff-dbfe320ca090e208be32459d98fc11ed). +- Error handling has gotten a lot more complex, with an updated error interface between a retry system (provided by Gekko) and the exchange wrapper. [Read more here](https://github.com/askmike/gekko/commit/e0d4a7362cd74b4b4f50759b1012ce489ea44a0c#diff-dbfe320ca090e208be32459d98fc11ed). \ No newline at end of file diff --git a/docs/installation/installing_gekko.md b/docs/installation/installing_gekko.md index f1f187b0d..54757ad0b 100644 --- a/docs/installation/installing_gekko.md +++ b/docs/installation/installing_gekko.md @@ -12,7 +12,7 @@ To get Gekko running you need to do the following: - install nodejs - download Gekko -- install Gekko's dependencies +- install Gekko & Gekko Broker dependencies ## Installing nodejs @@ -35,6 +35,11 @@ Once you have Gekko downloaded you need to install the dependencies, open your t npm install --only=production +We also need to install Gekko Broker's dependencies, run: + + cd exchange + npm install --only=production + ## Starting Gekko After all the above you can start Gekko by running the following in your terminal: diff --git a/docs/installation/installing_gekko_on_raspberry_pi_2_or_3.md b/docs/installation/installing_gekko_on_raspberry_pi_2_or_3.md index 005192fe4..bd935fc72 100644 --- a/docs/installation/installing_gekko_on_raspberry_pi_2_or_3.md +++ b/docs/installation/installing_gekko_on_raspberry_pi_2_or_3.md @@ -66,6 +66,8 @@ If you installed Gekko via git, simply run: git pull npm install --only=production + cd exchange + npm install --only=production ## Run gekko in background If you access Pi headless via SSH, you have to use a software like tmux to run Gekko in background diff --git a/docs/installation/installing_gekko_on_windows.md b/docs/installation/installing_gekko_on_windows.md index 6e7501103..04ed55d0c 100644 --- a/docs/installation/installing_gekko_on_windows.md +++ b/docs/installation/installing_gekko_on_windows.md @@ -42,6 +42,11 @@ Install Gekko's dependencies: npm install --only=production +Install Gekko Broker's dependencies: + + cd exchange + npm install --only=production + ### Install Tulip Indicators If you are using Windows you will need to install python and the VC++ 2015 build tool, the easiest way to do this is through node as an administrator: diff --git a/docs/installation/installing_gekko_on_windows_with_bash_on_windows_10.md b/docs/installation/installing_gekko_on_windows_with_bash_on_windows_10.md index 2acbeba79..fa82b1fd6 100644 --- a/docs/installation/installing_gekko_on_windows_with_bash_on_windows_10.md +++ b/docs/installation/installing_gekko_on_windows_with_bash_on_windows_10.md @@ -66,6 +66,8 @@ The easiest way to download Gekko is to use Git: git clone git://github.com/askmike/gekko.git cd gekko npm install --only=production +cd exchange +npm install --only=production ``` ### Starting Gekko diff --git a/docs/internals/architecture.md b/docs/internals/architecture.md index 2f20bf773..633f31d5d 100644 --- a/docs/internals/architecture.md +++ b/docs/internals/architecture.md @@ -11,7 +11,7 @@ Communicaton between those two components is handled by Node.JS' [Stream API](ht ## A Market -All markets in Gekko eventually output `candle` data. Where these candles come from and how old they are does not matter to the GekkoStream they get piped into. On default Gekko looks for markets in the [`core/markets/` directory](https://github.com/askmike/gekko/tree/stable/core/markets) (but changing that is [not too hard](https://github.com/askmike/gekko/blob/72a858339afb5a856179c716ec4ea13070a6c87c/gekko.js#L48-L49)). The top orange block in the picture is a BudFox market (the default). +All markets in Gekko eventually output `candle` data. Where these candles come from and how old they are does not matter to the GekkoStream they get piped into. On default Gekko looks for markets in the [`core/markets/` directory](https://github.com/askmike/gekko/tree/stable/core/markets). The top orange block in the picture is a BudFox market (the default semi-realtime market that gets live data from exchanges). Example Markets that come included with Gekko are: @@ -23,7 +23,7 @@ Example Markets that come included with Gekko are: A GekkoStream is nothing more than a collection of [plugins](../commandline/plugins.md). Plugins are simple modules that can subscribe to events, and do something based on event data. The most basic event every GekkoStream has is the "candle" event, this event comes from the market. -However **plugins are allowed to broadcast their own events, which other plugins can subscribe to**. An example of this is the `tradingAdvisor` plugin. This plugin will implement a [trading method](https://github.com/askmike/gekko/blob/stable/docs/Trading_methods.md) that will be fed candle data. As soon as the trading method suggests to take a certain position in the market ("I detect an uptrend, I advice to go **long**") it will broadcast an `advice` event. The `paperTrader` is a plugin that simulates trading using these advices, the `trader` is a plugin that creates real market orders based on these advices. You can decide to only turn the `paperTrader` on or to turn the `trader` on (you now have a live trading bot). +However **plugins are allowed to broadcast their own events, which other plugins can subscribe to**. An example of this is the `tradingAdvisor` plugin. This plugin will implement a [strategy](../strategies/introduction.md) that will be fed candle data. As soon as the strategy suggests to take a certain position in the market ("I detect an uptrend, I advice to go **long**") it will broadcast an `advice` event. The `paperTrader` is a plugin that simulates trading using these advices, the `trader` is a plugin that creates real market orders based on these advices. You can decide to only turn the `paperTrader` on or to turn the `trader` on (you now have a live trading bot). When you run a backtest using Gekko the following things happen: @@ -35,7 +35,7 @@ When you run a backtest using Gekko the following things happen: ## Plugins & Adapters -Those two core components describe the majority of Gekko's flow. A lot "core functionality" like saving candles to disk are simply plugins that push all candles to a database adapter. +Those two core components describe the majority of Gekko's flow. A lot "core functionality" like saving candles to disk are simply plugins that push all candles to a database. ## Seperated architecture diff --git a/docs/internals/events.md b/docs/internals/events.md new file mode 100644 index 000000000..cdedc06a2 --- /dev/null +++ b/docs/internals/events.md @@ -0,0 +1,288 @@ +# Events + +As described in the [architecture](./architecture.md) events play a key role in the complete system: they relay all information between seperate components (like plugins). This makes the codebase scalable, testable and it seperates concerns. + +if you run the Gekko UI events are relayed between core components as well as broadcasted (via the UI server) to the web UI. This means that all events broadcasted by any plugin automatically end up in the web UI. + +Note that all events from Gekko come from a plugin (with the exception of the `candle` event, which comes from the market), and no plugin is required for Gekko to run, this means it might be possible that some events are never broadcasted since their originating plugin is not active. If a plugin wants to listen to an event that will never be broadcasted (because of a lack of another plugin) this will be warned in the console like so: + + (WARN): Paper Trader wanted to listen to the tradingAdvisor, however the tradingAdvisor is disabled. + +## List of events emitted by standard plugins + +- [candle](#candle-event): Every time Gekko calculas a new one minute candle from the market. +- [stratWarmupCompleted](#stratWarmupCompleted-event): When the strategy is done warming up. +- [advice](#advice-event): Every time the trading strategy is fed a new candle. +- [stratUpdate](#stratUpdate-event): Every time the strategy has processed a new strat candle. +- [tradeInitiated](#tradeInitiated-event): Every time a trading plugin (either the live trader or the paper trader) is going to start a new trade (buy or sell). +- [tradeCompleted](#tradeCompleted-event): Every time a trading plugin (either the live trader or the paper trader) has completed a trade. +- [tradeAborted](#tradeAborted-event): Every time a trading plugin (either the live trader or the paper trader) has NOT acted on new advice (due to unsufficiant funds or a similar reason). +- [portfolioChange](#portfolioChange-event): Every time the content of the portfolio has changed. +- [portfolioValueChange](#portfolioValueChange-event): Every time value of the portfolio has changed. +- [performanceReport](#performanceReport-event): Every time the profit report was updated. +- [roundtrip](#roundtrip-event): Every time a new roundtrip has been completed. + +Beside those there are also two additional market events that are only emitted when Gekko is running in either realtime or importing mode (NOT during a backtest for performance reasons). + +- [marketStart](#marketStart-event): Once, when the market just started. +- [marketUpdate](#marketUpdate-event): Whenever the market has fetched new raw market data. + +### candle event + +- What: An object containing a one minute candle from the market. +- When: In liquid markets roughly every minute. +- Subscribe: Your plugin can subscribe to this event by registering the `processCandle` method. +- Async: When subscribing to this event the second argument will be a callback which you are expected to call when done handling this event. +- Notes: + - Depending on the gekko configuration these candles might be historical on startup. If this is a concern for consumers, make sure to deal with this properly. + - In illiquid markets (of less than a trade per minute) Gekko will caculate these candles in batches and a few might come at the same time. + - These are always one minute candles, this is the lowest level of market data flowing through a gekko stream. +- Example: + { + start: [moment object of the start time of the candle], + open: [number, open of candle], + high: [number, high of candle], + low: [number, low of candle], + close: [number, close of candle], + vwp: [number, average weighted price of candle], + volume: [number, total volume volume], + trades: [number, amount of trades] + } + +### stratWarmupCompleted event + +- What: An object signaling that the strategy is now completely warmed up +and will start signaling advice. +- When: Once the strategy consumed more market data than defined by the required history. +- Subscribe: You can subscribe to this event by registering the `processWarmupCompleted` method. +- Notes: + - This event is triggered on init when the strategy does not require any history (and thus no warmup time). +- Example: + { + start: [moment object of the start time of the first candle after the warmup], + } + +### stratCandle event + +- What: An object describing an updated strat candle the strat has processed. +- When: when the strategy is initialized is started. +- Subscribe: You can subscribe to this event by registering the `processStratCandle` method. +- Notes: + - This is the candle that the strategy sees: if you configured the candleSize to 60 (minutes) this event will containt a 60 minute candle. + - Strat Candles are emitted while the strategy is still warming up (before the `stratWarmupCompleted` event). +- Example: + { + start: [moment object of the start time of the candle], + open: [number, open of candle], + high: [number, high of candle], + low: [number, low of candle], + close: [number, close of candle], + vwp: [number, average weighted price of candle], + volume: [number, total volume volume], + trades: [number, amount of trades] + } + + +### stratUpdate event + +- What: An object describing updated state of the strategy based on a new strat candle. +- When: when the strategy has +- Subscribe: You can subscribe to this event by registering the `processStratUpdate` method. +- Notes: + - Strat updates are emitted while the strategy is still warming up (before the `stratWarmupCompleted` event). +- Example: + { + date: [moment object of the start time of the candle], + indicators: { + mymacd: [number, result of running this indicator over current candle] + } + } + +### advice event + +- What: An advice from the strategy, the advice will either be LONG or SHORT. +- When: This depends on the strategy and the candleSize. +- Subscribe: You can subscribe to this event by registering the `processAdvice` method. +- Example: + { + recommendation: [position to take, either long or short], + date: [moment object of this advice], + id: [string identifying this unique trade] + } + +### tradeInitiated event + +- What: An object singaling that a new trade will be executed. +- When: At the same time as the advice event if the trader will try to trade. +- Subscribe: You can subscribe to this event by registering the `processTradeInitiated` method. +- Example: + { + id: [string identifying this unique trade], + adviceId: [number specifying the advice id this trade is based on], + action: [either "buy" or "sell"], + date: [moment object, exchange time trade completed at], + portfolio: [object containing amount in currency, asset and total balance], + balance: [number, total worth of portfolio] + } + +### tradeAborted event + +- What: An object singaling the fact that the trader will ignore the advice. +- When: At the same time as the advice event if the trader will NOT try to trade. +- Subscribe: You can subscribe to this event by registering the `processTradeAborted` method. +- Example: + { + id: [string identifying this unique trade], + adviceId: [number specifying the advice id this trade is based on], + action: [either "buy" or "sell"], + date: [moment object, exchange time trade completed at], + reason: [string explaining why the trade was aborted] + } + +### tradeCanceled event + +- What: An object singaling the fact that the a trade orginially initiated was now cancelled +- When: At the same time as the advice event if the trader will NOT try to trade. +- Subscribe: You can subscribe to this event by registering the `processTradeCanceled` method. +- Example: + { + id: [string identifying this unique trade], + adviceId: [number specifying the advice id this trade is based on], + action: [either "buy" or "sell"], + date: [moment object, exchange time trade completed at], + reason: [string explaining why the trade was aborted] + } + +### tradeCompleted event + +- What: Details of a completed trade. +- When: Some point in time after the tradeInitiated event. +- Subscribe: You can subscribe to this event by registering the `processTradeCompleted` method. +- Example: + { + id: [string identifying this unique trade], + adviceId: [number specifying the advice id this trade is based on], + action: [either "buy" or "sell"], + price: [number, average price that was sold at], + amount: [number, how much asset was trades (excluding "cost")], + cost: [number the amount in currency representing fee, slippage and other execution costs], + date: [moment object, exchange time trade completed at], + portfolio: [object containing amount in currency and asset], + balance: [number, total worth of portfolio], + feePercent: [the cost in fees], + effectivePrice: [executed price - fee percent, if effective price of buy is below that of sell you are ALWAYS in profit.] + } + +### portfolioChange event + +- What: An object containing new portfolio contents (amount of asset & currency). +- When: Some point in time after the advice event, at the same time as the tradeCompleted event. +- Subscribe: You can subscribe to this event by registering the `processPortfolioChange` method. +- Example: + { + currency: [number, portfolio amount of currency], + asset: [number, portfolio amount of asset], + } + +### portfolioValueChange event + +- What: An object containing the total portfolio worth (amount of asset & currency calculated in currency). +- When: Every time the value of the portfolio has changed, if the strategy is in a LONG position this will be every minute. +- Subscribe: You can subscribe to this event by registering the `processPortfolioValueChange` method. +- Example: + { + value: [number, portfolio amount of currency] + } + +### performanceReport event + +- What: An object containing a summary of the performance of the "tradebot" (advice signals + execution). +- When: Once every new candle. +- Subscribe: You can subscribe to this event by registering the `processPerformanceReport` method. +- Example: + { + startTime: Moment<'2017-03-25 19:41:00'>, + endTime: Moment<'2017-03-25 20:01:00'>, + timespan: 36000000, + market: -0.316304880517734, + balance: 1016.7200029226638, + profit: -26.789997197336106, + relativeProfit: -2.5672966425099304, + yearlyProfit: '-704041.12634599', + relativeYearlyProfit: '-67468.55576516', + startPrice: 945.80000002, + endPrice: 942.80838846, + trades: 10, + roundtrips: 5, + startBalance: 1043.5100001199999, + sharpe: -2.676305165560598 + } + +### roundtripInitiated event + +- What: A summary of a started roundtrip. +- When: After every tradeCompleted with action `buy`. +- Subscribe: You can subscribe to this event by registering the `processRoundtripInitiated` method. +- Example: + { + id: [string identifying this roundtrip], + entryAt: Moment<'2017-03-25 19:41:00'>, + entryPrice: 10.21315498, + entryBalance: 98.19707799420277, + exitAt: Moment<'2017-03-25 19:41:00'> + exitPrice: 10.22011632, + exitBalance: 97.9692176, + duration: 3600000, + pnl: -0.2278603942027786, + profit: -0.2320439659276161, + } + +### roundtripUpdate event + +- What: An updated summary of a currently open roundtrip. +- When: On every candle for as long as the bot is in a long position. +- Subscribe: You can subscribe to this event by registering the `processRoundtripUpdate` method. +- Example: + { + id: [string identifying this roundtrip], + at: Moment<'2017-03-25 19:41:00'>, + duration: 3600000, + uPnl: -0.2278603942027786, + uProfit: -0.2320439659276161, + } + +### roundtrip event + +- What: A summary of a completed roundtrip (buy + sell signal). +- When: After every roundtrip: a completed sell trade event that superceded a buy sell trade event. +- Subscribe: You can subscribe to this event by registering the `processRoundtrip` method. +- Example: + { + id: [string identifying this roundtrip], + entryAt: Moment<'2017-03-25 19:41:00'>, + entryPrice: 10.21315498, + entryBalance: 98.19707799420277, + exitAt: Moment<'2017-03-25 19:41:00'> + exitPrice: 10.22011632, + exitBalance: 97.9692176, + duration: 3600000, + pnl: -0.2278603942027786, + profit: -0.2320439659276161, + } + +### marketStart event + +- What: A moment object describing the first date of the market data. +- When: When the market is started. +- Subscribe: Your plugin can subscribe to this event by registering the `processMarketStart` method. +- Example: + [moment object describing the date of the first market data] + +### marketUpdate event + +- What: A moment object describing the point in time for up to which the market has market data. +- When: Every few seconds. +- Subscribe: Your plugin can subscribe to this event by registering the `processMarketUpdate` method. +- Example: + [moment object describing the date of the latest market data] + diff --git a/docs/internals/gekko_ui.md b/docs/internals/gekko_ui.md index 803bea3a9..33a409d08 100644 --- a/docs/internals/gekko_ui.md +++ b/docs/internals/gekko_ui.md @@ -2,7 +2,7 @@ When you launch Gekko UI, you start a basic nodejs webserver with 3 components: -- It will serve frontend (HTML/CSS/JS) files for frontend written as a [vuejs app](https://vuejs.org/) (v2). +- It will serve frontend (HTML/CSS/JS) files for frontend written as a [vuejs app](https://vuejs.org/) (v2.5.16). - It will will handle API requests as [koa](http://koajs.com/) (v1) routes. - It will start a websocket server used to broadcast messages in realtime (used for long lived processes Importing and Live Gekkos for example). @@ -25,8 +25,9 @@ The frontend is setup as a very basic vue app. Additionally the following librar The vue app itself uses the following libraries: - [marked](https://github.com/chjj/marked) -- [jade](https://github.com/pugjs) (all html is either written in jade of markdown) +- [pug](https://github.com/pugjs) (all html is either written in pug of markdown) - [vue-router](https://github.com/vuejs/vue-router) +- [vuex](https://github.com/vuejs/vuex) - [superagent](https://github.com/visionmedia/superagent) (cross browser ajax) ### Developing for the Gekko UI frontend @@ -45,7 +46,7 @@ After this you can launch a hot reload version of the app which will automatical # path to vue app cd vue - npm run dev + npm run serve Gekko UI is now served from port 8080, the webpack dev server will compile the vue app (in memory) and intercept all calls to the app itself (`/dist/build.js`) and serve the in memory app. It is important to note that this UI still talks to the API served from the `node server` commmand (on default http://localhost:3000/api) diff --git a/docs/internals/server_api.md b/docs/internals/server_api.md new file mode 100644 index 000000000..f0d41323d --- /dev/null +++ b/docs/internals/server_api.md @@ -0,0 +1,795 @@ +# Server API + +The Gekko project has three major components: + + - [Actual Gekko instance](./architecture.md) + - A nodejs server that: + - starts and manages gekkos + - broadcasts all updates from all gekkos and tracks their overall state + - has API calls to query and manage historical data (by importing more for example) + - [A web UI (vue frontend project)](./gekko_ui.md) + +The nodejs server can also be used standalone as a webserver in combination with your own software (such as a new UI, a mobile app or a higher level backtester), see [other software](../extending/other_software.md) for examples). + +The server exposes two different APIs: A websocket API to push gekko updates and a REST API for everything else. + +When you run `node gekko --ui` it will automatically start a server. You can also do this manually by running: + + cd gekko/web + node server + +The server will now run on the host/port configured in `gekko/web/vue/public/UIConfig.js` (under api.host). + +## REST API + +### GET /api/info + +Get version information of current running Gekko Server. + +NOTE: The API does not have dedicated versioning, instead it uses the version of the complete Gekko project. + +**response** + +``` +{ "version": "0.6.0" } +``` + +### GET /api/strategies + +Get all strategies known to this Gekko. The value of the `params` key is a TOML string. + +**response** + +``` +[ + { + "name": "DEBUG_single-advice", + "params": "" + }, + { + "name": "DEBUG_toggle-advice", + "params": "" + }, + { + "name": "DEMA", + "params": "weight = 21\n\n[thresholds]\ndown = -0.025\nup = 0.025\n" + }, + { + "name": "MACD", + "params": "short = 10\nlong = 21\nsignal = 9\n\n[thresholds]\ndown = -0.025\nup = 0.025\npersistence = 1" + }, + // etc. +] +``` + +### GET /api/apiKeys + +Returns a list of exchanges that this Gekko has API keys stored for. + +NOTE: for security reasons the Gekko never exposes the API keys themselves. + +**response** + +``` +["bitstamp","bitfinex"] +``` + +### GET /api/imports + +Returns a list of currently running data imports. + +**response** + +``` +[ + { + "watch": { + "exchange": "poloniex", + "currency": "USDT", + "asset": "BTC" + }, + "id": "765606096903592", + "latest": "2018-04-03T07:13:00Z", + "from": "2018-04-03 05:13", + "to": "2018-07-03 05:13", + "done": false + } +] +``` + +### GET /api/gekkos + +Returns a list of currently running and archived Gekkos. + +**response** + +``` +{ + "live": { + "2018-07-03-13-14-papertrader-384222057313623": { + "mode": "realtime", + "config": { + // complete config that was passed when creating + }, + "id": "2018-07-03-13-14-papertrader-384222057313623", + "type": "leech", + "logType": "papertrader", + "active": true, + "stopped": false, + "errored": false, + "errorMessage": false, + "events": { + "initial": { + "candle": { + "id": 419824, + "start": "2018-07-03T04:47:00.000Z", + "open": 6664.79999887, + "high": 6664.79999887, + "low": 6659.99999989, + "close": 6659.99999989, + "vwp": 6662.402395386147, + "volume": 0.001202, + "trades": 3 + }, + "portfolioChange": { + "asset": 1, + "currency": 100 + }, + "portfolioValueChange": { + "balance": 6759.99999989 + } + }, + "latest": { + "candle": { + "id": 419849, + "start": "2018-07-03T05:12:00.000Z", + "open": 6643.21466865, + "high": 6656.58532982, + "low": 6643.01, + "close": 6656, + "vwp": 6643.884436854498, + "volume": 1.9966113400000003, + "trades": 15 + }, + "portfolioChange": { + "asset": 1, + "currency": 100 + }, + "portfolioValueChange": { + "balance": 6756 + } + } + }, + "start": "2018-07-03T05:14:23.582Z", + "latestUpdate": "2018-07-03T05:14:24.090Z" + } + }, + "archive": {} +} +``` + +### GET /api/exchanges + +Returns a list of supported exchanges with meta information (such as supported features and tradable markets). + +**response** + +``` +{ + "name": "Bitstamp", + "slug": "bitstamp", + "currencies": [ + "USD", + // and more + ], + "assets": [ + "BTC", + // and more + ], + "maxTradesAge": 60, + "maxHistoryFetch": null, + "markets": [ + { + "pair": [ + "USD", + "EUR" + ], + "minimalOrder": { + "amount": 5, + "unit": "currency" + }, + "precision": 2 + }, + // and more + ], + "requires": [ + "key", + "secret", + "username" + ], + "fetchTimespan": 60, + "tid": "tid", + "tradable": true +} +``` + +### POST /api/addApiKey + +Adds an API key for an exchange account to Gekko. As of now only 1 API keypair can be added per exchange. + +**request** + +``` +{ + "exchange": "bitstamp", + "values": { + "key": "x", + "secret": "y" + } +} +``` + +**response** + +``` +{ + "status": "ok" +} +``` + +### POST /api/removeApiKey + +Removes an API key from Gekko. + +**request** + +``` +{ + "exchange": "bitstamp" +} +``` + +**response** + +``` +{ + "status": "ok" +} +``` + +### POST /api/scan + +Scans a daterange to find all datasets for a specific market. + +**request** + +``` +{ + "watch": { + exchange: "bitstamp", + "currency": "USD", + "asset": "BTC" + } +} +``` + +**response** + +``` +[ + { + "to": 1464787560, + "from": 1464783960 + }, + { + "to": 1479115560, + "from": 1471112760 + } +] +``` + +### POST /api/scansets + +Scans the database for all datasets for all markets. + +**request** + +``` +{} +``` + +**response** + +``` +{ + "datasets": [ + { + "exchange": "bitfinex", + "currency": "USD", + "asset": "BTC", + "ranges": [ + { + "to": 1508551500, + "from": 1508493900 + } + ] + }, + { + "exchange": "binance", + "currency": "USDT", + "asset": "BTC", + "ranges": [ + { + "to": 1514351280, + "from": 1510632480 + }, + { + "to": 1522915680, + "from": 1522678080 + } + ] + }, + ], + "errors": [ + { + "exchange": "poloniex", + "currency": "BTC", + "asset": "BTC" + } + ] +} +``` + +### POST /api/backtest + +Perform a backtest. + +**request** + +*(a valid gekko config object)* + +Tweak the `config.backtestResultExporter.data` object to control what is included in the output. For example skip `stratCandles` if you only care about the final profit report. This way the server won't include megabytes of candle data in the output. + +``` +{ + "watch": { + "exchange": "poloniex", + "currency": "USDT", + "asset": "ETH" + }, + "paperTrader": { + "feeMaker": 0.25, + "feeTaker": 0.25, + "feeUsing": "maker", + "slippage": 0.05, + "simulationBalance": { + "asset": 1, + "currency": 100 + }, + "reportRoundtrips": true, + "enabled": true + }, + "tradingAdvisor": { + "enabled": true, + "method": "MACD", + "candleSize": 60, + "historySize": 10 + }, + "MACD": { + "short": 10, + "long": 21, + "signal": 9, + "thresholds": { + "down": -0.025, + "up": 0.025, + "persistence": 1 + } + }, + "backtest": { + "daterange": { + "from": "2016-06-01T11:57:00Z", + "to": "2016-11-13T14:57:00Z" + } + }, + "backtestResultExporter": { + "enabled": true, + "writeToDisk": false, + "data": { + "stratUpdates": false, + "roundtrips": true, + "stratCandles": true, + "stratCandleProps": [ + "open" + ], + "trades": true + } + }, + "performanceAnalyzer": { + "riskFreeReturn": 2, + "enabled": true + } +} +``` + +**response** + +``` +{ + "performanceReport": { + "startTime": "2018-04-02 14:08:00", + "endTime": "2018-04-05 04:08:00", + "timespan": "3 days", + "market": -2.159980297428632, + "startBalance": 7083.86, + "balance": 7424.849452897501, + "profit": 340.989452897501, + "relativeProfit": 4.813610840664566, + "yearlyProfit": 48210.518806418906, + "relativeYearlyProfit": 680.5684867631334, + "startPrice": 6983.86, + "endPrice": 6833.01, + "trades": 3, + "exposure": 0.3709677419354839, + "sharpe": null, + "downside": null, + "alpha": 343.14943319492966 + }, + "roundtrips": [ + { + "id": 0, + "entryAt": 1522685280, + "entryPrice": 7019.99, + "entryBalance": 7119.6899337771, + "exitAt": 1522768080, + "exitPrice": 7365, + "exitBalance": 7447.19106625, + "duration": 82800000, + "pnl": 327.5011324729003, + "profit": 4.599935327508788 + }, + // and more + ], + "stratCandles": [ + { + "open": 6990.06, + "start": 1522678080 + }, + // and more + ], + "trades": [ + { + "id": "trade-1", + "adviceId": "advice-1", + "action": "buy", + "cost": 0.30000000000000027, + "amount": 1.01420229, + "price": 7019.99, + "portfolio": { + "asset": 1.08661475, + "currency": 0 + }, + "balance": 7119.6899337771, + "date": 1522685280 + }, + // and more + ] +} +``` + +### POST /api/import + +Start a data import. + +**request** + +*(a valid gekko config object)* + + +``` +{ + "watch": { + "exchange": "poloniex", + "currency": "USDT", + "asset": "BTC" + }, + "importer": { + "daterange": { + "from": "2018-04-03 05:46", + "to": "2018-07-03 05:46" + } + }, + "candleWriter": { + "enabled": true + } +} +``` + +**response** + +NOTE: this only contains information regarding the started import, updates are pushed through the websocket. + +``` +{ + "watch": { + "exchange": "poloniex", + "currency": "USDT", + "asset": "BTC" + }, + "id": "7324830525419355", + "latest": "", + "from": "2018-04-03 05:46", + "to": "2018-07-03 05:46" +} +``` + +### POST /api/startGekko + +Start a gekko instance + +**request** + +*(a valid gekko config object)* + +In order to start a stratRunner, pass a config object that includes plugins required for a stratrunner (such as paperTrader, tradingAdvisor and performanceAnalyzer). + +``` +{ + "watch": { + "exchange": "poloniex", + "currency": "USDT", + "asset": "BTC" + }, + "candleWriter": { + "enabled": true, + }, + "type": "market watcher", + "mode": "realtime" +} +``` + +**response** + +NOTE: this only contains information regarding the started gekko, updates from are pushed through the websocket. + +``` +{ + "mode": "realtime", + "config": { + // config that was passed in the request + }, + "id": "2018-07-03-13-49-watcher-404457189518044", + "type": "watcher", + "logType": "watcher", + "active": true, + "stopped": false, + "errored": false, + "errorMessage": false, + "events": { + "initial": {}, + "latest": {} + }, + "start": "2018-07-03T05:49:06.685Z" +} +``` + +### POST /api/stopGekko + +Stop a gekko instance + +**request** + +``` +{ + "id": "2018-07-03-13-49-watcher-404457189518044" +} +``` + +**response** + +``` +{ + "status": "ok" +} +``` + +### POST /api/deleteGekko + +Delete a stopped gekko instance from the archive. + +**request** + +``` +{ + "id": "2018-07-03-13-49-watcher-404457189518044" +} +``` + +**response** + +``` +{ + "status": "ok" +} +``` + +### POST /api/getCandles + +Load candles directly from the database. + +**request** + +``` +{ + "watch": { + "exchange": "poloniex", + "currency": "USDT", + "asset": "BTC" + }, + "daterange": { + "to": "2018-07-03T05:53:00.000Z", + "from": "2018-07-03T05:40:00.000Z" + }, + "candleSize": 1 +} +``` + +**response** + +``` +[ + { + "start": 1530596400, + "open": 6645.49999958, + "high": 6649.83970225, + "low": 6642, + "close": 6642, + "vwp": 6644.840723040122, + "volume": 0.007383000000000001, + "trades": 23 + }, + { + "start": 1530596460, + "open": 6649.69979936, + "high": 6649.69979936, + "low": 6642, + "close": 6648.89999912, + "vwp": 6645.926390922748, + "volume": 0.007383450000000001, + "trades": 21 + }, + // etc. +] +``` + +## Websocket API + +A websocket server is started at the basepath of the API. Connecting to it means you'll receive update messages. Messages you send to the server via theh websocket connection are completely ignored, to control the server use the REST API instead. + +The possible messages are: + +### import_update + +Whenever there is an update regarding a running import. + +``` +{ + type: 'import_update', + import_id: '7324830525419355', + updates: { + latest: '2018-07-03T05:49:06.685Z', + done: false + } +} +``` + +### import_error + +Whenever there is a fatal error in a running import. After receiving this the import will not continue. + +``` +{ + type: 'import_error', + import_id: '7324830525419355', + error: "Error string" +} +``` + +### gekko_new + +Whenever a new Gekko has been started. + +``` +{ + "type": "gekko_new", + "id": "2018-07-03-16-37-watcher-938815758693549", + "state": { + "mode": "realtime", + "config": { + // the complete config that was passed + }, + "id": "2018-07-03-16-37-watcher-938815758693549", + "type": "watcher", + "logType": "watcher", + "active": true, + "stopped": false, + "errored": false, + "errorMessage": false, + "events": { + "initial": {}, + "latest": {} + }, + "start": "2018-07-03T08:37:51.965Z" + } +} +``` + +### gekko_event + +Whenever a gekko instance has a new Gekko event. See the [gekko events doc](../events.md) for a list of all possible events and details. + +``` +{ + "type": "gekko_event", + "id": "2018-07-03-16-37-watcher-938815758693549", + "event": { + "type": "candle", + "payload": { + "start": "2018-07-03T08:38:00.000Z", + "open": 6623.00000066, + "high": 6623.00000066, + "low": 6623.00000066, + "close": 6623.00000066, + "vwp": 6623.00000066, + "volume": 0, + "trades": 0 + } + } +} +``` + +### gekko_stopped + +Whenever a Gekko has been stopped, does not fire when the instance had a fatal error. For that see `gekko_error`. + +``` +{ + "type": "gekko_stopped", + "id": "2018-07-03-16-37-watcher-938815758693549" +} +``` + +### gekko_error + + +Whenever a gekko received a fatal error and crashed. + +``` +{ + "type": "gekko_error", + "id": "2018-07-03-16-37-watcher-938815758693549", + "error": "Error message" +} +``` + + +### gekko_archived + +Whenever the server does not consider the instance to be relevant anymore, fires after a gekko has been stopped or had a fatal error. After this event the gekko instance is placed in an in memory archive. It will stay here stale (as it won't be updated) until it's deleted. + +``` +{ + "type": "gekko_stopped", + "id": "2018-07-03-16-37-watcher-938815758693549" +} +``` + +### gekko_deleted + +Whenever an archived gekko instance got deleted. + +``` +{ + "type": "gekko_stopped", + "id": "2018-07-03-16-37-watcher-938815758693549" +} +``` \ No newline at end of file diff --git a/docs/introduction/about_gekko.md b/docs/introduction/about_gekko.md index 1f5040b13..dc891f489 100644 --- a/docs/introduction/about_gekko.md +++ b/docs/introduction/about_gekko.md @@ -22,7 +22,7 @@ All the above modes can be run from the user interface, this interface will show ## Strategies -Gekko comes with some [example strategies](../strategies/example_strategies.md) (which implement a single indicator). But with some basic javascript you can [create your own strategies](../strategies/creating_a_strategy.md). You can use over 130 indicators to create your perfect prediction model ([full list](../strategies/talib_indicators.md) of supported indicators). *Why don't you combine Bollinger Bands, CCI and MACD with a STOCHRSI indicator?* +Gekko comes with some [example strategies](../strategies/introduction.md) (which implement a single indicator). But with some basic javascript you can [create your own strategies](../strategies/creating_a_strategy.md). You can use over 130 indicators to create your perfect prediction model (using [Talib's indicators](../strategies/talib_indicators.md) or [Tulip's indicators](../strategies/tulip_indicators.md)). *Why don't you combine Bollinger Bands, CCI and MACD with a STOCHRSI indicator?* ## Automated Trading platform diff --git a/docs/introduction/roadmap.md b/docs/introduction/roadmap.md index 56fa2a520..95e86d46f 100644 --- a/docs/introduction/roadmap.md +++ b/docs/introduction/roadmap.md @@ -6,16 +6,7 @@ This is a small selection of things currently on the roadmap: ## Current TODO -- [UI] Improve management and display of live gekkos ([#911](https://github.com/askmike/gekko/issues/911) - [askmike](https://github.com/askmike)) -- Simplify config ([#956](https://github.com/askmike/gekko/issues/956) - [cassvail](https://github.com/cassvail)) -- fix BTC Markets exchange ([#936](https://github.com/askmike/gekko/pull/936) - [anotherkabab](https://github.com/anotherkabab)) - -## Major active discussions - -- [UI] Draw indicators results in the UI ([#793](https://github.com/askmike/gekko/pull/793) - [askmike](https://github.com/askmike)) -- Store roundtrips in CSV ([#978](https://github.com/askmike/gekko/issues/978)) -- Integrating Machine Learning AI into to Gekko ([#789](https://github.com/askmike/gekko/issues/789)) - ------ - -Note that besides this list there are a big number of smaller issues and bugfixes happening constantly. See the [issue tracker](https://github.com/askmike/gekko/issues) and [the forum](https://gekko.forum.wizb.it) for more details. \ No newline at end of file +- Improve stability of new event and backtest engine +- Port the old supported exchanges to Gekko Broker +- new UI, see [here](https://forum.gekko.wizb.it/thread-1429-post-58996.html) +- advanced orders from your strategy (Take Profit and Stop Loss) \ No newline at end of file diff --git a/docs/introduction/supported_exchanges.md b/docs/introduction/supported_exchanges.md index e2d4012ab..69cc37966 100644 --- a/docs/introduction/supported_exchanges.md +++ b/docs/introduction/supported_exchanges.md @@ -11,25 +11,28 @@ Gekko is able to directly communicate with the APIs of a number of exchanges. Ho | [Binance][24] | ✓ | ✓ | ✓ | | | [Poloniex][2] | ✓ | ✓ | ✓ | | | [GDAX][3] | ✓ | ✓ | ✓ | | -| [BTCC][4] | ✓ | ✓ | ✓ | (=BTCChina) | -| [Bitstamp][5] | ✓ | ✓ | ✕ | | +| [BTCC][4]* | ✓ | ✓ | ✓ | (=BTCChina) | +| [Bitstamp][5]* | ✓ | ✓ | ✕ | | | [Kraken][6] | ✓ | ✓ | ✓ | | | [Bitfinex][7] | ✓ | ✓ | ✓ | | -| [Bittrex][8] | ✓ | ✓ | ✕ | | +| [Bittrex][8]* | ✓ | ✓ | ✕ | | | [coinfalcon][25] | ✓ | ✓ | ✓ | | -| [wex.nz][9] | ✓ | ✓ | ✕ | | -| [Gemini][10] | ✓ | ✓ | ✕ | | -| [Okcoin.cn][11] | ✓ | ✓ | ✕ | China, see [#352][20] | -| [Cex.io][12] | ✓ | ✕ | ✕ | | -| [BTC Markets][13] | ✓ | ✓ | ✕ | | -| [bitX][14] | ✓ | ✕ | ✕ | | -| [lakeBTC][15] | ✓ | ✕ | ✕ | | -| [meXBT][16] | ✓ | ✕ | ✕ | see [here][21] | -| [zaif][17] | ✓ | ✕ | ✕ | | -| [lakeBTC][18] | ✓ | ✕ | ✕ | | -| [bx.in.th][19] | ✓ | ✕ | ✕ | | -| [bitcoin.co.id][22] | ✓ | ✓ | ✕ | | -| [Quadriga CX][23] | ✓ | ✓ | ✕ | | | +| [wex.nz][9]* | ✓ | ✓ | ✕ | | +| [Gemini][10]* | ✓ | ✓ | ✕ | | +| [Okcoin.cn][11]* | ✓ | ✓ | ✕ | China, see [#352][20] | +| [Cex.io][12]* | ✓ | ✕ | ✕ | | +| [BTC Markets][13]* | ✓ | ✓ | ✕ | | +| [bitX][14]* | ✓ | ✕ | ✕ | | +| [lakeBTC][15]* | ✓ | ✕ | ✕ | | +| [meXBT][16]* | ✓ | ✕ | ✕ | see [here][21] | +| [zaif][17]* | ✓ | ✕ | ✕ | | +| [lakeBTC][18]* | ✓ | ✕ | ✕ | | +| [bx.in.th][19]* | ✓ | ✕ | ✕ | | +| [bitcoin.co.id][22]* | ✓ | ✓ | ✕ | | +| [Quadriga CX][23]* | ✓ | ✓ | ✕ | | | + + +*Temporary disabled since 0.6! If you were planning on using this exchange please e-mail me (address at the bottom of this page). [1]: ../features/backtesting.md [2]: https://poloniex.com @@ -55,6 +58,6 @@ Gekko is able to directly communicate with the APIs of a number of exchanges. Ho [22]: https://vip.bitcoin.co.id/ [23]: https://quadrigacx.com/ [24]: https://www.binance.com/?ref=11236330 -[25]: https://coinfalcon.com/?ref=CFJSTEXJQFFE +[25]: https://coinfalcon.com/?ref=CFJSQBMXZZDS diff --git a/docs/strategies/creating_a_strategy.md b/docs/strategies/creating_a_strategy.md index 7083715d0..cb8dcd228 100644 --- a/docs/strategies/creating_a_strategy.md +++ b/docs/strategies/creating_a_strategy.md @@ -2,7 +2,7 @@ Strategies are the core of Gekko's trading bot. They look at the market and decide what to do based on technical analysis indicators. As of now all strategies are limited to a single market on a single exchange. -Gekko currently comes with [a couple of strategies](./example_strategies.md) out of the box. Besides those you can also write your own strategy in javascript. The easiest way to do this is to customize the file `gekko/strategies/custom.js`. +Gekko currently comes with [a couple of strategies](./introduction.md) out of the box. Besides those you can also write your own strategy in javascript. The easiest way to do this is to customize the file `gekko/strategies/custom.js`. ## Creating a strategy diff --git a/docs/strategies/example_strategies.md b/docs/strategies/introduction.md similarity index 80% rename from docs/strategies/example_strategies.md rename to docs/strategies/introduction.md index a30431cee..c760e7ef2 100644 --- a/docs/strategies/example_strategies.md +++ b/docs/strategies/introduction.md @@ -1,10 +1,10 @@ -# Example Strategies +# Gekko Strategies Gekko uses [technical analysis indicators](http://www.investopedia.com/articles/active-trading/102914/technical-analysis-strategies-beginners.asp) inside **strategies**. -This investment advice is going to be either **long** or **short**. +This investment advice is going to be either **long** or **short**. Long indicates that Gekko the asset should be bought and short indicates that it should be sold. -Below you can find simple and limited trading methods that come with Gekko. These strategies come with Gekko and serve as examples, for any serious usage we recommend you [write your own](./creating_a_strategy.md). +Below you can find simple and examplary strategies that come with Gekko. These strategies come with Gekko and serve as examples, **for anything that involves real money we recommend you [write your own](./creating_a_strategy.md).** Gekko currently comes with the following example strategies: @@ -19,12 +19,12 @@ Gekko currently comes with the following example strategies: ### DEMA -This method uses `Exponential Moving Average crossovers` to determine the current trend the +This strategy uses `Exponential Moving Average crossovers` to determine the current trend the market is in. Using this information it will suggest to ride the trend. Note that this is not MACD because it just checks whether the longEMA and shortEMA are [threshold]% removed from eachother. -This method is fairly popular in bitcoin trading due to Bitcointalk user Goomboo. Read more about this method in [his topic](https://bitcointalk.org/index.php?topic=60501.0) or [here](http://stockcharts.com/school/doku.php?id=chart_school:technical_indicators:moving_averages). +This strategy is fairly popular in bitcoin trading due to Bitcointalk user Goomboo. Read more about this strategy in [his topic](https://bitcointalk.org/index.php?topic=60501.0) or [here](http://stockcharts.com/school/doku.php?id=chart_school:technical_indicators:moving_averages). You can configure the following parameters: @@ -43,7 +43,7 @@ You can configure the following parameters: ### MACD -This method is similar to DEMA but goes a little further by comparing the difference by an EMA of itself. Read more about it [here](http://stockcharts.com/school/doku.php?id=chart_school:technical_indicators:moving_average_convergence_divergence_macd). +This strategy is similar to DEMA but goes a little further by comparing the difference by an EMA of itself. Read more about it [here](http://stockcharts.com/school/doku.php?id=chart_school:technical_indicators:moving_average_convergence_divergence_macd). You can configure the following parameters: @@ -144,6 +144,8 @@ You can configure the following parameters: ### talib-macd +Similar to the default MACD strategy, this showcases how to add a TA-lib indicator to a strategy. + You can configure the following parameters: [parameters] @@ -157,6 +159,8 @@ You can configure the following parameters: ### tulip-macd +Similar to the default MACD strategy, this showcases how to add a Tulip indicator to a strategy. + You can configure the following parameters: [parameters] diff --git a/exchange/README.md b/exchange/README.md new file mode 100644 index 000000000..c9efdae3e --- /dev/null +++ b/exchange/README.md @@ -0,0 +1,3 @@ +# Gekko Broker + +see [the docs](../docs/gekko-broker/introduction.md). \ No newline at end of file diff --git a/core/exchangeChecker.js b/exchange/exchangeChecker.js similarity index 79% rename from core/exchangeChecker.js rename to exchange/exchangeChecker.js index a4542b11e..e717790bf 100644 --- a/core/exchangeChecker.js +++ b/exchange/exchangeChecker.js @@ -1,31 +1,17 @@ -var _ = require('lodash'); -var fs = require('fs'); -var util = require('./util'); -var config = util.getConfig(); -var dirs = util.dirs(); -var moment = require('moment'); - -var Checker = function() { - _.bindAll(this); -} +const _ = require('lodash'); +const fs = require('fs'); +const moment = require('moment'); +const errors = require('./exchangeErrors'); -Checker.prototype.notValid = function(conf) { - if(conf.tradingEnabled) - return this.cantTrade(conf); - else - return this.cantMonitor(conf); +const Checker = function() { + _.bindAll(this); } Checker.prototype.getExchangeCapabilities = function(slug) { - var capabilities; - - if(!fs.existsSync(dirs.exchanges + slug + '.js')) - util.die(`Gekko does not know exchange "${slug}"`); - - var Trader = require(dirs.exchanges + slug); - capabilities = Trader.getCapabilities(); + if(!fs.existsSync(__dirname + '/wrappers/' + slug + '.js')) + throw new errors.ExchangeError(`Gekko does not know the exchange "${slug}"`); - return capabilities; + return require('./wrappers/' + slug).getCapabilities(); } // check if the exchange is configured correctly for monitoring @@ -43,10 +29,10 @@ Checker.prototype.cantMonitor = function(conf) { var name = exchange.name; - if(!_.contains(exchange.currencies, conf.currency)) + if(!_.includes(exchange.currencies, conf.currency)) return 'Gekko only supports the currencies [ ' + exchange.currencies.join(', ') + ' ] at ' + name + ' (not ' + conf.currency + ')'; - if(!_.contains(exchange.assets, conf.asset)) + if(!_.includes(exchange.assets, conf.asset)) return 'Gekko only supports the assets [ ' + exchange.assets.join(', ') + ' ] at ' + name + ' (not ' + conf.asset + ')'; var pair = _.find(exchange.markets, function(p) { @@ -56,7 +42,7 @@ Checker.prototype.cantMonitor = function(conf) { if(!pair) return 'Gekko does not support this currency/assets pair at ' + name; - // everyting okay + // everything is okay return false; } diff --git a/exchange/exchangeErrors.js b/exchange/exchangeErrors.js new file mode 100644 index 000000000..4dca77cf5 --- /dev/null +++ b/exchange/exchangeErrors.js @@ -0,0 +1,42 @@ +const _ = require('lodash'); + +const ExchangeError = function(message) { + _.bindAll(this); + + this.name = "ExchangeError"; + this.message = message; +} +ExchangeError.prototype = new Error(); + +const ExchangeAuthenticationError = function(message) { + _.bindAll(this); + + this.name = "ExchangeAuthenticationError"; + this.message = message; +} +ExchangeAuthenticationError.prototype = new Error(); + +const RetryError = function(message) { + _.bindAll(this); + + this.name = "RetryError"; + this.retry = 5; + this.message = message; +} +RetryError.prototype = new Error(); + +const AbortError = function(message) { + _.bindAll(this); + + this.name = "AbortError"; + this.message = message; +} +AbortError.prototype = new Error(); + +module.exports = { + ExchangeError, + ExchangeAuthenticationError, + RetryError, + AbortError +}; + diff --git a/exchange/exchangeUtils.js b/exchange/exchangeUtils.js new file mode 100644 index 000000000..28746090c --- /dev/null +++ b/exchange/exchangeUtils.js @@ -0,0 +1,62 @@ +// generic low level reusuable utils for interacting with exchanges. + +const retry = require('retry'); +const errors = require('./exchangeErrors'); + +const retryInstance = (options, checkFn, callback) => { + if(!options) { + options = { + retries: 100, + factor: 1.2, + minTimeout: 1 * 1000, + maxTimeout: 4 * 1000 + }; + } + + let attempt = 0; + + const operation = retry.operation(options); + operation.attempt(function(currentAttempt) { + checkFn((err, result) => { + if(!err) { + return callback(undefined, result); + } + + let maxAttempts = err.retry; + if(maxAttempts === true) + maxAttempts = 10; + + if(err.retry && attempt++ < maxAttempts) { + return operation.retry(err); + } + + if(err.notFatal) { + if(err.backoffDelay) { + return setTimeout(() => operation.retry(err), err.backoffDelay); + } + + return operation.retry(err); + } + + callback(err, result); + }); + }); +} + +// es6 bind all: https://github.com/posrix/es6-class-bind-all/blob/master/lib/es6ClassBindAll.js +const allMethods = targetClass => { + const propertys = Object.getOwnPropertyNames(Object.getPrototypeOf(targetClass)) + propertys.splice(propertys.indexOf('constructor'), 1) + return propertys +} + +const bindAll = (targetClass, methodNames = []) => { + for (const name of !methodNames.length ? allMethods(targetClass) : methodNames) { + targetClass[name] = targetClass[name].bind(targetClass) + } +} + +module.exports = { + retry: retryInstance, + bindAll +} \ No newline at end of file diff --git a/exchange/gekkoBroker.js b/exchange/gekkoBroker.js new file mode 100644 index 000000000..b30b4fd2b --- /dev/null +++ b/exchange/gekkoBroker.js @@ -0,0 +1,135 @@ +/* + The broker manages all communicatinn with the exchange, delegating: + + - the management of the portfolio to the portfolioManager + - the management of actual trades to "orders". +*/ + +const _ = require('lodash'); +const async = require('async'); +const events = require('events'); +const moment = require('moment'); +const checker = require('./exchangeChecker'); +const errors = require('./exchangeErrors'); +const Portfolio = require('./portfolioManager'); +// const Market = require('./market'); +const orders = require('./orders'); +const bindAll = require('./exchangeUtils').bindAll; + +class Broker { + constructor(config) { + this.config = config; + + this.orders = { + // contains current open orders + open: [], + // contains all closed orders + closed: [] + } + + const slug = config.exchange.toLowerCase(); + + const API = require('./wrappers/' + slug); + + this.api = new API(config); + + this.capabilities = API.getCapabilities(); + + this.marketConfig = _.find(this.capabilities.markets, (p) => { + return _.first(p.pair) === config.currency.toUpperCase() && + _.last(p.pair) === config.asset.toUpperCase(); + }); + + this.interval = this.api.interval || 1500; + + this.market = config.currency.toUpperCase() + config.asset.toUpperCase(); + + if(config.private) { + this.portfolio = new Portfolio(config, this.api); + } + + bindAll(this); + } + + cantTrade() { + return checker.cantTrade(this.config); + } + + sync(callback) { + if(!this.private) { + this.setTicker(); + return; + } + + if(this.cantTrade()) + throw new errors.ExchangeError(this.cantTrade()); + + this.syncPrivateData(); + } + + syncPrivateData(callback) { + async.series([ + this.setTicker, + next => setTimeout(next, this.interval), + this.portfolio.setFee.bind(this.portfolio), + next => setTimeout(next, this.interval), + this.portfolio.setBalances.bind(this.portfolio), + next => setTimeout(next, this.interval) + ], callback); + } + + setTicker(callback) { + this.api.getTicker((err, ticker) => { + + if(err) { + if(err.message) { + console.log(this.api.name, err.message); + throw err; + } else { + console.log('err not wrapped in error:', err); + throw new errors.ExchangeError(err); + } + } + + this.ticker = ticker; + + if(_.isFunction(callback)) + callback(); + }); + } + + createOrder(type, side, amount, parameters, handler) { + if(!this.config.private) + throw new Error('Client not authenticated'); + + if(side !== 'buy' && side !== 'sell') + throw new Error('Unknown side ' + side); + + if(!orders[type]) + throw new Error('Unknown order type'); + + const order = new orders[type](this.api); + + this.orders.open.push(order); + + // todo: figure out a smarter generic way + this.syncPrivateData(() => { + order.setData({ + balances: this.portfolio.balances, + ticker: this.ticker, + market: this.marketConfig + }); + + order.create(side, amount, parameters); + }); + + order.on('completed', summary => { + _.remove(this.orders.open, order); + this.orders.closed.push(summary); + }); + + return order; + } +} + +module.exports = Broker; \ No newline at end of file diff --git a/exchange/orders/index.js b/exchange/orders/index.js new file mode 100644 index 000000000..6b28034f5 --- /dev/null +++ b/exchange/orders/index.js @@ -0,0 +1,7 @@ +const sticky = require('./sticky'); +const limit = require('./limit'); + +module.exports = { + sticky, + limit +} \ No newline at end of file diff --git a/exchange/orders/limit.js b/exchange/orders/limit.js new file mode 100644 index 000000000..b229caa5e --- /dev/null +++ b/exchange/orders/limit.js @@ -0,0 +1,239 @@ +/* + The limit order is a simple order: + - It is created at the specified price + - If it were to cross it will throw instead (only if postOnly is specified) + - It can be moved + +*/ + +const _ = require('lodash'); +const async = require('async'); +const events = require('events'); +const moment = require('moment'); +const errors = require('../exchangeErrors'); +const BaseOrder = require('./order'); +const states = require('./states'); + +class LimitOrder extends BaseOrder { + constructor(api) { + super(api); + } + + create(side, amount, params) { + this.side = side; + + this.postOnly = params.postOnly; + + this.status = states.SUBMITTED; + this.emitStatus(); + + this.createOrder(price, amount); + } + + createOrder(price, amount) { + this.amount = this.api.roundAmount(amount); + this.price = this.api.roundPrice(price); + + // note: this assumes ticker data to be up to date + if(this.postOnly) { + if(side === 'buy' && this.price > this.data.ticker.ask) + throw new Error('Order crosses the book'); + else if(side === 'sell' && this.price < this.data.ticker.bid) + throw new Error('Order crosses the book'); + } + + this.submit({ + side: this.side, + amount: this.api.roundAmount(this.amount - alreadyFilled), + price: this.price, + alreadyFilled: this.filled + }); + } + + handleCreate(err, id) { + if(err) + throw err; + + this.status = states.OPEN; + this.emitStatus(); + + this.id = id; + + if(this.cancelling) + return this.cancel(); + + if(this.movingAmount) + return this.moveAmount(); + + if(this.movingPrice) + return this.movePrice(); + + this.timeout = setTimeout(this.checkOrder, this.checkInterval) + } + + checkOrder() { + this.checking = true; + this.api.checkOrder(this.id, this.handleCheck); + } + + handleCheck(err, result) { + if(this.cancelling || this.status === states.CANCELLED) + return; + + this.checking = false; + + if(err) + throw err; + + if(result.open) { + if(result.filledAmount !== this.filledAmount) { + this.filledAmount = result.filledAmount; + + // note: doc event API + this.emit('fill', this.filledAmount); + } + + if(this.cancelling) + return this.cancel(); + + if(this.movingAmount) + return this.moveAmount(); + + if(this.movingPrice) + return this.movePrice(); + + this.timeout = setTimeout(this.checkOrder, this.checkInterval); + return; + } + + if(!result.executed) { + // not open and not executed means it never hit the book + this.rejected(); + return; + } + + this.filled(this.price); + } + + movePrice(price) { + if(this.completed) + return; + + if(!price) + price = this.movePriceTo; + + if(this.price === this.api.roundPrice(price)) + // effectively nothing changed + return; + + if( + this.status === states.SUBMITTED || + this.status === states.MOVING || + this.checking + ) { + this.movePriceTo = price; + this.movingPrice = true; + return; + } + + this.movingPrice = false; + + this.price = this.api.roundPrice(price); + + clearTimeout(this.timeout); + + this.status = states.MOVING; + + this.api.cancelOrder(this.id, (err, filled) => { + if(err) + throw err; + + if(filled) + return this.filled(this.price); + + this.submit({ + side: this.side, + amount: this.amount, + price: this.price, + alreadyFilled: this.filled + }); + }); + } + + moveAmount(amount) { + if(this.completed) + return; + + if(!amount) + amount = this.moveAmountTo; + + if(this.amount === this.api.roundAmount(amount)) + // effectively nothing changed + return; + + if( + this.status === states.SUBMITTED || + this.status === states.MOVING || + this.checking + ) { + this.moveAmountTo = amount; + this.movingAmount = true; + return; + } + + this.movingAmount = false; + this.amount = this.api.roundAmount(amount); + + clearTimeout(this.timeout); + + this.status = states.MOVING; + this.emitStatus(); + + this.api.cancelOrder(this.id, (err, filled) => { + if(err) + throw err; + + if(filled) + return this.filled(this.price); + + this.submit({ + side: this.side, + amount: this.amount, + price: this.price, + alreadyFilled: this.filled + }); + }); + } + + cancel() { + if(this.completed) + return; + + if( + this.status === states.SUBMITTED || + this.status === states.MOVING || + this.checking + ) { + this.cancelling = true; + return; + } + + clearTimeout(this.timeout); + + this.api.cancelOrder(this.id, (err, filled) => { + if(err) + throw err; + + this.cancelling = false; + + if(filled) + return this.filled(this.price); + + this.status = states.CANCELLED; + this.emitStatus(); + this.finish(false); + }); + } +} + +module.exports = LimitOrder; \ No newline at end of file diff --git a/exchange/orders/order.js b/exchange/orders/order.js new file mode 100644 index 000000000..b7e044a83 --- /dev/null +++ b/exchange/orders/order.js @@ -0,0 +1,113 @@ +const EventEmitter = require('events'); +const _ = require('lodash'); + +const bindAll = require('../exchangeUtils').bindAll; +const states = require('./states'); + +// base order + +class BaseOrder extends EventEmitter { + constructor(api) { + super(); + + this.api = api; + + this.checkInterval = api.interval || 1500; + + this.status = states.INITIALIZING; + + this.completed = false; + this.completing = false; + + bindAll(this); + } + + submit({side, amount, price, alreadyFilled}) { + + // Check amount + if(amount < this.data.market.minimalOrder.amount) { + if(alreadyFilled) { + // partially filled, but the remainder is too + // small. + return this.filled(); + } + + // We are not partially filled, meaning the + // amount passed was too small to even start. + throw new Error('Amount is too small'); + } + + // Some exchanges have restrictions on prices + if( + _.isFunction(this.api.isValidPrice) && + !this.api.isValidPrice(price) + ) { + if(alreadyFilled) { + // partially filled, but the remainder is too + // small. + return this.filled(); + } + + // We are not partially filled, meaning the + // amount passed was too small to even start. + throw new Error('Price is not valid'); + } + + // Some exchanges have restrictions on lot sizes + if( + _.isFunction(this.api.isValidLot) && + !this.api.isValidLot(this.price, amount) + ) { + if(alreadyFilled) { + // partially filled, but the remainder is too + // small. + return this.filled(); + } + + // We are not partially filled, meaning the + // amount passed was too small to even start. + throw new Error('Lot size is too small'); + } + + this.api[this.side](amount, this.price, this.handleCreate); + } + + setData(data) { + this.data = data; + } + + emitStatus() { + this.emit('statusChange', this.status); + } + + cancelled() { + this.status = states.CANCELLED; + this.completed = true; + this.finish(); + } + + rejected(reason) { + this.rejectedReason = reason; + this.status = states.REJECTED; + this.finish(); + } + + filled(price) { + this.status = states.FILLED; + this.emitStatus(); + + this.completed = true; + + this.finish(true); + } + + finish(filled) { + this.completed = true; + this.emit('completed', { + status: this.status, + filled + }) + } +} + +module.exports = BaseOrder; \ No newline at end of file diff --git a/exchange/orders/states.js b/exchange/orders/states.js new file mode 100644 index 000000000..ac285c6ed --- /dev/null +++ b/exchange/orders/states.js @@ -0,0 +1,28 @@ +const states = { + // Not created + INITIALIZING: 'INITIALIZING', + + // Created and send to the exchange, but no acknowledgement received yet + SUBMITTED: 'SUBMITTED', + + // In the process of moving the order + MOVING: 'MOVING', + + // Order is open on the exchange + OPEN: 'OPEN', + + + // the orders below indicate a fully completed order + + + // Order is completely filled + FILLED: 'FILLED', + + // Order was succesfully cancelled + CANCELLED: 'CANCELLED', + + // Order was rejected by the exchange + REJECTED: 'REJECTED' +} + +module.exports = states; \ No newline at end of file diff --git a/exchange/orders/sticky.js b/exchange/orders/sticky.js new file mode 100644 index 000000000..09c94af0f --- /dev/null +++ b/exchange/orders/sticky.js @@ -0,0 +1,515 @@ +/* + The sticky order is an advanced order: + - It is created at a limit price of X + - if limit is not specified always at bbo. + - if limit is specified the price is either limit or the bbo (whichever is more favorable) + - it will readjust the order: + - if outbid is true it will outbid the current bbo (on supported exchanges) + - if outbid is false it will stick to current bbo when this moves + - If the price moves away from the order it will "stick to" the top + + TODO: + - native move +*/ + +const _ = require('lodash'); +const async = require('async'); +const events = require('events'); +const moment = require('moment'); +const errors = require('../exchangeErrors'); +const BaseOrder = require('./order'); +const states = require('./states'); + +class StickyOrder extends BaseOrder { + constructor(api) { + super(api); + + // global async lock + this.sticking = false; + } + + create(side, rawAmount, params = {}) { + if(this.completed || this.completing) { + return false; + } + + this.side = side; + + this.amount = this.api.roundAmount(rawAmount); + + if(side === 'buy') { + if(params.limit) + this.limit = this.api.roundPrice(params.limit); + else + this.limit = Infinity; + } else { + if(params.limit) + this.limit = this.api.roundPrice(params.limit); + else + this.limit = -Infinity; + } + + this.status = states.SUBMITTED; + this.emitStatus(); + + this.orders = {}; + + this.outbid = params.outbid && _.isFunction(this.api.outbidPrice); + + this.price = this.calculatePrice(this.data.ticker); + + this.createOrder(); + + return this; + } + + calculatePrice(ticker) { + if(this.side === 'buy') { + if(ticker.bid >= this.limit) { + return this.limit; + } + + if(!this.outbid) { + return ticker.bid; + } + + const outbidPrice = this.api.outbidPrice(ticker.bid, true); + + if(outbidPrice <= this.limit && outbidPrice < ticker.ask) { + return outbidPrice; + } else { + return this.limit; + } + + } else if(this.side === 'sell') { + + if(ticker.ask <= this.limit) { + return this.limit; + } + + if(!this.outbid) { + return ticker.ask; + } + + const outbidPrice = this.api.outbidPrice(ticker.ask, false); + + if(outbidPrice >= this.limit && outbidPrice > ticker.bid) { + return outbidPrice; + } else { + return this.limit; + } + } + } + + createOrder() { + if(this.completed || this.completing) { + return false; + } + + const alreadyFilled = this.calculateFilled(); + + this.submit({ + side: this.side, + amount: this.api.roundAmount(this.amount - alreadyFilled), + price: this.price, + alreadyFilled + }); + } + + handleCreate(err, id) { + if(err) { + console.log('handleCreate', err.message); + throw err; + } + + if(!id) + console.log('BLUP! no id...'); + + // potentailly clean up old order + if( + this.id && + this.orders[this.id] && + this.orders[this.id].filled === 0 + ) + delete this.orders[this.id]; + + // register new order + this.id = id; + this.orders[id] = { + price: this.price, + filled: 0 + } + + this.emit('new order', this.id); + + this.status = states.OPEN; + this.emitStatus(); + + // remove lock + this.sticking = false; + + // check whether we had an action pending + if(this.cancelling) + return this.cancel(); + + if(this.movingLimit) + return this.moveLimit(); + + if(this.movingAmount) + return this.moveAmount(); + + // register check + this.timeout = setTimeout(this.checkOrder, this.checkInterval); + } + + checkOrder() { + if(this.completed || this.completing) { + return console.log(new Date, 'checkOrder called on completed/completing order..', this.completed, this.completing); + } + + this.sticking = true; + + this.api.checkOrder(this.id, (err, result) => { + if(err) { + console.log(new Date, 'error creating:', err.message); + throw err; + } + + if(result.open) { + if(result.filledAmount !== this.orders[this.id].filled) { + this.orders[this.id].filled = result.filledAmount; + this.emit('fill', this.calculateFilled()); + } + + // if we are already at limit we dont care where the top is + // note: might be string VS float + if(this.price == this.limit) { + this.timeout = setTimeout(this.checkOrder, this.checkInterval); + this.sticking = false; + return; + } + + this.api.getTicker((err, ticker) => { + if(err) + throw err; + + this.ticker = ticker; + + const bookSide = this.side === 'buy' ? 'bid' : 'ask'; + // note: might be string VS float + if(ticker[bookSide] != this.price) { + return this.move(this.calculatePrice(ticker)); + } + + this.timeout = setTimeout(this.checkOrder, this.checkInterval); + this.sticking = false; + }); + + return; + } + + if(!result.executed) { + // not open and not executed means it never hit the book + this.sticking = false; + this.status = states.REJECTED; + this.emitStatus(); + this.finish(); + return; + } + + // order got filled! + this.orders[this.id].filled = this.amount; + this.sticking = false; + this.emit('fill', this.amount); + this.filled(this.price); + + }); + } + + // returns true if the order was fully filled + // handles partial fills on cancels calls + // on exchanges that support it. + handleCancel(filled, data) { + // it got filled before we could cancel + if(filled) { + this.orders[this.id].filled = this.amount; + this.emit('fill', this.amount); + this.filled(this.price); + return true; + } + + // if we have data on partial fills + // check whether we had a partial fill + if(_.isObject(data)) { + let amountFilled = data.filled; + + if(!amountFilled && data.remaining) { + const alreadyFilled = this.calculateFilled(); + const orderAmount = this.api.roundAmount(this.amount - alreadyFilled); + amountFilled = this.api.roundAmount(orderAmount - data.remaining); + } + + if(amountFilled > this.orders[this.id].filled) { + this.orders[this.id].filled = amountFilled; + this.emit('fill', this.calculateFilled()); + } + } + + return false; + } + + move(price) { + if(this.completed || this.completing) { + return false; + } + + this.status = states.MOVING; + this.emitStatus(); + + this.api.cancelOrder(this.id, (err, filled, data) => { + // it got filled before we could cancel + if(this.handleCancel(filled, data)) { + return; + } + + // update to new price + this.price = this.api.roundPrice(price); + + this.createOrder(); + }); + + return true; + } + + calculateFilled() { + let totalFilled = 0; + _.each(this.orders, (order, id) => totalFilled += order.filled); + + return totalFilled; + } + + moveLimit(limit) { + if(this.completed || this.completing) { + return false; + } + + if(!limit) { + limit = this.moveLimitTo; + } + + if(this.limit === this.api.roundPrice(limit)) { + // effectively nothing changed + return false; + } + + if( + this.status === states.INITIALIZING || + this.status === states.SUBMITTED || + this.status === states.MOVING || + this.sticking + ) { + this.moveLimitTo = limit; + this.movingLimit = true; + return; + } + + this.limit = this.api.roundPrice(limit); + + clearTimeout(this.timeout); + + this.movingLimit = false; + + if(this.side === 'buy' && this.limit < this.price) { + this.sticking = true; + this.move(this.limit); + } else if(this.side === 'sell' && this.limit > this.price) { + this.sticking = true; + this.move(this.limit); + } else { + this.timeout = setTimeout(this.checkOrder, this.checkInterval); + } + + return true; + } + + moveAmount(amount) { + if(this.completed || this.completing) + return false; + + if(!amount) + amount = this.moveAmountTo; + + if(this.amount === this.api.roundAmount(amount)) + // effectively nothing changed + return true; + + if(this.calculateFilled() > this.api.roundAmount(amount)) { + // the amount is now below how much we have + // already filled. + this.filled(); + return false; + } + + if( + this.status === states.INITIALIZING || + this.status === states.SUBMITTED || + this.status === states.MOVING || + this.sticking + ) { + this.moveAmountTo = amount; + this.movingAmount = true; + return; + } + + this.amount = this.api.roundAmount(amount - this.calculateFilled()); + + if(this.amount < this.data.market.minimalOrder.amount) { + if(this.calculateFilled()) { + // we already filled enough of the order! + this.filled(); + return false; + } else { + throw new Error("The amount " + this.amount + " is too small."); + } + } + + clearTimeout(this.timeout); + + this.movingAmount = false; + this.sticking = true; + + this.api.cancelOrder(this.id, (err, filled, data) => { + if(err) { + throw err; + } + + // it got filled before we could cancel + if(this.handleCancel(filled, data)) { + return; + } + + this.createOrder(); + }); + + return true; + } + + cancel() { + if(this.completed) + return; + + if( + this.status === states.SUBMITTED || + this.status === states.MOVING || + this.sticking + ) { + this.cancelling = true; + return; + } + + this.completing = true; + clearTimeout(this.timeout); + this.api.cancelOrder(this.id, (err, filled, data) => { + if(err) { + throw err; + } + + this.cancelling = false; + + // it got filled before we could cancel + if(this.handleCancel(filled, data)) { + return; + } + + this.status = states.CANCELLED; + this.emitStatus(); + + this.finish(false); + }) + } + + createSummary(next) { + if(!this.completed) + console.log(new Date, 'createSummary BUT ORDER NOT COMPLETED!'); + + if(!next) + next = _.noop; + + const checkOrders = _.keys(this.orders) + .map(id => next => { + + if(!this.orders[id].filled) { + return next(); + } + + setTimeout(() => this.api.getOrder(id, next), this.timeout); + }); + + async.series(checkOrders, (err, trades) => { + if(err) { + return next(err); + } + + let price = 0; + let amount = 0; + let date = moment(0); + + _.each(trades, trade => { + if(!trade) { + return; + } + + // last fill counts + date = moment(trade.date); + price = ((price * amount) + (+trade.price * trade.amount)) / (+trade.amount + amount); + amount += +trade.amount; + }); + + const summary = { + price, + amount, + date, + side: this.side, + orders: trades.length + } + + if(_.first(trades) && _.first(trades).fees) { + summary.fees = {}; + + _.each(trades, trade => { + if(!trade) { + return; + } + + _.each(trade.fees, (amount, currency) => { + if(!_.isNumber(summary.fees[currency])) { + summary.fees[currency] = amount; + } else { + summary.fees[currency] += amount; + } + }); + }); + } + + if(_.first(trades) && _.first(trades).feePercent) { + summary.feePercent = 0; + let amount = 0; + + _.each(trades, trade => { + if(!trade || !trade.feePercent) { + return; + } + + summary.feePercent = ((summary.feePercent * amount) + (+trade.feePercent * trade.amount)) / (+trade.amount + amount); + amount += +trade.amount; + }); + } + + this.emit('summary', summary); + next(undefined, summary); + }); + } + +} + +module.exports = StickyOrder; \ No newline at end of file diff --git a/exchange/package-lock.json b/exchange/package-lock.json new file mode 100644 index 000000000..3b866147f --- /dev/null +++ b/exchange/package-lock.json @@ -0,0 +1,937 @@ +{ + "name": "gekko-broker", + "version": "0.0.2", + "lockfileVersion": 1, + "requires": true, + "dependencies": { + "@types/caseless": { + "version": "0.12.1", + "resolved": "https://registry.npmjs.org/@types/caseless/-/caseless-0.12.1.tgz", + "integrity": "sha512-FhlMa34NHp9K5MY1Uz8yb+ZvuX0pnvn3jScRSNAb75KHGB8d3rEU6hqMs3Z2vjuytcMfRg6c5CHMc3wtYyD2/A==" + }, + "@types/form-data": { + "version": "2.2.1", + "resolved": "https://registry.npmjs.org/@types/form-data/-/form-data-2.2.1.tgz", + "integrity": "sha512-JAMFhOaHIciYVh8fb5/83nmuO/AHwmto+Hq7a9y8FzLDcC1KCU344XDOMEmahnrTFlHjgh4L0WJFczNIX2GxnQ==", + "requires": { + "@types/node": "10.1.2" + } + }, + "@types/node": { + "version": "10.1.2", + "resolved": "https://registry.npmjs.org/@types/node/-/node-10.1.2.tgz", + "integrity": "sha512-bjk1RIeZBCe/WukrFToIVegOf91Pebr8cXYBwLBIsfiGWVQ+ifwWsT59H3RxrWzWrzd1l/Amk1/ioY5Fq3/bpA==" + }, + "@types/request": { + "version": "2.47.0", + "resolved": "https://registry.npmjs.org/@types/request/-/request-2.47.0.tgz", + "integrity": "sha512-/KXM5oev+nNCLIgBjkwbk8VqxmzI56woD4VUxn95O+YeQ8hJzcSmIZ1IN3WexiqBb6srzDo2bdMbsXxgXNkz5Q==", + "requires": { + "@types/caseless": "0.12.1", + "@types/form-data": "2.2.1", + "@types/node": "10.1.2", + "@types/tough-cookie": "2.3.3" + } + }, + "@types/tough-cookie": { + "version": "2.3.3", + "resolved": "https://registry.npmjs.org/@types/tough-cookie/-/tough-cookie-2.3.3.tgz", + "integrity": "sha512-MDQLxNFRLasqS4UlkWMSACMKeSm1x4Q3TxzUC7KQUsh6RK1ZrQ0VEyE3yzXcBu+K8ejVj4wuX32eUG02yNp+YQ==" + }, + "ajv": { + "version": "5.5.2", + "resolved": "https://registry.npmjs.org/ajv/-/ajv-5.5.2.tgz", + "integrity": "sha1-c7Xuyj+rZT49P5Qis0GtQiBdyWU=", + "requires": { + "co": "4.6.0", + "fast-deep-equal": "1.1.0", + "fast-json-stable-stringify": "2.0.0", + "json-schema-traverse": "0.3.1" + } + }, + "asn1": { + "version": "0.2.3", + "resolved": "https://registry.npmjs.org/asn1/-/asn1-0.2.3.tgz", + "integrity": "sha1-2sh4dxPJlmhJ/IGAd36+nB3fO4Y=" + }, + "assert-plus": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/assert-plus/-/assert-plus-1.0.0.tgz", + "integrity": "sha1-8S4PPF13sLHN2RRpQuTpbB5N1SU=" + }, + "async": { + "version": "2.6.0", + "resolved": "https://registry.npmjs.org/async/-/async-2.6.0.tgz", + "integrity": "sha512-xAfGg1/NTLBBKlHFmnd7PlmUW9KhVQIUuSrYem9xzFUZy13ScvtyGGejaae9iAVRiRq9+Cx7DPFaAAhCpyxyPw==", + "requires": { + "lodash": "4.17.10" + } + }, + "async-limiter": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/async-limiter/-/async-limiter-1.0.0.tgz", + "integrity": "sha512-jp/uFnooOiO+L211eZOoSyzpOITMXx1rBITauYykG3BRYPu8h0UcxsPNB04RR5vo4Tyz3+ay17tR6JVf9qzYWg==" + }, + "asynckit": { + "version": "0.4.0", + "resolved": "https://registry.npmjs.org/asynckit/-/asynckit-0.4.0.tgz", + "integrity": "sha1-x57Zf380y48robyXkLzDZkdLS3k=" + }, + "aws-sign2": { + "version": "0.7.0", + "resolved": "https://registry.npmjs.org/aws-sign2/-/aws-sign2-0.7.0.tgz", + "integrity": "sha1-tG6JCTSpWR8tL2+G1+ap8bP+dqg=" + }, + "aws4": { + "version": "1.7.0", + "resolved": "https://registry.npmjs.org/aws4/-/aws4-1.7.0.tgz", + "integrity": "sha512-32NDda82rhwD9/JBCCkB+MRYDp0oSvlo2IL6rQWA10PQi7tDUM3eqMSltXmY+Oyl/7N3P3qNtAlv7X0d9bI28w==" + }, + "babel-runtime": { + "version": "6.26.0", + "resolved": "https://registry.npmjs.org/babel-runtime/-/babel-runtime-6.26.0.tgz", + "integrity": "sha1-llxwWGaOgrVde/4E/yM3vItWR/4=", + "requires": { + "core-js": "2.5.6", + "regenerator-runtime": "0.11.1" + } + }, + "bcrypt-pbkdf": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/bcrypt-pbkdf/-/bcrypt-pbkdf-1.0.1.tgz", + "integrity": "sha1-Y7xdy2EzG5K8Bf1SiVPDNGKgb40=", + "optional": true, + "requires": { + "tweetnacl": "0.14.5" + } + }, + "bignumber.js": { + "version": "6.0.0", + "resolved": "https://registry.npmjs.org/bignumber.js/-/bignumber.js-6.0.0.tgz", + "integrity": "sha512-x247jIuy60/+FtMRvscqfxtVHQf8AGx2hm9c6btkgC0x/hp9yt+teISNhvF8WlwRkCc5yF2fDECH8SIMe8j+GA==" + }, + "binance": { + "version": "1.3.3", + "resolved": "https://registry.npmjs.org/binance/-/binance-1.3.3.tgz", + "integrity": "sha512-1eV2QUoH/Z0FZPiGjigJg4udXV9Uu6Clr0Sg1xsX3xStgPfzXz0juA3mllQIiIaHx7dmfAQgEiZIyeJLx5ajag==", + "requires": { + "request": "2.86.0", + "underscore": "1.9.0", + "ws": "3.3.3" + } + }, + "bintrees": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/bintrees/-/bintrees-1.0.2.tgz", + "integrity": "sha1-SfiW1uhYpKSZ34XDj7OZua/4QPg=" + }, + "bitfinex-api-node": { + "version": "2.0.0-beta.1", + "resolved": "https://registry.npmjs.org/bitfinex-api-node/-/bitfinex-api-node-2.0.0-beta.1.tgz", + "integrity": "sha512-UVKh4PAaijplm/VWs3ZLONQo8mhF0bemDZjEQCKtJteNlB+crmqRp/fPuWC2ZTYX2ZQ//J0zriOhEUiuwwGSDA==", + "requires": { + "bignumber.js": "6.0.0", + "cbq": "0.0.1", + "crc-32": "1.2.0", + "debug": "2.6.9", + "lodash": "4.17.10", + "lodash.throttle": "4.1.1", + "request": "2.86.0", + "request-promise": "4.2.2", + "ws": "3.3.3" + } + }, + "bluebird": { + "version": "3.5.1", + "resolved": "https://registry.npmjs.org/bluebird/-/bluebird-3.5.1.tgz", + "integrity": "sha512-MKiLiV+I1AA596t9w1sQJ8jkiSr5+ZKi0WKrYGUn6d1Fx+Ij4tIj+m2WMQSGczs5jZVxV339chE8iwk6F64wjA==" + }, + "boom": { + "version": "4.3.1", + "resolved": "https://registry.npmjs.org/boom/-/boom-4.3.1.tgz", + "integrity": "sha1-T4owBctKfjiJ90kDD9JbluAdLjE=", + "requires": { + "hoek": "4.2.1" + } + }, + "caseless": { + "version": "0.12.0", + "resolved": "https://registry.npmjs.org/caseless/-/caseless-0.12.0.tgz", + "integrity": "sha1-G2gcIf+EAzyCZUMJBolCDRhxUdw=" + }, + "cbq": { + "version": "0.0.1", + "resolved": "https://registry.npmjs.org/cbq/-/cbq-0.0.1.tgz", + "integrity": "sha512-MCLjfpHAcI3gPdx26xoQx2JqRdNMf68ovhJkqNSiZIx/yQP6yNYYKbf8ww2J6kgNTPGIrXyugFlNz5jmGtg8BQ==" + }, + "co": { + "version": "4.6.0", + "resolved": "https://registry.npmjs.org/co/-/co-4.6.0.tgz", + "integrity": "sha1-bqa989hTrlTMuOR7+gvz+QMfsYQ=" + }, + "coinfalcon": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/coinfalcon/-/coinfalcon-1.0.3.tgz", + "integrity": "sha512-dzyLdeDGY9Fg4zewCFolK/TjB/Mrf9tpBupx7IAqhZcYH6jY5z7xxMywIgJnf4bbRKMIEnJ2GJFqgue9M1nwnw==", + "requires": { + "babel-runtime": "6.26.0" + } + }, + "combined-stream": { + "version": "1.0.6", + "resolved": "https://registry.npmjs.org/combined-stream/-/combined-stream-1.0.6.tgz", + "integrity": "sha1-cj599ugBrFYTETp+RFqbactjKBg=", + "requires": { + "delayed-stream": "1.0.0" + } + }, + "core-js": { + "version": "2.5.6", + "resolved": "https://registry.npmjs.org/core-js/-/core-js-2.5.6.tgz", + "integrity": "sha512-lQUVfQi0aLix2xpyjrrJEvfuYCqPc/HwmTKsC/VNf8q0zsjX7SQZtp4+oRONN5Tsur9GDETPjj+Ub2iDiGZfSQ==" + }, + "core-util-is": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/core-util-is/-/core-util-is-1.0.2.tgz", + "integrity": "sha1-tf1UIgqivFq1eqtxQMlAdUUDwac=" + }, + "crc-32": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/crc-32/-/crc-32-1.2.0.tgz", + "integrity": "sha512-1uBwHxF+Y/4yF5G48fwnKq6QsIXheor3ZLPT80yGBV1oEUwpPojlEhQbWKVw1VwcTQyMGHK1/XMmTjmlsmTTGA==", + "requires": { + "exit-on-epipe": "1.0.1", + "printj": "1.1.2" + } + }, + "cryptiles": { + "version": "3.1.2", + "resolved": "https://registry.npmjs.org/cryptiles/-/cryptiles-3.1.2.tgz", + "integrity": "sha1-qJ+7Ig9c4l7FboxKqKT9e1sNKf4=", + "requires": { + "boom": "5.2.0" + }, + "dependencies": { + "boom": { + "version": "5.2.0", + "resolved": "https://registry.npmjs.org/boom/-/boom-5.2.0.tgz", + "integrity": "sha512-Z5BTk6ZRe4tXXQlkqftmsAUANpXmuwlsF5Oov8ThoMbQRzdGTA1ngYRW160GexgOgjsFOKJz0LYhoNi+2AMBUw==", + "requires": { + "hoek": "4.2.1" + } + } + } + }, + "ctype": { + "version": "0.5.3", + "resolved": "https://registry.npmjs.org/ctype/-/ctype-0.5.3.tgz", + "integrity": "sha1-gsGMJGH3QRTvFsE1IkrQuRRMoS8=", + "optional": true + }, + "dashdash": { + "version": "1.14.1", + "resolved": "https://registry.npmjs.org/dashdash/-/dashdash-1.14.1.tgz", + "integrity": "sha1-hTz6D3y+L+1d4gMmuN1YEDX24vA=", + "requires": { + "assert-plus": "1.0.0" + } + }, + "debug": { + "version": "2.6.9", + "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz", + "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==", + "requires": { + "ms": "2.0.0" + } + }, + "decompress-response": { + "version": "3.3.0", + "resolved": "https://registry.npmjs.org/decompress-response/-/decompress-response-3.3.0.tgz", + "integrity": "sha1-gKTdMjdIOEv6JICDYirt7Jgq3/M=", + "requires": { + "mimic-response": "1.0.0" + } + }, + "delayed-stream": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/delayed-stream/-/delayed-stream-1.0.0.tgz", + "integrity": "sha1-3zrhmayt+31ECqrgsp4icrJOxhk=" + }, + "duplexer3": { + "version": "0.1.4", + "resolved": "https://registry.npmjs.org/duplexer3/-/duplexer3-0.1.4.tgz", + "integrity": "sha1-7gHdHKwO08vH/b6jfcCo8c4ALOI=" + }, + "ecc-jsbn": { + "version": "0.1.1", + "resolved": "https://registry.npmjs.org/ecc-jsbn/-/ecc-jsbn-0.1.1.tgz", + "integrity": "sha1-D8c6ntXw1Tw4GTOYUj735UN3dQU=", + "optional": true, + "requires": { + "jsbn": "0.1.1" + } + }, + "exit-on-epipe": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/exit-on-epipe/-/exit-on-epipe-1.0.1.tgz", + "integrity": "sha512-h2z5mrROTxce56S+pnvAV890uu7ls7f1kEvVGJbw1OlFH3/mlJ5bkXu0KRyW94v37zzHPiUd55iLn3DA7TjWpw==" + }, + "extend": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/extend/-/extend-3.0.1.tgz", + "integrity": "sha1-p1Xqe8Gt/MWjHOfnYtuq3F5jZEQ=" + }, + "extsprintf": { + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/extsprintf/-/extsprintf-1.3.0.tgz", + "integrity": "sha1-lpGEQOMEGnpBT4xS48V06zw+HgU=" + }, + "fast-deep-equal": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/fast-deep-equal/-/fast-deep-equal-1.1.0.tgz", + "integrity": "sha1-wFNHeBfIa1HaqFPIHgWbcz0CNhQ=" + }, + "fast-json-stable-stringify": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/fast-json-stable-stringify/-/fast-json-stable-stringify-2.0.0.tgz", + "integrity": "sha1-1RQsDK7msRifh9OnYREGT4bIu/I=" + }, + "forever-agent": { + "version": "0.6.1", + "resolved": "https://registry.npmjs.org/forever-agent/-/forever-agent-0.6.1.tgz", + "integrity": "sha1-+8cfDEGt6zf5bFd60e1C2P2sypE=" + }, + "form-data": { + "version": "2.3.2", + "resolved": "https://registry.npmjs.org/form-data/-/form-data-2.3.2.tgz", + "integrity": "sha1-SXBJi+YEwgwAXU9cI67NIda0kJk=", + "requires": { + "asynckit": "0.4.0", + "combined-stream": "1.0.6", + "mime-types": "2.1.18" + } + }, + "gdax": { + "version": "0.7.0", + "resolved": "https://registry.npmjs.org/gdax/-/gdax-0.7.0.tgz", + "integrity": "sha512-lJHXlGchJVNtql8VWH+Idalehl5T5N6O9g5MUEW7IOuPtsbb7D15vgz6MOx1NgSyZe0fSIINv9s0HxujYB3sqg==", + "requires": { + "@types/request": "2.47.0", + "bignumber.js": "5.0.0", + "bintrees": "1.0.2", + "request": "2.86.0", + "ws": "4.1.0" + }, + "dependencies": { + "bignumber.js": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/bignumber.js/-/bignumber.js-5.0.0.tgz", + "integrity": "sha512-KWTu6ZMVk9sxlDJQh2YH1UOnfDP8O8TpxUxgQG/vKASoSnEjK9aVuOueFaPcQEYQ5fyNXNTOYwYw3099RYebWg==" + }, + "ws": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/ws/-/ws-4.1.0.tgz", + "integrity": "sha512-ZGh/8kF9rrRNffkLFV4AzhvooEclrOH0xaugmqGsIfFgOE/pIz4fMc4Ef+5HSQqTEug2S9JZIWDR47duDSLfaA==", + "requires": { + "async-limiter": "1.0.0", + "safe-buffer": "5.1.2" + } + } + } + }, + "get-stream": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/get-stream/-/get-stream-3.0.0.tgz", + "integrity": "sha1-jpQ9E1jcN1VQVOy+LtsFqhdO3hQ=" + }, + "getpass": { + "version": "0.1.7", + "resolved": "https://registry.npmjs.org/getpass/-/getpass-0.1.7.tgz", + "integrity": "sha1-Xv+OPmhNVprkyysSgmBOi6YhSfo=", + "requires": { + "assert-plus": "1.0.0" + } + }, + "got": { + "version": "7.1.0", + "resolved": "https://registry.npmjs.org/got/-/got-7.1.0.tgz", + "integrity": "sha512-Y5WMo7xKKq1muPsxD+KmrR8DH5auG7fBdDVueZwETwV6VytKyU9OX/ddpq2/1hp1vIPvVb4T81dKQz3BivkNLw==", + "requires": { + "decompress-response": "3.3.0", + "duplexer3": "0.1.4", + "get-stream": "3.0.0", + "is-plain-obj": "1.1.0", + "is-retry-allowed": "1.1.0", + "is-stream": "1.1.0", + "isurl": "1.0.0", + "lowercase-keys": "1.0.1", + "p-cancelable": "0.3.0", + "p-timeout": "1.2.1", + "safe-buffer": "5.1.2", + "timed-out": "4.0.1", + "url-parse-lax": "1.0.0", + "url-to-options": "1.0.1" + } + }, + "har-schema": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/har-schema/-/har-schema-2.0.0.tgz", + "integrity": "sha1-qUwiJOvKwEeCoNkDVSHyRzW37JI=" + }, + "har-validator": { + "version": "5.0.3", + "resolved": "https://registry.npmjs.org/har-validator/-/har-validator-5.0.3.tgz", + "integrity": "sha1-ukAsJmGU8VlW7xXg/PJCmT9qff0=", + "requires": { + "ajv": "5.5.2", + "har-schema": "2.0.0" + } + }, + "has-symbol-support-x": { + "version": "1.4.2", + "resolved": "https://registry.npmjs.org/has-symbol-support-x/-/has-symbol-support-x-1.4.2.tgz", + "integrity": "sha512-3ToOva++HaW+eCpgqZrCfN51IPB+7bJNVT6CUATzueB5Heb8o6Nam0V3HG5dlDvZU1Gn5QLcbahiKw/XVk5JJw==" + }, + "has-to-string-tag-x": { + "version": "1.4.1", + "resolved": "https://registry.npmjs.org/has-to-string-tag-x/-/has-to-string-tag-x-1.4.1.tgz", + "integrity": "sha512-vdbKfmw+3LoOYVr+mtxHaX5a96+0f3DljYd8JOqvOLsf5mw2Otda2qCDT9qRqLAhrjyQ0h7ual5nOiASpsGNFw==", + "requires": { + "has-symbol-support-x": "1.4.2" + } + }, + "hawk": { + "version": "6.0.2", + "resolved": "https://registry.npmjs.org/hawk/-/hawk-6.0.2.tgz", + "integrity": "sha512-miowhl2+U7Qle4vdLqDdPt9m09K6yZhkLDTWGoUiUzrQCn+mHHSmfJgAyGaLRZbPmTqfFFjRV1QWCW0VWUJBbQ==", + "requires": { + "boom": "4.3.1", + "cryptiles": "3.1.2", + "hoek": "4.2.1", + "sntp": "2.1.0" + } + }, + "hoek": { + "version": "4.2.1", + "resolved": "https://registry.npmjs.org/hoek/-/hoek-4.2.1.tgz", + "integrity": "sha512-QLg82fGkfnJ/4iy1xZ81/9SIJiq1NGFUMGs6ParyjBZr6jW2Ufj/snDqTHixNlHdPNwN2RLVD0Pi3igeK9+JfA==" + }, + "http-signature": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/http-signature/-/http-signature-1.2.0.tgz", + "integrity": "sha1-muzZJRFHcvPZW2WmCruPfBj7rOE=", + "requires": { + "assert-plus": "1.0.0", + "jsprim": "1.4.1", + "sshpk": "1.14.1" + } + }, + "is-object": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/is-object/-/is-object-1.0.1.tgz", + "integrity": "sha1-iVJojF7C/9awPsyF52ngKQMINHA=" + }, + "is-plain-obj": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/is-plain-obj/-/is-plain-obj-1.1.0.tgz", + "integrity": "sha1-caUMhCnfync8kqOQpKA7OfzVHT4=" + }, + "is-retry-allowed": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/is-retry-allowed/-/is-retry-allowed-1.1.0.tgz", + "integrity": "sha1-EaBgVotnM5REAz0BJaYaINVk+zQ=" + }, + "is-stream": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/is-stream/-/is-stream-1.1.0.tgz", + "integrity": "sha1-EtSj3U5o4Lec6428hBc66A2RykQ=" + }, + "is-typedarray": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/is-typedarray/-/is-typedarray-1.0.0.tgz", + "integrity": "sha1-5HnICFjfDBsR3dppQPlgEfzaSpo=" + }, + "isstream": { + "version": "0.1.2", + "resolved": "https://registry.npmjs.org/isstream/-/isstream-0.1.2.tgz", + "integrity": "sha1-R+Y/evVa+m+S4VAOaQ64uFKcCZo=" + }, + "isurl": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/isurl/-/isurl-1.0.0.tgz", + "integrity": "sha512-1P/yWsxPlDtn7QeRD+ULKQPaIaN6yF368GZ2vDfv0AL0NwpStafjWCDDdn0k8wgFMWpVAqG7oJhxHnlud42i9w==", + "requires": { + "has-to-string-tag-x": "1.4.1", + "is-object": "1.0.1" + } + }, + "jsbn": { + "version": "0.1.1", + "resolved": "https://registry.npmjs.org/jsbn/-/jsbn-0.1.1.tgz", + "integrity": "sha1-peZUwuWi3rXyAdls77yoDA7y9RM=", + "optional": true + }, + "json-schema": { + "version": "0.2.3", + "resolved": "https://registry.npmjs.org/json-schema/-/json-schema-0.2.3.tgz", + "integrity": "sha1-tIDIkuWaLwWVTOcnvT8qTogvnhM=" + }, + "json-schema-traverse": { + "version": "0.3.1", + "resolved": "https://registry.npmjs.org/json-schema-traverse/-/json-schema-traverse-0.3.1.tgz", + "integrity": "sha1-NJptRMU6Ud6JtAgFxdXlm0F9M0A=" + }, + "json-stringify-safe": { + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/json-stringify-safe/-/json-stringify-safe-5.0.1.tgz", + "integrity": "sha1-Epai1Y/UXxmg9s4B1lcB4sc1tus=" + }, + "jsprim": { + "version": "1.4.1", + "resolved": "https://registry.npmjs.org/jsprim/-/jsprim-1.4.1.tgz", + "integrity": "sha1-MT5mvB5cwG5Di8G3SZwuXFastqI=", + "requires": { + "assert-plus": "1.0.0", + "extsprintf": "1.3.0", + "json-schema": "0.2.3", + "verror": "1.10.0" + } + }, + "kraken-api": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/kraken-api/-/kraken-api-1.0.0.tgz", + "integrity": "sha512-JAfLh9Laks+2KZTM/WW+bpy+iZfImUok0aeLBOb0ehwTEGvcBWWAXlmkthhJXfUTSoOIHuoqqToC94+iBeBBAg==", + "requires": { + "got": "7.1.0", + "qs": "6.5.2" + } + }, + "lodash": { + "version": "4.17.10", + "resolved": "https://registry.npmjs.org/lodash/-/lodash-4.17.10.tgz", + "integrity": "sha512-UejweD1pDoXu+AD825lWwp4ZGtSwgnpZxb3JDViD7StjQz+Nb/6l093lx4OQ0foGWNRoc19mWy7BzL+UAK2iVg==" + }, + "lodash.throttle": { + "version": "4.1.1", + "resolved": "https://registry.npmjs.org/lodash.throttle/-/lodash.throttle-4.1.1.tgz", + "integrity": "sha1-wj6RtxAkKscMN/HhzaknTMOb8vQ=" + }, + "lowercase-keys": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/lowercase-keys/-/lowercase-keys-1.0.1.tgz", + "integrity": "sha512-G2Lj61tXDnVFFOi8VZds+SoQjtQC3dgokKdDG2mTm1tx4m50NUHBOZSBwQQHyy0V12A0JTG4icfZQH+xPyh8VA==" + }, + "mime": { + "version": "1.2.11", + "resolved": "https://registry.npmjs.org/mime/-/mime-1.2.11.tgz", + "integrity": "sha1-WCA+7Ybjpe8XrtK32evUfwpg3RA=" + }, + "mime-db": { + "version": "1.33.0", + "resolved": "https://registry.npmjs.org/mime-db/-/mime-db-1.33.0.tgz", + "integrity": "sha512-BHJ/EKruNIqJf/QahvxwQZXKygOQ256myeN/Ew+THcAa5q+PjyTTMMeNQC4DZw5AwfvelsUrA6B67NKMqXDbzQ==" + }, + "mime-types": { + "version": "2.1.18", + "resolved": "https://registry.npmjs.org/mime-types/-/mime-types-2.1.18.tgz", + "integrity": "sha512-lc/aahn+t4/SWV/qcmumYjymLsWfN3ELhpmVuUFjgsORruuZPVSwAQryq+HHGvO/SI2KVX26bx+En+zhM8g8hQ==", + "requires": { + "mime-db": "1.33.0" + } + }, + "mimic-response": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/mimic-response/-/mimic-response-1.0.0.tgz", + "integrity": "sha1-3z02Uqc/3ta5sLJBRub9BSNTRY4=" + }, + "moment": { + "version": "2.22.1", + "resolved": "https://registry.npmjs.org/moment/-/moment-2.22.1.tgz", + "integrity": "sha512-shJkRTSebXvsVqk56I+lkb2latjBs8I+pc2TzWc545y2iFnSjm7Wg0QMh+ZWcdSLQyGEau5jI8ocnmkyTgr9YQ==" + }, + "ms": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz", + "integrity": "sha1-VgiurfwAvmwpAd9fmGF4jeDVl8g=" + }, + "nonce": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/nonce/-/nonce-1.0.4.tgz", + "integrity": "sha1-7nMCrejBvvR28wG4yR9cxRpIdhI=" + }, + "oauth-sign": { + "version": "0.8.2", + "resolved": "https://registry.npmjs.org/oauth-sign/-/oauth-sign-0.8.2.tgz", + "integrity": "sha1-Rqarfwrq2N6unsBWV4C31O/rnUM=" + }, + "p-cancelable": { + "version": "0.3.0", + "resolved": "https://registry.npmjs.org/p-cancelable/-/p-cancelable-0.3.0.tgz", + "integrity": "sha512-RVbZPLso8+jFeq1MfNvgXtCRED2raz/dKpacfTNxsx6pLEpEomM7gah6VeHSYV3+vo0OAi4MkArtQcWWXuQoyw==" + }, + "p-finally": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/p-finally/-/p-finally-1.0.0.tgz", + "integrity": "sha1-P7z7FbiZpEEjs0ttzBi3JDNqLK4=" + }, + "p-timeout": { + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/p-timeout/-/p-timeout-1.2.1.tgz", + "integrity": "sha1-XrOzU7f86Z8QGhA4iAuwVOu+o4Y=", + "requires": { + "p-finally": "1.0.0" + } + }, + "performance-now": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/performance-now/-/performance-now-2.1.0.tgz", + "integrity": "sha1-Ywn04OX6kT7BxpMHrjZLSzd8nns=" + }, + "poloniex.js": { + "version": "git://github.com/askmike/poloniex.js.git#69f5e254353e66d135070844fc3328efcbe3641c", + "requires": { + "nonce": "1.0.4", + "request": "2.33.0" + }, + "dependencies": { + "asn1": { + "version": "0.1.11", + "resolved": "https://registry.npmjs.org/asn1/-/asn1-0.1.11.tgz", + "integrity": "sha1-VZvhg3bQik7E2+gId9J4GGObLfc=", + "optional": true + }, + "assert-plus": { + "version": "0.1.5", + "resolved": "https://registry.npmjs.org/assert-plus/-/assert-plus-0.1.5.tgz", + "integrity": "sha1-7nQAlBMALYTOxyGcasgRgS5yMWA=", + "optional": true + }, + "async": { + "version": "0.9.2", + "resolved": "https://registry.npmjs.org/async/-/async-0.9.2.tgz", + "integrity": "sha1-rqdNXmHB+JlhO/ZL2mbUx48v0X0=", + "optional": true + }, + "aws-sign2": { + "version": "0.5.0", + "resolved": "https://registry.npmjs.org/aws-sign2/-/aws-sign2-0.5.0.tgz", + "integrity": "sha1-xXED96F/wDfwLXwuZLYC6iI/fWM=", + "optional": true + }, + "boom": { + "version": "0.4.2", + "resolved": "https://registry.npmjs.org/boom/-/boom-0.4.2.tgz", + "integrity": "sha1-emNune1O/O+xnO9JR6PGffrukRs=", + "requires": { + "hoek": "0.9.1" + } + }, + "combined-stream": { + "version": "0.0.7", + "resolved": "https://registry.npmjs.org/combined-stream/-/combined-stream-0.0.7.tgz", + "integrity": "sha1-ATfmV7qlp1QcV6w3rF/AfXO03B8=", + "optional": true, + "requires": { + "delayed-stream": "0.0.5" + } + }, + "cryptiles": { + "version": "0.2.2", + "resolved": "https://registry.npmjs.org/cryptiles/-/cryptiles-0.2.2.tgz", + "integrity": "sha1-7ZH/HxetE9N0gohZT4pIoNJvMlw=", + "optional": true, + "requires": { + "boom": "0.4.2" + } + }, + "delayed-stream": { + "version": "0.0.5", + "resolved": "https://registry.npmjs.org/delayed-stream/-/delayed-stream-0.0.5.tgz", + "integrity": "sha1-1LH0OpPoKW3+AmlPRoC8N6MTxz8=", + "optional": true + }, + "forever-agent": { + "version": "0.5.2", + "resolved": "https://registry.npmjs.org/forever-agent/-/forever-agent-0.5.2.tgz", + "integrity": "sha1-bQ4JxJIflKJ/Y9O0nF/v8epMUTA=" + }, + "form-data": { + "version": "0.1.4", + "resolved": "https://registry.npmjs.org/form-data/-/form-data-0.1.4.tgz", + "integrity": "sha1-kavXiKupcCsaq/qLwBAxoqyeOxI=", + "optional": true, + "requires": { + "async": "0.9.2", + "combined-stream": "0.0.7", + "mime": "1.2.11" + } + }, + "hawk": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/hawk/-/hawk-1.0.0.tgz", + "integrity": "sha1-uQuxaYByhUEdp//LjdJZhQLTtS0=", + "optional": true, + "requires": { + "boom": "0.4.2", + "cryptiles": "0.2.2", + "hoek": "0.9.1", + "sntp": "0.2.4" + } + }, + "hoek": { + "version": "0.9.1", + "resolved": "https://registry.npmjs.org/hoek/-/hoek-0.9.1.tgz", + "integrity": "sha1-PTIkYrrfB3Fup+uFuviAec3c5QU=" + }, + "http-signature": { + "version": "0.10.1", + "resolved": "https://registry.npmjs.org/http-signature/-/http-signature-0.10.1.tgz", + "integrity": "sha1-T72sEyVZqoMjEh5UB3nAoBKyfmY=", + "optional": true, + "requires": { + "asn1": "0.1.11", + "assert-plus": "0.1.5", + "ctype": "0.5.3" + } + }, + "node-uuid": { + "version": "1.4.8", + "resolved": "https://registry.npmjs.org/node-uuid/-/node-uuid-1.4.8.tgz", + "integrity": "sha1-sEDrCSOWivq/jTL7HxfxFn/auQc=" + }, + "oauth-sign": { + "version": "0.3.0", + "resolved": "https://registry.npmjs.org/oauth-sign/-/oauth-sign-0.3.0.tgz", + "integrity": "sha1-y1QPk7srIqfVlBaRoojWDo6pOG4=", + "optional": true + }, + "qs": { + "version": "0.6.6", + "resolved": "https://registry.npmjs.org/qs/-/qs-0.6.6.tgz", + "integrity": "sha1-bgFQmP9RlouKPIGQAdXyyJvEsQc=" + }, + "request": { + "version": "2.33.0", + "resolved": "https://registry.npmjs.org/request/-/request-2.33.0.tgz", + "integrity": "sha1-UWeHgTFyYHDsYzdS6iMKI3ncZf8=", + "requires": { + "aws-sign2": "0.5.0", + "forever-agent": "0.5.2", + "form-data": "0.1.4", + "hawk": "1.0.0", + "http-signature": "0.10.1", + "json-stringify-safe": "5.0.1", + "mime": "1.2.11", + "node-uuid": "1.4.8", + "oauth-sign": "0.3.0", + "qs": "0.6.6", + "tough-cookie": "2.3.4", + "tunnel-agent": "0.3.0" + } + }, + "sntp": { + "version": "0.2.4", + "resolved": "https://registry.npmjs.org/sntp/-/sntp-0.2.4.tgz", + "integrity": "sha1-+4hfGLDzqtGJ+CSGJTa87ux1CQA=", + "optional": true, + "requires": { + "hoek": "0.9.1" + } + }, + "tunnel-agent": { + "version": "0.3.0", + "resolved": "https://registry.npmjs.org/tunnel-agent/-/tunnel-agent-0.3.0.tgz", + "integrity": "sha1-rWgbaPUyGtKCfEz7G31d8s/pQu4=", + "optional": true + } + } + }, + "prepend-http": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/prepend-http/-/prepend-http-1.0.4.tgz", + "integrity": "sha1-1PRWKwzjaW5BrFLQ4ALlemNdxtw=" + }, + "printj": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/printj/-/printj-1.1.2.tgz", + "integrity": "sha512-zA2SmoLaxZyArQTOPj5LXecR+RagfPSU5Kw1qP+jkWeNlrq+eJZyY2oS68SU1Z/7/myXM4lo9716laOFAVStCQ==" + }, + "punycode": { + "version": "1.4.1", + "resolved": "https://registry.npmjs.org/punycode/-/punycode-1.4.1.tgz", + "integrity": "sha1-wNWmOycYgArY4esPpSachN1BhF4=" + }, + "qs": { + "version": "6.5.2", + "resolved": "https://registry.npmjs.org/qs/-/qs-6.5.2.tgz", + "integrity": "sha512-N5ZAX4/LxJmF+7wN74pUD6qAh9/wnvdQcjq9TZjevvXzSUo7bfmw91saqMjzGS2xq91/odN2dW/WOl7qQHNDGA==" + }, + "regenerator-runtime": { + "version": "0.11.1", + "resolved": "https://registry.npmjs.org/regenerator-runtime/-/regenerator-runtime-0.11.1.tgz", + "integrity": "sha512-MguG95oij0fC3QV3URf4V2SDYGJhJnJGqvIIgdECeODCT98wSWDAJ94SSuVpYQUoTcGUIL6L4yNB7j1DFFHSBg==" + }, + "request": { + "version": "2.86.0", + "resolved": "https://registry.npmjs.org/request/-/request-2.86.0.tgz", + "integrity": "sha512-BQZih67o9r+Ys94tcIW4S7Uu8pthjrQVxhsZ/weOwHbDfACxvIyvnAbzFQxjy1jMtvFSzv5zf4my6cZsJBbVzw==", + "requires": { + "aws-sign2": "0.7.0", + "aws4": "1.7.0", + "caseless": "0.12.0", + "combined-stream": "1.0.6", + "extend": "3.0.1", + "forever-agent": "0.6.1", + "form-data": "2.3.2", + "har-validator": "5.0.3", + "hawk": "6.0.2", + "http-signature": "1.2.0", + "is-typedarray": "1.0.0", + "isstream": "0.1.2", + "json-stringify-safe": "5.0.1", + "mime-types": "2.1.18", + "oauth-sign": "0.8.2", + "performance-now": "2.1.0", + "qs": "6.5.2", + "safe-buffer": "5.1.2", + "tough-cookie": "2.3.4", + "tunnel-agent": "0.6.0", + "uuid": "3.2.1" + } + }, + "request-promise": { + "version": "4.2.2", + "resolved": "https://registry.npmjs.org/request-promise/-/request-promise-4.2.2.tgz", + "integrity": "sha1-0epG1lSm7k+O5qT+oQGMIpEZBLQ=", + "requires": { + "bluebird": "3.5.1", + "request-promise-core": "1.1.1", + "stealthy-require": "1.1.1", + "tough-cookie": "2.3.4" + }, + "dependencies": { + "request-promise-core": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/request-promise-core/-/request-promise-core-1.1.1.tgz", + "integrity": "sha1-Pu4AssWqgyOc+wTFcA2jb4HNCLY=", + "requires": { + "lodash": "4.17.10" + } + } + } + }, + "retry": { + "version": "0.12.0", + "resolved": "https://registry.npmjs.org/retry/-/retry-0.12.0.tgz", + "integrity": "sha1-G0KmJmoh8HQh0bC1S33BZ7AcATs=" + }, + "safe-buffer": { + "version": "5.1.2", + "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.1.2.tgz", + "integrity": "sha512-Gd2UZBJDkXlY7GbJxfsE8/nvKkUEU1G38c1siN6QP6a9PT9MmHB8GnpscSmMJSoF8LOIrt8ud/wPtojys4G6+g==" + }, + "sntp": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/sntp/-/sntp-2.1.0.tgz", + "integrity": "sha512-FL1b58BDrqS3A11lJ0zEdnJ3UOKqVxawAkF3k7F0CVN7VQ34aZrV+G8BZ1WC9ZL7NyrwsW0oviwsWDgRuVYtJg==", + "requires": { + "hoek": "4.2.1" + } + }, + "sshpk": { + "version": "1.14.1", + "resolved": "https://registry.npmjs.org/sshpk/-/sshpk-1.14.1.tgz", + "integrity": "sha1-Ew9Zde3a2WPx1W+SuaxsUfqfg+s=", + "requires": { + "asn1": "0.2.3", + "assert-plus": "1.0.0", + "bcrypt-pbkdf": "1.0.1", + "dashdash": "1.14.1", + "ecc-jsbn": "0.1.1", + "getpass": "0.1.7", + "jsbn": "0.1.1", + "tweetnacl": "0.14.5" + } + }, + "stealthy-require": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/stealthy-require/-/stealthy-require-1.1.1.tgz", + "integrity": "sha1-NbCYdbT/SfJqd35QmzCQoyJr8ks=" + }, + "timed-out": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/timed-out/-/timed-out-4.0.1.tgz", + "integrity": "sha1-8y6srFoXW+ol1/q1Zas+2HQe9W8=" + }, + "tough-cookie": { + "version": "2.3.4", + "resolved": "https://registry.npmjs.org/tough-cookie/-/tough-cookie-2.3.4.tgz", + "integrity": "sha512-TZ6TTfI5NtZnuyy/Kecv+CnoROnyXn2DN97LontgQpCwsX2XyLYCC0ENhYkehSOwAp8rTQKc/NUIF7BkQ5rKLA==", + "requires": { + "punycode": "1.4.1" + } + }, + "tunnel-agent": { + "version": "0.6.0", + "resolved": "https://registry.npmjs.org/tunnel-agent/-/tunnel-agent-0.6.0.tgz", + "integrity": "sha1-J6XeoGs2sEoKmWZ3SykIaPD8QP0=", + "requires": { + "safe-buffer": "5.1.2" + } + }, + "tweetnacl": { + "version": "0.14.5", + "resolved": "https://registry.npmjs.org/tweetnacl/-/tweetnacl-0.14.5.tgz", + "integrity": "sha1-WuaBd/GS1EViadEIr6k/+HQ/T2Q=", + "optional": true + }, + "ultron": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/ultron/-/ultron-1.1.1.tgz", + "integrity": "sha512-UIEXBNeYmKptWH6z8ZnqTeS8fV74zG0/eRU9VGkpzz+LIJNs8W/zM/L+7ctCkRrgbNnnR0xxw4bKOr0cW0N0Og==" + }, + "underscore": { + "version": "1.9.0", + "resolved": "https://registry.npmjs.org/underscore/-/underscore-1.9.0.tgz", + "integrity": "sha512-4IV1DSSxC1QK48j9ONFK1MoIAKKkbE8i7u55w2R6IqBqbT7A/iG7aZBCR2Bi8piF0Uz+i/MG1aeqLwl/5vqF+A==" + }, + "url-parse-lax": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/url-parse-lax/-/url-parse-lax-1.0.0.tgz", + "integrity": "sha1-evjzA2Rem9eaJy56FKxovAYJ2nM=", + "requires": { + "prepend-http": "1.0.4" + } + }, + "url-to-options": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/url-to-options/-/url-to-options-1.0.1.tgz", + "integrity": "sha1-FQWgOiiaSMvXpDTvuu7FBV9WM6k=" + }, + "uuid": { + "version": "3.2.1", + "resolved": "https://registry.npmjs.org/uuid/-/uuid-3.2.1.tgz", + "integrity": "sha512-jZnMwlb9Iku/O3smGWvZhauCf6cvvpKi4BKRiliS3cxnI+Gz9j5MEpTz2UFuXiKPJocb7gnsLHwiS05ige5BEA==" + }, + "verror": { + "version": "1.10.0", + "resolved": "https://registry.npmjs.org/verror/-/verror-1.10.0.tgz", + "integrity": "sha1-OhBcoXBTr1XW4nDB+CiGguGNpAA=", + "requires": { + "assert-plus": "1.0.0", + "core-util-is": "1.0.2", + "extsprintf": "1.3.0" + } + }, + "ws": { + "version": "3.3.3", + "resolved": "https://registry.npmjs.org/ws/-/ws-3.3.3.tgz", + "integrity": "sha512-nnWLa/NwZSt4KQJu51MYlCcSQ5g7INpOrOMt4XV8j4dqTXdmlUmSHQ8/oLC069ckre0fRsgfvsKwbTdtKLCDkA==", + "requires": { + "async-limiter": "1.0.0", + "safe-buffer": "5.1.2", + "ultron": "1.1.1" + } + } + } +} diff --git a/exchange/package.json b/exchange/package.json new file mode 100644 index 000000000..945f7da58 --- /dev/null +++ b/exchange/package.json @@ -0,0 +1,36 @@ +{ + "name": "gekko-broker", + "version": "0.6.0", + "description": "Gekko's order execution library for bitcoin & crypto exchanges", + "main": "gekkoBroker.js", + "scripts": { + "test": "echo \"Error: no test specified\" && exit 1" + }, + "repository": { + "type": "git", + "url": "github.com/askmike/gekko" + }, + "keywords": [ + "crypto", + "bitcoin", + "exchange", + "execution", + "trade" + ], + "author": "Mike van Rossum ", + "license": "MIT", + "dependencies": { + "async": "^2.6.0", + "binance": "^1.3.3", + "bitfinex-api-node": "^2.0.0-beta", + "bluebird": "^3.5.1", + "coinfalcon": "^1.0.3", + "gdax": "^0.7.0", + "kraken-api": "^1.0.0", + "lodash": "^4.17.5", + "moment": "^2.22.1", + "poloniex.js": "git://github.com/askmike/poloniex.js.git#69f5e254353e66d135070844fc3328efcbe3641c", + "request-promise": "^4.2.2", + "retry": "^0.12.0" + } +} diff --git a/exchange/portfolioManager.js b/exchange/portfolioManager.js new file mode 100644 index 000000000..c9b00d0bc --- /dev/null +++ b/exchange/portfolioManager.js @@ -0,0 +1,87 @@ +/* + The Portfolio class holds data about the portfolio +*/ + +const _ = require('lodash'); +const async = require('async'); +const errors = require('./exchangeErrors'); +// const EventEmitter = require('events'); + +class Portfolio { + constructor(config, api) { + _.bindAll(this); + this.config = config; + this.api = api; + this.balances = {}; + this.fee = null; + } + + getBalance(fund) { + return this.getFund(fund).amount; + } + + // return the [fund] based on the data we have in memory + getFund(fund) { + return _.find(this.balances, function(f) { return f.name === fund}); + } + + // convert into the portfolio expected by the performanceAnalyzer + convertBalances(asset,currency) { // rename? + var asset = _.find(this.balances, a => a.name === this.config.asset).amount; + var currency = _.find(this.balances, a => a.name === this.config.currency).amount; + + return { + currency, + asset, + balance: currency + (asset * this.ticker.bid) + } + } + + setBalances(callback) { + let set = (err, fullPortfolio) => { + if(err) { + console.log(err); + throw new errors.ExchangeError(err); + } + + // only include the currency/asset of this market + const balances = [ this.config.currency, this.config.asset ] + .map(name => { + let item = _.find(fullPortfolio, {name}); + + if(!item) { + // assume we have 0 + item = { name, amount: 0 }; + } + + return item; + }); + + this.balances = balances; + + if(_.isFunction(callback)) + callback(); + } + + this.api.getPortfolio(set); + } + + setFee(callback) { + this.api.getFee((err, fee) => { + if(err) + throw new errors.ExchangeError(err); + + this.fee = fee; + + if(_.isFunction(callback)) + callback(); + }); + } + + setTicker(ticker) { + this.ticker = ticker; + } + +} + +module.exports = Portfolio \ No newline at end of file diff --git a/util/genMarketFiles/update-binance.js b/exchange/util/genMarketFiles/update-binance.js similarity index 84% rename from util/genMarketFiles/update-binance.js rename to exchange/util/genMarketFiles/update-binance.js index 64ebf31f5..f0acd6a01 100644 --- a/util/genMarketFiles/update-binance.js +++ b/exchange/util/genMarketFiles/update-binance.js @@ -3,6 +3,7 @@ const fs = require('fs'); const request = require('request-promise'); const Promise = require('bluebird'); + let getOrderMinSize = currency => { if (currency === 'BTC') return 0.001; else if (currency === 'ETH') return 0.01; @@ -25,8 +26,8 @@ request(options) throw new Error('Unable to fetch product list, response was empty'); } - let assets = _.unique(_.map(body.data, market => market.baseAsset)); - let currencies = _.unique(_.map(body.data, market => market.quoteAsset)); + let assets = _.uniqBy(_.map(body.data, market => market.baseAsset)); + let currencies = _.uniqBy(_.map(body.data, market => market.quoteAsset)); let pairs = _.map(body.data, market => { return { pair: [market.quoteAsset, market.baseAsset], @@ -41,7 +42,7 @@ request(options) return { assets: assets, currencies: currencies, markets: pairs }; }) .then(markets => { - fs.writeFileSync('../../exchanges/binance-markets.json', JSON.stringify(markets, null, 2)); + fs.writeFileSync('../../wrappers/binance-markets.json', JSON.stringify(markets, null, 2)); console.log(`Done writing Binance market data`); }) .catch(err => { diff --git a/util/genMarketFiles/update-bitfinex.js b/exchange/util/genMarketFiles/update-bitfinex.js similarity index 100% rename from util/genMarketFiles/update-bitfinex.js rename to exchange/util/genMarketFiles/update-bitfinex.js diff --git a/util/genMarketFiles/update-coinfalcon.js b/exchange/util/genMarketFiles/update-coinfalcon.js similarity index 100% rename from util/genMarketFiles/update-coinfalcon.js rename to exchange/util/genMarketFiles/update-coinfalcon.js diff --git a/util/genMarketFiles/update-kraken.js b/exchange/util/genMarketFiles/update-kraken.js similarity index 90% rename from util/genMarketFiles/update-kraken.js rename to exchange/util/genMarketFiles/update-kraken.js index 8a34ce34a..7e05c9ebf 100644 --- a/util/genMarketFiles/update-kraken.js +++ b/exchange/util/genMarketFiles/update-kraken.js @@ -12,7 +12,7 @@ let getMinTradeSize = asset => { case 'XREP': minTradeSize = '0.3' break; - case 'XBT': + case 'XXBT': minTradeSize = '0.002' break; case 'BCH': @@ -103,11 +103,11 @@ let assetPairsPromise = request({ Promise.all([assetPromise, assetPairsPromise]) .then(results => { - let assets = _.unique(_.map(results[1], market => { + let assets = _.uniq(_.map(results[1], market => { return results[0][market.base].altname; })); - let currencies = _.unique(_.map(results[1], market => { + let currencies = _.uniq(_.map(results[1], market => { return results[0][market.quote].altname; })); @@ -124,14 +124,15 @@ Promise.all([assetPromise, assetPairsPromise]) amount: getMinTradeSize(market.base), unit: 'asset', }, - precision: market.pair_decimals + pricePrecision: market.pair_decimals, + amountPrecision: market.lot_decimals }; }); return { assets: assets, currencies: currencies, markets: markets }; }) .then(markets => { - fs.writeFileSync('../../exchanges/kraken-markets.json', JSON.stringify(markets, null, 2)); + fs.writeFileSync('../../wrappers/kraken-markets.json', JSON.stringify(markets, null, 2)); console.log(`Done writing Kraken market data`); }) .catch(err => { diff --git a/exchanges/DEBUG_exchange-simulator.js b/exchange/wrappers/DEBUG_exchange-simulator.js similarity index 97% rename from exchanges/DEBUG_exchange-simulator.js rename to exchange/wrappers/DEBUG_exchange-simulator.js index 2a6f05606..5df3e78ee 100644 --- a/exchanges/DEBUG_exchange-simulator.js +++ b/exchange/wrappers/DEBUG_exchange-simulator.js @@ -2,7 +2,6 @@ const _ = require('lodash'); const moment = require('moment'); -const log = require('../core/log'); const TREND_DURATION = 1000; diff --git a/exchanges/binance-markets.json b/exchange/wrappers/binance-markets.json similarity index 100% rename from exchanges/binance-markets.json rename to exchange/wrappers/binance-markets.json diff --git a/exchanges/binance.js b/exchange/wrappers/binance.js similarity index 53% rename from exchanges/binance.js rename to exchange/wrappers/binance.js index e9055f58c..f381cd9c9 100644 --- a/exchanges/binance.js +++ b/exchange/wrappers/binance.js @@ -1,10 +1,9 @@ const moment = require('moment'); const _ = require('lodash'); -const util = require('../core/util'); -const Errors = require('../core/error'); -const log = require('../core/log'); +const Errors = require('../exchangeErrors'); const marketData = require('./binance-markets.json'); +const retry = require('../exchangeUtils').retry; const Binance = require('binance'); @@ -49,17 +48,15 @@ var retryForever = { maxTimeout: 30 * 1000 }; -var recoverableErrors = new RegExp(/(SOCKETTIMEDOUT|TIMEDOUT|CONNRESET|CONNREFUSED|NOTFOUND|Error -1021|Response code 429|Response code 5)/); +var recoverableErrors = new RegExp(/(SOCKETTIMEDOUT|TIMEDOUT|CONNRESET|CONNREFUSED|NOTFOUND|Error -1021|Response code 429|Response code 5|ETIMEDOUT)/); Trader.prototype.processError = function(funcName, error) { if (!error) return undefined; if (!error.message || !error.message.match(recoverableErrors)) { - log.error(`[binance.js] (${funcName}) returned an irrecoverable error: ${error}`); return new Errors.AbortError('[binance.js] ' + error.message || error); } - log.debug(`[binance.js] (${funcName}) returned an error, retrying: ${error}`); return new Errors.RetryError('[binance.js] ' + error.message || error); }; @@ -74,7 +71,7 @@ Trader.prototype.handleResponse = function(funcName, callback) { }; Trader.prototype.getTrades = function(since, callback, descending) { - var processResults = function(err, data) { + const processResults = (err, data) => { if (err) return callback(err); var parsedTrades = []; @@ -109,40 +106,29 @@ Trader.prototype.getTrades = function(since, callback, descending) { reqData.endTime = endTs > nowTs ? nowTs : endTs; } - let handler = (cb) => this.binance.aggTrades(reqData, this.handleResponse('getTrades', cb)); - util.retryCustom(retryForever, _.bind(handler, this), _.bind(processResults, this)); + const fetch = cb => this.binance.aggTrades(reqData, this.handleResponse('getTrades', cb)); + retry(retryForever, fetch, processResults); }; Trader.prototype.getPortfolio = function(callback) { - var setBalance = function(err, data) { - log.debug(`[binance.js] entering "setBalance" callback after api call, err: ${err} data: ${JSON.stringify(data)}`) + const setBalance = (err, data) => { if (err) return callback(err); - var findAsset = function(item) { - return item.asset === this.asset; - } - var assetAmount = parseFloat(_.find(data.balances, _.bind(findAsset, this)).free); + const findAsset = item => item.asset === this.asset; + const assetAmount = parseFloat(_.find(data.balances, findAsset).free); - var findCurrency = function(item) { - return item.asset === this.currency; - } - var currencyAmount = parseFloat(_.find(data.balances, _.bind(findCurrency, this)).free); + const findCurrency = item => item.asset === this.currency; + const currencyAmount = parseFloat(_.find(data.balances, findCurrency).free); if (!_.isNumber(assetAmount) || _.isNaN(assetAmount)) { - log.error( - `Binance did not return portfolio for ${this.asset}, assuming 0.` - ); assetAmount = 0; } if (!_.isNumber(currencyAmount) || _.isNaN(currencyAmount)) { - log.error( - `Binance did not return portfolio for ${this.currency}, assuming 0.` - ); currencyAmount = 0; } - var portfolio = [ + const portfolio = [ { name: this.asset, amount: assetAmount }, { name: this.currency, amount: currencyAmount }, ]; @@ -150,25 +136,25 @@ Trader.prototype.getPortfolio = function(callback) { return callback(undefined, portfolio); }; - let handler = (cb) => this.binance.account({}, this.handleResponse('getPortfolio', cb)); - util.retryCustom(retryForever, _.bind(handler, this), _.bind(setBalance, this)); + const fetch = cb => this.binance.account({}, this.handleResponse('getPortfolio', cb)); + retry(retryForever, fetch, setBalance); }; // This uses the base maker fee (0.1%), and does not account for BNB discounts Trader.prototype.getFee = function(callback) { - var makerFee = 0.1; + const makerFee = 0.1; callback(undefined, makerFee / 100); }; Trader.prototype.getTicker = function(callback) { - var setTicker = function(err, data) { - log.debug(`[binance.js] entering "getTicker" callback after api call, err: ${err} data: ${(data || []).length} symbols`); - if (err) return callback(err); + const setTicker = (err, data) => { + if (err) + return callback(err); - var findSymbol = function(ticker) { - return ticker.symbol === this.pair; - } - var result = _.find(data, _.bind(findSymbol, this)); + var result = _.find(data, ticker => ticker.symbol === this.pair); + + if(!result) + return callback(new Error(`Market ${this.pair} not found on Binance`)); var ticker = { ask: parseFloat(result.askPrice), @@ -178,8 +164,8 @@ Trader.prototype.getTicker = function(callback) { callback(undefined, ticker); }; - let handler = (cb) => this.binance._makeRequest({}, this.handleResponse('getTicker', cb), 'api/v1/ticker/allBookTickers'); - util.retryCustom(retryForever, _.bind(handler, this), _.bind(setTicker, this)); + const handler = cb => this.binance._makeRequest({}, this.handleResponse('getTicker', cb), 'api/v1/ticker/allBookTickers'); + retry(retryForever, handler, setTicker); }; // Effectively counts the number of decimal places, so 0.001 or 0.234 results in 3 @@ -190,7 +176,7 @@ Trader.prototype.getPrecision = function(tickSize) { return p; }; -Trader.prototype.roundAmount = function(amount, tickSize) { +Trader.prototype.round = function(amount, tickSize) { var precision = 100000000; var t = this.getPrecision(tickSize); @@ -203,70 +189,120 @@ Trader.prototype.roundAmount = function(amount, tickSize) { return amount; }; -Trader.prototype.getLotSize = function(tradeType, amount, price, callback) { - amount = this.roundAmount(amount, this.market.minimalOrder.amount); - if (amount < this.market.minimalOrder.amount) - return callback(undefined, { amount: 0, price: 0 }); +Trader.prototype.roundAmount = function(amount) { + return this.round(amount, this.market.minimalOrder.amount); +} - price = this.roundAmount(price, this.market.minimalOrder.price) - if (price < this.market.minimalOrder.price) - return callback(undefined, { amount: 0, price: 0 }); +Trader.prototype.roundPrice = function(price) { + return this.round(price, this.market.minimalOrder.price); +} - if (amount * price < this.market.minimalOrder.order) - return callback(undefined, { amount: 0, price: 0}); +Trader.prototype.isValidPrice = function(price) { + return price >= this.market.minimalOrder.price; +} - callback(undefined, { amount: amount, price: price }); +Trader.prototype.isValidLot = function(price, amount) { + return amount * price >= this.market.minimalOrder.order; } -Trader.prototype.addOrder = function(tradeType, amount, price, callback) { - log.debug(`[binance.js] (addOrder) ${tradeType.toUpperCase()} ${amount} ${this.asset} @${price} ${this.currency}`); +Trader.prototype.outbidPrice = function(price, isUp) { + let newPrice; + + if(isUp) { + newPrice = price + this.market.minimalOrder.price; + } else { + newPrice = price - this.market.minimalOrder.price; + } - var setOrder = function(err, data) { - log.debug(`[binance.js] entering "setOrder" callback after api call, err: ${err} data: ${JSON.stringify(data)}`); + return this.roundPrice(newPrice); +} + +Trader.prototype.addOrder = function(tradeType, amount, price, callback) { + const setOrder = (err, data) => { if (err) return callback(err); - var txid = data.orderId; - log.debug(`[binance.js] added order with txid: ${txid}`); + const txid = data.orderId; callback(undefined, txid); }; - let reqData = { + const reqData = { symbol: this.pair, side: tradeType.toUpperCase(), type: 'LIMIT', - timeInForce: 'GTC', // Good to cancel (I think, not really covered in docs, but is default) + timeInForce: 'GTC', quantity: amount, price: price, timestamp: new Date().getTime() }; - let handler = (cb) => this.binance.newOrder(reqData, this.handleResponse('addOrder', cb)); - util.retryCustom(retryCritical, _.bind(handler, this), _.bind(setOrder, this)); + const handler = cb => this.binance.newOrder(reqData, this.handleResponse('addOrder', cb)); + retry(retryCritical, handler, setOrder); }; Trader.prototype.getOrder = function(order, callback) { - var get = function(err, data) { - log.debug(`[binance.js] entering "getOrder" callback after api call, err ${err} data: ${JSON.stringify(data)}`); + const get = (err, data) => { if (err) return callback(err); - var price = parseFloat(data.price); - var amount = parseFloat(data.executedQty); - - // Data.time is a 13 digit millisecon unix time stamp. - // https://momentjs.com/docs/#/parsing/unix-timestamp-milliseconds/ - var date = moment(data.time); + let price = 0; + let amount = 0; + let date = moment(0); - callback(undefined, { price, amount, date }); - }.bind(this); + const fees = {}; - let reqData = { + const trades = _.filter(data, t => { + // note: the API returns a string after creating + return t.orderId == order; + }); + + if(!trades.length) { + return callback(new Error('Trades not found')); + } + + _.each(trades, trade => { + date = moment(trade.time); + price = ((price * amount) + (+trade.price * trade.qty)) / (+trade.qty + amount); + amount += +trade.qty; + + if(fees[trade.commissionAsset]) + fees[trade.commissionAsset] += (+trade.commission); + else + fees[trade.commissionAsset] = (+trade.commission); + }); + + let feePercent; + if(_.keys(fees).length === 1) { + if(fees.BNB && this.asset !== 'BNB' && this.currency !== 'BNB') { + // we paid fees in BNB, right now that means the fee is always 5 basepoints. + // we cannot calculate since we do not have the BNB rate. + feePercent = 0.05; + } else { + if(fees[this.asset]) { + feePercent = fees[this.asset] / amount * 100; + } else if(fees.currency) { + feePercent = fees[this.currency] / price / amount * 100; + } else { + // assume base fee of 10 basepoints + feePercent = 0.1; + } + } + } else { + // we paid fees in multiple currencies? + // assume base fee of 10 basepoints + feePercent = 0.1; + } + + callback(undefined, { price, amount, date, fees, feePercent }); + } + + const reqData = { symbol: this.pair, - orderId: order, + // if this order was not part of the last 500 trades we won't find it.. + limit: 500, }; - let handler = (cb) => this.binance.queryOrder(reqData, this.handleResponse('getOrder', cb)); - util.retryCustom(retryCritical, _.bind(handler, this), _.bind(get, this)); + const handler = cb => this.binance.myTrades(reqData, this.handleResponse('getOrder', cb)); + retry(retryCritical, handler, get); }; Trader.prototype.buy = function(amount, price, callback) { @@ -278,35 +314,52 @@ Trader.prototype.sell = function(amount, price, callback) { }; Trader.prototype.checkOrder = function(order, callback) { - var check = function(err, data) { - log.debug(`[binance.js] entering "checkOrder" callback after api call, err ${err} data: ${JSON.stringify(data)}`); + + const check = (err, data) => { if (err) return callback(err); - var stillThere = data.status === 'NEW' || data.status === 'PARTIALLY_FILLED'; - var canceledManually = data.status === 'CANCELED' || data.status === 'REJECTED' || data.status === 'EXPIRED'; - callback(undefined, !stillThere && !canceledManually); + const status = data.status; + + if( + status === 'CANCELED' || + status === 'REJECTED' || + // for good measure: GB does not + // submit orders that can expire yet + status === 'EXPIRED' + ) { + return callback(undefined, { executed: false, open: false }); + } else if( + status === 'NEW' || + status === 'PARTIALLY_FILLED' + ) { + return callback(undefined, { executed: false, open: true, filledAmount: +data.executedQty }); + } else if(status === 'FILLED') { + return callback(undefined, { executed: true, open: false }) + } + + console.log('what status?', status); + throw status; }; - let reqData = { + const reqData = { symbol: this.pair, orderId: order, }; - let handler = (cb) => this.binance.queryOrder(reqData, this.handleResponse('checkOrder', cb)); - util.retryCustom(retryCritical, _.bind(handler, this), _.bind(check, this)); + const fetcher = cb => this.binance.queryOrder(reqData, this.handleResponse('checkOrder', cb)); + retry(retryCritical, fetcher, check); }; Trader.prototype.cancelOrder = function(order, callback) { // callback for cancelOrder should be true if the order was already filled, otherwise false - var cancel = function(err, data) { - log.debug(`[binance.js] entering "cancelOrder" callback after api call, err ${err} data: ${JSON.stringify(data)}`); + const cancel = (err, data) => { if (err) { if(data && data.msg === 'UNKNOWN_ORDER') { // this seems to be the response we get when an order was filled - return callback(true); // tell the thing the order was already filled + return callback(undefined, true); // tell the thing the order was already filled } return callback(err); } - callback(undefined); + callback(undefined, false); }; let reqData = { @@ -314,8 +367,8 @@ Trader.prototype.cancelOrder = function(order, callback) { orderId: order, }; - let handler = (cb) => this.binance.cancelOrder(reqData, this.handleResponse('cancelOrder', cb)); - util.retryCustom(retryForever, _.bind(handler, this), _.bind(cancel, this)); + const fetcher = cb => this.binance.cancelOrder(reqData, this.handleResponse('cancelOrder', cb)); + retry(retryForever, fetcher, cancel); }; Trader.prototype.initMarkets = function(callback) { @@ -334,6 +387,7 @@ Trader.getCapabilities = function() { providesFullHistory: true, tid: 'tid', tradable: true, + gekkoBroker: 0.6 }; }; diff --git a/exchanges/bitcoin-co-id.js b/exchange/wrappers/bitcoin-co-id.js.old similarity index 100% rename from exchanges/bitcoin-co-id.js rename to exchange/wrappers/bitcoin-co-id.js.old diff --git a/exchanges/bitfinex-markets.json b/exchange/wrappers/bitfinex-markets.json similarity index 100% rename from exchanges/bitfinex-markets.json rename to exchange/wrappers/bitfinex-markets.json diff --git a/exchange/wrappers/bitfinex.js b/exchange/wrappers/bitfinex.js new file mode 100644 index 000000000..534a15e54 --- /dev/null +++ b/exchange/wrappers/bitfinex.js @@ -0,0 +1,315 @@ + +const Bitfinex = require("bitfinex-api-node"); +const _ = require('lodash'); +const moment = require('moment'); + +const Errors = require('../exchangeErrors'); +const retry = require('../exchangeUtils').retry; + +const marketData = require('./bitfinex-markets.json'); + +var Trader = function(config) { + _.bindAll(this); + if(_.isObject(config)) { + this.key = config.key; + this.secret = config.secret; + } + this.name = 'Bitfinex'; + this.balance; + this.price; + this.asset = config.asset; + this.currency = config.currency; + this.pair = this.asset + this.currency; + this.bitfinex = new Bitfinex.RESTv1({apiKey: this.key, apiSecret: this.secret, transform: true}); + + this.interval = 2000; +} + +const includes = (str, list) => { + if(!_.isString(str)) + return false; + + return _.some(list, item => str.includes(item)); +} + +const recoverableErrors = [ + 'SOCKETTIMEDOUT', + 'ESOCKETTIMEDOUT', + 'TIMEDOUT', + 'CONNRESET', + 'CONNREFUSED', + 'NOTFOUND', + '443', + '504', + '503', + '500', + '502', + 'Empty response', + 'Nonce is too small' +]; + +Trader.prototype.handleResponse = function(funcName, callback) { + return (error, data) => { + if(!error && _.isEmpty(data)) { + error = new Error('Empty response'); + } + + if(error) { + const message = error.message; + + // in case we just cancelled our balances might not have + // settled yet, retry. + if( + funcName === 'submitOrder' && + message.includes('not enough exchange balance') + ) { + error.retry = 20; + return callback(error); + } + + // most likely problem with v1 api + if( + funcName === 'submitOrder' && + message.includes('Cannot evaluate your available balance, please try again') + ) { + error.retry = 10; + return callback(error); + } + + // in some situations bfx returns 404 on + // orders created recently + if( + funcName === 'checkOrder' && + message.includes('Not Found') + ) { + error.retry = 5; + return callback(error); + } + + if(includes(message, recoverableErrors)) { + error.notFatal = true; + return callback(error); + } + + if(includes(message, 'Too Many Requests')) { + error.notFatal = true; + error.backoffDelay = 5000; + } + } + + return callback(error, data); + } +}; + +Trader.prototype.getPortfolio = function(callback) { + const processResponse = (err, data) => { + if (err) return callback(err); + + // We are only interested in funds in the "exchange" wallet + data = data.filter(c => c.type === 'exchange'); + + const asset = _.find(data, c => c.currency.toUpperCase() === this.asset); + const currency = _.find(data, c => c.currency.toUpperCase() === this.currency); + + let assetAmount, currencyAmount; + + if(_.isObject(asset) && _.isNumber(+asset.available) && !_.isNaN(+asset.available)) + assetAmount = +asset.available; + else { + assetAmount = 0; + } + + if(_.isObject(currency) && _.isNumber(+currency.available) && !_.isNaN(+currency.available)) + currencyAmount = +currency.available; + else { + currencyAmount = 0; + } + + const portfolio = [ + { name: this.asset, amount: assetAmount }, + { name: this.currency, amount: currencyAmount }, + ]; + + callback(undefined, portfolio); + }; + + const fetch = cb => this.bitfinex.wallet_balances(this.handleResponse('getPortfolio', cb)); + retry(null, fetch, processResponse); +} + +Trader.prototype.getTicker = function(callback) { + const processResponse = (err, data) => { + if (err) + return callback(err); + + callback(undefined, {bid: +data.bid, ask: +data.ask}); + }; + + const fetch = cb => this.bitfinex.ticker(this.pair, this.handleResponse('getTicker', cb)); + retry(null, fetch, processResponse); +} + +Trader.prototype.getFee = function(callback) { + const makerFee = 0.1; + // const takerFee = 0.2; + callback(undefined, makerFee / 100); +} + +Trader.prototype.roundAmount = function(amount) { + return Math.floor(amount*100000000)/100000000; +} + +Trader.prototype.roundPrice = function(price) { + // todo: calc significant digits + return price; +} + +Trader.prototype.submitOrder = function(type, amount, price, callback) { + const processResponse = (err, data) => { + if (err) + return callback(err); + + callback(null, data.order_id); + } + + const fetch = cb => this.bitfinex.new_order(this.pair, + amount + '', + price + '', + this.name.toLowerCase(), + type, + 'exchange limit', + this.handleResponse('submitOrder', cb) + ); + + retry(null, fetch, processResponse); +} + +Trader.prototype.buy = function(amount, price, callback) { + this.submitOrder('buy', amount, price, callback); +} + +Trader.prototype.sell = function(amount, price, callback) { + this.submitOrder('sell', amount, price, callback); +} + +Trader.prototype.checkOrder = function(order_id, callback) { + const processResponse = (err, data) => { + if (err) { + console.log('this is after we have retried fetching it'); + // this is after we have retried fetching it + // in this.handleResponse. + if(err.message.includes('Not Found')) { + return callback(undefined, { + open: false, + executed: true + }); + } + + return callback(err); + } + + return callback(undefined, { + open: data.is_live, + executed: data.original_amount === data.executed_amount, + filledAmount: +data.executed_amount + }); + } + + const fetcher = cb => this.bitfinex.order_status(order_id, this.handleResponse('checkOrder', cb)); + retry(null, fetcher, processResponse); +} + + +Trader.prototype.getOrder = function(order_id, callback) { + const processResponse = (err, data) => { + if (err) return callback(err); + + var price = parseFloat(data.avg_execution_price); + var amount = parseFloat(data.executed_amount); + var date = moment.unix(data.timestamp); + + // TEMP: Thu May 31 14:49:34 CEST 2018 + // the `past_trades` call is not returning + // any data. + return callback(undefined, {price, amount, date}); + + const processPastTrade = (err, data) => { + if (err) return callback(err); + + console.log('processPastTrade', data); + const trade = _.first(data); + + const fees = { + [trade.fee_currency]: trade.fee_amount + } + + callback(undefined, {price, amount, date, fees}); + } + + // we need another API call to fetch the fees + const feeFetcher = cb => this.bitfinex.past_trades(this.currency, {since: data.timestamp}, this.handleResponse('pastTrades', cb)); + retry(null, feeFetcher, processPastTrade); + + callback(undefined, {price, amount, date}); + }; + + const fetcher = cb => this.bitfinex.order_status(order_id, this.handleResponse('getOrder', cb)); + retry(null, fetcher, processResponse); +} + + +Trader.prototype.cancelOrder = function(order_id, callback) { + const processResponse = (err, data) => { + if (err) { + return callback(err); + } + + return callback(undefined, false); + } + + const handler = cb => this.bitfinex.cancel_order(order_id, this.handleResponse('cancelOrder', cb)); + retry(null, handler, processResponse); +} + +Trader.prototype.getTrades = function(since, callback, descending) { + const processResponse = (err, data) => { + if (err) return callback(err); + + var trades = _.map(data, function(trade) { + return { + tid: trade.tid, + date: trade.timestamp, + price: +trade.price, + amount: +trade.amount + } + }); + + callback(undefined, descending ? trades : trades.reverse()); + }; + + var path = this.pair; + if(since) + path += '?limit_trades=2000'; + + const handler = cb => this.bitfinex.trades(path, this.handleResponse('getTrades', cb)); + retry(null, handler, processResponse); +} + +Trader.getCapabilities = function () { + return { + name: 'Bitfinex', + slug: 'bitfinex', + currencies: marketData.currencies, + assets: marketData.assets, + markets: marketData.markets, + requires: ['key', 'secret'], + tid: 'tid', + providesFullHistory: true, + providesHistory: 'date', + tradable: true, + forceReorderDelay: true, + gekkoBroker: 0.6 + }; +} + +module.exports = Trader; diff --git a/exchanges/bitfinex.js b/exchange/wrappers/bitfinex_v2.js.prep similarity index 50% rename from exchanges/bitfinex.js rename to exchange/wrappers/bitfinex_v2.js.prep index bd22bd4ff..bc3aa01bd 100644 --- a/exchanges/bitfinex.js +++ b/exchange/wrappers/bitfinex_v2.js.prep @@ -1,11 +1,11 @@ +// NOT USED, see: https://github.com/bitfinexcom/bitfinex-api-node/issues/321 const Bitfinex = require("bitfinex-api-node"); const _ = require('lodash'); const moment = require('moment'); -const util = require('../core/util'); -const Errors = require('../core/error'); -const log = require('../core/log'); +const Errors = require('../exchangeErrors'); +const retry = require('../exchangeUtils').retry; const marketData = require('./bitfinex-markets.json'); @@ -20,47 +20,56 @@ var Trader = function(config) { this.price; this.asset = config.asset; this.currency = config.currency; - this.pair = this.asset + this.currency; - this.bitfinex = new Bitfinex(this.key, this.secret, { version: 1 }).rest; + this.pair = 't' + this.asset + this.currency; + this.bitfinex = new Bitfinex.RESTv2({apiKey: this.key, apiSecret: this.secret, transform: true}); } -var retryCritical = { - retries: 10, - factor: 1.2, - minTimeout: 10 * 1000, - maxTimeout: 60 * 1000 -}; +const includes = (str, list) => { + if(!_.isString(str)) + return false; -var retryForever = { - forever: true, - factor: 1.2, - minTimeout: 10 * 1000, - maxTimeout: 300 * 1000 -}; + return _.some(list, item => str.includes(item)); +} // Probably we need to update these string -var recoverableErrors = new RegExp(/(SOCKETTIMEDOUT|TIMEDOUT|CONNRESET|CONNREFUSED|NOTFOUND|429|443|5\d\d)/g); +const recoverableErrors = [ + 'SOCKETTIMEDOUT', + 'TIMEDOUT', + 'CONNRESET', + 'CONNREFUSED', + 'NOTFOUND', + '429', + '443', + '504', + '503', + '500', + '502', + 'Empty response' +]; -Trader.prototype.processError = function(funcName, error) { - if (!error) return undefined; +Trader.prototype.handleResponse = function(funcName, callback) { + return (error, data) => { + if(!error && _.isEmpty(data)) { + error = new Error('Empty response'); + } - if (!error.message.match(recoverableErrors)) { - log.error(`[bitfinex.js] (${funcName}) returned an irrecoverable error: ${error.message}`); - return new Errors.AbortError('[bitfinex.js] ' + error.message); - } + if(error) { + const message = error.message || error; - log.debug(`[bitfinex.js] (${funcName}) returned an error, retrying: ${error.message}`); - return new Errors.RetryError('[bitfinex.js] ' + error.message); -}; + if(!includes(message, recoverableErrors)) { + const error = new Error(message); + error.notFatal = true; + return callback(error); + } + } -Trader.prototype.handleResponse = function(funcName, callback) { - return (error, data, body) => { - return callback(this.processError(funcName, error), data); + return callback(error, data); } }; Trader.prototype.getPortfolio = function(callback) { - let process = (err, data) => { + const processResponse = (err, data) => { + console.log('processResponse', {err, data}); if (err) return callback(err); // We are only interested in funds in the "exchange" wallet @@ -69,19 +78,19 @@ Trader.prototype.getPortfolio = function(callback) { const asset = _.find(data, c => c.currency.toUpperCase() === this.asset); const currency = _.find(data, c => c.currency.toUpperCase() === this.currency); + console.log(currency.balance); + let assetAmount, currencyAmount; - if(_.isObject(asset) && _.isNumber(+asset.available) && !_.isNaN(+asset.available)) - assetAmount = +asset.available; + if(_.isObject(asset) && _.isNumber(+asset.balanceAvailable) && !_.isNaN(+asset.balanceAvailable)) + assetAmount = +asset.balanceAvailable; else { - log.error(`Bitfinex did not provide ${this.asset} amount, assuming 0`); assetAmount = 0; } - if(_.isObject(currency) && _.isNumber(+currency.available) && !_.isNaN(+currency.available)) - currencyAmount = +currency.available; + if(_.isObject(currency) && _.isNumber(+currency.balanceAvailable) && !_.isNaN(+currency.balanceAvailable)) + currencyAmount = +currency.balanceAvailable; else { - log.error(`Bitfinex did not provide ${this.currency} amount, assuming 0`); currencyAmount = 0; } @@ -93,40 +102,45 @@ Trader.prototype.getPortfolio = function(callback) { callback(undefined, portfolio); }; - let handler = (cb) => this.bitfinex.wallet_balances(this.handleResponse('getPortfolio', cb)); - util.retryCustom(retryForever, _.bind(handler, this), _.bind(process, this)); + const fetch = cb => this.bitfinex.wallets(this.handleResponse('getPortfolio', cb)); + retry(null, fetch, processResponse); } Trader.prototype.getTicker = function(callback) { - let process = (err, data) => { - if (err) return callback(err); + const processResponse = (err, data) => { + if (err) + return callback(err); - // whenever we reach this point we have valid - // data, the callback is still the same since - // we are inside the same javascript scope. - callback(undefined, {bid: +data.bid, ask: +data.ask}) + callback(undefined, {bid: +data.bid, ask: +data.ask}); }; - - let handler = (cb) => this.bitfinex.ticker(this.pair, this.handleResponse('getTicker', cb)); - util.retryCustom(retryForever, _.bind(handler, this), _.bind(process, this)); + + const fetch = cb => this.bitfinex.ticker(this.pair, this.handleResponse('getTicker', cb)); + retry(null, fetch, processResponse); } -// This assumes that only limit orders are being placed, so fees are the -// "maker fee" of 0.1%. It does not take into account volume discounts. Trader.prototype.getFee = function(callback) { - var makerFee = 0.1; + const makerFee = 0.1; + // const takerFee = 0.2; callback(undefined, makerFee / 100); } +Trader.prototype.roundAmount = function(amount) { + return Math.floor(amount*100000000)/100000000; +} + +Trader.prototype.roundPrice = function(price) { + // todo: calc significant digits + return price; +} + Trader.prototype.submit_order = function(type, amount, price, callback) { - let process = (err, data) => { + const processResponse = (err, data) => { if (err) return callback(err); callback(err, data.order_id); } - amount = Math.floor(amount*100000000)/100000000; - let handler = (cb) => this.bitfinex.new_order(this.pair, + const fetcher = cb => this.bitfinex.new_order(this.pair, amount + '', price + '', this.name.toLowerCase(), @@ -135,7 +149,7 @@ Trader.prototype.submit_order = function(type, amount, price, callback) { this.handleResponse('submitOrder', cb) ); - util.retryCustom(retryCritical, _.bind(handler, this), _.bind(process, this)); + retry(retryCritical, fetcher, processResponse); } Trader.prototype.buy = function(amount, price, callback) { @@ -147,19 +161,23 @@ Trader.prototype.sell = function(amount, price, callback) { } Trader.prototype.checkOrder = function(order_id, callback) { - let process = (err, data) => { + const processResponse = (err, data) => { if (err) return callback(err); - callback(undefined, !data.is_live); + return callback(undefined, { + open: data.is_live, + executed: data.original_amount === data.executed_amount, + filled: +data.executed_amount + }); } - let handler = (cb) => this.bitfinex.order_status(order_id, this.handleResponse('checkOrder', cb)); - util.retryCustom(retryCritical, _.bind(handler, this), _.bind(process, this)); + const fetcher = cb => this.bitfinex.order_status(order_id, this.handleResponse('checkOrder', cb)); + retry(retryCritical, fetcher, processResponse); } Trader.prototype.getOrder = function(order_id, callback) { - let process = (err, data) => { + const processResponse = (err, data) => { if (err) return callback(err); var price = parseFloat(data.avg_execution_price); @@ -169,24 +187,24 @@ Trader.prototype.getOrder = function(order_id, callback) { callback(undefined, {price, amount, date}); }; - let handler = (cb) => this.bitfinex.order_status(order_id, this.handleResponse('getOrder', cb)); - util.retryCustom(retryCritical, _.bind(handler, this), _.bind(process, this)); + const fetcher = cb => this.bitfinex.order_status(order_id, this.handleResponse('getOrder', cb)); + retry(retryCritical, fetcher, processResponse); } Trader.prototype.cancelOrder = function(order_id, callback) { - let process = (err, data) => { + const processResponse = (err, data) => { if (err) return callback(err); return callback(undefined); } - let handler = (cb) => this.bitfinex.cancel_order(order_id, this.handleResponse('cancelOrder', cb)); - util.retryCustom(retryForever, _.bind(handler, this), _.bind(process, this)); + const handler = cb => this.bitfinex.cancel_order(order_id, this.handleResponse('cancelOrder', cb)); + retry(retryForever, handler, processResponse); } Trader.prototype.getTrades = function(since, callback, descending) { - let process = (err, data) => { + const processResponse = (err, data) => { if (err) return callback(err); var trades = _.map(data, function(trade) { @@ -205,8 +223,8 @@ Trader.prototype.getTrades = function(since, callback, descending) { if(since) path += '?limit_trades=2000'; - let handler = (cb) => this.bitfinex.trades(path, this.handleResponse('getTrades', cb)); - util.retryCustom(retryForever, _.bind(handler, this), _.bind(process, this)); + const handler = cb => this.bitfinex.trades(path, this.handleResponse('getTrades', cb)); + retry(retryForever, handler, processResponse); } Trader.getCapabilities = function () { diff --git a/exchanges/bitstamp.js b/exchange/wrappers/bitstamp.js.old similarity index 100% rename from exchanges/bitstamp.js rename to exchange/wrappers/bitstamp.js.old diff --git a/exchanges/bittrex.js b/exchange/wrappers/bittrex.js.old similarity index 100% rename from exchanges/bittrex.js rename to exchange/wrappers/bittrex.js.old diff --git a/exchanges/bitx.js b/exchange/wrappers/bitx.js.old similarity index 100% rename from exchanges/bitx.js rename to exchange/wrappers/bitx.js.old diff --git a/exchanges/btc-markets.js b/exchange/wrappers/btc-markets.js.old similarity index 100% rename from exchanges/btc-markets.js rename to exchange/wrappers/btc-markets.js.old diff --git a/exchanges/btcc.js b/exchange/wrappers/btcc.js.old similarity index 100% rename from exchanges/btcc.js rename to exchange/wrappers/btcc.js.old diff --git a/exchanges/bx.in.th.js b/exchange/wrappers/bx.in.th.js.old similarity index 100% rename from exchanges/bx.in.th.js rename to exchange/wrappers/bx.in.th.js.old diff --git a/exchanges/cexio.js b/exchange/wrappers/cexio.js.old similarity index 100% rename from exchanges/cexio.js rename to exchange/wrappers/cexio.js.old diff --git a/exchanges/coinfalcon-markets.json b/exchange/wrappers/coinfalcon-markets.json similarity index 100% rename from exchanges/coinfalcon-markets.json rename to exchange/wrappers/coinfalcon-markets.json diff --git a/exchange/wrappers/coinfalcon.js b/exchange/wrappers/coinfalcon.js new file mode 100644 index 000000000..ca03977f4 --- /dev/null +++ b/exchange/wrappers/coinfalcon.js @@ -0,0 +1,312 @@ +const moment = require('moment'); +const _ = require('lodash'); +const marketData = require('./coinfalcon-markets.json'); + +const CoinFalcon = require('coinfalcon'); + +var Trader = function(config) { + _.bindAll(this); + + if (_.isObject(config)) { + this.key = config.key; + this.secret = config.secret; + this.currency = config.currency.toUpperCase(); + this.asset = config.asset.toUpperCase(); + } + + this.pair = this.asset + '-' + this.currency; + this.name = 'coinfalcon'; + + this.market = _.find(Trader.getCapabilities().markets, (market) => { + return market.pair[0] === this.currency && market.pair[1] === this.asset + }); + + this.coinfalcon = new CoinFalcon.Client(this.key, this.secret); + + this.interval = 1500; +}; + +const includes = (str, list) => { + if(!_.isString(str)) + return false; + + return _.some(list, item => str.includes(item)); +} + +const recoverableErrors = [ + 'SOCKETTIMEDOUT', + 'TIMEDOUT', + 'CONNRESET', + 'CONNREFUSED', + 'NOTFOUND', + '429', + '522', + '429', + '504', + '503', + '500', + '502', + '408', + // "The timestamp 1527996378 is invalid, current timestamp is 1527996441." + 'is invalid, current timestamp is', + 'EHOSTUNREACH' +]; + +Trader.prototype.processResponse = function(method, args, next) { + const catcher = err => { + if(!err || !err.message) + err = new Error(err || 'Empty error'); + + if(includes(err.message, recoverableErrors)) + return this.retry(method, args); + + console.log(new Date, '[cf] big error!', err); + + return next(err); + } + + return { + failure: catcher, + success: data => { + if(!data) + return catcher(); + + if(data.error) + return catcher(data.error); + + if(includes(data, ['Please complete the security check to proceed.'])) + return next(new Error( + 'Your IP has been flagged by CloudFlare. ' + + 'As such Gekko Broker cannot access Coinfalcon.' + )); + + next(undefined, data); + } + } +} + +Trader.prototype.retry = function(method, args) { + var wait = +moment.duration(1, 'seconds'); + + // run the failed method again with the same arguments after wait + setTimeout(() => { + console.log('cf retry..'); + console.log(args); + method.apply(this, args); + }, wait); +}; + +Trader.prototype.getTicker = function(callback) { + const handle = this.processResponse(this.getTicker, [callback], (err, res) => { + if(err) + return callback(err); + + callback(null, {bid: +res.data.bids[0].price, ask: +res.data.asks[0].price}) + }); + + var url = "markets/" + this.pair + "/orders?level=1" + + this.coinfalcon.get(url).then(handle.success).catch(handle.failure); +}; + +Trader.prototype.getFee = function(callback) { + var fees = 0; // 0% for making! + callback(false, fees / 100); +}; + +Trader.prototype.getPortfolio = function(callback) { + const handle = this.processResponse(this.getPortfolio, [callback], (err, res) => { + if(err) + return callback(err); + + var portfolio = res.data.map(account => ({ + name: account.currency_code.toUpperCase(), + amount: parseFloat(account.available_balance) + })); + + callback(null, portfolio); + }); + + this.coinfalcon.get('user/accounts').then(handle.success).catch(handle.failure); +}; + +Trader.prototype.addOrder = function(type, amount, price, callback) { + const args = _.toArray(arguments); + + const handle = this.processResponse(this.addOrder, args, (err, res) => { + if(err) + return callback(err); + + callback(false, res.data.id); + }); + + const payload = { + order_type: type, + operation_type: 'limit_order', + market: this.pair, + size: amount + '', + price: price + '' + } + + this.coinfalcon.post('user/orders', payload).then(handle.success).catch(handle.failure); +}; + +['buy', 'sell'].map(function(type) { + Trader.prototype[type] = function(amount, price, callback) { + this.addOrder(type, amount, price, callback); + }; +}); + +const round = function(number, precision) { + var factor = Math.pow(10, precision); + var tempNumber = number * factor; + var roundedTempNumber = Math.round(tempNumber); + return roundedTempNumber / factor; +}; + +Trader.prototype.roundAmount = function(amount) { + return round(amount, 8); +} + +Trader.prototype.roundPrice = function(price) { + let rounding; + + if(this.pair.includes('EUR')) + rounding = 2; + else + rounding = 5; + return round(price, rounding); +} + +Trader.prototype.outbidPrice = function(price, isUp) { + let newPrice; + + if(isUp) { + newPrice = price + this.market.minimalOrder.price; + } else { + newPrice = price - this.market.minimalOrder.price; + } + + return this.roundPrice(newPrice); +} + +Trader.prototype.getOrder = function(order, callback) { + const args = _.toArray(arguments); + const handle = this.processResponse(this.getOrder, args, (err, res) => { + if(err) + return callback(err); + + const price = parseFloat(res.data.price); + const amount = parseFloat(res.data.size_filled); + const date = moment(res.data.created_at); + const fees = {}; + const feePercent = 0; + callback(false, { price, amount, date, fees, feePercent }); + }); + + this.coinfalcon.get('user/orders/' + order).then(handle.success).catch(handle.failure); +}; + +Trader.prototype.checkOrder = function(order, callback) { + const args = _.toArray(arguments); + + const handle = this.processResponse(this.checkOrder, args, (err, res) => { + if(err) + return callback(err); + + // https://docs.coinfalcon.com/#list-orders + const status = res.data.status; + + if(status === 'canceled') { + return callback(undefined, { executed: false, open: false }); + } if(status === 'fulfilled') { + return callback(undefined, { executed: true, open: false }); + } if( + status === 'pending' || + status === 'partially_filled' || + status === 'open' + ) { + return callback(undefined, { executed: false, open: true, filledAmount: +res.data.size_filled }); + } + + console.error(res.data); + callback(new Error('Unknown status ' + status)); + }); + + this.coinfalcon.get('user/orders/' + order).then(handle.success).catch(handle.failure); +}; + +Trader.prototype.cancelOrder = function(order, callback) { + const args = _.toArray(arguments); + + const handle = this.processResponse(this.cancelOrder, args, (err, res) => { + if(err) { + if(err.message.includes('has wrong status.')) { + return callback(undefined, true); + } + return callback(err); + } + + callback(undefined, false); + }); + + this.coinfalcon.delete('user/orders/' + order).then(handle.success).catch(handle.failure); +}; + +Trader.prototype.getTrades = function(since, callback, descending) { + var args = _.toArray(arguments); + + var success = function(res) { + var parsedTrades = []; + _.each( + res.data, + function(trade) { + parsedTrades.push({ + tid: trade.id, + date: moment(trade.created_at).unix(), + price: parseFloat(trade.price), + amount: parseFloat(trade.size), + }); + }, + this + ); + + if (descending) { + callback(null, parsedTrades); + } else { + callback(null, parsedTrades.reverse()); + } + }.bind(this); + + var failure = function (err) { + err = new Error(err); + return this.retry(this.getTrades, args, err); + }.bind(this); + + var url = "markets/" + this.pair + "/trades" + + if (since) { + url += '?since_time=' + (_.isString(since) ? since : since.format()); + } + + this.coinfalcon.get(url).then(success).catch(failure); +}; + +Trader.getCapabilities = function () { + return { + name: 'CoinFalcon', + slug: 'coinfalcon', + assets: marketData.assets, + currencies: marketData.currencies, + markets: marketData.markets, + requires: ['key', 'secret'], + providesHistory: 'date', + providesFullHistory: true, + tid: 'tid', + tradable: true, + forceReorderDelay: false, + gekkoBroker: 0.6 + }; +} + +module.exports = Trader; diff --git a/exchanges/coingi.js b/exchange/wrappers/coingi.js similarity index 100% rename from exchanges/coingi.js rename to exchange/wrappers/coingi.js diff --git a/exchanges/gdax.js b/exchange/wrappers/gdax.js similarity index 63% rename from exchanges/gdax.js rename to exchange/wrappers/gdax.js index 7ef0ab9c6..4bd39f93f 100644 --- a/exchanges/gdax.js +++ b/exchange/wrappers/gdax.js @@ -1,15 +1,14 @@ -var Gdax = require('gdax'); -var _ = require('lodash'); -var moment = require('moment'); +const Gdax = require('gdax'); +const _ = require('lodash'); +const moment = require('moment'); -const util = require('../core/util'); -const Errors = require('../core/error'); -const log = require('../core/log'); +const errors = require('../exchangeErrors'); +const retry = require('../exchangeUtils').retry; const BATCH_SIZE = 100; const QUERY_DELAY = 350; -var Trader = function(config) { +const Trader = function(config) { _.bindAll(this); this.post_only = true; @@ -40,7 +39,6 @@ var Trader = function(config) { } this.gdax_public = new Gdax.PublicClient( - this.pair, this.use_sandbox ? this.api_sandbox_url : undefined ); this.gdax = new Gdax.AuthenticatedClient( @@ -51,59 +49,65 @@ var Trader = function(config) { ); }; -var retryCritical = { - retries: 10, - factor: 1.2, - minTimeout: 10 * 1000, - maxTimeout: 60 * 1000, -}; - -var retryForever = { - forever: true, - factor: 1.2, - minTimeout: 10 * 1000, - maxTimeout: 300 * 1000, -}; - -// Probably we need to update these string -var recoverableErrors = new RegExp( - /(SOCKETTIMEDOUT|TIMEDOUT|CONNRESET|CONNREFUSED|NOTFOUND|Rate limit exceeded|Response code 5)/ -); - -Trader.prototype.processError = function(funcName, error) { - if (!error) return undefined; - - if (!error.message.match(recoverableErrors)) { - log.error( - `[gdax.js] (${funcName}) returned an irrecoverable error: ${ - error.message - }` - ); - return new Errors.AbortError('[gdax.js] ' + error.message); - } - - log.debug( - `[gdax.js] (${funcName}) returned an error, retrying: ${error.message}` - ); - return new Errors.RetryError('[gdax.js] ' + error.message); -}; - -Trader.prototype.handleResponse = function(funcName, callback) { +const recoverableErrors = [ + 'SOCKETTIMEDOUT', + 'TIMEDOUT', + 'CONNRESET', + 'CONNREFUSED', + 'NOTFOUND', + 'Rate limit exceeded', + 'Response code 5', + 'GDAX is currently under maintenance.', + 'HTTP 408 Error', + 'HTTP 504 Error', + 'socket hang up', + 'EHOSTUNREACH' +]; + +const includes = (str, list) => { + if(!_.isString(str)) + return false; + + return _.some(list, item => str.includes(item)); +} + +Trader.prototype.processResponse = function(method, next) { return (error, response, body) => { - if (body && !_.isEmpty(body.message)) error = new Error(body.message); - else if ( + if(!error && body && !_.isEmpty(body.message)) { + error = new Error(body.message); + } + + if( response && response.statusCode < 200 && response.statusCode >= 300 - ) + ) { error = new Error(`Response code ${response.statusCode}`); + } - return callback(this.processError(funcName, error), body); - }; -}; + if(error) { + if(includes(error.message, recoverableErrors)) { + error.notFatal = true; + } + + if( + ['buy', 'sell'].includes(method) && + error.message.includes('Insufficient funds') + ) { + error.retry = 10; + } + + console.log(error.message); + + return next(error); + } + + return next(undefined, body); + } +} Trader.prototype.getPortfolio = function(callback) { - var result = function(err, data) { + const result = (err, data) => { if (err) return callback(err); var portfolio = data.map(function(account) { @@ -115,117 +119,149 @@ Trader.prototype.getPortfolio = function(callback) { callback(undefined, portfolio); }; - let handler = cb => - this.gdax.getAccounts(this.handleResponse('getPortfolio', cb)); - util.retryCustom(retryForever, _.bind(handler, this), _.bind(result, this)); + const fetch = cb => + this.gdax.getAccounts(this.processResponse('getPortfolio', cb)); + retry(null, fetch, result); }; Trader.prototype.getTicker = function(callback) { - var result = function(err, data) { + const result = (err, data) => { if (err) return callback(err); callback(undefined, { bid: +data.bid, ask: +data.ask }); }; - let handler = cb => - this.gdax_public.getProductTicker(this.handleResponse('getTicker', cb)); - util.retryCustom(retryForever, _.bind(handler, this), _.bind(result, this)); + const fetch = cb => + this.gdax_public.getProductTicker(this.pair, this.processResponse('getTicker', cb)); + retry(null, fetch, result); }; Trader.prototype.getFee = function(callback) { //https://www.gdax.com/fees - const fee = this.asset == 'BTC' ? 0.0025 : 0.003; + // const fee = this.asset == 'BTC' ? 0.0025 : 0.003; + const fee = 0; //There is no maker fee, not sure if we need taker fee here //If post only is enabled, gdax only does maker trades which are free callback(undefined, this.post_only ? 0 : fee); }; +Trader.prototype.roundPrice = function(price) { + return this.getMaxDecimalsNumber(price, this.currency == 'BTC' ? 5 : 2); +} + +Trader.prototype.roundAmount = function(amount) { + return this.getMaxDecimalsNumber(amount); +} + Trader.prototype.buy = function(amount, price, callback) { - var buyParams = { + const buyParams = { price: this.getMaxDecimalsNumber(price, this.currency == 'BTC' ? 5 : 2), size: this.getMaxDecimalsNumber(amount), product_id: this.pair, post_only: this.post_only, }; - var result = (err, data) => { - if (err) return callback(err); + const result = (err, data) => { + if (err) { + console.log({buyParams}, err.message); + return callback(err); + } callback(undefined, data.id); }; - let handler = cb => - this.gdax.buy(buyParams, this.handleResponse('buy', cb)); - util.retryCustom(retryCritical, _.bind(handler, this), _.bind(result, this)); + const fetch = cb => + this.gdax.buy(buyParams, this.processResponse('buy', cb)); + retry(null, fetch, result); }; Trader.prototype.sell = function(amount, price, callback) { - var sellParams = { + const sellParams = { price: this.getMaxDecimalsNumber(price, this.currency == 'BTC' ? 5 : 2), size: this.getMaxDecimalsNumber(amount), product_id: this.pair, post_only: this.post_only, }; - var result = function(err, data) { - if (err) return callback(err); + const result = (err, data) => { + if (err) { + console.log({sellParams}, err.message); + return callback(err); + } + + if(data.message && data.message.includes('Insufficient funds')) { + err = new Error(data.message); + err.retryOnce = true; + return callback(err); + } + callback(undefined, data.id); }; - let handler = cb => - this.gdax.sell(sellParams, this.handleResponse('sell', cb)); - util.retryCustom(retryCritical, _.bind(handler, this), _.bind(result, this)); + const fetch = cb => + this.gdax.sell(sellParams, this.processResponse('sell', cb)); + retry(null, fetch, result); }; Trader.prototype.checkOrder = function(order, callback) { - var result = function(err, data) { + const result = (err, data) => { if (err) return callback(err); + // @link: + // https://stackoverflow.com/questions/48132078/available-gdax-order-statuses-and-meanings var status = data.status; - if (status == 'done') { - return callback(undefined, true); - } else if (status == 'rejected') { - return callback(undefined, false); - } else if (status == 'pending') { - return callback(undefined, false); + if(status == 'pending') { + // technically not open yet, but will be soon + return callback(undefined, { executed: false, open: true, filledAmount: 0 }); + } if (status === 'done' || status === 'settled') { + return callback(undefined, { executed: true, open: false }); + } else if (status === 'rejected') { + return callback(undefined, { executed: false, open: false }); + } else if(status === 'open' || status === 'active') { + return callback(undefined, { executed: false, open: true, filledAmount: parseFloat(data.filled_size) }); } - callback(undefined, false); + + callback(new Error('Unknown status ' + status)); }; - let handler = cb => - this.gdax.getOrder(order, this.handleResponse('checkOrder', cb)); - util.retryCustom(retryCritical, _.bind(handler, this), _.bind(result, this)); + const fetch = cb => + this.gdax.getOrder(order, this.processResponse('checkOrder', cb)); + retry(null, fetch, result); }; Trader.prototype.getOrder = function(order, callback) { - var result = function(err, data) { + const result = (err, data) => { if (err) return callback(err); - var price = parseFloat(data.price); - var amount = parseFloat(data.filled_size); - var date = moment(data.done_at); + const price = parseFloat(data.price); + const amount = parseFloat(data.filled_size); + const date = moment(data.done_at); + const fees = { + // you always pay fee in the base currency on gdax + [this.currency]: +data.fill_fees + } + const feePercent = +data.fill_fees / price / amount * 100; - callback(undefined, { price, amount, date }); + callback(undefined, { price, amount, date, fees, feePercent }); }; - let handler = cb => - this.gdax.getOrder(order, this.handleResponse('getOrder', cb)); - util.retryCustom(retryForever, _.bind(handler, this), _.bind(result, this)); + const fetch = cb => + this.gdax.getOrder(order, this.processResponse('getOrder', cb)); + retry(null, fetch, result); }; Trader.prototype.cancelOrder = function(order, callback) { // callback for cancelOrder should be true if the order was already filled, otherwise false - var result = function(err, data) { + const result = (err, data) => { if(err) { - log.error('Error cancelling order:', err); - return callback(true); // need to catch the specific error but usually an error on cancel means it was filled + return callback(null, true); // need to catch the specific error but usually an error on cancel means it was filled } - return callback(false); + return callback(null, false); }; - let handler = cb => - this.gdax.cancelOrder(order, this.handleResponse('cancelOrder', cb)); - util.retryCustom(retryForever, _.bind(handler, this), _.bind(result, this)); + const fetch = cb => + this.gdax.cancelOrder(order, this.processResponse('cancelOrder', cb)); + retry(null, fetch, result); }; Trader.prototype.getTrades = function(since, callback, descending) { @@ -257,13 +293,14 @@ Trader.prototype.getTrades = function(since, callback, descending) { setTimeout(() => { let handler = cb => this.gdax_public.getProductTrades( + this.pair, { after: last.trade_id - BATCH_SIZE * lastScan, limit: BATCH_SIZE, }, - this.handleResponse('getTrades', cb) + this.processResponse('getTrades', cb) ); - util.retryCustom( + retry( retryForever, _.bind(handler, this), _.bind(process, this) @@ -297,10 +334,11 @@ Trader.prototype.getTrades = function(since, callback, descending) { setTimeout(() => { let handler = cb => this.gdax_public.getProductTrades( + this.pair, { after: this.scanbackTid + BATCH_SIZE + 1, limit: BATCH_SIZE }, - this.handleResponse('getTrades', cb) + this.processResponse('getTrades', cb) ); - util.retryCustom( + retry( retryForever, _.bind(handler, this), _.bind(process, this) @@ -326,10 +364,11 @@ Trader.prototype.getTrades = function(since, callback, descending) { if (this.scanbackTid) { let handler = cb => this.gdax_public.getProductTrades( + this.pair, { after: this.scanbackTid + BATCH_SIZE + 1, limit: BATCH_SIZE }, - this.handleResponse('getTrades', cb) + this.processResponse('getTrades', cb) ); - util.retryCustom( + retry( retryForever, _.bind(handler, this), _.bind(process, this) @@ -342,10 +381,11 @@ Trader.prototype.getTrades = function(since, callback, descending) { let handler = cb => this.gdax_public.getProductTrades( + this.pair, { limit: BATCH_SIZE }, - this.handleResponse('getTrades', cb) + this.processResponse('getTrades', cb) ); - util.retryCustom(retryForever, _.bind(handler, this), _.bind(process, this)); + retry(retryForever, _.bind(handler, this), _.bind(process, this)); }; Trader.prototype.getMaxDecimalsNumber = function(number, decimalLimit = 8) { @@ -394,7 +434,8 @@ Trader.getCapabilities = function() { providesFullHistory: true, tid: 'tid', tradable: true, - forceReorderDelay: false + forceReorderDelay: false, + gekkoBroker: 0.6 }; }; diff --git a/exchanges/gemini.js b/exchange/wrappers/gemini.js.old similarity index 100% rename from exchanges/gemini.js rename to exchange/wrappers/gemini.js.old diff --git a/exchanges/kraken-markets.json b/exchange/wrappers/kraken-markets.json similarity index 80% rename from exchanges/kraken-markets.json rename to exchange/wrappers/kraken-markets.json index 52c15991d..5e6d401f7 100644 --- a/exchanges/kraken-markets.json +++ b/exchange/wrappers/kraken-markets.json @@ -42,7 +42,8 @@ "amount": "0.002", "unit": "asset" }, - "precision": 1 + "pricePrecision": 1, + "amountPrecision": 8 }, { "pair": [ @@ -58,7 +59,8 @@ "amount": "0.002", "unit": "asset" }, - "precision": 1 + "pricePrecision": 1, + "amountPrecision": 8 }, { "pair": [ @@ -74,7 +76,8 @@ "amount": "0.002", "unit": "asset" }, - "precision": 5 + "pricePrecision": 5, + "amountPrecision": 8 }, { "pair": [ @@ -90,7 +93,8 @@ "amount": "0.03", "unit": "asset" }, - "precision": 3 + "pricePrecision": 3, + "amountPrecision": 8 }, { "pair": [ @@ -106,7 +110,8 @@ "amount": "0.03", "unit": "asset" }, - "precision": 3 + "pricePrecision": 3, + "amountPrecision": 8 }, { "pair": [ @@ -122,7 +127,8 @@ "amount": "0.03", "unit": "asset" }, - "precision": 5 + "pricePrecision": 5, + "amountPrecision": 8 }, { "pair": [ @@ -138,7 +144,8 @@ "amount": "3.0", "unit": "asset" }, - "precision": 6 + "pricePrecision": 6, + "amountPrecision": 8 }, { "pair": [ @@ -154,7 +161,8 @@ "amount": "3.0", "unit": "asset" }, - "precision": 4 + "pricePrecision": 4, + "amountPrecision": 8 }, { "pair": [ @@ -170,7 +178,8 @@ "amount": "3.0", "unit": "asset" }, - "precision": 4 + "pricePrecision": 4, + "amountPrecision": 8 }, { "pair": [ @@ -186,7 +195,8 @@ "amount": "3.0", "unit": "asset" }, - "precision": 7 + "pricePrecision": 7, + "amountPrecision": 8 }, { "pair": [ @@ -202,7 +212,8 @@ "amount": "0.03", "unit": "asset" }, - "precision": 4 + "pricePrecision": 4, + "amountPrecision": 8 }, { "pair": [ @@ -218,7 +229,8 @@ "amount": "0.03", "unit": "asset" }, - "precision": 2 + "pricePrecision": 2, + "amountPrecision": 8 }, { "pair": [ @@ -234,7 +246,8 @@ "amount": "0.03", "unit": "asset" }, - "precision": 2 + "pricePrecision": 2, + "amountPrecision": 8 }, { "pair": [ @@ -250,7 +263,8 @@ "amount": "0.03", "unit": "asset" }, - "precision": 5 + "pricePrecision": 5, + "amountPrecision": 8 }, { "pair": [ @@ -266,7 +280,8 @@ "amount": "5", "unit": "asset" }, - "precision": 4 + "pricePrecision": 4, + "amountPrecision": 8 }, { "pair": [ @@ -282,7 +297,8 @@ "amount": "0.3", "unit": "asset" }, - "precision": 6 + "pricePrecision": 6, + "amountPrecision": 8 }, { "pair": [ @@ -298,7 +314,8 @@ "amount": "0.3", "unit": "asset" }, - "precision": 6 + "pricePrecision": 6, + "amountPrecision": 8 }, { "pair": [ @@ -314,7 +331,8 @@ "amount": "0.3", "unit": "asset" }, - "precision": 3 + "pricePrecision": 3, + "amountPrecision": 8 }, { "pair": [ @@ -330,7 +348,8 @@ "amount": "0.3", "unit": "asset" }, - "precision": 3 + "pricePrecision": 3, + "amountPrecision": 8 }, { "pair": [ @@ -346,7 +365,8 @@ "amount": "0.02", "unit": "asset" }, - "precision": 5 + "pricePrecision": 5, + "amountPrecision": 8 }, { "pair": [ @@ -362,7 +382,8 @@ "amount": "0.02", "unit": "asset" }, - "precision": 2 + "pricePrecision": 2, + "amountPrecision": 8 }, { "pair": [ @@ -378,7 +399,8 @@ "amount": "0.02", "unit": "asset" }, - "precision": 2 + "pricePrecision": 2, + "amountPrecision": 8 }, { "pair": [ @@ -394,7 +416,8 @@ "amount": "0.02", "unit": "asset" }, - "precision": 2 + "pricePrecision": 2, + "amountPrecision": 8 }, { "pair": [ @@ -410,7 +433,8 @@ "amount": "0.02", "unit": "asset" }, - "precision": 0 + "pricePrecision": 0, + "amountPrecision": 8 }, { "pair": [ @@ -426,7 +450,8 @@ "amount": "0.02", "unit": "asset" }, - "precision": 2 + "pricePrecision": 2, + "amountPrecision": 8 }, { "pair": [ @@ -442,7 +467,8 @@ "amount": "2.0", "unit": "asset" }, - "precision": 6 + "pricePrecision": 6, + "amountPrecision": 8 }, { "pair": [ @@ -458,7 +484,8 @@ "amount": "2.0", "unit": "asset" }, - "precision": 6 + "pricePrecision": 6, + "amountPrecision": 8 }, { "pair": [ @@ -474,7 +501,8 @@ "amount": "0.1", "unit": "asset" }, - "precision": 6 + "pricePrecision": 6, + "amountPrecision": 8 }, { "pair": [ @@ -490,7 +518,8 @@ "amount": "0.1", "unit": "asset" }, - "precision": 2 + "pricePrecision": 2, + "amountPrecision": 8 }, { "pair": [ @@ -506,7 +535,8 @@ "amount": "0.1", "unit": "asset" }, - "precision": 2 + "pricePrecision": 2, + "amountPrecision": 8 }, { "pair": [ @@ -522,7 +552,8 @@ "amount": "0.1", "unit": "asset" }, - "precision": 5 + "pricePrecision": 5, + "amountPrecision": 8 }, { "pair": [ @@ -538,7 +569,8 @@ "amount": "0.1", "unit": "asset" }, - "precision": 6 + "pricePrecision": 6, + "amountPrecision": 8 }, { "pair": [ @@ -554,7 +586,8 @@ "amount": "0.3", "unit": "asset" }, - "precision": 5 + "pricePrecision": 5, + "amountPrecision": 8 }, { "pair": [ @@ -570,7 +603,8 @@ "amount": "0.3", "unit": "asset" }, - "precision": 6 + "pricePrecision": 6, + "amountPrecision": 8 }, { "pair": [ @@ -586,7 +620,8 @@ "amount": "0.3", "unit": "asset" }, - "precision": 3 + "pricePrecision": 3, + "amountPrecision": 8 }, { "pair": [ @@ -602,7 +637,8 @@ "amount": "0.3", "unit": "asset" }, - "precision": 3 + "pricePrecision": 3, + "amountPrecision": 8 }, { "pair": [ @@ -615,10 +651,11 @@ ], "book": "XXBTZCAD", "minimalOrder": { - "amount": 0.01, + "amount": "0.002", "unit": "asset" }, - "precision": 1 + "pricePrecision": 1, + "amountPrecision": 8 }, { "pair": [ @@ -631,10 +668,11 @@ ], "book": "XXBTZEUR", "minimalOrder": { - "amount": 0.01, + "amount": "0.002", "unit": "asset" }, - "precision": 1 + "pricePrecision": 1, + "amountPrecision": 8 }, { "pair": [ @@ -647,10 +685,11 @@ ], "book": "XXBTZGBP", "minimalOrder": { - "amount": 0.01, + "amount": "0.002", "unit": "asset" }, - "precision": 1 + "pricePrecision": 1, + "amountPrecision": 8 }, { "pair": [ @@ -663,10 +702,11 @@ ], "book": "XXBTZJPY", "minimalOrder": { - "amount": 0.01, + "amount": "0.002", "unit": "asset" }, - "precision": 0 + "pricePrecision": 0, + "amountPrecision": 8 }, { "pair": [ @@ -679,10 +719,11 @@ ], "book": "XXBTZUSD", "minimalOrder": { - "amount": 0.01, + "amount": "0.002", "unit": "asset" }, - "precision": 1 + "pricePrecision": 1, + "amountPrecision": 8 }, { "pair": [ @@ -698,7 +739,8 @@ "amount": 0.01, "unit": "asset" }, - "precision": 8 + "pricePrecision": 8, + "amountPrecision": 8 }, { "pair": [ @@ -714,7 +756,8 @@ "amount": "300", "unit": "asset" }, - "precision": 8 + "pricePrecision": 8, + "amountPrecision": 8 }, { "pair": [ @@ -730,7 +773,8 @@ "amount": "300", "unit": "asset" }, - "precision": 6 + "pricePrecision": 6, + "amountPrecision": 8 }, { "pair": [ @@ -746,7 +790,8 @@ "amount": "300", "unit": "asset" }, - "precision": 6 + "pricePrecision": 6, + "amountPrecision": 8 }, { "pair": [ @@ -762,7 +807,8 @@ "amount": "0.1", "unit": "asset" }, - "precision": 6 + "pricePrecision": 6, + "amountPrecision": 8 }, { "pair": [ @@ -778,7 +824,8 @@ "amount": "0.1", "unit": "asset" }, - "precision": 2 + "pricePrecision": 2, + "amountPrecision": 8 }, { "pair": [ @@ -794,7 +841,8 @@ "amount": "0.1", "unit": "asset" }, - "precision": 2 + "pricePrecision": 2, + "amountPrecision": 8 }, { "pair": [ @@ -810,7 +858,8 @@ "amount": "30", "unit": "asset" }, - "precision": 8 + "pricePrecision": 8, + "amountPrecision": 8 }, { "pair": [ @@ -826,7 +875,8 @@ "amount": "30", "unit": "asset" }, - "precision": 5 + "pricePrecision": 5, + "amountPrecision": 8 }, { "pair": [ @@ -842,7 +892,8 @@ "amount": "30", "unit": "asset" }, - "precision": 5 + "pricePrecision": 5, + "amountPrecision": 8 }, { "pair": [ @@ -858,7 +909,8 @@ "amount": "30", "unit": "asset" }, - "precision": 3 + "pricePrecision": 3, + "amountPrecision": 8 }, { "pair": [ @@ -874,7 +926,8 @@ "amount": "30", "unit": "asset" }, - "precision": 5 + "pricePrecision": 5, + "amountPrecision": 8 }, { "pair": [ @@ -890,7 +943,8 @@ "amount": "0.03", "unit": "asset" }, - "precision": 5 + "pricePrecision": 5, + "amountPrecision": 8 }, { "pair": [ @@ -906,7 +960,8 @@ "amount": "0.03", "unit": "asset" }, - "precision": 3 + "pricePrecision": 3, + "amountPrecision": 8 }, { "pair": [ @@ -922,7 +977,8 @@ "amount": "0.03", "unit": "asset" }, - "precision": 3 + "pricePrecision": 3, + "amountPrecision": 8 }, { "pair": [ @@ -938,7 +994,8 @@ "amount": "0.03", "unit": "asset" }, - "precision": 2 + "pricePrecision": 2, + "amountPrecision": 8 } ] } \ No newline at end of file diff --git a/exchange/wrappers/kraken.js b/exchange/wrappers/kraken.js new file mode 100644 index 000000000..06ea11f69 --- /dev/null +++ b/exchange/wrappers/kraken.js @@ -0,0 +1,297 @@ +const Kraken = require('kraken-api'); +const moment = require('moment'); +const _ = require('lodash'); +const retry = require('../exchangeUtils').retry; + +const marketData = require('./kraken-markets.json'); + +const Trader = function(config) { + _.bindAll(this); + + if(_.isObject(config)) { + this.key = config.key; + this.secret = config.secret; + this.currency = config.currency.toUpperCase() + this.asset = config.asset.toUpperCase(); + } + + this.name = 'kraken'; + this.since = null; + + this.market = _.find(Trader.getCapabilities().markets, (market) => { + return market.pair[0] === this.currency && market.pair[1] === this.asset + }); + this.pair = this.market.book; + + this.kraken = new Kraken( + this.key, + this.secret, + {timeout: +moment.duration(60, 'seconds')} + ); +} + +const recoverableErrors = [ + 'SOCKETTIMEDOUT', + 'TIMEDOUT', + 'CONNRESET', + 'CONNREFUSED', + 'NOTFOUND', + 'API:Rate limit exceeded', + 'Service:Unavailable', + 'Request timed out', + 'Response code 5', + 'Empty response' +]; + +const includes = (str, list) => { + if(!_.isString(str)) + return false; + + return _.some(list, item => str.includes(item)); +} + +Trader.prototype.handleResponse = function(funcName, callback) { + return (error, body) => { + + if(!error && !body) { + error = new Error('Empty response'); + } + + if(error) { + if(includes(error.message, recoverableErrors)) { + error.notFatal = true; + } + + return callback(error); + } + + return callback(undefined, body); + } +}; + +Trader.prototype.getTrades = function(since, callback, descending) { + const startTs = since ? moment(since).valueOf() : null; + + const handle = (err, trades) => { + if (err) return callback(err); + + var parsedTrades = []; + _.each(trades.result[this.pair], function(trade) { + // Even when you supply 'since' you can still get more trades than you asked for, it needs to be filtered + if (_.isNull(startTs) || startTs < moment.unix(trade[2]).valueOf()) { + parsedTrades.push({ + tid: moment.unix(trade[2]).valueOf() * 1000000, + date: parseInt(Math.round(trade[2]), 10), + price: parseFloat(trade[0]), + amount: parseFloat(trade[1]) + }); + } + }, this); + + if(descending) + callback(undefined, parsedTrades.reverse()); + else + callback(undefined, parsedTrades); + }; + + const reqData = { + pair: this.pair + }; + + if(since) { + // Kraken wants a tid, which is found to be timestamp_ms * 1000000 in practice. No clear documentation on this though + reqData.since = startTs * 1000000; + } + + const fetch = cb => this.kraken.api('Trades', reqData, this.handleResponse('getTrades', cb)); + retry(null, fetch, handle); +}; + +Trader.prototype.getPortfolio = function(callback) { + const handle = (err, data) => { + if(err) return callback(err); + + const assetAmount = parseFloat( data.result[this.market.prefixed[1]] ); + const currencyAmount = parseFloat( data.result[this.market.prefixed[0]] ); + + if(!_.isNumber(assetAmount) || _.isNaN(assetAmount)) { + console.log(`Kraken did not return portfolio for ${this.asset}, assuming 0.`); + assetAmount = 0; + } + + if(!_.isNumber(currencyAmount) || _.isNaN(currencyAmount)) { + console.log(`Kraken did not return portfolio for ${this.currency}, assuming 0.`); + currencyAmount = 0; + } + + const portfolio = [ + { name: this.asset, amount: assetAmount }, + { name: this.currency, amount: currencyAmount } + ]; + + return callback(undefined, portfolio); + }; + + const fetch = cb => this.kraken.api('Balance', {}, this.handleResponse('getPortfolio', cb)); + retry(null, fetch, handle); +}; + +// This assumes that only limit orders are being placed with standard assets pairs +// It does not take into account volume discounts. +// Base maker fee is 0.16%, taker fee is 0.26%. +Trader.prototype.getFee = function(callback) { + const makerFee = 0.16; + callback(undefined, makerFee / 100); +}; + +Trader.prototype.getTicker = function(callback) { + const handle = (err, data) => { + if (err) return callback(err); + + const result = data.result[this.pair]; + const ticker = { + ask: result.a[0], + bid: result.b[0] + }; + callback(undefined, ticker); + }; + + const reqData = {pair: this.pair} + const fetch = cb => this.kraken.api('Ticker', reqData, this.handleResponse('getTicker', cb)); + retry(null, fetch, handle); +}; + +Trader.prototype.roundAmount = function(amount) { + return _.floor(amount, this.market.amountPrecision); +}; + +Trader.prototype.roundPrice = function(amount) { + return _.round(amount, this.market.pricePrecision); +}; + +Trader.prototype.addOrder = function(tradeType, amount, price, callback) { + price = this.roundAmount(price); // only round price, not amount + + const handle = (err, data) => { + if(err) return callback(err); + + console.log(data.result); + const txid = data.result.txid[0]; + + callback(undefined, txid); + }; + + const reqData = { + pair: this.pair, + type: tradeType.toLowerCase(), + ordertype: 'limit', + price: price, + volume: amount + }; + + const fetch = cb => this.kraken.api('AddOrder', reqData, this.handleResponse('addOrder', cb)); + retry(null, fetch, handle); +}; + +Trader.prototype.buy = function(amount, price, callback) { + this.addOrder('buy', amount, price, callback); +}; + +Trader.prototype.sell = function(amount, price, callback) { + this.addOrder('sell', amount, price, callback); +}; + + +Trader.prototype.getOrder = function(order, callback) { + const handle = (err, data) => { + if(err) return callback(err); + + const price = parseFloat( data.result[ order ].price ); + const amount = parseFloat( data.result[ order ].vol_exec ); + const date = moment.unix( data.result[ order ].closetm ); + + // TODO: figure out fees, kraken is reporting 0 fees: + // { 'OF6L2D-6LIKD-4OOHR7': + // { refid: null, + // userref: 0, + // status: 'closed', + // reason: null, + // opentm: 1530694339.8116, + // closetm: 1530694402.9572, + // starttm: 0, + // expiretm: 0, + // descr: [Object], + // vol: '0.00500000', + // vol_exec: '0.00500000', + // cost: '27.9', + // fee: '0', + // price: '5595.0', + // stopprice: '0.00000', + // limitprice: '0.00000', + // misc: '', + // oflags: 'fciq' } } } + + callback(undefined, {price, amount, date}); + }; + + const reqData = {txid: order}; + + const fetch = cb => this.kraken.api('QueryOrders', reqData, this.handleResponse('getOrder', cb)); + retry(null, fetch, handle); +} + +Trader.prototype.checkOrder = function(order, callback) { + const handle = (err, data) => { + if(err) return callback(err); + + const result = data.result[order]; + + callback(undefined, { + executed: result.vol === result.vol_exec, + open: result.status === 'open', + filledAmount: +result.vol_exec + }); + }; + + const reqData = {txid: order}; + + const fetch = cb => this.kraken.api('QueryOrders', reqData, this.handleResponse('checkOrder', cb)); + retry(null, fetch, handle); +}; + +Trader.prototype.cancelOrder = function(order, callback) { + const reqData = {txid: order}; + + const handle = (err, data) => { + if(err) { + if(err.message.includes('Unknown order')) { + console.log('[kraken] unable to cancel order, it did not exist anymore', order); + return callback(undefined, true); + } + + return callback(err) + } + + callback(undefined, false); + } + + const fetch = cb => this.kraken.api('CancelOrder', reqData, this.handleResponse('cancelOrder', cb)); + retry(null, fetch, handle); +}; + +Trader.getCapabilities = function () { + return { + name: 'Kraken', + slug: 'kraken', + currencies: marketData.currencies, + assets: marketData.assets, + markets: marketData.markets, + requires: ['key', 'secret'], + providesHistory: 'date', + providesFullHistory: true, + tid: 'date', + tradable: true + }; +} + +module.exports = Trader; diff --git a/exchanges/lakebtc.js b/exchange/wrappers/lakebtc.js similarity index 100% rename from exchanges/lakebtc.js rename to exchange/wrappers/lakebtc.js diff --git a/exchanges/mexbt.js b/exchange/wrappers/mexbt.js.old similarity index 100% rename from exchanges/mexbt.js rename to exchange/wrappers/mexbt.js.old diff --git a/exchanges/mtgox.js b/exchange/wrappers/mtgox.js.old similarity index 100% rename from exchanges/mtgox.js rename to exchange/wrappers/mtgox.js.old diff --git a/exchanges/okcoin.js b/exchange/wrappers/okcoin.js.old similarity index 100% rename from exchanges/okcoin.js rename to exchange/wrappers/okcoin.js.old diff --git a/exchange/wrappers/poloniex-markets.json b/exchange/wrappers/poloniex-markets.json new file mode 100644 index 000000000..06c2104cd --- /dev/null +++ b/exchange/wrappers/poloniex-markets.json @@ -0,0 +1,3197 @@ +{ + "currencies": ["BTC", "ETH", "XMR", "USDT"], + "assets": [ + "1CR", "ABY", "AC", "ACH", "ADN", "AEON", "AERO", "AIR", "AMP", "APH", + "ARCH", "AUR", "AXIS", "BALLS", "BANK", "BBL", "BBR", "BCC", "BCH", "BCN", + "BCY", "BDC", "BDG", "BELA", "BITCNY", "BITS", "BITUSD", "BLK", "BLOCK", + "BLU", "BNS", "BONES", "BOST", "BTC", "BTCD", "BTCS", "BTM", "BTS", + "BURN", "BURST", "C2", "CACH", "CAI", "CC", "CCN", "CGA", "CHA", "CINNI", + "CLAM", "CNL", "CNMT", "CNOTE", "COMM", "CON", "CORG", "CRYPT", "CURE", + "CVC", "CYC", "DAO", "DASH", "DCR", "DGB", "DICE", "DIEM", "DIME", "DIS", "DNS", + "DOGE", "DRKC", "DRM", "DSH", "DVK", "EAC", "EBT", "ECC", "EFL", "EMC2", + "EMO", "ENC", "ETC", "ETH", "eTOK", "EXE", "EXP", "FAC", "FCN", "FCT", + "FIBRE", "FLAP", "FLDC", "FLO", "FLT", "FOX", "FRAC", "FRK", "FRQ", "GNO", + "FVZ", "FZ", "FZN", "GAME", "GAP", "GAS", "GDN", "GEMZ", "GEO", "GIAR", "GLB", + "GML", "GNS", "GNT", "GOLD", "GPC", "GPUC", "GRC", "GRCX", "GRS", "GUE", "H2O", + "HIRO", "HOT", "HUC", "HUGE", "HVC", "HYP", "HZ", "IFC", "INDEX", "IOC", + "ITC", "IXC", "JLH", "JPC", "JUG", "KDC", "KEY", "LBC", "LC", "LCL", + "LEAF", "LGC", "LOL", "LOVE", "LQD", "LSK", "LTBC", "LTC", "LTCX", + "MAID", "MAST", "MAX", "MCN", "MEC", "METH", "MIL", "MIN", "MINT", "MMC", + "MMNXT", "MMXIV", "MNTA", "MON", "MRC", "MRS", "MTS", "MUN", "MYR", + "MZC", "N5X", "NAS", "NAUT", "NAV", "NBT", "NEOS", "NL", "NMC", "NOBL", + "NOTE", "NOXT", "NRS", "NSR", "NTX", "NXT", "NXTI", "OMG", "OMNI", "OPAL", + "PAND", "PASC", "PAWN", "PIGGY", "PINK", "PLX", "PMC", "POT", "PPC", "PRC", + "PRT", "PTS", "Q2C", "QBK", "QCN", "QORA", "QTL", "RADS", "RBY", "RDD", "REP", + "RIC", "RZR", "SBD", "SC", "SDC", "SHIBE", "SHOPX", "SILK", "SJCX", + "SLR", "SMC", "SOC", "SPA", "SQL", "SRCC", "SRG", "SSD", "STEEM", "STR", + "SUM", "SUN", "SWARM", "SXC", "SYNC", "SYS", "TAC", "TOR", "TRUST", + "TWE", "UIS", "ULTC", "UNITY", "URO", "USDE", "USDT", "UTC", "UTIL", + "UVC", "VIA", "VOOT", "VOX", "VRC", "VTC", "WC", "WDC", "WIKI", "WOLF", + "X13", "XAI", "XAP", "XBC", "XC", "XCH", "XCN", "XCP", "XCR", "XDN", + "XDP", "XEM", "XHC", "XLB", "XMG", "XMR", "XPB", "XPM", "XRP", "XSI", + "XST", "XSV", "XUSD", "XVC", "XXC", "BCH", "YACC", "YANG", "YC", "YIN", "ZEC", + "ZRX" + ], + "markets": [ + { + "pair": [ + "BTC", + "1CR" + ], + "minimalOrder": { + "amount": 0.0001, + "unit": "asset" + } + }, + { + "pair": [ + "BTC", + "ABY" + ], + "minimalOrder": { + "amount": 0.0001, + "unit": "asset" + } + }, + { + "pair": [ + "BTC", + "AC" + ], + "minimalOrder": { + "amount": 0.0001, + "unit": "asset" + } + }, + { + "pair": [ + "BTC", + "ACH" + ], + "minimalOrder": { + "amount": 0.0001, + "unit": "asset" + } + }, + { + "pair": [ + "BTC", + "ADN" + ], + "minimalOrder": { + "amount": 0.0001, + "unit": "asset" + } + }, + { + "pair": [ + "BTC", + "AEON" + ], + "minimalOrder": { + "amount": 0.0001, + "unit": "asset" + } + }, + { + "pair": [ + "BTC", + "AERO" + ], + "minimalOrder": { + "amount": 0.0001, + "unit": "asset" + } + }, + { + "pair": [ + "BTC", + "AIR" + ], + "minimalOrder": { + "amount": 0.0001, + "unit": "asset" + } + }, + { + "pair": [ + "BTC", + "AMP" + ], + "minimalOrder": { + "amount": 0.0001, + "unit": "asset" + } + }, + { + "pair": [ + "BTC", + "APH" + ], + "minimalOrder": { + "amount": 0.0001, + "unit": "asset" + } + }, + { + "pair": [ + "BTC", + "ARCH" + ], + "minimalOrder": { + "amount": 0.0001, + "unit": "asset" + } + }, + { + "pair": [ + "BTC", + "AUR" + ], + "minimalOrder": { + "amount": 0.0001, + "unit": "asset" + } + }, + { + "pair": [ + "BTC", + "AXIS" + ], + "minimalOrder": { + "amount": 0.0001, + "unit": "asset" + } + }, + { + "pair": [ + "BTC", + "BALLS" + ], + "minimalOrder": { + "amount": 0.0001, + "unit": "asset" + } + }, + { + "pair": [ + "BTC", + "BANK" + ], + "minimalOrder": { + "amount": 0.0001, + "unit": "asset" + } + }, + { + "pair": [ + "BTC", + "BBL" + ], + "minimalOrder": { + "amount": 0.0001, + "unit": "asset" + } + }, + { + "pair": [ + "BTC", + "BBR" + ], + "minimalOrder": { + "amount": 0.0001, + "unit": "asset" + } + }, + { + "pair": [ + "BTC", + "BCC" + ], + "minimalOrder": { + "amount": 0.0001, + "unit": "asset" + } + }, + { + "pair": [ + "BTC", + "BCN" + ], + "minimalOrder": { + "amount": 0.0001, + "unit": "asset" + } + }, + { + "pair": [ + "BTC", + "BCH" + ], + "minimalOrder": { + "amount": 0.0001, + "unit": "asset" + } + }, + { + "pair": [ + "BTC", + "BCY" + ], + "minimalOrder": { + "amount": 0.0001, + "unit": "asset" + } + }, + { + "pair": [ + "BTC", + "BDC" + ], + "minimalOrder": { + "amount": 0.0001, + "unit": "asset" + } + }, + { + "pair": [ + "BTC", + "BDG" + ], + "minimalOrder": { + "amount": 0.0001, + "unit": "asset" + } + }, + { + "pair": [ + "BTC", + "BELA" + ], + "minimalOrder": { + "amount": 0.0001, + "unit": "asset" + } + }, + { + "pair": [ + "BTC", + "BITCNY" + ], + "minimalOrder": { + "amount": 0.0001, + "unit": "asset" + } + }, + { + "pair": [ + "BTC", + "BITS" + ], + "minimalOrder": { + "amount": 0.0001, + "unit": "asset" + } + }, + { + "pair": [ + "BTC", + "BITUSD" + ], + "minimalOrder": { + "amount": 0.0001, + "unit": "asset" + } + }, + { + "pair": [ + "BTC", + "BLK" + ], + "minimalOrder": { + "amount": 0.0001, + "unit": "asset" + } + }, + { + "pair": [ + "BTC", + "BLOCK" + ], + "minimalOrder": { + "amount": 0.0001, + "unit": "asset" + } + }, + { + "pair": [ + "BTC", + "BLU" + ], + "minimalOrder": { + "amount": 0.0001, + "unit": "asset" + } + }, + { + "pair": [ + "BTC", + "BNS" + ], + "minimalOrder": { + "amount": 0.0001, + "unit": "asset" + } + }, + { + "pair": [ + "BTC", + "BONES" + ], + "minimalOrder": { + "amount": 0.0001, + "unit": "asset" + } + }, + { + "pair": [ + "BTC", + "BOST" + ], + "minimalOrder": { + "amount": 0.0001, + "unit": "asset" + } + }, + { + "pair": [ + "BTC", + "BTCD" + ], + "minimalOrder": { + "amount": 0.0001, + "unit": "asset" + } + }, + { + "pair": [ + "BTC", + "BTCS" + ], + "minimalOrder": { + "amount": 0.0001, + "unit": "asset" + } + }, + { + "pair": [ + "BTC", + "BTM" + ], + "minimalOrder": { + "amount": 0.0001, + "unit": "asset" + } + }, + { + "pair": [ + "BTC", + "BTS" + ], + "minimalOrder": { + "amount": 0.0001, + "unit": "asset" + } + }, + { + "pair": [ + "BTC", + "BURN" + ], + "minimalOrder": { + "amount": 0.0001, + "unit": "asset" + } + }, + { + "pair": [ + "BTC", + "BURST" + ], + "minimalOrder": { + "amount": 0.0001, + "unit": "asset" + } + }, + { + "pair": [ + "BTC", + "C2" + ], + "minimalOrder": { + "amount": 0.0001, + "unit": "asset" + } + }, + { + "pair": [ + "BTC", + "CACH" + ], + "minimalOrder": { + "amount": 0.0001, + "unit": "asset" + } + }, + { + "pair": [ + "BTC", + "CAI" + ], + "minimalOrder": { + "amount": 0.0001, + "unit": "asset" + } + }, + { + "pair": [ + "BTC", + "CC" + ], + "minimalOrder": { + "amount": 0.0001, + "unit": "asset" + } + }, + { + "pair": [ + "BTC", + "CCN" + ], + "minimalOrder": { + "amount": 0.0001, + "unit": "asset" + } + }, + { + "pair": [ + "BTC", + "CGA" + ], + "minimalOrder": { + "amount": 0.0001, + "unit": "asset" + } + }, + { + "pair": [ + "BTC", + "CHA" + ], + "minimalOrder": { + "amount": 0.0001, + "unit": "asset" + } + }, + { + "pair": [ + "BTC", + "CINNI" + ], + "minimalOrder": { + "amount": 0.0001, + "unit": "asset" + } + }, + { + "pair": [ + "BTC", + "CLAM" + ], + "minimalOrder": { + "amount": 0.0001, + "unit": "asset" + } + }, + { + "pair": [ + "BTC", + "CNL" + ], + "minimalOrder": { + "amount": 0.0001, + "unit": "asset" + } + }, + { + "pair": [ + "BTC", + "CNMT" + ], + "minimalOrder": { + "amount": 0.0001, + "unit": "asset" + } + }, + { + "pair": [ + "BTC", + "CNOTE" + ], + "minimalOrder": { + "amount": 0.0001, + "unit": "asset" + } + }, + { + "pair": [ + "BTC", + "COMM" + ], + "minimalOrder": { + "amount": 0.0001, + "unit": "asset" + } + }, + { + "pair": [ + "BTC", + "CON" + ], + "minimalOrder": { + "amount": 0.0001, + "unit": "asset" + } + }, + { + "pair": [ + "BTC", + "CORG" + ], + "minimalOrder": { + "amount": 0.0001, + "unit": "asset" + } + }, + { + "pair": [ + "BTC", + "CRYPT" + ], + "minimalOrder": { + "amount": 0.0001, + "unit": "asset" + } + }, + { + "pair": [ + "BTC", + "CURE" + ], + "minimalOrder": { + "amount": 0.0001, + "unit": "asset" + } + }, + { + "pair": [ + "BTC", + "CVC" + ], + "minimalOrder": { + "amount": 0.0001, + "unit": "asset" + } + }, + { + "pair": [ + "BTC", + "CYC" + ], + "minimalOrder": { + "amount": 0.0001, + "unit": "asset" + } + }, + { + "pair": [ + "BTC", + "DAO" + ], + "minimalOrder": { + "amount": 0.0001, + "unit": "asset" + } + }, + { + "pair": [ + "BTC", + "DASH" + ], + "minimalOrder": { + "amount": 0.0001, + "unit": "asset" + } + }, + { + "pair": [ + "BTC", + "DCR" + ], + "minimalOrder": { + "amount": 0.0001, + "unit": "asset" + } + }, + { + "pair": [ + "BTC", + "DGB" + ], + "minimalOrder": { + "amount": 0.0001, + "unit": "asset" + } + }, + { + "pair": [ + "BTC", + "DICE" + ], + "minimalOrder": { + "amount": 0.0001, + "unit": "asset" + } + }, + { + "pair": [ + "BTC", + "DIEM" + ], + "minimalOrder": { + "amount": 0.0001, + "unit": "asset" + } + }, + { + "pair": [ + "BTC", + "DIME" + ], + "minimalOrder": { + "amount": 0.0001, + "unit": "asset" + } + }, + { + "pair": [ + "BTC", + "DIS" + ], + "minimalOrder": { + "amount": 0.0001, + "unit": "asset" + } + }, + { + "pair": [ + "BTC", + "DNS" + ], + "minimalOrder": { + "amount": 0.0001, + "unit": "asset" + } + }, + { + "pair": [ + "BTC", + "DOGE" + ], + "minimalOrder": { + "amount": 0.0001, + "unit": "asset" + } + }, + { + "pair": [ + "BTC", + "DRKC" + ], + "minimalOrder": { + "amount": 0.0001, + "unit": "asset" + } + }, + { + "pair": [ + "BTC", + "DRM" + ], + "minimalOrder": { + "amount": 0.0001, + "unit": "asset" + } + }, + { + "pair": [ + "BTC", + "DSH" + ], + "minimalOrder": { + "amount": 0.0001, + "unit": "asset" + } + }, + { + "pair": [ + "BTC", + "DVK" + ], + "minimalOrder": { + "amount": 0.0001, + "unit": "asset" + } + }, + { + "pair": [ + "BTC", + "EAC" + ], + "minimalOrder": { + "amount": 0.0001, + "unit": "asset" + } + }, + { + "pair": [ + "BTC", + "EBT" + ], + "minimalOrder": { + "amount": 0.0001, + "unit": "asset" + } + }, + { + "pair": [ + "BTC", + "ECC" + ], + "minimalOrder": { + "amount": 0.0001, + "unit": "asset" + } + }, + { + "pair": [ + "BTC", + "EFL" + ], + "minimalOrder": { + "amount": 0.0001, + "unit": "asset" + } + }, + { + "pair": [ + "BTC", + "EMC2" + ], + "minimalOrder": { + "amount": 0.0001, + "unit": "asset" + } + }, + { + "pair": [ + "BTC", + "EMO" + ], + "minimalOrder": { + "amount": 0.0001, + "unit": "asset" + } + }, + { + "pair": [ + "BTC", + "ENC" + ], + "minimalOrder": { + "amount": 0.0001, + "unit": "asset" + } + }, + { + "pair": [ + "BTC", + "ETC" + ], + "minimalOrder": { + "amount": 0.0001, + "unit": "asset" + } + }, + { + "pair": [ + "BTC", + "ETH" + ], + "minimalOrder": { + "amount": 0.0001, + "unit": "asset" + } + }, + { + "pair": [ + "BTC", + "eTOK" + ], + "minimalOrder": { + "amount": 0.0001, + "unit": "asset" + } + }, + { + "pair": [ + "BTC", + "EXE" + ], + "minimalOrder": { + "amount": 0.0001, + "unit": "asset" + } + }, + { + "pair": [ + "BTC", + "EXP" + ], + "minimalOrder": { + "amount": 0.0001, + "unit": "asset" + } + }, + { + "pair": [ + "BTC", + "FAC" + ], + "minimalOrder": { + "amount": 0.0001, + "unit": "asset" + } + }, + { + "pair": [ + "BTC", + "FCN" + ], + "minimalOrder": { + "amount": 0.0001, + "unit": "asset" + } + }, + { + "pair": [ + "BTC", + "FCT" + ], + "minimalOrder": { + "amount": 0.0001, + "unit": "asset" + } + }, + { + "pair": [ + "BTC", + "FIBRE" + ], + "minimalOrder": { + "amount": 0.0001, + "unit": "asset" + } + }, + { + "pair": [ + "BTC", + "FLAP" + ], + "minimalOrder": { + "amount": 0.0001, + "unit": "asset" + } + }, + { + "pair": [ + "BTC", + "FLDC" + ], + "minimalOrder": { + "amount": 0.0001, + "unit": "asset" + } + }, + { + "pair": [ + "BTC", + "FLO" + ], + "minimalOrder": { + "amount": 0.0001, + "unit": "asset" + } + }, + { + "pair": [ + "BTC", + "FLT" + ], + "minimalOrder": { + "amount": 0.0001, + "unit": "asset" + } + }, + { + "pair": [ + "BTC", + "FOX" + ], + "minimalOrder": { + "amount": 0.0001, + "unit": "asset" + } + }, + { + "pair": [ + "BTC", + "FRAC" + ], + "minimalOrder": { + "amount": 0.0001, + "unit": "asset" + } + }, + { + "pair": [ + "BTC", + "FRK" + ], + "minimalOrder": { + "amount": 0.0001, + "unit": "asset" + } + }, + { + "pair": [ + "BTC", + "FRQ" + ], + "minimalOrder": { + "amount": 0.0001, + "unit": "asset" + } + }, + { + "pair": [ + "BTC", + "FVZ" + ], + "minimalOrder": { + "amount": 0.0001, + "unit": "asset" + } + }, + { + "pair": [ + "BTC", + "FZ" + ], + "minimalOrder": { + "amount": 0.0001, + "unit": "asset" + } + }, + { + "pair": [ + "BTC", + "FZN" + ], + "minimalOrder": { + "amount": 0.0001, + "unit": "asset" + } + }, + { + "pair": [ + "BTC", + "GAME" + ], + "minimalOrder": { + "amount": 0.0001, + "unit": "asset" + } + }, + { + "pair": [ + "BTC", + "GAP" + ], + "minimalOrder": { + "amount": 0.0001, + "unit": "asset" + } + }, + { + "pair": [ + "BTC", + "GAS" + ], + "minimalOrder": { + "amount": 0.0001, + "unit": "asset" + } + }, + { + "pair": [ + "BTC", + "GDN" + ], + "minimalOrder": { + "amount": 0.0001, + "unit": "asset" + } + }, + { + "pair": [ + "BTC", + "GEMZ" + ], + "minimalOrder": { + "amount": 0.0001, + "unit": "asset" + } + }, + { + "pair": [ + "BTC", + "GEO" + ], + "minimalOrder": { + "amount": 0.0001, + "unit": "asset" + } + }, + { + "pair": [ + "BTC", + "GIAR" + ], + "minimalOrder": { + "amount": 0.0001, + "unit": "asset" + } + }, + { + "pair": [ + "BTC", + "GLB" + ], + "minimalOrder": { + "amount": 0.0001, + "unit": "asset" + } + }, + { + "pair": [ + "BTC", + "GML" + ], + "minimalOrder": { + "amount": 0.0001, + "unit": "asset" + } + }, + { + "pair": [ + "BTC", + "GNS" + ], + "minimalOrder": { + "amount": 0.0001, + "unit": "asset" + } + }, + { + "pair": [ + "BTC", + "GOLD" + ], + "minimalOrder": { + "amount": 0.0001, + "unit": "asset" + } + }, + { + "pair": [ + "BTC", + "GPC" + ], + "minimalOrder": { + "amount": 0.0001, + "unit": "asset" + } + }, + { + "pair": [ + "BTC", + "GPUC" + ], + "minimalOrder": { + "amount": 0.0001, + "unit": "asset" + } + }, + { + "pair": [ + "BTC", + "GRC" + ], + "minimalOrder": { + "amount": 0.0001, + "unit": "asset" + } + }, + { + "pair": [ + "BTC", + "GRCX" + ], + "minimalOrder": { + "amount": 0.0001, + "unit": "asset" + } + }, + { + "pair": [ + "BTC", + "GRS" + ], + "minimalOrder": { + "amount": 0.0001, + "unit": "asset" + } + }, + { + "pair": [ + "BTC", + "GUE" + ], + "minimalOrder": { + "amount": 0.0001, + "unit": "asset" + } + }, + { + "pair": [ + "BTC", + "H2O" + ], + "minimalOrder": { + "amount": 0.0001, + "unit": "asset" + } + }, + { + "pair": [ + "BTC", + "HIRO" + ], + "minimalOrder": { + "amount": 0.0001, + "unit": "asset" + } + }, + { + "pair": [ + "BTC", + "HOT" + ], + "minimalOrder": { + "amount": 0.0001, + "unit": "asset" + } + }, + { + "pair": [ + "BTC", + "HUC" + ], + "minimalOrder": { + "amount": 0.0001, + "unit": "asset" + } + }, + { + "pair": [ + "BTC", + "HUGE" + ], + "minimalOrder": { + "amount": 0.0001, + "unit": "asset" + } + }, + { + "pair": [ + "BTC", + "HVC" + ], + "minimalOrder": { + "amount": 0.0001, + "unit": "asset" + } + }, + { + "pair": [ + "BTC", + "HYP" + ], + "minimalOrder": { + "amount": 0.0001, + "unit": "asset" + } + }, + { + "pair": [ + "BTC", + "HZ" + ], + "minimalOrder": { + "amount": 0.0001, + "unit": "asset" + } + }, + { + "pair": [ + "BTC", + "IFC" + ], + "minimalOrder": { + "amount": 0.0001, + "unit": "asset" + } + }, + { + "pair": [ + "BTC", + "INDEX" + ], + "minimalOrder": { + "amount": 0.0001, + "unit": "asset" + } + }, + { + "pair": [ + "BTC", + "IOC" + ], + "minimalOrder": { + "amount": 0.0001, + "unit": "asset" + } + }, + { + "pair": [ + "BTC", + "ITC" + ], + "minimalOrder": { + "amount": 0.0001, + "unit": "asset" + } + }, + { + "pair": [ + "BTC", + "IXC" + ], + "minimalOrder": { + "amount": 0.0001, + "unit": "asset" + } + }, + { + "pair": [ + "BTC", + "JLH" + ], + "minimalOrder": { + "amount": 0.0001, + "unit": "asset" + } + }, + { + "pair": [ + "BTC", + "JPC" + ], + "minimalOrder": { + "amount": 0.0001, + "unit": "asset" + } + }, + { + "pair": [ + "BTC", + "JUG" + ], + "minimalOrder": { + "amount": 0.0001, + "unit": "asset" + } + }, + { + "pair": [ + "BTC", + "KDC" + ], + "minimalOrder": { + "amount": 0.0001, + "unit": "asset" + } + }, + { + "pair": [ + "BTC", + "KEY" + ], + "minimalOrder": { + "amount": 0.0001, + "unit": "asset" + } + }, + { + "pair": [ + "BTC", + "LBC" + ], + "minimalOrder": { + "amount": 0.0001, + "unit": "asset" + } + }, + { + "pair": [ + "BTC", + "LC" + ], + "minimalOrder": { + "amount": 0.0001, + "unit": "asset" + } + }, + { + "pair": [ + "BTC", + "LCL" + ], + "minimalOrder": { + "amount": 0.0001, + "unit": "asset" + } + }, + { + "pair": [ + "BTC", + "LEAF" + ], + "minimalOrder": { + "amount": 0.0001, + "unit": "asset" + } + }, + { + "pair": [ + "BTC", + "LGC" + ], + "minimalOrder": { + "amount": 0.0001, + "unit": "asset" + } + }, + { + "pair": [ + "BTC", + "LOL" + ], + "minimalOrder": { + "amount": 0.0001, + "unit": "asset" + } + }, + { + "pair": [ + "BTC", + "LOVE" + ], + "minimalOrder": { + "amount": 0.0001, + "unit": "asset" + } + }, + { + "pair": [ + "BTC", + "LQD" + ], + "minimalOrder": { + "amount": 0.0001, + "unit": "asset" + } + }, + { + "pair": [ + "BTC", + "LSK" + ], + "minimalOrder": { + "amount": 0.0001, + "unit": "asset" + } + }, + { + "pair": [ + "BTC", + "LTBC" + ], + "minimalOrder": { + "amount": 0.0001, + "unit": "asset" + } + }, + { + "pair": [ + "BTC", + "LTC" + ], + "minimalOrder": { + "amount": 0.0001, + "unit": "asset" + } + }, + { + "pair": [ + "BTC", + "LTCX" + ], + "minimalOrder": { + "amount": 0.0001, + "unit": "asset" + } + }, + { + "pair": [ + "BTC", + "MAID" + ], + "minimalOrder": { + "amount": 0.0001, + "unit": "asset" + } + }, + { + "pair": [ + "BTC", + "MAST" + ], + "minimalOrder": { + "amount": 0.0001, + "unit": "asset" + } + }, + { + "pair": [ + "BTC", + "MAX" + ], + "minimalOrder": { + "amount": 0.0001, + "unit": "asset" + } + }, + { + "pair": [ + "BTC", + "MCN" + ], + "minimalOrder": { + "amount": 0.0001, + "unit": "asset" + } + }, + { + "pair": [ + "BTC", + "MEC" + ], + "minimalOrder": { + "amount": 0.0001, + "unit": "asset" + } + }, + { + "pair": [ + "BTC", + "METH" + ], + "minimalOrder": { + "amount": 0.0001, + "unit": "asset" + } + }, + { + "pair": [ + "BTC", + "MIL" + ], + "minimalOrder": { + "amount": 0.0001, + "unit": "asset" + } + }, + { + "pair": [ + "BTC", + "MIN" + ], + "minimalOrder": { + "amount": 0.0001, + "unit": "asset" + } + }, + { + "pair": [ + "BTC", + "MINT" + ], + "minimalOrder": { + "amount": 0.0001, + "unit": "asset" + } + }, + { + "pair": [ + "BTC", + "MMC" + ], + "minimalOrder": { + "amount": 0.0001, + "unit": "asset" + } + }, + { + "pair": [ + "BTC", + "MMNXT" + ], + "minimalOrder": { + "amount": 0.0001, + "unit": "asset" + } + }, + { + "pair": [ + "BTC", + "MMXIV" + ], + "minimalOrder": { + "amount": 0.0001, + "unit": "asset" + } + }, + { + "pair": [ + "BTC", + "MNTA" + ], + "minimalOrder": { + "amount": 0.0001, + "unit": "asset" + } + }, + { + "pair": [ + "BTC", + "MON" + ], + "minimalOrder": { + "amount": 0.0001, + "unit": "asset" + } + }, + { + "pair": [ + "BTC", + "MRC" + ], + "minimalOrder": { + "amount": 0.0001, + "unit": "asset" + } + }, + { + "pair": [ + "BTC", + "MRS" + ], + "minimalOrder": { + "amount": 0.0001, + "unit": "asset" + } + }, + { + "pair": [ + "BTC", + "MTS" + ], + "minimalOrder": { + "amount": 0.0001, + "unit": "asset" + } + }, + { + "pair": [ + "BTC", + "MUN" + ], + "minimalOrder": { + "amount": 0.0001, + "unit": "asset" + } + }, + { + "pair": [ + "BTC", + "MYR" + ], + "minimalOrder": { + "amount": 0.0001, + "unit": "asset" + } + }, + { + "pair": [ + "BTC", + "MZC" + ], + "minimalOrder": { + "amount": 0.0001, + "unit": "asset" + } + }, + { + "pair": [ + "BTC", + "N5X" + ], + "minimalOrder": { + "amount": 0.0001, + "unit": "asset" + } + }, + { + "pair": [ + "BTC", + "NAS" + ], + "minimalOrder": { + "amount": 0.0001, + "unit": "asset" + } + }, + { + "pair": [ + "BTC", + "NAUT" + ], + "minimalOrder": { + "amount": 0.0001, + "unit": "asset" + } + }, + { + "pair": [ + "BTC", + "NAV" + ], + "minimalOrder": { + "amount": 0.0001, + "unit": "asset" + } + }, + { + "pair": [ + "BTC", + "NBT" + ], + "minimalOrder": { + "amount": 0.0001, + "unit": "asset" + } + }, + { + "pair": [ + "BTC", + "NEOS" + ], + "minimalOrder": { + "amount": 0.0001, + "unit": "asset" + } + }, + { + "pair": [ + "BTC", + "NL" + ], + "minimalOrder": { + "amount": 0.0001, + "unit": "asset" + } + }, + { + "pair": [ + "BTC", + "NMC" + ], + "minimalOrder": { + "amount": 0.0001, + "unit": "asset" + } + }, + { + "pair": [ + "BTC", + "NOBL" + ], + "minimalOrder": { + "amount": 0.0001, + "unit": "asset" + } + }, + { + "pair": [ + "BTC", + "NOTE" + ], + "minimalOrder": { + "amount": 0.0001, + "unit": "asset" + } + }, + { + "pair": [ + "BTC", + "NOXT" + ], + "minimalOrder": { + "amount": 0.0001, + "unit": "asset" + } + }, + { + "pair": [ + "BTC", + "NRS" + ], + "minimalOrder": { + "amount": 0.0001, + "unit": "asset" + } + }, + { + "pair": [ + "BTC", + "NSR" + ], + "minimalOrder": { + "amount": 0.0001, + "unit": "asset" + } + }, + { + "pair": [ + "BTC", + "NTX" + ], + "minimalOrder": { + "amount": 0.0001, + "unit": "asset" + } + }, + { + "pair": [ + "BTC", + "NXT" + ], + "minimalOrder": { + "amount": 0.0001, + "unit": "asset" + } + }, + { + "pair": [ + "BTC", + "NXTI" + ], + "minimalOrder": { + "amount": 0.0001, + "unit": "asset" + } + }, + { + "pair": [ + "BTC", + "OMG" + ], + "minimalOrder": { + "amount": 0.0001, + "unit": "asset" + } + }, + { + "pair": [ + "BTC", + "OMNI" + ], + "minimalOrder": { + "amount": 0.0001, + "unit": "asset" + } + }, + { + "pair": [ + "BTC", + "OPAL" + ], + "minimalOrder": { + "amount": 0.0001, + "unit": "asset" + } + }, + { + "pair": [ + "BTC", + "PAND" + ], + "minimalOrder": { + "amount": 0.0001, + "unit": "asset" + } + }, + { + "pair": [ + "BTC", + "PASC" + ], + "minimalOrder": { + "amount": 0.0001, + "unit": "asset" + } + }, + { + "pair": [ + "BTC", + "PAWN" + ], + "minimalOrder": { + "amount": 0.0001, + "unit": "asset" + } + }, + { + "pair": [ + "BTC", + "PIGGY" + ], + "minimalOrder": { + "amount": 0.0001, + "unit": "asset" + } + }, + { + "pair": [ + "BTC", + "PINK" + ], + "minimalOrder": { + "amount": 0.0001, + "unit": "asset" + } + }, + { + "pair": [ + "BTC", + "PLX" + ], + "minimalOrder": { + "amount": 0.0001, + "unit": "asset" + } + }, + { + "pair": [ + "BTC", + "PMC" + ], + "minimalOrder": { + "amount": 0.0001, + "unit": "asset" + } + }, + { + "pair": [ + "BTC", + "POT" + ], + "minimalOrder": { + "amount": 0.0001, + "unit": "asset" + } + }, + { + "pair": [ + "BTC", + "PPC" + ], + "minimalOrder": { + "amount": 0.0001, + "unit": "asset" + } + }, + { + "pair": [ + "BTC", + "PRC" + ], + "minimalOrder": { + "amount": 0.0001, + "unit": "asset" + } + }, + { + "pair": [ + "BTC", + "PRT" + ], + "minimalOrder": { + "amount": 0.0001, + "unit": "asset" + } + }, + { + "pair": [ + "BTC", + "PTS" + ], + "minimalOrder": { + "amount": 0.0001, + "unit": "asset" + } + }, + { + "pair": [ + "BTC", + "Q2C" + ], + "minimalOrder": { + "amount": 0.0001, + "unit": "asset" + } + }, + { + "pair": [ + "BTC", + "QBK" + ], + "minimalOrder": { + "amount": 0.0001, + "unit": "asset" + } + }, + { + "pair": [ + "BTC", + "QCN" + ], + "minimalOrder": { + "amount": 0.0001, + "unit": "asset" + } + }, + { + "pair": [ + "BTC", + "QORA" + ], + "minimalOrder": { + "amount": 0.0001, + "unit": "asset" + } + }, + { + "pair": [ + "BTC", + "QTL" + ], + "minimalOrder": { + "amount": 0.0001, + "unit": "asset" + } + }, + { + "pair": [ + "BTC", + "RADS" + ], + "minimalOrder": { + "amount": 0.0001, + "unit": "asset" + } + }, + { + "pair": [ + "BTC", + "RBY" + ], + "minimalOrder": { + "amount": 0.0001, + "unit": "asset" + } + }, + { + "pair": [ + "BTC", + "RDD" + ], + "minimalOrder": { + "amount": 0.0001, + "unit": "asset" + } + }, + { + "pair": [ + "BTC", + "REP" + ], + "minimalOrder": { + "amount": 0.0001, + "unit": "asset" + } + }, + { + "pair": [ + "BTC", + "RIC" + ], + "minimalOrder": { + "amount": 0.0001, + "unit": "asset" + } + }, + { + "pair": [ + "BTC", + "RZR" + ], + "minimalOrder": { + "amount": 0.0001, + "unit": "asset" + } + }, + { + "pair": [ + "BTC", + "SBD" + ], + "minimalOrder": { + "amount": 0.0001, + "unit": "asset" + } + }, + { + "pair": [ + "BTC", + "SC" + ], + "minimalOrder": { + "amount": 0.0001, + "unit": "asset" + } + }, + { + "pair": [ + "BTC", + "SDC" + ], + "minimalOrder": { + "amount": 0.0001, + "unit": "asset" + } + }, + { + "pair": [ + "BTC", + "SHIBE" + ], + "minimalOrder": { + "amount": 0.0001, + "unit": "asset" + } + }, + { + "pair": [ + "BTC", + "SHOPX" + ], + "minimalOrder": { + "amount": 0.0001, + "unit": "asset" + } + }, + { + "pair": [ + "BTC", + "SILK" + ], + "minimalOrder": { + "amount": 0.0001, + "unit": "asset" + } + }, + { + "pair": [ + "BTC", + "SJCX" + ], + "minimalOrder": { + "amount": 0.0001, + "unit": "asset" + } + }, + { + "pair": [ + "BTC", + "SLR" + ], + "minimalOrder": { + "amount": 0.0001, + "unit": "asset" + } + }, + { + "pair": [ + "BTC", + "SMC" + ], + "minimalOrder": { + "amount": 0.0001, + "unit": "asset" + } + }, + { + "pair": [ + "BTC", + "SOC" + ], + "minimalOrder": { + "amount": 0.0001, + "unit": "asset" + } + }, + { + "pair": [ + "BTC", + "SPA" + ], + "minimalOrder": { + "amount": 0.0001, + "unit": "asset" + } + }, + { + "pair": [ + "BTC", + "SQL" + ], + "minimalOrder": { + "amount": 0.0001, + "unit": "asset" + } + }, + { + "pair": [ + "BTC", + "SRCC" + ], + "minimalOrder": { + "amount": 0.0001, + "unit": "asset" + } + }, + { + "pair": [ + "BTC", + "SRG" + ], + "minimalOrder": { + "amount": 0.0001, + "unit": "asset" + } + }, + { + "pair": [ + "BTC", + "SSD" + ], + "minimalOrder": { + "amount": 0.0001, + "unit": "asset" + } + }, + { + "pair": [ + "BTC", + "STEEM" + ], + "minimalOrder": { + "amount": 0.0001, + "unit": "asset" + } + }, + { + "pair": [ + "BTC", + "STR" + ], + "minimalOrder": { + "amount": 0.0001, + "unit": "asset" + } + }, + { + "pair": [ + "BTC", + "SUM" + ], + "minimalOrder": { + "amount": 0.0001, + "unit": "asset" + } + }, + { + "pair": [ + "BTC", + "SUN" + ], + "minimalOrder": { + "amount": 0.0001, + "unit": "asset" + } + }, + { + "pair": [ + "BTC", + "SWARM" + ], + "minimalOrder": { + "amount": 0.0001, + "unit": "asset" + } + }, + { + "pair": [ + "BTC", + "SXC" + ], + "minimalOrder": { + "amount": 0.0001, + "unit": "asset" + } + }, + { + "pair": [ + "BTC", + "SYNC" + ], + "minimalOrder": { + "amount": 0.0001, + "unit": "asset" + } + }, + { + "pair": [ + "BTC", + "SYS" + ], + "minimalOrder": { + "amount": 0.0001, + "unit": "asset" + } + }, + { + "pair": [ + "BTC", + "TAC" + ], + "minimalOrder": { + "amount": 0.0001, + "unit": "asset" + } + }, + { + "pair": [ + "BTC", + "TOR" + ], + "minimalOrder": { + "amount": 0.0001, + "unit": "asset" + } + }, + { + "pair": [ + "BTC", + "TRUST" + ], + "minimalOrder": { + "amount": 0.0001, + "unit": "asset" + } + }, + { + "pair": [ + "BTC", + "TWE" + ], + "minimalOrder": { + "amount": 0.0001, + "unit": "asset" + } + }, + { + "pair": [ + "BTC", + "UIS" + ], + "minimalOrder": { + "amount": 0.0001, + "unit": "asset" + } + }, + { + "pair": [ + "BTC", + "ULTC" + ], + "minimalOrder": { + "amount": 0.0001, + "unit": "asset" + } + }, + { + "pair": [ + "BTC", + "UNITY" + ], + "minimalOrder": { + "amount": 0.0001, + "unit": "asset" + } + }, + { + "pair": [ + "BTC", + "URO" + ], + "minimalOrder": { + "amount": 0.0001, + "unit": "asset" + } + }, + { + "pair": [ + "BTC", + "USDE" + ], + "minimalOrder": { + "amount": 0.0001, + "unit": "asset" + } + }, + { + "pair": [ + "BTC", + "USDT" + ], + "minimalOrder": { + "amount": 0.0001, + "unit": "asset" + } + }, + { + "pair": [ + "BTC", + "UTC" + ], + "minimalOrder": { + "amount": 0.0001, + "unit": "asset" + } + }, + { + "pair": [ + "BTC", + "UTIL" + ], + "minimalOrder": { + "amount": 0.0001, + "unit": "asset" + } + }, + { + "pair": [ + "BTC", + "UVC" + ], + "minimalOrder": { + "amount": 0.0001, + "unit": "asset" + } + }, + { + "pair": [ + "BTC", + "VIA" + ], + "minimalOrder": { + "amount": 0.0001, + "unit": "asset" + } + }, + { + "pair": [ + "BTC", + "VOOT" + ], + "minimalOrder": { + "amount": 0.0001, + "unit": "asset" + } + }, + { + "pair": [ + "BTC", + "VOX" + ], + "minimalOrder": { + "amount": 0.0001, + "unit": "asset" + } + }, + { + "pair": [ + "BTC", + "VRC" + ], + "minimalOrder": { + "amount": 0.0001, + "unit": "asset" + } + }, + { + "pair": [ + "BTC", + "VTC" + ], + "minimalOrder": { + "amount": 0.0001, + "unit": "asset" + } + }, + { + "pair": [ + "BTC", + "WC" + ], + "minimalOrder": { + "amount": 0.0001, + "unit": "asset" + } + }, + { + "pair": [ + "BTC", + "WDC" + ], + "minimalOrder": { + "amount": 0.0001, + "unit": "asset" + } + }, + { + "pair": [ + "BTC", + "WIKI" + ], + "minimalOrder": { + "amount": 0.0001, + "unit": "asset" + } + }, + { + "pair": [ + "BTC", + "WOLF" + ], + "minimalOrder": { + "amount": 0.0001, + "unit": "asset" + } + }, + { + "pair": [ + "BTC", + "X13" + ], + "minimalOrder": { + "amount": 0.0001, + "unit": "asset" + } + }, + { + "pair": [ + "BTC", + "XAI" + ], + "minimalOrder": { + "amount": 0.0001, + "unit": "asset" + } + }, + { + "pair": [ + "BTC", + "XAP" + ], + "minimalOrder": { + "amount": 0.0001, + "unit": "asset" + } + }, + { + "pair": [ + "BTC", + "XBC" + ], + "minimalOrder": { + "amount": 0.0001, + "unit": "asset" + } + }, + { + "pair": [ + "BTC", + "XC" + ], + "minimalOrder": { + "amount": 0.0001, + "unit": "asset" + } + }, + { + "pair": [ + "BTC", + "XCH" + ], + "minimalOrder": { + "amount": 0.0001, + "unit": "asset" + } + }, + { + "pair": [ + "BTC", + "XCN" + ], + "minimalOrder": { + "amount": 0.0001, + "unit": "asset" + } + }, + { + "pair": [ + "BTC", + "XCP" + ], + "minimalOrder": { + "amount": 0.0001, + "unit": "asset" + } + }, + { + "pair": [ + "BTC", + "XCR" + ], + "minimalOrder": { + "amount": 0.0001, + "unit": "asset" + } + }, + { + "pair": [ + "BTC", + "XDN" + ], + "minimalOrder": { + "amount": 0.0001, + "unit": "asset" + } + }, + { + "pair": [ + "BTC", + "XDP" + ], + "minimalOrder": { + "amount": 0.0001, + "unit": "asset" + } + }, + { + "pair": [ + "BTC", + "XEM" + ], + "minimalOrder": { + "amount": 0.0001, + "unit": "asset" + } + }, + { + "pair": [ + "BTC", + "XHC" + ], + "minimalOrder": { + "amount": 0.0001, + "unit": "asset" + } + }, + { + "pair": [ + "BTC", + "XLB" + ], + "minimalOrder": { + "amount": 0.0001, + "unit": "asset" + } + }, + { + "pair": [ + "BTC", + "XMG" + ], + "minimalOrder": { + "amount": 0.0001, + "unit": "asset" + } + }, + { + "pair": [ + "BTC", + "XMR" + ], + "minimalOrder": { + "amount": 0.0001, + "unit": "asset" + } + }, + { + "pair": [ + "BTC", + "XPB" + ], + "minimalOrder": { + "amount": 0.0001, + "unit": "asset" + } + }, + { + "pair": [ + "BTC", + "XPM" + ], + "minimalOrder": { + "amount": 0.0001, + "unit": "asset" + } + }, + { + "pair": [ + "BTC", + "XRP" + ], + "minimalOrder": { + "amount": 0.0001, + "unit": "asset" + } + }, + { + "pair": [ + "BTC", + "XSI" + ], + "minimalOrder": { + "amount": 0.0001, + "unit": "asset" + } + }, + { + "pair": [ + "BTC", + "XST" + ], + "minimalOrder": { + "amount": 0.0001, + "unit": "asset" + } + }, + { + "pair": [ + "BTC", + "XSV" + ], + "minimalOrder": { + "amount": 0.0001, + "unit": "asset" + } + }, + { + "pair": [ + "BTC", + "XUSD" + ], + "minimalOrder": { + "amount": 0.0001, + "unit": "asset" + } + }, + { + "pair": [ + "BTC", + "XVC" + ], + "minimalOrder": { + "amount": 0.0001, + "unit": "asset" + } + }, + { + "pair": [ + "BTC", + "XXC" + ], + "minimalOrder": { + "amount": 0.0001, + "unit": "asset" + } + }, + { + "pair": [ + "BTC", + "YACC" + ], + "minimalOrder": { + "amount": 0.0001, + "unit": "asset" + } + }, + { + "pair": [ + "BTC", + "YANG" + ], + "minimalOrder": { + "amount": 0.0001, + "unit": "asset" + } + }, + { + "pair": [ + "BTC", + "YC" + ], + "minimalOrder": { + "amount": 0.0001, + "unit": "asset" + } + }, + { + "pair": [ + "BTC", + "YIN" + ], + "minimalOrder": { + "amount": 0.0001, + "unit": "asset" + } + }, + { + "pair": [ + "BTC", + "ZEC" + ], + "minimalOrder": { + "amount": 0.0001, + "unit": "asset" + } + }, + { + "pair": [ + "BTC", + "ZRX" + ], + "minimalOrder": { + "amount": 0.0001, + "unit": "asset" + } + }, + { + "pair": [ + "USDT", + "BTC" + ], + "minimalOrder": { + "amount": 0.0001, + "unit": "asset" + } + }, + { + "pair": [ + "USDT", + "BCH" + ], + "minimalOrder": { + "amount": 0.0001, + "unit": "asset" + } + }, + { + "pair": [ + "USDT", + "DASH" + ], + "minimalOrder": { + "amount": 0.0001, + "unit": "asset" + } + }, + { + "pair": [ + "USDT", + "ETC" + ], + "minimalOrder": { + "amount": 0.0001, + "unit": "asset" + } + }, + { + "pair": [ + "USDT", + "ETH" + ], + "minimalOrder": { + "amount": 0.0001, + "unit": "asset" + } + }, + { + "pair": [ + "USDT", + "LTC" + ], + "minimalOrder": { + "amount": 0.0001, + "unit": "asset" + } + }, + { + "pair": [ + "USDT", + "NXT" + ], + "minimalOrder": { + "amount": 0.0001, + "unit": "asset" + } + }, + { + "pair": [ + "USDT", + "REP" + ], + "minimalOrder": { + "amount": 0.0001, + "unit": "asset" + } + }, + { + "pair": [ + "USDT", + "STR" + ], + "minimalOrder": { + "amount": 0.0001, + "unit": "asset" + } + }, + { + "pair": [ + "USDT", + "XMR" + ], + "minimalOrder": { + "amount": 0.0001, + "unit": "asset" + } + }, + { + "pair": [ + "USDT", + "XRP" + ], + "minimalOrder": { + "amount": 0.0001, + "unit": "asset" + } + }, + { + "pair": [ + "USDT", + "ZEC" + ], + "minimalOrder": { + "amount": 0.0001, + "unit": "asset" + } + }, + { + "pair": [ + "ETH", + "CVC" + ], + "minimalOrder": { + "amount": 0.0001, + "unit": "asset" + } + }, + { + "pair": [ + "ETH", + "ETC" + ], + "minimalOrder": { + "amount": 0.0001, + "unit": "asset" + } + }, + { + "pair": [ + "ETH", + "BCH" + ], + "minimalOrder": { + "amount": 0.0001, + "unit": "asset" + } + }, + { + "pair": [ + "ETH", + "GAS" + ], + "minimalOrder": { + "amount": 0.0001, + "unit": "asset" + } + }, + { + "pair": [ + "ETH", + "GNO" + ], + "minimalOrder": { + "amount": 0.0001, + "unit": "asset" + } + }, + { + "pair": [ + "ETH", + "GNT" + ], + "minimalOrder": { + "amount": 0.0001, + "unit": "asset" + } + }, + { + "pair": [ + "ETH", + "LSK" + ], + "minimalOrder": { + "amount": 0.0001, + "unit": "asset" + } + }, + { + "pair": [ + "ETH", + "OMG" + ], + "minimalOrder": { + "amount": 0.0001, + "unit": "asset" + } + }, + { + "pair": [ + "ETH", + "REP" + ], + "minimalOrder": { + "amount": 0.0001, + "unit": "asset" + } + }, + { + "pair": [ + "ETH", + "STEEM" + ], + "minimalOrder": { + "amount": 0.0001, + "unit": "asset" + } + }, + { + "pair": [ + "ETH", + "ZEC" + ], + "minimalOrder": { + "amount": 0.0001, + "unit": "asset" + } + }, + { + "pair": [ + "ETH", + "ZRX" + ], + "minimalOrder": { + "amount": 0.0001, + "unit": "asset" + } + }, + { + "pair": [ + "XMR", + "BCN" + ], + "minimalOrder": { + "amount": 0.0001, + "unit": "asset" + } + }, + { + "pair": [ + "XMR", + "BLK" + ], + "minimalOrder": { + "amount": 0.0001, + "unit": "asset" + } + }, + { + "pair": [ + "XMR", + "BTCD" + ], + "minimalOrder": { + "amount": 0.0001, + "unit": "asset" + } + }, + { + "pair": [ + "XMR", + "DASH" + ], + "minimalOrder": { + "amount": 0.0001, + "unit": "asset" + } + }, + { + "pair": [ + "XMR", + "LTC" + ], + "minimalOrder": { + "amount": 0.0001, + "unit": "asset" + } + }, + { + "pair": [ + "XMR", + "MAID" + ], + "minimalOrder": { + "amount": 0.0001, + "unit": "asset" + } + }, + { + "pair": [ + "XMR", + "NXT" + ], + "minimalOrder": { + "amount": 0.0001, + "unit": "asset" + } + }, + { + "pair": [ + "XMR", + "ZEC" + ], + "minimalOrder": { + "amount": 0.0001, + "unit": "asset" + } + } + ] +} \ No newline at end of file diff --git a/exchange/wrappers/poloniex.js b/exchange/wrappers/poloniex.js new file mode 100644 index 000000000..ac6e5d17a --- /dev/null +++ b/exchange/wrappers/poloniex.js @@ -0,0 +1,433 @@ +const Poloniex = require("poloniex.js"); +const _ = require('lodash'); +const moment = require('moment'); +const retry = require('../exchangeUtils').retry; +const marketData = require('./poloniex-markets.json'); + +const Trader = function(config) { + _.bindAll(this); + if(_.isObject(config)) { + this.key = config.key; + this.secret = config.secret; + this.currency = config.currency; + this.asset = config.asset; + } + this.name = 'Poloniex'; + this.balance; + this.price; + + this.pair = this.currency + '_' + this.asset; + + this.poloniex = new Poloniex(this.key, this.secret); +} + +const recoverableErrors = [ + 'SOCKETTIMEDOUT', + 'TIMEDOUT', + 'CONNRESET', + 'CONNREFUSED', + 'NOTFOUND', + '429', + '522', + '504', + '503', + '500', + '502', + 'Empty response', + 'Please try again in a few minutes.', + 'Nonce must be greater than', + 'Internal error. Please try again.', + 'Connection timed out. Please try again.' +]; + +// errors that might mean +// the API call succeeded. +const unknownResultErrors = [ + 'ETIMEDOUT', +] + +const includes = (str, list) => { + if(!_.isString(str)) + return false; + + return _.some(list, item => str.includes(item)); +} + +Trader.prototype.processResponse = function(next, fn, payload) { + // TODO: in very rare cases the callback is + // called twice (first on ETIMEDOUT later + // without error). Temp workaround. + next = _.once(next); + + return (err, data) => { + let error; + + if(err) { + if(err.message) { + error = err; + } else { + error = new Error(err); + } + } else if(!data) { + error = new Error('Empty response'); + } else if(data.error) { + error = new Error(data.error); + } else if(includes(data, ['Please complete the security check to proceed.'])) { + error = new Error( + 'Your IP has been flagged by CloudFlare. ' + + 'As such Gekko Broker cannot access Poloniex.' + ); + data = undefined; + } else if(includes(data, ['Please try again in a few minutes.'])) { + error = new Error('Please try again in a few minutes.'); + error.notFatal = true; + data = undefined; + } else if(includes(data, [''])) { + error = new Error(data); + data = undefined; + } + + if(error) { + + if(includes(error.message, recoverableErrors)) { + error.notFatal = true; + } + + // not actually an error, means order never executed against other trades + if(fn === 'getOrder' && + error.message.includes('Order not found, or you are not the person who placed it.') + ) { + error = undefined; + data = { unfilled: true }; + console.log(new Date, 'UNKNOWN ORDER!', payload); + process.exit(); + } + + if(fn === 'cancelOrder') { + + // already filled + if(includes(error.message, ['Invalid order number, or you are not the person who placed the order.'])) { + console.log(new Date, 'cancelOrder invalid order'); + error = undefined; + data = { filled: true }; + } + + // it might be cancelled + else if(includes(error.message, unknownResultErrors)) { + setTimeout(() => { + this.getOpenOrders((err, orders) => { + if(err) { + return next(error); + } + + const order = _.find(orders, o => o.orderNumber == payload); + + // the cancel did not work since the order still exists + if(order) { + error.notFatal = true; + return next(error); + } + + next(undefined, {success: 1}); + }); + }, this.checkInterval); + return; + } + } + + if(fn === 'order') { + + if(includes(error.message, ['Not enough'])) { + error.retry = 2; + } + + // we need to check whether the order was actually created + if(includes(error.message, unknownResultErrors)) { + return setTimeout(() => { + this.findLastOrder(2, payload, (err, lastTrade) => { + if(lastTrade) { + return next(undefined, lastTrade); + } + + next(error); + }); + + }, this.checkInterval); + } + } + } + + return next(error, data); + } +} + +Trader.prototype.findLastOrder = function(since, side, callback) { + const handle = (err, result) => { + if(err) { + return callback(err); + } + + result = result.filter(t => t.type === side); + + if(!result.length) { + return callback(undefined, undefined); + } + + let order; + if(since) { + const threshold = moment().subtract(since, 'm'); + order = _.find(result, o => moment.utc(o.date) > threshold); + } else { + order = _.last(result); + } + + callback(undefined, order); + }; + + const fetch = next => this.poloniex.getOpenOrders(this.processResponse(next)); + retry(null, fetch, handle); +} + +Trader.prototype.getOpenOrders = function(callback) { + const fetch = next => this.poloniex.returnOpenOrders(this.currency, this.asset, this.processResponse(next)); + retry(null, fetch, callback); +} + +Trader.prototype.getPortfolio = function(callback) { + const handle = (err, data) => { + if(err) { + return callback(err); + } + + var assetAmount = parseFloat( data[this.asset] ); + var currencyAmount = parseFloat( data[this.currency] ); + + if( + !_.isNumber(assetAmount) || _.isNaN(assetAmount) || + !_.isNumber(currencyAmount) || _.isNaN(currencyAmount) + ) { + assetAmount = 0; + currencyAmount = 0; + } + + var portfolio = [ + { name: this.asset, amount: assetAmount }, + { name: this.currency, amount: currencyAmount } + ]; + + callback(undefined, portfolio); + } + + const fetch = next => this.poloniex.myBalances(this.processResponse(next)); + retry(null, fetch, handle); +} + +Trader.prototype.getTicker = function(callback) { + const handle = (err, data) => { + if(err) + return callback(err); + + var tick = data[this.pair]; + + callback(null, { + bid: parseFloat(tick.highestBid), + ask: parseFloat(tick.lowestAsk), + }); + }; + + + const fetch = next => this.poloniex.getTicker(this.processResponse(next)); + retry(null, fetch, handle); +} + +Trader.prototype.getFee = function(callback) { + const handle = (err, data) => { + if(err) + return callback(err); + + callback(undefined, parseFloat(data.makerFee)); + } + + const fetch = next => this.poloniex._private('returnFeeInfo', this.processResponse(next)); + retry(null, fetch, handle); +} + +Trader.prototype.roundAmount = function(amount) { + return _.floor(amount, 8); +} + +Trader.prototype.roundPrice = function(price) { + return +price; +} + +Trader.prototype.createOrder = function(side, amount, price, callback) { + const handle = (err, result) => { + if(err) { + return callback(err); + } + + callback(undefined, result.orderNumber); + } + + const fetch = next => { + this.poloniex[side](this.currency, this.asset, price, amount, this.processResponse(next, 'order', side)) + }; + retry(null, fetch, handle); +} + +Trader.prototype.buy = function(amount, price, callback) { + this.createOrder('buy', amount, price, callback); +} + +Trader.prototype.sell = function(amount, price, callback) { + this.createOrder('sell', amount, price, callback); +} + +Trader.prototype.checkOrder = function(id, callback) { + const handle = (err, result) => { + + if(err) { + return callback(err); + } + + if(result.completed) { + return callback(undefined, { executed: true, open: false }); + } + + const order = _.find(result, function(o) { return o.orderNumber === id }); + if(!order) { + // if the order is not open it's fully executed + return callback(undefined, { executed: true, open: false }); + } + + callback(undefined, { executed: false, open: true, filledAmount: order.startingAmount - order.amount }); + } + + const fetch = next => this.poloniex.myOpenOrders(this.currency, this.asset, this.processResponse(next, 'checkOrder')); + retry(null, fetch, handle); +} + +Trader.prototype.getOrder = function(order, callback) { + const handle = (err, result) => { + if(err) + return callback(err); + + let price = 0; + let amount = 0; + let date = moment(0); + + if(result.unfilled) { + return callback(null, {price, amount, date}); + } + + _.each(result, trade => { + date = moment(trade.date); + price = ((price * amount) + (+trade.rate * trade.amount)) / (+trade.amount + amount); + amount += +trade.amount; + }); + + const fees = {}; + const feePercent = _.first(result).fee; + + if(_.first(result).type === 'sell') { + const fee = price * amount * _.first(result).fee; + fees[this.currency] = fee; + } else { + const fee = amount * _.first(result).fee; + fees[this.asset] = fee; + } + + callback(err, {price, amount, date, fees, feePercent}); + }; + + const fetch = next => this.poloniex.returnOrderTrades(order, this.processResponse(next, 'getOrder', order)); + retry(null, fetch, handle); +} + +Trader.prototype.cancelOrder = function(order, callback) { + const handle = (err, result) => { + if(err) { + return callback(err); + } + + if(result.filled) { + return callback(undefined, true); + } + + if(!result.success) { + return callback(undefined, false); + } + + let data; + + if(result.amount) { + data = { remaining: result.amount }; + } + + callback(undefined, false, data); + }; + + const fetch = next => this.poloniex.cancelOrder(this.currency, this.asset, order, this.processResponse(next, 'cancelOrder', order)); + retry(null, fetch, handle); +} + +Trader.prototype.getTrades = function(since, callback, descending) { + + const firstFetch = !!since; + const args = _.toArray(arguments); + + const handle = (err, result) => { + if(err) + return callback(err); + + // Edge case, see here: + // @link https://github.com/askmike/gekko/issues/479 + if(firstFetch && _.size(result) === 50000) + return callback( + [ + 'Poloniex did not provide enough data. Read this:', + 'https://github.com/askmike/gekko/issues/479' + ].join('\n\n') + ); + + result = _.map(result, function(trade) { + return { + tid: trade.tradeID, + amount: +trade.amount, + date: moment.utc(trade.date).unix(), + price: +trade.rate + }; + }); + + callback(null, result.reverse()); + }; + + var params = { + currencyPair: this.pair + } + + if(since) + params.start = since.unix(); + + const fetch = next => this.poloniex._public('returnTradeHistory', params, this.processResponse(next, 'getTrades', since)); + retry(null, fetch, handle); +} + +Trader.getCapabilities = function () { + return { + name: 'Poloniex', + slug: 'poloniex', + currencies: marketData.currencies, + assets: marketData.assets, + markets: marketData.markets, + currencyMinimums: {BTC: 0.0001, ETH: 0.0001, XMR: 0.0001, USDT: 1.0}, + requires: ['key', 'secret'], + tid: 'tid', + providesHistory: 'date', + providesFullHistory: true, + tradable: true, + gekkoBroker: 0.6 + }; +} + +module.exports = Trader; diff --git a/exchanges/quadriga-markets.json b/exchange/wrappers/quadriga-markets.json similarity index 100% rename from exchanges/quadriga-markets.json rename to exchange/wrappers/quadriga-markets.json diff --git a/exchanges/quadriga.js b/exchange/wrappers/quadriga.js.old similarity index 84% rename from exchanges/quadriga.js rename to exchange/wrappers/quadriga.js.old index bbeef9eaa..d462dc815 100644 --- a/exchanges/quadriga.js +++ b/exchange/wrappers/quadriga.js.old @@ -1,10 +1,9 @@ -const QuadrigaCX = require('quadrigacx'); -const moment = require('moment'); -const _ = require('lodash'); +var QuadrigaCX = require('quadrigacx'); +var moment = require('moment'); +var util = require('../core/util'); +var _ = require('lodash'); +var log = require('../core/log'); -const util = require('../core/util'); -const log = require('../core/log'); -const marketData = require('./quadriga-markets.json'); var Trader = function(config) { _.bindAll(this); @@ -13,18 +12,14 @@ var Trader = function(config) { this.key = config.key; this.secret = config.secret; this.clientId = config.username; - this.asset = config.asset.toUpperCase(); - this.currency = config.currency.toUpperCase(); + this.asset = config.asset; + this.currency = config.currency; } - + + this.pair = this.asset.toLowerCase() + '_' + this.currency.toLowerCase(); this.name = 'quadriga'; this.since = null; - this.market = _.find(Trader.getCapabilities().markets, (market) => { - return market.pair[0] === this.currency && market.pair[1] === this.asset - }); - this.pair = this.market.book; - this.quadriga = new QuadrigaCX( this.clientId ? this.clientId : "1", this.key ? this.key : "", @@ -142,13 +137,11 @@ Trader.prototype.getTicker = function(callback) { Trader.prototype.roundAmount = function(amount) { var precision = 100000000; - - var parent = this; - var market = Trader.getCapabilities().markets.find(function(market){ return market.pair[0] === parent.currency && market.pair[1] === parent.asset }); + var market = Trader.getCapabilities().markets.find(function(market){ return market.pair[0] === this.currency && market.pair[1] === this.asset }); if(Number.isInteger(market.precision)) - precision = Math.pow(10, market.precision); - + precision = 10 * market.precision; + amount *= precision; amount = Math.floor(amount); amount /= precision; @@ -194,7 +187,7 @@ Trader.prototype.getOrder = function(order, callback) { callback(undefined, {price, amount, date}); }.bind(this); - this.quadriga.api('lookup_order', {id: order}, get); + this.quadriga.api('lookup_oder', {id: order}, get); } Trader.prototype.buy = function(amount, price, callback) { @@ -238,9 +231,16 @@ Trader.getCapabilities = function () { return { name: 'Quadriga', slug: 'quadriga', - currencies: marketData.currencies, - assets: marketData.assets, - markets: marketData.markets, + currencies: ['CAD', 'USD', 'BTC'], + assets: ['BTC', 'ETH', 'LTC', 'BCH'], + markets: [ + { pair: ['BTC', 'ETH'], minimalOrder: { amount: 0.00001, unit: 'asset' }, precision: 8 }, + { pair: ['CAD', 'ETH'], minimalOrder: { amount: 0.00001, unit: 'asset' }, precision: 8 }, + { pair: ['USD', 'BTC'], minimalOrder: { amount: 0.00001, unit: 'asset' }, precision: 8 }, + { pair: ['CAD', 'BTC'], minimalOrder: { amount: 0.00001, unit: 'asset' }, precision: 8 }, + { pair: ['CAD', 'LTC'], minimalOrder: { amount: 0.00001, unit: 'asset' }, precision: 8 }, + { pair: ['CAD', 'BCH'], minimalOrder: { amount: 0.00001, unit: 'asset' }, precision: 8 }, + ], requires: ['key', 'secret', 'username'], providesHistory: false, tid: 'tid', diff --git a/exchanges/wex.nz.js b/exchange/wrappers/wex.nz.js.old similarity index 100% rename from exchanges/wex.nz.js rename to exchange/wrappers/wex.nz.js.old diff --git a/exchanges/zaif.jp.js b/exchange/wrappers/zaif.jp.js.old similarity index 100% rename from exchanges/zaif.jp.js rename to exchange/wrappers/zaif.jp.js.old diff --git a/exchanges/coinfalcon.js b/exchanges/coinfalcon.js deleted file mode 100644 index 0df5b7aba..000000000 --- a/exchanges/coinfalcon.js +++ /dev/null @@ -1,252 +0,0 @@ -const moment = require('moment'); -const util = require('../core/util'); -const _ = require('lodash'); -const log = require('../core/log'); -const marketData = require('./coinfalcon-markets.json'); - -const CoinFalcon = require('coinfalcon'); - -var Trader = function(config) { - _.bindAll(this); - - if (_.isObject(config)) { - this.key = config.key; - this.secret = config.secret; - this.currency = config.currency.toUpperCase(); - this.asset = config.asset.toUpperCase(); - } - - this.pair = this.asset + '-' + this.currency; - this.name = 'coinfalcon'; - - this.coinfalcon = new CoinFalcon.Client(this.key, this.secret); -}; - -var recoverableErrors = new RegExp( - /(SOCKETTIMEDOUT|TIMEDOUT|CONNRESET|CONNREFUSED|NOTFOUND|429|522)/ -); - -Trader.prototype.retry = function(method, args, error) { - var self = this; - // make sure the callback (and any other fn) is bound to Trader - _.each(args, function(arg, i) { - if (_.isFunction(arg)) { - args[i] = _.bind(arg, self); - } - }); - - log.debug('[CoinFalcon] ', this.name, "Retrying..."); - - if (!error || !error.message.match(recoverableErrors)) { - log.error('[CoinFalcon] ', this.name, 'returned an irrecoverable error'); - _.each(args, function(arg, i) { - if (_.isFunction(arg)) { - arg(error, null); - return; - } - }); - return; - } - - var wait = +moment.duration(5, 'seconds'); - - // run the failed method again with the same arguments after wait - setTimeout(function() { - method.apply(self, args); - }, wait); -}; - -Trader.prototype.getTicker = function(callback) { - var success = function(res) { - callback(null, {bid: +res.data.bids[0].price, ask: +res.data.asks[0].price}) - }; - - var failure = function(err) { - log.error('[CoinFalcon] error getting ticker', err); - callback(err, null); - }; - - var url = "markets/" + this.pair + "/orders?level=1" - - this.coinfalcon.get(url).then(success).catch(failure); -}; - -Trader.prototype.getFee = function(callback) { - var fees = 0.25; // 0.25% for both sell & buy - callback(false, fees / 100); -}; - -Trader.prototype.getPortfolio = function(callback) { - var success = function(res) { - if (_.has(res, 'error')) { - var err = new Error(res.error); - callback(err, null); - } else { - var portfolio = res.data.map(function(account) { - return { - name: account.currency, - amount: parseFloat(account.available) - } - }); - callback(null, portfolio); - } - }; - - var failure = function(err) { - log.error('[CoinFalcon] error getting portfolio', err); - callback(err, null); - } - - this.coinfalcon.get('user/accounts').then(success).catch(failure); -}; - -Trader.prototype.addOrder = function(type, amount, price, callback) { - var args = _.toArray(arguments); - - var success = function(res) { - if (_.has(res, 'error')) { - var err = new Error(res.error); - failure(err); - } else { - callback(false, res.data.id) - } - }; - - var failure = function(err) { - log.error('[CoinFalcon] unable to ' + type.toLowerCase(), err); - return this.retry(this.addOrder, args, err); - }.bind(this); - - var payload = { - order_type: type, - operation_type: 'limit_order', - market: this.pair, - size: amount, - price: price - } - - this.coinfalcon.post('user/orders', payload).then(success).catch(failure); -}; - -['buy', 'sell'].map(function(type) { - Trader.prototype[type] = function(amount, price, callback) { - this.addOrder(type, amount, price, callback); - }; -}); - -Trader.prototype.getOrder = function(order, callback) { - var success = function(res) { - if (_.has(res, 'error')) { - var err = new Error(res.error); - failure(err); - } else { - var price = parseFloat(res.data.price); - var amount = parseFloat(res.data.size); - var date = moment(res.data.created_at); - callback(false, { price, amount, date }); - } - }; - - var failure = function(err) { - log.error('[CoinFalcon] unable to getOrder', err); - callback(err, null); - }.bind(this); - - this.coinfalcon.get('user/orders/' + order).then(success).catch(failure); -}; - -Trader.prototype.checkOrder = function(order, callback) { - var success = function(res) { - if (_.has(res, 'error')) { - var err = new Error(res.error); - failure(err); - } else { - var filled = res.data.status == "canceled" || res.data.status == "fulfilled"; - callback(false, filled); - } - }; - - var failure = function(err) { - log.error('[CoinFalcon] unable to checkOrder', err); - callback(err, null); - }.bind(this); - - this.coinfalcon.get('user/orders/' + order).then(success).catch(failure); -}; - -Trader.prototype.cancelOrder = function(order, callback) { - var args = _.toArray(arguments); - var success = function(res) { - if (_.has(res, 'error')) { - var err = new Error(res.error); - failure(err); - } else { - callback(false, res.data.id) - } - }; - - var failure = function(err) { - log.error('[CoinFalcon] unable to cancel', err); - return this.retry(this.cancelOrder, args, err); - }.bind(this); - - this.coinfalcon.delete('user/orders?id=' + order).then(success).catch(failure); -}; - -Trader.prototype.getTrades = function(since, callback, descending) { - var args = _.toArray(arguments); - - var success = function(res) { - var parsedTrades = []; - _.each( - res.data, - function(trade) { - parsedTrades.push({ - tid: moment(trade.created_at).unix(), // Saving unix timestamp in tid as CoinFalcon has string uuid which can not be compared in importer - date: moment(trade.created_at).unix(), - price: parseFloat(trade.price), - amount: parseFloat(trade.size), - }); - }, - this - ); - - if (descending) { - callback(null, parsedTrades); - } else { - callback(null, parsedTrades.reverse()); - } - }.bind(this); - - var failure = function (err) { - err = new Error(err); - log.error('[CoinFalcon] error getting trades', err); - return this.retry(this.getTrades, args, err); - }.bind(this); - - var url = "markets/" + this.pair + "/trades" - - if (since) { - url += '?since_time=' + (_.isString(since) ? since : since.toISOString()); - } - - this.coinfalcon.get(url).then(success).catch(failure); -}; - -Trader.getCapabilities = function () { - return { - name: 'CoinFalcon', - slug: 'coinfalcon', - assets: marketData.assets, - currencies: marketData.currencies, - markets: marketData.markets, - requires: ['key', 'secret'], - providesHistory: 'date', - providesFullHistory: true, - tid: 'tid', - tradable: true, - forceReorderDelay: false - }; -} - -module.exports = Trader; diff --git a/exchanges/kraken.js b/exchanges/kraken.js deleted file mode 100644 index 315a35330..000000000 --- a/exchanges/kraken.js +++ /dev/null @@ -1,275 +0,0 @@ -const Kraken = require('kraken-api-es5'); -const moment = require('moment'); -const _ = require('lodash'); - -const util = require('../core/util'); -const Errors = require('../core/error'); -const log = require('../core/log'); -const marketData = require('./kraken-markets.json'); - -var Trader = function(config) { - _.bindAll(this); - - if(_.isObject(config)) { - this.key = config.key; - this.secret = config.secret; - this.currency = config.currency.toUpperCase() - this.asset = config.asset.toUpperCase(); - } - - this.name = 'kraken'; - this.since = null; - - this.market = _.find(Trader.getCapabilities().markets, (market) => { - return market.pair[0] === this.currency && market.pair[1] === this.asset - }); - this.pair = this.market.book; - - this.kraken = new Kraken( - this.key, - this.secret, - {timeout: +moment.duration(60, 'seconds')} - ); -} - -var retryCritical = { - retries: 10, - factor: 1.2, - minTimeout: 1 * 1000, - maxTimeout: 30 * 1000 -}; - -var retryForever = { - forever: true, - factor: 1.2, - minTimeout: 10 * 1000, - maxTimeout: 30 * 1000 -}; - -var recoverableErrors = new RegExp(/(SOCKETTIMEDOUT|TIMEDOUT|CONNRESET|CONNREFUSED|NOTFOUND|API:Rate limit exceeded|API:Invalid nonce|Service:Unavailable|Request timed out|Response code 5)/) - -Trader.prototype.processError = function(funcName, error) { - if (!error) return undefined; - - if (!error.message.match(recoverableErrors)) { - log.error(`[kraken.js] (${funcName}) returned an irrecoverable error: ${error.message}`); - return new Errors.AbortError('[kraken.js] ' + error.message); - } - - log.debug(`[kraken.js] (${funcName}) returned an error, retrying: ${error.message}`); - return new Errors.RetryError('[kraken.js] ' + error.message); -}; - -Trader.prototype.handleResponse = function(funcName, callback) { - return (error, body) => { - if(!error) { - if(_.isEmpty(body) || !body.result) - error = new Error('NO DATA WAS RETURNED'); - - else if(!_.isEmpty(body.error)) - error = new Error(body.error); - } - - return callback(this.processError(funcName, error), body); - } -}; - -Trader.prototype.getTrades = function(since, callback, descending) { - var startTs = since ? moment(since).valueOf() : null; - - var processResults = function(err, trades) { - if (err) return callback(err); - - var parsedTrades = []; - _.each(trades.result[this.pair], function(trade) { - // Even when you supply 'since' you can still get more trades than you asked for, it needs to be filtered - if (_.isNull(startTs) || startTs < moment.unix(trade[2]).valueOf()) { - parsedTrades.push({ - tid: moment.unix(trade[2]).valueOf() * 1000000, - date: parseInt(Math.round(trade[2]), 10), - price: parseFloat(trade[0]), - amount: parseFloat(trade[1]) - }); - } - }, this); - - if(descending) - callback(undefined, parsedTrades.reverse()); - else - callback(undefined, parsedTrades); - }; - - let reqData = { - pair: this.pair - }; - - if(since) { - // Kraken wants a tid, which is found to be timestamp_ms * 1000000 in practice. No clear documentation on this though - reqData.since = startTs * 1000000; - } - - let handler = (cb) => this.kraken.api('Trades', reqData, this.handleResponse('getTrades', cb)); - util.retryCustom(retryForever, _.bind(handler, this), _.bind(processResults, this)); -}; - -Trader.prototype.getPortfolio = function(callback) { - var setBalance = function(err, data) { - if(err) return callback(err); - log.debug('[kraken.js] entering "setBalance" callback after kraken-api call, data:' , data); - - var assetAmount = parseFloat( data.result[this.market.prefixed[1]] ); - var currencyAmount = parseFloat( data.result[this.market.prefixed[0]] ); - - if(!_.isNumber(assetAmount) || _.isNaN(assetAmount)) { - log.error(`Kraken did not return portfolio for ${this.asset}, assuming 0.`); - assetAmount = 0; - } - - if(!_.isNumber(currencyAmount) || _.isNaN(currencyAmount)) { - log.error(`Kraken did not return portfolio for ${this.currency}, assuming 0.`); - currencyAmount = 0; - } - - var portfolio = [ - { name: this.asset, amount: assetAmount }, - { name: this.currency, amount: currencyAmount } - ]; - - return callback(undefined, portfolio); - }; - - let handler = (cb) => this.kraken.api('Balance', {}, this.handleResponse('getPortfolio', cb)); - util.retryCustom(retryForever, _.bind(handler, this), _.bind(setBalance, this)); -}; - -// This assumes that only limit orders are being placed with standard assets pairs -// It does not take into account volume discounts. -// Base maker fee is 0.16%, taker fee is 0.26%. -Trader.prototype.getFee = function(callback) { - const makerFee = 0.16; - callback(undefined, makerFee / 100); -}; - -Trader.prototype.getTicker = function(callback) { - var setTicker = function(err, data) { - if (err) return callback(err); - - var result = data.result[this.pair]; - var ticker = { - ask: result.a[0], - bid: result.b[0] - }; - callback(undefined, ticker); - }; - - let reqData = {pair: this.pair} - - let handler = (cb) => this.kraken.api('Ticker', reqData, this.handleResponse('getTicker', cb)); - util.retryCustom(retryForever, _.bind(handler, this), _.bind(setTicker, this)); -}; - -Trader.prototype.roundAmount = function(amount) { - // Prevent "You incorrectly entered one of fields." - // because of more than 8 decimals. - // Specific precision by pair https://blog.kraken.com/post/1278/announcement-reducing-price-precision-round-2 - - var precision = 100000000; - var parent = this; - var market = Trader.getCapabilities().markets.find(function(market){ return market.pair[0] === parent.currency && market.pair[1] === parent.asset }); - - if(Number.isInteger(market.precision)) - precision = Math.pow(10, market.precision); - - amount *= precision; - amount = Math.floor(amount); - amount /= precision; - return amount; -}; - -Trader.prototype.addOrder = function(tradeType, amount, price, callback) { - price = this.roundAmount(price); // only round price, not amount - - log.debug('[kraken.js] (addOrder)', tradeType.toUpperCase(), amount, this.asset, '@', price, this.currency); - - var setOrder = function(err, data) { - if(err) return callback(err); - - var txid = data.result.txid[0]; - log.debug('[kraken.js] (addOrder) added order with txid:', txid); - - callback(undefined, txid); - }; - - let reqData = { - pair: this.pair, - type: tradeType.toLowerCase(), - ordertype: 'limit', - price: price, - volume: amount - }; - - let handler = (cb) => this.kraken.api('AddOrder', reqData, this.handleResponse('addOrder', cb)); - util.retryCustom(retryCritical, _.bind(handler, this), _.bind(setOrder, this)); -}; - - -Trader.prototype.getOrder = function(order, callback) { - var getOrder = function(err, data) { - if(err) return callback(err); - - var price = parseFloat( data.result[ order ].price ); - var amount = parseFloat( data.result[ order ].vol_exec ); - var date = moment.unix( data.result[ order ].closetm ); - - callback(undefined, {price, amount, date}); - }; - - let reqData = {txid: order}; - let handler = (cb) => this.kraken.api('QueryOrders', reqData, this.handleResponse('getOrder', cb)); - util.retryCustom(retryCritical, _.bind(handler, this), _.bind(getOrder, this)); -} - -Trader.prototype.buy = function(amount, price, callback) { - this.addOrder('buy', amount, price, callback); -}; - -Trader.prototype.sell = function(amount, price, callback) { - this.addOrder('sell', amount, price, callback); -}; - -Trader.prototype.checkOrder = function(order, callback) { - var check = function(err, data) { - if(err) return callback(err); - - var result = data.result[order]; - var stillThere = result.status === 'open' || result.status === 'pending'; - callback(undefined, !stillThere); - }; - - let reqData = {txid: order}; - let handler = (cb) => this.kraken.api('QueryOrders', reqData, this.handleResponse('checkOrder', cb)); - util.retryCustom(retryCritical, _.bind(handler, this), _.bind(check, this)); -}; - -Trader.prototype.cancelOrder = function(order, callback) { - let reqData = {txid: order}; - let handler = (cb) => this.kraken.api('CancelOrder', reqData, this.handleResponse('cancelOrder', cb)); - util.retryCustom(retryForever, _.bind(handler, this), callback); -}; - -Trader.getCapabilities = function () { - return { - name: 'Kraken', - slug: 'kraken', - currencies: marketData.currencies, - assets: marketData.assets, - markets: marketData.markets, - requires: ['key', 'secret'], - providesHistory: 'date', - providesFullHistory: true, - tid: 'date', - tradable: true - }; -} - -module.exports = Trader; diff --git a/exchanges/poloniex-markets.json b/exchanges/poloniex-markets.json deleted file mode 100644 index 94e2f550a..000000000 --- a/exchanges/poloniex-markets.json +++ /dev/null @@ -1,348 +0,0 @@ -{ - "currencies": ["BTC", "ETH", "XMR", "USDT"], - "assets": [ - "1CR", "ABY", "AC", "ACH", "ADN", "AEON", "AERO", "AIR", "AMP", "APH", - "ARCH", "AUR", "AXIS", "BALLS", "BANK", "BBL", "BBR", "BCC", "BCH", "BCN", - "BCY", "BDC", "BDG", "BELA", "BITCNY", "BITS", "BITUSD", "BLK", "BLOCK", - "BLU", "BNS", "BONES", "BOST", "BTC", "BTCD", "BTCS", "BTM", "BTS", - "BURN", "BURST", "C2", "CACH", "CAI", "CC", "CCN", "CGA", "CHA", "CINNI", - "CLAM", "CNL", "CNMT", "CNOTE", "COMM", "CON", "CORG", "CRYPT", "CURE", - "CYC", "DAO", "DASH", "DCR", "DGB", "DICE", "DIEM", "DIME", "DIS", "DNS", - "DOGE", "DRKC", "DRM", "DSH", "DVK", "EAC", "EBT", "ECC", "EFL", "EMC2", - "EMO", "ENC", "ETC", "ETH", "eTOK", "EXE", "EXP", "FAC", "FCN", "FCT", - "FIBRE", "FLAP", "FLDC", "FLO", "FLT", "FOX", "FRAC", "FRK", "FRQ", - "FVZ", "FZ", "FZN", "GAME", "GAP", "GDN", "GEMZ", "GEO", "GIAR", "GLB", - "GML", "GNS", "GNT", "GOLD", "GPC", "GPUC", "GRC", "GRCX", "GRS", "GUE", "H2O", - "HIRO", "HOT", "HUC", "HUGE", "HVC", "HYP", "HZ", "IFC", "INDEX", "IOC", - "ITC", "IXC", "JLH", "JPC", "JUG", "KDC", "KEY", "LBC", "LC", "LCL", - "LEAF", "LGC", "LOL", "LOVE", "LQD", "LSK", "LTBC", "LTC", "LTCX", - "MAID", "MAST", "MAX", "MCN", "MEC", "METH", "MIL", "MIN", "MINT", "MMC", - "MMNXT", "MMXIV", "MNTA", "MON", "MRC", "MRS", "MTS", "MUN", "MYR", - "MZC", "N5X", "NAS", "NAUT", "NAV", "NBT", "NEOS", "NL", "NMC", "NOBL", - "NOTE", "NOXT", "NRS", "NSR", "NTX", "NXT", "NXTI", "OMNI", "OPAL", - "PAND", "PASC", "PAWN", "PIGGY", "PINK", "PLX", "PMC", "POT", "PPC", "PRC", - "PRT", "PTS", "Q2C", "QBK", "QCN", "QORA", "QTL", "RADS", "RBY", "RDD", "REP", - "RIC", "RZR", "SBD", "SC", "SDC", "SHIBE", "SHOPX", "SILK", "SJCX", - "SLR", "SMC", "SOC", "SPA", "SQL", "SRCC", "SRG", "SSD", "STEEM", "STR", - "SUM", "SUN", "SWARM", "SXC", "SYNC", "SYS", "TAC", "TOR", "TRUST", - "TWE", "UIS", "ULTC", "UNITY", "URO", "USDE", "USDT", "UTC", "UTIL", - "UVC", "VIA", "VOOT", "VOX", "VRC", "VTC", "WC", "WDC", "WIKI", "WOLF", - "X13", "XAI", "XAP", "XBC", "XC", "XCH", "XCN", "XCP", "XCR", "XDN", - "XDP", "XEM", "XHC", "XLB", "XMG", "XMR", "XPB", "XPM", "XRP", "XSI", - "XST", "XSV", "XUSD", "XVC", "XXC", "BCH", "YACC", "YANG", "YC", "YIN", "ZEC" - ], - "markets": [ - { "pair": ["BTC", "1CR"], "minimalOrder": { "amount": 0.0001, "order": 0.0001, "unit": "asset" } }, - { "pair": ["BTC", "ABY"], "minimalOrder": { "amount": 0.0001, "order": 0.0001, "unit": "asset" } }, - { "pair": ["BTC", "AC"], "minimalOrder": { "amount": 0.0001, "order": 0.0001, "unit": "asset" } }, - { "pair": ["BTC", "ACH"], "minimalOrder": { "amount": 0.0001, "order": 0.0001, "unit": "asset" } }, - { "pair": ["BTC", "ADN"], "minimalOrder": { "amount": 0.0001, "order": 0.0001, "unit": "asset" } }, - { "pair": ["BTC", "AEON"], "minimalOrder": { "amount": 0.0001, "order": 0.0001, "unit": "asset" } }, - { "pair": ["BTC", "AERO"], "minimalOrder": { "amount": 0.0001, "order": 0.0001, "unit": "asset" } }, - { "pair": ["BTC", "AIR"], "minimalOrder": { "amount": 0.0001, "order": 0.0001, "unit": "asset" } }, - { "pair": ["BTC", "AMP"], "minimalOrder": { "amount": 0.0001, "order": 0.0001, "unit": "asset" } }, - { "pair": ["BTC", "APH"], "minimalOrder": { "amount": 0.0001, "order": 0.0001, "unit": "asset" } }, - { "pair": ["BTC", "ARCH"], "minimalOrder": { "amount": 0.0001, "order": 0.0001, "unit": "asset" } }, - { "pair": ["BTC", "AUR"], "minimalOrder": { "amount": 0.0001, "order": 0.0001, "unit": "asset" } }, - { "pair": ["BTC", "AXIS"], "minimalOrder": { "amount": 0.0001, "order": 0.0001, "unit": "asset" } }, - { "pair": ["BTC", "BALLS"], "minimalOrder": { "amount": 0.0001, "order": 0.0001, "unit": "asset" } }, - { "pair": ["BTC", "BANK"], "minimalOrder": { "amount": 0.0001, "order": 0.0001, "unit": "asset" } }, - { "pair": ["BTC", "BBL"], "minimalOrder": { "amount": 0.0001, "order": 0.0001, "unit": "asset" } }, - { "pair": ["BTC", "BBR"], "minimalOrder": { "amount": 0.0001, "order": 0.0001, "unit": "asset" } }, - { "pair": ["BTC", "BCC"], "minimalOrder": { "amount": 0.0001, "order": 0.0001, "unit": "asset" } }, - { "pair": ["BTC", "BCN"], "minimalOrder": { "amount": 0.0001, "order": 0.0001, "unit": "asset" } }, - { "pair": ["BTC", "BCH"], "minimalOrder": { "amount": 0.0001, "order": 0.0001, "unit": "asset" } }, - { "pair": ["BTC", "BCY"], "minimalOrder": { "amount": 0.0001, "order": 0.0001, "unit": "asset" } }, - { "pair": ["BTC", "BDC"], "minimalOrder": { "amount": 0.0001, "order": 0.0001, "unit": "asset" } }, - { "pair": ["BTC", "BDG"], "minimalOrder": { "amount": 0.0001, "order": 0.0001, "unit": "asset" } }, - { "pair": ["BTC", "BELA"], "minimalOrder": { "amount": 0.0001, "order": 0.0001, "unit": "asset" } }, - { "pair": ["BTC", "BITCNY"], "minimalOrder": { "amount": 0.0001, "order": 0.0001, "unit": "asset" } }, - { "pair": ["BTC", "BITS"], "minimalOrder": { "amount": 0.0001, "order": 0.0001, "unit": "asset" } }, - { "pair": ["BTC", "BITUSD"], "minimalOrder": { "amount": 0.0001, "order": 0.0001, "unit": "asset" } }, - { "pair": ["BTC", "BLK"], "minimalOrder": { "amount": 0.0001, "order": 0.0001, "unit": "asset" } }, - { "pair": ["BTC", "BLOCK"], "minimalOrder": { "amount": 0.0001, "order": 0.0001, "unit": "asset" } }, - { "pair": ["BTC", "BLU"], "minimalOrder": { "amount": 0.0001, "order": 0.0001, "unit": "asset" } }, - { "pair": ["BTC", "BNS"], "minimalOrder": { "amount": 0.0001, "order": 0.0001, "unit": "asset" } }, - { "pair": ["BTC", "BONES"], "minimalOrder": { "amount": 0.0001, "order": 0.0001, "unit": "asset" } }, - { "pair": ["BTC", "BOST"], "minimalOrder": { "amount": 0.0001, "order": 0.0001, "unit": "asset" } }, - { "pair": ["BTC", "BTCD"], "minimalOrder": { "amount": 0.0001, "order": 0.0001, "unit": "asset" } }, - { "pair": ["BTC", "BTCS"], "minimalOrder": { "amount": 0.0001, "order": 0.0001, "unit": "asset" } }, - { "pair": ["BTC", "BTM"], "minimalOrder": { "amount": 0.0001, "order": 0.0001, "unit": "asset" } }, - { "pair": ["BTC", "BTS"], "minimalOrder": { "amount": 0.0001, "order": 0.0001, "unit": "asset" } }, - { "pair": ["BTC", "BURN"], "minimalOrder": { "amount": 0.0001, "order": 0.0001, "unit": "asset" } }, - { "pair": ["BTC", "BURST"], "minimalOrder": { "amount": 0.0001, "order": 0.0001, "unit": "asset" } }, - { "pair": ["BTC", "C2"], "minimalOrder": { "amount": 0.0001, "order": 0.0001, "unit": "asset" } }, - { "pair": ["BTC", "CACH"], "minimalOrder": { "amount": 0.0001, "order": 0.0001, "unit": "asset" } }, - { "pair": ["BTC", "CAI"], "minimalOrder": { "amount": 0.0001, "order": 0.0001, "unit": "asset" } }, - { "pair": ["BTC", "CC"], "minimalOrder": { "amount": 0.0001, "order": 0.0001, "unit": "asset" } }, - { "pair": ["BTC", "CCN"], "minimalOrder": { "amount": 0.0001, "order": 0.0001, "unit": "asset" } }, - { "pair": ["BTC", "CGA"], "minimalOrder": { "amount": 0.0001, "order": 0.0001, "unit": "asset" } }, - { "pair": ["BTC", "CHA"], "minimalOrder": { "amount": 0.0001, "order": 0.0001, "unit": "asset" } }, - { "pair": ["BTC", "CINNI"], "minimalOrder": { "amount": 0.0001, "order": 0.0001, "unit": "asset" } }, - { "pair": ["BTC", "CLAM"], "minimalOrder": { "amount": 0.0001, "order": 0.0001, "unit": "asset" } }, - { "pair": ["BTC", "CNL"], "minimalOrder": { "amount": 0.0001, "order": 0.0001, "unit": "asset" } }, - { "pair": ["BTC", "CNMT"], "minimalOrder": { "amount": 0.0001, "order": 0.0001, "unit": "asset" } }, - { "pair": ["BTC", "CNOTE"], "minimalOrder": { "amount": 0.0001, "order": 0.0001, "unit": "asset" } }, - { "pair": ["BTC", "COMM"], "minimalOrder": { "amount": 0.0001, "order": 0.0001, "unit": "asset" } }, - { "pair": ["BTC", "CON"], "minimalOrder": { "amount": 0.0001, "order": 0.0001, "unit": "asset" } }, - { "pair": ["BTC", "CORG"], "minimalOrder": { "amount": 0.0001, "order": 0.0001, "unit": "asset" } }, - { "pair": ["BTC", "CRYPT"], "minimalOrder": { "amount": 0.0001, "order": 0.0001, "unit": "asset" } }, - { "pair": ["BTC", "CURE"], "minimalOrder": { "amount": 0.0001, "order": 0.0001, "unit": "asset" } }, - { "pair": ["BTC", "CYC"], "minimalOrder": { "amount": 0.0001, "order": 0.0001, "unit": "asset" } }, - { "pair": ["BTC", "DAO"], "minimalOrder": { "amount": 0.0001, "order": 0.0001, "unit": "asset" } }, - { "pair": ["BTC", "DASH"], "minimalOrder": { "amount": 0.0001, "order": 0.0001, "unit": "asset" } }, - { "pair": ["BTC", "DCR"], "minimalOrder": { "amount": 0.0001, "order": 0.0001, "unit": "asset" } }, - { "pair": ["BTC", "DGB"], "minimalOrder": { "amount": 0.0001, "order": 0.0001, "unit": "asset" } }, - { "pair": ["BTC", "DICE"], "minimalOrder": { "amount": 0.0001, "order": 0.0001, "unit": "asset" } }, - { "pair": ["BTC", "DIEM"], "minimalOrder": { "amount": 0.0001, "order": 0.0001, "unit": "asset" } }, - { "pair": ["BTC", "DIME"], "minimalOrder": { "amount": 0.0001, "order": 0.0001, "unit": "asset" } }, - { "pair": ["BTC", "DIS"], "minimalOrder": { "amount": 0.0001, "order": 0.0001, "unit": "asset" } }, - { "pair": ["BTC", "DNS"], "minimalOrder": { "amount": 0.0001, "order": 0.0001, "unit": "asset" } }, - { "pair": ["BTC", "DOGE"], "minimalOrder": { "amount": 0.0001, "order": 0.0001, "unit": "asset" } }, - { "pair": ["BTC", "DRKC"], "minimalOrder": { "amount": 0.0001, "order": 0.0001, "unit": "asset" } }, - { "pair": ["BTC", "DRM"], "minimalOrder": { "amount": 0.0001, "order": 0.0001, "unit": "asset" } }, - { "pair": ["BTC", "DSH"], "minimalOrder": { "amount": 0.0001, "order": 0.0001, "unit": "asset" } }, - { "pair": ["BTC", "DVK"], "minimalOrder": { "amount": 0.0001, "order": 0.0001, "unit": "asset" } }, - { "pair": ["BTC", "EAC"], "minimalOrder": { "amount": 0.0001, "order": 0.0001, "unit": "asset" } }, - { "pair": ["BTC", "EBT"], "minimalOrder": { "amount": 0.0001, "order": 0.0001, "unit": "asset" } }, - { "pair": ["BTC", "ECC"], "minimalOrder": { "amount": 0.0001, "order": 0.0001, "unit": "asset" } }, - { "pair": ["BTC", "EFL"], "minimalOrder": { "amount": 0.0001, "order": 0.0001, "unit": "asset" } }, - { "pair": ["BTC", "EMC2"], "minimalOrder": { "amount": 0.0001, "order": 0.0001, "unit": "asset" } }, - { "pair": ["BTC", "EMO"], "minimalOrder": { "amount": 0.0001, "order": 0.0001, "unit": "asset" } }, - { "pair": ["BTC", "ENC"], "minimalOrder": { "amount": 0.0001, "order": 0.0001, "unit": "asset" } }, - { "pair": ["BTC", "ETC"], "minimalOrder": { "amount": 0.0001, "order": 0.0001, "unit": "asset" } }, - { "pair": ["BTC", "ETH"], "minimalOrder": { "amount": 0.0001, "order": 0.0001, "unit": "asset" } }, - { "pair": ["BTC", "eTOK"], "minimalOrder": { "amount": 0.0001, "order": 0.0001, "unit": "asset" } }, - { "pair": ["BTC", "EXE"], "minimalOrder": { "amount": 0.0001, "order": 0.0001, "unit": "asset" } }, - { "pair": ["BTC", "EXP"], "minimalOrder": { "amount": 0.0001, "order": 0.0001, "unit": "asset" } }, - { "pair": ["BTC", "FAC"], "minimalOrder": { "amount": 0.0001, "order": 0.0001, "unit": "asset" } }, - { "pair": ["BTC", "FCN"], "minimalOrder": { "amount": 0.0001, "order": 0.0001, "unit": "asset" } }, - { "pair": ["BTC", "FCT"], "minimalOrder": { "amount": 0.0001, "order": 0.0001, "unit": "asset" } }, - { "pair": ["BTC", "FIBRE"], "minimalOrder": { "amount": 0.0001, "order": 0.0001, "unit": "asset" } }, - { "pair": ["BTC", "FLAP"], "minimalOrder": { "amount": 0.0001, "order": 0.0001, "unit": "asset" } }, - { "pair": ["BTC", "FLDC"], "minimalOrder": { "amount": 0.0001, "order": 0.0001, "unit": "asset" } }, - { "pair": ["BTC", "FLO"], "minimalOrder": { "amount": 0.0001, "order": 0.0001, "unit": "asset" } }, - { "pair": ["BTC", "FLT"], "minimalOrder": { "amount": 0.0001, "order": 0.0001, "unit": "asset" } }, - { "pair": ["BTC", "FOX"], "minimalOrder": { "amount": 0.0001, "order": 0.0001, "unit": "asset" } }, - { "pair": ["BTC", "FRAC"], "minimalOrder": { "amount": 0.0001, "order": 0.0001, "unit": "asset" } }, - { "pair": ["BTC", "FRK"], "minimalOrder": { "amount": 0.0001, "order": 0.0001, "unit": "asset" } }, - { "pair": ["BTC", "FRQ"], "minimalOrder": { "amount": 0.0001, "order": 0.0001, "unit": "asset" } }, - { "pair": ["BTC", "FVZ"], "minimalOrder": { "amount": 0.0001, "order": 0.0001, "unit": "asset" } }, - { "pair": ["BTC", "FZ"], "minimalOrder": { "amount": 0.0001, "order": 0.0001, "unit": "asset" } }, - { "pair": ["BTC", "FZN"], "minimalOrder": { "amount": 0.0001, "order": 0.0001, "unit": "asset" } }, - { "pair": ["BTC", "GAME"], "minimalOrder": { "amount": 0.0001, "order": 0.0001, "unit": "asset" } }, - { "pair": ["BTC", "GAP"], "minimalOrder": { "amount": 0.0001, "order": 0.0001, "unit": "asset" } }, - { "pair": ["BTC", "GDN"], "minimalOrder": { "amount": 0.0001, "order": 0.0001, "unit": "asset" } }, - { "pair": ["BTC", "GEMZ"], "minimalOrder": { "amount": 0.0001, "order": 0.0001, "unit": "asset" } }, - { "pair": ["BTC", "GEO"], "minimalOrder": { "amount": 0.0001, "order": 0.0001, "unit": "asset" } }, - { "pair": ["BTC", "GIAR"], "minimalOrder": { "amount": 0.0001, "order": 0.0001, "unit": "asset" } }, - { "pair": ["BTC", "GLB"], "minimalOrder": { "amount": 0.0001, "order": 0.0001, "unit": "asset" } }, - { "pair": ["BTC", "GML"], "minimalOrder": { "amount": 0.0001, "order": 0.0001, "unit": "asset" } }, - { "pair": ["BTC", "GNS"], "minimalOrder": { "amount": 0.0001, "order": 0.0001, "unit": "asset" } }, - { "pair": ["BTC", "GOLD"], "minimalOrder": { "amount": 0.0001, "order": 0.0001, "unit": "asset" } }, - { "pair": ["BTC", "GPC"], "minimalOrder": { "amount": 0.0001, "order": 0.0001, "unit": "asset" } }, - { "pair": ["BTC", "GPUC"], "minimalOrder": { "amount": 0.0001, "order": 0.0001, "unit": "asset" } }, - { "pair": ["BTC", "GRC"], "minimalOrder": { "amount": 0.0001, "order": 0.0001, "unit": "asset" } }, - { "pair": ["BTC", "GRCX"], "minimalOrder": { "amount": 0.0001, "order": 0.0001, "unit": "asset" } }, - { "pair": ["BTC", "GRS"], "minimalOrder": { "amount": 0.0001, "order": 0.0001, "unit": "asset" } }, - { "pair": ["BTC", "GUE"], "minimalOrder": { "amount": 0.0001, "order": 0.0001, "unit": "asset" } }, - { "pair": ["BTC", "H2O"], "minimalOrder": { "amount": 0.0001, "order": 0.0001, "unit": "asset" } }, - { "pair": ["BTC", "HIRO"], "minimalOrder": { "amount": 0.0001, "order": 0.0001, "unit": "asset" } }, - { "pair": ["BTC", "HOT"], "minimalOrder": { "amount": 0.0001, "order": 0.0001, "unit": "asset" } }, - { "pair": ["BTC", "HUC"], "minimalOrder": { "amount": 0.0001, "order": 0.0001, "unit": "asset" } }, - { "pair": ["BTC", "HUGE"], "minimalOrder": { "amount": 0.0001, "order": 0.0001, "unit": "asset" } }, - { "pair": ["BTC", "HVC"], "minimalOrder": { "amount": 0.0001, "order": 0.0001, "unit": "asset" } }, - { "pair": ["BTC", "HYP"], "minimalOrder": { "amount": 0.0001, "order": 0.0001, "unit": "asset" } }, - { "pair": ["BTC", "HZ"], "minimalOrder": { "amount": 0.0001, "order": 0.0001, "unit": "asset" } }, - { "pair": ["BTC", "IFC"], "minimalOrder": { "amount": 0.0001, "order": 0.0001, "unit": "asset" } }, - { "pair": ["BTC", "INDEX"], "minimalOrder": { "amount": 0.0001, "order": 0.0001, "unit": "asset" } }, - { "pair": ["BTC", "IOC"], "minimalOrder": { "amount": 0.0001, "order": 0.0001, "unit": "asset" } }, - { "pair": ["BTC", "ITC"], "minimalOrder": { "amount": 0.0001, "order": 0.0001, "unit": "asset" } }, - { "pair": ["BTC", "IXC"], "minimalOrder": { "amount": 0.0001, "order": 0.0001, "unit": "asset" } }, - { "pair": ["BTC", "JLH"], "minimalOrder": { "amount": 0.0001, "order": 0.0001, "unit": "asset" } }, - { "pair": ["BTC", "JPC"], "minimalOrder": { "amount": 0.0001, "order": 0.0001, "unit": "asset" } }, - { "pair": ["BTC", "JUG"], "minimalOrder": { "amount": 0.0001, "order": 0.0001, "unit": "asset" } }, - { "pair": ["BTC", "KDC"], "minimalOrder": { "amount": 0.0001, "order": 0.0001, "unit": "asset" } }, - { "pair": ["BTC", "KEY"], "minimalOrder": { "amount": 0.0001, "order": 0.0001, "unit": "asset" } }, - { "pair": ["BTC", "LBC"], "minimalOrder": { "amount": 0.0001, "order": 0.0001, "unit": "asset" } }, - { "pair": ["BTC", "LC"], "minimalOrder": { "amount": 0.0001, "order": 0.0001, "unit": "asset" } }, - { "pair": ["BTC", "LCL"], "minimalOrder": { "amount": 0.0001, "order": 0.0001, "unit": "asset" } }, - { "pair": ["BTC", "LEAF"], "minimalOrder": { "amount": 0.0001, "order": 0.0001, "unit": "asset" } }, - { "pair": ["BTC", "LGC"], "minimalOrder": { "amount": 0.0001, "order": 0.0001, "unit": "asset" } }, - { "pair": ["BTC", "LOL"], "minimalOrder": { "amount": 0.0001, "order": 0.0001, "unit": "asset" } }, - { "pair": ["BTC", "LOVE"], "minimalOrder": { "amount": 0.0001, "order": 0.0001, "unit": "asset" } }, - { "pair": ["BTC", "LQD"], "minimalOrder": { "amount": 0.0001, "order": 0.0001, "unit": "asset" } }, - { "pair": ["BTC", "LSK"], "minimalOrder": { "amount": 0.0001, "order": 0.0001, "unit": "asset" } }, - { "pair": ["BTC", "LTBC"], "minimalOrder": { "amount": 0.0001, "order": 0.0001, "unit": "asset" } }, - { "pair": ["BTC", "LTC"], "minimalOrder": { "amount": 0.0001, "order": 0.0001, "unit": "asset" } }, - { "pair": ["BTC", "LTCX"], "minimalOrder": { "amount": 0.0001, "order": 0.0001, "unit": "asset" } }, - { "pair": ["BTC", "MAID"], "minimalOrder": { "amount": 0.0001, "order": 0.0001, "unit": "asset" } }, - { "pair": ["BTC", "MAST"], "minimalOrder": { "amount": 0.0001, "order": 0.0001, "unit": "asset" } }, - { "pair": ["BTC", "MAX"], "minimalOrder": { "amount": 0.0001, "order": 0.0001, "unit": "asset" } }, - { "pair": ["BTC", "MCN"], "minimalOrder": { "amount": 0.0001, "order": 0.0001, "unit": "asset" } }, - { "pair": ["BTC", "MEC"], "minimalOrder": { "amount": 0.0001, "order": 0.0001, "unit": "asset" } }, - { "pair": ["BTC", "METH"], "minimalOrder": { "amount": 0.0001, "order": 0.0001, "unit": "asset" } }, - { "pair": ["BTC", "MIL"], "minimalOrder": { "amount": 0.0001, "order": 0.0001, "unit": "asset" } }, - { "pair": ["BTC", "MIN"], "minimalOrder": { "amount": 0.0001, "order": 0.0001, "unit": "asset" } }, - { "pair": ["BTC", "MINT"], "minimalOrder": { "amount": 0.0001, "order": 0.0001, "unit": "asset" } }, - { "pair": ["BTC", "MMC"], "minimalOrder": { "amount": 0.0001, "order": 0.0001, "unit": "asset" } }, - { "pair": ["BTC", "MMNXT"], "minimalOrder": { "amount": 0.0001, "order": 0.0001, "unit": "asset" } }, - { "pair": ["BTC", "MMXIV"], "minimalOrder": { "amount": 0.0001, "order": 0.0001, "unit": "asset" } }, - { "pair": ["BTC", "MNTA"], "minimalOrder": { "amount": 0.0001, "order": 0.0001, "unit": "asset" } }, - { "pair": ["BTC", "MON"], "minimalOrder": { "amount": 0.0001, "order": 0.0001, "unit": "asset" } }, - { "pair": ["BTC", "MRC"], "minimalOrder": { "amount": 0.0001, "order": 0.0001, "unit": "asset" } }, - { "pair": ["BTC", "MRS"], "minimalOrder": { "amount": 0.0001, "order": 0.0001, "unit": "asset" } }, - { "pair": ["BTC", "MTS"], "minimalOrder": { "amount": 0.0001, "order": 0.0001, "unit": "asset" } }, - { "pair": ["BTC", "MUN"], "minimalOrder": { "amount": 0.0001, "order": 0.0001, "unit": "asset" } }, - { "pair": ["BTC", "MYR"], "minimalOrder": { "amount": 0.0001, "order": 0.0001, "unit": "asset" } }, - { "pair": ["BTC", "MZC"], "minimalOrder": { "amount": 0.0001, "order": 0.0001, "unit": "asset" } }, - { "pair": ["BTC", "N5X"], "minimalOrder": { "amount": 0.0001, "order": 0.0001, "unit": "asset" } }, - { "pair": ["BTC", "NAS"], "minimalOrder": { "amount": 0.0001, "order": 0.0001, "unit": "asset" } }, - { "pair": ["BTC", "NAUT"], "minimalOrder": { "amount": 0.0001, "order": 0.0001, "unit": "asset" } }, - { "pair": ["BTC", "NAV"], "minimalOrder": { "amount": 0.0001, "order": 0.0001, "unit": "asset" } }, - { "pair": ["BTC", "NBT"], "minimalOrder": { "amount": 0.0001, "order": 0.0001, "unit": "asset" } }, - { "pair": ["BTC", "NEOS"], "minimalOrder": { "amount": 0.0001, "order": 0.0001, "unit": "asset" } }, - { "pair": ["BTC", "NL"], "minimalOrder": { "amount": 0.0001, "order": 0.0001, "unit": "asset" } }, - { "pair": ["BTC", "NMC"], "minimalOrder": { "amount": 0.0001, "order": 0.0001, "unit": "asset" } }, - { "pair": ["BTC", "NOBL"], "minimalOrder": { "amount": 0.0001, "order": 0.0001, "unit": "asset" } }, - { "pair": ["BTC", "NOTE"], "minimalOrder": { "amount": 0.0001, "order": 0.0001, "unit": "asset" } }, - { "pair": ["BTC", "NOXT"], "minimalOrder": { "amount": 0.0001, "order": 0.0001, "unit": "asset" } }, - { "pair": ["BTC", "NRS"], "minimalOrder": { "amount": 0.0001, "order": 0.0001, "unit": "asset" } }, - { "pair": ["BTC", "NSR"], "minimalOrder": { "amount": 0.0001, "order": 0.0001, "unit": "asset" } }, - { "pair": ["BTC", "NTX"], "minimalOrder": { "amount": 0.0001, "order": 0.0001, "unit": "asset" } }, - { "pair": ["BTC", "NXT"], "minimalOrder": { "amount": 0.0001, "order": 0.0001, "unit": "asset" } }, - { "pair": ["BTC", "NXTI"], "minimalOrder": { "amount": 0.0001, "order": 0.0001, "unit": "asset" } }, - { "pair": ["BTC", "OMNI"], "minimalOrder": { "amount": 0.0001, "order": 0.0001, "unit": "asset" } }, - { "pair": ["BTC", "OPAL"], "minimalOrder": { "amount": 0.0001, "order": 0.0001, "unit": "asset" } }, - { "pair": ["BTC", "PAND"], "minimalOrder": { "amount": 0.0001, "order": 0.0001, "unit": "asset" } }, - { "pair": ["BTC", "PASC"], "minimalOrder": { "amount": 0.0001, "order": 0.0001, "unit": "asset" } }, - { "pair": ["BTC", "PAWN"], "minimalOrder": { "amount": 0.0001, "order": 0.0001, "unit": "asset" } }, - { "pair": ["BTC", "PIGGY"], "minimalOrder": { "amount": 0.0001, "order": 0.0001, "unit": "asset" } }, - { "pair": ["BTC", "PINK"], "minimalOrder": { "amount": 0.0001, "order": 0.0001, "unit": "asset" } }, - { "pair": ["BTC", "PLX"], "minimalOrder": { "amount": 0.0001, "order": 0.0001, "unit": "asset" } }, - { "pair": ["BTC", "PMC"], "minimalOrder": { "amount": 0.0001, "order": 0.0001, "unit": "asset" } }, - { "pair": ["BTC", "POT"], "minimalOrder": { "amount": 0.0001, "order": 0.0001, "unit": "asset" } }, - { "pair": ["BTC", "PPC"], "minimalOrder": { "amount": 0.0001, "order": 0.0001, "unit": "asset" } }, - { "pair": ["BTC", "PRC"], "minimalOrder": { "amount": 0.0001, "order": 0.0001, "unit": "asset" } }, - { "pair": ["BTC", "PRT"], "minimalOrder": { "amount": 0.0001, "order": 0.0001, "unit": "asset" } }, - { "pair": ["BTC", "PTS"], "minimalOrder": { "amount": 0.0001, "order": 0.0001, "unit": "asset" } }, - { "pair": ["BTC", "Q2C"], "minimalOrder": { "amount": 0.0001, "order": 0.0001, "unit": "asset" } }, - { "pair": ["BTC", "QBK"], "minimalOrder": { "amount": 0.0001, "order": 0.0001, "unit": "asset" } }, - { "pair": ["BTC", "QCN"], "minimalOrder": { "amount": 0.0001, "order": 0.0001, "unit": "asset" } }, - { "pair": ["BTC", "QORA"], "minimalOrder": { "amount": 0.0001, "order": 0.0001, "unit": "asset" } }, - { "pair": ["BTC", "QTL"], "minimalOrder": { "amount": 0.0001, "order": 0.0001, "unit": "asset" } }, - { "pair": ["BTC", "RADS"], "minimalOrder": { "amount": 0.0001, "order": 0.0001, "unit": "asset" } }, - { "pair": ["BTC", "RBY"], "minimalOrder": { "amount": 0.0001, "order": 0.0001, "unit": "asset" } }, - { "pair": ["BTC", "RDD"], "minimalOrder": { "amount": 0.0001, "order": 0.0001, "unit": "asset" } }, - { "pair": ["BTC", "REP"], "minimalOrder": { "amount": 0.0001, "order": 0.0001, "unit": "asset" } }, - { "pair": ["BTC", "RIC"], "minimalOrder": { "amount": 0.0001, "order": 0.0001, "unit": "asset" } }, - { "pair": ["BTC", "RZR"], "minimalOrder": { "amount": 0.0001, "order": 0.0001, "unit": "asset" } }, - { "pair": ["BTC", "SBD"], "minimalOrder": { "amount": 0.0001, "order": 0.0001, "unit": "asset" } }, - { "pair": ["BTC", "SC"], "minimalOrder": { "amount": 0.0001, "order": 0.0001, "unit": "asset" } }, - { "pair": ["BTC", "SDC"], "minimalOrder": { "amount": 0.0001, "order": 0.0001, "unit": "asset" } }, - { "pair": ["BTC", "SHIBE"], "minimalOrder": { "amount": 0.0001, "order": 0.0001, "unit": "asset" } }, - { "pair": ["BTC", "SHOPX"], "minimalOrder": { "amount": 0.0001, "order": 0.0001, "unit": "asset" } }, - { "pair": ["BTC", "SILK"], "minimalOrder": { "amount": 0.0001, "order": 0.0001, "unit": "asset" } }, - { "pair": ["BTC", "SJCX"], "minimalOrder": { "amount": 0.0001, "order": 0.0001, "unit": "asset" } }, - { "pair": ["BTC", "SLR"], "minimalOrder": { "amount": 0.0001, "order": 0.0001, "unit": "asset" } }, - { "pair": ["BTC", "SMC"], "minimalOrder": { "amount": 0.0001, "order": 0.0001, "unit": "asset" } }, - { "pair": ["BTC", "SOC"], "minimalOrder": { "amount": 0.0001, "order": 0.0001, "unit": "asset" } }, - { "pair": ["BTC", "SPA"], "minimalOrder": { "amount": 0.0001, "order": 0.0001, "unit": "asset" } }, - { "pair": ["BTC", "SQL"], "minimalOrder": { "amount": 0.0001, "order": 0.0001, "unit": "asset" } }, - { "pair": ["BTC", "SRCC"], "minimalOrder": { "amount": 0.0001, "order": 0.0001, "unit": "asset" } }, - { "pair": ["BTC", "SRG"], "minimalOrder": { "amount": 0.0001, "order": 0.0001, "unit": "asset" } }, - { "pair": ["BTC", "SSD"], "minimalOrder": { "amount": 0.0001, "order": 0.0001, "unit": "asset" } }, - { "pair": ["BTC", "STEEM"], "minimalOrder": { "amount": 0.0001, "order": 0.0001, "unit": "asset" } }, - { "pair": ["BTC", "STR"], "minimalOrder": { "amount": 0.0001, "order": 0.0001, "unit": "asset" } }, - { "pair": ["BTC", "SUM"], "minimalOrder": { "amount": 0.0001, "order": 0.0001, "unit": "asset" } }, - { "pair": ["BTC", "SUN"], "minimalOrder": { "amount": 0.0001, "order": 0.0001, "unit": "asset" } }, - { "pair": ["BTC", "SWARM"], "minimalOrder": { "amount": 0.0001, "order": 0.0001, "unit": "asset" } }, - { "pair": ["BTC", "SXC"], "minimalOrder": { "amount": 0.0001, "order": 0.0001, "unit": "asset" } }, - { "pair": ["BTC", "SYNC"], "minimalOrder": { "amount": 0.0001, "order": 0.0001, "unit": "asset" } }, - { "pair": ["BTC", "SYS"], "minimalOrder": { "amount": 0.0001, "order": 0.0001, "unit": "asset" } }, - { "pair": ["BTC", "TAC"], "minimalOrder": { "amount": 0.0001, "order": 0.0001, "unit": "asset" } }, - { "pair": ["BTC", "TOR"], "minimalOrder": { "amount": 0.0001, "order": 0.0001, "unit": "asset" } }, - { "pair": ["BTC", "TRUST"], "minimalOrder": { "amount": 0.0001, "order": 0.0001, "unit": "asset" } }, - { "pair": ["BTC", "TWE"], "minimalOrder": { "amount": 0.0001, "order": 0.0001, "unit": "asset" } }, - { "pair": ["BTC", "UIS"], "minimalOrder": { "amount": 0.0001, "order": 0.0001, "unit": "asset" } }, - { "pair": ["BTC", "ULTC"], "minimalOrder": { "amount": 0.0001, "order": 0.0001, "unit": "asset" } }, - { "pair": ["BTC", "UNITY"], "minimalOrder": { "amount": 0.0001, "order": 0.0001, "unit": "asset" } }, - { "pair": ["BTC", "URO"], "minimalOrder": { "amount": 0.0001, "order": 0.0001, "unit": "asset" } }, - { "pair": ["BTC", "USDE"], "minimalOrder": { "amount": 0.0001, "order": 0.0001, "unit": "asset" } }, - { "pair": ["BTC", "USDT"], "minimalOrder": { "amount": 0.0001, "order": 0.0001, "unit": "asset" } }, - { "pair": ["BTC", "UTC"], "minimalOrder": { "amount": 0.0001, "order": 0.0001, "unit": "asset" } }, - { "pair": ["BTC", "UTIL"], "minimalOrder": { "amount": 0.0001, "order": 0.0001, "unit": "asset" } }, - { "pair": ["BTC", "UVC"], "minimalOrder": { "amount": 0.0001, "order": 0.0001, "unit": "asset" } }, - { "pair": ["BTC", "VIA"], "minimalOrder": { "amount": 0.0001, "order": 0.0001, "unit": "asset" } }, - { "pair": ["BTC", "VOOT"], "minimalOrder": { "amount": 0.0001, "order": 0.0001, "unit": "asset" } }, - { "pair": ["BTC", "VOX"], "minimalOrder": { "amount": 0.0001, "order": 0.0001, "unit": "asset" } }, - { "pair": ["BTC", "VRC"], "minimalOrder": { "amount": 0.0001, "order": 0.0001, "unit": "asset" } }, - { "pair": ["BTC", "VTC"], "minimalOrder": { "amount": 0.0001, "order": 0.0001, "unit": "asset" } }, - { "pair": ["BTC", "WC"], "minimalOrder": { "amount": 0.0001, "order": 0.0001, "unit": "asset" } }, - { "pair": ["BTC", "WDC"], "minimalOrder": { "amount": 0.0001, "order": 0.0001, "unit": "asset" } }, - { "pair": ["BTC", "WIKI"], "minimalOrder": { "amount": 0.0001, "order": 0.0001, "unit": "asset" } }, - { "pair": ["BTC", "WOLF"], "minimalOrder": { "amount": 0.0001, "order": 0.0001, "unit": "asset" } }, - { "pair": ["BTC", "X13"], "minimalOrder": { "amount": 0.0001, "order": 0.0001, "unit": "asset" } }, - { "pair": ["BTC", "XAI"], "minimalOrder": { "amount": 0.0001, "order": 0.0001, "unit": "asset" } }, - { "pair": ["BTC", "XAP"], "minimalOrder": { "amount": 0.0001, "order": 0.0001, "unit": "asset" } }, - { "pair": ["BTC", "XBC"], "minimalOrder": { "amount": 0.0001, "order": 0.0001, "unit": "asset" } }, - { "pair": ["BTC", "XC"], "minimalOrder": { "amount": 0.0001, "order": 0.0001, "unit": "asset" } }, - { "pair": ["BTC", "XCH"], "minimalOrder": { "amount": 0.0001, "order": 0.0001, "unit": "asset" } }, - { "pair": ["BTC", "XCN"], "minimalOrder": { "amount": 0.0001, "order": 0.0001, "unit": "asset" } }, - { "pair": ["BTC", "XCP"], "minimalOrder": { "amount": 0.0001, "order": 0.0001, "unit": "asset" } }, - { "pair": ["BTC", "XCR"], "minimalOrder": { "amount": 0.0001, "order": 0.0001, "unit": "asset" } }, - { "pair": ["BTC", "XDN"], "minimalOrder": { "amount": 0.0001, "order": 0.0001, "unit": "asset" } }, - { "pair": ["BTC", "XDP"], "minimalOrder": { "amount": 0.0001, "order": 0.0001, "unit": "asset" } }, - { "pair": ["BTC", "XEM"], "minimalOrder": { "amount": 0.0001, "order": 0.0001, "unit": "asset" } }, - { "pair": ["BTC", "XHC"], "minimalOrder": { "amount": 0.0001, "order": 0.0001, "unit": "asset" } }, - { "pair": ["BTC", "XLB"], "minimalOrder": { "amount": 0.0001, "order": 0.0001, "unit": "asset" } }, - { "pair": ["BTC", "XMG"], "minimalOrder": { "amount": 0.0001, "order": 0.0001, "unit": "asset" } }, - { "pair": ["BTC", "XMR"], "minimalOrder": { "amount": 0.0001, "order": 0.0001, "unit": "asset" } }, - { "pair": ["BTC", "XPB"], "minimalOrder": { "amount": 0.0001, "order": 0.0001, "unit": "asset" } }, - { "pair": ["BTC", "XPM"], "minimalOrder": { "amount": 0.0001, "order": 0.0001, "unit": "asset" } }, - { "pair": ["BTC", "XRP"], "minimalOrder": { "amount": 0.0001, "order": 0.0001, "unit": "asset" } }, - { "pair": ["BTC", "XSI"], "minimalOrder": { "amount": 0.0001, "order": 0.0001, "unit": "asset" } }, - { "pair": ["BTC", "XST"], "minimalOrder": { "amount": 0.0001, "order": 0.0001, "unit": "asset" } }, - { "pair": ["BTC", "XSV"], "minimalOrder": { "amount": 0.0001, "order": 0.0001, "unit": "asset" } }, - { "pair": ["BTC", "XUSD"], "minimalOrder": { "amount": 0.0001, "order": 0.0001, "unit": "asset" } }, - { "pair": ["BTC", "XVC"], "minimalOrder": { "amount": 0.0001, "order": 0.0001, "unit": "asset" } }, - { "pair": ["BTC", "XXC"], "minimalOrder": { "amount": 0.0001, "order": 0.0001, "unit": "asset" } }, - { "pair": ["BTC", "YACC"], "minimalOrder": { "amount": 0.0001, "order": 0.0001, "unit": "asset" } }, - { "pair": ["BTC", "YANG"], "minimalOrder": { "amount": 0.0001, "order": 0.0001, "unit": "asset" } }, - { "pair": ["BTC", "YC"], "minimalOrder": { "amount": 0.0001, "order": 0.0001, "unit": "asset" } }, - { "pair": ["BTC", "YIN"], "minimalOrder": { "amount": 0.0001, "order": 0.0001, "unit": "asset" } }, - { "pair": ["BTC", "ZEC"], "minimalOrder": { "amount": 0.0001, "order": 0.0001, "unit": "asset" } }, - - { "pair": ["USDT", "BTC"], "minimalOrder": { "amount": 0.0001, "order": 1.0, "unit": "asset" } }, - { "pair": ["USDT", "BCH"], "minimalOrder": { "amount": 0.0001, "order": 1.0, "unit": "asset" } }, - { "pair": ["USDT", "DASH"], "minimalOrder": { "amount": 0.0001, "order": 1.0, "unit": "asset" } }, - { "pair": ["USDT", "ETC"], "minimalOrder": { "amount": 0.0001, "order": 1.0, "unit": "asset" } }, - { "pair": ["USDT", "ETH"], "minimalOrder": { "amount": 0.0001, "order": 1.0, "unit": "asset" } }, - { "pair": ["USDT", "LTC"], "minimalOrder": { "amount": 0.0001, "order": 1.0, "unit": "asset" } }, - { "pair": ["USDT", "NXT"], "minimalOrder": { "amount": 0.0001, "order": 1.0, "unit": "asset" } }, - { "pair": ["USDT", "REP"], "minimalOrder": { "amount": 0.0001, "order": 1.0, "unit": "asset" } }, - { "pair": ["USDT", "STR"], "minimalOrder": { "amount": 0.0001, "order": 1.0, "unit": "asset" } }, - { "pair": ["USDT", "XMR"], "minimalOrder": { "amount": 0.0001, "order": 1.0, "unit": "asset" } }, - { "pair": ["USDT", "XRP"], "minimalOrder": { "amount": 0.0001, "order": 1.0, "unit": "asset" } }, - { "pair": ["USDT", "ZEC"], "minimalOrder": { "amount": 0.0001, "order": 1.0, "unit": "asset" } }, - - { "pair": ["ETH", "ETC"], "minimalOrder": { "amount": 0.0001, "order": 0.0001, "unit": "asset" } }, - { "pair": ["ETH", "BCH"], "minimalOrder": { "amount": 0.0001, "order": 0.0001, "unit": "asset" } }, - { "pair": ["ETH", "GNO"], "minimalOrder": { "amount": 0.0001, "order": 0.0001, "unit": "asset" } }, - { "pair": ["ETH", "GNT"], "minimalOrder": { "amount": 0.0001, "order": 0.0001, "unit": "asset" } }, - { "pair": ["ETH", "LSK"], "minimalOrder": { "amount": 0.0001, "order": 0.0001, "unit": "asset" } }, - { "pair": ["ETH", "REP"], "minimalOrder": { "amount": 0.0001, "order": 0.0001, "unit": "asset" } }, - { "pair": ["ETH", "STEEM"], "minimalOrder": { "amount": 0.0001, "order": 0.0001, "unit": "asset" } }, - { "pair": ["ETH", "ZEC"], "minimalOrder": { "amount": 0.0001, "order": 0.0001, "unit": "asset" } }, - - { "pair": ["XMR", "BCN"], "minimalOrder": { "amount": 0.0001, "order": 0.0001, "unit": "asset" } }, - { "pair": ["XMR", "BLK"], "minimalOrder": { "amount": 0.0001, "order": 0.0001, "unit": "asset" } }, - { "pair": ["XMR", "BTCD"], "minimalOrder": { "amount": 0.0001, "order": 0.0001, "unit": "asset" } }, - { "pair": ["XMR", "DASH"], "minimalOrder": { "amount": 0.0001, "order": 0.0001, "unit": "asset" } }, - { "pair": ["XMR", "LTC"], "minimalOrder": { "amount": 0.0001, "order": 0.0001, "unit": "asset" } }, - { "pair": ["XMR", "MAID"], "minimalOrder": { "amount": 0.0001, "order": 0.0001, "unit": "asset" } }, - { "pair": ["XMR", "NXT"], "minimalOrder": { "amount": 0.0001, "order": 0.0001, "unit": "asset" } }, - { "pair": ["XMR", "ZEC"], "minimalOrder": { "amount": 0.0001, "order": 0.0001, "unit": "asset" } } - - ] -} \ No newline at end of file diff --git a/exchanges/poloniex.js b/exchanges/poloniex.js deleted file mode 100644 index fac00eb97..000000000 --- a/exchanges/poloniex.js +++ /dev/null @@ -1,264 +0,0 @@ -const Poloniex = require("poloniex.js"); -const util = require('../core/util.js'); -const _ = require('lodash'); -const moment = require('moment'); -const log = require('../core/log'); -const marketData = require('./poloniex-markets.json'); - -// Helper methods -function joinCurrencies(currencyA, currencyB){ - return currencyA + '_' + currencyB; -} - -var Trader = function(config) { - _.bindAll(this); - if(_.isObject(config)) { - this.key = config.key; - this.secret = config.secret; - this.currency = config.currency; - this.asset = config.asset; - } - this.name = 'Poloniex'; - this.balance; - this.price; - - this.pair = [this.currency, this.asset].join('_'); - this.market = _.find(Trader.getCapabilities().markets, (market) => { - return market.pair[0] === this.currency && market.pair[1] === this.asset - }); - - this.poloniex = new Poloniex(this.key, this.secret); -} - -// if the exchange errors we try the same call again after -// waiting 10 seconds -Trader.prototype.retry = function(method, args) { - var wait = +moment.duration(10, 'seconds'); - log.debug(this.name, 'returned an error, retrying..'); - - var self = this; - - // make sure the callback (and any other fn) - // is bound to Trader - _.each(args, function(arg, i) { - if(_.isFunction(arg)) - args[i] = _.bind(arg, self); - }); - - // run the failed method again with the same - // arguments after wait - setTimeout( - function() { method.apply(self, args) }, - wait - ); -} - -Trader.prototype.getPortfolio = function(callback) { - var args = _.toArray(arguments); - var set = function(err, data) { - if(err) - return this.retry(this.getPortfolio, args); - - var assetAmount = parseFloat( data[this.asset] ); - var currencyAmount = parseFloat( data[this.currency] ); - - if( - !_.isNumber(assetAmount) || _.isNaN(assetAmount) || - !_.isNumber(currencyAmount) || _.isNaN(currencyAmount) - ) { - log.info('asset:', this.asset); - log.info('currency:', this.currency); - log.info('exchange data:', data); - util.die('Gekko was unable to set the portfolio'); - } - - var portfolio = [ - { name: this.asset, amount: assetAmount }, - { name: this.currency, amount: currencyAmount } - ]; - - callback(err, portfolio); - }.bind(this); - - this.poloniex.myBalances(set); -} - -Trader.prototype.getTicker = function(callback) { - var args = _.toArray(arguments); - this.poloniex.getTicker(function(err, data) { - if(err) - return this.retry(this.getTicker, args); - - var tick = data[this.pair]; - - callback(null, { - bid: parseFloat(tick.highestBid), - ask: parseFloat(tick.lowestAsk), - }); - - }.bind(this)); -} - -Trader.prototype.getFee = function(callback) { - var set = function(err, data) { - if(err || data.error) - return callback(err || data.error); - - callback(false, parseFloat(data.makerFee)); - } - this.poloniex._private('returnFeeInfo', _.bind(set, this)); -} - -Trader.prototype.getLotSize = function(tradeType, amount, price, callback) { - if (amount < this.market.minimalOrder.amount) - return callback(undefined, { amount: 0, price: 0 }); - - if (amount * price < this.market.minimalOrder.order) - return callback(undefined, { amount: 0, price: 0}); - - callback(undefined, { amount: amount, price: price }); -} - -Trader.prototype.buy = function(amount, price, callback) { - var args = _.toArray(arguments); - var set = function(err, result) { - if(err || result.error) { - log.error('unable to buy:', err, result); - return this.retry(this.buy, args); - } - - callback(null, result.orderNumber); - }.bind(this); - - this.poloniex.buy(this.currency, this.asset, price, amount, set); -} - -Trader.prototype.sell = function(amount, price, callback) { - var args = _.toArray(arguments); - var set = function(err, result) { - if(err || result.error) { - log.error('unable to sell:', err, result); - return this.retry(this.sell, args); - } - - callback(null, result.orderNumber); - }.bind(this); - - this.poloniex.sell(this.currency, this.asset, price, amount, set); -} - -Trader.prototype.checkOrder = function(order, callback) { - var check = function(err, result) { - var stillThere = _.find(result, function(o) { return o.orderNumber === order }); - callback(err, !stillThere); - }.bind(this); - - this.poloniex.myOpenOrders(this.currency, this.asset, check); -} - -Trader.prototype.getOrder = function(order, callback) { - - var get = function(err, result) { - - if(err) - return callback(err); - - var price = 0; - var amount = 0; - var date = moment(0); - - if(result.error === 'Order not found, or you are not the person who placed it.') - return callback(null, {price, amount, date}); - - _.each(result, trade => { - - date = moment(trade.date); - price = ((price * amount) + (+trade.rate * trade.amount)) / (+trade.amount + amount); - amount += +trade.amount; - - }); - - callback(err, {price, amount, date}); - }.bind(this); - - this.poloniex.returnOrderTrades(order, get); -} - -Trader.prototype.cancelOrder = function(order, callback) { - var args = _.toArray(arguments); - var cancel = function(err, result) { - - // check if order is gone already - if(result.error === 'Invalid order number, or you are not the person who placed the order.') - return callback(true); - - if(err || !result.success) { - log.error('unable to cancel order', order, '(', err, result, '), retrying'); - return this.retry(this.cancelOrder, args); - } - - callback(); - }.bind(this); - - this.poloniex.cancelOrder(this.currency, this.asset, order, cancel); -} - -Trader.prototype.getTrades = function(since, callback, descending) { - - var firstFetch = !!since; - - var args = _.toArray(arguments); - var process = function(err, result) { - if(err) { - return this.retry(this.getTrades, args); - } - - // Edge case, see here: - // @link https://github.com/askmike/gekko/issues/479 - if(firstFetch && _.size(result) === 50000) - util.die( - [ - 'Poloniex did not provide enough data. Read this:', - 'https://github.com/askmike/gekko/issues/479' - ].join('\n\n') - ); - - result = _.map(result, function(trade) { - return { - tid: trade.tradeID, - amount: +trade.amount, - date: moment.utc(trade.date).unix(), - price: +trade.rate - }; - }); - - callback(null, result.reverse()); - }; - - var params = { - currencyPair: joinCurrencies(this.currency, this.asset) - } - - if(since) - params.start = since.unix(); - - this.poloniex._public('returnTradeHistory', params, _.bind(process, this)); -} - -Trader.getCapabilities = function () { - return { - name: 'Poloniex', - slug: 'poloniex', - currencies: marketData.currencies, - assets: marketData.assets, - markets: marketData.markets, - currencyMinimums: {BTC: 0.0001, ETH: 0.0001, XMR: 0.0001, USDT: 1.0}, - requires: ['key', 'secret'], - tid: 'tid', - providesHistory: 'date', - providesFullHistory: true, - tradable: true - }; -} - -module.exports = Trader; diff --git a/gekko.js b/gekko.js index 20e9af3cd..80ec3e679 100644 --- a/gekko.js +++ b/gekko.js @@ -39,8 +39,9 @@ console.log('\tI\'m gonna make you rich, Bud Fox.', '\n\n'); const dirs = util.dirs(); -if(util.launchUI()) +if(util.launchUI()) { return require(util.dirs().web + 'server'); +} const pipeline = require(dirs.core + 'pipeline'); const config = util.getConfig(); diff --git a/importers/exchanges/poloniex.js b/importers/exchanges/poloniex.js index f92cc5611..89757b079 100644 --- a/importers/exchanges/poloniex.js +++ b/importers/exchanges/poloniex.js @@ -1,4 +1,3 @@ -var Poloniex = require("poloniex.js"); var util = require('../../core/util.js'); var _ = require('lodash'); var moment = require('moment'); diff --git a/package-lock.json b/package-lock.json index 6f0ee2f47..9b82bfc22 100644 --- a/package-lock.json +++ b/package-lock.json @@ -1,6 +1,6 @@ { "name": "gekko", - "version": "0.5.13", + "version": "0.6.0-alpha.0", "lockfileVersion": 1, "requires": true, "dependencies": { @@ -94,6 +94,15 @@ } } }, + "JSONStream": { + "version": "1.3.1", + "resolved": "https://registry.npmjs.org/JSONStream/-/JSONStream-1.3.1.tgz", + "integrity": "sha1-cH92HgHa6eFvG8+TcDt4xwlmV5o=", + "requires": { + "jsonparse": "1.3.1", + "through": "2.3.8" + } + }, "accepts": { "version": "1.3.4", "resolved": "https://registry.npmjs.org/accepts/-/accepts-1.3.4.tgz", @@ -200,20 +209,10 @@ "resolved": "https://registry.npmjs.org/aws4/-/aws4-1.6.0.tgz", "integrity": "sha1-g+9cqGCysy5KDe7e6MdxudtXRx4=" }, - "babel-runtime": { - "version": "6.26.0", - "resolved": "https://registry.npmjs.org/babel-runtime/-/babel-runtime-6.26.0.tgz", - "integrity": "sha1-llxwWGaOgrVde/4E/yM3vItWR/4=", - "requires": { - "core-js": "2.5.3", - "regenerator-runtime": "0.11.1" - } - }, "balanced-match": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/balanced-match/-/balanced-match-1.0.0.tgz", - "integrity": "sha1-ibTRmasr7kneFk6gK4nORi1xt2c=", - "dev": true + "integrity": "sha1-ibTRmasr7kneFk6gK4nORi1xt2c=" }, "bcrypt-pbkdf": { "version": "1.0.1", @@ -224,43 +223,6 @@ "tweetnacl": "0.14.5" } }, - "binance": { - "version": "1.3.1", - "resolved": "https://registry.npmjs.org/binance/-/binance-1.3.1.tgz", - "integrity": "sha1-ecicdUranlTtZiicVav6C/BkYUE=", - "requires": { - "request": "2.83.0", - "underscore": "1.8.3", - "ws": "3.3.3" - }, - "dependencies": { - "ultron": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/ultron/-/ultron-1.1.1.tgz", - "integrity": "sha512-UIEXBNeYmKptWH6z8ZnqTeS8fV74zG0/eRU9VGkpzz+LIJNs8W/zM/L+7ctCkRrgbNnnR0xxw4bKOr0cW0N0Og==" - }, - "underscore": { - "version": "1.8.3", - "resolved": "https://registry.npmjs.org/underscore/-/underscore-1.8.3.tgz", - "integrity": "sha1-Tz+1OxBuYJf8+ctBCfKl6b36UCI=" - }, - "ws": { - "version": "3.3.3", - "resolved": "https://registry.npmjs.org/ws/-/ws-3.3.3.tgz", - "integrity": "sha512-nnWLa/NwZSt4KQJu51MYlCcSQ5g7INpOrOMt4XV8j4dqTXdmlUmSHQ8/oLC069ckre0fRsgfvsKwbTdtKLCDkA==", - "requires": { - "async-limiter": "1.0.0", - "safe-buffer": "5.1.1", - "ultron": "1.1.1" - } - } - } - }, - "bintrees": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/bintrees/-/bintrees-1.0.0.tgz", - "integrity": "sha1-nqCaZnLBE0tejEMToT5HzKloxyA=" - }, "bitcoin-co-id-update": { "version": "0.0.2", "resolved": "https://registry.npmjs.org/bitcoin-co-id-update/-/bitcoin-co-id-update-0.0.2.tgz", @@ -408,7 +370,6 @@ "version": "1.1.8", "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.8.tgz", "integrity": "sha1-wHshHHyVLsH479Uad+8NHTmQopI=", - "dev": true, "requires": { "balanced-match": "1.0.0", "concat-map": "0.0.1" @@ -417,8 +378,7 @@ "browser-stdout": { "version": "1.3.0", "resolved": "https://registry.npmjs.org/browser-stdout/-/browser-stdout-1.3.0.tgz", - "integrity": "sha1-81HTKWnTL6XXpVZxVCY9korjvR8=", - "dev": true + "integrity": "sha1-81HTKWnTL6XXpVZxVCY9korjvR8=" }, "btc-china-fork": { "version": "0.0.6", @@ -739,7 +699,6 @@ "version": "4.1.2", "resolved": "https://registry.npmjs.org/chai/-/chai-4.1.2.tgz", "integrity": "sha1-D2RYS6ZC8PKs4oBiefTwbKI61zw=", - "dev": true, "requires": { "assertion-error": "1.0.2", "check-error": "1.0.2", @@ -753,7 +712,6 @@ "version": "3.0.1", "resolved": "https://registry.npmjs.org/deep-eql/-/deep-eql-3.0.1.tgz", "integrity": "sha512-+QeIQyN5ZuO+3Uk5DYh6/1eKO0m0YmJFGNmFHGACpf1ClL1nmlV/p4gNgbl2pJGxgXb4faqo6UE+M5ACEMyVcw==", - "dev": true, "requires": { "type-detect": "4.0.7" } @@ -761,8 +719,7 @@ "type-detect": { "version": "4.0.7", "resolved": "https://registry.npmjs.org/type-detect/-/type-detect-4.0.7.tgz", - "integrity": "sha512-4Rh17pAMVdMWzktddFhISRnUnFIStObtUMNGzDwlA6w/77bmGv3aBbRdCmQR6IjzfkTo9otnW+2K/cDRhKSxDA==", - "dev": true + "integrity": "sha512-4Rh17pAMVdMWzktddFhISRnUnFIStObtUMNGzDwlA6w/77bmGv3aBbRdCmQR6IjzfkTo9otnW+2K/cDRhKSxDA==" } } }, @@ -786,8 +743,7 @@ "check-error": { "version": "1.0.2", "resolved": "https://registry.npmjs.org/check-error/-/check-error-1.0.2.tgz", - "integrity": "sha1-V00xLt2Iu13YkS6Sht1sCu1KrII=", - "dev": true + "integrity": "sha1-V00xLt2Iu13YkS6Sht1sCu1KrII=" }, "cheerio": { "version": "0.19.0", @@ -851,12 +807,79 @@ "resolved": "https://registry.npmjs.org/coffeescript/-/coffeescript-1.12.7.tgz", "integrity": "sha512-pLXHFxQMPklVoEekowk8b3erNynC+DVJzChxS/LCBBgR6/8AJkHivkm//zbowcfc7BTCAjryuhx6gPqPRfsFoA==" }, - "coinfalcon": { - "version": "1.0.3", - "resolved": "https://registry.npmjs.org/coinfalcon/-/coinfalcon-1.0.3.tgz", - "integrity": "sha512-dzyLdeDGY9Fg4zewCFolK/TjB/Mrf9tpBupx7IAqhZcYH6jY5z7xxMywIgJnf4bbRKMIEnJ2GJFqgue9M1nwnw==", + "coingi": { + "version": "1.0.7", + "resolved": "https://registry.npmjs.org/coingi/-/coingi-1.0.7.tgz", + "integrity": "sha512-qI7/mAGhqGH650Q3pWNoliJeOEl73fPMBI4RRAnnBlI5iPDqtemsQb+OSPpHtFHXgdL7YlJ5nCR+Aqtaq2rsVA==", "requires": { - "babel-runtime": "6.26.0" + "chai": "4.1.2", + "got": "7.1.0", + "mocha": "3.5.3" + }, + "dependencies": { + "commander": { + "version": "2.9.0", + "resolved": "https://registry.npmjs.org/commander/-/commander-2.9.0.tgz", + "integrity": "sha1-nJkJQXbhIkDLItbFFGCYQA/g99Q=", + "requires": { + "graceful-readlink": "1.0.1" + } + }, + "diff": { + "version": "3.2.0", + "resolved": "https://registry.npmjs.org/diff/-/diff-3.2.0.tgz", + "integrity": "sha1-yc45Okt8vQsFinJck98pkCeGj/k=" + }, + "glob": { + "version": "7.1.1", + "resolved": "https://registry.npmjs.org/glob/-/glob-7.1.1.tgz", + "integrity": "sha1-gFIR3wT6rxxjo2ADBs31reULLsg=", + "requires": { + "fs.realpath": "1.0.0", + "inflight": "1.0.6", + "inherits": "2.0.3", + "minimatch": "3.0.4", + "once": "1.4.0", + "path-is-absolute": "1.0.1" + } + }, + "growl": { + "version": "1.9.2", + "resolved": "https://registry.npmjs.org/growl/-/growl-1.9.2.tgz", + "integrity": "sha1-Dqd0NxXbjY3ixe3hd14bRayFwC8=" + }, + "has-flag": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-1.0.0.tgz", + "integrity": "sha1-nZ55MWXOAXoA8AQYxD+UKnsdEfo=" + }, + "mocha": { + "version": "3.5.3", + "resolved": "https://registry.npmjs.org/mocha/-/mocha-3.5.3.tgz", + "integrity": "sha512-/6na001MJWEtYxHOV1WLfsmR4YIynkUEhBwzsb+fk2qmQ3iqsi258l/Q2MWHJMImAcNpZ8DEdYAK72NHoIQ9Eg==", + "requires": { + "browser-stdout": "1.3.0", + "commander": "2.9.0", + "debug": "2.6.8", + "diff": "3.2.0", + "escape-string-regexp": "1.0.5", + "glob": "7.1.1", + "growl": "1.9.2", + "he": "1.1.1", + "json3": "3.3.2", + "lodash.create": "3.1.1", + "mkdirp": "0.5.1", + "supports-color": "3.1.2" + } + }, + "supports-color": { + "version": "3.1.2", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-3.1.2.tgz", + "integrity": "sha1-cqJiiU2dQIuVbKBf83su2KbiotU=", + "requires": { + "has-flag": "1.0.0" + } + } } }, "colors": { @@ -889,8 +912,7 @@ "concat-map": { "version": "0.0.1", "resolved": "https://registry.npmjs.org/concat-map/-/concat-map-0.0.1.tgz", - "integrity": "sha1-2Klr13/Wjfd5OnMDajug1UBdR3s=", - "dev": true + "integrity": "sha1-2Klr13/Wjfd5OnMDajug1UBdR3s=" }, "content-disposition": { "version": "0.5.2", @@ -916,11 +938,6 @@ "resolved": "https://registry.npmjs.org/copy-to/-/copy-to-2.0.1.tgz", "integrity": "sha1-JoD7uAaKSNCGVrYJgJK9r8kG9KU=" }, - "core-js": { - "version": "2.5.3", - "resolved": "https://registry.npmjs.org/core-js/-/core-js-2.5.3.tgz", - "integrity": "sha1-isw4NFgk8W2DZbfJtCWRaOjtYD4=" - }, "core-util-is": { "version": "1.0.2", "resolved": "https://registry.npmjs.org/core-util-is/-/core-util-is-1.0.2.tgz", @@ -1002,21 +1019,6 @@ "mimic-response": "1.0.0" } }, - "deep-eql": { - "version": "0.1.3", - "resolved": "https://registry.npmjs.org/deep-eql/-/deep-eql-0.1.3.tgz", - "integrity": "sha1-71WKyrjeJSBs1xOQbXTlaTDrafI=", - "requires": { - "type-detect": "0.1.1" - }, - "dependencies": { - "type-detect": { - "version": "0.1.1", - "resolved": "https://registry.npmjs.org/type-detect/-/type-detect-0.1.1.tgz", - "integrity": "sha1-C6XsKohWQORw6k6FBZcZANrFiCI=" - } - } - }, "deep-equal": { "version": "1.0.1", "resolved": "https://registry.npmjs.org/deep-equal/-/deep-equal-1.0.1.tgz", @@ -1230,150 +1232,7 @@ "fs.realpath": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/fs.realpath/-/fs.realpath-1.0.0.tgz", - "integrity": "sha1-FQStJSMVjKpA20onh8sBQRmU6k8=", - "dev": true - }, - "gdax": { - "version": "0.4.2", - "resolved": "https://registry.npmjs.org/gdax/-/gdax-0.4.2.tgz", - "integrity": "sha1-jo0GIi7Zfl40l11W9R6/SaVvqHI=", - "requires": { - "async": "1.5.0", - "bintrees": "1.0.0", - "lodash.assign": "3.0.0", - "lodash.foreach": "3.0.0", - "lodash.partial": "3.0.0", - "nock": "3.6.0", - "num": "0.2.1", - "request": "2.74.0", - "ws": "1.1.1" - }, - "dependencies": { - "async": { - "version": "1.5.0", - "resolved": "https://registry.npmjs.org/async/-/async-1.5.0.tgz", - "integrity": "sha1-J5ZkJyNXOFlWVjP8YnRES+4vjOM=" - }, - "bl": { - "version": "1.1.2", - "resolved": "https://registry.npmjs.org/bl/-/bl-1.1.2.tgz", - "integrity": "sha1-/cqHGplxOqANGeO7ukHER4emU5g=", - "requires": { - "readable-stream": "2.0.6" - } - }, - "caseless": { - "version": "0.11.0", - "resolved": "https://registry.npmjs.org/caseless/-/caseless-0.11.0.tgz", - "integrity": "sha1-cVuW6phBWTzDMGeSP17GDr2k99c=" - }, - "form-data": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/form-data/-/form-data-1.0.1.tgz", - "integrity": "sha1-rjFduaSQf6BlUCMEpm13M0de43w=", - "requires": { - "async": "2.5.0", - "combined-stream": "1.0.5", - "mime-types": "2.1.17" - }, - "dependencies": { - "async": { - "version": "2.5.0", - "resolved": "https://registry.npmjs.org/async/-/async-2.5.0.tgz", - "integrity": "sha512-e+lJAJeNWuPCNyxZKOBdaJGyLGHugXVQtrAwtuAe2vhxTYxFTKE73p8JuTmdH0qdQZtDvI4dhJwjZc5zsfIsYw==", - "requires": { - "lodash": "4.17.4" - } - } - } - }, - "har-validator": { - "version": "2.0.6", - "resolved": "https://registry.npmjs.org/har-validator/-/har-validator-2.0.6.tgz", - "integrity": "sha1-zcvAgYgmWtEZtqWnyKtw7s+10n0=", - "requires": { - "chalk": "1.1.3", - "commander": "2.13.0", - "is-my-json-valid": "2.16.1", - "pinkie-promise": "2.0.1" - } - }, - "isarray": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/isarray/-/isarray-1.0.0.tgz", - "integrity": "sha1-u5NdSFgsuhaMBoNJV6VKPgcSTxE=" - }, - "lodash": { - "version": "4.17.4", - "resolved": "https://registry.npmjs.org/lodash/-/lodash-4.17.4.tgz", - "integrity": "sha1-eCA6TRwyiuHYbcpkYONptX9AVa4=" - }, - "node-uuid": { - "version": "1.4.8", - "resolved": "https://registry.npmjs.org/node-uuid/-/node-uuid-1.4.8.tgz", - "integrity": "sha1-sEDrCSOWivq/jTL7HxfxFn/auQc=" - }, - "qs": { - "version": "6.2.3", - "resolved": "https://registry.npmjs.org/qs/-/qs-6.2.3.tgz", - "integrity": "sha1-HPyyXBCpsrSDBT/zn138kjOQjP4=" - }, - "readable-stream": { - "version": "2.0.6", - "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-2.0.6.tgz", - "integrity": "sha1-j5A0HmilPMySh4jaz80Rs265t44=", - "requires": { - "core-util-is": "1.0.2", - "inherits": "2.0.3", - "isarray": "1.0.0", - "process-nextick-args": "1.0.7", - "string_decoder": "0.10.31", - "util-deprecate": "1.0.2" - } - }, - "request": { - "version": "2.74.0", - "resolved": "https://registry.npmjs.org/request/-/request-2.74.0.tgz", - "integrity": "sha1-dpPKdou7DqXIzgjAhKRe+gW4kqs=", - "requires": { - "aws-sign2": "0.6.0", - "aws4": "1.6.0", - "bl": "1.1.2", - "caseless": "0.11.0", - "combined-stream": "1.0.5", - "extend": "3.0.1", - "forever-agent": "0.6.1", - "form-data": "1.0.1", - "har-validator": "2.0.6", - "hawk": "3.1.3", - "http-signature": "1.1.1", - "is-typedarray": "1.0.0", - "isstream": "0.1.2", - "json-stringify-safe": "5.0.1", - "mime-types": "2.1.17", - "node-uuid": "1.4.8", - "oauth-sign": "0.8.2", - "qs": "6.2.3", - "stringstream": "0.0.5", - "tough-cookie": "2.3.2", - "tunnel-agent": "0.4.3" - } - }, - "tunnel-agent": { - "version": "0.4.3", - "resolved": "https://registry.npmjs.org/tunnel-agent/-/tunnel-agent-0.4.3.tgz", - "integrity": "sha1-Y3PbdpCf5XDgjXNYM2Xtgop07us=" - }, - "ws": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/ws/-/ws-1.1.1.tgz", - "integrity": "sha1-CC3bbGQehdS7RR8D1S8G6r2x8Bg=", - "requires": { - "options": "0.0.6", - "ultron": "1.0.2" - } - } - } + "integrity": "sha1-FQStJSMVjKpA20onh8sBQRmU6k8=" }, "gekko": { "version": "0.0.9", @@ -1566,8 +1425,7 @@ "get-func-name": { "version": "2.0.0", "resolved": "https://registry.npmjs.org/get-func-name/-/get-func-name-2.0.0.tgz", - "integrity": "sha1-6td0q+5y4gQJQzoGY2YCPdaIekE=", - "dev": true + "integrity": "sha1-6td0q+5y4gQJQzoGY2YCPdaIekE=" }, "get-stream": { "version": "3.0.0", @@ -1624,6 +1482,11 @@ "url-to-options": "1.0.1" } }, + "graceful-readlink": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/graceful-readlink/-/graceful-readlink-1.0.1.tgz", + "integrity": "sha1-TK+tdrxi8C+gObL5Tpo906ORpyU=" + }, "growl": { "version": "1.10.3", "resolved": "https://registry.npmjs.org/growl/-/growl-1.10.3.tgz", @@ -1685,8 +1548,7 @@ "he": { "version": "1.1.1", "resolved": "https://registry.npmjs.org/he/-/he-1.1.1.tgz", - "integrity": "sha1-k0EP0hsAlzUVH4howvJx80J+I/0=", - "dev": true + "integrity": "sha1-k0EP0hsAlzUVH4howvJx80J+I/0=" }, "hoek": { "version": "2.16.3", @@ -1785,7 +1647,6 @@ "version": "1.0.6", "resolved": "https://registry.npmjs.org/inflight/-/inflight-1.0.6.tgz", "integrity": "sha1-Sb1jMdfQLQwJvJEKEHW6gWW1bfk=", - "dev": true, "requires": { "once": "1.4.0", "wrappy": "1.0.2" @@ -1796,11 +1657,6 @@ "resolved": "https://registry.npmjs.org/inherits/-/inherits-2.0.3.tgz", "integrity": "sha1-Yzwsg+PaQqUC9SRmAiSA9CCCYd4=" }, - "int": { - "version": "0.1.1", - "resolved": "https://registry.npmjs.org/int/-/int-0.1.1.tgz", - "integrity": "sha1-18efL4PP9QXTXoaYD4H6FPM4ekw=" - }, "ipcee": { "version": "1.0.6", "resolved": "https://registry.npmjs.org/ipcee/-/ipcee-1.0.6.tgz", @@ -1909,6 +1765,11 @@ "resolved": "https://registry.npmjs.org/json-stringify-safe/-/json-stringify-safe-5.0.1.tgz", "integrity": "sha1-Epai1Y/UXxmg9s4B1lcB4sc1tus=" }, + "json3": { + "version": "3.3.2", + "resolved": "https://registry.npmjs.org/json3/-/json3-3.3.2.tgz", + "integrity": "sha1-PAQ0dD35Pi9cQq7nsZvLSDV19OE=" + }, "jsonic": { "version": "0.3.0", "resolved": "https://registry.npmjs.org/jsonic/-/jsonic-0.3.0.tgz", @@ -1929,15 +1790,6 @@ "resolved": "https://registry.npmjs.org/jsonpointer/-/jsonpointer-4.0.1.tgz", "integrity": "sha1-T9kss04OnbPInIYi7PUfm5eMbLk=" }, - "JSONStream": { - "version": "1.3.1", - "resolved": "https://registry.npmjs.org/JSONStream/-/JSONStream-1.3.1.tgz", - "integrity": "sha1-cH92HgHa6eFvG8+TcDt4xwlmV5o=", - "requires": { - "jsonparse": "1.3.1", - "through": "2.3.8" - } - }, "jsprim": { "version": "1.4.1", "resolved": "https://registry.npmjs.org/jsprim/-/jsprim-1.4.1.tgz", @@ -2115,11 +1967,6 @@ "resolved": "https://registry.npmjs.org/lodash/-/lodash-2.4.2.tgz", "integrity": "sha1-+t2DS5aDBz2hebPq5tnA0VBT9z4=" }, - "lodash._arrayeach": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/lodash._arrayeach/-/lodash._arrayeach-3.0.0.tgz", - "integrity": "sha1-urFWsqkNPxu9XGU0AzSeXlkz754=" - }, "lodash._baseassign": { "version": "3.2.0", "resolved": "https://registry.npmjs.org/lodash._baseassign/-/lodash._baseassign-3.2.0.tgz", @@ -2134,41 +1981,10 @@ "resolved": "https://registry.npmjs.org/lodash._basecopy/-/lodash._basecopy-3.0.1.tgz", "integrity": "sha1-jaDmqHbPNEwK2KVIghEd08XHyjY=" }, - "lodash._baseeach": { - "version": "3.0.4", - "resolved": "https://registry.npmjs.org/lodash._baseeach/-/lodash._baseeach-3.0.4.tgz", - "integrity": "sha1-z4cGVyyhROjZ11InyZDamC+TKvM=", - "requires": { - "lodash.keys": "3.1.2" - } - }, - "lodash._baseslice": { + "lodash._basecreate": { "version": "3.0.3", - "resolved": "https://registry.npmjs.org/lodash._baseslice/-/lodash._baseslice-3.0.3.tgz", - "integrity": "sha1-qkrj3FPu1TsI3i4zYrOTV7XIfXU=" - }, - "lodash._bindcallback": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/lodash._bindcallback/-/lodash._bindcallback-3.0.1.tgz", - "integrity": "sha1-5THCdkTPi1epnhftlbNcdIeJOS4=" - }, - "lodash._createassigner": { - "version": "3.1.1", - "resolved": "https://registry.npmjs.org/lodash._createassigner/-/lodash._createassigner-3.1.1.tgz", - "integrity": "sha1-g4pbri/aymOsIt7o4Z+k5taXCxE=", - "requires": { - "lodash._bindcallback": "3.0.1", - "lodash._isiterateecall": "3.0.9", - "lodash.restparam": "3.6.1" - } - }, - "lodash._createwrapper": { - "version": "3.2.0", - "resolved": "https://registry.npmjs.org/lodash._createwrapper/-/lodash._createwrapper-3.2.0.tgz", - "integrity": "sha1-30U+ZkFjIXuJWkVAZa8cR6DqPE0=", - "requires": { - "lodash._root": "3.0.1" - } + "resolved": "https://registry.npmjs.org/lodash._basecreate/-/lodash._basecreate-3.0.3.tgz", + "integrity": "sha1-G8ZhYU2qf8MRt9A78WgGoCE8+CE=" }, "lodash._getnative": { "version": "3.9.1", @@ -2180,34 +1996,14 @@ "resolved": "https://registry.npmjs.org/lodash._isiterateecall/-/lodash._isiterateecall-3.0.9.tgz", "integrity": "sha1-UgOte6Ql+uhCRg5pbbnPPmqsBXw=" }, - "lodash._replaceholders": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/lodash._replaceholders/-/lodash._replaceholders-3.0.0.tgz", - "integrity": "sha1-iru3EmxDH37XRPe6rznwi8m9nVg=" - }, - "lodash._root": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/lodash._root/-/lodash._root-3.0.1.tgz", - "integrity": "sha1-+6HEUkwZ7ppfgTa0YJ8BfPTe1pI=" - }, - "lodash.assign": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/lodash.assign/-/lodash.assign-3.0.0.tgz", - "integrity": "sha1-93SdFYCkEgJzo3H1SmaxTJ1yJvo=", + "lodash.create": { + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/lodash.create/-/lodash.create-3.1.1.tgz", + "integrity": "sha1-1/KEnw29p+BGgruM1yqwIkYd6+c=", "requires": { "lodash._baseassign": "3.2.0", - "lodash._createassigner": "3.1.1" - } - }, - "lodash.foreach": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/lodash.foreach/-/lodash.foreach-3.0.0.tgz", - "integrity": "sha1-HbUp13oExYxS8YbxTeMucEPog6Q=", - "requires": { - "lodash._arrayeach": "3.0.0", - "lodash._baseeach": "3.0.4", - "lodash._bindcallback": "3.0.1", - "lodash.isarray": "3.0.4" + "lodash._basecreate": "3.0.3", + "lodash._isiterateecall": "3.0.9" } }, "lodash.get": { @@ -2236,21 +2032,6 @@ "lodash.isarray": "3.0.4" } }, - "lodash.partial": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/lodash.partial/-/lodash.partial-3.0.0.tgz", - "integrity": "sha1-H6mgMweqKDu41PFave4PL0AJCpY=", - "requires": { - "lodash._baseslice": "3.0.3", - "lodash._createwrapper": "3.2.0", - "lodash._replaceholders": "3.0.0" - } - }, - "lodash.restparam": { - "version": "3.6.1", - "resolved": "https://registry.npmjs.org/lodash.restparam/-/lodash.restparam-3.6.1.tgz", - "integrity": "sha1-k2pOMJ7zMKdkXtQUWYbIWuWyCAU=" - }, "lolex": { "version": "2.3.1", "resolved": "https://registry.npmjs.org/lolex/-/lolex-2.3.1.tgz", @@ -2320,7 +2101,6 @@ "version": "3.0.4", "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.0.4.tgz", "integrity": "sha512-yJHVQEhyqPLUTgt9B83PXu6W3rx4MvvHvSUvToogpwoGDOUQ+yDrR0HRot+yOCdCO7u4hX3pWft6kWBBcqh0UA==", - "dev": true, "requires": { "brace-expansion": "1.1.8" } @@ -2444,37 +2224,6 @@ } } }, - "nock": { - "version": "3.6.0", - "resolved": "https://registry.npmjs.org/nock/-/nock-3.6.0.tgz", - "integrity": "sha1-0mxAAEs0SaZVuRt0rjxW/ALIRSU=", - "requires": { - "chai": "3.5.0", - "debug": "2.6.8", - "deep-equal": "1.0.1", - "json-stringify-safe": "5.0.1", - "lodash": "2.4.1", - "mkdirp": "0.5.1", - "propagate": "0.3.1" - }, - "dependencies": { - "chai": { - "version": "3.5.0", - "resolved": "https://registry.npmjs.org/chai/-/chai-3.5.0.tgz", - "integrity": "sha1-TQJjewZ/6Vi9v906QOxW/vc3Mkc=", - "requires": { - "assertion-error": "1.0.2", - "deep-eql": "0.1.3", - "type-detect": "1.0.0" - } - }, - "lodash": { - "version": "2.4.1", - "resolved": "https://registry.npmjs.org/lodash/-/lodash-2.4.1.tgz", - "integrity": "sha1-W3cjA03aTSYuWkb7LFjXzCL3FCA=" - } - } - }, "node-wex": { "version": "1.0.3", "resolved": "https://registry.npmjs.org/node-wex/-/node-wex-1.0.3.tgz", @@ -2642,9 +2391,9 @@ "resolved": "https://registry.npmjs.org/node.bittrex.api/-/node.bittrex.api-0.4.4.tgz", "integrity": "sha512-zNrwiSufttRBfPeSJfQLRDd9AHQuAL2IVxJEdEtNvwqvqHsdRvPkiQfANOzPy+0jFM/J8/t6/+gJ8Df+0GkgiQ==", "requires": { + "JSONStream": "1.3.1", "event-stream": "3.3.4", "jsonic": "0.3.0", - "JSONStream": "1.3.1", "request": "2.83.0", "signalr-client": "0.0.17" } @@ -2657,11 +2406,6 @@ "asap": "2.0.6" } }, - "nonce": { - "version": "1.0.4", - "resolved": "https://registry.npmjs.org/nonce/-/nonce-1.0.4.tgz", - "integrity": "sha1-7nMCrejBvvR28wG4yR9cxRpIdhI=" - }, "nth-check": { "version": "1.0.1", "resolved": "https://registry.npmjs.org/nth-check/-/nth-check-1.0.1.tgz", @@ -2670,14 +2414,6 @@ "boolbase": "1.0.0" } }, - "num": { - "version": "0.2.1", - "resolved": "https://registry.npmjs.org/num/-/num-0.2.1.tgz", - "integrity": "sha1-Agqy79KldZ5VA5HivFoEwnifWNo=", - "requires": { - "int": "0.1.1" - } - }, "oauth-sign": { "version": "0.8.2", "resolved": "https://registry.npmjs.org/oauth-sign/-/oauth-sign-0.8.2.tgz", @@ -2806,7 +2542,6 @@ "version": "1.4.0", "resolved": "https://registry.npmjs.org/once/-/once-1.4.0.tgz", "integrity": "sha1-WDsap3WWHUsROsF9nFC6753Xa9E=", - "dev": true, "requires": { "wrappy": "1.0.2" } @@ -2874,8 +2609,7 @@ "pathval": { "version": "1.1.0", "resolved": "https://registry.npmjs.org/pathval/-/pathval-1.1.0.tgz", - "integrity": "sha1-uULm1L3mUwBe9rcTYd74cn0GReA=", - "dev": true + "integrity": "sha1-uULm1L3mUwBe9rcTYd74cn0GReA=" }, "pause-stream": { "version": "0.0.11", @@ -2908,167 +2642,6 @@ "resolved": "https://registry.npmjs.org/pkginfo/-/pkginfo-0.4.1.tgz", "integrity": "sha1-tUGO8EOd5UJfxJlQQtztFPsqhP8=" }, - "poloniex.js": { - "version": "0.0.7", - "resolved": "https://registry.npmjs.org/poloniex.js/-/poloniex.js-0.0.7.tgz", - "integrity": "sha1-B0crcBZtztjjaI0eqI7+3ZBrKeU=", - "requires": { - "nonce": "1.0.4", - "request": "2.33.0" - }, - "dependencies": { - "asn1": { - "version": "0.1.11", - "resolved": "https://registry.npmjs.org/asn1/-/asn1-0.1.11.tgz", - "integrity": "sha1-VZvhg3bQik7E2+gId9J4GGObLfc=", - "optional": true - }, - "assert-plus": { - "version": "0.1.5", - "resolved": "https://registry.npmjs.org/assert-plus/-/assert-plus-0.1.5.tgz", - "integrity": "sha1-7nQAlBMALYTOxyGcasgRgS5yMWA=", - "optional": true - }, - "async": { - "version": "0.9.2", - "resolved": "https://registry.npmjs.org/async/-/async-0.9.2.tgz", - "integrity": "sha1-rqdNXmHB+JlhO/ZL2mbUx48v0X0=", - "optional": true - }, - "aws-sign2": { - "version": "0.5.0", - "resolved": "https://registry.npmjs.org/aws-sign2/-/aws-sign2-0.5.0.tgz", - "integrity": "sha1-xXED96F/wDfwLXwuZLYC6iI/fWM=", - "optional": true - }, - "boom": { - "version": "0.4.2", - "resolved": "https://registry.npmjs.org/boom/-/boom-0.4.2.tgz", - "integrity": "sha1-emNune1O/O+xnO9JR6PGffrukRs=", - "requires": { - "hoek": "0.9.1" - } - }, - "combined-stream": { - "version": "0.0.7", - "resolved": "https://registry.npmjs.org/combined-stream/-/combined-stream-0.0.7.tgz", - "integrity": "sha1-ATfmV7qlp1QcV6w3rF/AfXO03B8=", - "optional": true, - "requires": { - "delayed-stream": "0.0.5" - } - }, - "cryptiles": { - "version": "0.2.2", - "resolved": "https://registry.npmjs.org/cryptiles/-/cryptiles-0.2.2.tgz", - "integrity": "sha1-7ZH/HxetE9N0gohZT4pIoNJvMlw=", - "optional": true, - "requires": { - "boom": "0.4.2" - } - }, - "delayed-stream": { - "version": "0.0.5", - "resolved": "https://registry.npmjs.org/delayed-stream/-/delayed-stream-0.0.5.tgz", - "integrity": "sha1-1LH0OpPoKW3+AmlPRoC8N6MTxz8=", - "optional": true - }, - "forever-agent": { - "version": "0.5.2", - "resolved": "https://registry.npmjs.org/forever-agent/-/forever-agent-0.5.2.tgz", - "integrity": "sha1-bQ4JxJIflKJ/Y9O0nF/v8epMUTA=" - }, - "form-data": { - "version": "0.1.4", - "resolved": "https://registry.npmjs.org/form-data/-/form-data-0.1.4.tgz", - "integrity": "sha1-kavXiKupcCsaq/qLwBAxoqyeOxI=", - "optional": true, - "requires": { - "async": "0.9.2", - "combined-stream": "0.0.7", - "mime": "1.2.11" - } - }, - "hawk": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/hawk/-/hawk-1.0.0.tgz", - "integrity": "sha1-uQuxaYByhUEdp//LjdJZhQLTtS0=", - "optional": true, - "requires": { - "boom": "0.4.2", - "cryptiles": "0.2.2", - "hoek": "0.9.1", - "sntp": "0.2.4" - } - }, - "hoek": { - "version": "0.9.1", - "resolved": "https://registry.npmjs.org/hoek/-/hoek-0.9.1.tgz", - "integrity": "sha1-PTIkYrrfB3Fup+uFuviAec3c5QU=" - }, - "http-signature": { - "version": "0.10.1", - "resolved": "https://registry.npmjs.org/http-signature/-/http-signature-0.10.1.tgz", - "integrity": "sha1-T72sEyVZqoMjEh5UB3nAoBKyfmY=", - "optional": true, - "requires": { - "asn1": "0.1.11", - "assert-plus": "0.1.5", - "ctype": "0.5.3" - } - }, - "node-uuid": { - "version": "1.4.8", - "resolved": "https://registry.npmjs.org/node-uuid/-/node-uuid-1.4.8.tgz", - "integrity": "sha1-sEDrCSOWivq/jTL7HxfxFn/auQc=" - }, - "oauth-sign": { - "version": "0.3.0", - "resolved": "https://registry.npmjs.org/oauth-sign/-/oauth-sign-0.3.0.tgz", - "integrity": "sha1-y1QPk7srIqfVlBaRoojWDo6pOG4=", - "optional": true - }, - "qs": { - "version": "0.6.6", - "resolved": "https://registry.npmjs.org/qs/-/qs-0.6.6.tgz", - "integrity": "sha1-bgFQmP9RlouKPIGQAdXyyJvEsQc=" - }, - "request": { - "version": "2.33.0", - "resolved": "https://registry.npmjs.org/request/-/request-2.33.0.tgz", - "integrity": "sha1-UWeHgTFyYHDsYzdS6iMKI3ncZf8=", - "requires": { - "aws-sign2": "0.5.0", - "forever-agent": "0.5.2", - "form-data": "0.1.4", - "hawk": "1.0.0", - "http-signature": "0.10.1", - "json-stringify-safe": "5.0.1", - "mime": "1.2.11", - "node-uuid": "1.4.8", - "oauth-sign": "0.3.0", - "qs": "0.6.6", - "tough-cookie": "2.3.2", - "tunnel-agent": "0.3.0" - } - }, - "sntp": { - "version": "0.2.4", - "resolved": "https://registry.npmjs.org/sntp/-/sntp-0.2.4.tgz", - "integrity": "sha1-+4hfGLDzqtGJ+CSGJTa87ux1CQA=", - "optional": true, - "requires": { - "hoek": "0.9.1" - } - }, - "tunnel-agent": { - "version": "0.3.0", - "resolved": "https://registry.npmjs.org/tunnel-agent/-/tunnel-agent-0.3.0.tgz", - "integrity": "sha1-rWgbaPUyGtKCfEz7G31d8s/pQu4=", - "optional": true - } - } - }, "prepend-http": { "version": "1.0.4", "resolved": "https://registry.npmjs.org/prepend-http/-/prepend-http-1.0.4.tgz", @@ -3111,11 +2684,6 @@ } } }, - "propagate": { - "version": "0.3.1", - "resolved": "https://registry.npmjs.org/propagate/-/propagate-0.3.1.tgz", - "integrity": "sha1-46hEBKfs6CDda76p9tkk4xNa4Jw=" - }, "proxyquire": { "version": "1.8.0", "resolved": "https://registry.npmjs.org/proxyquire/-/proxyquire-1.8.0.tgz", @@ -3373,11 +2941,6 @@ "string_decoder": "0.10.31" } }, - "regenerator-runtime": { - "version": "0.11.1", - "resolved": "https://registry.npmjs.org/regenerator-runtime/-/regenerator-runtime-0.11.1.tgz", - "integrity": "sha512-MguG95oij0fC3QV3URf4V2SDYGJhJnJGqvIIgdECeODCT98wSWDAJ94SSuVpYQUoTcGUIL6L4yNB7j1DFFHSBg==" - }, "relieve": { "version": "2.2.1", "resolved": "https://registry.npmjs.org/relieve/-/relieve-2.2.1.tgz", @@ -4272,14 +3835,6 @@ } } }, - "string_decoder": { - "version": "1.0.3", - "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-1.0.3.tgz", - "integrity": "sha512-4AH6Z5fzNNBcH+6XDMfA/BTt87skxqJlO0lAh3Dker5zThcAxG6mKz+iGu308UKoPPQ8Dcqx/4JhujzltRa+hQ==", - "requires": { - "safe-buffer": "5.1.1" - } - }, "string-width": { "version": "1.0.2", "bundled": true, @@ -4289,6 +3844,14 @@ "strip-ansi": "3.0.1" } }, + "string_decoder": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-1.0.3.tgz", + "integrity": "sha512-4AH6Z5fzNNBcH+6XDMfA/BTt87skxqJlO0lAh3Dker5zThcAxG6mKz+iGu308UKoPPQ8Dcqx/4JhujzltRa+hQ==", + "requires": { + "safe-buffer": "5.1.1" + } + }, "stringstream": { "version": "0.0.5", "bundled": true @@ -4540,11 +4103,6 @@ "request": "2.83.0" } }, - "type-detect": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/type-detect/-/type-detect-1.0.0.tgz", - "integrity": "sha1-diIXzAbbJY7EiQihKY6LlRIejqI=" - }, "type-is": { "version": "1.6.15", "resolved": "https://registry.npmjs.org/type-is/-/type-is-1.6.15.tgz", @@ -4661,8 +4219,7 @@ "wrappy": { "version": "1.0.2", "resolved": "https://registry.npmjs.org/wrappy/-/wrappy-1.0.2.tgz", - "integrity": "sha1-tSQ9jz7BqjXxNkYFvA0QNuMKtp8=", - "dev": true + "integrity": "sha1-tSQ9jz7BqjXxNkYFvA0QNuMKtp8=" }, "ws": { "version": "1.1.4", diff --git a/package.json b/package.json index 91ea09298..0d56e2f87 100644 --- a/package.json +++ b/package.json @@ -1,6 +1,6 @@ { "name": "gekko", - "version": "0.5.14", + "version": "0.6.0", "description": "A bitcoin trading bot for auto trading at various exchanges", "keywords": [ "trading", @@ -17,7 +17,6 @@ "dependencies": { "@slack/client": "^3.10.0", "async": "2.1.2", - "binance": "^1.3.1", "bitcoin-co-id-update": "0.0.2", "bitexthai": "^0.1.0", "bitfinex-api-node": "^1.2.0", @@ -27,10 +26,8 @@ "btc-markets": "0.0.10", "cexio": "0.0.x", "co-fs": "^1.2.0", - "coinfalcon": "^1.0.3", "coingi": "^1.0.7", "commander": "^2.13.0", - "gdax": "^0.4.2", "gekko": "0.0.9", "gemini-exchange-coffee-api": "2.0.6", "humanize-duration": "^3.10.0", @@ -40,7 +37,6 @@ "koa-logger": "^1.3.0", "koa-router": "^5.4.0", "koa-static": "^2.0.0", - "kraken-api-es5": "^1.0.0", "lakebtc_nodejs": "0.1.x", "lodash": "2.x", "moment": "^2.20.1", @@ -48,7 +44,6 @@ "node.bittrex.api": "^0.4.3", "okcoin-china": "0.0.7", "opn": "^4.0.2", - "poloniex.js": "0.0.7", "promisify-node": "^0.4.0", "prompt-lite": "0.1.1", "pushbullet": "1.4.3", @@ -72,7 +67,7 @@ "sinon": "^4.2.0" }, "engines": { - "node": ">=6.0" + "node": ">=8.11.2" }, "license": "MIT", "repository": { diff --git a/plugins.js b/plugins.js index af5f8dca2..813d3ccce 100644 --- a/plugins.js +++ b/plugins.js @@ -14,6 +14,7 @@ // allowed to run. Realtime is during a live market watch and // backtest is during a backtest. // +// // Optional parameters per plugin. // // description: text describing the plugin. @@ -22,6 +23,8 @@ // emits: events emitted by this plugin that other plugins can subscribe to. // path: fn that returns path of file of the plugin (overwrites `gekko/plugins/{slug}`) // when given the configuration object (relative from `gekko/plugins/`). +// greedy: if this plugin wants to subscribe to a lot of events, but can function +// properly when some events wont be emitted. var plugins = [ { name: 'Candle writer', @@ -38,7 +41,7 @@ var plugins = [ slug: 'tradingAdvisor', async: true, modes: ['realtime', 'backtest'], - emits: ['advice'], + emits: ['advice', 'stratWarmupCompleted', 'stratCandle', 'stratUpdate'], path: config => 'tradingAdvisor/tradingAdvisor.js', }, { @@ -143,6 +146,7 @@ var plugins = [ slug: 'performanceAnalyzer', async: false, modes: ['realtime', 'backtest'], + emits: ['roundtrip', 'roundtripUpdate', 'performanceUpdate'], path: config => 'performanceAnalyzer/performanceAnalyzer.js', }, { @@ -190,6 +194,28 @@ var plugins = [ slug: 'ifttt', async: false, modes: ['realtime'] + }, + { + name: 'Event logger', + description: 'Logs all gekko events.', + slug: 'eventLogger', + async: false, + modes: ['realtime', 'backtest'] + }, + { + name: 'Backtest result export', + description: 'Exports the results of a gekko backtest', + slug: 'backtestResultExporter', + async: false, + modes: ['backtest'] + }, + { + name: 'Child to parent', + description: 'Relays events from the child to the parent process', + slug: 'childToParent', + async: false, + modes: ['realtime'], + greedy: true } ]; diff --git a/plugins/backtestResultExporter.js b/plugins/backtestResultExporter.js new file mode 100644 index 000000000..9563753b7 --- /dev/null +++ b/plugins/backtestResultExporter.js @@ -0,0 +1,119 @@ +// Small plugin that subscribes to some events, stores +// them and sends it to the parent process. + +const log = require('../core/log'); +const _ = require('lodash'); +const util = require('../core/util.js'); +const config = util.getConfig(); +const moment = require('moment'); +const fs = require('fs'); + +const BacktestResultExporter = function() { + this.performanceReport; + this.roundtrips = []; + this.stratUpdates = []; + this.stratCandles = []; + this.trades = []; + + this.candleProps = config.backtestResultExporter.data.stratCandleProps; + + if(!config.backtestResultExporter.data.stratUpdates) + this.processStratUpdate = null; + + if(!config.backtestResultExporter.data.roundtrips) + this.processRoundtrip = null; + + if(!config.backtestResultExporter.data.stratCandles) + this.processStratCandles = null; + + if(!config.backtestResultExporter.data.trades) + this.processTradeCompleted = null; + + _.bindAll(this); +} + +BacktestResultExporter.prototype.processStratCandle = function(candle) { + let strippedCandle; + + if(!this.candleProps) { + strippedCandle = { + ...candle, + start: candle.start.unix() + } + } else { + strippedCandle = { + ..._.pick(candle, this.candleProps), + start: candle.start.unix() + } + } + + this.stratCandles.push(strippedCandle); +}; + +BacktestResultExporter.prototype.processRoundtrip = function(roundtrip) { + this.roundtrips.push({ + ...roundtrip, + entryAt: roundtrip.entryAt.unix(), + exitAt: roundtrip.exitAt.unix() + }); +}; + +BacktestResultExporter.prototype.processTradeCompleted = function(trade) { + this.trades.push({ + ...trade, + date: trade.date.unix() + }); +}; + +BacktestResultExporter.prototype.processStratUpdate = function(stratUpdate) { + this.stratUpdates.push({ + ...stratUpdate, + date: stratUpdate.date.unix() + }); +} + +BacktestResultExporter.prototype.processPerformanceReport = function(performanceReport) { + this.performanceReport = performanceReport; +} + +BacktestResultExporter.prototype.finalize = function(done) { + const backtest = { + performanceReport: this.performanceReport + }; + + if(config.backtestResultExporter.data.stratUpdates) + backtest.stratUpdates = this.stratUpdates; + + if(config.backtestResultExporter.data.roundtrips) + backtest.roundtrips = this.roundtrips; + + if(config.backtestResultExporter.data.stratCandles) + backtest.stratCandles = this.stratCandles; + + if(config.backtestResultExporter.data.trades) + backtest.trades = this.trades; + + process.send({backtest}); + + if(config.backtestResultExporter.writeToDisk) + this.writeToDisk(done) + else + done(); +}; + +BacktestResultExporter.prototype.writeToDisk = function(next) { + const now = moment().format('YYYY-MM-DD HH:mm:ss'); + const filename = `backtest-${config.tradingAdvisor.method}-${now}.log`; + fs.writeFile( + util.dirs().gekko + filename, + JSON.stringify(backtest), + err => { + if(err) + log.error('unable to write backtest result', err); + + next(); + } + ); +} + +module.exports = BacktestResultExporter; diff --git a/plugins/childToParent.js b/plugins/childToParent.js new file mode 100644 index 000000000..2044c6141 --- /dev/null +++ b/plugins/childToParent.js @@ -0,0 +1,24 @@ +// Small plugin that subscribes to some events, stores +// them and sends it to the parent process. + +const log = require('../core/log'); +const _ = require('lodash'); +const subscriptions = require('../subscriptions'); +const config = require('../core/util').getConfig(); + +const ChildToParent = function() { + + subscriptions + // .filter(sub => config.childToParent.events.includes(sub.event)) + .forEach(sub => { + this[sub.handler] = (event, next) => { + process.send({type: sub.event, payload: event}); + if(_.isFunction(next)) { + next(); + } + } + }, this); + +} + +module.exports = ChildToParent; \ No newline at end of file diff --git a/plugins/eventLogger.js b/plugins/eventLogger.js new file mode 100644 index 000000000..6e07fe0a7 --- /dev/null +++ b/plugins/eventLogger.js @@ -0,0 +1,20 @@ +const log = require('../core/log'); +const _ = require('lodash'); +const subscriptions = require('../subscriptions'); +const config = require('../core/util').getConfig().eventLogger; + +const EventLogger = function() {} + +_.each(subscriptions, sub => { + if(config.whitelist && !config.whitelist.includes(sub.event)) { + return; + } + + EventLogger.prototype[sub.handler] = (event, next) => { + log.info(`\t\t\t\t[EVENT ${sub.event}]\n`, event); + if(_.isFunction(next)) + next(); + } +}); + +module.exports = EventLogger; \ No newline at end of file diff --git a/plugins/paperTrader/paperTrader.js b/plugins/paperTrader/paperTrader.js index 1bbb720c9..9127860f1 100644 --- a/plugins/paperTrader/paperTrader.js +++ b/plugins/paperTrader/paperTrader.js @@ -18,37 +18,28 @@ const PaperTrader = function() { this.portfolio = { asset: calcConfig.simulationBalance.asset, currency: calcConfig.simulationBalance.currency, - balance: false } -} -// teach our paper trader events -util.makeEventEmitter(PaperTrader); + this.balance = false; -PaperTrader.prototype.relayTrade = function(advice) { - var what = advice.recommendation; - var price = advice.candle.close; - var at = advice.candle.start; + if(this.portfolio.asset > 0) { + this.exposed = true; + } - let action; - if(what === 'short') - action = 'sell'; - else if(what === 'long') - action = 'buy'; - else - return; + this.propogatedTrades = 0; +} - this.emit('trade', { - action, - price, - portfolio: _.clone(this.portfolio), - balance: this.portfolio.currency + this.price * this.portfolio.asset, - date: at +PaperTrader.prototype.relayPortfolioChange = function() { + this.deferredEmit('portfolioChange', { + asset: this.portfolio.asset, + currency: this.portfolio.currency }); } -PaperTrader.prototype.relayPortfolio = function() { - this.emit('portfolioUpdate', _.clone(this.portfolio)); +PaperTrader.prototype.relayPortfolioValueChange = function() { + this.deferredEmit('portfolioValueChange', { + balance: this.getBalance() + }); } PaperTrader.prototype.extractFee = function(amount) { @@ -60,8 +51,7 @@ PaperTrader.prototype.extractFee = function(amount) { } PaperTrader.prototype.setStartBalance = function() { - this.portfolio.balance = this.portfolio.currency + this.price * this.portfolio.asset; - this.relayPortfolio(); + this.balance = this.getBalance(); } // after every succesfull trend ride we hopefully end up @@ -69,38 +59,96 @@ PaperTrader.prototype.setStartBalance = function() { // calculates Gekko's profit in %. PaperTrader.prototype.updatePosition = function(advice) { let what = advice.recommendation; - let price = advice.candle.close; + + let cost; + let amount; + let effectivePrice; // virtually trade all {currency} to {asset} // at the current price (minus fees) if(what === 'long') { - this.portfolio.asset += this.extractFee(this.portfolio.currency / price); + cost = (1 - this.fee) * this.portfolio.currency; + this.portfolio.asset += this.extractFee(this.portfolio.currency / this.price); + amount = this.portfolio.asset; this.portfolio.currency = 0; + effectivePrice = this.price * (1 + this.fee); + + this.exposed = true; this.trades++; } // virtually trade all {currency} to {asset} // at the current price (minus fees) else if(what === 'short') { - this.portfolio.currency += this.extractFee(this.portfolio.asset * price); + cost = (1 - this.fee) * (this.portfolio.asset * this.price); + this.portfolio.currency += this.extractFee(this.portfolio.asset * this.price); + amount = this.portfolio.currency / this.price; this.portfolio.asset = 0; + effectivePrice = this.price * (1 - this.fee); + + this.exposed = false; this.trades++; } + + return { cost, amount, effectivePrice }; +} + +PaperTrader.prototype.getBalance = function() { + return this.portfolio.currency + this.price * this.portfolio.asset; } PaperTrader.prototype.processAdvice = function(advice) { - if(advice.recommendation === 'soft') + let action; + if(advice.recommendation === 'short') + action = 'sell'; + else if(advice.recommendation === 'long') + action = 'buy'; + else return; - this.updatePosition(advice); - this.relayTrade(advice); + this.tradeId = 'trade-' + (++this.propogatedTrades); + + this.deferredEmit('tradeInitiated', { + id: this.tradeId, + adviceId: advice.id, + action, + portfolio: _.clone(this.portfolio), + balance: this.getBalance(), + date: advice.date, + }); + + const { cost, amount, effectivePrice } = this.updatePosition(advice); + + this.relayPortfolioChange(); + this.relayPortfolioValueChange(); + + this.deferredEmit('tradeCompleted', { + id: this.tradeId, + adviceId: advice.id, + action, + cost, + amount, + price: this.price, + portfolio: this.portfolio, + balance: this.getBalance(), + date: advice.date, + effectivePrice, + feePercent: this.fee * 100 + }); } PaperTrader.prototype.processCandle = function(candle, done) { this.price = candle.close; - if(!this.portfolio.balance) + if(!this.balance) { this.setStartBalance(); + this.relayPortfolioChange(); + this.relayPortfolioValueChange(); + } + + if(this.exposed) { + this.relayPortfolioValueChange(); + } done(); } diff --git a/plugins/performanceAnalyzer/cpRelay.js b/plugins/performanceAnalyzer/cpRelay.js deleted file mode 100644 index c43c35c6c..000000000 --- a/plugins/performanceAnalyzer/cpRelay.js +++ /dev/null @@ -1,28 +0,0 @@ -// relay paper trade results using cp - -const _ = require('lodash'); -const moment = require('moment'); - -const util = require('../../core/util.js'); -const dirs = util.dirs(); -const mode = util.gekkoMode(); -const log = require(dirs.core + 'log'); -const cp = require(dirs.core + 'cp'); - -const Relay = function() {} - -Relay.prototype.handleTrade = function(trade, report) { - cp.trade(trade); - cp.report(report); -} - -Relay.prototype.handleRoundtrip = function(rt) { - cp.roundtrip(rt); -} - -Relay.prototype.finalize = function(report) { - cp.report(report); -} - - -module.exports = Relay; \ No newline at end of file diff --git a/plugins/performanceAnalyzer/logger.js b/plugins/performanceAnalyzer/logger.js index b2a176bb8..e087c39c5 100644 --- a/plugins/performanceAnalyzer/logger.js +++ b/plugins/performanceAnalyzer/logger.js @@ -1,4 +1,4 @@ -// log paper trade results using the logger +// log trade performance results const _ = require('lodash'); const moment = require('moment'); @@ -7,8 +7,6 @@ const humanizeDuration = require('humanize-duration'); const util = require('../../core/util.js'); const dirs = util.dirs(); const mode = util.gekkoMode(); -const config = util.getConfig(); -const calcConfig = config.paperTrader; const log = require(dirs.core + 'log'); const Logger = function(watchConfig) { @@ -22,10 +20,6 @@ Logger.prototype.round = function(amount) { return amount.toFixed(8); } -Logger.prototype.handleStartBalance = function() { - // noop -} - // used for: // - realtime logging (per advice) // - backtest logging (on finalize) @@ -35,10 +29,10 @@ Logger.prototype.logReport = function(trade, report) { var start = this.round(report.startBalance); var current = this.round(report.balance); - log.info(`(PROFIT REPORT) original simulated balance:\t ${start} ${this.currency}`); - log.info(`(PROFIT REPORT) current simulated balance:\t ${current} ${this.currency}`); + log.info(`(PROFIT REPORT) original balance:\t ${start} ${this.currency}`); + log.info(`(PROFIT REPORT) current balance:\t ${current} ${this.currency}`); log.info( - `(PROFIT REPORT) simulated profit:\t\t ${this.round(report.profit)} ${this.currency}`, + `(PROFIT REPORT) profit:\t\t ${this.round(report.profit)} ${this.currency}`, `(${this.round(report.relativeProfit)}%)` ); } @@ -51,7 +45,7 @@ Logger.prototype.logRoundtrip = function(rt) { const display = [ rt.entryAt.utc().format('YYYY-MM-DD HH:mm'), rt.exitAt.utc().format('YYYY-MM-DD HH:mm'), - (moment.duration(rt.duration).humanize() + " ").slice(0,16), + (moment.duration(rt.duration).humanize() + " ").slice(0, 16), rt.pnl.toFixed(2), rt.profit.toFixed(2) ]; @@ -59,8 +53,6 @@ Logger.prototype.logRoundtrip = function(rt) { log.info('(ROUNDTRIP)', display.join('\t')); } - - if(mode === 'backtest') { // we only want to log a summarized one line report, like: // 2016-12-19 20:12:00: Paper trader simulated a BUY 0.000 USDT => 1.098 BTC @@ -102,8 +94,7 @@ if(mode === 'backtest') { log.info(`(PROFIT REPORT) start time:\t\t\t ${report.startTime}`); log.info(`(PROFIT REPORT) end time:\t\t\t ${report.endTime}`); log.info(`(PROFIT REPORT) timespan:\t\t\t ${report.timespan}`); - if(report.sharpe) - log.info(`(PROFIT REPORT) sharpe ratio:\t\t\t ${report.sharpe}`); + log.info(`(PROFIT REPORT) exposure:\t\t\t ${report.exposure}`); log.info(); log.info(`(PROFIT REPORT) start price:\t\t\t ${report.startPrice} ${this.currency}`); log.info(`(PROFIT REPORT) end price:\t\t\t ${report.endPrice} ${this.currency}`); @@ -117,8 +108,11 @@ if(mode === 'backtest') { `(PROFIT REPORT) simulated yearly profit:\t ${report.yearlyProfit}`, `${this.currency} (${report.relativeYearlyProfit}%)` ); + + log.info(`(PROFIT REPORT) sharpe ratio:\t\t\t ${report.sharpe}`); + log.info(`(PROFIT REPORT) expected downside:\t\t ${report.downside}`); } - + Logger.prototype.handleRoundtrip = function(rt) { this.roundtrips.push(rt); } @@ -136,4 +130,4 @@ if(mode === 'backtest') { -module.exports = Logger; \ No newline at end of file +module.exports = Logger; diff --git a/plugins/performanceAnalyzer/performanceAnalyzer.js b/plugins/performanceAnalyzer/performanceAnalyzer.js index 5df48a2bf..7e1f57250 100644 --- a/plugins/performanceAnalyzer/performanceAnalyzer.js +++ b/plugins/performanceAnalyzer/performanceAnalyzer.js @@ -1,7 +1,8 @@ + const _ = require('lodash'); const moment = require('moment'); -const stats = require('../../core/stats'); +const statslite = require('stats-lite'); const util = require('../../core/util'); const ENV = util.gekkoEnv(); @@ -9,12 +10,7 @@ const config = util.getConfig(); const perfConfig = config.performanceAnalyzer; const watchConfig = config.watch; -// Load the proper module that handles the results -var Handler; -if(ENV === 'child-process') - Handler = require('./cpRelay'); -else - Handler = require('./logger'); +const Logger = require('./logger'); const PerformanceAnalyzer = function() { _.bindAll(this); @@ -30,23 +26,40 @@ const PerformanceAnalyzer = function() { this.currency = watchConfig.currency; this.asset = watchConfig.asset; - this.handler = new Handler(watchConfig); + this.logger = new Logger(watchConfig); this.trades = 0; - this.sharpe = 0; - + this.exposure = 0; + this.roundTrips = []; + this.losses = []; this.roundTrip = { id: 0, entry: false, exit: false } + + this.portfolio = {}; + this.balance; + + this.start = {}; + this.openRoundTrip = false; +} + +PerformanceAnalyzer.prototype.processPortfolioValueChange = function(event) { + if(!this.start.balance) + this.start.balance = event.balance; +} + +PerformanceAnalyzer.prototype.processPortfolioChange = function(event) { + if(!this.start.portfolio) + this.start.portfolio = event; } PerformanceAnalyzer.prototype.processCandle = function(candle, done) { this.price = candle.close; - this.dates.end = candle.start; + this.dates.end = candle.start.clone().add(1, 'minute'); if(!this.dates.start) { this.dates.start = candle.start; @@ -55,27 +68,41 @@ PerformanceAnalyzer.prototype.processCandle = function(candle, done) { this.endPrice = candle.close; + if(this.openRoundTrip) { + this.emitRoundtripUpdate(); + } + done(); } -PerformanceAnalyzer.prototype.processPortfolioUpdate = function(portfolio) { - this.start = portfolio; - this.current = _.clone(portfolio); +PerformanceAnalyzer.prototype.emitRoundtripUpdate = function() { + const uPnl = this.price - this.roundTrip.entry.price; + + this.deferredEmit('roundtripUpdate', { + at: this.dates.end, + duration: this.dates.end.diff(this.roundTrip.entry.date), + uPnl, + uProfit: uPnl / this.roundTrip.entry.total * 100 + }) } -PerformanceAnalyzer.prototype.processTrade = function(trade) { +PerformanceAnalyzer.prototype.processTradeCompleted = function(trade) { this.trades++; - this.current = trade.portfolio; + this.portfolio = trade.portfolio; + this.balance = trade.balance; const report = this.calculateReportStatistics(); - this.handler.handleTrade(trade, report); - this.logRoundtripPart(trade); + this.logger.handleTrade(trade, report); + + this.registerRoundtripPart(trade); + + this.deferredEmit('performanceReport', report); } -PerformanceAnalyzer.prototype.logRoundtripPart = function(trade) { - // this is not part of a valid roundtrip - if(!this.roundTrip.entry && trade.action === 'sell') { +PerformanceAnalyzer.prototype.registerRoundtripPart = function(trade) { + if(this.trades === 1 && trade.action === 'sell') { + // this is not part of a valid roundtrip return; } @@ -90,22 +117,20 @@ PerformanceAnalyzer.prototype.logRoundtripPart = function(trade) { price: trade.price, total: trade.portfolio.currency + (trade.portfolio.asset * trade.price), } + this.openRoundTrip = true; } else if(trade.action === 'sell') { this.roundTrip.exit = { date: trade.date, price: trade.price, total: trade.portfolio.currency + (trade.portfolio.asset * trade.price), } + this.openRoundTrip = false; - this.handleRoundtrip(); + this.handleCompletedRoundtrip(); } } -PerformanceAnalyzer.prototype.round = function(amount) { - return amount.toFixed(8); -} - -PerformanceAnalyzer.prototype.handleRoundtrip = function() { +PerformanceAnalyzer.prototype.handleCompletedRoundtrip = function() { var roundtrip = { id: this.roundTrip.id, @@ -125,50 +150,57 @@ PerformanceAnalyzer.prototype.handleRoundtrip = function() { this.roundTrips[this.roundTrip.id] = roundtrip; - // this will keep resending roundtrips, that is not ideal.. what do we do about it? - this.handler.handleRoundtrip(roundtrip); + this.logger.handleRoundtrip(roundtrip); - // we need a cache for sharpe + this.deferredEmit('roundtrip', roundtrip); - // every time we have a new roundtrip - // update the cached sharpe ratio - this.sharpe = stats.sharpe( - this.roundTrips.map(r => r.profit), - perfConfig.riskFreeReturn - ); + // update cached exposure + this.exposure = this.exposure + Date.parse(this.roundTrip.exit.date) - Date.parse(this.roundTrip.entry.date); + // track losses separately for downside report + if (roundtrip.exitBalance < roundtrip.entryBalance) + this.losses.push(roundtrip); + } PerformanceAnalyzer.prototype.calculateReportStatistics = function() { // the portfolio's balance is measured in {currency} - let balance = this.current.currency + this.price * this.current.asset; - let profit = balance - this.start.balance; + const profit = this.balance - this.start.balance; - let timespan = moment.duration( + const timespan = moment.duration( this.dates.end.diff(this.dates.start) ); - let relativeProfit = balance / this.start.balance * 100 - 100 - - let report = { - currency: this.currency, - asset: this.asset, - + const relativeProfit = this.balance / this.start.balance * 100 - 100; + const relativeYearlyProfit = relativeProfit / timespan.asYears(); + + const percentExposure = this.exposure / (Date.parse(this.dates.end) - Date.parse(this.dates.start)); + + const sharpe = (relativeYearlyProfit - perfConfig.riskFreeReturn) + / statslite.stdev(this.roundTrips.map(r => r.profit)) + / Math.sqrt(this.trades / (this.trades - 2)); + + const downside = statslite.percentile(this.losses.map(r => r.profit), 0.25) + * Math.sqrt(this.trades / (this.trades - 2)); + + const report = { startTime: this.dates.start.utc().format('YYYY-MM-DD HH:mm:ss'), endTime: this.dates.end.utc().format('YYYY-MM-DD HH:mm:ss'), timespan: timespan.humanize(), market: this.endPrice * 100 / this.startPrice - 100, - balance: balance, - profit: profit, + balance: this.balance, + profit, relativeProfit: relativeProfit, - yearlyProfit: this.round(profit / timespan.asYears()), - relativeYearlyProfit: this.round(relativeProfit / timespan.asYears()), + yearlyProfit: profit / timespan.asYears(), + relativeYearlyProfit, startPrice: this.startPrice, endPrice: this.endPrice, trades: this.trades, startBalance: this.start.balance, - sharpe: this.sharpe + exposure: percentExposure, + sharpe, + downside } report.alpha = report.profit - report.market; @@ -177,8 +209,12 @@ PerformanceAnalyzer.prototype.calculateReportStatistics = function() { } PerformanceAnalyzer.prototype.finalize = function(done) { + if(!this.trades) { + return done(); + } + const report = this.calculateReportStatistics(); - this.handler.finalize(report); + this.logger.finalize(report); done(); } diff --git a/plugins/sqlite/writer.js b/plugins/sqlite/writer.js index e6155fc58..34aab30ec 100644 --- a/plugins/sqlite/writer.js +++ b/plugins/sqlite/writer.js @@ -52,7 +52,7 @@ Store.prototype.writeCandles = function() { if(_.isEmpty(this.cache)) return; - var transaction = function() { + const transaction = () => { this.db.run("BEGIN TRANSACTION"); var stmt = this.db.prepare(` @@ -81,11 +81,13 @@ Store.prototype.writeCandles = function() { stmt.finalize(); this.db.run("COMMIT"); + // TEMP: should fix https://forum.gekko.wizb.it/thread-57279-post-59194.html#pid59194 + this.db.run("pragma wal_checkpoint;"); this.cache = []; } - this.db.serialize(_.bind(transaction, this)); + this.db.serialize(transaction); } var processCandle = function(candle, done) { diff --git a/plugins/trader/portfolio.js b/plugins/trader/portfolio.js deleted file mode 100644 index 801007fda..000000000 --- a/plugins/trader/portfolio.js +++ /dev/null @@ -1,113 +0,0 @@ -/* - The Portfolio class holds the most recent data about the portfolio and ticker -*/ - -var _ = require('lodash') -var util = require('../../core/util') -var dirs = util.dirs() -var events = require('events') -var log = require(dirs.core + 'log') -var async = require('async') - -class Portfolio{ - constructor(conf,exchange){ - _.bindAll(this) - this.conf = conf - this.exchange = exchange - this.portfolio = {} - this.fee = null - this.ticker = null - } - - getBalance(fund) { - return this.getFund(fund).amount; - } - - // return the [fund] based on the data we have in memory - getFund(fund) { - return _.find(this.portfolio, function(f) { return f.name === fund}); - } - - // convert into the portfolio expected by the performanceAnalyzer - convertPortfolio(asset,currency) { // rename? - var asset = _.find(this.portfolio, a => a.name === this.conf.asset).amount; - var currency = _.find(this.portfolio, a => a.name === this.conf.currency).amount; - - return { - currency, - asset, - balance: currency + (asset * this.ticker.bid) - } - } - - logPortfolio() { - log.info(this.exchange.name, 'portfolio:'); - _.each(this.portfolio, function(fund) { - log.info('\t', fund.name + ':', parseFloat(fund.amount).toFixed(12)); - }); - }; - - setPortfolio(callback) { - let set = (err, fullPortfolio) => { - if(err) - util.die(err); - - // only include the currency/asset of this market - const portfolio = [ this.conf.currency, this.conf.asset ] - .map(name => { - let item = _.find(fullPortfolio, {name}); - - if(!item) { - log.debug(`unable to find "${name}" in portfolio provided by exchange, assuming 0.`); - item = {name, amount: 0}; - } - - return item; - }); - - if(_.isEmpty(this.portfolio)) { - this.portfolio = portfolio; - this.emit('portfolioUpdate', this.convertPortfolio(this.conf.asset,this.conf.currency,this.ticker.bid)); - } - this.portfolio = portfolio; - - - if(_.isFunction(callback)) - callback(); - - } - - this.exchange.getPortfolio(set); - } - - setFee(callback) { - let set = (err, fee) => { - this.fee = fee; - - if(err) - util.die(err); - - if(_.isFunction(callback)) - callback(); - } - this.exchange.getFee(set); - } - - setTicker(callback) { - let set = (err, ticker) => { - this.ticker = ticker; - - if(err) - util.die(err); - - if(_.isFunction(callback)) - callback(); - } - this.exchange.getTicker(set); - } - -} - -util.makeEventEmitter(Portfolio) - -module.exports = Portfolio diff --git a/plugins/trader/portfolioManager.js b/plugins/trader/portfolioManager.js deleted file mode 100644 index 332cab79e..000000000 --- a/plugins/trader/portfolioManager.js +++ /dev/null @@ -1,109 +0,0 @@ -/* - The portfolio manager is responsible for making sure that - all decisions are turned into Trades. -*/ - -var _ = require('lodash'); -var util = require('../../core/util'); -var dirs = util.dirs(); -var events = require('events'); -var log = require(dirs.core + 'log'); -var async = require('async'); -var checker = require(dirs.core + 'exchangeChecker.js'); -var moment = require('moment'); -var Portfolio = require('./portfolio'); -var Trade = require('./trade'); - -var Manager = function(conf) { - this.conf = conf; - - var error = checker.cantTrade(conf); - if(error) - util.die(error); - - // create an exchange - let exchangeMeta = checker.settings(conf); - var Exchange = require(dirs.exchanges + exchangeMeta.slug); - this.exchange = new Exchange(conf); - - // create a portfolio - this.portfolio = new Portfolio(conf,this.exchange); - - //setup event relay - this.portfolio.on('portfolioUpdate', portfolioUpdate => { - this.emit('portfolioUpdate', portfolioUpdate); - }); - - // contains instantiated trade classes - this.currentTrade = false - this.tradeHistory = []; - -}; - -// teach our trader events -util.makeEventEmitter(Manager); - -Manager.prototype.init = function(callback) { - log.debug('portfolioManager : getting balance & fee from', this.exchange.name); - - let prepare = () => { - log.info('trading at', this.exchange.name, 'ACTIVE'); - log.info(this.exchange.name, 'trading fee will be:', this.portfolio.fee * 10000 + '%'); // Move fee into Exchange class? - this.portfolio.logPortfolio(); - callback(); - } - - async.series([ - this.portfolio.setFee.bind(this.portfolio), - this.portfolio.setTicker.bind(this.portfolio), - this.portfolio.setPortfolio.bind(this.portfolio) - ], prepare); -} - -Manager.prototype.trade = function(what) { - - let makeNewTrade = () => { - this.newTrade(what) - } - - // if an active trade is currently happening - if(this.currentTrade && this.currentTrade.isActive){ - if(this.currentTrade.action !== what){ - // if the action is different, stop the current trade, then start a new one - this.currentTrade.deactivate(makeNewTrade) - } else{ - // do nothing, the trade is already going - } - } else { - makeNewTrade() - } -}; - -// instantiate a new trade object -Manager.prototype.newTrade = function(what) { - log.debug("portfolioManager : newTrade() : creating a new Trade class to ", what, this.conf.asset, "/", this.conf.currency) - - // push the current (asummed to be inactive) trade to the history - if(this.currentTrade){ - this.tradeHistory.push(this.currentTrade) - } - - this.currentTrade = new Trade({ - action: what, - exchange:this.exchange, - currency: this.conf.currency, - asset: this.conf.asset, - portfolio: this.portfolio, - orderUpdateDelay: this.conf.orderUpdateDelay, - keepAsset: (this.conf.keepAsset) ? this.conf.keepAsset : false - }) - - //setup event relay - this.currentTrade.on('trade', trade => { - this.emit('trade', trade); - }); - - return this.currentTrade; -}; - -module.exports = Manager; diff --git a/plugins/trader/trade.js b/plugins/trader/trade.js deleted file mode 100644 index 8cf33db0b..000000000 --- a/plugins/trader/trade.js +++ /dev/null @@ -1,318 +0,0 @@ -/* - The Trade class is responsible for overseeing potentially multiple orders - to execute a trade that completely moves a position. - Discussion about this class can be found at: https://github.com/askmike/gekko/issues/1942 -*/ - -var _ = require('lodash') -var util = require('../../core/util') -var dirs = util.dirs() -var events = require('events') -var log = require(dirs.core + 'log') -var async = require('async') -var checker = require(dirs.core + 'exchangeChecker.js') -var moment = require('moment') - -class Trade{ - constructor(conf){ - this.conf = conf - this.exchange = conf.exchange - this.portfolio = conf.portfolio - this.currency = conf.currency - this.asset = conf.asset - this.action = conf.action - this.isActive = true - this.isDeactivating = false - this.orderIds = [] - - this.exchangeMeta = checker.settings({exchange:this.exchange.name}); - - this.marketConfig = _.find(this.exchangeMeta.markets, function(p) { - return _.first(p.pair) === conf.currency.toUpperCase() && _.last(p.pair) === conf.asset.toUpperCase(); - }); - this.minimalOrder = this.marketConfig.minimalOrder; - - log.debug("created new Trade class to", this.action, this.asset + "/" + this.currency) - - if(_.isNumber(conf.keepAsset)) { - log.debug('keep asset is active. will try to keep at least ' + conf.keepAsset + ' ' + conf.asset); - this.keepAsset = conf.keepAsset; - } else { - this.keepAsset = 0; - } - - this.doTrade() - } - - deactivate(callback){ - this.isDeactivating = true - - log.debug("attempting to stop Trade class from", this.action + "ING", this.asset + "/" + this.currency) - - let done = () => { - this.isActive = false - log.debug("successfully stopped Trade class from", this.action + "ING", this.asset + "/" + this.currency) - if(_.isFunction(callback)) - callback() - } - - if(_.size(this.orderIds)){ - this.cancelLastOrder(done) - } else { - done() - } - } - - // This function makes sure the limit order gets submitted - // to the exchange and initiates order registers watchers. - doTrade(retry) { - if(!this.isActive || this.isDeactivating) - return false - - // if we are still busy executing the last trade - // cancel that one (and ignore results = assume not filled) - if(!retry && _.size(this.orderIds)) - return this.cancelLastOrder(() => this.doTrade()); - - let act = () => { - var amount, price; - if(this.action === 'BUY') { - amount = this.portfolio.getBalance(this.currency) / this.portfolio.ticker.ask; - if(amount > 0){ - price = this.portfolio.ticker.bid; - this.buy(amount, price); - } - } else if(this.action === 'SELL') { - amount = this.portfolio.getBalance(this.asset) - this.keepAsset; - if(amount > 0){ - price = this.portfolio.ticker.ask; - this.sell(amount, price); - } - } - } - - async.series([ - this.portfolio.setTicker.bind(this.portfolio), - this.portfolio.setPortfolio.bind(this.portfolio), - this.portfolio.setFee.bind(this.portfolio), - ], act); - } - - // first do a quick check to see whether we can buy - // the asset, if so BUY and keep track of the order - // (amount is in asset quantity) - buy(amount, price) { - let minimum = 0; - - let process = (err, order) => { - if(!this.isActive || this.isDeactivating){ - return log.debug(this.action, "trade class is no longer active") - } - // if order to small - if(!order.amount || order.amount < minimum) { - return log.warn( - 'wanted to buy', - this.asset, - 'but the amount is too small ', - '(' + parseFloat(amount).toFixed(8) + ' @', - parseFloat(price).toFixed(8), - ') at', - this.exchange.name - ); - } - - log.info( - 'attempting to BUY', - order.amount, - this.asset, - 'at', - this.exchange.name, - 'price:', - order.price - ); - - this.exchange.buy(order.amount, order.price, _.bind(this.noteOrder,this) ); - } - - if (_.has(this.exchange, 'getLotSize')) { - this.exchange.getLotSize('buy', amount, price, _.bind(process)); - } else { - minimum = this.getMinimum(price); - process(undefined, { amount: amount, price: price }); - } - } - - // first do a quick check to see whether we can sell - // the asset, if so SELL and keep track of the order - // (amount is in asset quantity) - sell(amount, price) { - let minimum = 0; - let process = (err, order) => { - - if(!this.isActive || this.isDeactivating){ - return log.debug(this.action, "trade class is no longer active") - } - - // if order to small - if (!order.amount || order.amount < minimum) { - return log.warn( - 'wanted to sell', - this.currency, - 'but the amount is too small ', - '(' + parseFloat(amount).toFixed(8) + ' @', - parseFloat(price).toFixed(8), - ') at', - this.exchange.name - ); - } - - log.info( - 'attempting to SELL', - order.amount, - this.asset, - 'at', - this.exchange.name, - 'price:', - order.price - ); - - this.exchange.sell(order.amount, order.price, _.bind(this.noteOrder,this)); - } - - if (_.has(this.exchange, 'getLotSize')) { - this.exchange.getLotSize('sell', amount, price, _.bind(process)); - } else { - minimum = this.getMinimum(price); - process(undefined, { amount: amount, price: price }); - } - } - - - // check whether the order got fully filled - // if it is not: cancel & instantiate a new order - checkOrder() { - var handleCheckResult = function(err, filled) { - - if(this.isDeactivating){ - return log.debug("trade : checkOrder() : ", this.action, "trade class is currently deactivating, stop check order") - } - - if(!this.isActive){ - return log.debug("trade : checkOrder() : ", this.action, "trade class is no longer active, stop check order") - } - - if(!filled) { - log.info(this.action, 'order was not (fully) filled, cancelling and creating new order'); - log.debug("trade : checkOrder() : cancelling last " + this.action + " order ID : ", _.last(this.orderIds)) - this.exchange.cancelOrder(_.last(this.orderIds), _.bind(handleCancelResult, this)); - return; - } - - log.info("trade was successful", this.action + "ING", this.asset + "/" + this.currency) - this.isActive = false; - - this.relayOrder(); - } - - var handleCancelResult = function(alreadyFilled) { - if(alreadyFilled) - return; - - if(this.exchangeMeta.forceReorderDelay) { - //We need to wait in case a canceled order has already reduced the amount - var wait = 10; - log.debug(`Waiting ${wait} seconds before starting a new trade on ${this.exchangeMeta.name}!`); - - setTimeout( - () => this.doTrade(true), - +moment.duration(wait, 'seconds') - ); - return; - } - - this.doTrade(true); - } - - this.exchange.checkOrder(_.last(this.orderIds), _.bind(handleCheckResult, this)); - } - - cancelLastOrder(done) { - log.debug("trade : cancelLastOrder() : cancelling last " + this.action + " order ID : ", _.last(this.orderIds)) - this.exchange.cancelOrder(_.last(this.orderIds), alreadyFilled => { - if(alreadyFilled) - return this.relayOrder(done); - done(); - }); - - } - - noteOrder(err, order) { - if(err) { - util.die(err); - } - - this.orderIds.push(order); - - // If unfilled, cancel and replace order with adjusted price - let cancelDelay = this.conf.orderUpdateDelay || 1; - setTimeout(_.bind(this.checkOrder,this), util.minToMs(cancelDelay)); - } - - relayOrder(done) { - // look up all executed orders and relay average. - let relay = (err, res) => { - - var price = 0; - var amount = 0; - var date = moment(0); - - _.each(res.filter(o => !_.isUndefined(o) && o.amount), order => { - date = _.max([moment(order.date), date]); - price = ((price * amount) + (order.price * order.amount)) / (order.amount + amount); - amount += +order.amount; - }); - - async.series([ - this.portfolio.setTicker.bind(this.portfolio), - this.portfolio.setPortfolio.bind(this.portfolio) - ], () => { - const portfolio = this.portfolio.convertPortfolio(this.asset,this.currency); - - this.emit('trade', { - date, - price, - portfolio: portfolio, - balance: portfolio.balance, - - // NOTE: within the portfolioManager - // this is in uppercase, everywhere else - // (UI, performanceAnalyzer, etc. it is - // lowercase) - action: this.action.toLowerCase() - }); - - if(_.isFunction(done)) - done(); - }); - - } - - var getOrders = _.map( - this.orderIds, - order => next => this.exchange.getOrder(order, next) - ); - - async.series(getOrders, relay); - } - - getMinimum(price) { - if(this.minimalOrder.unit === 'currency') - return this.minimalOrder.amount / price; - else - return this.minimalOrder.amount; - } -} - -util.makeEventEmitter(Trade) - -module.exports = Trade \ No newline at end of file diff --git a/plugins/trader/trader.js b/plugins/trader/trader.js index 85a9962d3..268bab262 100644 --- a/plugins/trader/trader.js +++ b/plugins/trader/trader.js @@ -1,55 +1,273 @@ -var _ = require('lodash'); -var util = require('../../core/util.js'); -var config = util.getConfig(); -var dirs = util.dirs(); +const _ = require('lodash'); +const util = require('../../core/util.js'); +const config = util.getConfig(); +const dirs = util.dirs(); +const moment = require('moment'); -var log = require(dirs.core + 'log'); -var Manager = require('./portfolioManager'); +const log = require(dirs.core + 'log'); +const Broker = require(dirs.gekko + '/exchange/gekkoBroker'); -var Trader = function(next) { - _.bindAll(this); +const Trader = function(next) { - this.manager = new Manager(_.extend(config.trader, config.watch)); - this.manager.init(next); + this.brokerConfig = { + ...config.trader, + ...config.watch, + private: true + } - let sendPortfolio = false; + this.propogatedTrades = 0; - this.manager.on('trade', trade => { + this.broker = new Broker(this.brokerConfig); - if(!sendPortfolio && this.initialPortfolio) { - this.emit('portfolioUpdate', this.initialPortfolio); - sendPortfolio = true; - } + if(!this.broker.capabilities.gekkoBroker) { + util.die('This exchange is not yet supported'); + } - this.emit('trade', trade); + this.sync(() => { + log.info('\t', 'Portfolio:'); + log.info('\t\t', this.portfolio.currency, this.brokerConfig.currency); + log.info('\t\t', this.portfolio.asset, this.brokerConfig.asset); + log.info('\t', 'Balance:'); + log.info('\t\t', this.balance, this.brokerConfig.currency); + log.info('\t', 'Exposed:'); + log.info('\t\t', + this.exposed ? 'yes' : 'no', + `(${(this.exposure * 100).toFixed(2)}%)` + ); + next(); }); - this.manager.once('portfolioUpdate', portfolioUpdate => { - this.initialPortfolio = portfolioUpdate; - }) + this.sendInitialPortfolio = false; + this.cancellingOrder = false; + + _.bindAll(this); } // teach our trader events util.makeEventEmitter(Trader); -Trader.prototype.processCandle = (candle, done) => done(); +Trader.prototype.sync = function(next) { + log.debug('syncing portfolio'); + this.broker.syncPrivateData(() => { + this.price = this.broker.ticker.bid; + this.setPortfolio(); + if(next) { + next(); + } + }); +} + +Trader.prototype.setPortfolio = function() { + this.portfolio = { + currency: _.find( + this.broker.portfolio.balances, + b => b.name === this.brokerConfig.currency + ).amount, + asset: _.find( + this.broker.portfolio.balances, + b => b.name === this.brokerConfig.asset + ).amount + } + this.balance = this.portfolio.currency + this.portfolio.asset * this.price; + this.exposure = (this.portfolio.asset * this.price) / this.balance; + + // if more than 10% of balance is in asset we are exposed + this.exposed = this.exposure > 0.1; +} + +Trader.prototype.processCandle = function(candle, done) { + this.price = candle.close; + this.setPortfolio(); + + // on init + if(!this.sendInitialPortfolio) { + this.sendInitialPortfolio = true; + this.deferredEmit('portfolioChange', { + asset: this.portfolio.asset, + currency: this.portfolio.currency + }); + this.deferredEmit('portfolioValueChange', { + balance: this.balance + }); + } else if(this.exposed) { + this.deferredEmit('portfolioValueChange', { + balance: this.balance + }); + } + + done(); +} Trader.prototype.processAdvice = function(advice) { - if(advice.recommendation == 'long') { + const direction = advice.recommendation === 'long' ? 'buy' : 'sell'; + + const id = 'trade-' + (++this.propogatedTrades); + + if(this.order) { + if(this.order.side === direction) { + return log.info('ignoring advice: already in the process to', direction); + } + + if(this.cancellingOrder) { + return log.info('ignoring advice: already cancelling previous', this.order.side, 'order'); + } + + log.info('Received advice to', direction, 'however Gekko is already in the process to', this.order.side); + log.info('Canceling', this.order.side, 'order first'); + return this.cancelOrder(id, advice, () => this.processAdvice(advice)); + } + + let amount; + + if(direction === 'buy') { + + if(this.exposed) { + log.info('NOT buying, already exposed'); + return this.deferredEmit('tradeAborted', { + id, + adviceId: advice.id, + action: direction, + portfolio: this.portfolio, + balance: this.balance, + reason: "Portfolio already in position." + }); + } + + amount = this.portfolio.currency / this.price * 0.95; + + if(amount < this.broker.marketConfig.minimalOrder.amount) { + log.info('NOT buying, not enough', this.brokerConfig.currency); + return this.deferredEmit('tradeAborted', { + id, + adviceId: advice.id, + action: direction, + portfolio: this.portfolio, + balance: this.balance, + reason: "Not enough to trade." + }); + } + log.info( 'Trader', 'Received advice to go long.', - 'Buying ', config.trader.asset + 'Buying ', this.brokerConfig.asset ); - this.manager.trade('BUY'); - } else if(advice.recommendation == 'short') { + + } else if(direction === 'sell') { + + if(!this.exposed) { + log.info('NOT selling, already no exposure'); + return this.deferredEmit('tradeAborted', { + id, + adviceId: advice.id, + action: direction, + portfolio: this.portfolio, + balance: this.balance, + reason: "Portfolio already in position." + }); + } + + amount = this.portfolio.asset * 0.95; + + if(amount < this.broker.marketConfig.minimalOrder.amount) { + log.info('NOT selling, not enough', this.brokerConfig.currency); + return this.deferredEmit('tradeAborted', { + id, + adviceId: advice.id, + action: direction, + portfolio: this.portfolio, + balance: this.balance, + reason: "Not enough to trade." + }); + } + log.info( 'Trader', 'Received advice to go short.', - 'Selling ', config.trader.asset + 'Selling ', this.brokerConfig.asset ); - this.manager.trade('SELL'); } + + this.createOrder(direction, amount, advice, id); +} + +Trader.prototype.createOrder = function(side, amount, advice, id) { + const type = 'sticky'; + + this.deferredEmit('tradeInitiated', { + id, + adviceId: advice.id, + action: side, + portfolio: this.portfolio, + balance: this.balance + }); + + this.order = this.broker.createOrder(type, side, amount); + + this.order.on('filled', f => log.debug('[ORDER]', side, 'total filled:', f)); + this.order.on('statusChange', s => log.debug('[ORDER] statusChange:', s)); + this.order.on('completed', () => { + this.order.createSummary((err, summary) => { + log.info('[ORDER] summary:', summary); + this.order = null; + this.sync(() => { + + let cost; + if(_.isNumber(summary.feePercent)) { + cost = summary.feePercent / 100 * summary.amount * summary.price; + } + + let effectivePrice; + if(_.isNumber(summary.feePercent)) { + if(side === 'buy') { + effectivePrice = summary.price * (1 + summary.feePercent / 100); + } else { + effectivePrice = summary.price * (1 - summary.feePercent / 100); + } + } else { + log.debug('WARNING: exchange did not provide fee information, assuming no fees..'); + effectivePrice = summary.price; + } + + this.deferredEmit('tradeCompleted', { + id, + adviceId: advice.id, + action: summary.side, + cost, + amount: summary.amount, + price: summary.price, + portfolio: this.portfolio, + balance: this.balance, + date: summary.date, + feePercent: summary.feePercent, + effectivePrice + }); + }); + }) + }); +} + +Trader.prototype.cancelOrder = function(id, advice, next) { + + if(!this.order) { + return next(); + } + + this.cancellingOrder = true; + + const direction = advice.recommendation === 'long' ? 'buy' : 'sell'; + + this.order.removeAllListeners(); + this.order.cancel(); + this.order.once('completed', () => { + this.deferredEmit('tradeCanceled', { + id, + adviceId: advice.id, + action: direction, + date: moment() + }); + this.sync(next); + }); } module.exports = Trader; diff --git a/plugins/tradingAdvisor/asyncIndicatorRunner.js b/plugins/tradingAdvisor/asyncIndicatorRunner.js new file mode 100644 index 000000000..da632a8b7 --- /dev/null +++ b/plugins/tradingAdvisor/asyncIndicatorRunner.js @@ -0,0 +1,150 @@ +const _ = require('lodash'); +const fs = require('fs'); +const util = require('../../core/util'); +const config = util.getConfig(); +const dirs = util.dirs(); +const log = require(dirs.core + 'log'); + +const talib = require(dirs.core + 'talib'); +const tulind = require(dirs.core + 'tulind'); + +const allowedTalibIndicators = _.keys(talib); +const allowedTulipIndicators = _.keys(tulind); + +const AsyncIndicatorRunner = function() { + this.talibIndicators = {}; + this.tulipIndicators = {}; + + this.candleProps = { + open: [], + high: [], + low: [], + close: [], + volume: [] + }; + + this.candlePropsCacheSize = 1000; + + this.inflight = false; + this.backlog = []; + this.age = 0; +} + +AsyncIndicatorRunner.prototype.processCandle = function(candle, next) { + if(this.inflight) { + return this.backlog.push({candle, next}); + } + + this.age++; + this.inflight = true; + + this.candleProps.open.push(candle.open); + this.candleProps.high.push(candle.high); + this.candleProps.low.push(candle.low); + this.candleProps.close.push(candle.close); + this.candleProps.volume.push(candle.volume); + + if(this.age > this.candlePropsCacheSize) { + this.candleProps.open.shift(); + this.candleProps.high.shift(); + this.candleProps.low.shift(); + this.candleProps.close.shift(); + this.candleProps.volume.shift(); + } + + this.calculateIndicators(next); +} + +AsyncIndicatorRunner.prototype.calculateIndicators = function(next) { + const done = _.after( + _.size(this.talibIndicators) + _.size(this.tulipIndicators), + this.handlePostFlight(next) + ); + + // handle result from talib + const talibResultHander = name => (err, result) => { + if(err) + util.die('TALIB ERROR:', err); + + this.talibIndicators[name].result = _.mapValues(result, v => _.last(v)); + done(); + } + + // handle result from talib + _.each( + this.talibIndicators, + (indicator, name) => indicator.run( + this.candleProps, + talibResultHander(name) + ) + ); + + // handle result from tulip + var tulindResultHander = name => (err, result) => { + if(err) + util.die('TULIP ERROR:', err); + + this.tulipIndicators[name].result = _.mapValues(result, v => _.last(v)); + done(); + } + + // handle result from tulip indicators + _.each( + this.tulipIndicators, + (indicator, name) => indicator.run( + this.candleProps, + tulindResultHander(name) + ) + ); +} + +AsyncIndicatorRunner.prototype.handlePostFlight = function(next) { + return () => { + next(); + this.inflight = false; + + if(this.backlog.length) { + const { candle, next } = this.backlog.shift(); + this.processCandle(candle, next); + } + } +} + +AsyncIndicatorRunner.prototype.addTalibIndicator = function(name, type, parameters) { + if(!talib) + util.die('Talib is not enabled'); + + if(!_.contains(allowedTalibIndicators, type)) + util.die('I do not know the talib indicator ' + type); + + if(this.setup) + util.die('Can only add talib indicators in the init method!'); + + var basectx = this; + + this.talibIndicators[name] = { + run: talib[type].create(parameters), + result: NaN + } +} + +AsyncIndicatorRunner.prototype.addTulipIndicator = function(name, type, parameters) { + if(!tulind) { + util.die('Tulip indicators is not enabled'); + } + + if(!_.contains(allowedTulipIndicators, type)) + util.die('I do not know the tulip indicator ' + type); + + if(this.setup) + util.die('Can only add tulip indicators in the init method!'); + + var basectx = this; + + this.tulipIndicators[name] = { + run: tulind[type].create(parameters), + result: NaN + } +} + +module.exports = AsyncIndicatorRunner; \ No newline at end of file diff --git a/plugins/tradingAdvisor/baseTradingMethod.js b/plugins/tradingAdvisor/baseTradingMethod.js index 7dca2866c..09b4ff768 100644 --- a/plugins/tradingAdvisor/baseTradingMethod.js +++ b/plugins/tradingAdvisor/baseTradingMethod.js @@ -1,27 +1,19 @@ -var _ = require('lodash'); -var fs = require('fs'); -var util = require('../../core/util'); -var config = util.getConfig(); -var dirs = util.dirs(); -var log = require(dirs.core + 'log'); - -var ENV = util.gekkoEnv(); -var mode = util.gekkoMode(); -var startTime = util.getStartTime(); - -var talib = require(dirs.core + 'talib'); -if(talib == null) { - log.warn('TALIB indicators could not be loaded, they will be unavailable.'); -} +const _ = require('lodash'); +const fs = require('fs'); +const util = require('../../core/util'); +const config = util.getConfig(); +const dirs = util.dirs(); +const log = require(dirs.core + 'log'); -var tulind = require(dirs.core + 'tulind'); -if(tulind == null) { - log.warn('TULIP indicators could not be loaded, they will be unavailable.'); -} +const ENV = util.gekkoEnv(); +const mode = util.gekkoMode(); +const startTime = util.getStartTime(); + +const indicatorsPath = dirs.methods + 'indicators/'; +const indicatorFiles = fs.readdirSync(indicatorsPath); +const Indicators = {}; -var indicatorsPath = dirs.methods + 'indicators/'; -var indicatorFiles = fs.readdirSync(indicatorsPath); -var Indicators = {}; +const AsyncIndicatorRunner = require('./asyncIndicatorRunner'); _.each(indicatorFiles, function(indicator) { const indicatorName = indicator.split(".")[0]; @@ -33,9 +25,7 @@ _.each(indicatorFiles, function(indicator) { } }); -var allowedIndicators = _.keys(Indicators); -var allowedTalibIndicators = _.keys(talib); -var allowedTulipIndicators = _.keys(tulind); +const allowedIndicators = _.keys(Indicators); var Base = function(settings) { _.bindAll(this); @@ -50,23 +40,16 @@ var Base = function(settings) { this.requiredHistory = 0; this.priceValue = 'close'; this.indicators = {}; - this.talibIndicators = {}; - this.tulipIndicators = {}; this.asyncTick = false; - this.candlePropsCacheSize = 1000; this.deferredTicks = []; - this._prevAdvice; + this.propogatedAdvices = 0; + + this.completedWarmup = false; - this.candleProps = { - open: [], - high: [], - low: [], - close: [], - volume: [], - vwp: [], - trades: [] - }; + this.asyncIndicatorRunner = new AsyncIndicatorRunner(); + + this._prevAdvice; // make sure we have all methods _.each(['init', 'check'], function(fn) { @@ -91,54 +74,45 @@ var Base = function(settings) { this.setup = true; - if(_.size(this.talibIndicators) || _.size(this.tulipIndicators)) + if(_.size(this.asyncIndicatorRunner.talibIndicators) || _.size(this.asyncIndicatorRunner.tulipIndicators)) this.asyncTick = true; - - if(_.size(this.indicators)) - this.hasSyncIndicators = true; + else + delete this.asyncIndicatorRunner; } // teach our base trading method events util.makeEventEmitter(Base); -Base.prototype.tick = function(candle) { - - if( - this.asyncTick && - this.hasSyncIndicators && - this.age !== this.processedTicks - ) { - // Gekko will call talib and run strat - // functions when talib is done, but by - // this time the sync indicators might be - // updated with future candles. - // - // See @link: https://github.com/askmike/gekko/issues/837#issuecomment-316549691 - return this.deferredTicks.push(candle); - } - +Base.prototype.tick = function(candle, done) { this.age++; + const afterAsync = () => { + this.calculateSyncIndicators(candle, done); + } + if(this.asyncTick) { - this.candleProps.open.push(candle.open); - this.candleProps.high.push(candle.high); - this.candleProps.low.push(candle.low); - this.candleProps.close.push(candle.close); - this.candleProps.volume.push(candle.volume); - this.candleProps.vwp.push(candle.vwp); - this.candleProps.trades.push(candle.trades); - - if(this.age > this.candlePropsCacheSize) { - this.candleProps.open.shift(); - this.candleProps.high.shift(); - this.candleProps.low.shift(); - this.candleProps.close.shift(); - this.candleProps.volume.shift(); - this.candleProps.vwp.shift(); - this.candleProps.trades.shift(); - } + this.asyncIndicatorRunner.processCandle(candle, () => { + + if(!this.talibIndicators) { + this.talibIndicators = this.asyncIndicatorRunner.talibIndicators; + this.tulipIndicators = this.asyncIndicatorRunner.tulipIndicators; + } + + afterAsync(); + }); + } else { + afterAsync(); } +} + +Base.prototype.isBusy = function() { + if(!this.asyncTick) + return false; + + return this.asyncIndicatorRunner.inflight; +} +Base.prototype.calculateSyncIndicators = function(candle, done) { // update all indicators var price = candle[this.priceValue]; _.each(this.indicators, function(i) { @@ -148,113 +122,68 @@ Base.prototype.tick = function(candle) { i.update(candle); },this); - // update the trading method - if(!this.asyncTick) { - this.propogateTick(candle); - } else { - - var next = _.after( - _.size(this.talibIndicators) + _.size(this.tulipIndicators), - () => this.propogateTick(candle) - ); - - var basectx = this; + this.propogateTick(candle); - // handle result from talib - var talibResultHander = function(err, result) { - if(err) - util.die('TALIB ERROR:', err); - - // fn is bound to indicator - this.result = _.mapValues(result, v => _.last(v)); - next(candle); - } - - // handle result from talib - _.each( - this.talibIndicators, - indicator => indicator.run( - basectx.candleProps, - talibResultHander.bind(indicator) - ) - ); - - // handle result from tulip - var tulindResultHander = function(err, result) { - if(err) - util.die('TULIP ERROR:', err); - - // fn is bound to indicator - this.result = _.mapValues(result, v => _.last(v)); - next(candle); - } - - // handle result from tulip indicators - _.each( - this.tulipIndicators, - indicator => indicator.run( - basectx.candleProps, - tulindResultHander.bind(indicator) - ) - ); - } - - this.propogateCustomCandle(candle); -} - -// if this is a child process the parent might -// be interested in the custom candle. -if(ENV !== 'child-process') { - Base.prototype.propogateCustomCandle = _.noop; -} else { - Base.prototype.propogateCustomCandle = function(candle) { - process.send({ - type: 'candle', - candle: candle - }); - } + return done(); } Base.prototype.propogateTick = function(candle) { this.candle = candle; - this.update(candle); + this.processedTicks++; var isAllowedToCheck = this.requiredHistory <= this.age; - // in live mode we might receive more candles - // than minimally needed. In that case check - // whether candle start time is > startTime - var isPremature; - - if(mode === 'realtime'){ - // Subtract number of minutes in current candle for instant start - let startTimeMinusCandleSize = startTime.clone(); - startTimeMinusCandleSize.subtract(this.tradingAdvisor.candleSize, "minutes"); - - isPremature = candle.start < startTimeMinusCandleSize; - } - else{ - isPremature = false; + if(!this.completedWarmup) { + + // in live mode we might receive more candles + // than minimally needed. In that case check + // whether candle start time is > startTime + var isPremature = false; + + if(mode === 'realtime'){ + const startTimeMinusCandleSize = startTime + .clone() + .subtract(this.tradingAdvisor.candleSize, "minutes"); + + isPremature = candle.start < startTimeMinusCandleSize; + } + + if(isAllowedToCheck && !isPremature) { + this.completedWarmup = true; + this.emit( + 'stratWarmupCompleted', + {start: candle.start.clone()} + ); + } } - if(isAllowedToCheck && !isPremature) { + if(this.completedWarmup) { this.log(candle); this.check(candle); - } - this.processedTicks++; - if( - this.asyncTick && - this.hasSyncIndicators && - this.deferredTicks.length - ) { - return this.tick(this.deferredTicks.shift()) + if( + this.asyncTick && + this.hasSyncIndicators && + this.deferredTicks.length + ) { + return this.tick(this.deferredTicks.shift()) + } } + const indicators = {}; + _.each(this.indicators, (indicator, name) => { + indicators[name] = indicator.result; + }); + + this.emit('stratUpdate', { + date: candle.start.clone(), + indicators + }); + // are we totally finished? - var done = this.age === this.processedTicks; - if(done && this.finishCb) + const completed = this.age === this.processedTicks; + if(completed && this.finishCb) this.finishCb(); } @@ -263,39 +192,11 @@ Base.prototype.processTrade = function(trade) { } Base.prototype.addTalibIndicator = function(name, type, parameters) { - if(!talib) - util.die('Talib is not enabled'); - - if(!_.contains(allowedTalibIndicators, type)) - util.die('I do not know the talib indicator ' + type); - - if(this.setup) - util.die('Can only add talib indicators in the init method!'); - - var basectx = this; - - this.talibIndicators[name] = { - run: talib[type].create(parameters), - result: NaN - } + this.asyncIndicatorRunner.addTalibIndicator(name, type, parameters); } Base.prototype.addTulipIndicator = function(name, type, parameters) { - if(!tulind) - util.die('Tulip indicators is not enabled'); - - if(!_.contains(allowedTulipIndicators, type)) - util.die('I do not know the tulip indicator ' + type); - - if(this.setup) - util.die('Can only add tulip indicators in the init method!'); - - var basectx = this; - - this.tulipIndicators[name] = { - run: tulind[type].create(parameters), - result: NaN - } + this.asyncIndicatorRunner.addTulipIndicator(name, type, parameters); } Base.prototype.addIndicator = function(name, type, parameters) { @@ -310,9 +211,8 @@ Base.prototype.addIndicator = function(name, type, parameters) { // some indicators need a price stream, others need full candles } -Base.prototype.advice = function(newPosition, _candle) { - // ignore soft advice coming from legacy - // strategies. +Base.prototype.advice = function(newPosition) { + // ignore legacy soft advice if(!newPosition) return; @@ -320,25 +220,18 @@ Base.prototype.advice = function(newPosition, _candle) { if(newPosition === this._prevAdvice) return; - // cache the candle this advice is based on - if(_candle) - var candle = _candle; - else - var candle = this.candle; - this._prevAdvice = newPosition; this.emit('advice', { - recommendation: newPosition, - portfolio: 1, - candle + id: 'advice-' + (++this.propogatedAdvices), + recommendation: newPosition }); } -// Because the trading method might be async we need -// to be sure we only stop after all candles are -// processed. Base.prototype.finish = function(done) { + // Because the trading method might be async we need + // to be sure we only stop after all candles are + // processed. if(!this.asyncTick) { this.end(); return done(); diff --git a/plugins/tradingAdvisor/tradingAdvisor.js b/plugins/tradingAdvisor/tradingAdvisor.js index 7d7597993..55e9b0b0f 100644 --- a/plugins/tradingAdvisor/tradingAdvisor.js +++ b/plugins/tradingAdvisor/tradingAdvisor.js @@ -36,8 +36,6 @@ var Actor = function(done) { done(); } -util.makeEventEmitter(Actor); - Actor.prototype.setupTradingMethod = function() { if(!fs.existsSync(dirs.methods + this.methodName + '.js')) @@ -61,25 +59,44 @@ Actor.prototype.setupTradingMethod = function() { this.method = new Consultant(tradingSettings); this.method - .on('advice', this.relayAdvice); + .on('advice', this.relayAdvice) + .on( + 'stratWarmupCompleted', + e => this.deferredEmit('stratWarmupCompleted', e) + ) + .on( + 'stratUpdate', + e => this.deferredEmit('stratUpdate', e) + ) this.method .on('trade', this.processTrade); this.batcher - .on('candle', this.processCustomCandle); + .on('candle', _candle => { + const { id, ...candle } = _candle; + this.deferredEmit('stratCandle', candle); + this.emitStratCandle(candle); + }); } // HANDLERS // process the 1m candles Actor.prototype.processCandle = function(candle, done) { - this.batcher.write([candle]); - done(); + this.candle = candle; + const completedBatch = this.batcher.write([candle]); + if(completedBatch) { + this.next = done; + } else { + done(); + this.next = _.noop; + } + this.batcher.flush(); } // propogate a custom sized candle to the trading method -Actor.prototype.processCustomCandle = function(candle) { - this.method.tick(candle); +Actor.prototype.emitStratCandle = function(candle) { + this.method.tick(candle, this.next); } Actor.prototype.processTrade = function(trade) { @@ -93,7 +110,8 @@ Actor.prototype.finish = function(done) { // EMITTERS Actor.prototype.relayAdvice = function(advice) { - this.emit('advice', advice); + advice.date = this.candle.start.clone().add(1, 'minute'); + this.deferredEmit('advice', advice); } diff --git a/sample-config.js b/sample-config.js index d9f33649c..e646a02c8 100644 --- a/sample-config.js +++ b/sample-config.js @@ -215,12 +215,13 @@ config.trader = { secret: '', username: '', // your username, only required for specific exchanges. passphrase: '', // GDAX, requires a passphrase. - orderUpdateDelay: 1, // Number of minutes to adjust unfilled order prices } -config.adviceLogger = { +config.eventLogger = { enabled: false, - muteSoft: true // disable advice printout if it's soft + // optionally pass a whitelist of events to log, if not past + // the eventLogger will log _all_ events. + // whitelist: ['portfolioChange', 'portfolioValueChange'] } config.pushover = { @@ -383,6 +384,17 @@ config.adviceWriter = { muteSoft: true, } +config.backtestResultExporter = { + enabled: false, + writeToDisk: false, + data: { + stratUpdates: false, + roundtrips: true, + stratCandles: true, + trades: true + } +} + // ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ // CONFIGURING ADAPTER // ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ diff --git a/strategies/DEBUG_toggle-advice.js b/strategies/DEBUG_toggle-advice.js index d687ad754..ad6646989 100644 --- a/strategies/DEBUG_toggle-advice.js +++ b/strategies/DEBUG_toggle-advice.js @@ -1,6 +1,6 @@ var settings = { wait: 0, - each: 6 + each: 10 }; // ------- @@ -14,17 +14,20 @@ var method = { init: _.noop, update: _.noop, log: _.noop, - check: function() { + check: function(candle) { if(settings.wait > i) return; log.info('iteration:', i); - if(i % settings.each === 0) + if(i % settings.each === 0) { + log.debug('trigger SHORT'); this.advice('short'); - else if(i % settings.each === settings.each / 2) + } else if(i % settings.each === settings.each / 2) { + log.debug('trigger LONG'); this.advice('long'); + } // if(i % 2 === 0) // this.advice('long'); diff --git a/subscriptions.js b/subscriptions.js index 285dd3885..ea1a85033 100644 --- a/subscriptions.js +++ b/subscriptions.js @@ -11,23 +11,73 @@ var subscriptions = [ }, { emitter: 'market', - event: 'history', - handler: 'processHistory' + event: 'marketUpdate', + handler: 'processMarketUpdate' + }, + { + emitter: 'market', + event: 'marketStart', + handler: 'processMarketStart' + }, + { + emitter: 'tradingAdvisor', + event: 'stratWarmupCompleted', + handler: 'processStratWarmupCompleted' }, { emitter: 'tradingAdvisor', event: 'advice', handler: 'processAdvice' }, + { + emitter: 'tradingAdvisor', + event: 'stratCandle', + handler: 'processStratCandle' + }, + { + emitter: 'tradingAdvisor', + event: 'stratUpdate', + handler: 'processStratUpdate' + }, { emitter: ['trader', 'paperTrader'], - event: 'trade', - handler: 'processTrade' + event: 'tradeInitiated', + handler: 'processTradeInitiated' }, { emitter: ['trader', 'paperTrader'], - event: 'portfolioUpdate', - handler: 'processPortfolioUpdate' + event: 'tradeAborted', + handler: 'processTradeAborted' + }, + { + emitter: ['trader', 'paperTrader'], + event: 'tradeCompleted', + handler: 'processTradeCompleted' + }, + { + emitter: ['trader', 'paperTrader'], + event: 'portfolioChange', + handler: 'processPortfolioChange' + }, + { + emitter: ['trader', 'paperTrader'], + event: 'portfolioValueChange', + handler: 'processPortfolioValueChange' + }, + { + emitter: ['performanceAnalyzer'], + event: 'performanceReport', + handler: 'processPerformanceReport' + }, + { + emitter: ['performanceAnalyzer'], + event: 'roundtripUpdate', + handler: 'processRoundtripUpdate' + }, + { + emitter: ['performanceAnalyzer'], + event: 'roundtrip', + handler: 'processRoundtrip' }, ]; diff --git a/test/candleBatcher.js b/test/candleBatcher.js index 0cafadf62..06013ca68 100644 --- a/test/candleBatcher.js +++ b/test/candleBatcher.js @@ -12,16 +12,16 @@ var dirs = utils.dirs(); var CandleBatcher = require(dirs.core + 'candleBatcher'); var candles = [ - {"start":moment("2015-02-14T23:57:00.000Z"),"open":257.19,"high":257.19,"low":257.18,"close":257.18,"vwp":257.18559990418294,"volume":0.97206065,"trades":2}, - {"start":moment("2015-02-14T23:58:00.000Z"),"open":257.02,"high":257.02,"low":256.98,"close":256.98,"vwp":257.0175849772836,"volume":4.1407478,"trades":2}, - {"start":moment("2015-02-14T23:59:00.000Z"),"open":256.85,"high":256.99,"low":256.85,"close":256.99,"vwp":256.9376998467,"volume":6,"trades":6}, - {"start":moment("2015-02-15T00:00:00.000Z"),"open":256.81,"high":256.82,"low":256.81,"close":256.82,"vwp":256.815,"volume":4,"trades":2}, - {"start":moment("2015-02-15T00:01:00.000Z"),"open":256.81,"high":257.02,"low":256.81,"close":257.01,"vwp":256.94666666666666,"volume":6,"trades":3}, - {"start":moment("2015-02-15T00:02:00.000Z"),"open":257.03,"high":257.03,"low":256.33,"close":256.33,"vwp":256.74257263558013,"volume":6.7551178,"trades":6}, - {"start":moment("2015-02-15T00:03:00.000Z"),"open":257.02,"high":257.47,"low":257.02,"close":257.47,"vwp":257.26466004728906,"volume":3.7384995300000003,"trades":3}, - {"start":moment("2015-02-15T00:04:00.000Z"),"open":257.47,"high":257.48,"low":257.37,"close":257.38,"vwp":257.4277429116875,"volume":8,"trades":6}, - {"start":moment("2015-02-15T00:05:00.000Z"),"open":257.38,"high":257.45,"low":257.38,"close":257.45,"vwp":257.3975644932184,"volume":7.97062564,"trades":4}, - {"start":moment("2015-02-15T00:06:00.000Z"),"open":257.46,"high":257.48,"low":257.46,"close":257.48,"vwp":257.47333333333336,"volume":7.5,"trades":4} + {id: 1, "start":moment("2015-02-14T23:57:00.000Z"),"open":257.19,"high":257.19,"low":257.18,"close":257.18,"vwp":257.18559990418294,"volume":0.97206065,"trades":2}, + {id: 2, "start":moment("2015-02-14T23:58:00.000Z"),"open":257.02,"high":257.02,"low":256.98,"close":256.98,"vwp":257.0175849772836,"volume":4.1407478,"trades":2}, + {id: 3, "start":moment("2015-02-14T23:59:00.000Z"),"open":256.85,"high":256.99,"low":256.85,"close":256.99,"vwp":256.9376998467,"volume":6,"trades":6}, + {id: 4, "start":moment("2015-02-15T00:00:00.000Z"),"open":256.81,"high":256.82,"low":256.81,"close":256.82,"vwp":256.815,"volume":4,"trades":2}, + {id: 5, "start":moment("2015-02-15T00:01:00.000Z"),"open":256.81,"high":257.02,"low":256.81,"close":257.01,"vwp":256.94666666666666,"volume":6,"trades":3}, + {id: 6, "start":moment("2015-02-15T00:02:00.000Z"),"open":257.03,"high":257.03,"low":256.33,"close":256.33,"vwp":256.74257263558013,"volume":6.7551178,"trades":6}, + {id: 7, "start":moment("2015-02-15T00:03:00.000Z"),"open":257.02,"high":257.47,"low":257.02,"close":257.47,"vwp":257.26466004728906,"volume":3.7384995300000003,"trades":3}, + {id: 8, "start":moment("2015-02-15T00:04:00.000Z"),"open":257.47,"high":257.48,"low":257.37,"close":257.38,"vwp":257.4277429116875,"volume":8,"trades":6}, + {id: 9, "start":moment("2015-02-15T00:05:00.000Z"),"open":257.38,"high":257.45,"low":257.38,"close":257.45,"vwp":257.3975644932184,"volume":7.97062564,"trades":4}, + {id: 10, "start":moment("2015-02-15T00:06:00.000Z"),"open":257.46,"high":257.48,"low":257.46,"close":257.48,"vwp":257.47333333333336,"volume":7.5,"trades":4} ]; describe('core/candleBatcher', function() { @@ -53,12 +53,22 @@ describe('core/candleBatcher', function() { expect(spy.called).to.be.false; }); + it('should not emit an event when not flushed', function() { + cb = new CandleBatcher(2); + + var spy = sinon.spy(); + cb.on('candle', spy); + cb.write( candles ); + expect(spy.called).to.be.false; + }); + it('should emit 5 events when fed 10 candles', function() { cb = new CandleBatcher(2); var spy = sinon.spy(); cb.on('candle', spy); cb.write( candles ); + cb.flush(); expect(spy.callCount).to.equal(5); }); @@ -84,10 +94,11 @@ describe('core/candleBatcher', function() { var spy = sinon.spy(); cb.on('candle', spy); cb.write( _candles ); + cb.flush(); var cbResult = _.first(_.first(spy.args)); expect(cbResult).to.deep.equal(result); - + expect(cbResult.id).to.equal(undefined); }); }); \ No newline at end of file diff --git a/test/exchanges/bitstamp.js b/test/exchanges/bitstamp.js index 05e44d744..147ba1807 100644 --- a/test/exchanges/bitstamp.js +++ b/test/exchanges/bitstamp.js @@ -29,6 +29,8 @@ var dirs = util.dirs(); var TRADES = require('./data/bitstamp_trades.json'); +return; // TEMP + var FakeExchange = function() {}; FakeExchange.prototype = { transactions: function(since, handler, descending) { @@ -44,7 +46,7 @@ spoofer = { } describe('exchanges/bitstamp', function() { - var Bitstamp = proxyquire(dirs.exchanges + 'bitstamp', spoofer); + var Bitstamp = proxyquire(dirs.gekko + 'exchange/wrappers/bitstamp', spoofer); var bs; it('should instantiate', function() { diff --git a/test/marketFetcher.js b/test/marketFetcher.js index 194d2344d..98664b30d 100644 --- a/test/marketFetcher.js +++ b/test/marketFetcher.js @@ -15,6 +15,8 @@ var dirs = util.dirs(); var providerName = config.watch.exchange.toLowerCase(); var providerPath = util.dirs().gekko + 'exchanges/' + providerName; +return; // TEMP + var mf; var spoofer = {}; diff --git a/web/routes/backtest.js b/web/routes/backtest.js index 9032bc4c0..44510411d 100644 --- a/web/routes/backtest.js +++ b/web/routes/backtest.js @@ -25,25 +25,7 @@ module.exports = function *() { var req = this.request.body; - _.merge(config, base, req.gekkoConfig); + _.merge(config, base, req); - var result = yield pipelineRunner(mode, config); - - if(!req.data.report) - delete result.report; - - if(!req.data.roundtrips) - delete result.roundtrips; - - if(!req.data.trades) - delete result.trades; - - // todo: indicatorResults - - result.candles = _.map( - result.candles, - c => _.pick(c, req.data.candleProps) - ); - - this.body = result; + this.body = yield pipelineRunner(mode, config); } \ No newline at end of file diff --git a/web/routes/baseConfig.js b/web/routes/baseConfig.js index 98dbb1506..307b97de3 100644 --- a/web/routes/baseConfig.js +++ b/web/routes/baseConfig.js @@ -1,4 +1,4 @@ -var UIconfig = require('../vue/UIconfig'); +var UIconfig = require('../vue/public/UIconfig'); var config = {}; @@ -19,13 +19,20 @@ config.tradingAdvisor = { config.candleWriter = { enabled: false } -config.adviceWriter = { + +config.backtestResultExporter = { enabled: false, - muteSoft: true, + writeToDisk: false, + data: { + stratUpdates: false, + roundtrips: true, + stratCandles: true, + trades: true + } } -config.trader = { - orderUpdateDelay: 1 // Number of minutes to adjust unfilled order prices +config.childToParent = { + enabled: false, } // ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ diff --git a/web/routes/deleteGekko.js b/web/routes/deleteGekko.js new file mode 100644 index 000000000..ee687e603 --- /dev/null +++ b/web/routes/deleteGekko.js @@ -0,0 +1,22 @@ +const cache = require('../state/cache'); +const gekkoManager = cache.get('gekkos'); + +// Deletes a gekko +// requires a post body with an id +module.exports = function *() { + + let id = this.request.body.id; + + if(!id) { + this.body = { status: 'not ok' } + return; + } + + try { + gekkoManager.delete(id); + } catch(e) { + this.body = { status: e.message } + } + + this.body = { status: 'ok' }; +} \ No newline at end of file diff --git a/web/routes/exchanges.js b/web/routes/exchanges.js index 2b242c351..8fe4367b0 100644 --- a/web/routes/exchanges.js +++ b/web/routes/exchanges.js @@ -12,7 +12,7 @@ config.silent = false; util.setConfig(config); module.exports = function *() { - const exchangesDir = yield fs.readdir(gekkoRoot + 'exchanges'); + const exchangesDir = yield fs.readdir(gekkoRoot + 'exchange/wrappers/'); const exchanges = exchangesDir .filter(f => _.last(f, 3).join('') === '.js') .map(f => f.slice(0, -3)); @@ -23,7 +23,7 @@ module.exports = function *() { let Trader = null; try { - Trader = require(gekkoRoot + 'exchanges/' + exchange); + Trader = require(gekkoRoot + 'exchange/wrappers/' + exchange); } catch (e) { return; } diff --git a/web/routes/info.js b/web/routes/info.js new file mode 100644 index 000000000..a8969add0 --- /dev/null +++ b/web/routes/info.js @@ -0,0 +1,8 @@ +const p = require('../../package.json'); + +// Retrieves API information +module.exports = function *() { + this.body = { + version: p.version + } +} \ No newline at end of file diff --git a/web/routes/killGekko.js b/web/routes/killGekko.js deleted file mode 100644 index 705ae6ba9..000000000 --- a/web/routes/killGekko.js +++ /dev/null @@ -1,42 +0,0 @@ -const _ = require('lodash'); -const promisify = require('tiny-promisify'); -const moment = require('moment'); - -const pipelineRunner = promisify(require('../../core/workers/pipeline/parent')); -const cache = require('../state/cache'); -const broadcast = cache.get('broadcast'); -const gekkoManager = cache.get('gekkos'); - -const base = require('./baseConfig'); - -// starts an import -// requires a post body with a config object -module.exports = function *() { - - let id = this.request.body.id; - - if(!id) { - this.body = { - status: 'not ok' - } - return; - } - - let deleted = gekkoManager.delete(id); - - if(!deleted){ - this.body = { - status: 'not ok' - } - return; - } - - broadcast({ - type: 'gekko_killed', - gekko_id: id - }); - - this.body = { - status: 'ok' - }; -} \ No newline at end of file diff --git a/web/routes/startGekko.js b/web/routes/startGekko.js index e628134bf..8d28ed653 100644 --- a/web/routes/startGekko.js +++ b/web/routes/startGekko.js @@ -1,11 +1,7 @@ const _ = require('lodash'); -const promisify = require('tiny-promisify'); -const moment = require('moment'); -const pipelineRunner = promisify(require('../../core/workers/pipeline/parent')); const cache = require('../state/cache'); const Logger = require('../state/logger'); -const broadcast = cache.get('broadcast'); const apiKeyManager= cache.get('apiKeyManager'); const gekkoManager = cache.get('gekkos'); @@ -21,7 +17,7 @@ module.exports = function *() { _.merge(config, base, this.request.body); // Attach API keys - if(config.trader && config.trader.enabled) { + if(config.trader && config.trader.enabled && !config.trader.key) { const keys = apiKeyManager._getApiKeyPair(config.watch.exchange); @@ -36,144 +32,7 @@ module.exports = function *() { ); } - // set type - if(mode === 'realtime') { - if(config.market && config.market.type) - var type = config.market.type; - else - var type = 'watcher'; - } else { - var type = ''; - } - - const id = (Math.random() + '').slice(3); - - let errored = false; - - var logType = type; - if(logType === 'leech') { - if(config.trader && config.trader.enabled) - logType = 'tradebot'; - else - logType = 'papertrader'; - } - const logger = new Logger(logType); - - console.log('Gekko', id, 'started'); - - const child = pipelineRunner(mode, config, (err, event) => { - - if(err) { - if(errored) - return; - - let deleted = gekkoManager.delete(id); - - if(!deleted) - // it was already deleted - return; - - errored = true; - console.error('RECEIVED ERROR IN GEKKO', id); - console.error(err); - return broadcast({ - type: 'gekko_error', - gekko_id: id, - error: err - }); - } - - if(event && event.log) - return logger.write(event.log); - - if(!event || !event.type) - return; - - if(event.type === 'trade') { - let trade = event.trade; - gekkoManager.push(id, 'trades', trade); - let wsEvent = { - type: 'trade', - gekko_id: id, - gekko_mode: mode, - gekko_type: type, - emitter: 'gekko', - trade - } - broadcast(wsEvent); - return; - } else if(event.type === 'roundtrip') { - let roundtrip = event.roundtrip; - gekkoManager.push(id, 'roundtrips', roundtrip); - let wsEvent = { - type: 'roundtrip', - gekko_id: id, - gekko_mode: mode, - gekko_type: type, - emitter: 'gekko', - roundtrip - } - broadcast(wsEvent); - return; - } - - let updates = {}; - - if(event.type === 'update') { - updates.latest = event.latest; - } else { - // all possible events can be found in - // @file gekko/core/cp.js - updates[event.type] = event[event.type]; - } - - - gekkoManager.update(id, updates); - // emit update over ws - let wsEvent = { - type: event.type, - gekko_id: id, - gekko_mode: mode, - gekko_type: type, - emitter: 'gekko', - updates - } - broadcast(wsEvent); - }); - - const now = moment.utc().format(); - - var gekko = { - watch: config.watch, - id, - startAt: '', - latest: '', - mode, - type - } - - if(config.tradingAdvisor && config.tradingAdvisor.enabled) { - gekko.strat = { - name: config.tradingAdvisor.method, - tradingAdvisor: config.tradingAdvisor, - params: config[ config.tradingAdvisor.method ] - }; - - gekko.trades = []; - gekko.roundtrips = []; - - if(config.trader && config.trader.enabled) - gekko.trader = 'tradebot'; - else - gekko.trader = 'paper trader'; - } - - gekkoManager.add(gekko); - - broadcast({ - type: 'new_gekko', - gekko - }); + const state = gekkoManager.add({config, mode}); - this.body = gekko; + this.body = state; } diff --git a/web/routes/stopGekko.js b/web/routes/stopGekko.js new file mode 100644 index 000000000..031d7f9ae --- /dev/null +++ b/web/routes/stopGekko.js @@ -0,0 +1,23 @@ +const cache = require('../state/cache'); +const gekkoManager = cache.get('gekkos'); + +// stops a Gekko +// requires a post body with an id +module.exports = function *() { + + let id = this.request.body.id; + + if(!id) { + this.body = { status: 'not ok' } + return; + } + + let stopped = gekkoManager.stop(id); + + if(!stopped) { + this.body = { status: 'not ok' } + return; + } + + this.body = { status: 'ok' }; +} \ No newline at end of file diff --git a/web/server.js b/web/server.js index 6f266579c..fc8ec1a3d 100644 --- a/web/server.js +++ b/web/server.js @@ -1,4 +1,4 @@ -const config = require('./vue/UIconfig'); +const config = require('./vue/public/UIconfig'); const koa = require('koa'); const serve = require('koa-static'); @@ -16,7 +16,9 @@ const WebSocketServer = require('ws').Server; const wss = new WebSocketServer({ server: server }); const cache = require('./state/cache'); -const ListManager = require('./state/listManager'); + +const nodeCommand = _.last(process.argv[1].split('/')); +const isDevServer = nodeCommand === 'server' || nodeCommand === 'server.js'; // broadcast function const broadcast = data => { @@ -25,14 +27,23 @@ const broadcast = data => { _.each( wss.clients, - client => client.send(JSON.stringify(data)) + client => { + try { + client.send(JSON.stringify(data)); + } catch(e) { + log.warn('unable to send data to client'); + } + } ); } cache.set('broadcast', broadcast); +const ListManager = require('./state/listManager'); +const GekkoManager = require('./state/gekkoManager'); + // initialize lists and dump into cache cache.set('imports', new ListManager); -cache.set('gekkos', new ListManager); +cache.set('gekkos', new GekkoManager); cache.set('apiKeyManager', require('./apiKeyManager')); // setup API routes @@ -42,6 +53,7 @@ const ROUTE = n => WEBROOT + 'routes/' + n; // attach routes const apiKeys = require(ROUTE('apiKeys')); +router.get('/api/info', require(ROUTE('info'))); router.get('/api/strategies', require(ROUTE('strategies'))); router.get('/api/configPart/:part', require(ROUTE('configPart'))); router.get('/api/apiKeys', apiKeys.get); @@ -58,7 +70,8 @@ router.post('/api/scansets', require(ROUTE('scanDatasets'))); router.post('/api/backtest', require(ROUTE('backtest'))); router.post('/api/import', require(ROUTE('import'))); router.post('/api/startGekko', require(ROUTE('startGekko'))); -router.post('/api/killGekko', require(ROUTE('killGekko'))); +router.post('/api/stopGekko', require(ROUTE('stopGekko'))); +router.post('/api/deleteGekko', require(ROUTE('deleteGekko'))); router.post('/api/getCandles', require(ROUTE('getCandles'))); @@ -69,13 +82,13 @@ router.post('/api/getCandles', require(ROUTE('getCandles'))); app .use(cors()) - .use(serve(WEBROOT + 'vue')) + .use(serve(WEBROOT + 'vue/dist')) .use(bodyParser()) .use(require('koa-logger')()) .use(router.routes()) .use(router.allowedMethods()); -server.timeout = config.api.timeout||120000; +server.timeout = config.api.timeout || 120000; server.on('request', app.callback()); server.listen(config.api.port, config.api.host, '::', () => { const host = `${config.ui.host}:${config.ui.port}${config.ui.path}`; @@ -91,8 +104,7 @@ server.listen(config.api.port, config.api.host, '::', () => { // only open a browser when running `node gekko` // this prevents opening the browser during development - let nodeCommand = _.last(process.argv[1].split('/')); - if(nodeCommand === 'gekko' && !config.headless) { + if(!isDevServer && !config.headless) { opn(location) .catch(err => { console.log('Something went wrong when trying to open your web browser. UI is running on ' + location + '.'); diff --git a/web/state/gekkoManager.js b/web/state/gekkoManager.js new file mode 100644 index 000000000..53d609933 --- /dev/null +++ b/web/state/gekkoManager.js @@ -0,0 +1,252 @@ +const _ = require('lodash'); +const moment = require('moment'); + +const broadcast = require('./cache').get('broadcast'); +const Logger = require('./logger'); +const pipelineRunner = require('../../core/workers/pipeline/parent'); +const reduceState = require('./reduceState.js'); +const now = () => moment().format('YYYY-MM-DD HH:mm'); + +const GekkoManager = function() { + this.gekkos = {}; + this.instances = {}; + this.loggers = {}; + + this.archivedGekkos = {}; +} + +GekkoManager.prototype.add = function({mode, config}) { + // set type + let type; + if(mode === 'realtime') { + if(config.market && config.market.type) + type = config.market.type; + else + type = 'watcher'; + } else { + type = ''; + } + + let logType = type; + if(logType === 'leech') { + if(config.trader && config.trader.enabled) + logType = 'tradebot'; + else + logType = 'papertrader'; + } + + const date = now().replace(' ', '-').replace(':', '-'); + const n = (Math.random() + '').slice(3); + const id = `${date}-${logType}-${n}`; + + // make sure we catch events happening inside te gekko instance + config.childToParent.enabled = true; + + const state = { + mode, + config, + id, + type, + logType, + active: true, + stopped: false, + errored: false, + errorMessage: false, + events: { + initial: {}, + latest: {} + }, + start: moment() + } + + this.gekkos[id] = state; + + this.loggers[id] = new Logger(id); + + // start the actual instance + this.instances[id] = pipelineRunner(mode, config, this.handleRawEvent(id)); + + // after passing API credentials to the actual instance we mask them + if(logType === 'trader') { + config.trader.key = '[REDACTED]'; + config.trader.secret = '[REDACTED]'; + } + + console.log(`${now()} Gekko ${id} started.`); + + broadcast({ + type: 'gekko_new', + id, + state + }); + + return state; +} + +GekkoManager.prototype.handleRawEvent = function(id) { + const logger = this.loggers[id]; + + return (err, event) => { + if(err) { + return this.handleFatalError(id, err); + } + + if(event.log) { + return logger.write(event.message); + } + + if(!event || !event.type) { + return; + } + + this.handleGekkoEvent(id, event); + } +} + +GekkoManager.prototype.handleGekkoEvent = function(id, event) { + this.gekkos[id] = reduceState(this.gekkos[id], event); + broadcast({ + type: 'gekko_event', + id, + event + }); +} + +GekkoManager.prototype.handleFatalError = function(id, err) { + const state = this.gekkos[id]; + + if(!state || state.errored || state.stopped) + return; + + state.errored = true; + state.errorMessage = err; + console.error('RECEIVED ERROR IN GEKKO INSTANCE', id); + console.error(err); + broadcast({ + type: 'gekko_error', + id, + error: err + }); + + this.archive(id); + + if(state.logType === 'watcher') { + this.handleWatcherError(state, id); + } +} + +// There might be leechers depending on this watcher, if so +// figure out it we can safely start a new watcher without +// the leechers noticing. +GekkoManager.prototype.handleWatcherError = function(state, id) { + console.log(`${now()} A gekko watcher crashed.`); + if(!state.events.latest.candle) { + console.log(`${now()} was unable to start.`); + } + + let latestCandleTime = moment.unix(0); + if(state.events.latest && state.events.latest.candle) { + latestCandleTime = state.events.latest.candle.start; + } + const leechers = _.values(this.gekkos) + .filter(gekko => { + if(gekko.type !== 'leech') { + return false; + } + + if(_.isEqual(gekko.config.watch, state.config.watch)) { + return true; + } + }); + + if(leechers.length) { + console.log(`${now()} ${leechers.length} leecher(s) were depending on this watcher.`); + if(moment().diff(latestCandleTime, 'm') < 60) { + console.log(`${now()} Watcher had recent data, starting a new one in a minute.`); + // after a minute try to start a new one again.. + setTimeout(() => { + const mode = 'realtime'; + const config = state.config; + this.add({mode, config}); + }, 1000 * 60); + } else { + console.log(`${now()} Watcher did not have recent data, killing its leechers.`); + leechers.forEach(leecher => this.stop(leecher.id)); + } + + } +} + +GekkoManager.prototype.stop = function(id) { + if(!this.gekkos[id]) + return false; + + console.log(`${now()} stopping Gekko ${id}`); + + this.gekkos[id].stopped = true; + this.gekkos[id].active = false; + + // todo: graceful shutdown (via gekkoStream's + // finish function). + this.instances[id].kill(); + + broadcast({ + type: 'gekko_stopped', + id + }); + + this.archive(id); + + return true; +} + +GekkoManager.prototype.archive = function(id) { + this.archivedGekkos[id] = this.gekkos[id]; + this.archivedGekkos[id].stopped = true; + this.archivedGekkos[id].active = false; + delete this.gekkos[id]; + + broadcast({ + type: 'gekko_archived', + id + }); +} + +GekkoManager.prototype.delete = function(id) { + if(this.gekkos[id]) { + throw new Error('Cannot delete a running Gekko, stop it first.'); + } + + if(!this.archivedGekkos[id]) { + throw new Error('Cannot delete unknown Gekko.'); + } + + console.log(`${now()} deleting Gekko ${id}`); + + broadcast({ + type: 'gekko_deleted', + id + }); + + delete this.archivedGekkos[id]; + + return true; +} + +GekkoManager.prototype.archive = function(id) { + this.archivedGekkos[id] = this.gekkos[id]; + this.archivedGekkos[id].stopped = true; + this.archivedGekkos[id].active = false; + delete this.gekkos[id]; + + broadcast({ + type: 'gekko_archived', + id + }); +} + +GekkoManager.prototype.list = function() { + return { live: this.gekkos, archive: this.archivedGekkos }; +} + +module.exports = GekkoManager; \ No newline at end of file diff --git a/web/state/listManager.js b/web/state/listManager.js index 7c40d72e4..3486f315e 100644 --- a/web/state/listManager.js +++ b/web/state/listManager.js @@ -1,8 +1,6 @@ // manages a list of things that change over time // used for: // - The currently running imports -// - The currently running gekko watchers -// - The live gekkos // - etc.. const _ = require('lodash'); @@ -27,7 +25,12 @@ ListManager.prototype.update = function(id, updates) { return true; } -// push a value to a array proprty of an item +// get an item from the list +ListManager.prototype.get = function(id) { + return this._list.find(i => i.id === id); +} + +// push a value to a array property of an item ListManager.prototype.push = function(id, prop, value) { let item = this._list.find(i => i.id === id); if(!item) diff --git a/web/state/logger.js b/web/state/logger.js index fc65930e4..dd5d63103 100644 --- a/web/state/logger.js +++ b/web/state/logger.js @@ -1,13 +1,11 @@ const fs = require('fs'); -const moment = require('moment'); const _ = require('lodash'); const BASEPATH = __dirname + '/../../logs/'; -const Logger = function(type) { +const Logger = function(id) { - const now = moment().utc().format('YYYY-MM-DD-HH-mm'); - this.fileName = `${now}-UTC-${type}.log`; + this.fileName = `${id}.log`; this.writing = false; this.queue = []; diff --git a/web/state/reduceState.js b/web/state/reduceState.js new file mode 100644 index 000000000..160b0874a --- /dev/null +++ b/web/state/reduceState.js @@ -0,0 +1,67 @@ +// Redux/vuex inspired reducer, reduces an event into a gekko state. +// NOTE: this is used by the backend as well as the frontend. + +const skipInitialEvents = ['marketUpdate']; +const skipLatestEvents = ['marketStart', 'stratWarmupCompleted']; +const trackAllEvents = ['tradeCompleted', 'advice', 'roundtrip']; + +const reduce = (state, event) => { + const type = event.type; + const payload = event.payload; + + state = { + ...state, + latestUpdate: new Date() + } + + if(trackAllEvents.includes(type)) { + if(!state.events[type]) { + state = { + ...state, + events: { + ...state.events, + [type]: [ payload ] + } + } + } else { + state = { + ...state, + events: { + ...state.events, + [type]: [ ...state.events[type], payload ] + } + } + } + } + + if(!state.events.initial[type] && !skipInitialEvents.includes(type)) { + state = { + ...state, + events: { + ...state.events, + initial: { + ...state.events.initial, + [type]: payload + } + } + } + } + + if(!skipLatestEvents.includes(type)) { + state = { + ...state, + events: { + ...state.events, + latest: { + ...state.events.latest, + [type]: payload + } + } + } + } + + return state; +} + +// export default reduce; +module.exports = reduce; \ No newline at end of file diff --git a/web/vue/.babelrc b/web/vue/.babelrc deleted file mode 100644 index 9897749da..000000000 --- a/web/vue/.babelrc +++ /dev/null @@ -1,5 +0,0 @@ -{ - "presets": [ - ["es2015", { "modules": false }] - ] -} diff --git a/web/vue/README.md b/web/vue/README.md deleted file mode 100644 index 23486dbf5..000000000 --- a/web/vue/README.md +++ /dev/null @@ -1,18 +0,0 @@ -# vue - -> A Vue.js project - -## Build Setup - -``` bash -# install dependencies -npm install - -# serve with hot reload at localhost:8080 -npm run dev - -# build for production with minification -npm run build -``` - -For detailed explanation on how things work, consult the [docs for vue-loader](http://vuejs.github.io/vue-loader). diff --git a/web/vue/babel.config.js b/web/vue/babel.config.js new file mode 100644 index 000000000..93c2e1480 --- /dev/null +++ b/web/vue/babel.config.js @@ -0,0 +1,9 @@ +module.exports = { + presets: [ + '@vue/app' + ], + ignore: [ + 'node_modules', + '../state/reduceState.js' + ] +} \ No newline at end of file diff --git a/web/vue/UIconfig.js b/web/vue/dist/UIconfig.js similarity index 100% rename from web/vue/UIconfig.js rename to web/vue/dist/UIconfig.js diff --git a/web/vue/dist/build.js b/web/vue/dist/build.js deleted file mode 100644 index 145e3823a..000000000 --- a/web/vue/dist/build.js +++ /dev/null @@ -1,16 +0,0 @@ -!function(t){function e(r){if(n[r])return n[r].exports;var i=n[r]={i:r,l:!1,exports:{}};return t[r].call(i.exports,i,i.exports,e),i.l=!0,i.exports}var n={};e.m=t,e.c=n,e.i=function(t){return t},e.d=function(t,n,r){e.o(t,n)||Object.defineProperty(t,n,{configurable:!1,enumerable:!0,get:r})},e.n=function(t){var n=t&&t.__esModule?function(){return t.default}:function(){return t};return e.d(n,"a",n),n},e.o=function(t,e){return Object.prototype.hasOwnProperty.call(t,e)},e.p="/dist/",e(e.s=70)}([function(t,e){t.exports=function(){var t=[];return t.toString=function(){for(var t=[],e=0;e=0&&m.splice(e,1)}function a(t){var e=document.createElement("style");return e.type="text/css",i(t,e),e}function s(t,e){var n,r,i;if(e.singleton){var s=v++;n=h||(h=a(e)),r=u.bind(null,n,s,!1),i=u.bind(null,n,s,!0)}else n=a(e),r=c.bind(null,n),i=function(){o(n)};return r(t),function(e){if(e){if(e.css===t.css&&e.media===t.media&&e.sourceMap===t.sourceMap)return;r(t=e)}else i()}}function u(t,e,n,r){var i=n?"":r.css;if(t.styleSheet)t.styleSheet.cssText=g(e,i);else{var o=document.createTextNode(i),a=t.childNodes;a[e]&&t.removeChild(a[e]),a.length?t.insertBefore(o,a[e]):t.appendChild(o)}}function c(t,e){var n=e.css,r=e.media,i=e.sourceMap;if(r&&t.setAttribute("media",r),i&&(n+="\n/*# sourceURL="+i.sources[0]+" */",n+="\n/*# sourceMappingURL=data:application/json;base64,"+btoa(unescape(encodeURIComponent(JSON.stringify(i))))+" */"),t.styleSheet)t.styleSheet.cssText=n;else{for(;t.firstChild;)t.removeChild(t.firstChild);t.appendChild(document.createTextNode(n))}}var l={},f=function(t){var e;return function(){return void 0===e&&(e=t.apply(this,arguments)),e}},d=f(function(){return/msie [6-9]\b/.test(window.navigator.userAgent.toLowerCase())}),p=f(function(){return document.head||document.getElementsByTagName("head")[0]}),h=null,v=0,m=[];t.exports=function(t,e){if("undefined"!=typeof DEBUG&&DEBUG&&"object"!=typeof document)throw new Error("The style-loader cannot be used in a non-browser environment");e=e||{},void 0===e.singleton&&(e.singleton=d()),void 0===e.insertAt&&(e.insertAt="bottom");var i=r(t);return n(i,e),function(t){for(var o=[],a=0;a-1}function d(t,e,n){for(var r=-1,i=null==t?0:t.length;++r-1;);return n}function I(t,e){for(var n=t.length;n--&&w(e,t[n],0)>-1;);return n}function z(t,e){for(var n=t.length,r=0;n--;)t[n]===e&&++r;return r}function F(t){return"\\"+On[t]}function L(t,e){return null==t?rt:t[e]}function V(t){return gn.test(t)}function U(t){return _n.test(t)}function H(t){for(var e,n=[];!(e=t.next()).done;)n.push(e.value);return n}function q(t){var e=-1,n=Array(t.size);return t.forEach(function(t,r){n[++e]=[r,t]}),n}function W(t,e){return function(n){return t(e(n))}}function B(t,e){for(var n=-1,r=t.length,i=0,o=[];++n>>1,zt=[["ary",wt],["bind",vt],["bindKey",mt],["curry",_t],["curryRight",yt],["flip",Ct],["partial",bt],["partialRight",xt],["rearg",kt]],Ft="[object Arguments]",Lt="[object Array]",Vt="[object AsyncFunction]",Ut="[object Boolean]",Ht="[object Date]",qt="[object DOMException]",Wt="[object Error]",Bt="[object Function]",Yt="[object GeneratorFunction]",Gt="[object Map]",Kt="[object Number]",Zt="[object Null]",Xt="[object Object]",Jt="[object Proxy]",Qt="[object RegExp]",te="[object Set]",ee="[object String]",ne="[object Symbol]",re="[object Undefined]",ie="[object WeakMap]",oe="[object WeakSet]",ae="[object ArrayBuffer]",se="[object DataView]",ue="[object Float32Array]",ce="[object Float64Array]",le="[object Int8Array]",fe="[object Int16Array]",de="[object Int32Array]",pe="[object Uint8Array]",he="[object Uint8ClampedArray]",ve="[object Uint16Array]",me="[object Uint32Array]",ge=/\b__p \+= '';/g,_e=/\b(__p \+=) '' \+/g,ye=/(__e\(.*?\)|\b__t\)) \+\n'';/g,be=/&(?:amp|lt|gt|quot|#39);/g,xe=/[&<>"']/g,we=RegExp(be.source),ke=RegExp(xe.source),Ce=/<%-([\s\S]+?)%>/g,Ee=/<%([\s\S]+?)%>/g,Oe=/<%=([\s\S]+?)%>/g,Ae=/\.|\[(?:[^[\]]*|(["'])(?:(?!\1)[^\\]|\\.)*?\1)\]/,$e=/^\w*$/,Se=/[^.[\]]+|\[(?:(-?\d+(?:\.\d+)?)|(["'])((?:(?!\2)[^\\]|\\.)*?)\2)\]|(?=(?:\.|\[\])(?:\.|\[\]|$))/g,Ne=/[\\^$.*+?()[\]{}|]/g,je=RegExp(Ne.source),Te=/^\s+|\s+$/g,Re=/^\s+/,De=/\s+$/,Pe=/\{(?:\n\/\* \[wrapped with .+\] \*\/)?\n?/,Me=/\{\n\/\* \[wrapped with (.+)\] \*/,Ie=/,? & /,ze=/[^\x00-\x2f\x3a-\x40\x5b-\x60\x7b-\x7f]+/g,Fe=/\\(\\)?/g,Le=/\$\{([^\\}]*(?:\\.[^\\}]*)*)\}/g,Ve=/\w*$/,Ue=/^[-+]0x[0-9a-f]+$/i,He=/^0b[01]+$/i,qe=/^\[object .+?Constructor\]$/,We=/^0o[0-7]+$/i,Be=/^(?:0|[1-9]\d*)$/,Ye=/[\xc0-\xd6\xd8-\xf6\xf8-\xff\u0100-\u017f]/g,Ge=/($^)/,Ke=/['\n\r\u2028\u2029\\]/g,Ze="\\u0300-\\u036f\\ufe20-\\ufe2f\\u20d0-\\u20ff",Xe="\\xac\\xb1\\xd7\\xf7\\x00-\\x2f\\x3a-\\x40\\x5b-\\x60\\x7b-\\xbf\\u2000-\\u206f \\t\\x0b\\f\\xa0\\ufeff\\n\\r\\u2028\\u2029\\u1680\\u180e\\u2000\\u2001\\u2002\\u2003\\u2004\\u2005\\u2006\\u2007\\u2008\\u2009\\u200a\\u202f\\u205f\\u3000",Je="["+Xe+"]",Qe="["+Ze+"]",tn="[a-z\\xdf-\\xf6\\xf8-\\xff]",en="[^\\ud800-\\udfff"+Xe+"\\d+\\u2700-\\u27bfa-z\\xdf-\\xf6\\xf8-\\xffA-Z\\xc0-\\xd6\\xd8-\\xde]",nn="\\ud83c[\\udffb-\\udfff]",rn="(?:\\ud83c[\\udde6-\\uddff]){2}",on="[\\ud800-\\udbff][\\udc00-\\udfff]",an="[A-Z\\xc0-\\xd6\\xd8-\\xde]",sn="(?:"+tn+"|"+en+")",un="(?:[\\u0300-\\u036f\\ufe20-\\ufe2f\\u20d0-\\u20ff]|\\ud83c[\\udffb-\\udfff])?",cn="(?:\\u200d(?:"+["[^\\ud800-\\udfff]",rn,on].join("|")+")[\\ufe0e\\ufe0f]?"+un+")*",ln="[\\ufe0e\\ufe0f]?"+un+cn,fn="(?:"+["[\\u2700-\\u27bf]",rn,on].join("|")+")"+ln,dn="(?:"+["[^\\ud800-\\udfff]"+Qe+"?",Qe,rn,on,"[\\ud800-\\udfff]"].join("|")+")",pn=RegExp("['’]","g"),hn=RegExp(Qe,"g"),vn=RegExp(nn+"(?="+nn+")|"+dn+ln,"g"),mn=RegExp([an+"?"+tn+"+(?:['’](?:d|ll|m|re|s|t|ve))?(?="+[Je,an,"$"].join("|")+")","(?:[A-Z\\xc0-\\xd6\\xd8-\\xde]|[^\\ud800-\\udfff\\xac\\xb1\\xd7\\xf7\\x00-\\x2f\\x3a-\\x40\\x5b-\\x60\\x7b-\\xbf\\u2000-\\u206f \\t\\x0b\\f\\xa0\\ufeff\\n\\r\\u2028\\u2029\\u1680\\u180e\\u2000\\u2001\\u2002\\u2003\\u2004\\u2005\\u2006\\u2007\\u2008\\u2009\\u200a\\u202f\\u205f\\u3000\\d+\\u2700-\\u27bfa-z\\xdf-\\xf6\\xf8-\\xffA-Z\\xc0-\\xd6\\xd8-\\xde])+(?:['’](?:D|LL|M|RE|S|T|VE))?(?="+[Je,an+sn,"$"].join("|")+")",an+"?"+sn+"+(?:['’](?:d|ll|m|re|s|t|ve))?",an+"+(?:['’](?:D|LL|M|RE|S|T|VE))?","\\d*(?:1ST|2ND|3RD|(?![123])\\dTH)(?=\\b|[a-z_])","\\d*(?:1st|2nd|3rd|(?![123])\\dth)(?=\\b|[A-Z_])","\\d+",fn].join("|"),"g"),gn=RegExp("[\\u200d\\ud800-\\udfff"+Ze+"\\ufe0e\\ufe0f]"),_n=/[a-z][A-Z]|[A-Z]{2,}[a-z]|[0-9][a-zA-Z]|[a-zA-Z][0-9]|[^a-zA-Z0-9 ]/,yn=["Array","Buffer","DataView","Date","Error","Float32Array","Float64Array","Function","Int8Array","Int16Array","Int32Array","Map","Math","Object","Promise","RegExp","Set","String","Symbol","TypeError","Uint8Array","Uint8ClampedArray","Uint16Array","Uint32Array","WeakMap","_","clearTimeout","isFinite","parseInt","setTimeout"],bn=-1,xn={};xn[ue]=xn[ce]=xn[le]=xn[fe]=xn[de]=xn[pe]=xn[he]=xn[ve]=xn[me]=!0,xn[Ft]=xn[Lt]=xn[ae]=xn[Ut]=xn[se]=xn[Ht]=xn[Wt]=xn[Bt]=xn[Gt]=xn[Kt]=xn[Xt]=xn[Qt]=xn[te]=xn[ee]=xn[ie]=!1;var wn={};wn[Ft]=wn[Lt]=wn[ae]=wn[se]=wn[Ut]=wn[Ht]=wn[ue]=wn[ce]=wn[le]=wn[fe]=wn[de]=wn[Gt]=wn[Kt]=wn[Xt]=wn[Qt]=wn[te]=wn[ee]=wn[ne]=wn[pe]=wn[he]=wn[ve]=wn[me]=!0,wn[Wt]=wn[Bt]=wn[ie]=!1;var kn={"À":"A","Á":"A","Â":"A","Ã":"A","Ä":"A","Å":"A","à":"a","á":"a","â":"a","ã":"a","ä":"a","å":"a","Ç":"C","ç":"c","Ð":"D","ð":"d","È":"E","É":"E","Ê":"E","Ë":"E","è":"e","é":"e","ê":"e","ë":"e","Ì":"I","Í":"I","Î":"I","Ï":"I","ì":"i","í":"i","î":"i","ï":"i","Ñ":"N","ñ":"n","Ò":"O","Ó":"O","Ô":"O","Õ":"O","Ö":"O","Ø":"O","ò":"o","ó":"o","ô":"o","õ":"o","ö":"o","ø":"o","Ù":"U","Ú":"U","Û":"U","Ü":"U","ù":"u","ú":"u","û":"u","ü":"u","Ý":"Y","ý":"y","ÿ":"y","Æ":"Ae","æ":"ae","Þ":"Th","þ":"th","ß":"ss","Ā":"A","Ă":"A","Ą":"A","ā":"a","ă":"a","ą":"a","Ć":"C","Ĉ":"C","Ċ":"C","Č":"C","ć":"c","ĉ":"c","ċ":"c","č":"c","Ď":"D","Đ":"D","ď":"d","đ":"d","Ē":"E","Ĕ":"E","Ė":"E","Ę":"E","Ě":"E","ē":"e","ĕ":"e","ė":"e","ę":"e","ě":"e","Ĝ":"G","Ğ":"G","Ġ":"G","Ģ":"G","ĝ":"g","ğ":"g","ġ":"g","ģ":"g","Ĥ":"H","Ħ":"H","ĥ":"h","ħ":"h","Ĩ":"I","Ī":"I","Ĭ":"I","Į":"I","İ":"I","ĩ":"i","ī":"i","ĭ":"i","į":"i","ı":"i","Ĵ":"J","ĵ":"j","Ķ":"K","ķ":"k","ĸ":"k","Ĺ":"L","Ļ":"L","Ľ":"L","Ŀ":"L","Ł":"L","ĺ":"l","ļ":"l","ľ":"l","ŀ":"l","ł":"l","Ń":"N","Ņ":"N","Ň":"N","Ŋ":"N","ń":"n","ņ":"n","ň":"n","ŋ":"n","Ō":"O","Ŏ":"O","Ő":"O","ō":"o","ŏ":"o","ő":"o","Ŕ":"R","Ŗ":"R","Ř":"R","ŕ":"r","ŗ":"r","ř":"r","Ś":"S","Ŝ":"S","Ş":"S","Š":"S","ś":"s","ŝ":"s","ş":"s","š":"s","Ţ":"T","Ť":"T","Ŧ":"T","ţ":"t","ť":"t","ŧ":"t","Ũ":"U","Ū":"U","Ŭ":"U","Ů":"U","Ű":"U","Ų":"U","ũ":"u","ū":"u","ŭ":"u","ů":"u","ű":"u","ų":"u","Ŵ":"W","ŵ":"w","Ŷ":"Y","ŷ":"y","Ÿ":"Y","Ź":"Z","Ż":"Z","Ž":"Z","ź":"z","ż":"z","ž":"z","IJ":"IJ","ij":"ij","Œ":"Oe","œ":"oe","ʼn":"'n","ſ":"s"},Cn={"&":"&","<":"<",">":">",'"':""","'":"'"},En={"&":"&","<":"<",">":">",""":'"',"'":"'"},On={"\\":"\\","'":"'","\n":"n","\r":"r","\u2028":"u2028","\u2029":"u2029"},An=parseFloat,$n=parseInt,Sn="object"==typeof t&&t&&t.Object===Object&&t,Nn="object"==typeof self&&self&&self.Object===Object&&self,jn=Sn||Nn||Function("return this")(),Tn="object"==typeof e&&e&&!e.nodeType&&e,Rn=Tn&&"object"==typeof r&&r&&!r.nodeType&&r,Dn=Rn&&Rn.exports===Tn,Pn=Dn&&Sn.process,Mn=function(){try{var t=Rn&&Rn.require&&Rn.require("util").types;return t||Pn&&Pn.binding&&Pn.binding("util")}catch(t){}}(),In=Mn&&Mn.isArrayBuffer,zn=Mn&&Mn.isDate,Fn=Mn&&Mn.isMap,Ln=Mn&&Mn.isRegExp,Vn=Mn&&Mn.isSet,Un=Mn&&Mn.isTypedArray,Hn=O("length"),qn=A(kn),Wn=A(Cn),Bn=A(En),Yn=function t(e){function n(t){if(eu(t)&&!pd(t)&&!(t instanceof _)){if(t instanceof i)return t;if(dl.call(t,"__wrapped__"))return Jo(t)}return new i(t)}function r(){}function i(t,e){this.__wrapped__=t,this.__actions__=[],this.__chain__=!!e,this.__index__=0,this.__values__=rt}function _(t){this.__wrapped__=t,this.__actions__=[],this.__dir__=1,this.__filtered__=!1,this.__iteratees__=[],this.__takeCount__=Pt,this.__views__=[]}function A(){var t=new _(this.__wrapped__);return t.__actions__=Ri(this.__actions__),t.__dir__=this.__dir__,t.__filtered__=this.__filtered__,t.__iteratees__=Ri(this.__iteratees__),t.__takeCount__=this.__takeCount__,t.__views__=Ri(this.__views__),t}function Z(){if(this.__filtered__){var t=new _(this);t.__dir__=-1,t.__filtered__=!0}else t=this.clone(),t.__dir__*=-1;return t}function tt(){var t=this.__wrapped__.value(),e=this.__dir__,n=pd(t),r=e<0,i=n?t.length:0,o=ko(0,i,this.__views__),a=o.start,s=o.end,u=s-a,c=r?s:a-1,l=this.__iteratees__,f=l.length,d=0,p=Ul(u,this.__takeCount__);if(!n||!r&&i==u&&p==u)return mi(t,this.__actions__);var h=[];t:for(;u--&&d-1}function an(t,e){var n=this.__data__,r=Gn(n,t);return r<0?(++this.size,n.push([t,e])):n[r][1]=e,this}function sn(t){var e=-1,n=null==t?0:t.length;for(this.clear();++e=e?t:e)),t}function er(t,e,n,r,i,o){var a,u=e<,c=e&ft,l=e&dt;if(n&&(a=i?n(t,r,i,o):n(t)),a!==rt)return a;if(!tu(t))return t;var f=pd(t);if(f){if(a=Oo(t),!u)return Ri(t,a)}else{var d=kf(t),p=d==Bt||d==Yt;if(vd(t))return ki(t,u);if(d==Xt||d==Ft||p&&!i){if(a=c||p?{}:Ao(t),!u)return c?Mi(t,Xn(a,t)):Pi(t,Zn(a,t))}else{if(!wn[d])return i?t:{};a=$o(t,d,u)}}o||(o=new _n);var h=o.get(t);if(h)return h;if(o.set(t,a),yd(t))return t.forEach(function(r){a.add(er(r,e,n,r,t,o))}),a;if(gd(t))return t.forEach(function(r,i){a.set(i,er(r,e,n,i,t,o))}),a;var v=l?c?vo:ho:c?Iu:Mu,m=f?rt:v(t);return s(m||t,function(r,i){m&&(i=r,r=t[i]),Hn(a,i,er(r,e,n,i,t,o))}),a}function nr(t){var e=Mu(t);return function(n){return rr(n,t,e)}}function rr(t,e,n){var r=n.length;if(null==t)return!r;for(t=rl(t);r--;){var i=n[r],o=e[i],a=t[i];if(a===rt&&!(i in t)||!o(a))return!1}return!0}function ir(t,e,n){if("function"!=typeof t)throw new al(at);return Of(function(){t.apply(rt,n)},e)}function or(t,e,n,r){var i=-1,o=f,a=!0,s=t.length,u=[],c=e.length;if(!s)return u;n&&(e=p(e,R(n))),r?(o=d,a=!1):e.length>=it&&(o=P,a=!1,e=new vn(e));t:for(;++ii?0:i+n),r=r===rt||r>i?i:_u(r),r<0&&(r+=i),r=n>r?0:yu(r);n0&&n(s)?e>1?lr(s,e-1,n,r,i):h(i,s):r||(i[i.length]=s)}return i}function fr(t,e){return t&&pf(t,e,Mu)}function dr(t,e){return t&&hf(t,e,Mu)}function pr(t,e){return l(e,function(e){return Xs(t[e])})}function hr(t,e){e=xi(e,t);for(var n=0,r=e.length;null!=t&&ne}function _r(t,e){return null!=t&&dl.call(t,e)}function yr(t,e){return null!=t&&e in rl(t)}function br(t,e,n){return t>=Ul(e,n)&&t=120&&l.length>=120)?new vn(a&&l):rt}l=t[0];var h=-1,v=s[0];t:for(;++h-1;)s!==t&&Ol.call(s,u,1),Ol.call(t,u,1);return t}function Zr(t,e){for(var n=t?e.length:0,r=n-1;n--;){var i=e[n];if(n==r||i!==o){var o=i;jo(i)?Ol.call(t,i,1):pi(t,i)}}return t}function Xr(t,e){return t+Pl(Wl()*(e-t+1))}function Jr(t,e,n,r){for(var i=-1,o=Vl(Dl((e-t)/(n||1)),0),a=Jc(o);o--;)a[r?o:++i]=t,t+=n;return a}function Qr(t,e){var n="";if(!t||e<1||e>Tt)return n;do{e%2&&(n+=t),(e=Pl(e/2))&&(t+=t)}while(e);return n}function ti(t,e){return Af(Ho(t,e,Oc),t+"")}function ei(t){return Tn(Ku(t))}function ni(t,e){var n=Ku(t);return Go(n,tr(e,0,n.length))}function ri(t,e,n,r){if(!tu(t))return t;e=xi(e,t);for(var i=-1,o=e.length,a=o-1,s=t;null!=s&&++ii?0:i+e),n=n>i?i:n,n<0&&(n+=i),i=e>n?0:n-e>>>0,e>>>=0;for(var o=Jc(i);++r>>1,a=t[o];null!==a&&!du(a)&&(n?a<=e:a=it){var c=e?null:yf(t);if(c)return G(c);a=!1,i=P,u=new vn}else u=e?[]:s;t:for(;++r=r?t:oi(t,e,n)}function ki(t,e){if(e)return t.slice();var n=t.length,r=wl?wl(n):new t.constructor(n);return t.copy(r),r}function Ci(t){var e=new t.constructor(t.byteLength);return new xl(e).set(new xl(t)),e}function Ei(t,e){var n=e?Ci(t.buffer):t.buffer;return new t.constructor(n,t.byteOffset,t.byteLength)}function Oi(t){var e=new t.constructor(t.source,Ve.exec(t));return e.lastIndex=t.lastIndex,e}function Ai(t){return uf?rl(uf.call(t)):{}}function $i(t,e){var n=e?Ci(t.buffer):t.buffer;return new t.constructor(n,t.byteOffset,t.length)}function Si(t,e){if(t!==e){var n=t!==rt,r=null===t,i=t===t,o=du(t),a=e!==rt,s=null===e,u=e===e,c=du(e);if(!s&&!c&&!o&&t>e||o&&a&&u&&!s&&!c||r&&a&&u||!n&&u||!i)return 1;if(!r&&!o&&!c&&t=s)return u;return u*("desc"==n[r]?-1:1)}}return t.index-e.index}function ji(t,e,n,r){for(var i=-1,o=t.length,a=n.length,s=-1,u=e.length,c=Vl(o-a,0),l=Jc(u+c),f=!r;++s1?n[i-1]:rt,a=i>2?n[2]:rt;for(o=t.length>3&&"function"==typeof o?(i--,o):rt,a&&To(n[0],n[1],a)&&(o=i<3?rt:o,i=1),e=rl(e);++r-1?i[o?e[a]:a]:rt}}function Yi(t){return po(function(e){var n=e.length,r=n,o=i.prototype.thru;for(t&&e.reverse();r--;){var a=e[r];if("function"!=typeof a)throw new al(at);if(o&&!s&&"wrapper"==mo(a))var s=new i([],!0)}for(r=s?r:n;++r1&&_.reverse(),f&&us))return!1;var c=o.get(t);if(c&&o.get(e))return c==e;var l=-1,f=!0,d=n&ht?new vn:rt;for(o.set(t,e),o.set(e,t);++l1?"& ":"")+e[r],e=e.join(n>2?", ":" "),t.replace(Pe,"{\n/* [wrapped with "+e+"] */\n")}function No(t){return pd(t)||dd(t)||!!(Al&&t&&t[Al])}function jo(t,e){var n=typeof t;return!!(e=null==e?Tt:e)&&("number"==n||"symbol"!=n&&Be.test(t))&&t>-1&&t%1==0&&t0){if(++e>=At)return arguments[0]}else e=0;return t.apply(rt,arguments)}}function Go(t,e){var n=-1,r=t.length,i=r-1;for(e=e===rt?r:e;++n=this.__values__.length;return{done:t,value:t?rt:this.__values__[this.__index__++]}}function Ja(){return this}function Qa(t){for(var e,n=this;n instanceof r;){var i=Jo(n);i.__index__=0,i.__values__=rt,e?o.__wrapped__=i:e=i;var o=i;n=n.__wrapped__}return o.__wrapped__=t,e}function ts(){var t=this.__wrapped__;if(t instanceof _){var e=t;return this.__actions__.length&&(e=new _(this)),e=e.reverse(),e.__actions__.push({func:Ga,args:[Ca],thisArg:rt}),new i(e,this.__chain__)}return this.thru(Ca)}function es(){return mi(this.__wrapped__,this.__actions__)}function ns(t,e,n){var r=pd(t)?c:ar;return n&&To(t,e,n)&&(e=rt),r(t,_o(e,3))}function rs(t,e){return(pd(t)?l:cr)(t,_o(e,3))}function is(t,e){return lr(ls(t,e),1)}function os(t,e){return lr(ls(t,e),jt)}function as(t,e,n){return n=n===rt?1:_u(n),lr(ls(t,e),n)}function ss(t,e){return(pd(t)?s:ff)(t,_o(e,3))}function us(t,e){return(pd(t)?u:df)(t,_o(e,3))}function cs(t,e,n,r){t=Us(t)?t:Ku(t),n=n&&!r?_u(n):0;var i=t.length;return n<0&&(n=Vl(i+n,0)),fu(t)?n<=i&&t.indexOf(e,n)>-1:!!i&&w(t,e,n)>-1}function ls(t,e){return(pd(t)?p:Fr)(t,_o(e,3))}function fs(t,e,n,r){return null==t?[]:(pd(e)||(e=null==e?[]:[e]),n=r?rt:n,pd(n)||(n=null==n?[]:[n]),Wr(t,e,n))}function ds(t,e,n){var r=pd(t)?v:$,i=arguments.length<3;return r(t,_o(e,4),n,i,ff)}function ps(t,e,n){var r=pd(t)?m:$,i=arguments.length<3;return r(t,_o(e,4),n,i,df)}function hs(t,e){return(pd(t)?l:cr)(t,$s(_o(e,3)))}function vs(t){return(pd(t)?Tn:ei)(t)}function ms(t,e,n){return e=(n?To(t,e,n):e===rt)?1:_u(e),(pd(t)?Rn:ni)(t,e)}function gs(t){return(pd(t)?Pn:ii)(t)}function _s(t){if(null==t)return 0;if(Us(t))return fu(t)?J(t):t.length;var e=kf(t);return e==Gt||e==te?t.size:Mr(t).length}function ys(t,e,n){var r=pd(t)?g:ai;return n&&To(t,e,n)&&(e=rt),r(t,_o(e,3))}function bs(t,e){if("function"!=typeof e)throw new al(at);return t=_u(t),function(){if(--t<1)return e.apply(this,arguments)}}function xs(t,e,n){return e=n?rt:e,e=t&&null==e?t.length:e,oo(t,wt,rt,rt,rt,rt,e)}function ws(t,e){var n;if("function"!=typeof e)throw new al(at);return t=_u(t),function(){return--t>0&&(n=e.apply(this,arguments)),t<=1&&(e=rt),n}}function ks(t,e,n){e=n?rt:e;var r=oo(t,_t,rt,rt,rt,rt,rt,e);return r.placeholder=ks.placeholder,r}function Cs(t,e,n){e=n?rt:e;var r=oo(t,yt,rt,rt,rt,rt,rt,e);return r.placeholder=Cs.placeholder,r}function Es(t,e,n){function r(e){var n=d,r=p;return d=p=rt,_=e,v=t.apply(r,n)}function i(t){return _=t,m=Of(s,e),y?r(t):v}function o(t){var n=t-g,r=t-_,i=e-n;return b?Ul(i,h-r):i}function a(t){var n=t-g,r=t-_;return g===rt||n>=e||n<0||b&&r>=h}function s(){var t=ed();if(a(t))return u(t);m=Of(s,o(t))}function u(t){return m=rt,x&&d?r(t):(d=p=rt,v)}function c(){m!==rt&&_f(m),_=0,d=g=p=m=rt}function l(){return m===rt?v:u(ed())}function f(){var t=ed(),n=a(t);if(d=arguments,p=this,g=t,n){if(m===rt)return i(g);if(b)return m=Of(s,e),r(g)}return m===rt&&(m=Of(s,e)),v}var d,p,h,v,m,g,_=0,y=!1,b=!1,x=!0;if("function"!=typeof t)throw new al(at);return e=bu(e)||0,tu(n)&&(y=!!n.leading,b="maxWait"in n,h=b?Vl(bu(n.maxWait)||0,e):h,x="trailing"in n?!!n.trailing:x),f.cancel=c,f.flush=l,f}function Os(t){return oo(t,Ct)}function As(t,e){if("function"!=typeof t||null!=e&&"function"!=typeof e)throw new al(at);var n=function(){var r=arguments,i=e?e.apply(this,r):r[0],o=n.cache;if(o.has(i))return o.get(i);var a=t.apply(this,r);return n.cache=o.set(i,a)||o,a};return n.cache=new(As.Cache||sn),n}function $s(t){if("function"!=typeof t)throw new al(at);return function(){var e=arguments;switch(e.length){case 0:return!t.call(this);case 1:return!t.call(this,e[0]);case 2:return!t.call(this,e[0],e[1]);case 3:return!t.call(this,e[0],e[1],e[2])}return!t.apply(this,e)}}function Ss(t){return ws(2,t)}function Ns(t,e){if("function"!=typeof t)throw new al(at);return e=e===rt?e:_u(e),ti(t,e)}function js(t,e){if("function"!=typeof t)throw new al(at);return e=null==e?0:Vl(_u(e),0),ti(function(n){var r=n[e],i=wi(n,0,e);return r&&h(i,r),o(t,this,i)})}function Ts(t,e,n){var r=!0,i=!0;if("function"!=typeof t)throw new al(at);return tu(n)&&(r="leading"in n?!!n.leading:r,i="trailing"in n?!!n.trailing:i),Es(t,e,{leading:r,maxWait:e,trailing:i})}function Rs(t){return xs(t,1)}function Ds(t,e){return sd(bi(e),t)}function Ps(){if(!arguments.length)return[];var t=arguments[0];return pd(t)?t:[t]}function Ms(t){return er(t,dt)}function Is(t,e){return e="function"==typeof e?e:rt,er(t,dt,e)}function zs(t){return er(t,lt|dt)}function Fs(t,e){return e="function"==typeof e?e:rt,er(t,lt|dt,e)}function Ls(t,e){return null==e||rr(t,e,Mu(e))}function Vs(t,e){return t===e||t!==t&&e!==e}function Us(t){return null!=t&&Qs(t.length)&&!Xs(t)}function Hs(t){return eu(t)&&Us(t)}function qs(t){return!0===t||!1===t||eu(t)&&mr(t)==Ut}function Ws(t){return eu(t)&&1===t.nodeType&&!cu(t)}function Bs(t){if(null==t)return!0;if(Us(t)&&(pd(t)||"string"==typeof t||"function"==typeof t.splice||vd(t)||bd(t)||dd(t)))return!t.length;var e=kf(t);if(e==Gt||e==te)return!t.size;if(Io(t))return!Mr(t).length;for(var n in t)if(dl.call(t,n))return!1;return!0}function Ys(t,e){return Ar(t,e)}function Gs(t,e,n){n="function"==typeof n?n:rt;var r=n?n(t,e):rt;return r===rt?Ar(t,e,rt,n):!!r}function Ks(t){if(!eu(t))return!1;var e=mr(t);return e==Wt||e==qt||"string"==typeof t.message&&"string"==typeof t.name&&!cu(t)}function Zs(t){return"number"==typeof t&&zl(t)}function Xs(t){if(!tu(t))return!1;var e=mr(t);return e==Bt||e==Yt||e==Vt||e==Jt}function Js(t){return"number"==typeof t&&t==_u(t)}function Qs(t){return"number"==typeof t&&t>-1&&t%1==0&&t<=Tt}function tu(t){var e=typeof t;return null!=t&&("object"==e||"function"==e)}function eu(t){return null!=t&&"object"==typeof t}function nu(t,e){return t===e||Nr(t,e,bo(e))}function ru(t,e,n){return n="function"==typeof n?n:rt,Nr(t,e,bo(e),n)}function iu(t){return uu(t)&&t!=+t}function ou(t){if(Cf(t))throw new tl(ot);return jr(t)}function au(t){return null===t}function su(t){return null==t}function uu(t){return"number"==typeof t||eu(t)&&mr(t)==Kt}function cu(t){if(!eu(t)||mr(t)!=Xt)return!1;var e=kl(t);if(null===e)return!0;var n=dl.call(e,"constructor")&&e.constructor;return"function"==typeof n&&n instanceof n&&fl.call(n)==ml}function lu(t){return Js(t)&&t>=-Tt&&t<=Tt}function fu(t){return"string"==typeof t||!pd(t)&&eu(t)&&mr(t)==ee}function du(t){return"symbol"==typeof t||eu(t)&&mr(t)==ne}function pu(t){return t===rt}function hu(t){return eu(t)&&kf(t)==ie}function vu(t){return eu(t)&&mr(t)==oe}function mu(t){if(!t)return[];if(Us(t))return fu(t)?Q(t):Ri(t);if($l&&t[$l])return H(t[$l]());var e=kf(t);return(e==Gt?q:e==te?G:Ku)(t)}function gu(t){if(!t)return 0===t?t:0;if((t=bu(t))===jt||t===-jt){return(t<0?-1:1)*Rt}return t===t?t:0}function _u(t){var e=gu(t),n=e%1;return e===e?n?e-n:e:0}function yu(t){return t?tr(_u(t),0,Pt):0}function bu(t){if("number"==typeof t)return t;if(du(t))return Dt;if(tu(t)){var e="function"==typeof t.valueOf?t.valueOf():t;t=tu(e)?e+"":e}if("string"!=typeof t)return 0===t?t:+t;t=t.replace(Te,"");var n=He.test(t);return n||We.test(t)?$n(t.slice(2),n?2:8):Ue.test(t)?Dt:+t}function xu(t){return Di(t,Iu(t))}function wu(t){return t?tr(_u(t),-Tt,Tt):0===t?t:0}function ku(t){return null==t?"":fi(t)}function Cu(t,e){var n=lf(t);return null==e?n:Zn(n,e)}function Eu(t,e){return b(t,_o(e,3),fr)}function Ou(t,e){return b(t,_o(e,3),dr)}function Au(t,e){return null==t?t:pf(t,_o(e,3),Iu)}function $u(t,e){return null==t?t:hf(t,_o(e,3),Iu)}function Su(t,e){return t&&fr(t,_o(e,3))}function Nu(t,e){return t&&dr(t,_o(e,3))}function ju(t){return null==t?[]:pr(t,Mu(t))}function Tu(t){return null==t?[]:pr(t,Iu(t))}function Ru(t,e,n){var r=null==t?rt:hr(t,e);return r===rt?n:r}function Du(t,e){return null!=t&&Eo(t,e,_r)}function Pu(t,e){return null!=t&&Eo(t,e,yr)}function Mu(t){return Us(t)?Nn(t):Mr(t)}function Iu(t){return Us(t)?Nn(t,!0):Ir(t)}function zu(t,e){var n={};return e=_o(e,3),fr(t,function(t,r,i){Jn(n,e(t,r,i),t)}),n}function Fu(t,e){var n={};return e=_o(e,3),fr(t,function(t,r,i){Jn(n,r,e(t,r,i))}),n}function Lu(t,e){return Vu(t,$s(_o(e)))}function Vu(t,e){if(null==t)return{};var n=p(vo(t),function(t){return[t]});return e=_o(e),Yr(t,n,function(t,n){return e(t,n[0])})}function Uu(t,e,n){e=xi(e,t);var r=-1,i=e.length;for(i||(i=1,t=rt);++re){var r=t;t=e,e=r}if(n||t%1||e%1){var i=Wl();return Ul(t+i*(e-t+An("1e-"+((i+"").length-1))),e)}return Xr(t,e)}function tc(t){return Bd(ku(t).toLowerCase())}function ec(t){return(t=ku(t))&&t.replace(Ye,qn).replace(hn,"")}function nc(t,e,n){t=ku(t),e=fi(e);var r=t.length;n=n===rt?r:tr(_u(n),0,r);var i=n;return(n-=e.length)>=0&&t.slice(n,i)==e}function rc(t){return t=ku(t),t&&ke.test(t)?t.replace(xe,Wn):t}function ic(t){return t=ku(t),t&&je.test(t)?t.replace(Ne,"\\$&"):t}function oc(t,e,n){t=ku(t),e=_u(e);var r=e?J(t):0;if(!e||r>=e)return t;var i=(e-r)/2;return Ji(Pl(i),n)+t+Ji(Dl(i),n)}function ac(t,e,n){t=ku(t),e=_u(e);var r=e?J(t):0;return e&&r>>0)?(t=ku(t),t&&("string"==typeof e||null!=e&&!_d(e))&&!(e=fi(e))&&V(t)?wi(Q(t),0,n):t.split(e,n)):[]}function dc(t,e,n){return t=ku(t),n=null==n?0:tr(_u(n),0,t.length),e=fi(e),t.slice(n,n+e.length)==e}function pc(t,e,r){var i=n.templateSettings;r&&To(t,e,r)&&(e=rt),t=ku(t),e=Ed({},e,i,ao);var o,a,s=Ed({},e.imports,i.imports,ao),u=Mu(s),c=D(s,u),l=0,f=e.interpolate||Ge,d="__p += '",p=il((e.escape||Ge).source+"|"+f.source+"|"+(f===Oe?Le:Ge).source+"|"+(e.evaluate||Ge).source+"|$","g"),h="//# sourceURL="+("sourceURL"in e?e.sourceURL:"lodash.templateSources["+ ++bn+"]")+"\n";t.replace(p,function(e,n,r,i,s,u){return r||(r=i),d+=t.slice(l,u).replace(Ke,F),n&&(o=!0,d+="' +\n__e("+n+") +\n'"),s&&(a=!0,d+="';\n"+s+";\n__p += '"),r&&(d+="' +\n((__t = ("+r+")) == null ? '' : __t) +\n'"),l=u+e.length,e}),d+="';\n";var v=e.variable;v||(d="with (obj) {\n"+d+"\n}\n"),d=(a?d.replace(ge,""):d).replace(_e,"$1").replace(ye,"$1;"),d="function("+(v||"obj")+") {\n"+(v?"":"obj || (obj = {});\n")+"var __t, __p = ''"+(o?", __e = _.escape":"")+(a?", __j = Array.prototype.join;\nfunction print() { __p += __j.call(arguments, '') }\n":";\n")+d+"return __p\n}";var m=Yd(function(){return el(u,h+"return "+d).apply(rt,c)});if(m.source=d,Ks(m))throw m;return m}function hc(t){return ku(t).toLowerCase()}function vc(t){return ku(t).toUpperCase()}function mc(t,e,n){if((t=ku(t))&&(n||e===rt))return t.replace(Te,"");if(!t||!(e=fi(e)))return t;var r=Q(t),i=Q(e);return wi(r,M(r,i),I(r,i)+1).join("")}function gc(t,e,n){if((t=ku(t))&&(n||e===rt))return t.replace(De,"");if(!t||!(e=fi(e)))return t;var r=Q(t);return wi(r,0,I(r,Q(e))+1).join("")}function _c(t,e,n){if((t=ku(t))&&(n||e===rt))return t.replace(Re,"");if(!t||!(e=fi(e)))return t;var r=Q(t);return wi(r,M(r,Q(e))).join("")}function yc(t,e){var n=Et,r=Ot;if(tu(e)){var i="separator"in e?e.separator:i;n="length"in e?_u(e.length):n,r="omission"in e?fi(e.omission):r}t=ku(t);var o=t.length;if(V(t)){var a=Q(t);o=a.length}if(n>=o)return t;var s=n-J(r);if(s<1)return r;var u=a?wi(a,0,s).join(""):t.slice(0,s);if(i===rt)return u+r;if(a&&(s+=u.length-s),_d(i)){if(t.slice(s).search(i)){var c,l=u;for(i.global||(i=il(i.source,ku(Ve.exec(i))+"g")),i.lastIndex=0;c=i.exec(l);)var f=c.index;u=u.slice(0,f===rt?s:f)}}else if(t.indexOf(fi(i),s)!=s){var d=u.lastIndexOf(i);d>-1&&(u=u.slice(0,d))}return u+r}function bc(t){return t=ku(t),t&&we.test(t)?t.replace(be,Bn):t}function xc(t,e,n){return t=ku(t),e=n?rt:e,e===rt?U(t)?nt(t):y(t):t.match(e)||[]}function wc(t){var e=null==t?0:t.length,n=_o();return t=e?p(t,function(t){if("function"!=typeof t[1])throw new al(at);return[n(t[0]),t[1]]}):[],ti(function(n){for(var r=-1;++rTt)return[];var n=Pt,r=Ul(t,Pt);e=_o(e),t-=Pt;for(var i=j(r,e);++n1?t[e-1]:rt;return n="function"==typeof n?(t.pop(),n):rt,Ha(t,n)}),Bf=po(function(t){var e=t.length,n=e?t[0]:0,r=this.__wrapped__,o=function(e){return Qn(e,t)};return!(e>1||this.__actions__.length)&&r instanceof _&&jo(n)?(r=r.slice(n,+n+(e?1:0)),r.__actions__.push({func:Ga,args:[o],thisArg:rt}),new i(r,this.__chain__).thru(function(t){return e&&!t.length&&t.push(rt),t})):this.thru(o)}),Yf=Ii(function(t,e,n){dl.call(t,n)?++t[n]:Jn(t,n,1)}),Gf=Bi(sa),Kf=Bi(ua),Zf=Ii(function(t,e,n){dl.call(t,n)?t[n].push(e):Jn(t,n,[e])}),Xf=ti(function(t,e,n){var r=-1,i="function"==typeof e,a=Us(t)?Jc(t.length):[];return ff(t,function(t){a[++r]=i?o(e,t,n):kr(t,e,n)}),a}),Jf=Ii(function(t,e,n){Jn(t,n,e)}),Qf=Ii(function(t,e,n){t[n?0:1].push(e)},function(){return[[],[]]}),td=ti(function(t,e){if(null==t)return[];var n=e.length;return n>1&&To(t,e[0],e[1])?e=[]:n>2&&To(e[0],e[1],e[2])&&(e=[e[0]]),Wr(t,lr(e,1),[])}),ed=Tl||function(){return jn.Date.now()},nd=ti(function(t,e,n){var r=vt;if(n.length){var i=B(n,go(nd));r|=bt}return oo(t,r,e,n,i)}),rd=ti(function(t,e,n){var r=vt|mt;if(n.length){var i=B(n,go(rd));r|=bt}return oo(e,r,t,n,i)}),id=ti(function(t,e){return ir(t,1,e)}),od=ti(function(t,e,n){return ir(t,bu(e)||0,n)});As.Cache=sn;var ad=gf(function(t,e){e=1==e.length&&pd(e[0])?p(e[0],R(_o())):p(lr(e,1),R(_o()));var n=e.length;return ti(function(r){for(var i=-1,a=Ul(r.length,n);++i=e}),dd=Cr(function(){return arguments}())?Cr:function(t){return eu(t)&&dl.call(t,"callee")&&!El.call(t,"callee")},pd=Jc.isArray,hd=In?R(In):Er,vd=Il||Ic,md=zn?R(zn):Or,gd=Fn?R(Fn):Sr,_d=Ln?R(Ln):Tr,yd=Vn?R(Vn):Rr,bd=Un?R(Un):Dr,xd=eo(zr),wd=eo(function(t,e){return t<=e}),kd=zi(function(t,e){if(Io(e)||Us(e))return void Di(e,Mu(e),t);for(var n in e)dl.call(e,n)&&Hn(t,n,e[n])}),Cd=zi(function(t,e){Di(e,Iu(e),t)}),Ed=zi(function(t,e,n,r){Di(e,Iu(e),t,r)}),Od=zi(function(t,e,n,r){Di(e,Mu(e),t,r)}),Ad=po(Qn),$d=ti(function(t,e){t=rl(t);var n=-1,r=e.length,i=r>2?e[2]:rt;for(i&&To(e[0],e[1],i)&&(r=1);++n1),e}),Di(t,vo(t),n),r&&(n=er(n,lt|ft|dt,uo));for(var i=e.length;i--;)pi(n,e[i]);return n}),Md=po(function(t,e){return null==t?{}:Br(t,e)}),Id=io(Mu),zd=io(Iu),Fd=Hi(function(t,e,n){return e=e.toLowerCase(),t+(n?tc(e):e)}),Ld=Hi(function(t,e,n){return t+(n?"-":"")+e.toLowerCase()}),Vd=Hi(function(t,e,n){return t+(n?" ":"")+e.toLowerCase()}),Ud=Ui("toLowerCase"),Hd=Hi(function(t,e,n){return t+(n?"_":"")+e.toLowerCase()}),qd=Hi(function(t,e,n){return t+(n?" ":"")+Bd(e)}),Wd=Hi(function(t,e,n){return t+(n?" ":"")+e.toUpperCase()}),Bd=Ui("toUpperCase"),Yd=ti(function(t,e){try{return o(t,rt,e)}catch(t){return Ks(t)?t:new tl(t)}}),Gd=po(function(t,e){return s(e,function(e){e=Ko(e),Jn(t,e,nd(t[e],t))}),t}),Kd=Yi(),Zd=Yi(!0),Xd=ti(function(t,e){return function(n){return kr(n,t,e)}}),Jd=ti(function(t,e){return function(n){return kr(t,n,e)}}),Qd=Xi(p),tp=Xi(c),ep=Xi(g),np=to(),rp=to(!0),ip=Zi(function(t,e){return t+e},0),op=ro("ceil"),ap=Zi(function(t,e){return t/e},1),sp=ro("floor"),up=Zi(function(t,e){return t*e},1),cp=ro("round"),lp=Zi(function(t,e){return t-e},0);return n.after=bs,n.ary=xs,n.assign=kd,n.assignIn=Cd,n.assignInWith=Ed,n.assignWith=Od,n.at=Ad,n.before=ws,n.bind=nd,n.bindAll=Gd,n.bindKey=rd,n.castArray=Ps,n.chain=Ba,n.chunk=Qo,n.compact=ta,n.concat=ea,n.cond=wc,n.conforms=kc,n.constant=Cc,n.countBy=Yf,n.create=Cu,n.curry=ks,n.curryRight=Cs,n.debounce=Es,n.defaults=$d,n.defaultsDeep=Sd,n.defer=id,n.delay=od,n.difference=Sf,n.differenceBy=Nf,n.differenceWith=jf,n.drop=na,n.dropRight=ra,n.dropRightWhile=ia,n.dropWhile=oa,n.fill=aa,n.filter=rs,n.flatMap=is,n.flatMapDeep=os,n.flatMapDepth=as,n.flatten=ca,n.flattenDeep=la,n.flattenDepth=fa,n.flip=Os,n.flow=Kd,n.flowRight=Zd,n.fromPairs=da,n.functions=ju,n.functionsIn=Tu,n.groupBy=Zf,n.initial=va,n.intersection=Tf,n.intersectionBy=Rf,n.intersectionWith=Df,n.invert=Nd,n.invertBy=jd,n.invokeMap=Xf,n.iteratee=Ac,n.keyBy=Jf,n.keys=Mu,n.keysIn=Iu,n.map=ls,n.mapKeys=zu,n.mapValues=Fu,n.matches=$c,n.matchesProperty=Sc,n.memoize=As,n.merge=Rd,n.mergeWith=Dd,n.method=Xd,n.methodOf=Jd,n.mixin=Nc,n.negate=$s,n.nthArg=Rc,n.omit=Pd,n.omitBy=Lu,n.once=Ss,n.orderBy=fs,n.over=Qd,n.overArgs=ad,n.overEvery=tp,n.overSome=ep,n.partial=sd,n.partialRight=ud,n.partition=Qf,n.pick=Md,n.pickBy=Vu,n.property=Dc,n.propertyOf=Pc,n.pull=Pf,n.pullAll=ba,n.pullAllBy=xa,n.pullAllWith=wa,n.pullAt=Mf,n.range=np,n.rangeRight=rp,n.rearg=cd,n.reject=hs,n.remove=ka,n.rest=Ns,n.reverse=Ca,n.sampleSize=ms,n.set=Hu,n.setWith=qu,n.shuffle=gs,n.slice=Ea,n.sortBy=td,n.sortedUniq=Ta,n.sortedUniqBy=Ra,n.split=fc,n.spread=js,n.tail=Da,n.take=Pa,n.takeRight=Ma,n.takeRightWhile=Ia,n.takeWhile=za,n.tap=Ya,n.throttle=Ts,n.thru=Ga,n.toArray=mu,n.toPairs=Id,n.toPairsIn=zd,n.toPath=Uc,n.toPlainObject=xu,n.transform=Wu,n.unary=Rs,n.union=If,n.unionBy=zf,n.unionWith=Ff,n.uniq=Fa,n.uniqBy=La,n.uniqWith=Va,n.unset=Bu,n.unzip=Ua,n.unzipWith=Ha,n.update=Yu,n.updateWith=Gu,n.values=Ku,n.valuesIn=Zu,n.without=Lf,n.words=xc,n.wrap=Ds,n.xor=Vf,n.xorBy=Uf,n.xorWith=Hf,n.zip=qf,n.zipObject=qa,n.zipObjectDeep=Wa,n.zipWith=Wf,n.entries=Id,n.entriesIn=zd,n.extend=Cd,n.extendWith=Ed,Nc(n,n),n.add=ip,n.attempt=Yd,n.camelCase=Fd,n.capitalize=tc,n.ceil=op,n.clamp=Xu,n.clone=Ms,n.cloneDeep=zs,n.cloneDeepWith=Fs,n.cloneWith=Is,n.conformsTo=Ls,n.deburr=ec,n.defaultTo=Ec,n.divide=ap,n.endsWith=nc,n.eq=Vs,n.escape=rc,n.escapeRegExp=ic,n.every=ns,n.find=Gf,n.findIndex=sa,n.findKey=Eu,n.findLast=Kf,n.findLastIndex=ua,n.findLastKey=Ou,n.floor=sp,n.forEach=ss,n.forEachRight=us,n.forIn=Au,n.forInRight=$u,n.forOwn=Su,n.forOwnRight=Nu,n.get=Ru,n.gt=ld,n.gte=fd,n.has=Du,n.hasIn=Pu,n.head=pa,n.identity=Oc,n.includes=cs,n.indexOf=ha,n.inRange=Ju,n.invoke=Td,n.isArguments=dd,n.isArray=pd,n.isArrayBuffer=hd,n.isArrayLike=Us,n.isArrayLikeObject=Hs,n.isBoolean=qs,n.isBuffer=vd,n.isDate=md,n.isElement=Ws,n.isEmpty=Bs,n.isEqual=Ys,n.isEqualWith=Gs,n.isError=Ks,n.isFinite=Zs,n.isFunction=Xs,n.isInteger=Js,n.isLength=Qs,n.isMap=gd,n.isMatch=nu,n.isMatchWith=ru,n.isNaN=iu,n.isNative=ou,n.isNil=su,n.isNull=au,n.isNumber=uu,n.isObject=tu,n.isObjectLike=eu,n.isPlainObject=cu,n.isRegExp=_d,n.isSafeInteger=lu,n.isSet=yd,n.isString=fu,n.isSymbol=du,n.isTypedArray=bd,n.isUndefined=pu,n.isWeakMap=hu,n.isWeakSet=vu,n.join=ma,n.kebabCase=Ld,n.last=ga,n.lastIndexOf=_a,n.lowerCase=Vd,n.lowerFirst=Ud,n.lt=xd,n.lte=wd,n.max=qc,n.maxBy=Wc,n.mean=Bc,n.meanBy=Yc,n.min=Gc,n.minBy=Kc,n.stubArray=Mc,n.stubFalse=Ic,n.stubObject=zc,n.stubString=Fc,n.stubTrue=Lc,n.multiply=up,n.nth=ya,n.noConflict=jc,n.noop=Tc,n.now=ed,n.pad=oc,n.padEnd=ac,n.padStart=sc,n.parseInt=uc,n.random=Qu,n.reduce=ds,n.reduceRight=ps,n.repeat=cc,n.replace=lc,n.result=Uu,n.round=cp,n.runInContext=t,n.sample=vs,n.size=_s,n.snakeCase=Hd,n.some=ys,n.sortedIndex=Oa,n.sortedIndexBy=Aa,n.sortedIndexOf=$a,n.sortedLastIndex=Sa,n.sortedLastIndexBy=Na,n.sortedLastIndexOf=ja,n.startCase=qd,n.startsWith=dc,n.subtract=lp,n.sum=Zc,n.sumBy=Xc,n.template=pc,n.times=Vc,n.toFinite=gu,n.toInteger=_u,n.toLength=yu,n.toLower=hc,n.toNumber=bu,n.toSafeInteger=wu,n.toString=ku,n.toUpper=vc,n.trim=mc,n.trimEnd=gc,n.trimStart=_c,n.truncate=yc,n.unescape=bc,n.uniqueId=Hc,n.upperCase=Wd,n.upperFirst=Bd,n.each=ss,n.eachRight=us,n.first=pa,Nc(n,function(){var t={};return fr(n,function(e,r){dl.call(n.prototype,r)||(t[r]=e)}),t}(),{chain:!1}),n.VERSION="4.17.10",s(["bind","bindKey","curry","curryRight","partial","partialRight"],function(t){n[t].placeholder=n}),s(["drop","take"],function(t,e){_.prototype[t]=function(n){n=n===rt?1:Vl(_u(n),0);var r=this.__filtered__&&!e?new _(this):this.clone();return r.__filtered__?r.__takeCount__=Ul(n,r.__takeCount__):r.__views__.push({size:Ul(n,Pt),type:t+(r.__dir__<0?"Right":"")}),r},_.prototype[t+"Right"]=function(e){return this.reverse()[t](e).reverse()}}),s(["filter","map","takeWhile"],function(t,e){var n=e+1,r=n==St||3==n;_.prototype[t]=function(t){var e=this.clone();return e.__iteratees__.push({iteratee:_o(t,3),type:n}),e.__filtered__=e.__filtered__||r,e}}),s(["head","last"],function(t,e){var n="take"+(e?"Right":"");_.prototype[t]=function(){return this[n](1).value()[0]}}),s(["initial","tail"],function(t,e){var n="drop"+(e?"":"Right");_.prototype[t]=function(){return this.__filtered__?new _(this):this[n](1)}}),_.prototype.compact=function(){return this.filter(Oc)},_.prototype.find=function(t){return this.filter(t).head()},_.prototype.findLast=function(t){return this.reverse().find(t)},_.prototype.invokeMap=ti(function(t,e){return"function"==typeof t?new _(this):this.map(function(n){return kr(n,t,e)})}),_.prototype.reject=function(t){return this.filter($s(_o(t)))},_.prototype.slice=function(t,e){t=_u(t);var n=this;return n.__filtered__&&(t>0||e<0)?new _(n):(t<0?n=n.takeRight(-t):t&&(n=n.drop(t)),e!==rt&&(e=_u(e),n=e<0?n.dropRight(-e):n.take(e-t)),n)},_.prototype.takeRightWhile=function(t){return this.reverse().takeWhile(t).reverse()},_.prototype.toArray=function(){return this.take(Pt)},fr(_.prototype,function(t,e){var r=/^(?:filter|find|map|reject)|While$/.test(e),o=/^(?:head|last)$/.test(e),a=n[o?"take"+("last"==e?"Right":""):e],s=o||/^find/.test(e);a&&(n.prototype[e]=function(){var e=this.__wrapped__,u=o?[1]:arguments,c=e instanceof _,l=u[0],f=c||pd(e),d=function(t){var e=a.apply(n,h([t],u));return o&&p?e[0]:e};f&&r&&"function"==typeof l&&1!=l.length&&(c=f=!1);var p=this.__chain__,v=!!this.__actions__.length,m=s&&!p,g=c&&!v;if(!s&&f){e=g?e:new _(this);var y=t.apply(e,u);return y.__actions__.push({func:Ga,args:[d],thisArg:rt}),new i(y,p)}return m&&g?t.apply(this,u):(y=this.thru(d),m?o?y.value()[0]:y.value():y)})}),s(["pop","push","shift","sort","splice","unshift"],function(t){var e=sl[t],r=/^(?:push|sort|unshift)$/.test(t)?"tap":"thru",i=/^(?:pop|shift)$/.test(t);n.prototype[t]=function(){var t=arguments;if(i&&!this.__chain__){var n=this.value();return e.apply(pd(n)?n:[],t)}return this[r](function(n){return e.apply(pd(n)?n:[],t)})}}),fr(_.prototype,function(t,e){var r=n[e];if(r){var i=r.name+"";(tf[i]||(tf[i]=[])).push({name:e,func:r})}}),tf[Gi(rt,mt).name]=[{name:"wrapper",func:rt}],_.prototype.clone=A,_.prototype.reverse=Z,_.prototype.value=tt,n.prototype.at=Bf,n.prototype.chain=Ka,n.prototype.commit=Za,n.prototype.next=Xa,n.prototype.plant=Qa,n.prototype.reverse=ts,n.prototype.toJSON=n.prototype.valueOf=n.prototype.value=es,n.prototype.first=n.prototype.head,$l&&(n.prototype[$l]=Ja),n}();jn._=Yn,(i=function(){return Yn}.call(e,n,e,r))!==rt&&(r.exports=i)}).call(this)}).call(e,n(10),n(195)(t))},function(t,e,n){"use strict";(function(t,n,r){function i(t){return void 0===t||null===t}function o(t){return void 0!==t&&null!==t}function a(t){return!0===t}function s(t){return!1===t}function u(t){return"string"==typeof t||"number"==typeof t||"symbol"==typeof t||"boolean"==typeof t}function c(t){return null!==t&&"object"==typeof t}function l(t){return Or.call(t).slice(8,-1)}function f(t){return"[object Object]"===Or.call(t)}function d(t){return"[object RegExp]"===Or.call(t)}function p(t){var e=parseFloat(String(t));return e>=0&&Math.floor(e)===e&&isFinite(t)}function h(t){return null==t?"":"object"==typeof t?JSON.stringify(t,null,2):String(t)}function v(t){var e=parseFloat(t);return isNaN(e)?t:e}function m(t,e){for(var n=Object.create(null),r=t.split(","),i=0;i-1)return t.splice(n,1)}}function _(t,e){return Sr.call(t,e)}function y(t){var e=Object.create(null);return function(n){return e[n]||(e[n]=t(n))}}function b(t,e){function n(n){var r=arguments.length;return r?r>1?t.apply(e,arguments):t.call(e,n):t.call(e)}return n._length=t.length,n}function x(t,e){return t.bind(e)}function w(t,e){e=e||0;for(var n=t.length-e,r=new Array(n);n--;)r[n]=t[n+e];return r}function k(t,e){for(var n in e)t[n]=e[n];return t}function C(t){for(var e={},n=0;n-1)if(a&&!_(o,"default"))s=!1;else if(""===s||s===Dr(e)){var c=ct(String,o.type);(c<0||u0&&(r=Ot(r,(e||"")+"_"+n),Et(r[0])&&Et(c)&&(l[s]=P(c.text+r[0].text),r.shift()),l.push.apply(l,r)):u(r)?Et(c)?l[s]=P(c.text+r):""!==r&&l.push(P(r)):Et(r)&&Et(c)?l[s]=P(c.text+r.text):(a(t._isVList)&&o(r.tag)&&i(r.key)&&o(e)&&(r.key="__vlist"+e+"_"+n+"__"),l.push(r)));return l}function At(t,e){return(t.__esModule||ai&&"Module"===t[Symbol.toStringTag])&&(t=t.default),c(t)?e.extend(t):t}function $t(t,e,n,r,i){var o=bi();return o.asyncFactory=t,o.asyncMeta={data:e,context:n,children:r,tag:i},o}function St(e,n,r){if(a(e.error)&&o(e.errorComp))return e.errorComp;if(o(e.resolved))return e.resolved;if(a(e.loading)&&o(e.loadingComp))return e.loadingComp;if(!o(e.contexts)){var s=e.contexts=[r],u=!0,l=function(){for(var t=0,e=s.length;tJi)){si("You may have an infinite update loop "+(e.user?'in watcher with expression "'+e.expression+'"':"in a component render function."),e.vm);break}var r=to.slice(),i=Qi.slice();Bt(),Zt(r),Gt(i),oi&&Vr.devtools&&oi.emit("flush")}function Gt(t){for(var e=t.length;e--;){var n=t[e],r=n.vm;r._watcher===n&&r._isMounted&&Wt(r,"updated")}}function Kt(t){t._inactive=!1,to.push(t)}function Zt(t){for(var e=0;eoo&&Qi[n].id>t.id;)n--;Qi.splice(n+1,0,t)}else Qi.push(t);ro||(ro=!0,vt(Yt))}}function Jt(t,e,n){uo.get=function(){return this[e][n]},uo.set=function(t){this[e][n]=t},Object.defineProperty(t,n,uo)}function Qt(t){t._watchers=[];var e=t.$options;e.props&&te(t,e.props),e.methods&&ae(t,e.methods),e.data?ee(t):L(t._data={},!0),e.computed&&re(t,e.computed),e.watch&&e.watch!==Qr&&se(t,e.watch)}function te(e,n){var r=e.$options.propsData||{},i=e._props={},o=e.$options._propKeys=[];!e.$parent||I(!1);for(var a in n)!function(a){o.push(a);var s=rt(a,n,r,e);if("production"!==t.env.NODE_ENV){var u=Dr(a);($r(u)||Vr.isReservedAttr(u))&&si('"'+u+'" is a reserved attribute and cannot be used as component prop.',e),V(i,a,s,function(){e.$parent&&!Xi&&si("Avoid mutating a prop directly since the value will be overwritten whenever the parent component re-renders. Instead, use a data or computed property based on the prop's value. Prop being mutated: \""+a+'"',e)})}else V(i,a,s);a in e||Jt(e,"_props",a)}(a);I(!0)}function ee(e){var n=e.$options.data;n=e._data="function"==typeof n?ne(n,e):n||{},f(n)||(n={},"production"!==t.env.NODE_ENV&&si("data functions should return an object:\nhttps://vuejs.org/v2/guide/components.html#data-Must-Be-a-Function",e));for(var r=Object.keys(n),i=e.$options.props,o=e.$options.methods,a=r.length;a--;){var s=r[a];"production"!==t.env.NODE_ENV&&o&&_(o,s)&&si('Method "'+s+'" has already been defined as a data property.',e),i&&_(i,s)?"production"!==t.env.NODE_ENV&&si('The data property "'+s+'" is already declared as a prop. Use prop default value instead.',e):S(s)||Jt(e,"_data",s)}L(n,!0)}function ne(t,e){R();try{return t.call(e,e)}catch(t){return lt(t,e,"data()"),{}}finally{D()}}function re(e,n){var r=e._computedWatchers=Object.create(null),i=ii();for(var o in n){var a=n[o],s="function"==typeof a?a:a.get;"production"!==t.env.NODE_ENV&&null==s&&si('Getter is missing for computed property "'+o+'".',e),i||(r[o]=new so(e,s||E,E,co)),o in e?"production"!==t.env.NODE_ENV&&(o in e.$data?si('The computed property "'+o+'" is already defined in data.',e):e.$options.props&&o in e.$options.props&&si('The computed property "'+o+'" is already defined as a prop.',e)):ie(e,o,a)}}function ie(e,n,r){var i=!ii();"function"==typeof r?(uo.get=i?oe(n):r,uo.set=E):(uo.get=r.get?i&&!1!==r.cache?oe(n):r.get:E,uo.set=r.set?r.set:E),"production"!==t.env.NODE_ENV&&uo.set===E&&(uo.set=function(){si('Computed property "'+n+'" was assigned to but it has no setter.',this)}),Object.defineProperty(e,n,uo)}function oe(t){return function(){var e=this._computedWatchers&&this._computedWatchers[t];if(e)return e.dirty&&e.evaluate(),mi.target&&e.depend(),e.value}}function ae(e,n){var r=e.$options.props;for(var i in n)"production"!==t.env.NODE_ENV&&(null==n[i]&&si('Method "'+i+'" has an undefined value in the component definition. Did you reference the function correctly?',e),r&&_(r,i)&&si('Method "'+i+'" has already been defined as a prop.',e),i in e&&S(i)&&si('Method "'+i+'" conflicts with an existing Vue instance method. Avoid defining component methods that start with _ or $.')),e[i]=null==n[i]?E:Pr(n[i],e)}function se(t,e){for(var n in e){var r=e[n];if(Array.isArray(r))for(var i=0;i=0||n.indexOf(t[i])<0)&&r.push(t[i]);return r}return t}function Ve(e){"production"===t.env.NODE_ENV||this instanceof Ve||si("Vue is a constructor and should be called with the `new` keyword"),this._init(e)}function Ue(t){t.use=function(t){var e=this._installedPlugins||(this._installedPlugins=[]);if(e.indexOf(t)>-1)return this;var n=w(arguments,1);return n.unshift(this),"function"==typeof t.install?t.install.apply(t,n):"function"==typeof t&&t.apply(null,n),e.push(t),this}}function He(t){t.mixin=function(t){return this.options=et(this.options,t),this}}function qe(e){e.cid=0;var n=1;e.extend=function(e){e=e||{};var r=this,i=r.cid,o=e._Ctor||(e._Ctor={});if(o[i])return o[i];var a=e.name||r.options.name;"production"!==t.env.NODE_ENV&&a&&Z(a);var s=function(t){this._init(t)};return s.prototype=Object.create(r.prototype),s.prototype.constructor=s,s.cid=n++,s.options=et(r.options,e),s.super=r,s.options.props&&We(s),s.options.computed&&Be(s),s.extend=r.extend,s.mixin=r.mixin,s.use=r.use,Fr.forEach(function(t){s[t]=r[t]}),a&&(s.options.components[a]=s),s.superOptions=r.options,s.extendOptions=e,s.sealedOptions=k({},s.options),o[i]=s,s}}function We(t){var e=t.options.props;for(var n in e)Jt(t.prototype,"_props",n)}function Be(t){var e=t.options.computed;for(var n in e)ie(t.prototype,n,e[n])}function Ye(e){Fr.forEach(function(n){e[n]=function(e,r){return r?("production"!==t.env.NODE_ENV&&"component"===n&&Z(e),"component"===n&&f(r)&&(r.name=r.name||e,r=this.options._base.extend(r)),"directive"===n&&"function"==typeof r&&(r={bind:r,update:r}),this.options[n+"s"][e]=r,r):this.options[n+"s"][e]}})}function Ge(t){return t&&(t.Ctor.options.name||t.tag)}function Ke(t,e){return Array.isArray(t)?t.indexOf(e)>-1:"string"==typeof t?t.split(",").indexOf(e)>-1:!!d(t)&&t.test(e)}function Ze(t,e){var n=t.cache,r=t.keys,i=t._vnode;for(var o in n){var a=n[o];if(a){var s=Ge(a.componentOptions);s&&!e(s)&&Xe(n,o,r,i)}}}function Xe(t,e,n,r){var i=t[e];!i||r&&i.tag===r.tag||i.componentInstance.$destroy(),t[e]=null,g(n,e)}function Je(t){for(var e=t.data,n=t,r=t;o(r.componentInstance);)(r=r.componentInstance._vnode)&&r.data&&(e=Qe(r.data,e));for(;o(n=n.parent);)n&&n.data&&(e=Qe(e,n.data));return tn(e.staticClass,e.class)}function Qe(t,e){return{staticClass:en(t.staticClass,e.staticClass),class:o(t.class)?[t.class,e.class]:e.class}}function tn(t,e){return o(t)||o(e)?en(t,nn(e)):""}function en(t,e){return t?e?t+" "+e:t:e||""}function nn(t){return Array.isArray(t)?rn(t):c(t)?on(t):"string"==typeof t?t:""}function rn(t){for(var e,n="",r=0,i=t.length;r-1?Do[t]=e.constructor===window.HTMLUnknownElement||e.constructor===window.HTMLElement:Do[t]=/HTMLUnknownElement/.test(e.toString())}function un(e){if("string"==typeof e){var n=document.querySelector(e);return n||("production"!==t.env.NODE_ENV&&si("Cannot find element: "+e),document.createElement("div"))}return e}function cn(t,e){var n=document.createElement(t);return"select"!==t?n:(e.data&&e.data.attrs&&void 0!==e.data.attrs.multiple&&n.setAttribute("multiple","multiple"),n)}function ln(t,e){return document.createElementNS(No[t],e)}function fn(t){return document.createTextNode(t)}function dn(t){return document.createComment(t)}function pn(t,e,n){t.insertBefore(e,n)}function hn(t,e){t.removeChild(e)}function vn(t,e){t.appendChild(e)}function mn(t){return t.parentNode}function gn(t){return t.nextSibling}function _n(t){return t.tagName}function yn(t,e){t.textContent=e}function bn(t,e){t.setAttribute(e,"")}function xn(t,e){var n=t.data.ref;if(o(n)){var r=t.context,i=t.componentInstance||t.elm,a=r.$refs;e?Array.isArray(a[n])?g(a[n],i):a[n]===i&&(a[n]=void 0):t.data.refInFor?Array.isArray(a[n])?a[n].indexOf(i)<0&&a[n].push(i):a[n]=[i]:a[n]=i}}function wn(t,e){return t.key===e.key&&(t.tag===e.tag&&t.isComment===e.isComment&&o(t.data)===o(e.data)&&kn(t,e)||a(t.isAsyncPlaceholder)&&t.asyncFactory===e.asyncFactory&&i(e.asyncFactory.error))}function kn(t,e){if("input"!==t.tag)return!0;var n,r=o(n=t.data)&&o(n=n.attrs)&&n.type,i=o(n=e.data)&&o(n=n.attrs)&&n.type;return r===i||Po(r)&&Po(i)}function Cn(t,e,n){var r,i,a={};for(r=e;r<=n;++r)i=t[r].key,o(i)&&(a[i]=r);return a}function En(t,e){(t.data.directives||e.data.directives)&&On(t,e)}function On(t,e){var n,r,i,o=t===zo,a=e===zo,s=An(t.data.directives,t.context),u=An(e.data.directives,e.context),c=[],l=[];for(n in u)r=s[n],i=u[n],r?(i.oldValue=r.value,Sn(i,"update",e,t),i.def&&i.def.componentUpdated&&l.push(i)):(Sn(i,"bind",e,t),i.def&&i.def.inserted&&c.push(i));if(c.length){var f=function(){for(var n=0;n-1?Tn(t,e,n):Eo(e)?So(n)?t.removeAttribute(e):(n="allowfullscreen"===e&&"EMBED"===t.tagName?"true":e,t.setAttribute(e,n)):Co(e)?t.setAttribute(e,So(n)||"false"===n?"false":"true"):Ao(e)?So(n)?t.removeAttributeNS(Oo,$o(e)):t.setAttributeNS(Oo,e,n):Tn(t,e,n)}function Tn(t,e,n){if(So(n))t.removeAttribute(e);else{if(Gr&&!Kr&&"TEXTAREA"===t.tagName&&"placeholder"===e&&!t.__ieph){var r=function(e){e.stopImmediatePropagation(),t.removeEventListener("input",r)};t.addEventListener("input",r),t.__ieph=!0}t.setAttribute(e,n)}}function Rn(t,e){var n=e.elm,r=e.data,a=t.data;if(!(i(r.staticClass)&&i(r.class)&&(i(a)||i(a.staticClass)&&i(a.class)))){var s=Je(e),u=n._transitionClasses;o(u)&&(s=en(s,nn(u))),s!==n._prevClass&&(n.setAttribute("class",s),n._prevClass=s)}}function Dn(t){if(o(t[Wo])){var e=Gr?"change":"input";t[e]=[].concat(t[Wo],t[e]||[]),delete t[Wo]}o(t[Bo])&&(t.change=[].concat(t[Bo],t.change||[]),delete t[Bo])}function Pn(t,e,n){var r=yo;return function i(){null!==t.apply(null,arguments)&&In(e,i,n,r)}}function Mn(t,e,n,r,i){e=ht(e),n&&(e=Pn(e,t,r)),yo.addEventListener(t,e,ti?{capture:r,passive:i}:r)}function In(t,e,n,r){(r||yo).removeEventListener(t,e._withTask||e,n)}function zn(t,e){if(!i(t.data.on)||!i(e.data.on)){var n=e.data.on||{},r=t.data.on||{};yo=e.elm,Dn(n),yt(n,r,Mn,In,e.context),yo=void 0}}function Fn(t,e){if(!i(t.data.domProps)||!i(e.data.domProps)){var n,r,a=e.elm,s=t.data.domProps||{},u=e.data.domProps||{};o(u.__ob__)&&(u=e.data.domProps=k({},u));for(n in s)i(u[n])&&(a[n]="");for(n in u){if(r=u[n],"textContent"===n||"innerHTML"===n){if(e.children&&(e.children.length=0),r===s[n])continue;1===a.childNodes.length&&a.removeChild(a.childNodes[0])}if("value"===n){a._value=r;var c=i(r)?"":String(r);Ln(a,c)&&(a.value=c)}else a[n]=r}}}function Ln(t,e){return!t.composing&&("OPTION"===t.tagName||Vn(t,e)||Un(t,e))}function Vn(t,e){var n=!0;try{n=document.activeElement!==t}catch(t){}return n&&t.value!==e}function Un(t,e){var n=t.value,r=t._vModifiers;if(o(r)){if(r.lazy)return!1;if(r.number)return v(n)!==v(e);if(r.trim)return n.trim()!==e.trim()}return n!==e}function Hn(t){var e=qn(t.style);return t.staticStyle?k(t.staticStyle,e):e}function qn(t){return Array.isArray(t)?C(t):"string"==typeof t?Ko(t):t}function Wn(t,e){var n,r={};if(e)for(var i=t;i.componentInstance;)(i=i.componentInstance._vnode)&&i.data&&(n=Hn(i.data))&&k(r,n);(n=Hn(t.data))&&k(r,n);for(var o=t;o=o.parent;)o.data&&(n=Hn(o.data))&&k(r,n);return r}function Bn(t,e){var n=e.data,r=t.data;if(!(i(n.staticStyle)&&i(n.style)&&i(r.staticStyle)&&i(r.style))){var a,s,u=e.elm,c=r.staticStyle,l=r.normalizedStyle||r.style||{},f=c||l,d=qn(e.data.style)||{};e.data.normalizedStyle=o(d.__ob__)?k({},d):d;var p=Wn(e,!0);for(s in f)i(p[s])&&Jo(u,s,"");for(s in p)(a=p[s])!==f[s]&&Jo(u,s,null==a?"":a)}}function Yn(t,e){if(e&&(e=e.trim()))if(t.classList)e.indexOf(" ")>-1?e.split(/\s+/).forEach(function(e){return t.classList.add(e)}):t.classList.add(e);else{var n=" "+(t.getAttribute("class")||"")+" ";n.indexOf(" "+e+" ")<0&&t.setAttribute("class",(n+e).trim())}}function Gn(t,e){if(e&&(e=e.trim()))if(t.classList)e.indexOf(" ")>-1?e.split(/\s+/).forEach(function(e){return t.classList.remove(e)}):t.classList.remove(e),t.classList.length||t.removeAttribute("class");else{for(var n=" "+(t.getAttribute("class")||"")+" ",r=" "+e+" ";n.indexOf(r)>=0;)n=n.replace(r," ");n=n.trim(),n?t.setAttribute("class",n):t.removeAttribute("class")}}function Kn(t){if(t){if("object"==typeof t){var e={};return!1!==t.css&&k(e,na(t.name||"v")),k(e,t),e}return"string"==typeof t?na(t):void 0}}function Zn(t){la(function(){la(t)})}function Xn(t,e){var n=t._transitionClasses||(t._transitionClasses=[]);n.indexOf(e)<0&&(n.push(e),Yn(t,e))}function Jn(t,e){t._transitionClasses&&g(t._transitionClasses,e),Gn(t,e)}function Qn(t,e,n){var r=tr(t,e),i=r.type,o=r.timeout,a=r.propCount;if(!i)return n();var s=i===ia?sa:ca,u=0,c=function(){t.removeEventListener(s,l),n()},l=function(e){e.target===t&&++u>=a&&c()};setTimeout(function(){u0&&(n=ia,l=a,f=o.length):e===oa?c>0&&(n=oa,l=c,f=u.length):(l=Math.max(a,c),n=l>0?a>c?ia:oa:null,f=n?n===ia?o.length:u.length:0),{type:n,timeout:l,propCount:f,hasTransform:n===ia&&fa.test(r[aa+"Property"])}}function er(t,e){for(;t.length explicit "+e+" duration is not a valid number - got "+JSON.stringify(t)+".",n.context):isNaN(t)&&si(" explicit "+e+" duration is NaN - the duration expression might be incorrect.",n.context)}function ar(t){return"number"==typeof t&&!isNaN(t)}function sr(t){if(i(t))return!1;var e=t.fns;return o(e)?sr(Array.isArray(e)?e[0]:e):(t._length||t.length)>1}function ur(t,e){!0!==e.data.show&&rr(e)}function cr(t,e,n){lr(t,e,n),(Gr||Zr)&&setTimeout(function(){lr(t,e,n)},0)}function lr(e,n,r){var i=n.value,o=e.multiple;if(o&&!Array.isArray(i))return void("production"!==t.env.NODE_ENV&&si(' "},a.prototype.paragraph=function(t){return"

"+t+"

\n"},a.prototype.table=function(t,e){return e&&(e=""+e+""),"\n\n"+t+"\n"+e+"
\n"},a.prototype.tablerow=function(t){return"\n"+t+"\n"},a.prototype.tablecell=function(t,e){var n=e.header?"th":"td",r=e.align?"<"+n+' align="'+e.align+'">':"<"+n+">";return r+t+"\n"},a.prototype.strong=function(t){return""+t+""},a.prototype.em=function(t){return""+t+""},a.prototype.codespan=function(t){return""+t+""},a.prototype.br=function(){return this.options.xhtml?"
":"
"},a.prototype.del=function(t){return""+t+""},a.prototype.link=function(t,e,n){if(this.options.sanitize){try{var r=decodeURIComponent(l(t)).replace(/[^\w:]/g,"").toLowerCase()}catch(t){return n}if(0===r.indexOf("javascript:")||0===r.indexOf("vbscript:")||0===r.indexOf("data:"))return n}this.options.baseUrl&&!d.test(t)&&(t=p(this.options.baseUrl,t));try{t=encodeURI(t).replace(/%25/g,"%")}catch(t){return n}var i='",i},a.prototype.image=function(t,e,n){this.options.baseUrl&&!d.test(t)&&(t=p(this.options.baseUrl,t));var r=''+n+'":">",r},a.prototype.text=function(t){return t},u.prototype.strong=u.prototype.em=u.prototype.codespan=u.prototype.del=u.prototype.text=function(t){return t},u.prototype.link=u.prototype.image=function(t,e,n){return""+n},u.prototype.br=function(){return""},s.parse=function(t,e){var n=new s(e);return n.parse(t)},s.prototype.parse=function(t){this.inline=new o(t.links,this.options),this.inlineText=new o(t.links,y({},this.options,{renderer:new u})),this.tokens=t.reverse();var e="";while(this.next())e+=this.tok();return e},s.prototype.next=function(){return this.token=this.tokens.pop()},s.prototype.peek=function(){return this.tokens[this.tokens.length-1]||0},s.prototype.parseText=function(){var t=this.token.text;while("text"===this.peek().type)t+="\n"+this.next().text;return this.inline.output(t)},s.prototype.tok=function(){switch(this.token.type){case"space":return"";case"hr":return this.renderer.hr();case"heading":return this.renderer.heading(this.inline.output(this.token.text),this.token.depth,l(this.inlineText.output(this.token.text)));case"code":return this.renderer.code(this.token.text,this.token.lang,this.token.escaped);case"table":var t,e,n,r,i="",o="";for(n="",t=0;te)n.splice(e);else while(n.lengthAn error occurred:

"+c(t.message+"",!0)+"
";throw t}}v.exec=v,_.options=_.setOptions=function(t){return y(_.defaults,t),_},_.getDefaults=function(){return{baseUrl:null,breaks:!1,gfm:!0,headerIds:!0,headerPrefix:"",highlight:null,langPrefix:"language-",mangle:!0,pedantic:!1,renderer:new a,sanitize:!1,sanitizer:null,silent:!1,smartLists:!1,smartypants:!1,tables:!0,xhtml:!1}},_.defaults=_.getDefaults(),_.Parser=s,_.parser=s.parse,_.Renderer=a,_.TextRenderer=u,_.Lexer=r,_.lexer=r.lex,_.InlineLexer=o,_.inlineLexer=o.output,_.parse=_,t.exports=_})(this||"undefined"!==typeof window&&window)}).call(this,n("yLpj"))},EWmC:function(t,e,n){var r=n("LZWt");t.exports=Array.isArray||function(t){return"Array"==r(t)}},FJW5:function(t,e,n){var r=n("hswa"),i=n("y3w9"),o=n("DVgA");t.exports=n("nh4g")?Object.defineProperties:function(t,e){i(t);var n,a=o(e),u=a.length,s=0;while(u>s)r.f(t,n=a[s++],e[n]);return t}},GZEu:function(t,e,n){var r,i,o,a=n("m0Pp"),u=n("MfQN"),s=n("+rLv"),c=n("Iw71"),l=n("dyZX"),f=l.process,p=l.setImmediate,h=l.clearImmediate,d=l.MessageChannel,v=l.Dispatch,y=0,g={},_="onreadystatechange",m=function(){var t=+this;if(g.hasOwnProperty(t)){var e=g[t];delete g[t],e()}},b=function(t){m.call(t.data)};p&&h||(p=function(t){var e=[],n=1;while(arguments.length>n)e.push(arguments[n++]);return g[++y]=function(){u("function"==typeof t?t:Function(t),e)},r(y),y},h=function(t){delete g[t]},"process"==n("LZWt")(f)?r=function(t){f.nextTick(a(m,t,1))}:v&&v.now?r=function(t){v.now(a(m,t,1))}:d?(i=new d,o=i.port2,i.port1.onmessage=b,r=a(o.postMessage,o,1)):l.addEventListener&&"function"==typeof postMessage&&!l.importScripts?(r=function(t){l.postMessage(t+"","*")},l.addEventListener("message",b,!1)):r=_ in c("script")?function(t){s.appendChild(c("script"))[_]=function(){s.removeChild(this),m.call(t)}}:function(t){setTimeout(a(m,t,1),0)}),t.exports={set:p,clear:h}},H6hf:function(t,e,n){var r=n("y3w9");t.exports=function(t,e,n,i){try{return i?e(r(n)[0],n[1]):e(n)}catch(e){var o=t["return"];throw void 0!==o&&r(o.call(t)),e}}},"I8a+":function(t,e,n){var r=n("LZWt"),i=n("K0xU")("toStringTag"),o="Arguments"==r(function(){return arguments}()),a=function(t,e){try{return t[e]}catch(t){}};t.exports=function(t){var e,n,u;return void 0===t?"Undefined":null===t?"Null":"string"==typeof(n=a(e=Object(t),i))?n:o?r(e):"Object"==(u=r(e))&&"function"==typeof e.callee?"Arguments":u}},INYr:function(t,e,n){"use strict";var r=n("XKFU"),i=n("CkkT")(6),o="findIndex",a=!0;o in[]&&Array(1)[o](function(){a=!1}),r(r.P+r.F*a,"Array",{findIndex:function(t){return i(this,t,arguments.length>1?arguments[1]:void 0)}}),n("nGyu")(o)},Iw71:function(t,e,n){var r=n("0/R4"),i=n("dyZX").document,o=r(i)&&r(i.createElement);t.exports=function(t){return o?i.createElement(t):{}}},"J+6e":function(t,e,n){var r=n("I8a+"),i=n("K0xU")("iterator"),o=n("hPIQ");t.exports=n("g3g5").getIteratorMethod=function(t){if(void 0!=t)return t[i]||t["@@iterator"]||o[r(t)]}},JiEa:function(t,e){e.f=Object.getOwnPropertySymbols},K0xU:function(t,e,n){var r=n("VTer")("wks"),i=n("ylqs"),o=n("dyZX").Symbol,a="function"==typeof o,u=t.exports=function(t){return r[t]||(r[t]=a&&o[t]||(a?o:i)("Symbol."+t))};u.store=r},"KHd+":function(t,e,n){"use strict";function r(t,e,n,r,i,o,a,u){var s,c="function"===typeof t?t.options:t;if(e&&(c.render=e,c.staticRenderFns=n,c._compiled=!0),r&&(c.functional=!0),o&&(c._scopeId="data-v-"+o),a?(s=function(t){t=t||this.$vnode&&this.$vnode.ssrContext||this.parent&&this.parent.$vnode&&this.parent.$vnode.ssrContext,t||"undefined"===typeof __VUE_SSR_CONTEXT__||(t=__VUE_SSR_CONTEXT__),i&&i.call(this,t),t&&t._registeredComponents&&t._registeredComponents.add(a)},c._ssrRegister=s):i&&(s=u?function(){i.call(this,this.$root.$options.shadowRoot)}:i),s)if(c.functional){c._injectStyles=s;var l=c.render;c.render=function(t,e){return s.call(e),l(t,e)}}else{var f=c.beforeCreate;c.beforeCreate=f?[].concat(f,s):[s]}return{exports:t,options:c}}n.d(e,"a",function(){return r})},KroJ:function(t,e,n){var r=n("dyZX"),i=n("Mukb"),o=n("aagx"),a=n("ylqs")("src"),u="toString",s=Function[u],c=(""+s).split(u);n("g3g5").inspectSource=function(t){return s.call(t)},(t.exports=function(t,e,n,u){var s="function"==typeof n;s&&(o(n,"name")||i(n,"name",e)),t[e]!==n&&(s&&(o(n,a)||i(n,a,t[e]?""+t[e]:c.join(String(e)))),t===r?t[e]=n:u?t[e]?t[e]=n:i(t,e,n):(delete t[e],i(t,e,n)))})(Function.prototype,u,function(){return"function"==typeof this&&this[a]||s.call(this)})},Kuth:function(t,e,n){var r=n("y3w9"),i=n("FJW5"),o=n("4R4u"),a=n("YTvA")("IE_PROTO"),u=function(){},s="prototype",c=function(){var t,e=n("Iw71")("iframe"),r=o.length,i="<",a=">";e.style.display="none",n("+rLv").appendChild(e),e.src="javascript:",t=e.contentWindow.document,t.open(),t.write(i+"script"+a+"document.F=Object"+i+"/script"+a),t.close(),c=t.F;while(r--)delete c[s][o[r]];return c()};t.exports=Object.create||function(t,e){var n;return null!==t?(u[s]=r(t),n=new u,u[s]=null,n[a]=t):n=c(),void 0===e?n:i(n,e)}},Kw5r:function(t,e,n){"use strict";(function(t){ +/*! + * Vue.js v2.5.16 + * (c) 2014-2018 Evan You + * Released under the MIT License. + */ +var n=Object.freeze({});function r(t){return void 0===t||null===t}function i(t){return void 0!==t&&null!==t}function o(t){return!0===t}function a(t){return!1===t}function u(t){return"string"===typeof t||"number"===typeof t||"symbol"===typeof t||"boolean"===typeof t}function s(t){return null!==t&&"object"===typeof t}var c=Object.prototype.toString;function l(t){return"[object Object]"===c.call(t)}function f(t){return"[object RegExp]"===c.call(t)}function p(t){var e=parseFloat(String(t));return e>=0&&Math.floor(e)===e&&isFinite(t)}function h(t){return null==t?"":"object"===typeof t?JSON.stringify(t,null,2):String(t)}function d(t){var e=parseFloat(t);return isNaN(e)?t:e}function v(t,e){for(var n=Object.create(null),r=t.split(","),i=0;i-1)return t.splice(n,1)}}var _=Object.prototype.hasOwnProperty;function m(t,e){return _.call(t,e)}function b(t){var e=Object.create(null);return function(n){var r=e[n];return r||(e[n]=t(n))}}var w=/-(\w)/g,x=b(function(t){return t.replace(w,function(t,e){return e?e.toUpperCase():""})}),k=b(function(t){return t.charAt(0).toUpperCase()+t.slice(1)}),A=/\B([A-Z])/g,O=b(function(t){return t.replace(A,"-$1").toLowerCase()});function C(t,e){function n(n){var r=arguments.length;return r?r>1?t.apply(e,arguments):t.call(e,n):t.call(e)}return n._length=t.length,n}function E(t,e){return t.bind(e)}var j=Function.prototype.bind?E:C;function S(t,e){e=e||0;var n=t.length-e,r=new Array(n);while(n--)r[n]=t[n+e];return r}function $(t,e){for(var n in e)t[n]=e[n];return t}function T(t){for(var e={},n=0;n0,tt=J&&J.indexOf("edge/")>0,et=(J&&J.indexOf("android"),J&&/iphone|ipad|ipod|ios/.test(J)||"ios"===G),nt=(J&&/chrome\/\d+/.test(J),{}.watch),rt=!1;if(Z)try{var it={};Object.defineProperty(it,"passive",{get:function(){rt=!0}}),window.addEventListener("test-passive",null,it)}catch(t){}var ot=function(){return void 0===K&&(K=!Z&&!X&&"undefined"!==typeof t&&"server"===t["process"].env.VUE_ENV),K},at=Z&&window.__VUE_DEVTOOLS_GLOBAL_HOOK__;function ut(t){return"function"===typeof t&&/native code/.test(t.toString())}var st,ct="undefined"!==typeof Symbol&&ut(Symbol)&&"undefined"!==typeof Reflect&&ut(Reflect.ownKeys);st="undefined"!==typeof Set&&ut(Set)?Set:function(){function t(){this.set=Object.create(null)}return t.prototype.has=function(t){return!0===this.set[t]},t.prototype.add=function(t){this.set[t]=!0},t.prototype.clear=function(){this.set=Object.create(null)},t}();var lt=R,ft=0,pt=function(){this.id=ft++,this.subs=[]};pt.prototype.addSub=function(t){this.subs.push(t)},pt.prototype.removeSub=function(t){g(this.subs,t)},pt.prototype.depend=function(){pt.target&&pt.target.addDep(this)},pt.prototype.notify=function(){for(var t=this.subs.slice(),e=0,n=t.length;e-1)if(o&&!m(i,"default"))a=!1;else if(""===a||a===O(t)){var s=Gt(String,i.type);(s<0||u0&&(a=Ae(a,(e||"")+"_"+n),ke(a[0])&&ke(c)&&(l[s]=mt(c.text+a[0].text),a.shift()),l.push.apply(l,a)):u(a)?ke(c)?l[s]=mt(c.text+a):""!==a&&l.push(mt(a)):ke(a)&&ke(c)?l[s]=mt(c.text+a.text):(o(t._isVList)&&i(a.tag)&&r(a.key)&&i(e)&&(a.key="__vlist"+e+"_"+n+"__"),l.push(a)));return l}function Oe(t,e){return(t.__esModule||ct&&"Module"===t[Symbol.toStringTag])&&(t=t.default),s(t)?e.extend(t):t}function Ce(t,e,n,r,i){var o=_t();return o.asyncFactory=t,o.asyncMeta={data:e,context:n,children:r,tag:i},o}function Ee(t,e,n){if(o(t.error)&&i(t.errorComp))return t.errorComp;if(i(t.resolved))return t.resolved;if(o(t.loading)&&i(t.loadingComp))return t.loadingComp;if(!i(t.contexts)){var a=t.contexts=[n],u=!0,c=function(){for(var t=0,e=a.length;t1?S(n):n;for(var r=S(arguments,1),i=0,o=n.length;iYe&&Ve[n].id>t.id)n--;Ve.splice(n+1,0,t)}else Ve.push(t);Ge||(Ge=!0,le(tn))}}var an=0,un=function(t,e,n,r,i){this.vm=t,i&&(t._watcher=this),t._watchers.push(this),r?(this.deep=!!r.deep,this.user=!!r.user,this.lazy=!!r.lazy,this.sync=!!r.sync):this.deep=this.user=this.lazy=this.sync=!1,this.cb=n,this.id=++an,this.active=!0,this.dirty=this.lazy,this.deps=[],this.newDeps=[],this.depIds=new st,this.newDepIds=new st,this.expression="","function"===typeof e?this.getter=e:(this.getter=B(e),this.getter||(this.getter=function(){})),this.value=this.lazy?void 0:this.get()};un.prototype.get=function(){var t;dt(this);var e=this.vm;try{t=this.getter.call(e,e)}catch(t){if(!this.user)throw t;Jt(t,e,'getter for watcher "'+this.expression+'"')}finally{this.deep&&pe(t),vt(),this.cleanupDeps()}return t},un.prototype.addDep=function(t){var e=t.id;this.newDepIds.has(e)||(this.newDepIds.add(e),this.newDeps.push(t),this.depIds.has(e)||t.addSub(this))},un.prototype.cleanupDeps=function(){var t=this,e=this.deps.length;while(e--){var n=t.deps[e];t.newDepIds.has(n.id)||n.removeSub(t)}var r=this.depIds;this.depIds=this.newDepIds,this.newDepIds=r,this.newDepIds.clear(),r=this.deps,this.deps=this.newDeps,this.newDeps=r,this.newDeps.length=0},un.prototype.update=function(){this.lazy?this.dirty=!0:this.sync?this.run():on(this)},un.prototype.run=function(){if(this.active){var t=this.get();if(t!==this.value||s(t)||this.deep){var e=this.value;if(this.value=t,this.user)try{this.cb.call(this.vm,t,e)}catch(t){Jt(t,this.vm,'callback for watcher "'+this.expression+'"')}else this.cb.call(this.vm,t,e)}}},un.prototype.evaluate=function(){this.value=this.get(),this.dirty=!1},un.prototype.depend=function(){var t=this,e=this.deps.length;while(e--)t.deps[e].depend()},un.prototype.teardown=function(){var t=this;if(this.active){this.vm._isBeingDestroyed||g(this.vm._watchers,this);var e=this.deps.length;while(e--)t.deps[e].removeSub(t);this.active=!1}};var sn={enumerable:!0,configurable:!0,get:R,set:R};function cn(t,e,n){sn.get=function(){return this[e][n]},sn.set=function(t){this[e][n]=t},Object.defineProperty(t,n,sn)}function ln(t){t._watchers=[];var e=t.$options;e.props&&fn(t,e.props),e.methods&&_n(t,e.methods),e.data?pn(t):$t(t._data={},!0),e.computed&&vn(t,e.computed),e.watch&&e.watch!==nt&&mn(t,e.watch)}function fn(t,e){var n=t.$options.propsData||{},r=t._props={},i=t.$options._propKeys=[],o=!t.$parent;o||Ct(!1);var a=function(o){i.push(o);var a=Kt(o,e,n,t);Tt(r,o,a),o in t||cn(t,"_props",o)};for(var u in e)a(u);Ct(!0)}function pn(t){var e=t.$options.data;e=t._data="function"===typeof e?hn(e,t):e||{},l(e)||(e={});var n=Object.keys(e),r=t.$options.props,i=(t.$options.methods,n.length);while(i--){var o=n[i];0,r&&m(r,o)||F(o)||cn(t,"_data",o)}$t(e,!0)}function hn(t,e){dt();try{return t.call(e,e)}catch(t){return Jt(t,e,"data()"),{}}finally{vt()}}var dn={lazy:!0};function vn(t,e){var n=t._computedWatchers=Object.create(null),r=ot();for(var i in e){var o=e[i],a="function"===typeof o?o:o.get;0,r||(n[i]=new un(t,a||R,R,dn)),i in t||yn(t,i,o)}}function yn(t,e,n){var r=!ot();"function"===typeof n?(sn.get=r?gn(e):n,sn.set=R):(sn.get=n.get?r&&!1!==n.cache?gn(e):n.get:R,sn.set=n.set?n.set:R),Object.defineProperty(t,e,sn)}function gn(t){return function(){var e=this._computedWatchers&&this._computedWatchers[t];if(e)return e.dirty&&e.evaluate(),pt.target&&e.depend(),e.value}}function _n(t,e){t.$options.props;for(var n in e)t[n]=null==e[n]?R:j(e[n],t)}function mn(t,e){for(var n in e){var r=e[n];if(Array.isArray(r))for(var i=0;i=0||n.indexOf(t[i])<0)&&r.push(t[i]);return r}return t}function ur(t){this._init(t)}function sr(t){t.use=function(t){var e=this._installedPlugins||(this._installedPlugins=[]);if(e.indexOf(t)>-1)return this;var n=S(arguments,1);return n.unshift(this),"function"===typeof t.install?t.install.apply(t,n):"function"===typeof t&&t.apply(null,n),e.push(t),this}}function cr(t){t.mixin=function(t){return this.options=Wt(this.options,t),this}}function lr(t){t.cid=0;var e=1;t.extend=function(t){t=t||{};var n=this,r=n.cid,i=t._Ctor||(t._Ctor={});if(i[r])return i[r];var o=t.name||n.options.name;var a=function(t){this._init(t)};return a.prototype=Object.create(n.prototype),a.prototype.constructor=a,a.cid=e++,a.options=Wt(n.options,t),a["super"]=n,a.options.props&&fr(a),a.options.computed&&pr(a),a.extend=n.extend,a.mixin=n.mixin,a.use=n.use,z.forEach(function(t){a[t]=n[t]}),o&&(a.options.components[o]=a),a.superOptions=n.options,a.extendOptions=t,a.sealedOptions=$({},a.options),i[r]=a,a}}function fr(t){var e=t.options.props;for(var n in e)cn(t.prototype,"_props",n)}function pr(t){var e=t.options.computed;for(var n in e)yn(t.prototype,n,e[n])}function hr(t){z.forEach(function(e){t[e]=function(t,n){return n?("component"===e&&l(n)&&(n.name=n.name||t,n=this.options._base.extend(n)),"directive"===e&&"function"===typeof n&&(n={bind:n,update:n}),this.options[e+"s"][t]=n,n):this.options[e+"s"][t]}})}function dr(t){return t&&(t.Ctor.options.name||t.tag)}function vr(t,e){return Array.isArray(t)?t.indexOf(e)>-1:"string"===typeof t?t.split(",").indexOf(e)>-1:!!f(t)&&t.test(e)}function yr(t,e){var n=t.cache,r=t.keys,i=t._vnode;for(var o in n){var a=n[o];if(a){var u=dr(a.componentOptions);u&&!e(u)&&gr(n,o,r,i)}}}function gr(t,e,n,r){var i=t[e];!i||r&&i.tag===r.tag||i.componentInstance.$destroy(),t[e]=null,g(n,e)}nr(ur),wn(ur),Pe(ur),qe(ur),tr(ur);var _r=[String,RegExp,Array],mr={name:"keep-alive",abstract:!0,props:{include:_r,exclude:_r,max:[String,Number]},created:function(){this.cache=Object.create(null),this.keys=[]},destroyed:function(){var t=this;for(var e in t.cache)gr(t.cache,e,t.keys)},mounted:function(){var t=this;this.$watch("include",function(e){yr(t,function(t){return vr(e,t)})}),this.$watch("exclude",function(e){yr(t,function(t){return!vr(e,t)})})},render:function(){var t=this.$slots.default,e=Se(t),n=e&&e.componentOptions;if(n){var r=dr(n),i=this,o=i.include,a=i.exclude;if(o&&(!r||!vr(o,r))||a&&r&&vr(a,r))return e;var u=this,s=u.cache,c=u.keys,l=null==e.key?n.Ctor.cid+(n.tag?"::"+n.tag:""):e.key;s[l]?(e.componentInstance=s[l].componentInstance,g(c,l),c.push(l)):(s[l]=e,c.push(l),this.max&&c.length>parseInt(this.max)&&gr(s,c[0],c,this._vnode)),e.data.keepAlive=!0}return e||t&&t[0]}},br={KeepAlive:mr};function wr(t){var e={get:function(){return N}};Object.defineProperty(t,"config",e),t.util={warn:lt,extend:$,mergeOptions:Wt,defineReactive:Tt},t.set=Rt,t.delete=Lt,t.nextTick=le,t.options=Object.create(null),z.forEach(function(e){t.options[e+"s"]=Object.create(null)}),t.options._base=t,$(t.options.components,br),sr(t),cr(t),lr(t),hr(t)}wr(ur),Object.defineProperty(ur.prototype,"$isServer",{get:ot}),Object.defineProperty(ur.prototype,"$ssrContext",{get:function(){return this.$vnode&&this.$vnode.ssrContext}}),Object.defineProperty(ur,"FunctionalRenderContext",{value:Dn}),ur.version="2.5.16";var xr=v("style,class"),kr=v("input,textarea,option,select,progress"),Ar=function(t,e,n){return"value"===n&&kr(t)&&"button"!==e||"selected"===n&&"option"===t||"checked"===n&&"input"===t||"muted"===n&&"video"===t},Or=v("contenteditable,draggable,spellcheck"),Cr=v("allowfullscreen,async,autofocus,autoplay,checked,compact,controls,declare,default,defaultchecked,defaultmuted,defaultselected,defer,disabled,enabled,formnovalidate,hidden,indeterminate,inert,ismap,itemscope,loop,multiple,muted,nohref,noresize,noshade,novalidate,nowrap,open,pauseonexit,readonly,required,reversed,scoped,seamless,selected,sortable,translate,truespeed,typemustmatch,visible"),Er="http://www.w3.org/1999/xlink",jr=function(t){return":"===t.charAt(5)&&"xlink"===t.slice(0,5)},Sr=function(t){return jr(t)?t.slice(6,t.length):""},$r=function(t){return null==t||!1===t};function Tr(t){var e=t.data,n=t,r=t;while(i(r.componentInstance))r=r.componentInstance._vnode,r&&r.data&&(e=Rr(r.data,e));while(i(n=n.parent))n&&n.data&&(e=Rr(e,n.data));return Lr(e.staticClass,e.class)}function Rr(t,e){return{staticClass:Pr(t.staticClass,e.staticClass),class:i(t.class)?[t.class,e.class]:e.class}}function Lr(t,e){return i(t)||i(e)?Pr(t,Ir(e)):""}function Pr(t,e){return t?e?t+" "+e:t:e||""}function Ir(t){return Array.isArray(t)?Mr(t):s(t)?Dr(t):"string"===typeof t?t:""}function Mr(t){for(var e,n="",r=0,o=t.length;r-1?Hr[t]=e.constructor===window.HTMLUnknownElement||e.constructor===window.HTMLElement:Hr[t]=/HTMLUnknownElement/.test(e.toString())}var Br=v("text,number,password,search,email,tel,url");function Kr(t){if("string"===typeof t){var e=document.querySelector(t);return e||document.createElement("div")}return t}function Vr(t,e){var n=document.createElement(t);return"select"!==t?n:(e.data&&e.data.attrs&&void 0!==e.data.attrs.multiple&&n.setAttribute("multiple","multiple"),n)}function Zr(t,e){return document.createElementNS(Ur[t],e)}function Xr(t){return document.createTextNode(t)}function Gr(t){return document.createComment(t)}function Jr(t,e,n){t.insertBefore(e,n)}function Yr(t,e){t.removeChild(e)}function Qr(t,e){t.appendChild(e)}function ti(t){return t.parentNode}function ei(t){return t.nextSibling}function ni(t){return t.tagName}function ri(t,e){t.textContent=e}function ii(t,e){t.setAttribute(e,"")}var oi=Object.freeze({createElement:Vr,createElementNS:Zr,createTextNode:Xr,createComment:Gr,insertBefore:Jr,removeChild:Yr,appendChild:Qr,parentNode:ti,nextSibling:ei,tagName:ni,setTextContent:ri,setStyleScope:ii}),ai={create:function(t,e){ui(e)},update:function(t,e){t.data.ref!==e.data.ref&&(ui(t,!0),ui(e))},destroy:function(t){ui(t,!0)}};function ui(t,e){var n=t.data.ref;if(i(n)){var r=t.context,o=t.componentInstance||t.elm,a=r.$refs;e?Array.isArray(a[n])?g(a[n],o):a[n]===o&&(a[n]=void 0):t.data.refInFor?Array.isArray(a[n])?a[n].indexOf(o)<0&&a[n].push(o):a[n]=[o]:a[n]=o}}var si=new yt("",{},[]),ci=["create","activate","update","remove","destroy"];function li(t,e){return t.key===e.key&&(t.tag===e.tag&&t.isComment===e.isComment&&i(t.data)===i(e.data)&&fi(t,e)||o(t.isAsyncPlaceholder)&&t.asyncFactory===e.asyncFactory&&r(e.asyncFactory.error))}function fi(t,e){if("input"!==t.tag)return!0;var n,r=i(n=t.data)&&i(n=n.attrs)&&n.type,o=i(n=e.data)&&i(n=n.attrs)&&n.type;return r===o||Br(r)&&Br(o)}function pi(t,e,n){var r,o,a={};for(r=e;r<=n;++r)o=t[r].key,i(o)&&(a[o]=r);return a}function hi(t){var e,n,a={},s=t.modules,c=t.nodeOps;for(e=0;ev?(f=r(n[_+1])?null:n[_+1].elm,k(t,f,n,d,_,o)):d>_&&O(t,e,p,v)}function j(t,e,n,r){for(var o=n;o-1?Ai(t,e,n):Cr(e)?$r(n)?t.removeAttribute(e):(n="allowfullscreen"===e&&"EMBED"===t.tagName?"true":e,t.setAttribute(e,n)):Or(e)?t.setAttribute(e,$r(n)||"false"===n?"false":"true"):jr(e)?$r(n)?t.removeAttributeNS(Er,Sr(e)):t.setAttributeNS(Er,e,n):Ai(t,e,n)}function Ai(t,e,n){if($r(n))t.removeAttribute(e);else{if(Y&&!Q&&"TEXTAREA"===t.tagName&&"placeholder"===e&&!t.__ieph){var r=function(e){e.stopImmediatePropagation(),t.removeEventListener("input",r)};t.addEventListener("input",r),t.__ieph=!0}t.setAttribute(e,n)}}var Oi={create:xi,update:xi};function Ci(t,e){var n=e.elm,o=e.data,a=t.data;if(!(r(o.staticClass)&&r(o.class)&&(r(a)||r(a.staticClass)&&r(a.class)))){var u=Tr(e),s=n._transitionClasses;i(s)&&(u=Pr(u,Ir(s))),u!==n._prevClass&&(n.setAttribute("class",u),n._prevClass=u)}}var Ei,ji={create:Ci,update:Ci},Si="__r",$i="__c";function Ti(t){if(i(t[Si])){var e=Y?"change":"input";t[e]=[].concat(t[Si],t[e]||[]),delete t[Si]}i(t[$i])&&(t.change=[].concat(t[$i],t.change||[]),delete t[$i])}function Ri(t,e,n){var r=Ei;return function i(){var o=t.apply(null,arguments);null!==o&&Pi(e,i,n,r)}}function Li(t,e,n,r,i){e=ce(e),n&&(e=Ri(e,t,r)),Ei.addEventListener(t,e,rt?{capture:r,passive:i}:r)}function Pi(t,e,n,r){(r||Ei).removeEventListener(t,e._withTask||e,n)}function Ii(t,e){if(!r(t.data.on)||!r(e.data.on)){var n=e.data.on||{},i=t.data.on||{};Ei=e.elm,Ti(n),ge(n,i,Li,Pi,e.context),Ei=void 0}}var Mi={create:Ii,update:Ii};function Di(t,e){if(!r(t.data.domProps)||!r(e.data.domProps)){var n,o,a=e.elm,u=t.data.domProps||{},s=e.data.domProps||{};for(n in i(s.__ob__)&&(s=e.data.domProps=$({},s)),u)r(s[n])&&(a[n]="");for(n in s){if(o=s[n],"textContent"===n||"innerHTML"===n){if(e.children&&(e.children.length=0),o===u[n])continue;1===a.childNodes.length&&a.removeChild(a.childNodes[0])}if("value"===n){a._value=o;var c=r(o)?"":String(o);Ui(a,c)&&(a.value=c)}else a[n]=o}}}function Ui(t,e){return!t.composing&&("OPTION"===t.tagName||zi(t,e)||qi(t,e))}function zi(t,e){var n=!0;try{n=document.activeElement!==t}catch(t){}return n&&t.value!==e}function qi(t,e){var n=t.value,r=t._vModifiers;if(i(r)){if(r.lazy)return!1;if(r.number)return d(n)!==d(e);if(r.trim)return n.trim()!==e.trim()}return n!==e}var Ni={create:Di,update:Di},Fi=b(function(t){var e={},n=/;(?![^(]*\))/g,r=/:(.+)/;return t.split(n).forEach(function(t){if(t){var n=t.split(r);n.length>1&&(e[n[0].trim()]=n[1].trim())}}),e});function Hi(t){var e=Wi(t.style);return t.staticStyle?$(t.staticStyle,e):e}function Wi(t){return Array.isArray(t)?T(t):"string"===typeof t?Fi(t):t}function Bi(t,e){var n,r={};if(e){var i=t;while(i.componentInstance)i=i.componentInstance._vnode,i&&i.data&&(n=Hi(i.data))&&$(r,n)}(n=Hi(t.data))&&$(r,n);var o=t;while(o=o.parent)o.data&&(n=Hi(o.data))&&$(r,n);return r}var Ki,Vi=/^--/,Zi=/\s*!important$/,Xi=function(t,e,n){if(Vi.test(e))t.style.setProperty(e,n);else if(Zi.test(n))t.style.setProperty(e,n.replace(Zi,""),"important");else{var r=Ji(e);if(Array.isArray(n))for(var i=0,o=n.length;i-1?e.split(/\s+/).forEach(function(e){return t.classList.add(e)}):t.classList.add(e);else{var n=" "+(t.getAttribute("class")||"")+" ";n.indexOf(" "+e+" ")<0&&t.setAttribute("class",(n+e).trim())}}function eo(t,e){if(e&&(e=e.trim()))if(t.classList)e.indexOf(" ")>-1?e.split(/\s+/).forEach(function(e){return t.classList.remove(e)}):t.classList.remove(e),t.classList.length||t.removeAttribute("class");else{var n=" "+(t.getAttribute("class")||"")+" ",r=" "+e+" ";while(n.indexOf(r)>=0)n=n.replace(r," ");n=n.trim(),n?t.setAttribute("class",n):t.removeAttribute("class")}}function no(t){if(t){if("object"===typeof t){var e={};return!1!==t.css&&$(e,ro(t.name||"v")),$(e,t),e}return"string"===typeof t?ro(t):void 0}}var ro=b(function(t){return{enterClass:t+"-enter",enterToClass:t+"-enter-to",enterActiveClass:t+"-enter-active",leaveClass:t+"-leave",leaveToClass:t+"-leave-to",leaveActiveClass:t+"-leave-active"}}),io=Z&&!Q,oo="transition",ao="animation",uo="transition",so="transitionend",co="animation",lo="animationend";io&&(void 0===window.ontransitionend&&void 0!==window.onwebkittransitionend&&(uo="WebkitTransition",so="webkitTransitionEnd"),void 0===window.onanimationend&&void 0!==window.onwebkitanimationend&&(co="WebkitAnimation",lo="webkitAnimationEnd"));var fo=Z?window.requestAnimationFrame?window.requestAnimationFrame.bind(window):setTimeout:function(t){return t()};function po(t){fo(function(){fo(t)})}function ho(t,e){var n=t._transitionClasses||(t._transitionClasses=[]);n.indexOf(e)<0&&(n.push(e),to(t,e))}function vo(t,e){t._transitionClasses&&g(t._transitionClasses,e),eo(t,e)}function yo(t,e,n){var r=_o(t,e),i=r.type,o=r.timeout,a=r.propCount;if(!i)return n();var u=i===oo?so:lo,s=0,c=function(){t.removeEventListener(u,l),n()},l=function(e){e.target===t&&++s>=a&&c()};setTimeout(function(){s0&&(n=oo,l=a,f=o.length):e===ao?c>0&&(n=ao,l=c,f=s.length):(l=Math.max(a,c),n=l>0?a>c?oo:ao:null,f=n?n===oo?o.length:s.length:0);var p=n===oo&&go.test(r[uo+"Property"]);return{type:n,timeout:l,propCount:f,hasTransform:p}}function mo(t,e){while(t.length1}function Oo(t,e){!0!==e.data.show&&wo(e)}var Co=Z?{create:Oo,activate:Oo,remove:function(t,e){!0!==t.data.show?xo(t,e):e()}}:{},Eo=[Oi,ji,Mi,Ni,Qi,Co],jo=Eo.concat(wi),So=hi({nodeOps:oi,modules:jo});Q&&document.addEventListener("selectionchange",function(){var t=document.activeElement;t&&t.vmodel&&Do(t,"input")});var $o={inserted:function(t,e,n,r){"select"===n.tag?(r.elm&&!r.elm._vOptions?_e(n,"postpatch",function(){$o.componentUpdated(t,e,n)}):To(t,e,n.context),t._vOptions=[].map.call(t.options,Po)):("textarea"===n.tag||Br(t.type))&&(t._vModifiers=e.modifiers,e.modifiers.lazy||(t.addEventListener("compositionstart",Io),t.addEventListener("compositionend",Mo),t.addEventListener("change",Mo),Q&&(t.vmodel=!0)))},componentUpdated:function(t,e,n){if("select"===n.tag){To(t,e,n.context);var r=t._vOptions,i=t._vOptions=[].map.call(t.options,Po);if(i.some(function(t,e){return!I(t,r[e])})){var o=t.multiple?e.value.some(function(t){return Lo(t,i)}):e.value!==e.oldValue&&Lo(e.value,i);o&&Do(t,"change")}}}};function To(t,e,n){Ro(t,e,n),(Y||tt)&&setTimeout(function(){Ro(t,e,n)},0)}function Ro(t,e,n){var r=e.value,i=t.multiple;if(!i||Array.isArray(r)){for(var o,a,u=0,s=t.options.length;u-1,a.selected!==o&&(a.selected=o);else if(I(Po(a),r))return void(t.selectedIndex!==u&&(t.selectedIndex=u));i||(t.selectedIndex=-1)}}function Lo(t,e){return e.every(function(e){return!I(e,t)})}function Po(t){return"_value"in t?t._value:t.value}function Io(t){t.target.composing=!0}function Mo(t){t.target.composing&&(t.target.composing=!1,Do(t.target,"input"))}function Do(t,e){var n=document.createEvent("HTMLEvents");n.initEvent(e,!0,!0),t.dispatchEvent(n)}function Uo(t){return!t.componentInstance||t.data&&t.data.transition?t:Uo(t.componentInstance._vnode)}var zo={bind:function(t,e,n){var r=e.value;n=Uo(n);var i=n.data&&n.data.transition,o=t.__vOriginalDisplay="none"===t.style.display?"":t.style.display;r&&i?(n.data.show=!0,wo(n,function(){t.style.display=o})):t.style.display=r?o:"none"},update:function(t,e,n){var r=e.value,i=e.oldValue;if(!r!==!i){n=Uo(n);var o=n.data&&n.data.transition;o?(n.data.show=!0,r?wo(n,function(){t.style.display=t.__vOriginalDisplay}):xo(n,function(){t.style.display="none"})):t.style.display=r?t.__vOriginalDisplay:"none"}},unbind:function(t,e,n,r,i){i||(t.style.display=t.__vOriginalDisplay)}},qo={model:$o,show:zo},No={name:String,appear:Boolean,css:Boolean,mode:String,type:String,enterClass:String,leaveClass:String,enterToClass:String,leaveToClass:String,enterActiveClass:String,leaveActiveClass:String,appearClass:String,appearActiveClass:String,appearToClass:String,duration:[Number,String,Object]};function Fo(t){var e=t&&t.componentOptions;return e&&e.Ctor.options.abstract?Fo(Se(e.children)):t}function Ho(t){var e={},n=t.$options;for(var r in n.propsData)e[r]=t[r];var i=n._parentListeners;for(var o in i)e[x(o)]=i[o];return e}function Wo(t,e){if(/\d-keep-alive$/.test(e.tag))return t("keep-alive",{props:e.componentOptions.propsData})}function Bo(t){while(t=t.parent)if(t.data.transition)return!0}function Ko(t,e){return e.key===t.key&&e.tag===t.tag}var Vo={name:"transition",props:No,abstract:!0,render:function(t){var e=this,n=this.$slots.default;if(n&&(n=n.filter(function(t){return t.tag||je(t)}),n.length)){0;var r=this.mode;0;var i=n[0];if(Bo(this.$vnode))return i;var o=Fo(i);if(!o)return i;if(this._leaving)return Wo(t,i);var a="__transition-"+this._uid+"-";o.key=null==o.key?o.isComment?a+"comment":a+o.tag:u(o.key)?0===String(o.key).indexOf(a)?o.key:a+o.key:o.key;var s=(o.data||(o.data={})).transition=Ho(this),c=this._vnode,l=Fo(c);if(o.data.directives&&o.data.directives.some(function(t){return"show"===t.name})&&(o.data.show=!0),l&&l.data&&!Ko(o,l)&&!je(l)&&(!l.componentInstance||!l.componentInstance._vnode.isComment)){var f=l.data.transition=$({},s);if("out-in"===r)return this._leaving=!0,_e(f,"afterLeave",function(){e._leaving=!1,e.$forceUpdate()}),Wo(t,i);if("in-out"===r){if(je(o))return c;var p,h=function(){p()};_e(s,"afterEnter",h),_e(s,"enterCancelled",h),_e(f,"delayLeave",function(t){p=t})}}return i}}},Zo=$({tag:String,moveClass:String},No);delete Zo.mode;var Xo={props:Zo,render:function(t){for(var e=this.tag||this.$vnode.data.tag||"span",n=Object.create(null),r=this.prevChildren=this.children,i=this.$slots.default||[],o=this.children=[],a=Ho(this),u=0;u=2)t.mixin({beforeCreate:r});else{var n=t.prototype._init;t.prototype._init=function(t){void 0===t&&(t={}),t.init=t.init?[r].concat(t.init):r,n.call(this,t)}}function r(){var t=this.$options;t.store?this.$store="function"===typeof t.store?t.store():t.store:t.parent&&t.parent.$store&&(this.$store=t.parent.$store)}},i="undefined"!==typeof window&&window.__VUE_DEVTOOLS_GLOBAL_HOOK__;function o(t){i&&(t._devtoolHook=i,i.emit("vuex:init",t),i.on("vuex:travel-to-state",function(e){t.replaceState(e)}),t.subscribe(function(t,e){i.emit("vuex:mutation",t,e)}))}function a(t,e){Object.keys(t).forEach(function(n){return e(t[n],n)})}function u(t){return null!==t&&"object"===typeof t}function s(t){return t&&"function"===typeof t.then}var c=function(t,e){this.runtime=e,this._children=Object.create(null),this._rawModule=t;var n=t.state;this.state=("function"===typeof n?n():n)||{}},l={namespaced:{configurable:!0}};l.namespaced.get=function(){return!!this._rawModule.namespaced},c.prototype.addChild=function(t,e){this._children[t]=e},c.prototype.removeChild=function(t){delete this._children[t]},c.prototype.getChild=function(t){return this._children[t]},c.prototype.update=function(t){this._rawModule.namespaced=t.namespaced,t.actions&&(this._rawModule.actions=t.actions),t.mutations&&(this._rawModule.mutations=t.mutations),t.getters&&(this._rawModule.getters=t.getters)},c.prototype.forEachChild=function(t){a(this._children,t)},c.prototype.forEachGetter=function(t){this._rawModule.getters&&a(this._rawModule.getters,t)},c.prototype.forEachAction=function(t){this._rawModule.actions&&a(this._rawModule.actions,t)},c.prototype.forEachMutation=function(t){this._rawModule.mutations&&a(this._rawModule.mutations,t)},Object.defineProperties(c.prototype,l);var f=function(t){this.register([],t,!1)};function p(t,e,n){if(e.update(n),n.modules)for(var r in n.modules){if(!e.getChild(r))return void 0;p(t.concat(r),e.getChild(r),n.modules[r])}}f.prototype.get=function(t){return t.reduce(function(t,e){return t.getChild(e)},this.root)},f.prototype.getNamespace=function(t){var e=this.root;return t.reduce(function(t,n){return e=e.getChild(n),t+(e.namespaced?n+"/":"")},"")},f.prototype.update=function(t){p([],this.root,t)},f.prototype.register=function(t,e,n){var r=this;void 0===n&&(n=!0);var i=new c(e,n);if(0===t.length)this.root=i;else{var o=this.get(t.slice(0,-1));o.addChild(t[t.length-1],i)}e.modules&&a(e.modules,function(e,i){r.register(t.concat(i),e,n)})},f.prototype.unregister=function(t){var e=this.get(t.slice(0,-1)),n=t[t.length-1];e.getChild(n).runtime&&e.removeChild(n)};var h;var d=function(t){var e=this;void 0===t&&(t={}),!h&&"undefined"!==typeof window&&window.Vue&&j(window.Vue);var n=t.plugins;void 0===n&&(n=[]);var r=t.strict;void 0===r&&(r=!1);var i=t.state;void 0===i&&(i={}),"function"===typeof i&&(i=i()||{}),this._committing=!1,this._actions=Object.create(null),this._actionSubscribers=[],this._mutations=Object.create(null),this._wrappedGetters=Object.create(null),this._modules=new f(t),this._modulesNamespaceMap=Object.create(null),this._subscribers=[],this._watcherVM=new h;var a=this,u=this,s=u.dispatch,c=u.commit;this.dispatch=function(t,e){return s.call(a,t,e)},this.commit=function(t,e,n){return c.call(a,t,e,n)},this.strict=r,m(this,i,[],this._modules.root),_(this,i),n.forEach(function(t){return t(e)}),h.config.devtools&&o(this)},v={state:{configurable:!0}};function y(t,e){return e.indexOf(t)<0&&e.push(t),function(){var n=e.indexOf(t);n>-1&&e.splice(n,1)}}function g(t,e){t._actions=Object.create(null),t._mutations=Object.create(null),t._wrappedGetters=Object.create(null),t._modulesNamespaceMap=Object.create(null);var n=t.state;m(t,n,[],t._modules.root,!0),_(t,n,e)}function _(t,e,n){var r=t._vm;t.getters={};var i=t._wrappedGetters,o={};a(i,function(e,n){o[n]=function(){return e(t)},Object.defineProperty(t.getters,n,{get:function(){return t._vm[n]},enumerable:!0})});var u=h.config.silent;h.config.silent=!0,t._vm=new h({data:{$$state:e},computed:o}),h.config.silent=u,t.strict&&O(t),r&&(n&&t._withCommit(function(){r._data.$$state=null}),h.nextTick(function(){return r.$destroy()}))}function m(t,e,n,r,i){var o=!n.length,a=t._modules.getNamespace(n);if(r.namespaced&&(t._modulesNamespaceMap[a]=r),!o&&!i){var u=C(e,n.slice(0,-1)),s=n[n.length-1];t._withCommit(function(){h.set(u,s,r.state)})}var c=r.context=b(t,a,n);r.forEachMutation(function(e,n){var r=a+n;x(t,r,e,c)}),r.forEachAction(function(e,n){var r=e.root?n:a+n,i=e.handler||e;k(t,r,i,c)}),r.forEachGetter(function(e,n){var r=a+n;A(t,r,e,c)}),r.forEachChild(function(r,o){m(t,e,n.concat(o),r,i)})}function b(t,e,n){var r=""===e,i={dispatch:r?t.dispatch:function(n,r,i){var o=E(n,r,i),a=o.payload,u=o.options,s=o.type;return u&&u.root||(s=e+s),t.dispatch(s,a)},commit:r?t.commit:function(n,r,i){var o=E(n,r,i),a=o.payload,u=o.options,s=o.type;u&&u.root||(s=e+s),t.commit(s,a,u)}};return Object.defineProperties(i,{getters:{get:r?function(){return t.getters}:function(){return w(t,e)}},state:{get:function(){return C(t.state,n)}}}),i}function w(t,e){var n={},r=e.length;return Object.keys(t.getters).forEach(function(i){if(i.slice(0,r)===e){var o=i.slice(r);Object.defineProperty(n,o,{get:function(){return t.getters[i]},enumerable:!0})}}),n}function x(t,e,n,r){var i=t._mutations[e]||(t._mutations[e]=[]);i.push(function(e){n.call(t,r.state,e)})}function k(t,e,n,r){var i=t._actions[e]||(t._actions[e]=[]);i.push(function(e,i){var o=n.call(t,{dispatch:r.dispatch,commit:r.commit,getters:r.getters,state:r.state,rootGetters:t.getters,rootState:t.state},e,i);return s(o)||(o=Promise.resolve(o)),t._devtoolHook?o.catch(function(e){throw t._devtoolHook.emit("vuex:error",e),e}):o})}function A(t,e,n,r){t._wrappedGetters[e]||(t._wrappedGetters[e]=function(t){return n(r.state,r.getters,t.state,t.getters)})}function O(t){t._vm.$watch(function(){return this._data.$$state},function(){0},{deep:!0,sync:!0})}function C(t,e){return e.length?e.reduce(function(t,e){return t[e]},t):t}function E(t,e,n){return u(t)&&t.type&&(n=e,e=t,t=t.type),{type:t,payload:e,options:n}}function j(t){h&&t===h||(h=t,r(h))}v.state.get=function(){return this._vm._data.$$state},v.state.set=function(t){0},d.prototype.commit=function(t,e,n){var r=this,i=E(t,e,n),o=i.type,a=i.payload,u=(i.options,{type:o,payload:a}),s=this._mutations[o];s&&(this._withCommit(function(){s.forEach(function(t){t(a)})}),this._subscribers.forEach(function(t){return t(u,r.state)}))},d.prototype.dispatch=function(t,e){var n=this,r=E(t,e),i=r.type,o=r.payload,a={type:i,payload:o},u=this._actions[i];if(u)return this._actionSubscribers.forEach(function(t){return t(a,n.state)}),u.length>1?Promise.all(u.map(function(t){return t(o)})):u[0](o)},d.prototype.subscribe=function(t){return y(t,this._subscribers)},d.prototype.subscribeAction=function(t){return y(t,this._actionSubscribers)},d.prototype.watch=function(t,e,n){var r=this;return this._watcherVM.$watch(function(){return t(r.state,r.getters)},e,n)},d.prototype.replaceState=function(t){var e=this;this._withCommit(function(){e._vm._data.$$state=t})},d.prototype.registerModule=function(t,e,n){void 0===n&&(n={}),"string"===typeof t&&(t=[t]),this._modules.register(t,e),m(this,this.state,t,this._modules.get(t),n.preserveState),_(this,this.state)},d.prototype.unregisterModule=function(t){var e=this;"string"===typeof t&&(t=[t]),this._modules.unregister(t),this._withCommit(function(){var n=C(e.state,t.slice(0,-1));h.delete(n,t[t.length-1])}),g(this)},d.prototype.hotUpdate=function(t){this._modules.update(t),g(this,!0)},d.prototype._withCommit=function(t){var e=this._committing;this._committing=!0,t(),this._committing=e},Object.defineProperties(d.prototype,v);var S=I(function(t,e){var n={};return P(e).forEach(function(e){var r=e.key,i=e.val;n[r]=function(){var e=this.$store.state,n=this.$store.getters;if(t){var r=M(this.$store,"mapState",t);if(!r)return;e=r.context.state,n=r.context.getters}return"function"===typeof i?i.call(this,e,n):e[i]},n[r].vuex=!0}),n}),$=I(function(t,e){var n={};return P(e).forEach(function(e){var r=e.key,i=e.val;n[r]=function(){var e=[],n=arguments.length;while(n--)e[n]=arguments[n];var r=this.$store.commit;if(t){var o=M(this.$store,"mapMutations",t);if(!o)return;r=o.context.commit}return"function"===typeof i?i.apply(this,[r].concat(e)):r.apply(this.$store,[i].concat(e))}}),n}),T=I(function(t,e){var n={};return P(e).forEach(function(e){var r=e.key,i=e.val;i=t+i,n[r]=function(){if(!t||M(this.$store,"mapGetters",t))return this.$store.getters[i]},n[r].vuex=!0}),n}),R=I(function(t,e){var n={};return P(e).forEach(function(e){var r=e.key,i=e.val;n[r]=function(){var e=[],n=arguments.length;while(n--)e[n]=arguments[n];var r=this.$store.dispatch;if(t){var o=M(this.$store,"mapActions",t);if(!o)return;r=o.context.dispatch}return"function"===typeof i?i.apply(this,[r].concat(e)):r.apply(this.$store,[i].concat(e))}}),n}),L=function(t){return{mapState:S.bind(null,t),mapGetters:T.bind(null,t),mapMutations:$.bind(null,t),mapActions:R.bind(null,t)}};function P(t){return Array.isArray(t)?t.map(function(t){return{key:t,val:t}}):Object.keys(t).map(function(e){return{key:e,val:t[e]}})}function I(t){return function(e,n){return"string"!==typeof e?(n=e,e=""):"/"!==e.charAt(e.length-1)&&(e+="/"),t(e,n)}}function M(t,e,n){var r=t._modulesNamespaceMap[n];return r}var D={Store:d,install:j,version:"3.0.1",mapState:S,mapMutations:$,mapGetters:T,mapActions:R,createNamespacedHelpers:L};e["a"]=D},L9s1:function(t,e,n){"use strict";var r=n("XKFU"),i=n("0sh+"),o="includes";r(r.P+r.F*n("UUeW")(o),"String",{includes:function(t){return!!~i(this,t,o).indexOf(t,arguments.length>1?arguments[1]:void 0)}})},LQAc:function(t,e){t.exports=!1},LZWt:function(t,e){var n={}.toString;t.exports=function(t){return n.call(t).slice(8,-1)}},LvDl:function(t,e,n){(function(t,r){var i; +/** + * @license + * Lodash + * Copyright JS Foundation and other contributors + * Released under MIT license + * Based on Underscore.js 1.8.3 + * Copyright Jeremy Ashkenas, DocumentCloud and Investigative Reporters & Editors + */(function(){var o,a="4.17.10",u=200,s="Unsupported core-js use. Try https://npms.io/search?q=ponyfill.",c="Expected a function",l="__lodash_hash_undefined__",f=500,p="__lodash_placeholder__",h=1,d=2,v=4,y=1,g=2,_=1,m=2,b=4,w=8,x=16,k=32,A=64,O=128,C=256,E=512,j=30,S="...",$=800,T=16,R=1,L=2,P=3,I=1/0,M=9007199254740991,D=1.7976931348623157e308,U=NaN,z=4294967295,q=z-1,N=z>>>1,F=[["ary",O],["bind",_],["bindKey",m],["curry",w],["curryRight",x],["flip",E],["partial",k],["partialRight",A],["rearg",C]],H="[object Arguments]",W="[object Array]",B="[object AsyncFunction]",K="[object Boolean]",V="[object Date]",Z="[object DOMException]",X="[object Error]",G="[object Function]",J="[object GeneratorFunction]",Y="[object Map]",Q="[object Number]",tt="[object Null]",et="[object Object]",nt="[object Promise]",rt="[object Proxy]",it="[object RegExp]",ot="[object Set]",at="[object String]",ut="[object Symbol]",st="[object Undefined]",ct="[object WeakMap]",lt="[object WeakSet]",ft="[object ArrayBuffer]",pt="[object DataView]",ht="[object Float32Array]",dt="[object Float64Array]",vt="[object Int8Array]",yt="[object Int16Array]",gt="[object Int32Array]",_t="[object Uint8Array]",mt="[object Uint8ClampedArray]",bt="[object Uint16Array]",wt="[object Uint32Array]",xt=/\b__p \+= '';/g,kt=/\b(__p \+=) '' \+/g,At=/(__e\(.*?\)|\b__t\)) \+\n'';/g,Ot=/&(?:amp|lt|gt|quot|#39);/g,Ct=/[&<>"']/g,Et=RegExp(Ot.source),jt=RegExp(Ct.source),St=/<%-([\s\S]+?)%>/g,$t=/<%([\s\S]+?)%>/g,Tt=/<%=([\s\S]+?)%>/g,Rt=/\.|\[(?:[^[\]]*|(["'])(?:(?!\1)[^\\]|\\.)*?\1)\]/,Lt=/^\w*$/,Pt=/[^.[\]]+|\[(?:(-?\d+(?:\.\d+)?)|(["'])((?:(?!\2)[^\\]|\\.)*?)\2)\]|(?=(?:\.|\[\])(?:\.|\[\]|$))/g,It=/[\\^$.*+?()[\]{}|]/g,Mt=RegExp(It.source),Dt=/^\s+|\s+$/g,Ut=/^\s+/,zt=/\s+$/,qt=/\{(?:\n\/\* \[wrapped with .+\] \*\/)?\n?/,Nt=/\{\n\/\* \[wrapped with (.+)\] \*/,Ft=/,? & /,Ht=/[^\x00-\x2f\x3a-\x40\x5b-\x60\x7b-\x7f]+/g,Wt=/\\(\\)?/g,Bt=/\$\{([^\\}]*(?:\\.[^\\}]*)*)\}/g,Kt=/\w*$/,Vt=/^[-+]0x[0-9a-f]+$/i,Zt=/^0b[01]+$/i,Xt=/^\[object .+?Constructor\]$/,Gt=/^0o[0-7]+$/i,Jt=/^(?:0|[1-9]\d*)$/,Yt=/[\xc0-\xd6\xd8-\xf6\xf8-\xff\u0100-\u017f]/g,Qt=/($^)/,te=/['\n\r\u2028\u2029\\]/g,ee="\\ud800-\\udfff",ne="\\u0300-\\u036f",re="\\ufe20-\\ufe2f",ie="\\u20d0-\\u20ff",oe=ne+re+ie,ae="\\u2700-\\u27bf",ue="a-z\\xdf-\\xf6\\xf8-\\xff",se="\\xac\\xb1\\xd7\\xf7",ce="\\x00-\\x2f\\x3a-\\x40\\x5b-\\x60\\x7b-\\xbf",le="\\u2000-\\u206f",fe=" \\t\\x0b\\f\\xa0\\ufeff\\n\\r\\u2028\\u2029\\u1680\\u180e\\u2000\\u2001\\u2002\\u2003\\u2004\\u2005\\u2006\\u2007\\u2008\\u2009\\u200a\\u202f\\u205f\\u3000",pe="A-Z\\xc0-\\xd6\\xd8-\\xde",he="\\ufe0e\\ufe0f",de=se+ce+le+fe,ve="['’]",ye="["+ee+"]",ge="["+de+"]",_e="["+oe+"]",me="\\d+",be="["+ae+"]",we="["+ue+"]",xe="[^"+ee+de+me+ae+ue+pe+"]",ke="\\ud83c[\\udffb-\\udfff]",Ae="(?:"+_e+"|"+ke+")",Oe="[^"+ee+"]",Ce="(?:\\ud83c[\\udde6-\\uddff]){2}",Ee="[\\ud800-\\udbff][\\udc00-\\udfff]",je="["+pe+"]",Se="\\u200d",$e="(?:"+we+"|"+xe+")",Te="(?:"+je+"|"+xe+")",Re="(?:"+ve+"(?:d|ll|m|re|s|t|ve))?",Le="(?:"+ve+"(?:D|LL|M|RE|S|T|VE))?",Pe=Ae+"?",Ie="["+he+"]?",Me="(?:"+Se+"(?:"+[Oe,Ce,Ee].join("|")+")"+Ie+Pe+")*",De="\\d*(?:1st|2nd|3rd|(?![123])\\dth)(?=\\b|[A-Z_])",Ue="\\d*(?:1ST|2ND|3RD|(?![123])\\dTH)(?=\\b|[a-z_])",ze=Ie+Pe+Me,qe="(?:"+[be,Ce,Ee].join("|")+")"+ze,Ne="(?:"+[Oe+_e+"?",_e,Ce,Ee,ye].join("|")+")",Fe=RegExp(ve,"g"),He=RegExp(_e,"g"),We=RegExp(ke+"(?="+ke+")|"+Ne+ze,"g"),Be=RegExp([je+"?"+we+"+"+Re+"(?="+[ge,je,"$"].join("|")+")",Te+"+"+Le+"(?="+[ge,je+$e,"$"].join("|")+")",je+"?"+$e+"+"+Re,je+"+"+Le,Ue,De,me,qe].join("|"),"g"),Ke=RegExp("["+Se+ee+oe+he+"]"),Ve=/[a-z][A-Z]|[A-Z]{2,}[a-z]|[0-9][a-zA-Z]|[a-zA-Z][0-9]|[^a-zA-Z0-9 ]/,Ze=["Array","Buffer","DataView","Date","Error","Float32Array","Float64Array","Function","Int8Array","Int16Array","Int32Array","Map","Math","Object","Promise","RegExp","Set","String","Symbol","TypeError","Uint8Array","Uint8ClampedArray","Uint16Array","Uint32Array","WeakMap","_","clearTimeout","isFinite","parseInt","setTimeout"],Xe=-1,Ge={};Ge[ht]=Ge[dt]=Ge[vt]=Ge[yt]=Ge[gt]=Ge[_t]=Ge[mt]=Ge[bt]=Ge[wt]=!0,Ge[H]=Ge[W]=Ge[ft]=Ge[K]=Ge[pt]=Ge[V]=Ge[X]=Ge[G]=Ge[Y]=Ge[Q]=Ge[et]=Ge[it]=Ge[ot]=Ge[at]=Ge[ct]=!1;var Je={};Je[H]=Je[W]=Je[ft]=Je[pt]=Je[K]=Je[V]=Je[ht]=Je[dt]=Je[vt]=Je[yt]=Je[gt]=Je[Y]=Je[Q]=Je[et]=Je[it]=Je[ot]=Je[at]=Je[ut]=Je[_t]=Je[mt]=Je[bt]=Je[wt]=!0,Je[X]=Je[G]=Je[ct]=!1;var Ye={"À":"A","Á":"A","Â":"A","Ã":"A","Ä":"A","Å":"A","à":"a","á":"a","â":"a","ã":"a","ä":"a","å":"a","Ç":"C","ç":"c","Ð":"D","ð":"d","È":"E","É":"E","Ê":"E","Ë":"E","è":"e","é":"e","ê":"e","ë":"e","Ì":"I","Í":"I","Î":"I","Ï":"I","ì":"i","í":"i","î":"i","ï":"i","Ñ":"N","ñ":"n","Ò":"O","Ó":"O","Ô":"O","Õ":"O","Ö":"O","Ø":"O","ò":"o","ó":"o","ô":"o","õ":"o","ö":"o","ø":"o","Ù":"U","Ú":"U","Û":"U","Ü":"U","ù":"u","ú":"u","û":"u","ü":"u","Ý":"Y","ý":"y","ÿ":"y","Æ":"Ae","æ":"ae","Þ":"Th","þ":"th","ß":"ss","Ā":"A","Ă":"A","Ą":"A","ā":"a","ă":"a","ą":"a","Ć":"C","Ĉ":"C","Ċ":"C","Č":"C","ć":"c","ĉ":"c","ċ":"c","č":"c","Ď":"D","Đ":"D","ď":"d","đ":"d","Ē":"E","Ĕ":"E","Ė":"E","Ę":"E","Ě":"E","ē":"e","ĕ":"e","ė":"e","ę":"e","ě":"e","Ĝ":"G","Ğ":"G","Ġ":"G","Ģ":"G","ĝ":"g","ğ":"g","ġ":"g","ģ":"g","Ĥ":"H","Ħ":"H","ĥ":"h","ħ":"h","Ĩ":"I","Ī":"I","Ĭ":"I","Į":"I","İ":"I","ĩ":"i","ī":"i","ĭ":"i","į":"i","ı":"i","Ĵ":"J","ĵ":"j","Ķ":"K","ķ":"k","ĸ":"k","Ĺ":"L","Ļ":"L","Ľ":"L","Ŀ":"L","Ł":"L","ĺ":"l","ļ":"l","ľ":"l","ŀ":"l","ł":"l","Ń":"N","Ņ":"N","Ň":"N","Ŋ":"N","ń":"n","ņ":"n","ň":"n","ŋ":"n","Ō":"O","Ŏ":"O","Ő":"O","ō":"o","ŏ":"o","ő":"o","Ŕ":"R","Ŗ":"R","Ř":"R","ŕ":"r","ŗ":"r","ř":"r","Ś":"S","Ŝ":"S","Ş":"S","Š":"S","ś":"s","ŝ":"s","ş":"s","š":"s","Ţ":"T","Ť":"T","Ŧ":"T","ţ":"t","ť":"t","ŧ":"t","Ũ":"U","Ū":"U","Ŭ":"U","Ů":"U","Ű":"U","Ų":"U","ũ":"u","ū":"u","ŭ":"u","ů":"u","ű":"u","ų":"u","Ŵ":"W","ŵ":"w","Ŷ":"Y","ŷ":"y","Ÿ":"Y","Ź":"Z","Ż":"Z","Ž":"Z","ź":"z","ż":"z","ž":"z","IJ":"IJ","ij":"ij","Œ":"Oe","œ":"oe","ʼn":"'n","ſ":"s"},Qe={"&":"&","<":"<",">":">",'"':""","'":"'"},tn={"&":"&","<":"<",">":">",""":'"',"'":"'"},en={"\\":"\\","'":"'","\n":"n","\r":"r","\u2028":"u2028","\u2029":"u2029"},nn=parseFloat,rn=parseInt,on="object"==typeof t&&t&&t.Object===Object&&t,an="object"==typeof self&&self&&self.Object===Object&&self,un=on||an||Function("return this")(),sn="object"==typeof e&&e&&!e.nodeType&&e,cn=sn&&"object"==typeof r&&r&&!r.nodeType&&r,ln=cn&&cn.exports===sn,fn=ln&&on.process,pn=function(){try{var t=cn&&cn.require&&cn.require("util").types;return t||fn&&fn.binding&&fn.binding("util")}catch(t){}}(),hn=pn&&pn.isArrayBuffer,dn=pn&&pn.isDate,vn=pn&&pn.isMap,yn=pn&&pn.isRegExp,gn=pn&&pn.isSet,_n=pn&&pn.isTypedArray;function mn(t,e,n){switch(n.length){case 0:return t.call(e);case 1:return t.call(e,n[0]);case 2:return t.call(e,n[0],n[1]);case 3:return t.call(e,n[0],n[1],n[2])}return t.apply(e,n)}function bn(t,e,n,r){var i=-1,o=null==t?0:t.length;while(++i-1}function Cn(t,e,n){var r=-1,i=null==t?0:t.length;while(++r-1);return n}function Yn(t,e){var n=t.length;while(n--&&Dn(e,t[n],0)>-1);return n}function Qn(t,e){var n=t.length,r=0;while(n--)t[n]===e&&++r;return r}var tr=Fn(Ye),er=Fn(Qe);function nr(t){return"\\"+en[t]}function rr(t,e){return null==t?o:t[e]}function ir(t){return Ke.test(t)}function or(t){return Ve.test(t)}function ar(t){var e,n=[];while(!(e=t.next()).done)n.push(e.value);return n}function ur(t){var e=-1,n=Array(t.size);return t.forEach(function(t,r){n[++e]=[r,t]}),n}function sr(t,e){return function(n){return t(e(n))}}function cr(t,e){var n=-1,r=t.length,i=0,o=[];while(++n-1}function Nr(t,e){var n=this.__data__,r=ci(n,t);return r<0?(++this.size,n.push([t,e])):n[r][1]=e,this}function Fr(t){var e=-1,n=null==t?0:t.length;this.clear();while(++e=e?t:e)),t}function yi(t,e,n,r,i,a){var u,s=e&h,c=e&d,l=e&v;if(n&&(u=i?n(t,r,i,a):n(t)),u!==o)return u;if(!xl(t))return t;var f=al(t);if(f){if(u=tu(t),!s)return ra(t,u)}else{var p=Ga(t),y=p==G||p==J;if(fl(t))return Vo(t,s);if(p==et||p==H||y&&!i){if(u=c||y?{}:eu(t),!s)return c?aa(t,pi(u,t)):oa(t,fi(u,t))}else{if(!Je[p])return i?t:{};u=nu(t,p,s)}}a||(a=new Jr);var g=a.get(t);if(g)return g;if(a.set(t,u),Il(t))return t.forEach(function(r){u.add(yi(r,e,n,r,t,a))}),u;if(Al(t))return t.forEach(function(r,i){u.set(i,yi(r,e,n,i,t,a))}),u;var _=l?c?za:Ua:c?xf:wf,m=f?o:_(t);return wn(m||t,function(r,i){m&&(i=r,r=t[i]),si(u,i,yi(r,e,n,i,t,a))}),u}function gi(t){var e=wf(t);return function(n){return _i(n,t,e)}}function _i(t,e,n){var r=n.length;if(null==t)return!r;t=ne(t);while(r--){var i=n[r],a=e[i],u=t[i];if(u===o&&!(i in t)||!a(u))return!1}return!0}function mi(t,e,n){if("function"!=typeof t)throw new oe(c);return ku(function(){t.apply(o,n)},e)}function bi(t,e,n,r){var i=-1,o=On,a=!0,s=t.length,c=[],l=e.length;if(!s)return c;n&&(e=En(e,Zn(n))),r?(o=Cn,a=!1):e.length>=u&&(o=Gn,a=!1,e=new Zr(e));t:while(++ii?0:i+n),r=r===o||r>i?i:Kl(r),r<0&&(r+=i),r=n>r?0:Vl(r);while(n0&&n(u)?e>1?Ei(u,e-1,n,r,i):jn(i,u):r||(i[i.length]=u)}return i}var ji=la(),Si=la(!0);function $i(t,e){return t&&ji(t,e,wf)}function Ti(t,e){return t&&Si(t,e,wf)}function Ri(t,e){return An(e,function(e){return ml(t[e])})}function Li(t,e){e=Ho(e,t);var n=0,r=e.length;while(null!=t&&ne}function Di(t,e){return null!=t&&fe.call(t,e)}function Ui(t,e){return null!=t&&e in ne(t)}function zi(t,e,n){return t>=Ne(e,n)&&t=120&&p.length>=120)?new Zr(s&&p):o}p=t[0];var h=-1,d=c[0];t:while(++h-1)u!==t&&Oe.call(u,s,1),Oe.call(t,s,1)}return t}function yo(t,e){var n=t?e.length:0,r=n-1;while(n--){var i=e[n];if(n==r||i!==o){var o=i;ou(i)?Oe.call(t,i,1):Io(t,i)}}return t}function go(t,e){return t+Pe(Ke()*(e-t+1))}function _o(t,e,r,i){var o=-1,a=qe(Le((e-t)/(r||1)),0),u=n(a);while(a--)u[i?a:++o]=t,t+=r;return u}function mo(t,e){var n="";if(!t||e<1||e>M)return n;do{e%2&&(n+=t),e=Pe(e/2),e&&(t+=t)}while(e);return n}function bo(t,e){return Au(mu(t,e,Sp),t+"")}function wo(t){return ii(qf(t))}function xo(t,e){var n=qf(t);return Eu(n,vi(e,0,n.length))}function ko(t,e,n,r){if(!xl(t))return t;e=Ho(e,t);var i=-1,a=e.length,u=a-1,s=t;while(null!=s&&++io?0:o+e),r=r>o?o:r,r<0&&(r+=o),o=e>r?0:r-e>>>0,e>>>=0;var a=n(o);while(++i>>1,a=t[o];null!==a&&!Dl(a)&&(n?a<=e:a=u){var l=e?null:ja(t);if(l)return fr(l);a=!1,i=Gn,c=new Zr}else c=e?[]:s;t:while(++r=r?t:Eo(t,e,n)}var Ko=$e||function(t){return un.clearTimeout(t)};function Vo(t,e){if(e)return t.slice();var n=t.length,r=we?we(n):new t.constructor(n);return t.copy(r),r}function Zo(t){var e=new t.constructor(t.byteLength);return new be(e).set(new be(t)),e}function Xo(t,e){var n=e?Zo(t.buffer):t.buffer;return new t.constructor(n,t.byteOffset,t.byteLength)}function Go(t){var e=new t.constructor(t.source,Kt.exec(t));return e.lastIndex=t.lastIndex,e}function Jo(t){return _r?ne(_r.call(t)):{}}function Yo(t,e){var n=e?Zo(t.buffer):t.buffer;return new t.constructor(n,t.byteOffset,t.length)}function Qo(t,e){if(t!==e){var n=t!==o,r=null===t,i=t===t,a=Dl(t),u=e!==o,s=null===e,c=e===e,l=Dl(e);if(!s&&!l&&!a&&t>e||a&&u&&c&&!s&&!l||r&&u&&c||!n&&c||!i)return 1;if(!r&&!a&&!l&&t=u)return s;var c=n[r];return s*("desc"==c?-1:1)}}return t.index-e.index}function ea(t,e,r,i){var o=-1,a=t.length,u=r.length,s=-1,c=e.length,l=qe(a-u,0),f=n(c+l),p=!i;while(++s1?n[i-1]:o,u=i>2?n[2]:o;a=t.length>3&&"function"==typeof a?(i--,a):o,u&&au(n[0],n[1],u)&&(a=i<3?o:a,i=1),e=ne(e);while(++r-1?i[a?e[u]:u]:o}}function ga(t){return Da(function(e){var n=e.length,r=n,i=Or.prototype.thru;t&&e.reverse();while(r--){var a=e[r];if("function"!=typeof a)throw new oe(c);if(i&&!u&&"wrapper"==Na(a))var u=new Or([],!0)}r=u?r:n;while(++r1&&_.reverse(),p&&ls))return!1;var l=a.get(t);if(l&&a.get(e))return l==e;var f=-1,p=!0,h=n&g?new Zr:o;a.set(t,e),a.set(e,t);while(++f1?"& ":"")+e[r],e=e.join(n>2?", ":" "),t.replace(qt,"{\n/* [wrapped with "+e+"] */\n")}function iu(t){return al(t)||ol(t)||!!(Ce&&t&&t[Ce])}function ou(t,e){var n=typeof t;return e=null==e?M:e,!!e&&("number"==n||"symbol"!=n&&Jt.test(t))&&t>-1&&t%1==0&&t0){if(++e>=$)return arguments[0]}else e=0;return t.apply(o,arguments)}}function Eu(t,e){var n=-1,r=t.length,i=r-1;e=e===o?r:e;while(++n1?t[e-1]:o;return n="function"==typeof n?(t.pop(),n):o,Ps(t,n)});function Hs(t){var e=wr(t);return e.__chain__=!0,e}function Ws(t,e){return e(t),t}function Bs(t,e){return e(t)}var Ks=Da(function(t){var e=t.length,n=e?t[0]:0,r=this.__wrapped__,i=function(e){return di(e,t)};return!(e>1||this.__actions__.length)&&r instanceof Cr&&ou(n)?(r=r.slice(n,+n+(e?1:0)),r.__actions__.push({func:Bs,args:[i],thisArg:o}),new Or(r,this.__chain__).thru(function(t){return e&&!t.length&&t.push(o),t})):this.thru(i)});function Vs(){return Hs(this)}function Zs(){return new Or(this.value(),this.__chain__)}function Xs(){this.__values__===o&&(this.__values__=Wl(this.value()));var t=this.__index__>=this.__values__.length,e=t?o:this.__values__[this.__index__++];return{done:t,value:e}}function Gs(){return this}function Js(t){var e,n=this;while(n instanceof Ar){var r=Ru(n);r.__index__=0,r.__values__=o,e?i.__wrapped__=r:e=r;var i=r;n=n.__wrapped__}return i.__wrapped__=t,e}function Ys(){var t=this.__wrapped__;if(t instanceof Cr){var e=t;return this.__actions__.length&&(e=new Cr(this)),e=e.reverse(),e.__actions__.push({func:Bs,args:[ps],thisArg:o}),new Or(e,this.__chain__)}return this.thru(ps)}function Qs(){return Uo(this.__wrapped__,this.__actions__)}var tc=ua(function(t,e,n){fe.call(t,n)?++t[n]:hi(t,n,1)});function ec(t,e,n){var r=al(t)?kn:ki;return n&&au(t,e,n)&&(e=o),r(t,Ha(e,3))}function nc(t,e){var n=al(t)?An:Ci;return n(t,Ha(e,3))}var rc=ya(Wu),ic=ya(Bu);function oc(t,e){return Ei(dc(t,e),1)}function ac(t,e){return Ei(dc(t,e),I)}function uc(t,e,n){return n=n===o?1:Kl(n),Ei(dc(t,e),n)}function sc(t,e){var n=al(t)?wn:wi;return n(t,Ha(e,3))}function cc(t,e){var n=al(t)?xn:xi;return n(t,Ha(e,3))}var lc=ua(function(t,e,n){fe.call(t,n)?t[n].push(e):hi(t,n,[e])});function fc(t,e,n,r){t=sl(t)?t:qf(t),n=n&&!r?Kl(n):0;var i=t.length;return n<0&&(n=qe(i+n,0)),Ml(t)?n<=i&&t.indexOf(e,n)>-1:!!i&&Dn(t,e,n)>-1}var pc=bo(function(t,e,r){var i=-1,o="function"==typeof e,a=sl(t)?n(t.length):[];return wi(t,function(t){a[++i]=o?mn(e,t,r):Fi(t,e,r)}),a}),hc=ua(function(t,e,n){hi(t,n,e)});function dc(t,e){var n=al(t)?En:io;return n(t,Ha(e,3))}function vc(t,e,n,r){return null==t?[]:(al(e)||(e=null==e?[]:[e]),n=r?o:n,al(n)||(n=null==n?[]:[n]),lo(t,e,n))}var yc=ua(function(t,e,n){t[n?0:1].push(e)},function(){return[[],[]]});function gc(t,e,n){var r=al(t)?Sn:Hn,i=arguments.length<3;return r(t,Ha(e,4),n,i,wi)}function _c(t,e,n){var r=al(t)?$n:Hn,i=arguments.length<3;return r(t,Ha(e,4),n,i,xi)}function mc(t,e){var n=al(t)?An:Ci;return n(t,zc(Ha(e,3)))}function bc(t){var e=al(t)?ii:wo;return e(t)}function wc(t,e,n){e=(n?au(t,e,n):e===o)?1:Kl(e);var r=al(t)?oi:xo;return r(t,e)}function xc(t){var e=al(t)?ai:Co;return e(t)}function kc(t){if(null==t)return 0;if(sl(t))return Ml(t)?vr(t):t.length;var e=Ga(t);return e==Y||e==ot?t.size:eo(t).length}function Ac(t,e,n){var r=al(t)?Tn:jo;return n&&au(t,e,n)&&(e=o),r(t,Ha(e,3))}var Oc=bo(function(t,e){if(null==t)return[];var n=e.length;return n>1&&au(t,e[0],e[1])?e=[]:n>2&&au(e[0],e[1],e[2])&&(e=[e[0]]),lo(t,Ei(e,1),[])}),Cc=Te||function(){return un.Date.now()};function Ec(t,e){if("function"!=typeof e)throw new oe(c);return t=Kl(t),function(){if(--t<1)return e.apply(this,arguments)}}function jc(t,e,n){return e=n?o:e,e=t&&null==e?t.length:e,$a(t,O,o,o,o,o,e)}function Sc(t,e){var n;if("function"!=typeof e)throw new oe(c);return t=Kl(t),function(){return--t>0&&(n=e.apply(this,arguments)),t<=1&&(e=o),n}}var $c=bo(function(t,e,n){var r=_;if(n.length){var i=cr(n,Fa($c));r|=k}return $a(t,r,e,n,i)}),Tc=bo(function(t,e,n){var r=_|m;if(n.length){var i=cr(n,Fa(Tc));r|=k}return $a(e,r,t,n,i)});function Rc(t,e,n){e=n?o:e;var r=$a(t,w,o,o,o,o,o,e);return r.placeholder=Rc.placeholder,r}function Lc(t,e,n){e=n?o:e;var r=$a(t,x,o,o,o,o,o,e);return r.placeholder=Lc.placeholder,r}function Pc(t,e,n){var r,i,a,u,s,l,f=0,p=!1,h=!1,d=!0;if("function"!=typeof t)throw new oe(c);function v(e){var n=r,a=i;return r=i=o,f=e,u=t.apply(a,n),u}function y(t){return f=t,s=ku(m,e),p?v(t):u}function g(t){var n=t-l,r=t-f,i=e-n;return h?Ne(i,a-r):i}function _(t){var n=t-l,r=t-f;return l===o||n>=e||n<0||h&&r>=a}function m(){var t=Cc();if(_(t))return b(t);s=ku(m,g(t))}function b(t){return s=o,d&&r?v(t):(r=i=o,u)}function w(){s!==o&&Ko(s),f=0,r=l=i=s=o}function x(){return s===o?u:b(Cc())}function k(){var t=Cc(),n=_(t);if(r=arguments,i=this,l=t,n){if(s===o)return y(l);if(h)return s=ku(m,e),v(l)}return s===o&&(s=ku(m,e)),u}return e=Zl(e)||0,xl(n)&&(p=!!n.leading,h="maxWait"in n,a=h?qe(Zl(n.maxWait)||0,e):a,d="trailing"in n?!!n.trailing:d),k.cancel=w,k.flush=x,k}var Ic=bo(function(t,e){return mi(t,1,e)}),Mc=bo(function(t,e,n){return mi(t,Zl(e)||0,n)});function Dc(t){return $a(t,E)}function Uc(t,e){if("function"!=typeof t||null!=e&&"function"!=typeof e)throw new oe(c);var n=function(){var r=arguments,i=e?e.apply(this,r):r[0],o=n.cache;if(o.has(i))return o.get(i);var a=t.apply(this,r);return n.cache=o.set(i,a)||o,a};return n.cache=new(Uc.Cache||Fr),n}function zc(t){if("function"!=typeof t)throw new oe(c);return function(){var e=arguments;switch(e.length){case 0:return!t.call(this);case 1:return!t.call(this,e[0]);case 2:return!t.call(this,e[0],e[1]);case 3:return!t.call(this,e[0],e[1],e[2])}return!t.apply(this,e)}}function qc(t){return Sc(2,t)}Uc.Cache=Fr;var Nc=Wo(function(t,e){e=1==e.length&&al(e[0])?En(e[0],Zn(Ha())):En(Ei(e,1),Zn(Ha()));var n=e.length;return bo(function(r){var i=-1,o=Ne(r.length,n);while(++i=e}),ol=Hi(function(){return arguments}())?Hi:function(t){return kl(t)&&fe.call(t,"callee")&&!Ae.call(t,"callee")},al=n.isArray,ul=hn?Zn(hn):Wi;function sl(t){return null!=t&&wl(t.length)&&!ml(t)}function cl(t){return kl(t)&&sl(t)}function ll(t){return!0===t||!1===t||kl(t)&&Ii(t)==K}var fl=Me||Vp,pl=dn?Zn(dn):Bi;function hl(t){return kl(t)&&1===t.nodeType&&!Rl(t)}function dl(t){if(null==t)return!0;if(sl(t)&&(al(t)||"string"==typeof t||"function"==typeof t.splice||fl(t)||Ul(t)||ol(t)))return!t.length;var e=Ga(t);if(e==Y||e==ot)return!t.size;if(pu(t))return!eo(t).length;for(var n in t)if(fe.call(t,n))return!1;return!0}function vl(t,e){return Ki(t,e)}function yl(t,e,n){n="function"==typeof n?n:o;var r=n?n(t,e):o;return r===o?Ki(t,e,o,n):!!r}function gl(t){if(!kl(t))return!1;var e=Ii(t);return e==X||e==Z||"string"==typeof t.message&&"string"==typeof t.name&&!Rl(t)}function _l(t){return"number"==typeof t&&De(t)}function ml(t){if(!xl(t))return!1;var e=Ii(t);return e==G||e==J||e==B||e==rt}function bl(t){return"number"==typeof t&&t==Kl(t)}function wl(t){return"number"==typeof t&&t>-1&&t%1==0&&t<=M}function xl(t){var e=typeof t;return null!=t&&("object"==e||"function"==e)}function kl(t){return null!=t&&"object"==typeof t}var Al=vn?Zn(vn):Zi;function Ol(t,e){return t===e||Xi(t,e,Ba(e))}function Cl(t,e,n){return n="function"==typeof n?n:o,Xi(t,e,Ba(e),n)}function El(t){return Tl(t)&&t!=+t}function jl(t){if(fu(t))throw new i(s);return Gi(t)}function Sl(t){return null===t}function $l(t){return null==t}function Tl(t){return"number"==typeof t||kl(t)&&Ii(t)==Q}function Rl(t){if(!kl(t)||Ii(t)!=et)return!1;var e=xe(t);if(null===e)return!0;var n=fe.call(e,"constructor")&&e.constructor;return"function"==typeof n&&n instanceof n&&le.call(n)==ve}var Ll=yn?Zn(yn):Ji;function Pl(t){return bl(t)&&t>=-M&&t<=M}var Il=gn?Zn(gn):Yi;function Ml(t){return"string"==typeof t||!al(t)&&kl(t)&&Ii(t)==at}function Dl(t){return"symbol"==typeof t||kl(t)&&Ii(t)==ut}var Ul=_n?Zn(_n):Qi;function zl(t){return t===o}function ql(t){return kl(t)&&Ga(t)==ct}function Nl(t){return kl(t)&&Ii(t)==lt}var Fl=Oa(ro),Hl=Oa(function(t,e){return t<=e});function Wl(t){if(!t)return[];if(sl(t))return Ml(t)?yr(t):ra(t);if(Ee&&t[Ee])return ar(t[Ee]());var e=Ga(t),n=e==Y?ur:e==ot?fr:qf;return n(t)}function Bl(t){if(!t)return 0===t?t:0;if(t=Zl(t),t===I||t===-I){var e=t<0?-1:1;return e*D}return t===t?t:0}function Kl(t){var e=Bl(t),n=e%1;return e===e?n?e-n:e:0}function Vl(t){return t?vi(Kl(t),0,z):0}function Zl(t){if("number"==typeof t)return t;if(Dl(t))return U;if(xl(t)){var e="function"==typeof t.valueOf?t.valueOf():t;t=xl(e)?e+"":e}if("string"!=typeof t)return 0===t?t:+t;t=t.replace(Dt,"");var n=Zt.test(t);return n||Gt.test(t)?rn(t.slice(2),n?2:8):Vt.test(t)?U:+t}function Xl(t){return ia(t,xf(t))}function Gl(t){return t?vi(Kl(t),-M,M):0===t?t:0}function Jl(t){return null==t?"":Lo(t)}var Yl=sa(function(t,e){if(pu(e)||sl(e))ia(e,wf(e),t);else for(var n in e)fe.call(e,n)&&si(t,n,e[n])}),Ql=sa(function(t,e){ia(e,xf(e),t)}),tf=sa(function(t,e,n,r){ia(e,xf(e),t,r)}),ef=sa(function(t,e,n,r){ia(e,wf(e),t,r)}),nf=Da(di);function rf(t,e){var n=kr(t);return null==e?n:fi(n,e)}var of=bo(function(t,e){t=ne(t);var n=-1,r=e.length,i=r>2?e[2]:o;i&&au(e[0],e[1],i)&&(r=1);while(++n1),e}),ia(t,za(t),n),r&&(n=yi(n,h|d|v,La));var i=e.length;while(i--)Io(n,e[i]);return n});function jf(t,e){return $f(t,zc(Ha(e)))}var Sf=Da(function(t,e){return null==t?{}:fo(t,e)});function $f(t,e){if(null==t)return{};var n=En(za(t),function(t){return[t]});return e=Ha(e),po(t,n,function(t,n){return e(t,n[0])})}function Tf(t,e,n){e=Ho(e,t);var r=-1,i=e.length;i||(i=1,t=o);while(++re){var r=t;t=e,e=r}if(n||t%1||e%1){var i=Ke();return Ne(t+i*(e-t+nn("1e-"+((i+"").length-1))),e)}return go(t,e)}var Bf=ha(function(t,e,n){return e=e.toLowerCase(),t+(n?Kf(e):e)});function Kf(t){return mp(Jl(t).toLowerCase())}function Vf(t){return t=Jl(t),t&&t.replace(Yt,tr).replace(He,"")}function Zf(t,e,n){t=Jl(t),e=Lo(e);var r=t.length;n=n===o?r:vi(Kl(n),0,r);var i=n;return n-=e.length,n>=0&&t.slice(n,i)==e}function Xf(t){return t=Jl(t),t&&jt.test(t)?t.replace(Ct,er):t}function Gf(t){return t=Jl(t),t&&Mt.test(t)?t.replace(It,"\\$&"):t}var Jf=ha(function(t,e,n){return t+(n?"-":"")+e.toLowerCase()}),Yf=ha(function(t,e,n){return t+(n?" ":"")+e.toLowerCase()}),Qf=pa("toLowerCase");function tp(t,e,n){t=Jl(t),e=Kl(e);var r=e?vr(t):0;if(!e||r>=e)return t;var i=(e-r)/2;return xa(Pe(i),n)+t+xa(Le(i),n)}function ep(t,e,n){t=Jl(t),e=Kl(e);var r=e?vr(t):0;return e&&r>>0,n?(t=Jl(t),t&&("string"==typeof e||null!=e&&!Ll(e))&&(e=Lo(e),!e&&ir(t))?Bo(yr(t),0,n):t.split(e,n)):[]}var sp=ha(function(t,e,n){return t+(n?" ":"")+mp(e)});function cp(t,e,n){return t=Jl(t),n=null==n?0:vi(Kl(n),0,t.length),e=Lo(e),t.slice(n,n+e.length)==e}function lp(t,e,n){var r=wr.templateSettings;n&&au(t,e,n)&&(e=o),t=Jl(t),e=tf({},e,r,Ta);var i,a,u=tf({},e.imports,r.imports,Ta),s=wf(u),c=Xn(u,s),l=0,f=e.interpolate||Qt,p="__p += '",h=re((e.escape||Qt).source+"|"+f.source+"|"+(f===Tt?Bt:Qt).source+"|"+(e.evaluate||Qt).source+"|$","g"),d="//# sourceURL="+("sourceURL"in e?e.sourceURL:"lodash.templateSources["+ ++Xe+"]")+"\n";t.replace(h,function(e,n,r,o,u,s){return r||(r=o),p+=t.slice(l,s).replace(te,nr),n&&(i=!0,p+="' +\n__e("+n+") +\n'"),u&&(a=!0,p+="';\n"+u+";\n__p += '"),r&&(p+="' +\n((__t = ("+r+")) == null ? '' : __t) +\n'"),l=s+e.length,e}),p+="';\n";var v=e.variable;v||(p="with (obj) {\n"+p+"\n}\n"),p=(a?p.replace(xt,""):p).replace(kt,"$1").replace(At,"$1;"),p="function("+(v||"obj")+") {\n"+(v?"":"obj || (obj = {});\n")+"var __t, __p = ''"+(i?", __e = _.escape":"")+(a?", __j = Array.prototype.join;\nfunction print() { __p += __j.call(arguments, '') }\n":";\n")+p+"return __p\n}";var y=wp(function(){return Ht(s,d+"return "+p).apply(o,c)});if(y.source=p,gl(y))throw y;return y}function fp(t){return Jl(t).toLowerCase()}function pp(t){return Jl(t).toUpperCase()}function hp(t,e,n){if(t=Jl(t),t&&(n||e===o))return t.replace(Dt,"");if(!t||!(e=Lo(e)))return t;var r=yr(t),i=yr(e),a=Jn(r,i),u=Yn(r,i)+1;return Bo(r,a,u).join("")}function dp(t,e,n){if(t=Jl(t),t&&(n||e===o))return t.replace(zt,"");if(!t||!(e=Lo(e)))return t;var r=yr(t),i=Yn(r,yr(e))+1;return Bo(r,0,i).join("")}function vp(t,e,n){if(t=Jl(t),t&&(n||e===o))return t.replace(Ut,"");if(!t||!(e=Lo(e)))return t;var r=yr(t),i=Jn(r,yr(e));return Bo(r,i).join("")}function yp(t,e){var n=j,r=S;if(xl(e)){var i="separator"in e?e.separator:i;n="length"in e?Kl(e.length):n,r="omission"in e?Lo(e.omission):r}t=Jl(t);var a=t.length;if(ir(t)){var u=yr(t);a=u.length}if(n>=a)return t;var s=n-vr(r);if(s<1)return r;var c=u?Bo(u,0,s).join(""):t.slice(0,s);if(i===o)return c+r;if(u&&(s+=c.length-s),Ll(i)){if(t.slice(s).search(i)){var l,f=c;i.global||(i=re(i.source,Jl(Kt.exec(i))+"g")),i.lastIndex=0;while(l=i.exec(f))var p=l.index;c=c.slice(0,p===o?s:p)}}else if(t.indexOf(Lo(i),s)!=s){var h=c.lastIndexOf(i);h>-1&&(c=c.slice(0,h))}return c+r}function gp(t){return t=Jl(t),t&&Et.test(t)?t.replace(Ot,gr):t}var _p=ha(function(t,e,n){return t+(n?" ":"")+e.toUpperCase()}),mp=pa("toUpperCase");function bp(t,e,n){return t=Jl(t),e=n?o:e,e===o?or(t)?br(t):Pn(t):t.match(e)||[]}var wp=bo(function(t,e){try{return mn(t,o,e)}catch(t){return gl(t)?t:new i(t)}}),xp=Da(function(t,e){return wn(e,function(e){e=Su(e),hi(t,e,$c(t[e],t))}),t});function kp(t){var e=null==t?0:t.length,n=Ha();return t=e?En(t,function(t){if("function"!=typeof t[1])throw new oe(c);return[n(t[0]),t[1]]}):[],bo(function(n){var r=-1;while(++rM)return[];var n=z,r=Ne(t,z);e=Ha(e),t-=z;var i=Kn(r,e);while(++n0||e<0)?new Cr(n):(t<0?n=n.takeRight(-t):t&&(n=n.drop(t)),e!==o&&(e=Kl(e),n=e<0?n.dropRight(-e):n.take(e-t)),n)},Cr.prototype.takeRightWhile=function(t){return this.reverse().takeWhile(t).reverse()},Cr.prototype.toArray=function(){return this.take(z)},$i(Cr.prototype,function(t,e){var n=/^(?:filter|find|map|reject)|While$/.test(e),r=/^(?:head|last)$/.test(e),i=wr[r?"take"+("last"==e?"Right":""):e],a=r||/^find/.test(e);i&&(wr.prototype[e]=function(){var e=this.__wrapped__,u=r?[1]:arguments,s=e instanceof Cr,c=u[0],l=s||al(e),f=function(t){var e=i.apply(wr,jn([t],u));return r&&p?e[0]:e};l&&n&&"function"==typeof c&&1!=c.length&&(s=l=!1);var p=this.__chain__,h=!!this.__actions__.length,d=a&&!p,v=s&&!h;if(!a&&l){e=v?e:new Cr(this);var y=t.apply(e,u);return y.__actions__.push({func:Bs,args:[f],thisArg:o}),new Or(y,p)}return d&&v?t.apply(this,u):(y=this.thru(f),d?r?y.value()[0]:y.value():y)})}),wn(["pop","push","shift","sort","splice","unshift"],function(t){var e=ae[t],n=/^(?:push|sort|unshift)$/.test(t)?"tap":"thru",r=/^(?:pop|shift)$/.test(t);wr.prototype[t]=function(){var t=arguments;if(r&&!this.__chain__){var i=this.value();return e.apply(al(i)?i:[],t)}return this[n](function(n){return e.apply(al(n)?n:[],t)})}}),$i(Cr.prototype,function(t,e){var n=wr[e];if(n){var r=n.name+"",i=cn[r]||(cn[r]=[]);i.push({name:e,func:n})}}),cn[_a(o,m).name]=[{name:"wrapper",func:o}],Cr.prototype.clone=Er,Cr.prototype.reverse=jr,Cr.prototype.value=Sr,wr.prototype.at=Ks,wr.prototype.chain=Vs,wr.prototype.commit=Zs,wr.prototype.next=Xs,wr.prototype.plant=Js,wr.prototype.reverse=Ys,wr.prototype.toJSON=wr.prototype.valueOf=wr.prototype.value=Qs,wr.prototype.first=wr.prototype.head,Ee&&(wr.prototype[Ee]=Gs),wr},xr=wr();un._=xr,i=function(){return xr}.call(e,n,e,r),i===o||(r.exports=i)}).call(this)}).call(this,n("yLpj"),n("YuTi")(t))},LyE8:function(t,e,n){"use strict";var r=n("eeVq");t.exports=function(t,e){return!!t&&r(function(){e?t.call(null,function(){},1):t.call(null)})}},M6Qj:function(t,e,n){var r=n("hPIQ"),i=n("K0xU")("iterator"),o=Array.prototype;t.exports=function(t){return void 0!==t&&(r.Array===t||o[i]===t)}},MfQN:function(t,e){t.exports=function(t,e,n){var r=void 0===n;switch(e.length){case 0:return r?t():t.call(n);case 1:return r?t(e[0]):t.call(n,e[0]);case 2:return r?t(e[0],e[1]):t.call(n,e[0],e[1]);case 3:return r?t(e[0],e[1],e[2]):t.call(n,e[0],e[1],e[2]);case 4:return r?t(e[0],e[1],e[2],e[3]):t.call(n,e[0],e[1],e[2],e[3])}return t.apply(n,e)}},Mukb:function(t,e,n){var r=n("hswa"),i=n("RjD/");t.exports=n("nh4g")?function(t,e,n){return r.f(t,e,i(1,n))}:function(t,e,n){return t[e]=n,t}},OEbY:function(t,e,n){n("nh4g")&&"g"!=/./g.flags&&n("hswa").f(RegExp.prototype,"flags",{configurable:!0,get:n("C/va")})},OP3Y:function(t,e,n){var r=n("aagx"),i=n("S/j/"),o=n("YTvA")("IE_PROTO"),a=Object.prototype;t.exports=Object.getPrototypeOf||function(t){return t=i(t),r(t,o)?t[o]:"function"==typeof t.constructor&&t instanceof t.constructor?t.constructor.prototype:t instanceof Object?a:null}},QaDb:function(t,e,n){"use strict";var r=n("Kuth"),i=n("RjD/"),o=n("fyDq"),a={};n("Mukb")(a,n("K0xU")("iterator"),function(){return this}),t.exports=function(t,e,n){t.prototype=r(a,{next:i(1,n)}),o(t,e+" Iterator")}},RYi7:function(t,e){var n=Math.ceil,r=Math.floor;t.exports=function(t){return isNaN(t=+t)?0:(t>0?r:n)(t)}},"RjD/":function(t,e){t.exports=function(t,e){return{enumerable:!(1&t),configurable:!(2&t),writable:!(4&t),value:e}}},"S/j/":function(t,e,n){var r=n("vhPU");t.exports=function(t){return Object(r(t))}},SlkY:function(t,e,n){var r=n("m0Pp"),i=n("H6hf"),o=n("M6Qj"),a=n("y3w9"),u=n("ne8i"),s=n("J+6e"),c={},l={};e=t.exports=function(t,e,n,f,p){var h,d,v,y,g=p?function(){return t}:s(t),_=r(n,f,e?2:1),m=0;if("function"!=typeof g)throw TypeError(t+" is not iterable!");if(o(g)){for(h=u(t.length);h>m;m++)if(y=e?_(a(d=t[m])[0],d[1]):_(t[m]),y===c||y===l)return y}else for(v=g.call(t);!(d=v.next()).done;)if(y=i(v,_,d.value,e),y===c||y===l)return y};e.BREAK=c,e.RETURN=l},TrxG:function(t,e,n){var r=n("hcir");function i(t){return t._query=[Date.now().toString()],t}t.exports=function(t,e){return t.set("X-Requested-With","XMLHttpRequest"),t.set("Expires","-1"),t.set("Cache-Control","no-cache,no-store,must-revalidate,max-age=-1,private"),(r||e)&&i(t),t}},UUeW:function(t,e,n){var r=n("K0xU")("match");t.exports=function(t){var e=/./;try{"/./"[t](e)}catch(n){try{return e[r]=!1,!"/./"[t](e)}catch(t){}}return!0}},UqcF:function(t,e){e.f={}.propertyIsEnumerable},VRzm:function(t,e,n){"use strict";var r,i,o,a,u=n("LQAc"),s=n("dyZX"),c=n("m0Pp"),l=n("I8a+"),f=n("XKFU"),p=n("0/R4"),h=n("2OiF"),d=n("9gX7"),v=n("SlkY"),y=n("69bn"),g=n("GZEu").set,_=n("gHnn")(),m=n("pbhE"),b=n("nICZ"),w=n("ol8x"),x=n("vKrd"),k="Promise",A=s.TypeError,O=s.process,C=O&&O.versions,E=C&&C.v8||"",j=s[k],S="process"==l(O),$=function(){},T=i=m.f,R=!!function(){try{var t=j.resolve(1),e=(t.constructor={})[n("K0xU")("species")]=function(t){t($,$)};return(S||"function"==typeof PromiseRejectionEvent)&&t.then($)instanceof e&&0!==E.indexOf("6.6")&&-1===w.indexOf("Chrome/66")}catch(t){}}(),L=function(t){var e;return!(!p(t)||"function"!=typeof(e=t.then))&&e},P=function(t,e){if(!t._n){t._n=!0;var n=t._c;_(function(){var r=t._v,i=1==t._s,o=0,a=function(e){var n,o,a,u=i?e.ok:e.fail,s=e.resolve,c=e.reject,l=e.domain;try{u?(i||(2==t._h&&D(t),t._h=1),!0===u?n=r:(l&&l.enter(),n=u(r),l&&(l.exit(),a=!0)),n===e.promise?c(A("Promise-chain cycle")):(o=L(n))?o.call(n,s,c):s(n)):c(r)}catch(t){l&&!a&&l.exit(),c(t)}};while(n.length>o)a(n[o++]);t._c=[],t._n=!1,e&&!t._h&&I(t)})}},I=function(t){g.call(s,function(){var e,n,r,i=t._v,o=M(t);if(o&&(e=b(function(){S?O.emit("unhandledRejection",i,t):(n=s.onunhandledrejection)?n({promise:t,reason:i}):(r=s.console)&&r.error&&r.error("Unhandled promise rejection",i)}),t._h=S||M(t)?2:1),t._a=void 0,o&&e.e)throw e.v})},M=function(t){return 1!==t._h&&0===(t._a||t._c).length},D=function(t){g.call(s,function(){var e;S?O.emit("rejectionHandled",t):(e=s.onrejectionhandled)&&e({promise:t,reason:t._v})})},U=function(t){var e=this;e._d||(e._d=!0,e=e._w||e,e._v=t,e._s=2,e._a||(e._a=e._c.slice()),P(e,!0))},z=function(t){var e,n=this;if(!n._d){n._d=!0,n=n._w||n;try{if(n===t)throw A("Promise can't be resolved itself");(e=L(t))?_(function(){var r={_w:n,_d:!1};try{e.call(t,c(z,r,1),c(U,r,1))}catch(t){U.call(r,t)}}):(n._v=t,n._s=1,P(n,!1))}catch(t){U.call({_w:n,_d:!1},t)}}};R||(j=function(t){d(this,j,k,"_h"),h(t),r.call(this);try{t(c(z,this,1),c(U,this,1))}catch(t){U.call(this,t)}},r=function(t){this._c=[],this._a=void 0,this._s=0,this._d=!1,this._v=void 0,this._h=0,this._n=!1},r.prototype=n("3Lyj")(j.prototype,{then:function(t,e){var n=T(y(this,j));return n.ok="function"!=typeof t||t,n.fail="function"==typeof e&&e,n.domain=S?O.domain:void 0,this._c.push(n),this._a&&this._a.push(n),this._s&&P(this,!1),n.promise},catch:function(t){return this.then(void 0,t)}}),o=function(){var t=new r;this.promise=t,this.resolve=c(z,t,1),this.reject=c(U,t,1)},m.f=T=function(t){return t===j||t===a?new o(t):i(t)}),f(f.G+f.W+f.F*!R,{Promise:j}),n("fyDq")(j,k),n("elZq")(k),a=n("g3g5")[k],f(f.S+f.F*!R,k,{reject:function(t){var e=T(this),n=e.reject;return n(t),e.promise}}),f(f.S+f.F*(u||!R),k,{resolve:function(t){return x(u&&this===a?j:this,t)}}),f(f.S+f.F*!(R&&n("XMVh")(function(t){j.all(t)["catch"]($)})),k,{all:function(t){var e=this,n=T(e),r=n.resolve,i=n.reject,o=b(function(){var n=[],o=0,a=1;v(t,!1,function(t){var u=o++,s=!1;n.push(void 0),a++,e.resolve(t).then(function(t){s||(s=!0,n[u]=t,--a||r(n))},i)}),--a||r(n)});return o.e&&i(o.v),n.promise},race:function(t){var e=this,n=T(e),r=n.reject,i=b(function(){v(t,!1,function(t){e.resolve(t).then(n.resolve,r)})});return i.e&&r(i.v),n.promise}})},VTer:function(t,e,n){var r=n("g3g5"),i=n("dyZX"),o="__core-js_shared__",a=i[o]||(i[o]={});(t.exports=function(t,e){return a[t]||(a[t]=void 0!==e?e:{})})("versions",[]).push({version:r.version,mode:n("LQAc")?"pure":"global",copyright:"© 2018 Denis Pushkarev (zloirock.ru)"})},Vd3H:function(t,e,n){"use strict";var r=n("XKFU"),i=n("2OiF"),o=n("S/j/"),a=n("eeVq"),u=[].sort,s=[1,2,3];r(r.P+r.F*(a(function(){s.sort(void 0)})||!a(function(){s.sort(null)})||!n("LyE8")(u)),"Array",{sort:function(t){return void 0===t?u.call(o(this)):u.call(o(this),i(t))}})},XKFU:function(t,e,n){var r=n("dyZX"),i=n("g3g5"),o=n("Mukb"),a=n("KroJ"),u=n("m0Pp"),s="prototype",c=function(t,e,n){var l,f,p,h,d=t&c.F,v=t&c.G,y=t&c.S,g=t&c.P,_=t&c.B,m=v?r:y?r[e]||(r[e]={}):(r[e]||{})[s],b=v?i:i[e]||(i[e]={}),w=b[s]||(b[s]={});for(l in v&&(n=e),n)f=!d&&m&&void 0!==m[l],p=(f?m:n)[l],h=_&&f?u(p,r):g&&"function"==typeof p?u(Function.call,p):p,m&&a(m,l,p,t&c.U),b[l]!=p&&o(b,l,h),g&&w[l]!=p&&(w[l]=p)};r.core=i,c.F=1,c.G=2,c.S=4,c.P=8,c.B=16,c.W=32,c.U=64,c.R=128,t.exports=c},XMVh:function(t,e,n){var r=n("K0xU")("iterator"),i=!1;try{var o=[7][r]();o["return"]=function(){i=!0},Array.from(o,function(){throw 2})}catch(t){}t.exports=function(t,e){if(!e&&!i)return!1;var n=!1;try{var o=[7],a=o[r]();a.next=function(){return{done:n=!0}},o[r]=function(){return a},t(o)}catch(t){}return n}},YTvA:function(t,e,n){var r=n("VTer")("keys"),i=n("ylqs");t.exports=function(t){return r[t]||(r[t]=i(t))}},Ymqv:function(t,e,n){var r=n("LZWt");t.exports=Object("z").propertyIsEnumerable(0)?Object:function(t){return"String"==r(t)?t.split(""):Object(t)}},YuTi:function(t,e){t.exports=function(t){return t.webpackPolyfill||(t.deprecate=function(){},t.paths=[],t.children||(t.children=[]),Object.defineProperty(t,"loaded",{enumerable:!0,get:function(){return t.l}}),Object.defineProperty(t,"id",{enumerable:!0,get:function(){return t.i}}),t.webpackPolyfill=1),t}},Z2Ku:function(t,e,n){"use strict";var r=n("XKFU"),i=n("w2a5")(!0);r(r.P,"Array",{includes:function(t){return i(this,t,arguments.length>1?arguments[1]:void 0)}}),n("nGyu")("includes")},a1Th:function(t,e,n){"use strict";n("OEbY");var r=n("y3w9"),i=n("C/va"),o=n("nh4g"),a="toString",u=/./[a],s=function(t){n("KroJ")(RegExp.prototype,a,t,!0)};n("eeVq")(function(){return"/a/b"!=u.call({source:"a",flags:"b"})})?s(function(){var t=r(this);return"/".concat(t.source,"/","flags"in t?t.flags:!o&&t instanceof RegExp?i.call(t):void 0)}):u.name!=a&&s(function(){return u.call(this)})},aCFj:function(t,e,n){var r=n("Ymqv"),i=n("vhPU");t.exports=function(t){return r(i(t))}},aagx:function(t,e){var n={}.hasOwnProperty;t.exports=function(t,e){return n.call(t,e)}},apmT:function(t,e,n){var r=n("0/R4");t.exports=function(t,e){if(!r(t))return t;var n,i;if(e&&"function"==typeof(n=t.toString)&&!r(i=n.call(t)))return i;if("function"==typeof(n=t.valueOf)&&!r(i=n.call(t)))return i;if(!e&&"function"==typeof(n=t.toString)&&!r(i=n.call(t)))return i;throw TypeError("Can't convert object to primitive value")}},cpc2:function(t,e,n){function r(t){if(t)return i(t)}function i(t){for(var e in r.prototype)t[e]=r.prototype[e];return t}t.exports=r,r.prototype.on=r.prototype.addEventListener=function(t,e){return this._callbacks=this._callbacks||{},(this._callbacks["$"+t]=this._callbacks["$"+t]||[]).push(e),this},r.prototype.once=function(t,e){function n(){this.off(t,n),e.apply(this,arguments)}return n.fn=e,this.on(t,n),this},r.prototype.off=r.prototype.removeListener=r.prototype.removeAllListeners=r.prototype.removeEventListener=function(t,e){if(this._callbacks=this._callbacks||{},0==arguments.length)return this._callbacks={},this;var n,r=this._callbacks["$"+t];if(!r)return this;if(1==arguments.length)return delete this._callbacks["$"+t],this;for(var i=0;ic){var p,h=u(arguments[c++]),d=l?r(h).concat(l(h)):r(h),v=d.length,y=0;while(v>y)f.call(h,p=d[y++])&&(n[p]=h[p])}return n}:s},"d/Gc":function(t,e,n){var r=n("RYi7"),i=Math.max,o=Math.min;t.exports=function(t,e){return t=r(t),t<0?i(t+e,0):o(t,e)}},dRSK:function(t,e,n){"use strict";var r=n("XKFU"),i=n("CkkT")(5),o="find",a=!0;o in[]&&Array(1)[o](function(){a=!1}),r(r.P+r.F*a,"Array",{find:function(t){return i(this,t,arguments.length>1?arguments[1]:void 0)}}),n("nGyu")(o)},dyZX:function(t,e){var n=t.exports="undefined"!=typeof window&&window.Math==Math?window:"undefined"!=typeof self&&self.Math==Math?self:Function("return this")();"number"==typeof __g&&(__g=n)},eeVq:function(t,e){t.exports=function(t){try{return!!t()}catch(t){return!0}}},elZq:function(t,e,n){"use strict";var r=n("dyZX"),i=n("hswa"),o=n("nh4g"),a=n("K0xU")("species");t.exports=function(t){var e=r[t];o&&e&&!e[a]&&i.f(e,a,{configurable:!0,get:function(){return this}})}},"f3/d":function(t,e,n){var r=n("hswa").f,i=Function.prototype,o=/^\s*function ([^ (]*)/,a="name";a in i||n("nh4g")&&r(i,a,{configurable:!0,get:function(){try{return(""+this).match(o)[1]}catch(t){return""}}})},fyDq:function(t,e,n){var r=n("hswa").f,i=n("aagx"),o=n("K0xU")("toStringTag");t.exports=function(t,e,n){t&&!i(t=n?t:t.prototype,o)&&r(t,o,{configurable:!0,value:e})}},g3g5:function(t,e){var n=t.exports={version:"2.5.7"};"number"==typeof __e&&(__e=n)},gHnn:function(t,e,n){var r=n("dyZX"),i=n("GZEu").set,o=r.MutationObserver||r.WebKitMutationObserver,a=r.process,u=r.Promise,s="process"==n("LZWt")(a);t.exports=function(){var t,e,n,c=function(){var r,i;s&&(r=a.domain)&&r.exit();while(t){i=t.fn,t=t.next;try{i()}catch(r){throw t?n():e=void 0,r}}e=void 0,r&&r.enter()};if(s)n=function(){a.nextTick(c)};else if(!o||r.navigator&&r.navigator.standalone)if(u&&u.resolve){var l=u.resolve(void 0);n=function(){l.then(c)}}else n=function(){i.call(r,c)};else{var f=!0,p=document.createTextNode("");new o(c).observe(p,{characterData:!0}),n=function(){p.data=f=!f}}return function(r){var i={fn:r,next:void 0};e&&(e.next=i),t||(t=i,n()),e=i}}},hPIQ:function(t,e){t.exports={}},hcir:function(t,e){function n(){for(var t=3,e=document.createElement("b"),n=e.all||[];e.innerHTML="\x3c!--[if gt IE "+ ++t+"]>4?t:document.documentMode}t.exports=n()},hswa:function(t,e,n){var r=n("y3w9"),i=n("xpql"),o=n("apmT"),a=Object.defineProperty;e.f=n("nh4g")?Object.defineProperty:function(t,e,n){if(r(t),e=o(e,!0),r(n),i)try{return a(t,e,n)}catch(t){}if("get"in n||"set"in n)throw TypeError("Accessors not supported!");return"value"in n&&(t[e]=n.value),t}},jE9Z:function(t,e,n){"use strict"; +/** + * vue-router v3.0.1 + * (c) 2017 Evan You + * @license MIT + */function r(t,e){0}function i(t){return Object.prototype.toString.call(t).indexOf("Error")>-1}var o={name:"router-view",functional:!0,props:{name:{type:String,default:"default"}},render:function(t,e){var n=e.props,r=e.children,i=e.parent,o=e.data;o.routerView=!0;var s=i.$createElement,c=n.name,l=i.$route,f=i._routerViewCache||(i._routerViewCache={}),p=0,h=!1;while(i&&i._routerRoot!==i)i.$vnode&&i.$vnode.data.routerView&&p++,i._inactive&&(h=!0),i=i.$parent;if(o.routerViewDepth=p,h)return s(f[c],o,r);var d=l.matched[p];if(!d)return f[c]=null,s();var v=f[c]=d.components[c];o.registerRouteInstance=function(t,e){var n=d.instances[c];(e&&n!==t||!e&&n===t)&&(d.instances[c]=e)},(o.hook||(o.hook={})).prepatch=function(t,e){d.instances[c]=e.componentInstance};var y=o.props=a(l,d.props&&d.props[c]);if(y){y=o.props=u({},y);var g=o.attrs=o.attrs||{};for(var _ in y)v.props&&_ in v.props||(g[_]=y[_],delete y[_])}return s(v,o,r)}};function a(t,e){switch(typeof e){case"undefined":return;case"object":return e;case"function":return e(t);case"boolean":return e?t.params:void 0;default:0}}function u(t,e){for(var n in e)t[n]=e[n];return t}var s=/[!'()*]/g,c=function(t){return"%"+t.charCodeAt(0).toString(16)},l=/%2C/g,f=function(t){return encodeURIComponent(t).replace(s,c).replace(l,",")},p=decodeURIComponent;function h(t,e,n){void 0===e&&(e={});var r,i=n||d;try{r=i(t||"")}catch(t){r={}}for(var o in e)r[o]=e[o];return r}function d(t){var e={};return t=t.trim().replace(/^(\?|#|&)/,""),t?(t.split("&").forEach(function(t){var n=t.replace(/\+/g," ").split("="),r=p(n.shift()),i=n.length>0?p(n.join("=")):null;void 0===e[r]?e[r]=i:Array.isArray(e[r])?e[r].push(i):e[r]=[e[r],i]}),e):e}function v(t){var e=t?Object.keys(t).map(function(e){var n=t[e];if(void 0===n)return"";if(null===n)return f(e);if(Array.isArray(n)){var r=[];return n.forEach(function(t){void 0!==t&&(null===t?r.push(f(e)):r.push(f(e)+"="+f(t)))}),r.join("&")}return f(e)+"="+f(n)}).filter(function(t){return t.length>0}).join("&"):null;return e?"?"+e:""}var y=/\/?$/;function g(t,e,n,r){var i=r&&r.options.stringifyQuery,o=e.query||{};try{o=_(o)}catch(t){}var a={name:e.name||t&&t.name,meta:t&&t.meta||{},path:e.path||"/",hash:e.hash||"",query:o,params:e.params||{},fullPath:w(e,i),matched:t?b(t):[]};return n&&(a.redirectedFrom=w(n,i)),Object.freeze(a)}function _(t){if(Array.isArray(t))return t.map(_);if(t&&"object"===typeof t){var e={};for(var n in t)e[n]=_(t[n]);return e}return t}var m=g(null,{path:"/"});function b(t){var e=[];while(t)e.unshift(t),t=t.parent;return e}function w(t,e){var n=t.path,r=t.query;void 0===r&&(r={});var i=t.hash;void 0===i&&(i="");var o=e||v;return(n||"/")+o(r)+i}function x(t,e){return e===m?t===e:!!e&&(t.path&&e.path?t.path.replace(y,"")===e.path.replace(y,"")&&t.hash===e.hash&&k(t.query,e.query):!(!t.name||!e.name)&&(t.name===e.name&&t.hash===e.hash&&k(t.query,e.query)&&k(t.params,e.params)))}function k(t,e){if(void 0===t&&(t={}),void 0===e&&(e={}),!t||!e)return t===e;var n=Object.keys(t),r=Object.keys(e);return n.length===r.length&&n.every(function(n){var r=t[n],i=e[n];return"object"===typeof r&&"object"===typeof i?k(r,i):String(r)===String(i)})}function A(t,e){return 0===t.path.replace(y,"/").indexOf(e.path.replace(y,"/"))&&(!e.hash||t.hash===e.hash)&&O(t.query,e.query)}function O(t,e){for(var n in e)if(!(n in t))return!1;return!0}var C,E=[String,Object],j=[String,Array],S={name:"router-link",props:{to:{type:E,required:!0},tag:{type:String,default:"a"},exact:Boolean,append:Boolean,replace:Boolean,activeClass:String,exactActiveClass:String,event:{type:j,default:"click"}},render:function(t){var e=this,n=this.$router,r=this.$route,i=n.resolve(this.to,r,this.append),o=i.location,a=i.route,u=i.href,s={},c=n.options.linkActiveClass,l=n.options.linkExactActiveClass,f=null==c?"router-link-active":c,p=null==l?"router-link-exact-active":l,h=null==this.activeClass?f:this.activeClass,d=null==this.exactActiveClass?p:this.exactActiveClass,v=o.path?g(null,o,null,n):a;s[d]=x(r,v),s[h]=this.exact?s[d]:A(r,v);var y=function(t){$(t)&&(e.replace?n.replace(o):n.push(o))},_={click:$};Array.isArray(this.event)?this.event.forEach(function(t){_[t]=y}):_[this.event]=y;var m={class:s};if("a"===this.tag)m.on=_,m.attrs={href:u};else{var b=T(this.$slots.default);if(b){b.isStatic=!1;var w=C.util.extend,k=b.data=w({},b.data);k.on=_;var O=b.data.attrs=w({},b.data.attrs);O.href=u}else m.on=_}return t(this.tag,m,this.$slots.default)}};function $(t){if(!(t.metaKey||t.altKey||t.ctrlKey||t.shiftKey)&&!t.defaultPrevented&&(void 0===t.button||0===t.button)){if(t.currentTarget&&t.currentTarget.getAttribute){var e=t.currentTarget.getAttribute("target");if(/\b_blank\b/i.test(e))return}return t.preventDefault&&t.preventDefault(),!0}}function T(t){if(t)for(var e,n=0;n=0&&(e=t.slice(r),t=t.slice(0,r));var i=t.indexOf("?");return i>=0&&(n=t.slice(i+1),t=t.slice(0,i)),{path:t,query:n,hash:e}}function M(t){return t.replace(/\/\//g,"/")}var D=Array.isArray||function(t){return"[object Array]"==Object.prototype.toString.call(t)},U=rt,z=W,q=B,N=Z,F=nt,H=new RegExp(["(\\\\.)","([\\/.])?(?:(?:\\:(\\w+)(?:\\(((?:\\\\.|[^\\\\()])+)\\))?|\\(((?:\\\\.|[^\\\\()])+)\\))([+*?])?|(\\*))"].join("|"),"g");function W(t,e){var n,r=[],i=0,o=0,a="",u=e&&e.delimiter||"/";while(null!=(n=H.exec(t))){var s=n[0],c=n[1],l=n.index;if(a+=t.slice(o,l),o=l+s.length,c)a+=c[1];else{var f=t[o],p=n[2],h=n[3],d=n[4],v=n[5],y=n[6],g=n[7];a&&(r.push(a),a="");var _=null!=p&&null!=f&&f!==p,m="+"===y||"*"===y,b="?"===y||"*"===y,w=n[2]||u,x=d||v;r.push({name:h||i++,prefix:p||"",delimiter:w,optional:b,repeat:m,partial:_,asterisk:!!g,pattern:x?G(x):g?".*":"[^"+X(w)+"]+?"})}}return o-1&&(u.params[p]=n.params[p]);if(c)return u.path=ot(c.path,u.params,'named route "'+s+'"'),l(c,u,a)}else if(u.path){u.params={};for(var h=0;h=t.length?n():t[i]?e(t[i],function(){r(i+1)}):r(i+1)};r(0)}function It(t){return function(e,n,r){var o=!1,a=0,u=null;Mt(t,function(t,e,n,s){if("function"===typeof t&&void 0===t.cid){o=!0,a++;var c,l=qt(function(e){zt(e)&&(e=e.default),t.resolved="function"===typeof e?e:C.extend(e),n.components[s]=e,a--,a<=0&&r()}),f=qt(function(t){var e="Failed to resolve async component "+s+": "+t;u||(u=i(t)?t:new Error(e),r(u))});try{c=t(l,f)}catch(t){f(t)}if(c)if("function"===typeof c.then)c.then(l,f);else{var p=c.component;p&&"function"===typeof p.then&&p.then(l,f)}}}),o||r()}}function Mt(t,e){return Dt(t.map(function(t){return Object.keys(t.components).map(function(n){return e(t.components[n],t.instances[n],t,n)})}))}function Dt(t){return Array.prototype.concat.apply([],t)}var Ut="function"===typeof Symbol&&"symbol"===typeof Symbol.toStringTag;function zt(t){return t.__esModule||Ut&&"Module"===t[Symbol.toStringTag]}function qt(t){var e=!1;return function(){var n=[],r=arguments.length;while(r--)n[r]=arguments[r];if(!e)return e=!0,t.apply(this,n)}}var Nt=function(t,e){this.router=t,this.base=Ft(e),this.current=m,this.pending=null,this.ready=!1,this.readyCbs=[],this.readyErrorCbs=[],this.errorCbs=[]};function Ft(t){if(!t)if(L){var e=document.querySelector("base");t=e&&e.getAttribute("href")||"/",t=t.replace(/^https?:\/\/[^\/]+/,"")}else t="/";return"/"!==t.charAt(0)&&(t="/"+t),t.replace(/\/$/,"")}function Ht(t,e){var n,r=Math.max(t.length,e.length);for(n=0;n=0?e.slice(0,n):e;return r+"#"+t}function oe(t){Ct?Rt(ie(t)):window.location.hash=t}function ae(t){Ct?Lt(ie(t)):window.location.replace(ie(t))}var ue=function(t){function e(e,n){t.call(this,e,n),this.stack=[],this.index=-1}return t&&(e.__proto__=t),e.prototype=Object.create(t&&t.prototype),e.prototype.constructor=e,e.prototype.push=function(t,e,n){var r=this;this.transitionTo(t,function(t){r.stack=r.stack.slice(0,r.index+1).concat(t),r.index++,e&&e(t)},n)},e.prototype.replace=function(t,e,n){var r=this;this.transitionTo(t,function(t){r.stack=r.stack.slice(0,r.index).concat(t),e&&e(t)},n)},e.prototype.go=function(t){var e=this,n=this.index+t;if(!(n<0||n>=this.stack.length)){var r=this.stack[n];this.confirmTransition(r,function(){e.index=n,e.updateRoute(r)})}},e.prototype.getCurrentLocation=function(){var t=this.stack[this.stack.length-1];return t?t.fullPath:"/"},e.prototype.ensureURL=function(){},e}(Nt),se=function(t){void 0===t&&(t={}),this.app=null,this.apps=[],this.options=t,this.beforeHooks=[],this.resolveHooks=[],this.afterHooks=[],this.matcher=pt(t.routes||[],this);var e=t.mode||"hash";switch(this.fallback="history"===e&&!Ct&&!1!==t.fallback,this.fallback&&(e="hash"),L||(e="abstract"),this.mode=e,e){case"history":this.history=new Yt(this,t.base);break;case"hash":this.history=new te(this,t.base,this.fallback);break;case"abstract":this.history=new ue(this,t.base);break;default:0}},ce={currentRoute:{configurable:!0}};function le(t,e){return t.push(e),function(){var n=t.indexOf(e);n>-1&&t.splice(n,1)}}function fe(t,e,n){var r="hash"===n?"#"+e:e;return t?M(t+"/"+r):r}se.prototype.match=function(t,e,n){return this.matcher.match(t,e,n)},ce.currentRoute.get=function(){return this.history&&this.history.current},se.prototype.init=function(t){var e=this;if(this.apps.push(t),!this.app){this.app=t;var n=this.history;if(n instanceof Yt)n.transitionTo(n.getCurrentLocation());else if(n instanceof te){var r=function(){n.setupListeners()};n.transitionTo(n.getCurrentLocation(),r,r)}n.listen(function(t){e.apps.forEach(function(e){e._route=t})})}},se.prototype.beforeEach=function(t){return le(this.beforeHooks,t)},se.prototype.beforeResolve=function(t){return le(this.resolveHooks,t)},se.prototype.afterEach=function(t){return le(this.afterHooks,t)},se.prototype.onReady=function(t,e){this.history.onReady(t,e)},se.prototype.onError=function(t){this.history.onError(t)},se.prototype.push=function(t,e,n){this.history.push(t,e,n)},se.prototype.replace=function(t,e,n){this.history.replace(t,e,n)},se.prototype.go=function(t){this.history.go(t)},se.prototype.back=function(){this.go(-1)},se.prototype.forward=function(){this.go(1)},se.prototype.getMatchedComponents=function(t){var e=t?t.matched?t:this.resolve(t).route:this.currentRoute;return e?[].concat.apply([],e.matched.map(function(t){return Object.keys(t.components).map(function(e){return t.components[e]})})):[]},se.prototype.resolve=function(t,e,n){var r=lt(t,e||this.history.current,n,this),i=this.match(r,e),o=i.redirectedFrom||i.fullPath,a=this.history.base,u=fe(a,o,this.mode);return{location:r,route:i,href:u,normalizedTo:r,resolved:i}},se.prototype.addRoutes=function(t){this.matcher.addRoutes(t),this.history.current!==m&&this.history.transitionTo(this.history.getCurrentLocation())},Object.defineProperties(se.prototype,ce),se.install=R,se.version="3.0.1",L&&window.Vue&&window.Vue.use(se),e["a"]=se},"k5N+":function(t,e,n){"use strict";function r(t){if(Array.isArray(t))return t}function i(t,e){var n=[],r=!0,i=!1,o=void 0;try{for(var a,u=t[Symbol.iterator]();!(r=(a=u.next()).done);r=!0)if(n.push(a.value),e&&n.length===e)break}catch(t){i=!0,o=t}finally{try{r||null==u["return"]||u["return"]()}finally{if(i)throw o}}return n}function o(){throw new TypeError("Invalid attempt to destructure non-iterable instance")}function a(t,e){return r(t)||i(t,e)||o()}n.d(e,"a",function(){return a})},kMlx:function(t,e,n){"use strict";var r=n("8zgK");function i(t){if(t)return o(t)}function o(t){for(var e in i.prototype)t[e]=i.prototype[e];return t}t.exports=i,i.prototype.clearTimeout=function(){return clearTimeout(this._timer),clearTimeout(this._responseTimeoutTimer),delete this._timer,delete this._responseTimeoutTimer,this},i.prototype.parse=function(t){return this._parser=t,this},i.prototype.responseType=function(t){return this._responseType=t,this},i.prototype.serialize=function(t){return this._serializer=t,this},i.prototype.timeout=function(t){if(!t||"object"!==typeof t)return this._timeout=t,this._responseTimeout=0,this;for(var e in t)switch(e){case"deadline":this._timeout=t.deadline;break;case"response":this._responseTimeout=t.response;break;default:console.warn("Unknown timeout option",e)}return this},i.prototype.retry=function(t,e){return 0!==arguments.length&&!0!==t||(t=1),t<=0&&(t=0),this._maxRetries=t,this._retries=0,this._retryCallback=e,this};var a=["ECONNRESET","ETIMEDOUT","EADDRINFO","ESOCKETTIMEDOUT"];i.prototype._shouldRetry=function(t,e){if(!this._maxRetries||this._retries++>=this._maxRetries)return!1;if(this._retryCallback)try{var n=this._retryCallback(t,e);if(!0===n)return!0;if(!1===n)return!1}catch(t){console.error(t)}if(e&&e.status&&e.status>=500&&501!=e.status)return!0;if(t){if(t.code&&~a.indexOf(t.code))return!0;if(t.timeout&&"ECONNABORTED"==t.code)return!0;if(t.crossDomain)return!0}return!1},i.prototype._retry=function(){return this.clearTimeout(),this.req&&(this.req=null,this.req=this.request()),this._aborted=!1,this.timedout=!1,this._end()},i.prototype.then=function(t,e){if(!this._fullfilledPromise){var n=this;this._endCalled&&console.warn("Warning: superagent request was sent twice, because both .end() and .then() were called. Never call .end() if you use promises"),this._fullfilledPromise=new Promise(function(t,e){n.end(function(n,r){n?e(n):t(r)})})}return this._fullfilledPromise.then(t,e)},i.prototype["catch"]=function(t){return this.then(void 0,t)},i.prototype.use=function(t){return t(this),this},i.prototype.ok=function(t){if("function"!==typeof t)throw Error("Callback required");return this._okCallback=t,this},i.prototype._isResponseOK=function(t){return!!t&&(this._okCallback?this._okCallback(t):t.status>=200&&t.status<300)},i.prototype.get=function(t){return this._header[t.toLowerCase()]},i.prototype.getHeader=i.prototype.get,i.prototype.set=function(t,e){if(r(t)){for(var n in t)this.set(n,t[n]);return this}return this._header[t.toLowerCase()]=e,this.header[t]=e,this},i.prototype.unset=function(t){return delete this._header[t.toLowerCase()],delete this.header[t],this},i.prototype.field=function(t,e){if(null===t||void 0===t)throw new Error(".field(name, val) name can not be empty");if(this._data&&console.error(".field() can't be used if .send() is used. Please use only .send() or only .field() & .attach()"),r(t)){for(var n in t)this.field(n,t[n]);return this}if(Array.isArray(e)){for(var i in e)this.field(t,e[i]);return this}if(null===e||void 0===e)throw new Error(".field(name, val) val can not be empty");return"boolean"===typeof e&&(e=""+e),this._getFormData().append(t,e),this},i.prototype.abort=function(){return this._aborted?this:(this._aborted=!0,this.xhr&&this.xhr.abort(),this.req&&this.req.abort(),this.clearTimeout(),this.emit("abort"),this)},i.prototype._auth=function(t,e,n,r){switch(n.type){case"basic":this.set("Authorization","Basic "+r(t+":"+e));break;case"auto":this.username=t,this.password=e;break;case"bearer":this.set("Authorization","Bearer "+t);break}return this},i.prototype.withCredentials=function(t){return void 0==t&&(t=!0),this._withCredentials=t,this},i.prototype.redirects=function(t){return this._maxRedirects=t,this},i.prototype.maxResponseSize=function(t){if("number"!==typeof t)throw TypeError("Invalid argument");return this._maxResponseSize=t,this},i.prototype.toJSON=function(){return{method:this.method,url:this.url,data:this._data,headers:this._header}},i.prototype.send=function(t){var e=r(t),n=this._header["content-type"];if(this._formData&&console.error(".send() can't be used if .attach() or .field() is used. Please use only .send() or only .field() & .attach()"),e&&!this._data)Array.isArray(t)?this._data=[]:this._isHost(t)||(this._data={});else if(t&&this._data&&this._isHost(this._data))throw Error("Can't merge these send calls");if(e&&r(this._data))for(var i in t)this._data[i]=t[i];else"string"==typeof t?(n||this.type("form"),n=this._header["content-type"],this._data="application/x-www-form-urlencoded"==n?this._data?this._data+"&"+t:t:(this._data||"")+t):this._data=t;return!e||this._isHost(t)?this:(n||this.type("json"),this)},i.prototype.sortQuery=function(t){return this._sort="undefined"===typeof t||t,this},i.prototype._finalizeQueryString=function(){var t=this._query.join("&");if(t&&(this.url+=(this.url.indexOf("?")>=0?"&":"?")+t),this._query.length=0,this._sort){var e=this.url.indexOf("?");if(e>=0){var n=this.url.substring(e+1).split("&");"function"===typeof this._sort?n.sort(this._sort):n.sort(),this.url=this.url.substring(0,e)+"?"+n.join("&")}}},i.prototype._appendQueryString=function(){console.trace("Unsupported")},i.prototype._timeoutError=function(t,e,n){if(!this._aborted){var r=new Error(t+e+"ms exceeded");r.timeout=e,r.code="ECONNABORTED",r.errno=n,this.timedout=!0,this.abort(),this.callback(r)}},i.prototype._setTimeouts=function(){var t=this;this._timeout&&!this._timer&&(this._timer=setTimeout(function(){t._timeoutError("Timeout of ",t._timeout,"ETIME")},this._timeout)),this._responseTimeout&&!this._responseTimeoutTimer&&(this._responseTimeoutTimer=setTimeout(function(){t._timeoutError("Response timeout of ",t._responseTimeout,"ETIMEDOUT")},this._responseTimeout))}},m0Pp:function(t,e,n){var r=n("2OiF");t.exports=function(t,e,n){if(r(t),void 0===e)return t;switch(n){case 1:return function(n){return t.call(e,n)};case 2:return function(n,r){return t.call(e,n,r)};case 3:return function(n,r,i){return t.call(e,n,r,i)}}return function(){return t.apply(e,arguments)}}},nGyu:function(t,e,n){var r=n("K0xU")("unscopables"),i=Array.prototype;void 0==i[r]&&n("Mukb")(i,r,{}),t.exports=function(t){i[r][t]=!0}},nICZ:function(t,e){t.exports=function(t){try{return{e:!1,v:t()}}catch(t){return{e:!0,v:t}}}},nZbv:function(t,e){function n(){this._defaults=[]}["use","on","once","set","query","type","accept","auth","withCredentials","sortQuery","retry","ok","redirects","timeout","buffer","serialize","parse","ca","key","pfx","cert"].forEach(function(t){n.prototype[t]=function(){return this._defaults.push({fn:t,arguments:arguments}),this}}),n.prototype._setDefaults=function(t){this._defaults.forEach(function(e){t[e.fn].apply(t,e.arguments)})},t.exports=n},ne8i:function(t,e,n){var r=n("RYi7"),i=Math.min;t.exports=function(t){return t>0?i(r(t),9007199254740991):0}},nh4g:function(t,e,n){t.exports=!n("eeVq")(function(){return 7!=Object.defineProperty({},"a",{get:function(){return 7}}).a})},oHnp:function(t,e,n){"use strict";e.type=function(t){return t.split(/ *; */).shift()},e.params=function(t){return t.split(/ *; */).reduce(function(t,e){var n=e.split(/ *= */),r=n.shift(),i=n.shift();return r&&i&&(t[r]=i),t},{})},e.parseLinks=function(t){return t.split(/ *, */).reduce(function(t,e){var n=e.split(/ *; */),r=n[0].slice(1,-1),i=n[1].split(/ *= */)[1].slice(1,-1);return t[i]=r,t},{})},e.cleanHeader=function(t,e){return delete t["content-type"],delete t["content-length"],delete t["transfer-encoding"],delete t["host"],e&&(delete t["authorization"],delete t["cookie"]),t}},ol8x:function(t,e,n){var r=n("dyZX"),i=r.navigator;t.exports=i&&i.userAgent||""},oyJW:function(t,e,n){"use strict";function r(t,e,n){return e in t?Object.defineProperty(t,e,{value:n,enumerable:!0,configurable:!0,writable:!0}):t[e]=n,t}n.d(e,"a",function(){return r})},pbhE:function(t,e,n){"use strict";var r=n("2OiF");function i(t){var e,n;this.promise=new t(function(t,r){if(void 0!==e||void 0!==n)throw TypeError("Bad Promise constructor");e=t,n=r}),this.resolve=r(e),this.reject=r(n)}t.exports.f=function(t){return new i(t)}},quPj:function(t,e,n){var r=n("0/R4"),i=n("LZWt"),o=n("K0xU")("match");t.exports=function(t){var e;return r(t)&&(void 0!==(e=t[o])?!!e:"RegExp"==i(t))}},rGqo:function(t,e,n){for(var r=n("yt8O"),i=n("DVgA"),o=n("KroJ"),a=n("dyZX"),u=n("Mukb"),s=n("hPIQ"),c=n("K0xU"),l=c("iterator"),f=c("toStringTag"),p=s.Array,h={CSSRuleList:!0,CSSStyleDeclaration:!1,CSSValueList:!1,ClientRectList:!1,DOMRectList:!1,DOMStringList:!1,DOMTokenList:!0,DataTransferItemList:!1,FileList:!1,HTMLAllCollection:!1,HTMLCollection:!1,HTMLFormElement:!1,HTMLSelectElement:!1,MediaList:!0,MimeTypeArray:!1,NamedNodeMap:!1,NodeList:!0,PaintRequestList:!1,Plugin:!1,PluginArray:!1,SVGLengthList:!1,SVGNumberList:!1,SVGPathSegList:!1,SVGPointList:!1,SVGStringList:!1,SVGTransformList:!1,SourceBufferList:!1,StyleSheetList:!0,TextTrackCueList:!1,TextTrackList:!1,TouchList:!1},d=i(h),v=0;vl)if(u=s[l++],u!=u)return!0}else for(;c>l;l++)if((t||l in s)&&s[l]===n)return t||l||0;return!t&&-1}}},xpql:function(t,e,n){t.exports=!n("nh4g")&&!n("eeVq")(function(){return 7!=Object.defineProperty(n("Iw71")("div"),"a",{get:function(){return 7}}).a})},y3w9:function(t,e,n){var r=n("0/R4");t.exports=function(t){if(!r(t))throw TypeError(t+" is not an object!");return t}},yLpj:function(t,e){var n;n=function(){return this}();try{n=n||Function("return this")()||(0,eval)("this")}catch(t){"object"===typeof window&&(n=window)}t.exports=n},yT7P:function(t,e,n){"use strict";n.d(e,"a",function(){return i});var r=n("oyJW");function i(t){for(var e=1;e=t.length?(this._t=void 0,i(1)):i(0,"keys"==e?n:"values"==e?t[n]:[n,t[n]])},"values"),o.Arguments=o.Array,r("keys"),r("values"),r("entries")},zRwo:function(t,e,n){var r=n("6FMO");t.exports=function(t,e){return new(r(t))(e)}},zhAb:function(t,e,n){var r=n("aagx"),i=n("aCFj"),o=n("w2a5")(!1),a=n("YTvA")("IE_PROTO");t.exports=function(t,e){var n,u=i(t),s=0,c=[];for(n in u)n!=a&&r(u,n)&&c.push(n);while(e.length>s)r(u,n=e[s++])&&(~o(c,n)||c.push(n));return c}}}]); +//# sourceMappingURL=chunk-vendors.f8e19183.js.map \ No newline at end of file diff --git a/web/vue/dist/js/chunk-vendors.f8e19183.js.map b/web/vue/dist/js/chunk-vendors.f8e19183.js.map new file mode 100644 index 000000000..8eb6de9c3 --- /dev/null +++ b/web/vue/dist/js/chunk-vendors.f8e19183.js.map @@ -0,0 +1 @@ +{"version":3,"sources":["webpack:///./node_modules/core-js/modules/_html.js","webpack:///./node_modules/superagent/lib/response-base.js","webpack:///./node_modules/core-js/modules/_is-object.js","webpack:///./node_modules/core-js/modules/_string-context.js","webpack:///./node_modules/core-js/modules/_iter-step.js","webpack:///./node_modules/superagent/lib/client.js","webpack:///./node_modules/core-js/modules/_a-function.js","webpack:///./node_modules/core-js/modules/_redefine-all.js","webpack:///./node_modules/core-js/modules/_enum-bug-keys.js","webpack:///./node_modules/core-js/modules/_species-constructor.js","webpack:///./node_modules/core-js/modules/_array-species-constructor.js","webpack:///./node_modules/superagent/lib/is-object.js","webpack:///./node_modules/core-js/modules/es6.object.assign.js","webpack:///./node_modules/core-js/modules/_an-instance.js","webpack:///./node_modules/core-js/modules/_iter-define.js","webpack:///./node_modules/core-js/modules/_flags.js","webpack:///./node_modules/core-js/modules/_array-methods.js","webpack:///./node_modules/core-js/modules/_object-keys.js","webpack:///./node_modules/marked/lib/marked.js","webpack:///./node_modules/core-js/modules/_is-array.js","webpack:///./node_modules/core-js/modules/_object-dps.js","webpack:///./node_modules/core-js/modules/_task.js","webpack:///./node_modules/core-js/modules/_iter-call.js","webpack:///./node_modules/core-js/modules/_classof.js","webpack:///./node_modules/core-js/modules/es6.array.find-index.js","webpack:///./node_modules/core-js/modules/_dom-create.js","webpack:///./node_modules/core-js/modules/core.get-iterator-method.js","webpack:///./node_modules/core-js/modules/_object-gops.js","webpack:///./node_modules/core-js/modules/_wks.js","webpack:///./node_modules/vue-loader/lib/runtime/componentNormalizer.js","webpack:///./node_modules/core-js/modules/_redefine.js","webpack:///./node_modules/core-js/modules/_object-create.js","webpack:///./node_modules/vue/dist/vue.runtime.esm.js","webpack:///./node_modules/vuex/dist/vuex.esm.js","webpack:///./node_modules/core-js/modules/es6.string.includes.js","webpack:///./node_modules/core-js/modules/_library.js","webpack:///./node_modules/core-js/modules/_cof.js","webpack:///./node_modules/lodash/lodash.js","webpack:///./node_modules/core-js/modules/_strict-method.js","webpack:///./node_modules/core-js/modules/_is-array-iter.js","webpack:///./node_modules/core-js/modules/_invoke.js","webpack:///./node_modules/core-js/modules/_hide.js","webpack:///./node_modules/core-js/modules/es6.regexp.flags.js","webpack:///./node_modules/core-js/modules/_object-gpo.js","webpack:///./node_modules/core-js/modules/_iter-create.js","webpack:///./node_modules/core-js/modules/_to-integer.js","webpack:///./node_modules/core-js/modules/_property-desc.js","webpack:///./node_modules/core-js/modules/_to-object.js","webpack:///./node_modules/core-js/modules/_for-of.js","webpack:///./node_modules/superagent-no-cache/index.js","webpack:///./node_modules/core-js/modules/_fails-is-regexp.js","webpack:///./node_modules/core-js/modules/_object-pie.js","webpack:///./node_modules/core-js/modules/es6.promise.js","webpack:///./node_modules/core-js/modules/_shared.js","webpack:///./node_modules/core-js/modules/es6.array.sort.js","webpack:///./node_modules/core-js/modules/_export.js","webpack:///./node_modules/core-js/modules/_iter-detect.js","webpack:///./node_modules/core-js/modules/_shared-key.js","webpack:///./node_modules/core-js/modules/_iobject.js","webpack:///(webpack)/buildin/module.js","webpack:///./node_modules/core-js/modules/es7.array.includes.js","webpack:///./node_modules/core-js/modules/es6.regexp.to-string.js","webpack:///./node_modules/core-js/modules/_to-iobject.js","webpack:///./node_modules/core-js/modules/_has.js","webpack:///./node_modules/core-js/modules/_to-primitive.js","webpack:///./node_modules/component-emitter/index.js","webpack:///./node_modules/core-js/modules/_object-assign.js","webpack:///./node_modules/core-js/modules/_to-absolute-index.js","webpack:///./node_modules/core-js/modules/es6.array.find.js","webpack:///./node_modules/core-js/modules/_global.js","webpack:///./node_modules/core-js/modules/_fails.js","webpack:///./node_modules/core-js/modules/_set-species.js","webpack:///./node_modules/core-js/modules/es6.function.name.js","webpack:///./node_modules/core-js/modules/_set-to-string-tag.js","webpack:///./node_modules/core-js/modules/_core.js","webpack:///./node_modules/core-js/modules/_microtask.js","webpack:///./node_modules/core-js/modules/_iterators.js","webpack:///./node_modules/component-ie/index.js","webpack:///./node_modules/core-js/modules/_object-dp.js","webpack:///./node_modules/vue-router/dist/vue-router.esm.js","webpack:///./node_modules/@babel/runtime/helpers/builtin/es6/arrayWithHoles.js","webpack:///./node_modules/@babel/runtime/helpers/builtin/es6/iterableToArrayLimit.js","webpack:///./node_modules/@babel/runtime/helpers/builtin/es6/nonIterableRest.js","webpack:///./node_modules/@babel/runtime/helpers/builtin/es6/slicedToArray.js","webpack:///./node_modules/superagent/lib/request-base.js","webpack:///./node_modules/core-js/modules/_ctx.js","webpack:///./node_modules/core-js/modules/_add-to-unscopables.js","webpack:///./node_modules/core-js/modules/_perform.js","webpack:///./node_modules/superagent/lib/agent-base.js","webpack:///./node_modules/core-js/modules/_to-length.js","webpack:///./node_modules/core-js/modules/_descriptors.js","webpack:///./node_modules/superagent/lib/utils.js","webpack:///./node_modules/core-js/modules/_user-agent.js","webpack:///./node_modules/@babel/runtime/helpers/builtin/es6/defineProperty.js","webpack:///./node_modules/core-js/modules/_new-promise-capability.js","webpack:///./node_modules/core-js/modules/_is-regexp.js","webpack:///./node_modules/core-js/modules/web.dom.iterable.js","webpack:///./node_modules/core-js/modules/_promise-resolve.js","webpack:///./node_modules/core-js/modules/_defined.js","webpack:///./node_modules/core-js/modules/_array-includes.js","webpack:///./node_modules/core-js/modules/_ie8-dom-define.js","webpack:///./node_modules/core-js/modules/_an-object.js","webpack:///(webpack)/buildin/global.js","webpack:///./node_modules/@babel/runtime/helpers/builtin/es6/objectSpread.js","webpack:///./node_modules/core-js/modules/_uid.js","webpack:///./node_modules/core-js/modules/es6.array.iterator.js","webpack:///./node_modules/core-js/modules/_array-species-create.js","webpack:///./node_modules/core-js/modules/_object-keys-internal.js"],"names":["document","__webpack_require__","module","exports","documentElement","utils","ResponseBase","obj","mixin","key","prototype","get","field","this","header","toLowerCase","_setHeaderProperties","ct","type","params","links","link","parseLinks","err","_setStatusProperties","status","statusCode","statusType","info","ok","redirect","clientError","serverError","error","toError","created","accepted","noContent","badRequest","unauthorized","notAcceptable","forbidden","notFound","unprocessableEntity","it","isRegExp","defined","that","searchString","NAME","TypeError","String","done","value","root","window","self","console","warn","Emitter","RequestBase","isObject","Agent","noop","request","method","url","Request","end","arguments","length","getXHR","XMLHttpRequest","location","protocol","ActiveXObject","e","Error","trim","s","replace","serialize","pairs","pushEncodedKeyValuePair","join","val","Array","isArray","forEach","v","subkey","push","encodeURIComponent","parseString","str","pair","pos","split","i","len","indexOf","decodeURIComponent","slice","parseHeader","index","line","lines","fields","isJSON","mime","test","Response","req","xhr","text","responseType","responseText","statusText","headers","getAllResponseHeaders","getResponseHeader","_responseType","body","response","_parseBody","_query","_header","on","new_err","res","parse","original","rawResponse","callback","emit","_isResponseOK","custom_err","del","data","fn","send","serializeObject","types","html","json","xml","urlencoded","form","form-data","application/x-www-form-urlencoded","application/json","JSON","stringify","_parser","Object","msg","set","accept","auth","user","pass","options","btoa","encoder","string","_auth","query","attach","file","_data","_getFormData","append","name","_formData","FormData","_shouldRetry","_retry","_callback","clearTimeout","_maxRetries","retries","_retries","crossDomainError","crossDomain","buffer","ca","agent","pipe","write","_isHost","toString","call","_endCalled","_finalizeQueryString","_end","_setTimeouts","onreadystatechange","readyState","_responseTimeoutTimer","timedout","_aborted","handleProgress","direction","total","percent","loaded","hasListeners","onprogress","bind","upload","username","password","open","_withCredentials","withCredentials","contentType","_serializer","hasOwnProperty","setRequestHeader","_setDefaults","head","patch","post","put","redefine","target","src","safe","anObject","aFunction","SPECIES","O","D","S","C","constructor","undefined","$export","F","assign","Constructor","forbiddenField","LIBRARY","hide","Iterators","$iterCreate","setToStringTag","getPrototypeOf","ITERATOR","BUGGY","keys","FF_ITERATOR","KEYS","VALUES","returnThis","Base","next","DEFAULT","IS_SET","FORCED","methods","IteratorPrototype","getMethod","kind","proto","TAG","DEF_VALUES","VALUES_BUG","$native","$default","$entries","$anyNative","entries","values","P","result","global","ignoreCase","multiline","unicode","sticky","ctx","IObject","toObject","toLength","asc","TYPE","$create","IS_MAP","IS_FILTER","IS_SOME","IS_EVERY","IS_FIND_INDEX","NO_HOLES","create","$this","callbackfn","f","$keys","enumBugKeys","block","newline","code","fences","hr","heading","nptable","blockquote","list","def","table","lheading","paragraph","Lexer","tokens","marked","defaults","rules","normal","pedantic","gfm","tables","_label","_title","edit","getRegex","bullet","item","source","_tag","_comment","merge","lex","lexer","token","top","loose","cap","bull","b","space","tag","l","isordered","istask","ischecked","exec","substring","lang","depth","splitCells","align","cells","ordered","start","match","RegExp","smartLists","charAt","task","checked","sanitize","pre","sanitizer","href","title","charCodeAt","inline","escape","autolink","reflink","nolink","strong","em","br","InlineLexer","renderer","Renderer","breaks","TextRenderer","Parser","encode","unescape","_","n","fromCharCode","parseInt","regex","opt","resolveUrl","base","baseUrls","_escapes","_scheme","_email","_attribute","_href","_backpedal","output","out","mangle","inLink","outputLink","escapes","codespan","smartypants","image","ch","Math","random","escaped","highlight","langPrefix","quote","level","raw","headerIds","headerPrefix","xhtml","startatt","listitem","checkbox","tablerow","content","tablecell","flags","prot","baseUrl","originIndependentUrl","encodeURI","parser","inlineText","reverse","tok","pop","peek","parseText","row","cell","j","tableRow","count","splice","pending","message","silent","setOptions","getDefaults","inlineLexer","cof","arg","dP","getKeys","defineProperties","Properties","defer","channel","port","invoke","cel","process","setTask","setImmediate","clearTask","clearImmediate","MessageChannel","Dispatch","counter","queue","ONREADYSTATECHANGE","run","id","listener","event","args","Function","nextTick","now","port2","port1","onmessage","postMessage","addEventListener","importScripts","appendChild","removeChild","setTimeout","clear","iterator","ret","ARG","tryGet","T","B","callee","$find","KEY","forced","findIndex","is","createElement","classof","getIteratorMethod","getOwnPropertySymbols","store","uid","Symbol","USE_SYMBOL","$exports","normalizeComponent","scriptExports","render","staticRenderFns","functionalTemplate","injectStyles","scopeId","moduleIdentifier","shadowMode","hook","_compiled","functional","_scopeId","context","$vnode","ssrContext","parent","__VUE_SSR_CONTEXT__","_registeredComponents","add","_ssrRegister","$root","$options","shadowRoot","_injectStyles","originalRender","h","existing","beforeCreate","concat","d","__webpack_exports__","has","SRC","TO_STRING","$toString","TPL","inspectSource","isFunction","dPs","IE_PROTO","Empty","PROTOTYPE","createDict","iframeDocument","iframe","lt","gt","style","display","contentWindow","close","emptyObject","freeze","isUndef","isDef","isTrue","isFalse","isPrimitive","_toString","isPlainObject","isValidArrayIndex","parseFloat","floor","isFinite","toNumber","isNaN","makeMap","expectsLowerCase","map","isReservedAttribute","remove","arr","hasOwn","cached","cache","hit","camelizeRE","camelize","c","toUpperCase","capitalize","hyphenateRE","hyphenate","polyfillBind","boundFn","a","apply","_length","nativeBind","toArray","extend","to","_from","no","identity","looseEqual","isObjectA","isObjectB","isArrayA","isArrayB","every","keysA","keysB","looseIndexOf","once","called","SSR_ATTR","ASSET_TYPES","LIFECYCLE_HOOKS","config","optionMergeStrategies","productionTip","devtools","performance","errorHandler","warnHandler","ignoredElements","keyCodes","isReservedTag","isReservedAttr","isUnknownElement","getTagNamespace","parsePlatformTagName","mustUseProp","_lifecycleHooks","isReserved","enumerable","defineProperty","writable","configurable","bailRE","parsePath","path","segments","_isServer","hasProto","inBrowser","inWeex","WXEnvironment","platform","weexPlatform","UA","navigator","userAgent","isIE","isIE9","isEdge","isIOS","nativeWatch","watch","supportsPassive","opts","isServerRendering","env","VUE_ENV","__VUE_DEVTOOLS_GLOBAL_HOOK__","isNative","Ctor","_Set","hasSymbol","Reflect","ownKeys","Set","Dep","subs","addSub","sub","removeSub","depend","addDep","notify","update","targetStack","pushTarget","_target","popTarget","VNode","children","elm","componentOptions","asyncFactory","ns","fnContext","fnOptions","fnScopeId","componentInstance","isStatic","isRootInsert","isComment","isCloned","isOnce","asyncMeta","isAsyncPlaceholder","prototypeAccessors","child","createEmptyVNode","node","createTextVNode","cloneVNode","vnode","cloned","arrayProto","arrayMethods","methodsToPatch","inserted","ob","__ob__","observeArray","dep","arrayKeys","getOwnPropertyNames","shouldObserve","toggleObserving","Observer","vmCount","augment","protoAugment","copyAugment","walk","__proto__","observe","asRootData","isExtensible","_isVue","defineReactive","customSetter","shallow","property","getOwnPropertyDescriptor","getter","setter","childOb","dependArray","newVal","max","items","strats","mergeData","from","toVal","fromVal","mergeDataOrFn","parentVal","childVal","vm","instanceData","defaultData","mergeHook","mergeAssets","key$1","props","inject","computed","provide","defaultStrat","normalizeProps","normalizeInject","normalized","normalizeDirectives","dirs","directives","mergeOptions","extendsFrom","extends","mixins","mergeField","strat","resolveAsset","warnMissing","assets","camelizedId","PascalCaseId","validateProp","propOptions","propsData","prop","absent","booleanIndex","getTypeIndex","Boolean","stringIndex","getPropDefaultValue","prevShouldObserve","default","_props","getType","isSameType","expectedTypes","handleError","cur","$parent","hooks","errorCaptured","capture","globalHandleError","logError","microTimerFunc","macroTimerFunc","callbacks","flushCallbacks","copies","useMacroTask","Promise","p","resolve","then","withMacroTask","_withTask","cb","_resolve","seenObjects","traverse","_traverse","seen","isA","isFrozen","depId","normalizeEvent","passive","once$$1","createFnInvoker","fns","invoker","arguments$1","updateListeners","oldOn","remove$$1","old","mergeVNodeHook","hookKey","oldHook","wrappedHook","merged","extractPropsFromVNodeData","attrs","altKey","checkProp","hash","preserve","simpleNormalizeChildren","normalizeChildren","normalizeArrayChildren","isTextNode","nestedIndex","lastIndex","last","shift","_isVList","ensureCtor","comp","__esModule","toStringTag","createAsyncPlaceholder","factory","resolveAsyncComponent","baseCtor","errorComp","resolved","loading","loadingComp","contexts","sync","forceRender","$forceUpdate","reject","reason","component","delay","timeout","getFirstComponentChild","initEvents","_events","_hasHookEvent","listeners","_parentListeners","updateComponentListeners","$once","$on","remove$1","$off","oldListeners","eventsMixin","Vue","hookRE","this$1","cbs","i$1","$emit","resolveSlots","slots","slot","name$1","isWhitespace","resolveScopedSlots","activeInstance","initLifecycle","abstract","$children","$refs","_watcher","_inactive","_directInactive","_isMounted","_isDestroyed","_isBeingDestroyed","lifecycleMixin","_update","hydrating","callHook","prevEl","$el","prevVnode","_vnode","prevActiveInstance","__patch__","_parentElm","_refElm","__vue__","$destroy","teardown","_watchers","mountComponent","el","updateComponent","_render","Watcher","updateChildComponent","parentVnode","renderChildren","hasChildren","_renderChildren","scopedSlots","$scopedSlots","_parentVnode","$attrs","$listeners","propKeys","_propKeys","$slots","isInInactiveTree","activateChildComponent","direct","deactivateChildComponent","handlers","activatedChildren","waiting","flushing","resetSchedulerState","flushSchedulerQueue","watcher","sort","activatedQueue","updatedQueue","callActivatedHooks","callUpdatedHooks","queueActivatedComponent","queueWatcher","uid$1","expOrFn","isRenderWatcher","deep","lazy","active","dirty","deps","newDeps","depIds","newDepIds","expression","cleanupDeps","tmp","oldValue","evaluate","sharedPropertyDefinition","proxy","sourceKey","initState","initProps","initMethods","initData","initComputed","initWatch","propsOptions","isRoot","loop","getData","computedWatcherOptions","watchers","_computedWatchers","isSSR","userDef","defineComputed","shouldCache","createComputedGetter","handler","createWatcher","$watch","stateMixin","dataDef","propsDef","$set","$delete","immediate","initProvide","_provided","initInjections","resolveInject","filter","provideKey","provideDefault","renderList","renderSlot","fallback","bindObject","nodes","scopedSlotFn","slotNodes","_rendered","$createElement","resolveFilter","isKeyNotMatch","expect","actual","checkKeyCodes","eventKeyCode","builtInKeyCode","eventKeyName","builtInKeyName","mappedKeyCode","bindObjectProps","asProp","isSync","domProps","$event","renderStatic","isInFor","_staticTrees","tree","_renderProxy","markStatic","markOnce","markStaticNode","bindObjectListeners","ours","installRenderHelpers","_o","_n","_s","_l","_t","_q","_i","_m","_f","_k","_b","_v","_e","_u","_g","FunctionalRenderContext","contextVm","_original","isCompiled","needNormalization","injections","_c","createFunctionalComponent","mergeProps","renderContext","cloneAndMarkFunctionalResult","vnodes","clone","componentVNodeHooks","init","parentElm","refElm","keepAlive","mountedNode","prepatch","createComponentInstanceForVnode","$mount","oldVnode","insert","destroy","hooksToMerge","createComponent","_base","cid","resolveConstructorOptions","model","transformModel","nativeOn","installComponentHooks","_isComponent","inlineTemplate","SIMPLE_NORMALIZE","ALWAYS_NORMALIZE","normalizationType","alwaysNormalize","_createElement","applyNS","registerDeepBindings","force","class","initRender","parentData","renderMixin","$nextTick","ref","uid$3","initMixin","_init","_uid","initInternalComponent","_self","vnodeComponentOptions","_componentTag","super","superOptions","cachedSuperOptions","modifiedOptions","resolveModifiedOptions","extendOptions","components","modified","latest","extended","sealed","sealedOptions","dedupe","initUse","use","plugin","installedPlugins","_installedPlugins","unshift","install","initMixin$1","initExtend","Super","SuperId","cachedCtors","_Ctor","Sub","initProps$1","initComputed$1","Comp","initAssetRegisters","definition","getComponentName","matches","pattern","pruneCache","keepAliveInstance","cachedNode","pruneCacheEntry","current","cached$$1","patternTypes","KeepAlive","include","exclude","Number","destroyed","mounted","ref$1","builtInComponents","initGlobalAPI","configDef","util","delete","version","acceptValue","attr","isEnumeratedAttr","isBooleanAttr","xlinkNS","isXlink","getXlinkProp","isFalsyAttrValue","genClassForVnode","parentNode","childNode","mergeClassData","renderClass","staticClass","dynamicClass","stringifyClass","stringifyArray","stringifyObject","stringified","namespaceMap","svg","math","isHTMLTag","isSVG","unknownElementCache","HTMLUnknownElement","HTMLElement","isTextInputType","selected","querySelector","createElement$1","tagName","multiple","setAttribute","createElementNS","namespace","createTextNode","createComment","insertBefore","newNode","referenceNode","nextSibling","setTextContent","textContent","setStyleScope","nodeOps","registerRef","isRemoval","refs","refInFor","emptyNode","sameVnode","sameInputType","typeA","typeB","createKeyToOldIdx","beginIdx","endIdx","createPatchFunction","backend","modules","emptyNodeAt","createRmCb","childElm","removeNode","createElm","insertedVnodeQueue","nested","ownerArray","setScope","createChildren","invokeCreateHooks","isReactivated","initComponent","reactivateComponent","pendingInsert","isPatchable","innerNode","transition","activate","ref$$1","ancestor","addVnodes","startIdx","invokeDestroyHook","removeVnodes","removeAndInvokeRemoveHook","rm","updateChildren","oldCh","newCh","removeOnly","oldKeyToIdx","idxInOld","vnodeToMove","oldStartIdx","newStartIdx","oldEndIdx","oldStartVnode","oldEndVnode","newEndIdx","newStartVnode","newEndVnode","canMove","patchVnode","findIdxInOld","hydrate","postpatch","invokeInsertHook","initial","isRenderedModule","inVPre","hasChildNodes","innerHTML","childrenMatch","firstChild","fullInvoke","isInitialPatch","isRealElement","nodeType","hasAttribute","removeAttribute","oldElm","parentElm$1","_leaveCb","patchable","i$2","updateDirectives","oldDir","dir","isCreate","isDestroy","oldDirs","normalizeDirectives$1","newDirs","dirsWithInsert","dirsWithPostpatch","callHook$1","componentUpdated","callInsert","emptyModifiers","modifiers","getRawDirName","rawName","baseModules","updateAttrs","inheritAttrs","oldAttrs","setAttr","removeAttributeNS","baseSetAttr","setAttributeNS","__ieph","blocker","stopImmediatePropagation","removeEventListener","updateClass","oldData","cls","transitionClass","_transitionClasses","_prevClass","target$1","klass","RANGE_TOKEN","CHECKBOX_RADIO_TOKEN","normalizeEvents","change","createOnceHandler","onceHandler","remove$2","add$1","updateDOMListeners","events","updateDOMProps","oldProps","childNodes","_value","strCur","shouldUpdateValue","checkVal","composing","isNotInFocusAndDirty","isDirtyWithModifiers","notInFocus","activeElement","_vModifiers","number","parseStyleText","cssText","listDelimiter","propertyDelimiter","normalizeStyleData","normalizeStyleBinding","staticStyle","bindingStyle","getStyle","checkChild","styleData","emptyStyle","cssVarRE","importantRE","setProp","setProperty","normalizedName","normalize","vendorNames","capName","updateStyle","oldStaticStyle","oldStyleBinding","normalizedStyle","oldStyle","newStyle","addClass","classList","getAttribute","removeClass","tar","resolveTransition","css","autoCssTransition","enterClass","enterToClass","enterActiveClass","leaveClass","leaveToClass","leaveActiveClass","hasTransition","TRANSITION","ANIMATION","transitionProp","transitionEndEvent","animationProp","animationEndEvent","ontransitionend","onwebkittransitionend","onanimationend","onwebkitanimationend","raf","requestAnimationFrame","nextFrame","addTransitionClass","transitionClasses","removeTransitionClass","whenTransitionEnds","expectedType","getTransitionInfo","propCount","ended","onEnd","transformRE","styles","getComputedStyle","transitionDelays","transitionDurations","transitionTimeout","getTimeout","animationDelays","animationDurations","animationTimeout","hasTransform","delays","durations","toMs","enter","toggleDisplay","cancelled","_enterCb","appearClass","appearToClass","appearActiveClass","beforeEnter","afterEnter","enterCancelled","beforeAppear","appear","afterAppear","appearCancelled","duration","transitionNode","isAppear","startClass","activeClass","toClass","beforeEnterHook","enterHook","afterEnterHook","enterCancelledHook","explicitEnterDuration","expectsCSS","userWantsControl","getHookArgumentsLength","show","pendingNode","_pending","isValidDuration","leave","beforeLeave","afterLeave","leaveCancelled","delayLeave","explicitLeaveDuration","performLeave","invokerFns","_enter","platformModules","vmodel","trigger","directive","binding","_vOptions","setSelected","getValue","onCompositionStart","onCompositionEnd","prevOptions","curOptions","some","o","needReset","hasNoMatchingOption","actuallySetSelected","isMultiple","option","selectedIndex","createEvent","initEvent","dispatchEvent","locateNode","transition$$1","originalDisplay","__vOriginalDisplay","unbind","platformDirectives","transitionProps","mode","getRealChild","compOptions","extractTransitionData","placeholder","rawChild","hasParentTransition","isSameChild","oldChild","Transition","_leaving","oldRawChild","delayedLeave","moveClass","TransitionGroup","prevChildren","rawChildren","transitionData","kept","removed","c$1","getBoundingClientRect","beforeUpdate","updated","hasMove","callPendingCbs","recordPosition","applyTranslation","_reflow","offsetHeight","moved","transform","WebkitTransform","transitionDuration","_moveCb","propertyName","_hasMove","cloneNode","newPos","oldPos","dx","left","dy","platformComponents","applyMixin","vuexInit","$store","devtoolHook","devtoolPlugin","_devtoolHook","targetState","replaceState","subscribe","mutation","state","forEachValue","isPromise","Module","rawModule","runtime","_children","_rawModule","rawState","prototypeAccessors$1","namespaced","addChild","getChild","actions","mutations","getters","forEachChild","forEachGetter","forEachAction","forEachMutation","ModuleCollection","rawRootModule","register","targetModule","newModule","reduce","getNamespace","rawChildModule","unregister","Store","plugins","strict","_committing","_actions","_actionSubscribers","_mutations","_wrappedGetters","_modules","_modulesNamespaceMap","_subscribers","_watcherVM","dispatch","commit","payload","installModule","resetStoreVM","genericSubscribe","resetStore","hot","oldVm","_vm","wrappedGetters","$$state","enableStrictMode","_withCommit","rootState","parentState","getNestedState","moduleName","local","makeLocalContext","namespacedType","registerMutation","action","registerAction","registerGetter","noNamespace","_type","_payload","_options","unifyObjectStyle","makeLocalGetters","gettersProxy","splitPos","localType","entry","rootGetters","catch","rawGetter","_Vue","all","subscribeAction","registerModule","preserveState","unregisterModule","hotUpdate","newOptions","committing","mapState","normalizeNamespace","states","normalizeMap","getModuleByNamespace","vuex","mapMutations","mapGetters","mapActions","createNamespacedHelpers","helper","index_esm","INCLUDES","includes","__WEBPACK_AMD_DEFINE_RESULT__","VERSION","LARGE_ARRAY_SIZE","CORE_ERROR_TEXT","FUNC_ERROR_TEXT","HASH_UNDEFINED","MAX_MEMOIZE_SIZE","PLACEHOLDER","CLONE_DEEP_FLAG","CLONE_FLAT_FLAG","CLONE_SYMBOLS_FLAG","COMPARE_PARTIAL_FLAG","COMPARE_UNORDERED_FLAG","WRAP_BIND_FLAG","WRAP_BIND_KEY_FLAG","WRAP_CURRY_BOUND_FLAG","WRAP_CURRY_FLAG","WRAP_CURRY_RIGHT_FLAG","WRAP_PARTIAL_FLAG","WRAP_PARTIAL_RIGHT_FLAG","WRAP_ARY_FLAG","WRAP_REARG_FLAG","WRAP_FLIP_FLAG","DEFAULT_TRUNC_LENGTH","DEFAULT_TRUNC_OMISSION","HOT_COUNT","HOT_SPAN","LAZY_FILTER_FLAG","LAZY_MAP_FLAG","LAZY_WHILE_FLAG","INFINITY","MAX_SAFE_INTEGER","MAX_INTEGER","NAN","MAX_ARRAY_LENGTH","MAX_ARRAY_INDEX","HALF_MAX_ARRAY_LENGTH","wrapFlags","argsTag","arrayTag","asyncTag","boolTag","dateTag","domExcTag","errorTag","funcTag","genTag","mapTag","numberTag","nullTag","objectTag","promiseTag","proxyTag","regexpTag","setTag","stringTag","symbolTag","undefinedTag","weakMapTag","weakSetTag","arrayBufferTag","dataViewTag","float32Tag","float64Tag","int8Tag","int16Tag","int32Tag","uint8Tag","uint8ClampedTag","uint16Tag","uint32Tag","reEmptyStringLeading","reEmptyStringMiddle","reEmptyStringTrailing","reEscapedHtml","reUnescapedHtml","reHasEscapedHtml","reHasUnescapedHtml","reEscape","reEvaluate","reInterpolate","reIsDeepProp","reIsPlainProp","rePropName","reRegExpChar","reHasRegExpChar","reTrim","reTrimStart","reTrimEnd","reWrapComment","reWrapDetails","reSplitDetails","reAsciiWord","reEscapeChar","reEsTemplate","reFlags","reIsBadHex","reIsBinary","reIsHostCtor","reIsOctal","reIsUint","reLatin","reNoMatch","reUnescapedString","rsAstralRange","rsComboMarksRange","reComboHalfMarksRange","rsComboSymbolsRange","rsComboRange","rsDingbatRange","rsLowerRange","rsMathOpRange","rsNonCharRange","rsPunctuationRange","rsSpaceRange","rsUpperRange","rsVarRange","rsBreakRange","rsApos","rsAstral","rsBreak","rsCombo","rsDigits","rsDingbat","rsLower","rsMisc","rsFitz","rsModifier","rsNonAstral","rsRegional","rsSurrPair","rsUpper","rsZWJ","rsMiscLower","rsMiscUpper","rsOptContrLower","rsOptContrUpper","reOptMod","rsOptVar","rsOptJoin","rsOrdLower","rsOrdUpper","rsSeq","rsEmoji","rsSymbol","reApos","reComboMark","reUnicode","reUnicodeWord","reHasUnicode","reHasUnicodeWord","contextProps","templateCounter","typedArrayTags","cloneableTags","deburredLetters","À","Á","Â","Ã","Ä","Å","à","á","â","ã","ä","å","Ç","ç","Ð","ð","È","É","Ê","Ë","è","é","ê","ë","Ì","Í","Î","Ï","ì","í","î","ï","Ñ","ñ","Ò","Ó","Ô","Õ","Ö","Ø","ò","ó","ô","õ","ö","ø","Ù","Ú","Û","Ü","ù","ú","û","ü","Ý","ý","ÿ","Æ","æ","Þ","þ","ß","Ā","Ă","Ą","ā","ă","ą","Ć","Ĉ","Ċ","Č","ć","ĉ","ċ","č","Ď","Đ","ď","đ","Ē","Ĕ","Ė","Ę","Ě","ē","ĕ","ė","ę","ě","Ĝ","Ğ","Ġ","Ģ","ĝ","ğ","ġ","ģ","Ĥ","Ħ","ĥ","ħ","Ĩ","Ī","Ĭ","Į","İ","ĩ","ī","ĭ","į","ı","Ĵ","ĵ","Ķ","ķ","ĸ","Ĺ","Ļ","Ľ","Ŀ","Ł","ĺ","ļ","ľ","ŀ","ł","Ń","Ņ","Ň","Ŋ","ń","ņ","ň","ŋ","Ō","Ŏ","Ő","ō","ŏ","ő","Ŕ","Ŗ","Ř","ŕ","ŗ","ř","Ś","Ŝ","Ş","Š","ś","ŝ","ş","š","Ţ","Ť","Ŧ","ţ","ť","ŧ","Ũ","Ū","Ŭ","Ů","Ű","Ų","ũ","ū","ŭ","ů","ű","ų","Ŵ","ŵ","Ŷ","ŷ","Ÿ","Ź","Ż","Ž","ź","ż","ž","IJ","ij","Œ","œ","ʼn","ſ","htmlEscapes","&","<",">","\"","'","htmlUnescapes","&","<",">",""","'","stringEscapes","\\","\n","\r","
","
","freeParseFloat","freeParseInt","freeGlobal","freeSelf","freeExports","freeModule","moduleExports","freeProcess","nodeUtil","require","nodeIsArrayBuffer","isArrayBuffer","nodeIsDate","isDate","nodeIsMap","isMap","nodeIsRegExp","nodeIsSet","isSet","nodeIsTypedArray","isTypedArray","func","thisArg","arrayAggregator","array","iteratee","accumulator","arrayEach","arrayEachRight","arrayEvery","predicate","arrayFilter","resIndex","arrayIncludes","baseIndexOf","arrayIncludesWith","comparator","arrayMap","arrayPush","offset","arrayReduce","initAccum","arrayReduceRight","arraySome","asciiSize","baseProperty","asciiToArray","asciiWords","baseFindKey","collection","eachFunc","baseFindIndex","fromIndex","fromRight","strictIndexOf","baseIsNaN","baseIndexOfWith","baseMean","baseSum","object","basePropertyOf","baseReduce","baseSortBy","comparer","baseTimes","baseToPairs","baseUnary","baseValues","cacheHas","charsStartIndex","strSymbols","chrSymbols","charsEndIndex","countHolders","deburrLetter","escapeHtmlChar","escapeStringChar","chr","hasUnicode","hasUnicodeWord","iteratorToArray","mapToArray","size","overArg","replaceHolders","safeGet","setToArray","setToPairs","strictLastIndexOf","stringSize","unicodeSize","stringToArray","unicodeToArray","unescapeHtmlChar","unicodeWords","runInContext","pick","Date","funcProto","objectProto","coreJsData","funcToString","idCounter","maskSrcKey","nativeObjectToString","objectCtorString","oldDash","reIsNative","Buffer","Uint8Array","allocUnsafe","getPrototype","objectCreate","propertyIsEnumerable","spreadableSymbol","isConcatSpreadable","symIterator","symToStringTag","getNative","ctxClearTimeout","ctxNow","ctxSetTimeout","nativeCeil","ceil","nativeFloor","nativeGetSymbols","nativeIsBuffer","isBuffer","nativeIsFinite","nativeJoin","nativeKeys","nativeMax","nativeMin","min","nativeNow","nativeParseInt","nativeRandom","nativeReverse","DataView","Map","WeakMap","nativeCreate","metaMap","realNames","dataViewCtorString","toSource","mapCtorString","promiseCtorString","setCtorString","weakMapCtorString","symbolProto","symbolValueOf","valueOf","symbolToString","lodash","isObjectLike","LazyWrapper","LodashWrapper","wrapperClone","baseCreate","baseLodash","chainAll","__wrapped__","__actions__","__chain__","__index__","__values__","__dir__","__filtered__","__iteratees__","__takeCount__","__views__","lazyClone","copyArray","lazyReverse","lazyValue","isArr","isRight","arrLength","view","getView","iteratees","iterLength","takeCount","baseWrapperValue","outer","iterIndex","Hash","hashClear","__data__","hashDelete","hashGet","hashHas","hashSet","ListCache","listCacheClear","listCacheDelete","assocIndexOf","listCacheGet","listCacheHas","listCacheSet","MapCache","mapCacheClear","mapCacheDelete","getMapData","mapCacheGet","mapCacheHas","mapCacheSet","SetCache","setCacheAdd","setCacheHas","Stack","stackClear","stackDelete","stackGet","stackHas","stackSet","arrayLikeKeys","inherited","isArg","isArguments","isBuff","isType","skipIndexes","isIndex","arraySample","baseRandom","arraySampleSize","shuffleSelf","baseClamp","arrayShuffle","assignMergeValue","eq","baseAssignValue","assignValue","objValue","baseAggregator","baseEach","baseAssign","copyObject","baseAssignIn","keysIn","baseAt","paths","skip","lower","upper","baseClone","bitmask","customizer","stack","isDeep","isFlat","isFull","initCloneArray","getTag","isFunc","cloneBuffer","initCloneObject","copySymbolsIn","copySymbols","initCloneByTag","stacked","subValue","keysFunc","getAllKeysIn","getAllKeys","baseConforms","baseConformsTo","baseDelay","wait","baseDifference","isCommon","valuesLength","valuesIndex","templateSettings","interpolate","variable","imports","createBaseEach","baseForOwn","baseEachRight","baseForOwnRight","baseEvery","baseExtremum","isSymbol","baseFill","toInteger","baseFilter","baseFlatten","isStrict","isFlattenable","baseFor","createBaseFor","baseForRight","baseFunctions","baseGet","castPath","toKey","baseGetAllKeys","symbolsFunc","baseGetTag","getRawTag","objectToString","baseGt","other","baseHas","baseHasIn","baseInRange","baseIntersection","arrays","othLength","othIndex","caches","maxLength","Infinity","baseInverter","baseInvoke","baseIsArguments","baseIsArrayBuffer","baseIsDate","baseIsEqual","baseIsEqualDeep","equalFunc","objIsArr","othIsArr","objTag","othTag","objIsObj","othIsObj","isSameTag","equalArrays","equalByTag","objIsWrapped","othIsWrapped","objUnwrapped","othUnwrapped","equalObjects","baseIsMap","baseIsMatch","matchData","noCustomizer","srcValue","baseIsNative","isMasked","baseIsRegExp","baseIsSet","baseIsTypedArray","isLength","baseIteratee","baseMatchesProperty","baseMatches","baseKeys","isPrototype","baseKeysIn","nativeKeysIn","isProto","baseLt","baseMap","isArrayLike","getMatchData","matchesStrictComparable","isKey","isStrictComparable","hasIn","baseMerge","srcIndex","baseMergeDeep","newValue","mergeFunc","isTyped","isArrayLikeObject","cloneTypedArray","toPlainObject","baseNth","baseOrderBy","orders","getIteratee","criteria","compareMultiple","basePick","basePickBy","baseSet","basePropertyDeep","basePullAll","basePullAt","indexes","previous","baseUnset","baseRange","step","baseRepeat","baseRest","setToString","overRest","baseSample","baseSampleSize","baseSetData","baseSetToString","constant","baseShuffle","baseSlice","baseSome","baseSortedIndex","retHighest","low","high","mid","baseSortedIndexBy","valIsNaN","valIsNull","valIsSymbol","valIsUndefined","othIsDefined","othIsNull","othIsReflexive","othIsSymbol","setLow","baseSortedUniq","baseToNumber","baseToString","baseUniq","createSet","seenIndex","baseUpdate","updater","baseWhile","isDrop","baseXor","baseZipObject","assignFunc","valsLength","castArrayLikeObject","castFunction","stringToPath","castRest","castSlice","copy","cloneArrayBuffer","arrayBuffer","byteLength","cloneDataView","dataView","byteOffset","cloneRegExp","regexp","cloneSymbol","symbol","typedArray","compareAscending","valIsDefined","valIsReflexive","objCriteria","othCriteria","ordersLength","order","composeArgs","partials","holders","isCurried","argsIndex","argsLength","holdersLength","leftIndex","leftLength","rangeLength","isUncurried","composeArgsRight","holdersIndex","rightIndex","rightLength","isNew","getSymbols","getSymbolsIn","createAggregator","initializer","createAssigner","assigner","sources","guard","isIterateeCall","iterable","createBind","isBind","createCtor","wrapper","createCaseFirst","methodName","trailing","createCompounder","words","deburr","thisBinding","createCurry","arity","getHolder","createRecurry","createHybrid","createFind","findIndexFunc","createFlow","flatRest","funcs","prereq","thru","getFuncName","funcName","isLaziable","plant","partialsRight","holdersRight","argPos","ary","isAry","isBindKey","isFlip","holdersCount","newHolders","reorder","createInverter","toIteratee","createMathOperation","operator","defaultValue","createOver","arrayFunc","createPadding","chars","charsLength","createPartial","createRange","toFinite","createRelationalOperation","wrapFunc","isCurry","newHoldersRight","newPartials","newPartialsRight","newData","setData","setWrapToString","createRound","precision","createToPairs","createWrap","customDefaultsAssignIn","customDefaultsMerge","customOmitClone","isPartial","arrValue","othValue","compared","convert","objProps","objLength","othProps","skipCtor","objCtor","othCtor","flatten","otherFunc","isKeyable","isOwn","unmasked","stubArray","transforms","getWrapDetails","hasPath","hasFunc","input","insertWrapDetails","details","ArrayBuffer","ctorString","isMaskable","stubFalse","memoizeCapped","memoize","srcBitmask","newBitmask","isCombo","otherArgs","oldArray","shortOut","reference","updateWrapDetails","lastCalled","stamp","remaining","rand","subString","chunk","compact","difference","differenceBy","differenceWith","drop","dropRight","dropRightWhile","dropWhile","fill","findLastIndex","flattenDeep","flattenDepth","fromPairs","intersection","mapped","intersectionBy","intersectionWith","separator","lastIndexOf","nth","pull","pullAll","pullAllBy","pullAllWith","pullAt","sortedIndex","sortedIndexBy","sortedIndexOf","sortedLastIndex","sortedLastIndexBy","sortedLastIndexOf","sortedUniq","sortedUniqBy","tail","take","takeRight","takeRightWhile","takeWhile","union","unionBy","unionWith","uniq","uniqBy","uniqWith","unzip","group","unzipWith","without","xor","xorBy","xorWith","zip","zipObject","zipObjectDeep","zipWith","chain","tap","interceptor","wrapperAt","wrapperChain","wrapperCommit","wrapperNext","wrapperToIterator","wrapperPlant","wrapperReverse","wrapped","wrapperValue","countBy","find","findLast","flatMap","flatMapDeep","flatMapDepth","forEachRight","groupBy","isString","invokeMap","keyBy","orderBy","partition","reduceRight","negate","sample","sampleSize","shuffle","sortBy","after","before","bindKey","curry","curryRight","debounce","lastArgs","lastThis","maxWait","timerId","lastCallTime","lastInvokeTime","leading","maxing","invokeFunc","time","leadingEdge","timerExpired","remainingWait","timeSinceLastCall","timeSinceLastInvoke","timeWaiting","shouldInvoke","trailingEdge","cancel","flush","debounced","isInvoking","flip","resolver","memoized","Cache","overArgs","funcsLength","partial","partialRight","rearg","rest","spread","throttle","unary","wrap","castArray","cloneWith","cloneDeep","cloneDeepWith","conformsTo","gte","isBoolean","isElement","isEmpty","isEqual","isEqualWith","isError","isInteger","isMatch","isMatchWith","isNumber","isNull","isNil","isSafeInteger","isUndefined","isWeakMap","isWeakSet","lte","sign","remainder","isBinary","toSafeInteger","assignIn","assignInWith","assignWith","at","properties","propsIndex","propsLength","defaultsDeep","mergeWith","findKey","findLastKey","forIn","forInRight","forOwn","forOwnRight","functions","functionsIn","invert","invertBy","mapKeys","mapValues","omit","omitBy","pickBy","setWith","toPairs","toPairsIn","isArrLike","unset","updateWith","valuesIn","clamp","inRange","floating","temp","camelCase","word","upperFirst","endsWith","position","escapeRegExp","kebabCase","lowerCase","lowerFirst","pad","strLength","padEnd","padStart","radix","repeat","snakeCase","limit","startCase","startsWith","template","settings","isEscaping","isEvaluating","importsKeys","importsValues","reDelimiters","sourceURL","escapeValue","interpolateValue","esTemplateValue","evaluateValue","attempt","toLower","toUpper","trimEnd","trimStart","truncate","omission","search","newEnd","upperCase","bindAll","methodNames","cond","conforms","defaultTo","flow","flowRight","matchesProperty","methodOf","noConflict","nthArg","over","overEvery","overSome","propertyOf","range","rangeRight","stubObject","stubString","stubTrue","times","toPath","uniqueId","prefix","augend","addend","divide","dividend","divisor","maxBy","mean","meanBy","minBy","multiply","multiplier","multiplicand","round","subtract","minuend","subtrahend","sum","sumBy","entriesIn","extendWith","each","eachRight","first","isFilter","takeName","dropName","checkIteratee","isTaker","lodashFunc","retUnwrapped","isLazy","useLazy","isHybrid","isUnwrapped","onlyLazy","chainName","names","toJSON","fails","ArrayProto","un","createDesc","ObjectProto","descriptor","bitmap","isArrayIter","getIterFn","BREAK","RETURN","iterFn","ie","with_query_strings","mockIE","MATCH","re","Internal","newGenericPromiseCapability","OwnPromiseCapability","Wrapper","anInstance","forOf","speciesConstructor","microtask","newPromiseCapabilityModule","perform","promiseResolve","PROMISE","versions","v8","$Promise","isNode","empty","newPromiseCapability","USE_NATIVE","promise","FakePromise","PromiseRejectionEvent","isThenable","isReject","reaction","exited","fail","domain","_h","onHandleUnhandled","exit","onUnhandled","unhandled","isUnhandled","onunhandledrejection","_a","onrejectionhandled","$reject","_d","_w","$resolve","executor","onFulfilled","onRejected","G","W","r","capability","$$reject","x","iter","$index","alreadyCalled","race","core","SHARED","copyright","$sort","comparefn","own","exp","IS_FORCED","IS_GLOBAL","IS_STATIC","IS_PROTO","IS_BIND","expProto","U","R","SAFE_CLOSING","riter","skipClosing","shared","webpackPolyfill","deprecate","$includes","$flags","DESCRIPTORS","define","_callbacks","off","removeListener","removeAllListeners","gOPS","pIE","$assign","A","K","k","aLen","isEnum","__g","FProto","nameRE","stat","__e","macrotask","MutationObserver","WebKitMutationObserver","standalone","toggle","characterData","documentMode","IE8_DOM_DEFINE","toPrimitive","Attributes","condition","View","routerView","route","$route","_routerViewCache","inactive","_routerRoot","routerViewDepth","matched","registerRouteInstance","instances","propsToPass","resolveProps","encodeReserveRE","encodeReserveReplacer","commaRE","decode","resolveQuery","extraQuery","_parseQuery","parsedQuery","parseQuery","param","parts","stringifyQuery","val2","trailingSlashRE","createRoute","record","redirectedFrom","router","stringifyQuery$$1","meta","fullPath","getFullPath","formatMatch","START","_stringifyQuery","isSameRoute","isObjectEqual","aKeys","bKeys","aVal","bVal","isIncludedRoute","queryIncludes","toTypes","eventTypes","Link","required","exact","exactActiveClass","$router","classes","globalActiveClass","linkActiveClass","globalExactActiveClass","linkExactActiveClass","activeClassFallback","exactActiveClassFallback","compareTarget","guardEvent","click","findAnchor","aData","aAttrs","metaKey","ctrlKey","shiftKey","defaultPrevented","button","currentTarget","preventDefault","installed","registerInstance","callVal","_router","history","_route","beforeRouteEnter","beforeRouteLeave","beforeRouteUpdate","resolvePath","relative","firstChar","segment","hashIndex","queryIndex","cleanPath","isarray","pathToRegexp_1","pathToRegexp","parse_1","compile_1","compile","tokensToFunction_1","tokensToFunction","tokensToRegExp_1","tokensToRegExp","PATH_REGEXP","defaultDelimiter","delimiter","m","modifier","asterisk","optional","escapeGroup","escapeString","substr","encodeURIComponentPretty","encodeAsterisk","pretty","attachKeys","sensitive","regexpToRegexp","groups","arrayToRegexp","stringToRegexp","endsWithDelimiter","regexpCompileCache","fillParams","routeMsg","filler","createRouteMap","routes","oldPathList","oldPathMap","oldNameMap","pathList","pathMap","nameMap","addRouteRecord","matchAs","pathToRegexpOptions","normalizedPath","normalizePath","caseSensitive","compileRouteRegex","childMatchAs","alias","aliases","aliasRoute","normalizeLocation","_normalized","rawPath","parsedPath","basePath","createMatcher","addRoutes","currentRoute","_createRoute","paramNames","record$1","matchRoute","originalRedirect","resolveRecordPath","resolvedPath","aliasedPath","aliasedMatch","aliasedRecord","positionStore","setupScroll","getStateKey","saveScrollPosition","setStateKey","handleScroll","isPop","app","behavior","scrollBehavior","getScrollPosition","shouldScroll","scrollToPosition","pageXOffset","y","pageYOffset","getElementPosition","docEl","docRect","elRect","isValidPosition","normalizePosition","normalizeOffset","selector","scrollTo","supportsPushState","ua","Time","_key","genKey","toFixed","pushState","runQueue","resolveAsyncComponents","hasAsync","flatMapComponents","resolvedDef","isESModule","History","normalizeBase","ready","readyCbs","readyErrorCbs","errorCbs","baseEl","resolveQueue","activated","deactivated","extractGuards","records","guards","instance","extractGuard","extractLeaveGuards","bindGuard","extractUpdateHooks","extractEnterGuards","isValid","bindEnterGuard","poll","listen","onReady","errorCb","onError","transitionTo","onComplete","onAbort","confirmTransition","updateRoute","ensureURL","abort","beforeHooks","postEnterCbs","enterGuards","resolveHooks","prev","afterHooks","HTML5History","History$$1","expectScroll","initLocation","getLocation","go","fromRoute","getCurrentLocation","pathname","HashHistory","checkFallback","ensureSlash","setupListeners","supportsScroll","getHash","replaceHash","pushHash","getUrl","AbstractHistory","targetIndex","VueRouter","apps","matcher","registerHook","createHref","setupHashListener","beforeEach","beforeResolve","afterEach","back","forward","getMatchedComponents","normalizedTo","_arrayWithHoles","_iterableToArrayLimit","_arr","_nonIterableRest","_slicedToArray","_timer","_timeout","_responseTimeout","deadline","retry","_retryCallback","ERROR_CODES","override","_fullfilledPromise","innerResolve","innerReject","_okCallback","getHeader","base64Encoder","redirects","_maxRedirects","maxResponseSize","_maxResponseSize","isObj","sortQuery","_sort","queryArr","_appendQueryString","trace","_timeoutError","errno","UNSCOPABLES","_defaults","rel","cleanHeader","changesOrigin","_defineProperty","PromiseCapability","$$resolve","$iterators","wks","TO_STRING_TAG","ArrayValues","DOMIterables","CSSRuleList","CSSStyleDeclaration","CSSValueList","ClientRectList","DOMRectList","DOMStringList","DOMTokenList","DataTransferItemList","FileList","HTMLAllCollection","HTMLCollection","HTMLFormElement","HTMLSelectElement","MediaList","MimeTypeArray","NamedNodeMap","NodeList","PaintRequestList","Plugin","PluginArray","SVGLengthList","SVGNumberList","SVGPathSegList","SVGPointList","SVGStringList","SVGTransformList","SourceBufferList","StyleSheetList","TextTrackCueList","TextTrackList","TouchList","collections","explicit","Collection","promiseCapability","toIObject","toAbsoluteIndex","IS_INCLUDES","g","eval","_objectSpread","sym","_defineProperty__WEBPACK_IMPORTED_MODULE_0__","px","addToUnscopables","iterated","Arguments","arrayIndexOf"],"mappings":"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,IAAAC,IAAA,IAAAC,IAAA,IACAC,IAAA,IAAAC,IAAA,IAAAC,IAAA,IAAAC,IAAA,IACAC,IAAA,IAAAC,IAAA,IAAAC,IAAA,IAAAC,IAAA,IACAC,IAAA,IAAAC,IAAA,IAAAC,IAAA,IAAAC,IAAA,IACAC,IAAA,IAAAC,IAAA,IAAAC,IAAA,IAAAC,IAAA,IAAAC,IAAA,IACAC,IAAA,IAAAC,IAAA,IAAAC,IAAA,IAAAC,IAAA,IAAAC,IAAA,IACAC,IAAA,IAAAC,IAAA,IAAAC,IAAA,IAAAC,IAAA,IACAC,IAAA,IAAAC,IAAA,IAAAC,IAAA,IAAAC,IAAA,IACAC,IAAA,IAAAC,IAAA,IAAAC,IAAA,IAAAC,IAAA,IACAC,IAAA,IAAAC,IAAA,IAAAC,IAAA,IAAAC,IAAA,IAAAC,IAAA,IACAC,IAAA,IAAAC,IAAA,IAAAC,IAAA,IAAAC,IAAA,IAAAC,IAAA,IACAC,IAAA,IAAAC,IAAA,IACAC,IAAA,IAAAC,IAAA,IAAAC,IAAA,IACAC,IAAA,IAAAC,IAAA,IAAAC,IAAA,IAAAC,IAAA,IAAAC,IAAA,IACAC,IAAA,IAAAC,IAAA,IAAAC,IAAA,IAAAC,IAAA,IAAAC,IAAA,IACAC,IAAA,IAAAC,IAAA,IAAAC,IAAA,IAAAC,IAAA,IACAC,IAAA,IAAAC,IAAA,IAAAC,IAAA,IAAAC,IAAA,IACAC,IAAA,IAAAC,IAAA,IAAAC,IAAA,IACAC,IAAA,IAAAC,IAAA,IAAAC,IAAA,IACAC,IAAA,IAAAC,IAAA,IAAAC,IAAA,IACAC,IAAA,IAAAC,IAAA,IAAAC,IAAA,IACAC,IAAA,IAAAC,IAAA,IAAAC,IAAA,IAAAC,IAAA,IACAC,IAAA,IAAAC,IAAA,IAAAC,IAAA,IAAAC,IAAA,IACAC,IAAA,IAAAC,IAAA,IAAAC,IAAA,IACAC,IAAA,IAAAC,IAAA,IAAAC,IAAA,IACAC,IAAA,IAAAC,IAAA,IAAAC,IAAA,IAAAC,IAAA,IAAAC,IAAA,IAAAC,IAAA,IACAC,IAAA,IAAAC,IAAA,IAAAC,IAAA,IAAAC,IAAA,IAAAC,IAAA,IAAAC,IAAA,IACAC,IAAA,IAAAC,IAAA,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","file":"js/chunk-vendors.f8e19183.js","sourcesContent":["var document = require('./_global').document;\nmodule.exports = document && document.documentElement;\n","'use strict';\n\n/**\n * Module dependencies.\n */\n\nvar utils = require('./utils');\n\n/**\n * Expose `ResponseBase`.\n */\n\nmodule.exports = ResponseBase;\n\n/**\n * Initialize a new `ResponseBase`.\n *\n * @api public\n */\n\nfunction ResponseBase(obj) {\n if (obj) return mixin(obj);\n}\n\n/**\n * Mixin the prototype properties.\n *\n * @param {Object} obj\n * @return {Object}\n * @api private\n */\n\nfunction mixin(obj) {\n for (var key in ResponseBase.prototype) {\n obj[key] = ResponseBase.prototype[key];\n }\n return obj;\n}\n\n/**\n * Get case-insensitive `field` value.\n *\n * @param {String} field\n * @return {String}\n * @api public\n */\n\nResponseBase.prototype.get = function(field) {\n return this.header[field.toLowerCase()];\n};\n\n/**\n * Set header related properties:\n *\n * - `.type` the content type without params\n *\n * A response of \"Content-Type: text/plain; charset=utf-8\"\n * will provide you with a `.type` of \"text/plain\".\n *\n * @param {Object} header\n * @api private\n */\n\nResponseBase.prototype._setHeaderProperties = function(header){\n // TODO: moar!\n // TODO: make this a util\n\n // content-type\n var ct = header['content-type'] || '';\n this.type = utils.type(ct);\n\n // params\n var params = utils.params(ct);\n for (var key in params) this[key] = params[key];\n\n this.links = {};\n\n // links\n try {\n if (header.link) {\n this.links = utils.parseLinks(header.link);\n }\n } catch (err) {\n // ignore\n }\n};\n\n/**\n * Set flags such as `.ok` based on `status`.\n *\n * For example a 2xx response will give you a `.ok` of __true__\n * whereas 5xx will be __false__ and `.error` will be __true__. The\n * `.clientError` and `.serverError` are also available to be more\n * specific, and `.statusType` is the class of error ranging from 1..5\n * sometimes useful for mapping respond colors etc.\n *\n * \"sugar\" properties are also defined for common cases. Currently providing:\n *\n * - .noContent\n * - .badRequest\n * - .unauthorized\n * - .notAcceptable\n * - .notFound\n *\n * @param {Number} status\n * @api private\n */\n\nResponseBase.prototype._setStatusProperties = function(status){\n var type = status / 100 | 0;\n\n // status / class\n this.status = this.statusCode = status;\n this.statusType = type;\n\n // basics\n this.info = 1 == type;\n this.ok = 2 == type;\n this.redirect = 3 == type;\n this.clientError = 4 == type;\n this.serverError = 5 == type;\n this.error = (4 == type || 5 == type)\n ? this.toError()\n : false;\n\n // sugar\n this.created = 201 == status;\n this.accepted = 202 == status;\n this.noContent = 204 == status;\n this.badRequest = 400 == status;\n this.unauthorized = 401 == status;\n this.notAcceptable = 406 == status;\n this.forbidden = 403 == status;\n this.notFound = 404 == status;\n this.unprocessableEntity = 422 == status;\n};\n","module.exports = function (it) {\n return typeof it === 'object' ? it !== null : typeof it === 'function';\n};\n","// helper for String#{startsWith, endsWith, includes}\nvar isRegExp = require('./_is-regexp');\nvar defined = require('./_defined');\n\nmodule.exports = function (that, searchString, NAME) {\n if (isRegExp(searchString)) throw TypeError('String#' + NAME + \" doesn't accept regex!\");\n return String(defined(that));\n};\n","module.exports = function (done, value) {\n return { value: value, done: !!done };\n};\n","/**\n * Root reference for iframes.\n */\n\nvar root;\nif (typeof window !== 'undefined') { // Browser window\n root = window;\n} else if (typeof self !== 'undefined') { // Web Worker\n root = self;\n} else { // Other environments\n console.warn(\"Using browser-only version of superagent in non-browser environment\");\n root = this;\n}\n\nvar Emitter = require('component-emitter');\nvar RequestBase = require('./request-base');\nvar isObject = require('./is-object');\nvar ResponseBase = require('./response-base');\nvar Agent = require('./agent-base');\n\n/**\n * Noop.\n */\n\nfunction noop(){};\n\n/**\n * Expose `request`.\n */\n\nvar request = exports = module.exports = function(method, url) {\n // callback\n if ('function' == typeof url) {\n return new exports.Request('GET', method).end(url);\n }\n\n // url first\n if (1 == arguments.length) {\n return new exports.Request('GET', method);\n }\n\n return new exports.Request(method, url);\n}\n\nexports.Request = Request;\n\n/**\n * Determine XHR.\n */\n\nrequest.getXHR = function () {\n if (root.XMLHttpRequest\n && (!root.location || 'file:' != root.location.protocol\n || !root.ActiveXObject)) {\n return new XMLHttpRequest;\n } else {\n try { return new ActiveXObject('Microsoft.XMLHTTP'); } catch(e) {}\n try { return new ActiveXObject('Msxml2.XMLHTTP.6.0'); } catch(e) {}\n try { return new ActiveXObject('Msxml2.XMLHTTP.3.0'); } catch(e) {}\n try { return new ActiveXObject('Msxml2.XMLHTTP'); } catch(e) {}\n }\n throw Error(\"Browser-only version of superagent could not find XHR\");\n};\n\n/**\n * Removes leading and trailing whitespace, added to support IE.\n *\n * @param {String} s\n * @return {String}\n * @api private\n */\n\nvar trim = ''.trim\n ? function(s) { return s.trim(); }\n : function(s) { return s.replace(/(^\\s*|\\s*$)/g, ''); };\n\n/**\n * Serialize the given `obj`.\n *\n * @param {Object} obj\n * @return {String}\n * @api private\n */\n\nfunction serialize(obj) {\n if (!isObject(obj)) return obj;\n var pairs = [];\n for (var key in obj) {\n pushEncodedKeyValuePair(pairs, key, obj[key]);\n }\n return pairs.join('&');\n}\n\n/**\n * Helps 'serialize' with serializing arrays.\n * Mutates the pairs array.\n *\n * @param {Array} pairs\n * @param {String} key\n * @param {Mixed} val\n */\n\nfunction pushEncodedKeyValuePair(pairs, key, val) {\n if (val != null) {\n if (Array.isArray(val)) {\n val.forEach(function(v) {\n pushEncodedKeyValuePair(pairs, key, v);\n });\n } else if (isObject(val)) {\n for(var subkey in val) {\n pushEncodedKeyValuePair(pairs, key + '[' + subkey + ']', val[subkey]);\n }\n } else {\n pairs.push(encodeURIComponent(key)\n + '=' + encodeURIComponent(val));\n }\n } else if (val === null) {\n pairs.push(encodeURIComponent(key));\n }\n}\n\n/**\n * Expose serialization method.\n */\n\nrequest.serializeObject = serialize;\n\n/**\n * Parse the given x-www-form-urlencoded `str`.\n *\n * @param {String} str\n * @return {Object}\n * @api private\n */\n\nfunction parseString(str) {\n var obj = {};\n var pairs = str.split('&');\n var pair;\n var pos;\n\n for (var i = 0, len = pairs.length; i < len; ++i) {\n pair = pairs[i];\n pos = pair.indexOf('=');\n if (pos == -1) {\n obj[decodeURIComponent(pair)] = '';\n } else {\n obj[decodeURIComponent(pair.slice(0, pos))] =\n decodeURIComponent(pair.slice(pos + 1));\n }\n }\n\n return obj;\n}\n\n/**\n * Expose parser.\n */\n\nrequest.parseString = parseString;\n\n/**\n * Default MIME type map.\n *\n * superagent.types.xml = 'application/xml';\n *\n */\n\nrequest.types = {\n html: 'text/html',\n json: 'application/json',\n xml: 'text/xml',\n urlencoded: 'application/x-www-form-urlencoded',\n 'form': 'application/x-www-form-urlencoded',\n 'form-data': 'application/x-www-form-urlencoded'\n};\n\n/**\n * Default serialization map.\n *\n * superagent.serialize['application/xml'] = function(obj){\n * return 'generated xml here';\n * };\n *\n */\n\nrequest.serialize = {\n 'application/x-www-form-urlencoded': serialize,\n 'application/json': JSON.stringify\n};\n\n/**\n * Default parsers.\n *\n * superagent.parse['application/xml'] = function(str){\n * return { object parsed from str };\n * };\n *\n */\n\nrequest.parse = {\n 'application/x-www-form-urlencoded': parseString,\n 'application/json': JSON.parse\n};\n\n/**\n * Parse the given header `str` into\n * an object containing the mapped fields.\n *\n * @param {String} str\n * @return {Object}\n * @api private\n */\n\nfunction parseHeader(str) {\n var lines = str.split(/\\r?\\n/);\n var fields = {};\n var index;\n var line;\n var field;\n var val;\n\n for (var i = 0, len = lines.length; i < len; ++i) {\n line = lines[i];\n index = line.indexOf(':');\n if (index === -1) { // could be empty line, just skip it\n continue;\n }\n field = line.slice(0, index).toLowerCase();\n val = trim(line.slice(index + 1));\n fields[field] = val;\n }\n\n return fields;\n}\n\n/**\n * Check if `mime` is json or has +json structured syntax suffix.\n *\n * @param {String} mime\n * @return {Boolean}\n * @api private\n */\n\nfunction isJSON(mime) {\n // should match /json or +json\n // but not /json-seq\n return /[\\/+]json($|[^-\\w])/.test(mime);\n}\n\n/**\n * Initialize a new `Response` with the given `xhr`.\n *\n * - set flags (.ok, .error, etc)\n * - parse header\n *\n * Examples:\n *\n * Aliasing `superagent` as `request` is nice:\n *\n * request = superagent;\n *\n * We can use the promise-like API, or pass callbacks:\n *\n * request.get('/').end(function(res){});\n * request.get('/', function(res){});\n *\n * Sending data can be chained:\n *\n * request\n * .post('/user')\n * .send({ name: 'tj' })\n * .end(function(res){});\n *\n * Or passed to `.send()`:\n *\n * request\n * .post('/user')\n * .send({ name: 'tj' }, function(res){});\n *\n * Or passed to `.post()`:\n *\n * request\n * .post('/user', { name: 'tj' })\n * .end(function(res){});\n *\n * Or further reduced to a single call for simple cases:\n *\n * request\n * .post('/user', { name: 'tj' }, function(res){});\n *\n * @param {XMLHTTPRequest} xhr\n * @param {Object} options\n * @api private\n */\n\nfunction Response(req) {\n this.req = req;\n this.xhr = this.req.xhr;\n // responseText is accessible only if responseType is '' or 'text' and on older browsers\n this.text = ((this.req.method !='HEAD' && (this.xhr.responseType === '' || this.xhr.responseType === 'text')) || typeof this.xhr.responseType === 'undefined')\n ? this.xhr.responseText\n : null;\n this.statusText = this.req.xhr.statusText;\n var status = this.xhr.status;\n // handle IE9 bug: http://stackoverflow.com/questions/10046972/msie-returns-status-code-of-1223-for-ajax-request\n if (status === 1223) {\n status = 204;\n }\n this._setStatusProperties(status);\n this.header = this.headers = parseHeader(this.xhr.getAllResponseHeaders());\n // getAllResponseHeaders sometimes falsely returns \"\" for CORS requests, but\n // getResponseHeader still works. so we get content-type even if getting\n // other headers fails.\n this.header['content-type'] = this.xhr.getResponseHeader('content-type');\n this._setHeaderProperties(this.header);\n\n if (null === this.text && req._responseType) {\n this.body = this.xhr.response;\n } else {\n this.body = this.req.method != 'HEAD'\n ? this._parseBody(this.text ? this.text : this.xhr.response)\n : null;\n }\n}\n\nResponseBase(Response.prototype);\n\n/**\n * Parse the given body `str`.\n *\n * Used for auto-parsing of bodies. Parsers\n * are defined on the `superagent.parse` object.\n *\n * @param {String} str\n * @return {Mixed}\n * @api private\n */\n\nResponse.prototype._parseBody = function(str) {\n var parse = request.parse[this.type];\n if (this.req._parser) {\n return this.req._parser(this, str);\n }\n if (!parse && isJSON(this.type)) {\n parse = request.parse['application/json'];\n }\n return parse && str && (str.length || str instanceof Object)\n ? parse(str)\n : null;\n};\n\n/**\n * Return an `Error` representative of this response.\n *\n * @return {Error}\n * @api public\n */\n\nResponse.prototype.toError = function(){\n var req = this.req;\n var method = req.method;\n var url = req.url;\n\n var msg = 'cannot ' + method + ' ' + url + ' (' + this.status + ')';\n var err = new Error(msg);\n err.status = this.status;\n err.method = method;\n err.url = url;\n\n return err;\n};\n\n/**\n * Expose `Response`.\n */\n\nrequest.Response = Response;\n\n/**\n * Initialize a new `Request` with the given `method` and `url`.\n *\n * @param {String} method\n * @param {String} url\n * @api public\n */\n\nfunction Request(method, url) {\n var self = this;\n this._query = this._query || [];\n this.method = method;\n this.url = url;\n this.header = {}; // preserves header name case\n this._header = {}; // coerces header names to lowercase\n this.on('end', function(){\n var err = null;\n var res = null;\n\n try {\n res = new Response(self);\n } catch(e) {\n err = new Error('Parser is unable to parse the response');\n err.parse = true;\n err.original = e;\n // issue #675: return the raw response if the response parsing fails\n if (self.xhr) {\n // ie9 doesn't have 'response' property\n err.rawResponse = typeof self.xhr.responseType == 'undefined' ? self.xhr.responseText : self.xhr.response;\n // issue #876: return the http status code if the response parsing fails\n err.status = self.xhr.status ? self.xhr.status : null;\n err.statusCode = err.status; // backwards-compat only\n } else {\n err.rawResponse = null;\n err.status = null;\n }\n\n return self.callback(err);\n }\n\n self.emit('response', res);\n\n var new_err;\n try {\n if (!self._isResponseOK(res)) {\n new_err = new Error(res.statusText || 'Unsuccessful HTTP response');\n }\n } catch(custom_err) {\n new_err = custom_err; // ok() callback can throw\n }\n\n // #1000 don't catch errors from the callback to avoid double calling it\n if (new_err) {\n new_err.original = err;\n new_err.response = res;\n new_err.status = res.status;\n self.callback(new_err, res);\n } else {\n self.callback(null, res);\n }\n });\n}\n\n/**\n * Mixin `Emitter` and `RequestBase`.\n */\n\nEmitter(Request.prototype);\nRequestBase(Request.prototype);\n\n/**\n * Set Content-Type to `type`, mapping values from `request.types`.\n *\n * Examples:\n *\n * superagent.types.xml = 'application/xml';\n *\n * request.post('/')\n * .type('xml')\n * .send(xmlstring)\n * .end(callback);\n *\n * request.post('/')\n * .type('application/xml')\n * .send(xmlstring)\n * .end(callback);\n *\n * @param {String} type\n * @return {Request} for chaining\n * @api public\n */\n\nRequest.prototype.type = function(type){\n this.set('Content-Type', request.types[type] || type);\n return this;\n};\n\n/**\n * Set Accept to `type`, mapping values from `request.types`.\n *\n * Examples:\n *\n * superagent.types.json = 'application/json';\n *\n * request.get('/agent')\n * .accept('json')\n * .end(callback);\n *\n * request.get('/agent')\n * .accept('application/json')\n * .end(callback);\n *\n * @param {String} accept\n * @return {Request} for chaining\n * @api public\n */\n\nRequest.prototype.accept = function(type){\n this.set('Accept', request.types[type] || type);\n return this;\n};\n\n/**\n * Set Authorization field value with `user` and `pass`.\n *\n * @param {String} user\n * @param {String} [pass] optional in case of using 'bearer' as type\n * @param {Object} options with 'type' property 'auto', 'basic' or 'bearer' (default 'basic')\n * @return {Request} for chaining\n * @api public\n */\n\nRequest.prototype.auth = function(user, pass, options){\n if (1 === arguments.length) pass = '';\n if (typeof pass === 'object' && pass !== null) { // pass is optional and can be replaced with options\n options = pass;\n pass = '';\n }\n if (!options) {\n options = {\n type: 'function' === typeof btoa ? 'basic' : 'auto',\n };\n }\n\n var encoder = function(string) {\n if ('function' === typeof btoa) {\n return btoa(string);\n }\n throw new Error('Cannot use basic auth, btoa is not a function');\n };\n\n return this._auth(user, pass, options, encoder);\n};\n\n/**\n * Add query-string `val`.\n *\n * Examples:\n *\n * request.get('/shoes')\n * .query('size=10')\n * .query({ color: 'blue' })\n *\n * @param {Object|String} val\n * @return {Request} for chaining\n * @api public\n */\n\nRequest.prototype.query = function(val){\n if ('string' != typeof val) val = serialize(val);\n if (val) this._query.push(val);\n return this;\n};\n\n/**\n * Queue the given `file` as an attachment to the specified `field`,\n * with optional `options` (or filename).\n *\n * ``` js\n * request.post('/upload')\n * .attach('content', new Blob(['
hey!'], { type: \"text/html\"}))\n * .end(callback);\n * ```\n *\n * @param {String} field\n * @param {Blob|File} file\n * @param {String|Object} options\n * @return {Request} for chaining\n * @api public\n */\n\nRequest.prototype.attach = function(field, file, options){\n if (file) {\n if (this._data) {\n throw Error(\"superagent can't mix .send() and .attach()\");\n }\n\n this._getFormData().append(field, file, options || file.name);\n }\n return this;\n};\n\nRequest.prototype._getFormData = function(){\n if (!this._formData) {\n this._formData = new root.FormData();\n }\n return this._formData;\n};\n\n/**\n * Invoke the callback with `err` and `res`\n * and handle arity check.\n *\n * @param {Error} err\n * @param {Response} res\n * @api private\n */\n\nRequest.prototype.callback = function(err, res){\n if (this._shouldRetry(err, res)) {\n return this._retry();\n }\n\n var fn = this._callback;\n this.clearTimeout();\n\n if (err) {\n if (this._maxRetries) err.retries = this._retries - 1;\n this.emit('error', err);\n }\n\n fn(err, res);\n};\n\n/**\n * Invoke callback with x-domain error.\n *\n * @api private\n */\n\nRequest.prototype.crossDomainError = function(){\n var err = new Error('Request has been terminated\\nPossible causes: the network is offline, Origin is not allowed by Access-Control-Allow-Origin, the page is being unloaded, etc.');\n err.crossDomain = true;\n\n err.status = this.status;\n err.method = this.method;\n err.url = this.url;\n\n this.callback(err);\n};\n\n// This only warns, because the request is still likely to work\nRequest.prototype.buffer = Request.prototype.ca = Request.prototype.agent = function(){\n console.warn(\"This is not supported in browser version of superagent\");\n return this;\n};\n\n// This throws, because it can't send/receive data as expected\nRequest.prototype.pipe = Request.prototype.write = function(){\n throw Error(\"Streaming is not supported in browser version of superagent\");\n};\n\n/**\n * Check if `obj` is a host object,\n * we don't want to serialize these :)\n *\n * @param {Object} obj\n * @return {Boolean}\n * @api private\n */\nRequest.prototype._isHost = function _isHost(obj) {\n // Native objects stringify to [object File], [object Blob], [object FormData], etc.\n return obj && 'object' === typeof obj && !Array.isArray(obj) && Object.prototype.toString.call(obj) !== '[object Object]';\n}\n\n/**\n * Initiate request, invoking callback `fn(res)`\n * with an instanceof `Response`.\n *\n * @param {Function} fn\n * @return {Request} for chaining\n * @api public\n */\n\nRequest.prototype.end = function(fn){\n if (this._endCalled) {\n console.warn(\"Warning: .end() was called twice. This is not supported in superagent\");\n }\n this._endCalled = true;\n\n // store callback\n this._callback = fn || noop;\n\n // querystring\n this._finalizeQueryString();\n\n return this._end();\n};\n\nRequest.prototype._end = function() {\n var self = this;\n var xhr = (this.xhr = request.getXHR());\n var data = this._formData || this._data;\n\n this._setTimeouts();\n\n // state change\n xhr.onreadystatechange = function(){\n var readyState = xhr.readyState;\n if (readyState >= 2 && self._responseTimeoutTimer) {\n clearTimeout(self._responseTimeoutTimer);\n }\n if (4 != readyState) {\n return;\n }\n\n // In IE9, reads to any property (e.g. status) off of an aborted XHR will\n // result in the error \"Could not complete the operation due to error c00c023f\"\n var status;\n try { status = xhr.status } catch(e) { status = 0; }\n\n if (!status) {\n if (self.timedout || self._aborted) return;\n return self.crossDomainError();\n }\n self.emit('end');\n };\n\n // progress\n var handleProgress = function(direction, e) {\n if (e.total > 0) {\n e.percent = e.loaded / e.total * 100;\n }\n e.direction = direction;\n self.emit('progress', e);\n };\n if (this.hasListeners('progress')) {\n try {\n xhr.onprogress = handleProgress.bind(null, 'download');\n if (xhr.upload) {\n xhr.upload.onprogress = handleProgress.bind(null, 'upload');\n }\n } catch(e) {\n // Accessing xhr.upload fails in IE from a web worker, so just pretend it doesn't exist.\n // Reported here:\n // https://connect.microsoft.com/IE/feedback/details/837245/xmlhttprequest-upload-throws-invalid-argument-when-used-from-web-worker-context\n }\n }\n\n // initiate request\n try {\n if (this.username && this.password) {\n xhr.open(this.method, this.url, true, this.username, this.password);\n } else {\n xhr.open(this.method, this.url, true);\n }\n } catch (err) {\n // see #1149\n return this.callback(err);\n }\n\n // CORS\n if (this._withCredentials) xhr.withCredentials = true;\n\n // body\n if (!this._formData && 'GET' != this.method && 'HEAD' != this.method && 'string' != typeof data && !this._isHost(data)) {\n // serialize stuff\n var contentType = this._header['content-type'];\n var serialize = this._serializer || request.serialize[contentType ? contentType.split(';')[0] : ''];\n if (!serialize && isJSON(contentType)) {\n serialize = request.serialize['application/json'];\n }\n if (serialize) data = serialize(data);\n }\n\n // set header fields\n for (var field in this.header) {\n if (null == this.header[field]) continue;\n\n if (this.header.hasOwnProperty(field))\n xhr.setRequestHeader(field, this.header[field]);\n }\n\n if (this._responseType) {\n xhr.responseType = this._responseType;\n }\n\n // send stuff\n this.emit('request', this);\n\n // IE11 xhr.send(undefined) sends 'undefined' string as POST payload (instead of nothing)\n // We need null here if data is undefined\n xhr.send(typeof data !== 'undefined' ? data : null);\n return this;\n};\n\nrequest.agent = function() {\n return new Agent();\n};\n\n[\"GET\", \"POST\", \"OPTIONS\", \"PATCH\", \"PUT\", \"DELETE\"].forEach(function(method) {\n Agent.prototype[method.toLowerCase()] = function(url, fn) {\n var req = new request.Request(method, url);\n this._setDefaults(req);\n if (fn) {\n req.end(fn);\n }\n return req;\n };\n});\n\nAgent.prototype.del = Agent.prototype['delete'];\n\n/**\n * GET `url` with optional callback `fn(res)`.\n *\n * @param {String} url\n * @param {Mixed|Function} [data] or fn\n * @param {Function} [fn]\n * @return {Request}\n * @api public\n */\n\nrequest.get = function(url, data, fn) {\n var req = request('GET', url);\n if ('function' == typeof data) (fn = data), (data = null);\n if (data) req.query(data);\n if (fn) req.end(fn);\n return req;\n};\n\n/**\n * HEAD `url` with optional callback `fn(res)`.\n *\n * @param {String} url\n * @param {Mixed|Function} [data] or fn\n * @param {Function} [fn]\n * @return {Request}\n * @api public\n */\n\nrequest.head = function(url, data, fn) {\n var req = request('HEAD', url);\n if ('function' == typeof data) (fn = data), (data = null);\n if (data) req.query(data);\n if (fn) req.end(fn);\n return req;\n};\n\n/**\n * OPTIONS query to `url` with optional callback `fn(res)`.\n *\n * @param {String} url\n * @param {Mixed|Function} [data] or fn\n * @param {Function} [fn]\n * @return {Request}\n * @api public\n */\n\nrequest.options = function(url, data, fn) {\n var req = request('OPTIONS', url);\n if ('function' == typeof data) (fn = data), (data = null);\n if (data) req.send(data);\n if (fn) req.end(fn);\n return req;\n};\n\n/**\n * DELETE `url` with optional `data` and callback `fn(res)`.\n *\n * @param {String} url\n * @param {Mixed} [data]\n * @param {Function} [fn]\n * @return {Request}\n * @api public\n */\n\nfunction del(url, data, fn) {\n var req = request('DELETE', url);\n if ('function' == typeof data) (fn = data), (data = null);\n if (data) req.send(data);\n if (fn) req.end(fn);\n return req;\n}\n\nrequest['del'] = del;\nrequest['delete'] = del;\n\n/**\n * PATCH `url` with optional `data` and callback `fn(res)`.\n *\n * @param {String} url\n * @param {Mixed} [data]\n * @param {Function} [fn]\n * @return {Request}\n * @api public\n */\n\nrequest.patch = function(url, data, fn) {\n var req = request('PATCH', url);\n if ('function' == typeof data) (fn = data), (data = null);\n if (data) req.send(data);\n if (fn) req.end(fn);\n return req;\n};\n\n/**\n * POST `url` with optional `data` and callback `fn(res)`.\n *\n * @param {String} url\n * @param {Mixed} [data]\n * @param {Function} [fn]\n * @return {Request}\n * @api public\n */\n\nrequest.post = function(url, data, fn) {\n var req = request('POST', url);\n if ('function' == typeof data) (fn = data), (data = null);\n if (data) req.send(data);\n if (fn) req.end(fn);\n return req;\n};\n\n/**\n * PUT `url` with optional `data` and callback `fn(res)`.\n *\n * @param {String} url\n * @param {Mixed|Function} [data] or fn\n * @param {Function} [fn]\n * @return {Request}\n * @api public\n */\n\nrequest.put = function(url, data, fn) {\n var req = request('PUT', url);\n if ('function' == typeof data) (fn = data), (data = null);\n if (data) req.send(data);\n if (fn) req.end(fn);\n return req;\n};\n","module.exports = function (it) {\n if (typeof it != 'function') throw TypeError(it + ' is not a function!');\n return it;\n};\n","var redefine = require('./_redefine');\nmodule.exports = function (target, src, safe) {\n for (var key in src) redefine(target, key, src[key], safe);\n return target;\n};\n","// IE 8- don't enum bug keys\nmodule.exports = (\n 'constructor,hasOwnProperty,isPrototypeOf,propertyIsEnumerable,toLocaleString,toString,valueOf'\n).split(',');\n","// 7.3.20 SpeciesConstructor(O, defaultConstructor)\nvar anObject = require('./_an-object');\nvar aFunction = require('./_a-function');\nvar SPECIES = require('./_wks')('species');\nmodule.exports = function (O, D) {\n var C = anObject(O).constructor;\n var S;\n return C === undefined || (S = anObject(C)[SPECIES]) == undefined ? D : aFunction(S);\n};\n","var isObject = require('./_is-object');\nvar isArray = require('./_is-array');\nvar SPECIES = require('./_wks')('species');\n\nmodule.exports = function (original) {\n var C;\n if (isArray(original)) {\n C = original.constructor;\n // cross-realm fallback\n if (typeof C == 'function' && (C === Array || isArray(C.prototype))) C = undefined;\n if (isObject(C)) {\n C = C[SPECIES];\n if (C === null) C = undefined;\n }\n } return C === undefined ? Array : C;\n};\n","'use strict';\n\n/**\n * Check if `obj` is an object.\n *\n * @param {Object} obj\n * @return {Boolean}\n * @api private\n */\n\nfunction isObject(obj) {\n return null !== obj && 'object' === typeof obj;\n}\n\nmodule.exports = isObject;\n","// 19.1.3.1 Object.assign(target, source)\nvar $export = require('./_export');\n\n$export($export.S + $export.F, 'Object', { assign: require('./_object-assign') });\n","module.exports = function (it, Constructor, name, forbiddenField) {\n if (!(it instanceof Constructor) || (forbiddenField !== undefined && forbiddenField in it)) {\n throw TypeError(name + ': incorrect invocation!');\n } return it;\n};\n","'use strict';\nvar LIBRARY = require('./_library');\nvar $export = require('./_export');\nvar redefine = require('./_redefine');\nvar hide = require('./_hide');\nvar Iterators = require('./_iterators');\nvar $iterCreate = require('./_iter-create');\nvar setToStringTag = require('./_set-to-string-tag');\nvar getPrototypeOf = require('./_object-gpo');\nvar ITERATOR = require('./_wks')('iterator');\nvar BUGGY = !([].keys && 'next' in [].keys()); // Safari has buggy iterators w/o `next`\nvar FF_ITERATOR = '@@iterator';\nvar KEYS = 'keys';\nvar VALUES = 'values';\n\nvar returnThis = function () { return this; };\n\nmodule.exports = function (Base, NAME, Constructor, next, DEFAULT, IS_SET, FORCED) {\n $iterCreate(Constructor, NAME, next);\n var getMethod = function (kind) {\n if (!BUGGY && kind in proto) return proto[kind];\n switch (kind) {\n case KEYS: return function keys() { return new Constructor(this, kind); };\n case VALUES: return function values() { return new Constructor(this, kind); };\n } return function entries() { return new Constructor(this, kind); };\n };\n var TAG = NAME + ' Iterator';\n var DEF_VALUES = DEFAULT == VALUES;\n var VALUES_BUG = false;\n var proto = Base.prototype;\n var $native = proto[ITERATOR] || proto[FF_ITERATOR] || DEFAULT && proto[DEFAULT];\n var $default = $native || getMethod(DEFAULT);\n var $entries = DEFAULT ? !DEF_VALUES ? $default : getMethod('entries') : undefined;\n var $anyNative = NAME == 'Array' ? proto.entries || $native : $native;\n var methods, key, IteratorPrototype;\n // Fix native\n if ($anyNative) {\n IteratorPrototype = getPrototypeOf($anyNative.call(new Base()));\n if (IteratorPrototype !== Object.prototype && IteratorPrototype.next) {\n // Set @@toStringTag to native iterators\n setToStringTag(IteratorPrototype, TAG, true);\n // fix for some old engines\n if (!LIBRARY && typeof IteratorPrototype[ITERATOR] != 'function') hide(IteratorPrototype, ITERATOR, returnThis);\n }\n }\n // fix Array#{values, @@iterator}.name in V8 / FF\n if (DEF_VALUES && $native && $native.name !== VALUES) {\n VALUES_BUG = true;\n $default = function values() { return $native.call(this); };\n }\n // Define iterator\n if ((!LIBRARY || FORCED) && (BUGGY || VALUES_BUG || !proto[ITERATOR])) {\n hide(proto, ITERATOR, $default);\n }\n // Plug for library\n Iterators[NAME] = $default;\n Iterators[TAG] = returnThis;\n if (DEFAULT) {\n methods = {\n values: DEF_VALUES ? $default : getMethod(VALUES),\n keys: IS_SET ? $default : getMethod(KEYS),\n entries: $entries\n };\n if (FORCED) for (key in methods) {\n if (!(key in proto)) redefine(proto, key, methods[key]);\n } else $export($export.P + $export.F * (BUGGY || VALUES_BUG), NAME, methods);\n }\n return methods;\n};\n","'use strict';\n// 21.2.5.3 get RegExp.prototype.flags\nvar anObject = require('./_an-object');\nmodule.exports = function () {\n var that = anObject(this);\n var result = '';\n if (that.global) result += 'g';\n if (that.ignoreCase) result += 'i';\n if (that.multiline) result += 'm';\n if (that.unicode) result += 'u';\n if (that.sticky) result += 'y';\n return result;\n};\n","// 0 -> Array#forEach\n// 1 -> Array#map\n// 2 -> Array#filter\n// 3 -> Array#some\n// 4 -> Array#every\n// 5 -> Array#find\n// 6 -> Array#findIndex\nvar ctx = require('./_ctx');\nvar IObject = require('./_iobject');\nvar toObject = require('./_to-object');\nvar toLength = require('./_to-length');\nvar asc = require('./_array-species-create');\nmodule.exports = function (TYPE, $create) {\n var IS_MAP = TYPE == 1;\n var IS_FILTER = TYPE == 2;\n var IS_SOME = TYPE == 3;\n var IS_EVERY = TYPE == 4;\n var IS_FIND_INDEX = TYPE == 6;\n var NO_HOLES = TYPE == 5 || IS_FIND_INDEX;\n var create = $create || asc;\n return function ($this, callbackfn, that) {\n var O = toObject($this);\n var self = IObject(O);\n var f = ctx(callbackfn, that, 3);\n var length = toLength(self.length);\n var index = 0;\n var result = IS_MAP ? create($this, length) : IS_FILTER ? create($this, 0) : undefined;\n var val, res;\n for (;length > index; index++) if (NO_HOLES || index in self) {\n val = self[index];\n res = f(val, index, O);\n if (TYPE) {\n if (IS_MAP) result[index] = res; // map\n else if (res) switch (TYPE) {\n case 3: return true; // some\n case 5: return val; // find\n case 6: return index; // findIndex\n case 2: result.push(val); // filter\n } else if (IS_EVERY) return false; // every\n }\n }\n return IS_FIND_INDEX ? -1 : IS_SOME || IS_EVERY ? IS_EVERY : result;\n };\n};\n","// 19.1.2.14 / 15.2.3.14 Object.keys(O)\nvar $keys = require('./_object-keys-internal');\nvar enumBugKeys = require('./_enum-bug-keys');\n\nmodule.exports = Object.keys || function keys(O) {\n return $keys(O, enumBugKeys);\n};\n","/**\n * marked - a markdown parser\n * Copyright (c) 2011-2014, Christopher Jeffrey. (MIT Licensed)\n * https://github.com/markedjs/marked\n */\n\n;(function(root) {\n'use strict';\n\n/**\n * Block-Level Grammar\n */\n\nvar block = {\n newline: /^\\n+/,\n code: /^( {4}[^\\n]+\\n*)+/,\n fences: noop,\n hr: /^ {0,3}((?:- *){3,}|(?:_ *){3,}|(?:\\* *){3,})(?:\\n+|$)/,\n heading: /^ *(#{1,6}) *([^\\n]+?) *(?:#+ *)?(?:\\n+|$)/,\n nptable: noop,\n blockquote: /^( {0,3}> ?(paragraph|[^\\n]*)(?:\\n|$))+/,\n list: /^( *)(bull) [\\s\\S]+?(?:hr|def|\\n{2,}(?! )(?!\\1bull )\\n*|\\s*$)/,\n html: '^ {0,3}(?:' // optional indentation\n + '<(script|pre|style)[\\\\s>][\\\\s\\\\S]*?(?:[^\\\\n]*\\\\n+|$)' // (1)\n + '|comment[^\\\\n]*(\\\\n+|$)' // (2)\n + '|<\\\\?[\\\\s\\\\S]*?\\\\?>\\\\n*' // (3)\n + '|\\\\n*' // (4)\n + '|\\\\n*' // (5)\n + '|)[\\\\s\\\\S]*?(?:\\\\n{2,}|$)' // (6)\n + '|<(?!script|pre|style)([a-z][\\\\w-]*)(?:attribute)*? */?>(?=\\\\h*\\\\n)[\\\\s\\\\S]*?(?:\\\\n{2,}|$)' // (7) open tag\n + '|(?=\\\\h*\\\\n)[\\\\s\\\\S]*?(?:\\\\n{2,}|$)' // (7) closing tag\n + ')',\n def: /^ {0,3}\\[(label)\\]: *\\n? *]+)>?(?:(?: +\\n? *| *\\n *)(title))? *(?:\\n+|$)/,\n table: noop,\n lheading: /^([^\\n]+)\\n *(=|-){2,} *(?:\\n+|$)/,\n paragraph: /^([^\\n]+(?:\\n(?!hr|heading|lheading| {0,3}>|<\\/?(?:tag)(?: +|\\n|\\/?>)|<(?:script|pre|style|!--))[^\\n]+)*)/,\n text: /^[^\\n]+/\n};\n\nblock._label = /(?!\\s*\\])(?:\\\\[\\[\\]]|[^\\[\\]])+/;\nblock._title = /(?:\"(?:\\\\\"?|[^\"\\\\])*\"|'[^'\\n]*(?:\\n[^'\\n]+)*\\n?'|\\([^()]*\\))/;\nblock.def = edit(block.def)\n .replace('label', block._label)\n .replace('title', block._title)\n .getRegex();\n\nblock.bullet = /(?:[*+-]|\\d+\\.)/;\nblock.item = /^( *)(bull) [^\\n]*(?:\\n(?!\\1bull )[^\\n]*)*/;\nblock.item = edit(block.item, 'gm')\n .replace(/bull/g, block.bullet)\n .getRegex();\n\nblock.list = edit(block.list)\n .replace(/bull/g, block.bullet)\n .replace('hr', '\\\\n+(?=\\\\1?(?:(?:- *){3,}|(?:_ *){3,}|(?:\\\\* *){3,})(?:\\\\n+|$))')\n .replace('def', '\\\\n+(?=' + block.def.source + ')')\n .getRegex();\n\nblock._tag = 'address|article|aside|base|basefont|blockquote|body|caption'\n + '|center|col|colgroup|dd|details|dialog|dir|div|dl|dt|fieldset|figcaption'\n + '|figure|footer|form|frame|frameset|h[1-6]|head|header|hr|html|iframe'\n + '|legend|li|link|main|menu|menuitem|meta|nav|noframes|ol|optgroup|option'\n + '|p|param|section|source|summary|table|tbody|td|tfoot|th|thead|title|tr'\n + '|track|ul';\nblock._comment = //;\nblock.html = edit(block.html, 'i')\n .replace('comment', block._comment)\n .replace('tag', block._tag)\n .replace('attribute', / +[a-zA-Z:_][\\w.:-]*(?: *= *\"[^\"\\n]*\"| *= *'[^'\\n]*'| *= *[^\\s\"'=<>`]+)?/)\n .getRegex();\n\nblock.paragraph = edit(block.paragraph)\n .replace('hr', block.hr)\n .replace('heading', block.heading)\n .replace('lheading', block.lheading)\n .replace('tag', block._tag) // pars can be interrupted by type (6) html blocks\n .getRegex();\n\nblock.blockquote = edit(block.blockquote)\n .replace('paragraph', block.paragraph)\n .getRegex();\n\n/**\n * Normal Block Grammar\n */\n\nblock.normal = merge({}, block);\n\n/**\n * GFM Block Grammar\n */\n\nblock.gfm = merge({}, block.normal, {\n fences: /^ *(`{3,}|~{3,})[ \\.]*(\\S+)? *\\n([\\s\\S]*?)\\n? *\\1 *(?:\\n+|$)/,\n paragraph: /^/,\n heading: /^ *(#{1,6}) +([^\\n]+?) *#* *(?:\\n+|$)/\n});\n\nblock.gfm.paragraph = edit(block.paragraph)\n .replace('(?!', '(?!'\n + block.gfm.fences.source.replace('\\\\1', '\\\\2') + '|'\n + block.list.source.replace('\\\\1', '\\\\3') + '|')\n .getRegex();\n\n/**\n * GFM + Tables Block Grammar\n */\n\nblock.tables = merge({}, block.gfm, {\n nptable: /^ *([^|\\n ].*\\|.*)\\n *([-:]+ *\\|[-| :]*)(?:\\n((?:.*[^>\\n ].*(?:\\n|$))*)\\n*|$)/,\n table: /^ *\\|(.+)\\n *\\|?( *[-:]+[-| :]*)(?:\\n((?: *[^>\\n ].*(?:\\n|$))*)\\n*|$)/\n});\n\n/**\n * Pedantic grammar\n */\n\nblock.pedantic = merge({}, block.normal, {\n html: edit(\n '^ *(?:comment *(?:\\\\n|\\\\s*$)'\n + '|<(tag)[\\\\s\\\\S]+? *(?:\\\\n{2,}|\\\\s*$)' // closed tag\n + '|\\\\s]*)*?/?> *(?:\\\\n{2,}|\\\\s*$))')\n .replace('comment', block._comment)\n .replace(/tag/g, '(?!(?:'\n + 'a|em|strong|small|s|cite|q|dfn|abbr|data|time|code|var|samp|kbd|sub'\n + '|sup|i|b|u|mark|ruby|rt|rp|bdi|bdo|span|br|wbr|ins|del|img)'\n + '\\\\b)\\\\w+(?!:|[^\\\\w\\\\s@]*@)\\\\b')\n .getRegex(),\n def: /^ *\\[([^\\]]+)\\]: *]+)>?(?: +([\"(][^\\n]+[\")]))? *(?:\\n+|$)/\n});\n\n/**\n * Block Lexer\n */\n\nfunction Lexer(options) {\n this.tokens = [];\n this.tokens.links = {};\n this.options = options || marked.defaults;\n this.rules = block.normal;\n\n if (this.options.pedantic) {\n this.rules = block.pedantic;\n } else if (this.options.gfm) {\n if (this.options.tables) {\n this.rules = block.tables;\n } else {\n this.rules = block.gfm;\n }\n }\n}\n\n/**\n * Expose Block Rules\n */\n\nLexer.rules = block;\n\n/**\n * Static Lex Method\n */\n\nLexer.lex = function(src, options) {\n var lexer = new Lexer(options);\n return lexer.lex(src);\n};\n\n/**\n * Preprocessing\n */\n\nLexer.prototype.lex = function(src) {\n src = src\n .replace(/\\r\\n|\\r/g, '\\n')\n .replace(/\\t/g, ' ')\n .replace(/\\u00a0/g, ' ')\n .replace(/\\u2424/g, '\\n');\n\n return this.token(src, true);\n};\n\n/**\n * Lexing\n */\n\nLexer.prototype.token = function(src, top) {\n src = src.replace(/^ +$/gm, '');\n var next,\n loose,\n cap,\n bull,\n b,\n item,\n space,\n i,\n tag,\n l,\n isordered,\n istask,\n ischecked;\n\n while (src) {\n // newline\n if (cap = this.rules.newline.exec(src)) {\n src = src.substring(cap[0].length);\n if (cap[0].length > 1) {\n this.tokens.push({\n type: 'space'\n });\n }\n }\n\n // code\n if (cap = this.rules.code.exec(src)) {\n src = src.substring(cap[0].length);\n cap = cap[0].replace(/^ {4}/gm, '');\n this.tokens.push({\n type: 'code',\n text: !this.options.pedantic\n ? cap.replace(/\\n+$/, '')\n : cap\n });\n continue;\n }\n\n // fences (gfm)\n if (cap = this.rules.fences.exec(src)) {\n src = src.substring(cap[0].length);\n this.tokens.push({\n type: 'code',\n lang: cap[2],\n text: cap[3] || ''\n });\n continue;\n }\n\n // heading\n if (cap = this.rules.heading.exec(src)) {\n src = src.substring(cap[0].length);\n this.tokens.push({\n type: 'heading',\n depth: cap[1].length,\n text: cap[2]\n });\n continue;\n }\n\n // table no leading pipe (gfm)\n if (top && (cap = this.rules.nptable.exec(src))) {\n item = {\n type: 'table',\n header: splitCells(cap[1].replace(/^ *| *\\| *$/g, '')),\n align: cap[2].replace(/^ *|\\| *$/g, '').split(/ *\\| */),\n cells: cap[3] ? cap[3].replace(/\\n$/, '').split('\\n') : []\n };\n\n if (item.header.length === item.align.length) {\n src = src.substring(cap[0].length);\n\n for (i = 0; i < item.align.length; i++) {\n if (/^ *-+: *$/.test(item.align[i])) {\n item.align[i] = 'right';\n } else if (/^ *:-+: *$/.test(item.align[i])) {\n item.align[i] = 'center';\n } else if (/^ *:-+ *$/.test(item.align[i])) {\n item.align[i] = 'left';\n } else {\n item.align[i] = null;\n }\n }\n\n for (i = 0; i < item.cells.length; i++) {\n item.cells[i] = splitCells(item.cells[i], item.header.length);\n }\n\n this.tokens.push(item);\n\n continue;\n }\n }\n\n // hr\n if (cap = this.rules.hr.exec(src)) {\n src = src.substring(cap[0].length);\n this.tokens.push({\n type: 'hr'\n });\n continue;\n }\n\n // blockquote\n if (cap = this.rules.blockquote.exec(src)) {\n src = src.substring(cap[0].length);\n\n this.tokens.push({\n type: 'blockquote_start'\n });\n\n cap = cap[0].replace(/^ *> ?/gm, '');\n\n // Pass `top` to keep the current\n // \"toplevel\" state. This is exactly\n // how markdown.pl works.\n this.token(cap, top);\n\n this.tokens.push({\n type: 'blockquote_end'\n });\n\n continue;\n }\n\n // list\n if (cap = this.rules.list.exec(src)) {\n src = src.substring(cap[0].length);\n bull = cap[2];\n isordered = bull.length > 1;\n\n this.tokens.push({\n type: 'list_start',\n ordered: isordered,\n start: isordered ? +bull : ''\n });\n\n // Get each top-level item.\n cap = cap[0].match(this.rules.item);\n\n next = false;\n l = cap.length;\n i = 0;\n\n for (; i < l; i++) {\n item = cap[i];\n\n // Remove the list item's bullet\n // so it is seen as the next token.\n space = item.length;\n item = item.replace(/^ *([*+-]|\\d+\\.) +/, '');\n\n // Outdent whatever the\n // list item contains. Hacky.\n if (~item.indexOf('\\n ')) {\n space -= item.length;\n item = !this.options.pedantic\n ? item.replace(new RegExp('^ {1,' + space + '}', 'gm'), '')\n : item.replace(/^ {1,4}/gm, '');\n }\n\n // Determine whether the next list item belongs here.\n // Backpedal if it does not belong in this list.\n if (this.options.smartLists && i !== l - 1) {\n b = block.bullet.exec(cap[i + 1])[0];\n if (bull !== b && !(bull.length > 1 && b.length > 1)) {\n src = cap.slice(i + 1).join('\\n') + src;\n i = l - 1;\n }\n }\n\n // Determine whether item is loose or not.\n // Use: /(^|\\n)(?! )[^\\n]+\\n\\n(?!\\s*$)/\n // for discount behavior.\n loose = next || /\\n\\n(?!\\s*$)/.test(item);\n if (i !== l - 1) {\n next = item.charAt(item.length - 1) === '\\n';\n if (!loose) loose = next;\n }\n\n // Check for task list items\n istask = /^\\[[ xX]\\] /.test(item);\n ischecked = undefined;\n if (istask) {\n ischecked = item[1] !== ' ';\n item = item.replace(/^\\[[ xX]\\] +/, '');\n }\n\n this.tokens.push({\n type: loose\n ? 'loose_item_start'\n : 'list_item_start',\n task: istask,\n checked: ischecked\n });\n\n // Recurse.\n this.token(item, false);\n\n this.tokens.push({\n type: 'list_item_end'\n });\n }\n\n this.tokens.push({\n type: 'list_end'\n });\n\n continue;\n }\n\n // html\n if (cap = this.rules.html.exec(src)) {\n src = src.substring(cap[0].length);\n this.tokens.push({\n type: this.options.sanitize\n ? 'paragraph'\n : 'html',\n pre: !this.options.sanitizer\n && (cap[1] === 'pre' || cap[1] === 'script' || cap[1] === 'style'),\n text: cap[0]\n });\n continue;\n }\n\n // def\n if (top && (cap = this.rules.def.exec(src))) {\n src = src.substring(cap[0].length);\n if (cap[3]) cap[3] = cap[3].substring(1, cap[3].length - 1);\n tag = cap[1].toLowerCase().replace(/\\s+/g, ' ');\n if (!this.tokens.links[tag]) {\n this.tokens.links[tag] = {\n href: cap[2],\n title: cap[3]\n };\n }\n continue;\n }\n\n // table (gfm)\n if (top && (cap = this.rules.table.exec(src))) {\n item = {\n type: 'table',\n header: splitCells(cap[1].replace(/^ *| *\\| *$/g, '')),\n align: cap[2].replace(/^ *|\\| *$/g, '').split(/ *\\| */),\n cells: cap[3] ? cap[3].replace(/(?: *\\| *)?\\n$/, '').split('\\n') : []\n };\n\n if (item.header.length === item.align.length) {\n src = src.substring(cap[0].length);\n\n for (i = 0; i < item.align.length; i++) {\n if (/^ *-+: *$/.test(item.align[i])) {\n item.align[i] = 'right';\n } else if (/^ *:-+: *$/.test(item.align[i])) {\n item.align[i] = 'center';\n } else if (/^ *:-+ *$/.test(item.align[i])) {\n item.align[i] = 'left';\n } else {\n item.align[i] = null;\n }\n }\n\n for (i = 0; i < item.cells.length; i++) {\n item.cells[i] = splitCells(\n item.cells[i].replace(/^ *\\| *| *\\| *$/g, ''),\n item.header.length);\n }\n\n this.tokens.push(item);\n\n continue;\n }\n }\n\n // lheading\n if (cap = this.rules.lheading.exec(src)) {\n src = src.substring(cap[0].length);\n this.tokens.push({\n type: 'heading',\n depth: cap[2] === '=' ? 1 : 2,\n text: cap[1]\n });\n continue;\n }\n\n // top-level paragraph\n if (top && (cap = this.rules.paragraph.exec(src))) {\n src = src.substring(cap[0].length);\n this.tokens.push({\n type: 'paragraph',\n text: cap[1].charAt(cap[1].length - 1) === '\\n'\n ? cap[1].slice(0, -1)\n : cap[1]\n });\n continue;\n }\n\n // text\n if (cap = this.rules.text.exec(src)) {\n // Top-level should never reach here.\n src = src.substring(cap[0].length);\n this.tokens.push({\n type: 'text',\n text: cap[0]\n });\n continue;\n }\n\n if (src) {\n throw new Error('Infinite loop on byte: ' + src.charCodeAt(0));\n }\n }\n\n return this.tokens;\n};\n\n/**\n * Inline-Level Grammar\n */\n\nvar inline = {\n escape: /^\\\\([!\"#$%&'()*+,\\-./:;<=>?@\\[\\]\\\\^_`{|}~])/,\n autolink: /^<(scheme:[^\\s\\x00-\\x1f<>]*|email)>/,\n url: noop,\n tag: '^comment'\n + '|^' // self-closing tag\n + '|^<[a-zA-Z][\\\\w-]*(?:attribute)*?\\\\s*/?>' // open tag\n + '|^<\\\\?[\\\\s\\\\S]*?\\\\?>' // processing instruction, e.g. \n + '|^' // declaration, e.g. \n + '|^', // CDATA section\n link: /^!?\\[(label)\\]\\(href(?:\\s+(title))?\\s*\\)/,\n reflink: /^!?\\[(label)\\]\\[(?!\\s*\\])((?:\\\\[\\[\\]]?|[^\\[\\]\\\\])+)\\]/,\n nolink: /^!?\\[(?!\\s*\\])((?:\\[[^\\[\\]]*\\]|\\\\[\\[\\]]|[^\\[\\]])*)\\](?:\\[\\])?/,\n strong: /^__([^\\s][\\s\\S]*?[^\\s])__(?!_)|^\\*\\*([^\\s][\\s\\S]*?[^\\s])\\*\\*(?!\\*)|^__([^\\s])__(?!_)|^\\*\\*([^\\s])\\*\\*(?!\\*)/,\n em: /^_([^\\s][\\s\\S]*?[^\\s_])_(?!_)|^_([^\\s_][\\s\\S]*?[^\\s])_(?!_)|^\\*([^\\s][\\s\\S]*?[^\\s*])\\*(?!\\*)|^\\*([^\\s*][\\s\\S]*?[^\\s])\\*(?!\\*)|^_([^\\s_])_(?!_)|^\\*([^\\s*])\\*(?!\\*)/,\n code: /^(`+)\\s*([\\s\\S]*?[^`]?)\\s*\\1(?!`)/,\n br: /^ {2,}\\n(?!\\s*$)/,\n del: noop,\n text: /^[\\s\\S]+?(?=[\\\\?@\\[\\]\\\\^_`{|}~])/g;\n\ninline._scheme = /[a-zA-Z][a-zA-Z0-9+.-]{1,31}/;\ninline._email = /[a-zA-Z0-9.!#$%&'*+/=?^_`{|}~-]+(@)[a-zA-Z0-9](?:[a-zA-Z0-9-]{0,61}[a-zA-Z0-9])?(?:\\.[a-zA-Z0-9](?:[a-zA-Z0-9-]{0,61}[a-zA-Z0-9])?)+(?![-_])/;\ninline.autolink = edit(inline.autolink)\n .replace('scheme', inline._scheme)\n .replace('email', inline._email)\n .getRegex();\n\ninline._attribute = /\\s+[a-zA-Z:_][\\w.:-]*(?:\\s*=\\s*\"[^\"]*\"|\\s*=\\s*'[^']*'|\\s*=\\s*[^\\s\"'=<>`]+)?/;\n\ninline.tag = edit(inline.tag)\n .replace('comment', block._comment)\n .replace('attribute', inline._attribute)\n .getRegex();\n\ninline._label = /(?:\\[[^\\[\\]]*\\]|\\\\[\\[\\]]?|`[^`]*`|[^\\[\\]\\\\])*?/;\ninline._href = /\\s*(<(?:\\\\[<>]?|[^\\s<>\\\\])*>|(?:\\\\[()]?|\\([^\\s\\x00-\\x1f()\\\\]*\\)|[^\\s\\x00-\\x1f()\\\\])*?)/;\ninline._title = /\"(?:\\\\\"?|[^\"\\\\])*\"|'(?:\\\\'?|[^'\\\\])*'|\\((?:\\\\\\)?|[^)\\\\])*\\)/;\n\ninline.link = edit(inline.link)\n .replace('label', inline._label)\n .replace('href', inline._href)\n .replace('title', inline._title)\n .getRegex();\n\ninline.reflink = edit(inline.reflink)\n .replace('label', inline._label)\n .getRegex();\n\n/**\n * Normal Inline Grammar\n */\n\ninline.normal = merge({}, inline);\n\n/**\n * Pedantic Inline Grammar\n */\n\ninline.pedantic = merge({}, inline.normal, {\n strong: /^__(?=\\S)([\\s\\S]*?\\S)__(?!_)|^\\*\\*(?=\\S)([\\s\\S]*?\\S)\\*\\*(?!\\*)/,\n em: /^_(?=\\S)([\\s\\S]*?\\S)_(?!_)|^\\*(?=\\S)([\\s\\S]*?\\S)\\*(?!\\*)/,\n link: edit(/^!?\\[(label)\\]\\((.*?)\\)/)\n .replace('label', inline._label)\n .getRegex(),\n reflink: edit(/^!?\\[(label)\\]\\s*\\[([^\\]]*)\\]/)\n .replace('label', inline._label)\n .getRegex()\n});\n\n/**\n * GFM Inline Grammar\n */\n\ninline.gfm = merge({}, inline.normal, {\n escape: edit(inline.escape).replace('])', '~|])').getRegex(),\n url: edit(/^((?:ftp|https?):\\/\\/|www\\.)(?:[a-zA-Z0-9\\-]+\\.?)+[^\\s<]*|^email/)\n .replace('email', inline._email)\n .getRegex(),\n _backpedal: /(?:[^?!.,:;*_~()&]+|\\([^)]*\\)|&(?![a-zA-Z0-9]+;$)|[?!.,:;*_~)]+(?!$))+/,\n del: /^~~(?=\\S)([\\s\\S]*?\\S)~~/,\n text: edit(inline.text)\n .replace(']|', '~]|')\n .replace('|', '|https?://|ftp://|www\\\\.|[a-zA-Z0-9.!#$%&\\'*+/=?^_`{\\\\|}~-]+@|')\n .getRegex()\n});\n\n/**\n * GFM + Line Breaks Inline Grammar\n */\n\ninline.breaks = merge({}, inline.gfm, {\n br: edit(inline.br).replace('{2,}', '*').getRegex(),\n text: edit(inline.gfm.text).replace('{2,}', '*').getRegex()\n});\n\n/**\n * Inline Lexer & Compiler\n */\n\nfunction InlineLexer(links, options) {\n this.options = options || marked.defaults;\n this.links = links;\n this.rules = inline.normal;\n this.renderer = this.options.renderer || new Renderer();\n this.renderer.options = this.options;\n\n if (!this.links) {\n throw new Error('Tokens array requires a `links` property.');\n }\n\n if (this.options.pedantic) {\n this.rules = inline.pedantic;\n } else if (this.options.gfm) {\n if (this.options.breaks) {\n this.rules = inline.breaks;\n } else {\n this.rules = inline.gfm;\n }\n }\n}\n\n/**\n * Expose Inline Rules\n */\n\nInlineLexer.rules = inline;\n\n/**\n * Static Lexing/Compiling Method\n */\n\nInlineLexer.output = function(src, links, options) {\n var inline = new InlineLexer(links, options);\n return inline.output(src);\n};\n\n/**\n * Lexing/Compiling\n */\n\nInlineLexer.prototype.output = function(src) {\n var out = '',\n link,\n text,\n href,\n title,\n cap;\n\n while (src) {\n // escape\n if (cap = this.rules.escape.exec(src)) {\n src = src.substring(cap[0].length);\n out += cap[1];\n continue;\n }\n\n // autolink\n if (cap = this.rules.autolink.exec(src)) {\n src = src.substring(cap[0].length);\n if (cap[2] === '@') {\n text = escape(this.mangle(cap[1]));\n href = 'mailto:' + text;\n } else {\n text = escape(cap[1]);\n href = text;\n }\n out += this.renderer.link(href, null, text);\n continue;\n }\n\n // url (gfm)\n if (!this.inLink && (cap = this.rules.url.exec(src))) {\n cap[0] = this.rules._backpedal.exec(cap[0])[0];\n src = src.substring(cap[0].length);\n if (cap[2] === '@') {\n text = escape(cap[0]);\n href = 'mailto:' + text;\n } else {\n text = escape(cap[0]);\n if (cap[1] === 'www.') {\n href = 'http://' + text;\n } else {\n href = text;\n }\n }\n out += this.renderer.link(href, null, text);\n continue;\n }\n\n // tag\n if (cap = this.rules.tag.exec(src)) {\n if (!this.inLink && /^/i.test(cap[0])) {\n this.inLink = false;\n }\n src = src.substring(cap[0].length);\n out += this.options.sanitize\n ? this.options.sanitizer\n ? this.options.sanitizer(cap[0])\n : escape(cap[0])\n : cap[0]\n continue;\n }\n\n // link\n if (cap = this.rules.link.exec(src)) {\n src = src.substring(cap[0].length);\n this.inLink = true;\n href = cap[2];\n if (this.options.pedantic) {\n link = /^([^'\"]*[^\\s])\\s+(['\"])(.*)\\2/.exec(href);\n\n if (link) {\n href = link[1];\n title = link[3];\n } else {\n title = '';\n }\n } else {\n title = cap[3] ? cap[3].slice(1, -1) : '';\n }\n href = href.trim().replace(/^<([\\s\\S]*)>$/, '$1');\n out += this.outputLink(cap, {\n href: InlineLexer.escapes(href),\n title: InlineLexer.escapes(title)\n });\n this.inLink = false;\n continue;\n }\n\n // reflink, nolink\n if ((cap = this.rules.reflink.exec(src))\n || (cap = this.rules.nolink.exec(src))) {\n src = src.substring(cap[0].length);\n link = (cap[2] || cap[1]).replace(/\\s+/g, ' ');\n link = this.links[link.toLowerCase()];\n if (!link || !link.href) {\n out += cap[0].charAt(0);\n src = cap[0].substring(1) + src;\n continue;\n }\n this.inLink = true;\n out += this.outputLink(cap, link);\n this.inLink = false;\n continue;\n }\n\n // strong\n if (cap = this.rules.strong.exec(src)) {\n src = src.substring(cap[0].length);\n out += this.renderer.strong(this.output(cap[4] || cap[3] || cap[2] || cap[1]));\n continue;\n }\n\n // em\n if (cap = this.rules.em.exec(src)) {\n src = src.substring(cap[0].length);\n out += this.renderer.em(this.output(cap[6] || cap[5] || cap[4] || cap[3] || cap[2] || cap[1]));\n continue;\n }\n\n // code\n if (cap = this.rules.code.exec(src)) {\n src = src.substring(cap[0].length);\n out += this.renderer.codespan(escape(cap[2].trim(), true));\n continue;\n }\n\n // br\n if (cap = this.rules.br.exec(src)) {\n src = src.substring(cap[0].length);\n out += this.renderer.br();\n continue;\n }\n\n // del (gfm)\n if (cap = this.rules.del.exec(src)) {\n src = src.substring(cap[0].length);\n out += this.renderer.del(this.output(cap[1]));\n continue;\n }\n\n // text\n if (cap = this.rules.text.exec(src)) {\n src = src.substring(cap[0].length);\n out += this.renderer.text(escape(this.smartypants(cap[0])));\n continue;\n }\n\n if (src) {\n throw new Error('Infinite loop on byte: ' + src.charCodeAt(0));\n }\n }\n\n return out;\n};\n\nInlineLexer.escapes = function(text) {\n return text ? text.replace(InlineLexer.rules._escapes, '$1') : text;\n}\n\n/**\n * Compile Link\n */\n\nInlineLexer.prototype.outputLink = function(cap, link) {\n var href = link.href,\n title = link.title ? escape(link.title) : null;\n\n return cap[0].charAt(0) !== '!'\n ? this.renderer.link(href, title, this.output(cap[1]))\n : this.renderer.image(href, title, escape(cap[1]));\n};\n\n/**\n * Smartypants Transformations\n */\n\nInlineLexer.prototype.smartypants = function(text) {\n if (!this.options.smartypants) return text;\n return text\n // em-dashes\n .replace(/---/g, '\\u2014')\n // en-dashes\n .replace(/--/g, '\\u2013')\n // opening singles\n .replace(/(^|[-\\u2014/(\\[{\"\\s])'/g, '$1\\u2018')\n // closing singles & apostrophes\n .replace(/'/g, '\\u2019')\n // opening doubles\n .replace(/(^|[-\\u2014/(\\[{\\u2018\\s])\"/g, '$1\\u201c')\n // closing doubles\n .replace(/\"/g, '\\u201d')\n // ellipses\n .replace(/\\.{3}/g, '\\u2026');\n};\n\n/**\n * Mangle Links\n */\n\nInlineLexer.prototype.mangle = function(text) {\n if (!this.options.mangle) return text;\n var out = '',\n l = text.length,\n i = 0,\n ch;\n\n for (; i < l; i++) {\n ch = text.charCodeAt(i);\n if (Math.random() > 0.5) {\n ch = 'x' + ch.toString(16);\n }\n out += '&#' + ch + ';';\n }\n\n return out;\n};\n\n/**\n * Renderer\n */\n\nfunction Renderer(options) {\n this.options = options || marked.defaults;\n}\n\nRenderer.prototype.code = function(code, lang, escaped) {\n if (this.options.highlight) {\n var out = this.options.highlight(code, lang);\n if (out != null && out !== code) {\n escaped = true;\n code = out;\n }\n }\n\n if (!lang) {\n return '
'\n      + (escaped ? code : escape(code, true))\n      + '
';\n }\n\n return '
'\n    + (escaped ? code : escape(code, true))\n    + '
\\n';\n};\n\nRenderer.prototype.blockquote = function(quote) {\n return '
\\n' + quote + '
\\n';\n};\n\nRenderer.prototype.html = function(html) {\n return html;\n};\n\nRenderer.prototype.heading = function(text, level, raw) {\n if (this.options.headerIds) {\n return ''\n + text\n + '\\n';\n }\n // ignore IDs\n return '' + text + '\\n';\n};\n\nRenderer.prototype.hr = function() {\n return this.options.xhtml ? '
\\n' : '
\\n';\n};\n\nRenderer.prototype.list = function(body, ordered, start) {\n var type = ordered ? 'ol' : 'ul',\n startatt = (ordered && start !== 1) ? (' start=\"' + start + '\"') : '';\n return '<' + type + startatt + '>\\n' + body + '\\n';\n};\n\nRenderer.prototype.listitem = function(text) {\n return '
  • ' + text + '
  • \\n';\n};\n\nRenderer.prototype.checkbox = function(checked) {\n return ' ';\n}\n\nRenderer.prototype.paragraph = function(text) {\n return '

    ' + text + '

    \\n';\n};\n\nRenderer.prototype.table = function(header, body) {\n if (body) body = '' + body + '';\n\n return '\\n'\n + '\\n'\n + header\n + '\\n'\n + body\n + '
    \\n';\n};\n\nRenderer.prototype.tablerow = function(content) {\n return '\\n' + content + '\\n';\n};\n\nRenderer.prototype.tablecell = function(content, flags) {\n var type = flags.header ? 'th' : 'td';\n var tag = flags.align\n ? '<' + type + ' align=\"' + flags.align + '\">'\n : '<' + type + '>';\n return tag + content + '\\n';\n};\n\n// span level renderer\nRenderer.prototype.strong = function(text) {\n return '' + text + '';\n};\n\nRenderer.prototype.em = function(text) {\n return '' + text + '';\n};\n\nRenderer.prototype.codespan = function(text) {\n return '' + text + '';\n};\n\nRenderer.prototype.br = function() {\n return this.options.xhtml ? '
    ' : '
    ';\n};\n\nRenderer.prototype.del = function(text) {\n return '' + text + '';\n};\n\nRenderer.prototype.link = function(href, title, text) {\n if (this.options.sanitize) {\n try {\n var prot = decodeURIComponent(unescape(href))\n .replace(/[^\\w:]/g, '')\n .toLowerCase();\n } catch (e) {\n return text;\n }\n if (prot.indexOf('javascript:') === 0 || prot.indexOf('vbscript:') === 0 || prot.indexOf('data:') === 0) {\n return text;\n }\n }\n if (this.options.baseUrl && !originIndependentUrl.test(href)) {\n href = resolveUrl(this.options.baseUrl, href);\n }\n try {\n href = encodeURI(href).replace(/%25/g, '%');\n } catch (e) {\n return text;\n }\n var out = '
    ';\n return out;\n};\n\nRenderer.prototype.image = function(href, title, text) {\n if (this.options.baseUrl && !originIndependentUrl.test(href)) {\n href = resolveUrl(this.options.baseUrl, href);\n }\n var out = '\"'' : '>';\n return out;\n};\n\nRenderer.prototype.text = function(text) {\n return text;\n};\n\n/**\n * TextRenderer\n * returns only the textual part of the token\n */\n\nfunction TextRenderer() {}\n\n// no need for block level renderers\n\nTextRenderer.prototype.strong =\nTextRenderer.prototype.em =\nTextRenderer.prototype.codespan =\nTextRenderer.prototype.del =\nTextRenderer.prototype.text = function (text) {\n return text;\n}\n\nTextRenderer.prototype.link =\nTextRenderer.prototype.image = function(href, title, text) {\n return '' + text;\n}\n\nTextRenderer.prototype.br = function() {\n return '';\n}\n\n/**\n * Parsing & Compiling\n */\n\nfunction Parser(options) {\n this.tokens = [];\n this.token = null;\n this.options = options || marked.defaults;\n this.options.renderer = this.options.renderer || new Renderer();\n this.renderer = this.options.renderer;\n this.renderer.options = this.options;\n}\n\n/**\n * Static Parse Method\n */\n\nParser.parse = function(src, options) {\n var parser = new Parser(options);\n return parser.parse(src);\n};\n\n/**\n * Parse Loop\n */\n\nParser.prototype.parse = function(src) {\n this.inline = new InlineLexer(src.links, this.options);\n // use an InlineLexer with a TextRenderer to extract pure text\n this.inlineText = new InlineLexer(\n src.links,\n merge({}, this.options, {renderer: new TextRenderer()})\n );\n this.tokens = src.reverse();\n\n var out = '';\n while (this.next()) {\n out += this.tok();\n }\n\n return out;\n};\n\n/**\n * Next Token\n */\n\nParser.prototype.next = function() {\n return this.token = this.tokens.pop();\n};\n\n/**\n * Preview Next Token\n */\n\nParser.prototype.peek = function() {\n return this.tokens[this.tokens.length - 1] || 0;\n};\n\n/**\n * Parse Text Tokens\n */\n\nParser.prototype.parseText = function() {\n var body = this.token.text;\n\n while (this.peek().type === 'text') {\n body += '\\n' + this.next().text;\n }\n\n return this.inline.output(body);\n};\n\n/**\n * Parse Current Token\n */\n\nParser.prototype.tok = function() {\n switch (this.token.type) {\n case 'space': {\n return '';\n }\n case 'hr': {\n return this.renderer.hr();\n }\n case 'heading': {\n return this.renderer.heading(\n this.inline.output(this.token.text),\n this.token.depth,\n unescape(this.inlineText.output(this.token.text)));\n }\n case 'code': {\n return this.renderer.code(this.token.text,\n this.token.lang,\n this.token.escaped);\n }\n case 'table': {\n var header = '',\n body = '',\n i,\n row,\n cell,\n j;\n\n // header\n cell = '';\n for (i = 0; i < this.token.header.length; i++) {\n cell += this.renderer.tablecell(\n this.inline.output(this.token.header[i]),\n { header: true, align: this.token.align[i] }\n );\n }\n header += this.renderer.tablerow(cell);\n\n for (i = 0; i < this.token.cells.length; i++) {\n row = this.token.cells[i];\n\n cell = '';\n for (j = 0; j < row.length; j++) {\n cell += this.renderer.tablecell(\n this.inline.output(row[j]),\n { header: false, align: this.token.align[j] }\n );\n }\n\n body += this.renderer.tablerow(cell);\n }\n return this.renderer.table(header, body);\n }\n case 'blockquote_start': {\n body = '';\n\n while (this.next().type !== 'blockquote_end') {\n body += this.tok();\n }\n\n return this.renderer.blockquote(body);\n }\n case 'list_start': {\n body = '';\n var ordered = this.token.ordered,\n start = this.token.start;\n\n while (this.next().type !== 'list_end') {\n body += this.tok();\n }\n\n return this.renderer.list(body, ordered, start);\n }\n case 'list_item_start': {\n body = '';\n\n if (this.token.task) {\n body += this.renderer.checkbox(this.token.checked);\n }\n\n while (this.next().type !== 'list_item_end') {\n body += this.token.type === 'text'\n ? this.parseText()\n : this.tok();\n }\n\n return this.renderer.listitem(body);\n }\n case 'loose_item_start': {\n body = '';\n\n while (this.next().type !== 'list_item_end') {\n body += this.tok();\n }\n\n return this.renderer.listitem(body);\n }\n case 'html': {\n // TODO parse inline content if parameter markdown=1\n return this.renderer.html(this.token.text);\n }\n case 'paragraph': {\n return this.renderer.paragraph(this.inline.output(this.token.text));\n }\n case 'text': {\n return this.renderer.paragraph(this.parseText());\n }\n }\n};\n\n/**\n * Helpers\n */\n\nfunction escape(html, encode) {\n return html\n .replace(!encode ? /&(?!#?\\w+;)/g : /&/g, '&')\n .replace(//g, '>')\n .replace(/\"/g, '"')\n .replace(/'/g, ''');\n}\n\nfunction unescape(html) {\n // explicitly match decimal, hex, and named HTML entities\n return html.replace(/&(#(?:\\d+)|(?:#x[0-9A-Fa-f]+)|(?:\\w+));?/ig, function(_, n) {\n n = n.toLowerCase();\n if (n === 'colon') return ':';\n if (n.charAt(0) === '#') {\n return n.charAt(1) === 'x'\n ? String.fromCharCode(parseInt(n.substring(2), 16))\n : String.fromCharCode(+n.substring(1));\n }\n return '';\n });\n}\n\nfunction edit(regex, opt) {\n regex = regex.source || regex;\n opt = opt || '';\n return {\n replace: function(name, val) {\n val = val.source || val;\n val = val.replace(/(^|[^\\[])\\^/g, '$1');\n regex = regex.replace(name, val);\n return this;\n },\n getRegex: function() {\n return new RegExp(regex, opt);\n }\n };\n}\n\nfunction resolveUrl(base, href) {\n if (!baseUrls[' ' + base]) {\n // we can ignore everything in base after the last slash of its path component,\n // but we might need to add _that_\n // https://tools.ietf.org/html/rfc3986#section-3\n if (/^[^:]+:\\/*[^/]*$/.test(base)) {\n baseUrls[' ' + base] = base + '/';\n } else {\n baseUrls[' ' + base] = base.replace(/[^/]*$/, '');\n }\n }\n base = baseUrls[' ' + base];\n\n if (href.slice(0, 2) === '//') {\n return base.replace(/:[\\s\\S]*/, ':') + href;\n } else if (href.charAt(0) === '/') {\n return base.replace(/(:\\/*[^/]*)[\\s\\S]*/, '$1') + href;\n } else {\n return base + href;\n }\n}\nvar baseUrls = {};\nvar originIndependentUrl = /^$|^[a-z][a-z0-9+.-]*:|^[?#]/i;\n\nfunction noop() {}\nnoop.exec = noop;\n\nfunction merge(obj) {\n var i = 1,\n target,\n key;\n\n for (; i < arguments.length; i++) {\n target = arguments[i];\n for (key in target) {\n if (Object.prototype.hasOwnProperty.call(target, key)) {\n obj[key] = target[key];\n }\n }\n }\n\n return obj;\n}\n\nfunction splitCells(tableRow, count) {\n var cells = tableRow.replace(/([^\\\\])\\|/g, '$1 |').split(/ +\\| */),\n i = 0;\n\n if (cells.length > count) {\n cells.splice(count);\n } else {\n while (cells.length < count) cells.push('');\n }\n\n for (; i < cells.length; i++) {\n cells[i] = cells[i].replace(/\\\\\\|/g, '|');\n }\n return cells;\n}\n\n/**\n * Marked\n */\n\nfunction marked(src, opt, callback) {\n // throw error in case of non string input\n if (typeof src === 'undefined' || src === null) {\n throw new Error('marked(): input parameter is undefined or null');\n }\n if (typeof src !== 'string') {\n throw new Error('marked(): input parameter is of type '\n + Object.prototype.toString.call(src) + ', string expected');\n }\n\n if (callback || typeof opt === 'function') {\n if (!callback) {\n callback = opt;\n opt = null;\n }\n\n opt = merge({}, marked.defaults, opt || {});\n\n var highlight = opt.highlight,\n tokens,\n pending,\n i = 0;\n\n try {\n tokens = Lexer.lex(src, opt)\n } catch (e) {\n return callback(e);\n }\n\n pending = tokens.length;\n\n var done = function(err) {\n if (err) {\n opt.highlight = highlight;\n return callback(err);\n }\n\n var out;\n\n try {\n out = Parser.parse(tokens, opt);\n } catch (e) {\n err = e;\n }\n\n opt.highlight = highlight;\n\n return err\n ? callback(err)\n : callback(null, out);\n };\n\n if (!highlight || highlight.length < 3) {\n return done();\n }\n\n delete opt.highlight;\n\n if (!pending) return done();\n\n for (; i < tokens.length; i++) {\n (function(token) {\n if (token.type !== 'code') {\n return --pending || done();\n }\n return highlight(token.text, token.lang, function(err, code) {\n if (err) return done(err);\n if (code == null || code === token.text) {\n return --pending || done();\n }\n token.text = code;\n token.escaped = true;\n --pending || done();\n });\n })(tokens[i]);\n }\n\n return;\n }\n try {\n if (opt) opt = merge({}, marked.defaults, opt);\n return Parser.parse(Lexer.lex(src, opt), opt);\n } catch (e) {\n e.message += '\\nPlease report this to https://github.com/markedjs/marked.';\n if ((opt || marked.defaults).silent) {\n return '

    An error occurred:

    '\n        + escape(e.message + '', true)\n        + '
    ';\n }\n throw e;\n }\n}\n\n/**\n * Options\n */\n\nmarked.options =\nmarked.setOptions = function(opt) {\n merge(marked.defaults, opt);\n return marked;\n};\n\nmarked.getDefaults = function () {\n return {\n baseUrl: null,\n breaks: false,\n gfm: true,\n headerIds: true,\n headerPrefix: '',\n highlight: null,\n langPrefix: 'language-',\n mangle: true,\n pedantic: false,\n renderer: new Renderer(),\n sanitize: false,\n sanitizer: null,\n silent: false,\n smartLists: false,\n smartypants: false,\n tables: true,\n xhtml: false\n };\n}\n\nmarked.defaults = marked.getDefaults();\n\n/**\n * Expose\n */\n\nmarked.Parser = Parser;\nmarked.parser = Parser.parse;\n\nmarked.Renderer = Renderer;\nmarked.TextRenderer = TextRenderer;\n\nmarked.Lexer = Lexer;\nmarked.lexer = Lexer.lex;\n\nmarked.InlineLexer = InlineLexer;\nmarked.inlineLexer = InlineLexer.output;\n\nmarked.parse = marked;\n\nif (typeof module !== 'undefined' && typeof exports === 'object') {\n module.exports = marked;\n} else if (typeof define === 'function' && define.amd) {\n define(function() { return marked; });\n} else {\n root.marked = marked;\n}\n})(this || (typeof window !== 'undefined' ? window : global));\n","// 7.2.2 IsArray(argument)\nvar cof = require('./_cof');\nmodule.exports = Array.isArray || function isArray(arg) {\n return cof(arg) == 'Array';\n};\n","var dP = require('./_object-dp');\nvar anObject = require('./_an-object');\nvar getKeys = require('./_object-keys');\n\nmodule.exports = require('./_descriptors') ? Object.defineProperties : function defineProperties(O, Properties) {\n anObject(O);\n var keys = getKeys(Properties);\n var length = keys.length;\n var i = 0;\n var P;\n while (length > i) dP.f(O, P = keys[i++], Properties[P]);\n return O;\n};\n","var ctx = require('./_ctx');\nvar invoke = require('./_invoke');\nvar html = require('./_html');\nvar cel = require('./_dom-create');\nvar global = require('./_global');\nvar process = global.process;\nvar setTask = global.setImmediate;\nvar clearTask = global.clearImmediate;\nvar MessageChannel = global.MessageChannel;\nvar Dispatch = global.Dispatch;\nvar counter = 0;\nvar queue = {};\nvar ONREADYSTATECHANGE = 'onreadystatechange';\nvar defer, channel, port;\nvar run = function () {\n var id = +this;\n // eslint-disable-next-line no-prototype-builtins\n if (queue.hasOwnProperty(id)) {\n var fn = queue[id];\n delete queue[id];\n fn();\n }\n};\nvar listener = function (event) {\n run.call(event.data);\n};\n// Node.js 0.9+ & IE10+ has setImmediate, otherwise:\nif (!setTask || !clearTask) {\n setTask = function setImmediate(fn) {\n var args = [];\n var i = 1;\n while (arguments.length > i) args.push(arguments[i++]);\n queue[++counter] = function () {\n // eslint-disable-next-line no-new-func\n invoke(typeof fn == 'function' ? fn : Function(fn), args);\n };\n defer(counter);\n return counter;\n };\n clearTask = function clearImmediate(id) {\n delete queue[id];\n };\n // Node.js 0.8-\n if (require('./_cof')(process) == 'process') {\n defer = function (id) {\n process.nextTick(ctx(run, id, 1));\n };\n // Sphere (JS game engine) Dispatch API\n } else if (Dispatch && Dispatch.now) {\n defer = function (id) {\n Dispatch.now(ctx(run, id, 1));\n };\n // Browsers with MessageChannel, includes WebWorkers\n } else if (MessageChannel) {\n channel = new MessageChannel();\n port = channel.port2;\n channel.port1.onmessage = listener;\n defer = ctx(port.postMessage, port, 1);\n // Browsers with postMessage, skip WebWorkers\n // IE8 has postMessage, but it's sync & typeof its postMessage is 'object'\n } else if (global.addEventListener && typeof postMessage == 'function' && !global.importScripts) {\n defer = function (id) {\n global.postMessage(id + '', '*');\n };\n global.addEventListener('message', listener, false);\n // IE8-\n } else if (ONREADYSTATECHANGE in cel('script')) {\n defer = function (id) {\n html.appendChild(cel('script'))[ONREADYSTATECHANGE] = function () {\n html.removeChild(this);\n run.call(id);\n };\n };\n // Rest old browsers\n } else {\n defer = function (id) {\n setTimeout(ctx(run, id, 1), 0);\n };\n }\n}\nmodule.exports = {\n set: setTask,\n clear: clearTask\n};\n","// call something on iterator step with safe closing on error\nvar anObject = require('./_an-object');\nmodule.exports = function (iterator, fn, value, entries) {\n try {\n return entries ? fn(anObject(value)[0], value[1]) : fn(value);\n // 7.4.6 IteratorClose(iterator, completion)\n } catch (e) {\n var ret = iterator['return'];\n if (ret !== undefined) anObject(ret.call(iterator));\n throw e;\n }\n};\n","// getting tag from 19.1.3.6 Object.prototype.toString()\nvar cof = require('./_cof');\nvar TAG = require('./_wks')('toStringTag');\n// ES3 wrong here\nvar ARG = cof(function () { return arguments; }()) == 'Arguments';\n\n// fallback for IE11 Script Access Denied error\nvar tryGet = function (it, key) {\n try {\n return it[key];\n } catch (e) { /* empty */ }\n};\n\nmodule.exports = function (it) {\n var O, T, B;\n return it === undefined ? 'Undefined' : it === null ? 'Null'\n // @@toStringTag case\n : typeof (T = tryGet(O = Object(it), TAG)) == 'string' ? T\n // builtinTag case\n : ARG ? cof(O)\n // ES3 arguments fallback\n : (B = cof(O)) == 'Object' && typeof O.callee == 'function' ? 'Arguments' : B;\n};\n","'use strict';\n// 22.1.3.9 Array.prototype.findIndex(predicate, thisArg = undefined)\nvar $export = require('./_export');\nvar $find = require('./_array-methods')(6);\nvar KEY = 'findIndex';\nvar forced = true;\n// Shouldn't skip holes\nif (KEY in []) Array(1)[KEY](function () { forced = false; });\n$export($export.P + $export.F * forced, 'Array', {\n findIndex: function findIndex(callbackfn /* , that = undefined */) {\n return $find(this, callbackfn, arguments.length > 1 ? arguments[1] : undefined);\n }\n});\nrequire('./_add-to-unscopables')(KEY);\n","var isObject = require('./_is-object');\nvar document = require('./_global').document;\n// typeof document.createElement is 'object' in old IE\nvar is = isObject(document) && isObject(document.createElement);\nmodule.exports = function (it) {\n return is ? document.createElement(it) : {};\n};\n","var classof = require('./_classof');\nvar ITERATOR = require('./_wks')('iterator');\nvar Iterators = require('./_iterators');\nmodule.exports = require('./_core').getIteratorMethod = function (it) {\n if (it != undefined) return it[ITERATOR]\n || it['@@iterator']\n || Iterators[classof(it)];\n};\n","exports.f = Object.getOwnPropertySymbols;\n","var store = require('./_shared')('wks');\nvar uid = require('./_uid');\nvar Symbol = require('./_global').Symbol;\nvar USE_SYMBOL = typeof Symbol == 'function';\n\nvar $exports = module.exports = function (name) {\n return store[name] || (store[name] =\n USE_SYMBOL && Symbol[name] || (USE_SYMBOL ? Symbol : uid)('Symbol.' + name));\n};\n\n$exports.store = store;\n","/* globals __VUE_SSR_CONTEXT__ */\n\n// IMPORTANT: Do NOT use ES2015 features in this file (except for modules).\n// This module is a runtime utility for cleaner component module output and will\n// be included in the final webpack user bundle.\n\nexport default function normalizeComponent (\n scriptExports,\n render,\n staticRenderFns,\n functionalTemplate,\n injectStyles,\n scopeId,\n moduleIdentifier, /* server only */\n shadowMode /* vue-cli only */\n) {\n // Vue.extend constructor export interop\n var options = typeof scriptExports === 'function'\n ? scriptExports.options\n : scriptExports\n\n // render functions\n if (render) {\n options.render = render\n options.staticRenderFns = staticRenderFns\n options._compiled = true\n }\n\n // functional template\n if (functionalTemplate) {\n options.functional = true\n }\n\n // scopedId\n if (scopeId) {\n options._scopeId = 'data-v-' + scopeId\n }\n\n var hook\n if (moduleIdentifier) { // server build\n hook = function (context) {\n // 2.3 injection\n context =\n context || // cached call\n (this.$vnode && this.$vnode.ssrContext) || // stateful\n (this.parent && this.parent.$vnode && this.parent.$vnode.ssrContext) // functional\n // 2.2 with runInNewContext: true\n if (!context && typeof __VUE_SSR_CONTEXT__ !== 'undefined') {\n context = __VUE_SSR_CONTEXT__\n }\n // inject component styles\n if (injectStyles) {\n injectStyles.call(this, context)\n }\n // register component module identifier for async chunk inferrence\n if (context && context._registeredComponents) {\n context._registeredComponents.add(moduleIdentifier)\n }\n }\n // used by ssr in case component is cached and beforeCreate\n // never gets called\n options._ssrRegister = hook\n } else if (injectStyles) {\n hook = shadowMode\n ? function () { injectStyles.call(this, this.$root.$options.shadowRoot) }\n : injectStyles\n }\n\n if (hook) {\n if (options.functional) {\n // for template-only hot-reload because in that case the render fn doesn't\n // go through the normalizer\n options._injectStyles = hook\n // register for functioal component in vue file\n var originalRender = options.render\n options.render = function renderWithStyleInjection (h, context) {\n hook.call(context)\n return originalRender(h, context)\n }\n } else {\n // inject component registration as beforeCreate hook\n var existing = options.beforeCreate\n options.beforeCreate = existing\n ? [].concat(existing, hook)\n : [hook]\n }\n }\n\n return {\n exports: scriptExports,\n options: options\n }\n}\n","var global = require('./_global');\nvar hide = require('./_hide');\nvar has = require('./_has');\nvar SRC = require('./_uid')('src');\nvar TO_STRING = 'toString';\nvar $toString = Function[TO_STRING];\nvar TPL = ('' + $toString).split(TO_STRING);\n\nrequire('./_core').inspectSource = function (it) {\n return $toString.call(it);\n};\n\n(module.exports = function (O, key, val, safe) {\n var isFunction = typeof val == 'function';\n if (isFunction) has(val, 'name') || hide(val, 'name', key);\n if (O[key] === val) return;\n if (isFunction) has(val, SRC) || hide(val, SRC, O[key] ? '' + O[key] : TPL.join(String(key)));\n if (O === global) {\n O[key] = val;\n } else if (!safe) {\n delete O[key];\n hide(O, key, val);\n } else if (O[key]) {\n O[key] = val;\n } else {\n hide(O, key, val);\n }\n// add fake Function#toString for correct work wrapped methods / constructors with methods like LoDash isNative\n})(Function.prototype, TO_STRING, function toString() {\n return typeof this == 'function' && this[SRC] || $toString.call(this);\n});\n","// 19.1.2.2 / 15.2.3.5 Object.create(O [, Properties])\nvar anObject = require('./_an-object');\nvar dPs = require('./_object-dps');\nvar enumBugKeys = require('./_enum-bug-keys');\nvar IE_PROTO = require('./_shared-key')('IE_PROTO');\nvar Empty = function () { /* empty */ };\nvar PROTOTYPE = 'prototype';\n\n// Create object with fake `null` prototype: use iframe Object with cleared prototype\nvar createDict = function () {\n // Thrash, waste and sodomy: IE GC bug\n var iframe = require('./_dom-create')('iframe');\n var i = enumBugKeys.length;\n var lt = '<';\n var gt = '>';\n var iframeDocument;\n iframe.style.display = 'none';\n require('./_html').appendChild(iframe);\n iframe.src = 'javascript:'; // eslint-disable-line no-script-url\n // createDict = iframe.contentWindow.Object;\n // html.removeChild(iframe);\n iframeDocument = iframe.contentWindow.document;\n iframeDocument.open();\n iframeDocument.write(lt + 'script' + gt + 'document.F=Object' + lt + '/script' + gt);\n iframeDocument.close();\n createDict = iframeDocument.F;\n while (i--) delete createDict[PROTOTYPE][enumBugKeys[i]];\n return createDict();\n};\n\nmodule.exports = Object.create || function create(O, Properties) {\n var result;\n if (O !== null) {\n Empty[PROTOTYPE] = anObject(O);\n result = new Empty();\n Empty[PROTOTYPE] = null;\n // add \"__proto__\" for Object.getPrototypeOf polyfill\n result[IE_PROTO] = O;\n } else result = createDict();\n return Properties === undefined ? result : dPs(result, Properties);\n};\n","/*!\n * Vue.js v2.5.16\n * (c) 2014-2018 Evan You\n * Released under the MIT License.\n */\n/* */\n\nvar emptyObject = Object.freeze({});\n\n// these helpers produces better vm code in JS engines due to their\n// explicitness and function inlining\nfunction isUndef (v) {\n return v === undefined || v === null\n}\n\nfunction isDef (v) {\n return v !== undefined && v !== null\n}\n\nfunction isTrue (v) {\n return v === true\n}\n\nfunction isFalse (v) {\n return v === false\n}\n\n/**\n * Check if value is primitive\n */\nfunction isPrimitive (value) {\n return (\n typeof value === 'string' ||\n typeof value === 'number' ||\n // $flow-disable-line\n typeof value === 'symbol' ||\n typeof value === 'boolean'\n )\n}\n\n/**\n * Quick object check - this is primarily used to tell\n * Objects from primitive values when we know the value\n * is a JSON-compliant type.\n */\nfunction isObject (obj) {\n return obj !== null && typeof obj === 'object'\n}\n\n/**\n * Get the raw type string of a value e.g. [object Object]\n */\nvar _toString = Object.prototype.toString;\n\nfunction toRawType (value) {\n return _toString.call(value).slice(8, -1)\n}\n\n/**\n * Strict object type check. Only returns true\n * for plain JavaScript objects.\n */\nfunction isPlainObject (obj) {\n return _toString.call(obj) === '[object Object]'\n}\n\nfunction isRegExp (v) {\n return _toString.call(v) === '[object RegExp]'\n}\n\n/**\n * Check if val is a valid array index.\n */\nfunction isValidArrayIndex (val) {\n var n = parseFloat(String(val));\n return n >= 0 && Math.floor(n) === n && isFinite(val)\n}\n\n/**\n * Convert a value to a string that is actually rendered.\n */\nfunction toString (val) {\n return val == null\n ? ''\n : typeof val === 'object'\n ? JSON.stringify(val, null, 2)\n : String(val)\n}\n\n/**\n * Convert a input value to a number for persistence.\n * If the conversion fails, return original string.\n */\nfunction toNumber (val) {\n var n = parseFloat(val);\n return isNaN(n) ? val : n\n}\n\n/**\n * Make a map and return a function for checking if a key\n * is in that map.\n */\nfunction makeMap (\n str,\n expectsLowerCase\n) {\n var map = Object.create(null);\n var list = str.split(',');\n for (var i = 0; i < list.length; i++) {\n map[list[i]] = true;\n }\n return expectsLowerCase\n ? function (val) { return map[val.toLowerCase()]; }\n : function (val) { return map[val]; }\n}\n\n/**\n * Check if a tag is a built-in tag.\n */\nvar isBuiltInTag = makeMap('slot,component', true);\n\n/**\n * Check if a attribute is a reserved attribute.\n */\nvar isReservedAttribute = makeMap('key,ref,slot,slot-scope,is');\n\n/**\n * Remove an item from an array\n */\nfunction remove (arr, item) {\n if (arr.length) {\n var index = arr.indexOf(item);\n if (index > -1) {\n return arr.splice(index, 1)\n }\n }\n}\n\n/**\n * Check whether the object has the property.\n */\nvar hasOwnProperty = Object.prototype.hasOwnProperty;\nfunction hasOwn (obj, key) {\n return hasOwnProperty.call(obj, key)\n}\n\n/**\n * Create a cached version of a pure function.\n */\nfunction cached (fn) {\n var cache = Object.create(null);\n return (function cachedFn (str) {\n var hit = cache[str];\n return hit || (cache[str] = fn(str))\n })\n}\n\n/**\n * Camelize a hyphen-delimited string.\n */\nvar camelizeRE = /-(\\w)/g;\nvar camelize = cached(function (str) {\n return str.replace(camelizeRE, function (_, c) { return c ? c.toUpperCase() : ''; })\n});\n\n/**\n * Capitalize a string.\n */\nvar capitalize = cached(function (str) {\n return str.charAt(0).toUpperCase() + str.slice(1)\n});\n\n/**\n * Hyphenate a camelCase string.\n */\nvar hyphenateRE = /\\B([A-Z])/g;\nvar hyphenate = cached(function (str) {\n return str.replace(hyphenateRE, '-$1').toLowerCase()\n});\n\n/**\n * Simple bind polyfill for environments that do not support it... e.g.\n * PhantomJS 1.x. Technically we don't need this anymore since native bind is\n * now more performant in most browsers, but removing it would be breaking for\n * code that was able to run in PhantomJS 1.x, so this must be kept for\n * backwards compatibility.\n */\n\n/* istanbul ignore next */\nfunction polyfillBind (fn, ctx) {\n function boundFn (a) {\n var l = arguments.length;\n return l\n ? l > 1\n ? fn.apply(ctx, arguments)\n : fn.call(ctx, a)\n : fn.call(ctx)\n }\n\n boundFn._length = fn.length;\n return boundFn\n}\n\nfunction nativeBind (fn, ctx) {\n return fn.bind(ctx)\n}\n\nvar bind = Function.prototype.bind\n ? nativeBind\n : polyfillBind;\n\n/**\n * Convert an Array-like object to a real Array.\n */\nfunction toArray (list, start) {\n start = start || 0;\n var i = list.length - start;\n var ret = new Array(i);\n while (i--) {\n ret[i] = list[i + start];\n }\n return ret\n}\n\n/**\n * Mix properties into target object.\n */\nfunction extend (to, _from) {\n for (var key in _from) {\n to[key] = _from[key];\n }\n return to\n}\n\n/**\n * Merge an Array of Objects into a single Object.\n */\nfunction toObject (arr) {\n var res = {};\n for (var i = 0; i < arr.length; i++) {\n if (arr[i]) {\n extend(res, arr[i]);\n }\n }\n return res\n}\n\n/**\n * Perform no operation.\n * Stubbing args to make Flow happy without leaving useless transpiled code\n * with ...rest (https://flow.org/blog/2017/05/07/Strict-Function-Call-Arity/)\n */\nfunction noop (a, b, c) {}\n\n/**\n * Always return false.\n */\nvar no = function (a, b, c) { return false; };\n\n/**\n * Return same value\n */\nvar identity = function (_) { return _; };\n\n/**\n * Generate a static keys string from compiler modules.\n */\n\n\n/**\n * Check if two values are loosely equal - that is,\n * if they are plain objects, do they have the same shape?\n */\nfunction looseEqual (a, b) {\n if (a === b) { return true }\n var isObjectA = isObject(a);\n var isObjectB = isObject(b);\n if (isObjectA && isObjectB) {\n try {\n var isArrayA = Array.isArray(a);\n var isArrayB = Array.isArray(b);\n if (isArrayA && isArrayB) {\n return a.length === b.length && a.every(function (e, i) {\n return looseEqual(e, b[i])\n })\n } else if (!isArrayA && !isArrayB) {\n var keysA = Object.keys(a);\n var keysB = Object.keys(b);\n return keysA.length === keysB.length && keysA.every(function (key) {\n return looseEqual(a[key], b[key])\n })\n } else {\n /* istanbul ignore next */\n return false\n }\n } catch (e) {\n /* istanbul ignore next */\n return false\n }\n } else if (!isObjectA && !isObjectB) {\n return String(a) === String(b)\n } else {\n return false\n }\n}\n\nfunction looseIndexOf (arr, val) {\n for (var i = 0; i < arr.length; i++) {\n if (looseEqual(arr[i], val)) { return i }\n }\n return -1\n}\n\n/**\n * Ensure a function is called only once.\n */\nfunction once (fn) {\n var called = false;\n return function () {\n if (!called) {\n called = true;\n fn.apply(this, arguments);\n }\n }\n}\n\nvar SSR_ATTR = 'data-server-rendered';\n\nvar ASSET_TYPES = [\n 'component',\n 'directive',\n 'filter'\n];\n\nvar LIFECYCLE_HOOKS = [\n 'beforeCreate',\n 'created',\n 'beforeMount',\n 'mounted',\n 'beforeUpdate',\n 'updated',\n 'beforeDestroy',\n 'destroyed',\n 'activated',\n 'deactivated',\n 'errorCaptured'\n];\n\n/* */\n\nvar config = ({\n /**\n * Option merge strategies (used in core/util/options)\n */\n // $flow-disable-line\n optionMergeStrategies: Object.create(null),\n\n /**\n * Whether to suppress warnings.\n */\n silent: false,\n\n /**\n * Show production mode tip message on boot?\n */\n productionTip: process.env.NODE_ENV !== 'production',\n\n /**\n * Whether to enable devtools\n */\n devtools: process.env.NODE_ENV !== 'production',\n\n /**\n * Whether to record perf\n */\n performance: false,\n\n /**\n * Error handler for watcher errors\n */\n errorHandler: null,\n\n /**\n * Warn handler for watcher warns\n */\n warnHandler: null,\n\n /**\n * Ignore certain custom elements\n */\n ignoredElements: [],\n\n /**\n * Custom user key aliases for v-on\n */\n // $flow-disable-line\n keyCodes: Object.create(null),\n\n /**\n * Check if a tag is reserved so that it cannot be registered as a\n * component. This is platform-dependent and may be overwritten.\n */\n isReservedTag: no,\n\n /**\n * Check if an attribute is reserved so that it cannot be used as a component\n * prop. This is platform-dependent and may be overwritten.\n */\n isReservedAttr: no,\n\n /**\n * Check if a tag is an unknown element.\n * Platform-dependent.\n */\n isUnknownElement: no,\n\n /**\n * Get the namespace of an element\n */\n getTagNamespace: noop,\n\n /**\n * Parse the real tag name for the specific platform.\n */\n parsePlatformTagName: identity,\n\n /**\n * Check if an attribute must be bound using property, e.g. value\n * Platform-dependent.\n */\n mustUseProp: no,\n\n /**\n * Exposed for legacy reasons\n */\n _lifecycleHooks: LIFECYCLE_HOOKS\n})\n\n/* */\n\n/**\n * Check if a string starts with $ or _\n */\nfunction isReserved (str) {\n var c = (str + '').charCodeAt(0);\n return c === 0x24 || c === 0x5F\n}\n\n/**\n * Define a property.\n */\nfunction def (obj, key, val, enumerable) {\n Object.defineProperty(obj, key, {\n value: val,\n enumerable: !!enumerable,\n writable: true,\n configurable: true\n });\n}\n\n/**\n * Parse simple path.\n */\nvar bailRE = /[^\\w.$]/;\nfunction parsePath (path) {\n if (bailRE.test(path)) {\n return\n }\n var segments = path.split('.');\n return function (obj) {\n for (var i = 0; i < segments.length; i++) {\n if (!obj) { return }\n obj = obj[segments[i]];\n }\n return obj\n }\n}\n\n/* */\n\n// can we use __proto__?\nvar hasProto = '__proto__' in {};\n\n// Browser environment sniffing\nvar inBrowser = typeof window !== 'undefined';\nvar inWeex = typeof WXEnvironment !== 'undefined' && !!WXEnvironment.platform;\nvar weexPlatform = inWeex && WXEnvironment.platform.toLowerCase();\nvar UA = inBrowser && window.navigator.userAgent.toLowerCase();\nvar isIE = UA && /msie|trident/.test(UA);\nvar isIE9 = UA && UA.indexOf('msie 9.0') > 0;\nvar isEdge = UA && UA.indexOf('edge/') > 0;\nvar isAndroid = (UA && UA.indexOf('android') > 0) || (weexPlatform === 'android');\nvar isIOS = (UA && /iphone|ipad|ipod|ios/.test(UA)) || (weexPlatform === 'ios');\nvar isChrome = UA && /chrome\\/\\d+/.test(UA) && !isEdge;\n\n// Firefox has a \"watch\" function on Object.prototype...\nvar nativeWatch = ({}).watch;\n\nvar supportsPassive = false;\nif (inBrowser) {\n try {\n var opts = {};\n Object.defineProperty(opts, 'passive', ({\n get: function get () {\n /* istanbul ignore next */\n supportsPassive = true;\n }\n })); // https://github.com/facebook/flow/issues/285\n window.addEventListener('test-passive', null, opts);\n } catch (e) {}\n}\n\n// this needs to be lazy-evaled because vue may be required before\n// vue-server-renderer can set VUE_ENV\nvar _isServer;\nvar isServerRendering = function () {\n if (_isServer === undefined) {\n /* istanbul ignore if */\n if (!inBrowser && !inWeex && typeof global !== 'undefined') {\n // detect presence of vue-server-renderer and avoid\n // Webpack shimming the process\n _isServer = global['process'].env.VUE_ENV === 'server';\n } else {\n _isServer = false;\n }\n }\n return _isServer\n};\n\n// detect devtools\nvar devtools = inBrowser && window.__VUE_DEVTOOLS_GLOBAL_HOOK__;\n\n/* istanbul ignore next */\nfunction isNative (Ctor) {\n return typeof Ctor === 'function' && /native code/.test(Ctor.toString())\n}\n\nvar hasSymbol =\n typeof Symbol !== 'undefined' && isNative(Symbol) &&\n typeof Reflect !== 'undefined' && isNative(Reflect.ownKeys);\n\nvar _Set;\n/* istanbul ignore if */ // $flow-disable-line\nif (typeof Set !== 'undefined' && isNative(Set)) {\n // use native Set when available.\n _Set = Set;\n} else {\n // a non-standard Set polyfill that only works with primitive keys.\n _Set = (function () {\n function Set () {\n this.set = Object.create(null);\n }\n Set.prototype.has = function has (key) {\n return this.set[key] === true\n };\n Set.prototype.add = function add (key) {\n this.set[key] = true;\n };\n Set.prototype.clear = function clear () {\n this.set = Object.create(null);\n };\n\n return Set;\n }());\n}\n\n/* */\n\nvar warn = noop;\nvar tip = noop;\nvar generateComponentTrace = (noop); // work around flow check\nvar formatComponentName = (noop);\n\nif (process.env.NODE_ENV !== 'production') {\n var hasConsole = typeof console !== 'undefined';\n var classifyRE = /(?:^|[-_])(\\w)/g;\n var classify = function (str) { return str\n .replace(classifyRE, function (c) { return c.toUpperCase(); })\n .replace(/[-_]/g, ''); };\n\n warn = function (msg, vm) {\n var trace = vm ? generateComponentTrace(vm) : '';\n\n if (config.warnHandler) {\n config.warnHandler.call(null, msg, vm, trace);\n } else if (hasConsole && (!config.silent)) {\n console.error((\"[Vue warn]: \" + msg + trace));\n }\n };\n\n tip = function (msg, vm) {\n if (hasConsole && (!config.silent)) {\n console.warn(\"[Vue tip]: \" + msg + (\n vm ? generateComponentTrace(vm) : ''\n ));\n }\n };\n\n formatComponentName = function (vm, includeFile) {\n if (vm.$root === vm) {\n return ''\n }\n var options = typeof vm === 'function' && vm.cid != null\n ? vm.options\n : vm._isVue\n ? vm.$options || vm.constructor.options\n : vm || {};\n var name = options.name || options._componentTag;\n var file = options.__file;\n if (!name && file) {\n var match = file.match(/([^/\\\\]+)\\.vue$/);\n name = match && match[1];\n }\n\n return (\n (name ? (\"<\" + (classify(name)) + \">\") : \"\") +\n (file && includeFile !== false ? (\" at \" + file) : '')\n )\n };\n\n var repeat = function (str, n) {\n var res = '';\n while (n) {\n if (n % 2 === 1) { res += str; }\n if (n > 1) { str += str; }\n n >>= 1;\n }\n return res\n };\n\n generateComponentTrace = function (vm) {\n if (vm._isVue && vm.$parent) {\n var tree = [];\n var currentRecursiveSequence = 0;\n while (vm) {\n if (tree.length > 0) {\n var last = tree[tree.length - 1];\n if (last.constructor === vm.constructor) {\n currentRecursiveSequence++;\n vm = vm.$parent;\n continue\n } else if (currentRecursiveSequence > 0) {\n tree[tree.length - 1] = [last, currentRecursiveSequence];\n currentRecursiveSequence = 0;\n }\n }\n tree.push(vm);\n vm = vm.$parent;\n }\n return '\\n\\nfound in\\n\\n' + tree\n .map(function (vm, i) { return (\"\" + (i === 0 ? '---> ' : repeat(' ', 5 + i * 2)) + (Array.isArray(vm)\n ? ((formatComponentName(vm[0])) + \"... (\" + (vm[1]) + \" recursive calls)\")\n : formatComponentName(vm))); })\n .join('\\n')\n } else {\n return (\"\\n\\n(found in \" + (formatComponentName(vm)) + \")\")\n }\n };\n}\n\n/* */\n\n\nvar uid = 0;\n\n/**\n * A dep is an observable that can have multiple\n * directives subscribing to it.\n */\nvar Dep = function Dep () {\n this.id = uid++;\n this.subs = [];\n};\n\nDep.prototype.addSub = function addSub (sub) {\n this.subs.push(sub);\n};\n\nDep.prototype.removeSub = function removeSub (sub) {\n remove(this.subs, sub);\n};\n\nDep.prototype.depend = function depend () {\n if (Dep.target) {\n Dep.target.addDep(this);\n }\n};\n\nDep.prototype.notify = function notify () {\n // stabilize the subscriber list first\n var subs = this.subs.slice();\n for (var i = 0, l = subs.length; i < l; i++) {\n subs[i].update();\n }\n};\n\n// the current target watcher being evaluated.\n// this is globally unique because there could be only one\n// watcher being evaluated at any time.\nDep.target = null;\nvar targetStack = [];\n\nfunction pushTarget (_target) {\n if (Dep.target) { targetStack.push(Dep.target); }\n Dep.target = _target;\n}\n\nfunction popTarget () {\n Dep.target = targetStack.pop();\n}\n\n/* */\n\nvar VNode = function VNode (\n tag,\n data,\n children,\n text,\n elm,\n context,\n componentOptions,\n asyncFactory\n) {\n this.tag = tag;\n this.data = data;\n this.children = children;\n this.text = text;\n this.elm = elm;\n this.ns = undefined;\n this.context = context;\n this.fnContext = undefined;\n this.fnOptions = undefined;\n this.fnScopeId = undefined;\n this.key = data && data.key;\n this.componentOptions = componentOptions;\n this.componentInstance = undefined;\n this.parent = undefined;\n this.raw = false;\n this.isStatic = false;\n this.isRootInsert = true;\n this.isComment = false;\n this.isCloned = false;\n this.isOnce = false;\n this.asyncFactory = asyncFactory;\n this.asyncMeta = undefined;\n this.isAsyncPlaceholder = false;\n};\n\nvar prototypeAccessors = { child: { configurable: true } };\n\n// DEPRECATED: alias for componentInstance for backwards compat.\n/* istanbul ignore next */\nprototypeAccessors.child.get = function () {\n return this.componentInstance\n};\n\nObject.defineProperties( VNode.prototype, prototypeAccessors );\n\nvar createEmptyVNode = function (text) {\n if ( text === void 0 ) text = '';\n\n var node = new VNode();\n node.text = text;\n node.isComment = true;\n return node\n};\n\nfunction createTextVNode (val) {\n return new VNode(undefined, undefined, undefined, String(val))\n}\n\n// optimized shallow clone\n// used for static nodes and slot nodes because they may be reused across\n// multiple renders, cloning them avoids errors when DOM manipulations rely\n// on their elm reference.\nfunction cloneVNode (vnode) {\n var cloned = new VNode(\n vnode.tag,\n vnode.data,\n vnode.children,\n vnode.text,\n vnode.elm,\n vnode.context,\n vnode.componentOptions,\n vnode.asyncFactory\n );\n cloned.ns = vnode.ns;\n cloned.isStatic = vnode.isStatic;\n cloned.key = vnode.key;\n cloned.isComment = vnode.isComment;\n cloned.fnContext = vnode.fnContext;\n cloned.fnOptions = vnode.fnOptions;\n cloned.fnScopeId = vnode.fnScopeId;\n cloned.isCloned = true;\n return cloned\n}\n\n/*\n * not type checking this file because flow doesn't play well with\n * dynamically accessing methods on Array prototype\n */\n\nvar arrayProto = Array.prototype;\nvar arrayMethods = Object.create(arrayProto);\n\nvar methodsToPatch = [\n 'push',\n 'pop',\n 'shift',\n 'unshift',\n 'splice',\n 'sort',\n 'reverse'\n];\n\n/**\n * Intercept mutating methods and emit events\n */\nmethodsToPatch.forEach(function (method) {\n // cache original method\n var original = arrayProto[method];\n def(arrayMethods, method, function mutator () {\n var args = [], len = arguments.length;\n while ( len-- ) args[ len ] = arguments[ len ];\n\n var result = original.apply(this, args);\n var ob = this.__ob__;\n var inserted;\n switch (method) {\n case 'push':\n case 'unshift':\n inserted = args;\n break\n case 'splice':\n inserted = args.slice(2);\n break\n }\n if (inserted) { ob.observeArray(inserted); }\n // notify change\n ob.dep.notify();\n return result\n });\n});\n\n/* */\n\nvar arrayKeys = Object.getOwnPropertyNames(arrayMethods);\n\n/**\n * In some cases we may want to disable observation inside a component's\n * update computation.\n */\nvar shouldObserve = true;\n\nfunction toggleObserving (value) {\n shouldObserve = value;\n}\n\n/**\n * Observer class that is attached to each observed\n * object. Once attached, the observer converts the target\n * object's property keys into getter/setters that\n * collect dependencies and dispatch updates.\n */\nvar Observer = function Observer (value) {\n this.value = value;\n this.dep = new Dep();\n this.vmCount = 0;\n def(value, '__ob__', this);\n if (Array.isArray(value)) {\n var augment = hasProto\n ? protoAugment\n : copyAugment;\n augment(value, arrayMethods, arrayKeys);\n this.observeArray(value);\n } else {\n this.walk(value);\n }\n};\n\n/**\n * Walk through each property and convert them into\n * getter/setters. This method should only be called when\n * value type is Object.\n */\nObserver.prototype.walk = function walk (obj) {\n var keys = Object.keys(obj);\n for (var i = 0; i < keys.length; i++) {\n defineReactive(obj, keys[i]);\n }\n};\n\n/**\n * Observe a list of Array items.\n */\nObserver.prototype.observeArray = function observeArray (items) {\n for (var i = 0, l = items.length; i < l; i++) {\n observe(items[i]);\n }\n};\n\n// helpers\n\n/**\n * Augment an target Object or Array by intercepting\n * the prototype chain using __proto__\n */\nfunction protoAugment (target, src, keys) {\n /* eslint-disable no-proto */\n target.__proto__ = src;\n /* eslint-enable no-proto */\n}\n\n/**\n * Augment an target Object or Array by defining\n * hidden properties.\n */\n/* istanbul ignore next */\nfunction copyAugment (target, src, keys) {\n for (var i = 0, l = keys.length; i < l; i++) {\n var key = keys[i];\n def(target, key, src[key]);\n }\n}\n\n/**\n * Attempt to create an observer instance for a value,\n * returns the new observer if successfully observed,\n * or the existing observer if the value already has one.\n */\nfunction observe (value, asRootData) {\n if (!isObject(value) || value instanceof VNode) {\n return\n }\n var ob;\n if (hasOwn(value, '__ob__') && value.__ob__ instanceof Observer) {\n ob = value.__ob__;\n } else if (\n shouldObserve &&\n !isServerRendering() &&\n (Array.isArray(value) || isPlainObject(value)) &&\n Object.isExtensible(value) &&\n !value._isVue\n ) {\n ob = new Observer(value);\n }\n if (asRootData && ob) {\n ob.vmCount++;\n }\n return ob\n}\n\n/**\n * Define a reactive property on an Object.\n */\nfunction defineReactive (\n obj,\n key,\n val,\n customSetter,\n shallow\n) {\n var dep = new Dep();\n\n var property = Object.getOwnPropertyDescriptor(obj, key);\n if (property && property.configurable === false) {\n return\n }\n\n // cater for pre-defined getter/setters\n var getter = property && property.get;\n if (!getter && arguments.length === 2) {\n val = obj[key];\n }\n var setter = property && property.set;\n\n var childOb = !shallow && observe(val);\n Object.defineProperty(obj, key, {\n enumerable: true,\n configurable: true,\n get: function reactiveGetter () {\n var value = getter ? getter.call(obj) : val;\n if (Dep.target) {\n dep.depend();\n if (childOb) {\n childOb.dep.depend();\n if (Array.isArray(value)) {\n dependArray(value);\n }\n }\n }\n return value\n },\n set: function reactiveSetter (newVal) {\n var value = getter ? getter.call(obj) : val;\n /* eslint-disable no-self-compare */\n if (newVal === value || (newVal !== newVal && value !== value)) {\n return\n }\n /* eslint-enable no-self-compare */\n if (process.env.NODE_ENV !== 'production' && customSetter) {\n customSetter();\n }\n if (setter) {\n setter.call(obj, newVal);\n } else {\n val = newVal;\n }\n childOb = !shallow && observe(newVal);\n dep.notify();\n }\n });\n}\n\n/**\n * Set a property on an object. Adds the new property and\n * triggers change notification if the property doesn't\n * already exist.\n */\nfunction set (target, key, val) {\n if (process.env.NODE_ENV !== 'production' &&\n (isUndef(target) || isPrimitive(target))\n ) {\n warn((\"Cannot set reactive property on undefined, null, or primitive value: \" + ((target))));\n }\n if (Array.isArray(target) && isValidArrayIndex(key)) {\n target.length = Math.max(target.length, key);\n target.splice(key, 1, val);\n return val\n }\n if (key in target && !(key in Object.prototype)) {\n target[key] = val;\n return val\n }\n var ob = (target).__ob__;\n if (target._isVue || (ob && ob.vmCount)) {\n process.env.NODE_ENV !== 'production' && warn(\n 'Avoid adding reactive properties to a Vue instance or its root $data ' +\n 'at runtime - declare it upfront in the data option.'\n );\n return val\n }\n if (!ob) {\n target[key] = val;\n return val\n }\n defineReactive(ob.value, key, val);\n ob.dep.notify();\n return val\n}\n\n/**\n * Delete a property and trigger change if necessary.\n */\nfunction del (target, key) {\n if (process.env.NODE_ENV !== 'production' &&\n (isUndef(target) || isPrimitive(target))\n ) {\n warn((\"Cannot delete reactive property on undefined, null, or primitive value: \" + ((target))));\n }\n if (Array.isArray(target) && isValidArrayIndex(key)) {\n target.splice(key, 1);\n return\n }\n var ob = (target).__ob__;\n if (target._isVue || (ob && ob.vmCount)) {\n process.env.NODE_ENV !== 'production' && warn(\n 'Avoid deleting properties on a Vue instance or its root $data ' +\n '- just set it to null.'\n );\n return\n }\n if (!hasOwn(target, key)) {\n return\n }\n delete target[key];\n if (!ob) {\n return\n }\n ob.dep.notify();\n}\n\n/**\n * Collect dependencies on array elements when the array is touched, since\n * we cannot intercept array element access like property getters.\n */\nfunction dependArray (value) {\n for (var e = (void 0), i = 0, l = value.length; i < l; i++) {\n e = value[i];\n e && e.__ob__ && e.__ob__.dep.depend();\n if (Array.isArray(e)) {\n dependArray(e);\n }\n }\n}\n\n/* */\n\n/**\n * Option overwriting strategies are functions that handle\n * how to merge a parent option value and a child option\n * value into the final value.\n */\nvar strats = config.optionMergeStrategies;\n\n/**\n * Options with restrictions\n */\nif (process.env.NODE_ENV !== 'production') {\n strats.el = strats.propsData = function (parent, child, vm, key) {\n if (!vm) {\n warn(\n \"option \\\"\" + key + \"\\\" can only be used during instance \" +\n 'creation with the `new` keyword.'\n );\n }\n return defaultStrat(parent, child)\n };\n}\n\n/**\n * Helper that recursively merges two data objects together.\n */\nfunction mergeData (to, from) {\n if (!from) { return to }\n var key, toVal, fromVal;\n var keys = Object.keys(from);\n for (var i = 0; i < keys.length; i++) {\n key = keys[i];\n toVal = to[key];\n fromVal = from[key];\n if (!hasOwn(to, key)) {\n set(to, key, fromVal);\n } else if (isPlainObject(toVal) && isPlainObject(fromVal)) {\n mergeData(toVal, fromVal);\n }\n }\n return to\n}\n\n/**\n * Data\n */\nfunction mergeDataOrFn (\n parentVal,\n childVal,\n vm\n) {\n if (!vm) {\n // in a Vue.extend merge, both should be functions\n if (!childVal) {\n return parentVal\n }\n if (!parentVal) {\n return childVal\n }\n // when parentVal & childVal are both present,\n // we need to return a function that returns the\n // merged result of both functions... no need to\n // check if parentVal is a function here because\n // it has to be a function to pass previous merges.\n return function mergedDataFn () {\n return mergeData(\n typeof childVal === 'function' ? childVal.call(this, this) : childVal,\n typeof parentVal === 'function' ? parentVal.call(this, this) : parentVal\n )\n }\n } else {\n return function mergedInstanceDataFn () {\n // instance merge\n var instanceData = typeof childVal === 'function'\n ? childVal.call(vm, vm)\n : childVal;\n var defaultData = typeof parentVal === 'function'\n ? parentVal.call(vm, vm)\n : parentVal;\n if (instanceData) {\n return mergeData(instanceData, defaultData)\n } else {\n return defaultData\n }\n }\n }\n}\n\nstrats.data = function (\n parentVal,\n childVal,\n vm\n) {\n if (!vm) {\n if (childVal && typeof childVal !== 'function') {\n process.env.NODE_ENV !== 'production' && warn(\n 'The \"data\" option should be a function ' +\n 'that returns a per-instance value in component ' +\n 'definitions.',\n vm\n );\n\n return parentVal\n }\n return mergeDataOrFn(parentVal, childVal)\n }\n\n return mergeDataOrFn(parentVal, childVal, vm)\n};\n\n/**\n * Hooks and props are merged as arrays.\n */\nfunction mergeHook (\n parentVal,\n childVal\n) {\n return childVal\n ? parentVal\n ? parentVal.concat(childVal)\n : Array.isArray(childVal)\n ? childVal\n : [childVal]\n : parentVal\n}\n\nLIFECYCLE_HOOKS.forEach(function (hook) {\n strats[hook] = mergeHook;\n});\n\n/**\n * Assets\n *\n * When a vm is present (instance creation), we need to do\n * a three-way merge between constructor options, instance\n * options and parent options.\n */\nfunction mergeAssets (\n parentVal,\n childVal,\n vm,\n key\n) {\n var res = Object.create(parentVal || null);\n if (childVal) {\n process.env.NODE_ENV !== 'production' && assertObjectType(key, childVal, vm);\n return extend(res, childVal)\n } else {\n return res\n }\n}\n\nASSET_TYPES.forEach(function (type) {\n strats[type + 's'] = mergeAssets;\n});\n\n/**\n * Watchers.\n *\n * Watchers hashes should not overwrite one\n * another, so we merge them as arrays.\n */\nstrats.watch = function (\n parentVal,\n childVal,\n vm,\n key\n) {\n // work around Firefox's Object.prototype.watch...\n if (parentVal === nativeWatch) { parentVal = undefined; }\n if (childVal === nativeWatch) { childVal = undefined; }\n /* istanbul ignore if */\n if (!childVal) { return Object.create(parentVal || null) }\n if (process.env.NODE_ENV !== 'production') {\n assertObjectType(key, childVal, vm);\n }\n if (!parentVal) { return childVal }\n var ret = {};\n extend(ret, parentVal);\n for (var key$1 in childVal) {\n var parent = ret[key$1];\n var child = childVal[key$1];\n if (parent && !Array.isArray(parent)) {\n parent = [parent];\n }\n ret[key$1] = parent\n ? parent.concat(child)\n : Array.isArray(child) ? child : [child];\n }\n return ret\n};\n\n/**\n * Other object hashes.\n */\nstrats.props =\nstrats.methods =\nstrats.inject =\nstrats.computed = function (\n parentVal,\n childVal,\n vm,\n key\n) {\n if (childVal && process.env.NODE_ENV !== 'production') {\n assertObjectType(key, childVal, vm);\n }\n if (!parentVal) { return childVal }\n var ret = Object.create(null);\n extend(ret, parentVal);\n if (childVal) { extend(ret, childVal); }\n return ret\n};\nstrats.provide = mergeDataOrFn;\n\n/**\n * Default strategy.\n */\nvar defaultStrat = function (parentVal, childVal) {\n return childVal === undefined\n ? parentVal\n : childVal\n};\n\n/**\n * Validate component names\n */\nfunction checkComponents (options) {\n for (var key in options.components) {\n validateComponentName(key);\n }\n}\n\nfunction validateComponentName (name) {\n if (!/^[a-zA-Z][\\w-]*$/.test(name)) {\n warn(\n 'Invalid component name: \"' + name + '\". Component names ' +\n 'can only contain alphanumeric characters and the hyphen, ' +\n 'and must start with a letter.'\n );\n }\n if (isBuiltInTag(name) || config.isReservedTag(name)) {\n warn(\n 'Do not use built-in or reserved HTML elements as component ' +\n 'id: ' + name\n );\n }\n}\n\n/**\n * Ensure all props option syntax are normalized into the\n * Object-based format.\n */\nfunction normalizeProps (options, vm) {\n var props = options.props;\n if (!props) { return }\n var res = {};\n var i, val, name;\n if (Array.isArray(props)) {\n i = props.length;\n while (i--) {\n val = props[i];\n if (typeof val === 'string') {\n name = camelize(val);\n res[name] = { type: null };\n } else if (process.env.NODE_ENV !== 'production') {\n warn('props must be strings when using array syntax.');\n }\n }\n } else if (isPlainObject(props)) {\n for (var key in props) {\n val = props[key];\n name = camelize(key);\n res[name] = isPlainObject(val)\n ? val\n : { type: val };\n }\n } else if (process.env.NODE_ENV !== 'production') {\n warn(\n \"Invalid value for option \\\"props\\\": expected an Array or an Object, \" +\n \"but got \" + (toRawType(props)) + \".\",\n vm\n );\n }\n options.props = res;\n}\n\n/**\n * Normalize all injections into Object-based format\n */\nfunction normalizeInject (options, vm) {\n var inject = options.inject;\n if (!inject) { return }\n var normalized = options.inject = {};\n if (Array.isArray(inject)) {\n for (var i = 0; i < inject.length; i++) {\n normalized[inject[i]] = { from: inject[i] };\n }\n } else if (isPlainObject(inject)) {\n for (var key in inject) {\n var val = inject[key];\n normalized[key] = isPlainObject(val)\n ? extend({ from: key }, val)\n : { from: val };\n }\n } else if (process.env.NODE_ENV !== 'production') {\n warn(\n \"Invalid value for option \\\"inject\\\": expected an Array or an Object, \" +\n \"but got \" + (toRawType(inject)) + \".\",\n vm\n );\n }\n}\n\n/**\n * Normalize raw function directives into object format.\n */\nfunction normalizeDirectives (options) {\n var dirs = options.directives;\n if (dirs) {\n for (var key in dirs) {\n var def = dirs[key];\n if (typeof def === 'function') {\n dirs[key] = { bind: def, update: def };\n }\n }\n }\n}\n\nfunction assertObjectType (name, value, vm) {\n if (!isPlainObject(value)) {\n warn(\n \"Invalid value for option \\\"\" + name + \"\\\": expected an Object, \" +\n \"but got \" + (toRawType(value)) + \".\",\n vm\n );\n }\n}\n\n/**\n * Merge two option objects into a new one.\n * Core utility used in both instantiation and inheritance.\n */\nfunction mergeOptions (\n parent,\n child,\n vm\n) {\n if (process.env.NODE_ENV !== 'production') {\n checkComponents(child);\n }\n\n if (typeof child === 'function') {\n child = child.options;\n }\n\n normalizeProps(child, vm);\n normalizeInject(child, vm);\n normalizeDirectives(child);\n var extendsFrom = child.extends;\n if (extendsFrom) {\n parent = mergeOptions(parent, extendsFrom, vm);\n }\n if (child.mixins) {\n for (var i = 0, l = child.mixins.length; i < l; i++) {\n parent = mergeOptions(parent, child.mixins[i], vm);\n }\n }\n var options = {};\n var key;\n for (key in parent) {\n mergeField(key);\n }\n for (key in child) {\n if (!hasOwn(parent, key)) {\n mergeField(key);\n }\n }\n function mergeField (key) {\n var strat = strats[key] || defaultStrat;\n options[key] = strat(parent[key], child[key], vm, key);\n }\n return options\n}\n\n/**\n * Resolve an asset.\n * This function is used because child instances need access\n * to assets defined in its ancestor chain.\n */\nfunction resolveAsset (\n options,\n type,\n id,\n warnMissing\n) {\n /* istanbul ignore if */\n if (typeof id !== 'string') {\n return\n }\n var assets = options[type];\n // check local registration variations first\n if (hasOwn(assets, id)) { return assets[id] }\n var camelizedId = camelize(id);\n if (hasOwn(assets, camelizedId)) { return assets[camelizedId] }\n var PascalCaseId = capitalize(camelizedId);\n if (hasOwn(assets, PascalCaseId)) { return assets[PascalCaseId] }\n // fallback to prototype chain\n var res = assets[id] || assets[camelizedId] || assets[PascalCaseId];\n if (process.env.NODE_ENV !== 'production' && warnMissing && !res) {\n warn(\n 'Failed to resolve ' + type.slice(0, -1) + ': ' + id,\n options\n );\n }\n return res\n}\n\n/* */\n\nfunction validateProp (\n key,\n propOptions,\n propsData,\n vm\n) {\n var prop = propOptions[key];\n var absent = !hasOwn(propsData, key);\n var value = propsData[key];\n // boolean casting\n var booleanIndex = getTypeIndex(Boolean, prop.type);\n if (booleanIndex > -1) {\n if (absent && !hasOwn(prop, 'default')) {\n value = false;\n } else if (value === '' || value === hyphenate(key)) {\n // only cast empty string / same name to boolean if\n // boolean has higher priority\n var stringIndex = getTypeIndex(String, prop.type);\n if (stringIndex < 0 || booleanIndex < stringIndex) {\n value = true;\n }\n }\n }\n // check default value\n if (value === undefined) {\n value = getPropDefaultValue(vm, prop, key);\n // since the default value is a fresh copy,\n // make sure to observe it.\n var prevShouldObserve = shouldObserve;\n toggleObserving(true);\n observe(value);\n toggleObserving(prevShouldObserve);\n }\n if (\n process.env.NODE_ENV !== 'production' &&\n // skip validation for weex recycle-list child component props\n !(false && isObject(value) && ('@binding' in value))\n ) {\n assertProp(prop, key, value, vm, absent);\n }\n return value\n}\n\n/**\n * Get the default value of a prop.\n */\nfunction getPropDefaultValue (vm, prop, key) {\n // no default, return undefined\n if (!hasOwn(prop, 'default')) {\n return undefined\n }\n var def = prop.default;\n // warn against non-factory defaults for Object & Array\n if (process.env.NODE_ENV !== 'production' && isObject(def)) {\n warn(\n 'Invalid default value for prop \"' + key + '\": ' +\n 'Props with type Object/Array must use a factory function ' +\n 'to return the default value.',\n vm\n );\n }\n // the raw prop value was also undefined from previous render,\n // return previous default value to avoid unnecessary watcher trigger\n if (vm && vm.$options.propsData &&\n vm.$options.propsData[key] === undefined &&\n vm._props[key] !== undefined\n ) {\n return vm._props[key]\n }\n // call factory function for non-Function types\n // a value is Function if its prototype is function even across different execution context\n return typeof def === 'function' && getType(prop.type) !== 'Function'\n ? def.call(vm)\n : def\n}\n\n/**\n * Assert whether a prop is valid.\n */\nfunction assertProp (\n prop,\n name,\n value,\n vm,\n absent\n) {\n if (prop.required && absent) {\n warn(\n 'Missing required prop: \"' + name + '\"',\n vm\n );\n return\n }\n if (value == null && !prop.required) {\n return\n }\n var type = prop.type;\n var valid = !type || type === true;\n var expectedTypes = [];\n if (type) {\n if (!Array.isArray(type)) {\n type = [type];\n }\n for (var i = 0; i < type.length && !valid; i++) {\n var assertedType = assertType(value, type[i]);\n expectedTypes.push(assertedType.expectedType || '');\n valid = assertedType.valid;\n }\n }\n if (!valid) {\n warn(\n \"Invalid prop: type check failed for prop \\\"\" + name + \"\\\".\" +\n \" Expected \" + (expectedTypes.map(capitalize).join(', ')) +\n \", got \" + (toRawType(value)) + \".\",\n vm\n );\n return\n }\n var validator = prop.validator;\n if (validator) {\n if (!validator(value)) {\n warn(\n 'Invalid prop: custom validator check failed for prop \"' + name + '\".',\n vm\n );\n }\n }\n}\n\nvar simpleCheckRE = /^(String|Number|Boolean|Function|Symbol)$/;\n\nfunction assertType (value, type) {\n var valid;\n var expectedType = getType(type);\n if (simpleCheckRE.test(expectedType)) {\n var t = typeof value;\n valid = t === expectedType.toLowerCase();\n // for primitive wrapper objects\n if (!valid && t === 'object') {\n valid = value instanceof type;\n }\n } else if (expectedType === 'Object') {\n valid = isPlainObject(value);\n } else if (expectedType === 'Array') {\n valid = Array.isArray(value);\n } else {\n valid = value instanceof type;\n }\n return {\n valid: valid,\n expectedType: expectedType\n }\n}\n\n/**\n * Use function string name to check built-in types,\n * because a simple equality check will fail when running\n * across different vms / iframes.\n */\nfunction getType (fn) {\n var match = fn && fn.toString().match(/^\\s*function (\\w+)/);\n return match ? match[1] : ''\n}\n\nfunction isSameType (a, b) {\n return getType(a) === getType(b)\n}\n\nfunction getTypeIndex (type, expectedTypes) {\n if (!Array.isArray(expectedTypes)) {\n return isSameType(expectedTypes, type) ? 0 : -1\n }\n for (var i = 0, len = expectedTypes.length; i < len; i++) {\n if (isSameType(expectedTypes[i], type)) {\n return i\n }\n }\n return -1\n}\n\n/* */\n\nfunction handleError (err, vm, info) {\n if (vm) {\n var cur = vm;\n while ((cur = cur.$parent)) {\n var hooks = cur.$options.errorCaptured;\n if (hooks) {\n for (var i = 0; i < hooks.length; i++) {\n try {\n var capture = hooks[i].call(cur, err, vm, info) === false;\n if (capture) { return }\n } catch (e) {\n globalHandleError(e, cur, 'errorCaptured hook');\n }\n }\n }\n }\n }\n globalHandleError(err, vm, info);\n}\n\nfunction globalHandleError (err, vm, info) {\n if (config.errorHandler) {\n try {\n return config.errorHandler.call(null, err, vm, info)\n } catch (e) {\n logError(e, null, 'config.errorHandler');\n }\n }\n logError(err, vm, info);\n}\n\nfunction logError (err, vm, info) {\n if (process.env.NODE_ENV !== 'production') {\n warn((\"Error in \" + info + \": \\\"\" + (err.toString()) + \"\\\"\"), vm);\n }\n /* istanbul ignore else */\n if ((inBrowser || inWeex) && typeof console !== 'undefined') {\n console.error(err);\n } else {\n throw err\n }\n}\n\n/* */\n/* globals MessageChannel */\n\nvar callbacks = [];\nvar pending = false;\n\nfunction flushCallbacks () {\n pending = false;\n var copies = callbacks.slice(0);\n callbacks.length = 0;\n for (var i = 0; i < copies.length; i++) {\n copies[i]();\n }\n}\n\n// Here we have async deferring wrappers using both microtasks and (macro) tasks.\n// In < 2.4 we used microtasks everywhere, but there are some scenarios where\n// microtasks have too high a priority and fire in between supposedly\n// sequential events (e.g. #4521, #6690) or even between bubbling of the same\n// event (#6566). However, using (macro) tasks everywhere also has subtle problems\n// when state is changed right before repaint (e.g. #6813, out-in transitions).\n// Here we use microtask by default, but expose a way to force (macro) task when\n// needed (e.g. in event handlers attached by v-on).\nvar microTimerFunc;\nvar macroTimerFunc;\nvar useMacroTask = false;\n\n// Determine (macro) task defer implementation.\n// Technically setImmediate should be the ideal choice, but it's only available\n// in IE. The only polyfill that consistently queues the callback after all DOM\n// events triggered in the same loop is by using MessageChannel.\n/* istanbul ignore if */\nif (typeof setImmediate !== 'undefined' && isNative(setImmediate)) {\n macroTimerFunc = function () {\n setImmediate(flushCallbacks);\n };\n} else if (typeof MessageChannel !== 'undefined' && (\n isNative(MessageChannel) ||\n // PhantomJS\n MessageChannel.toString() === '[object MessageChannelConstructor]'\n)) {\n var channel = new MessageChannel();\n var port = channel.port2;\n channel.port1.onmessage = flushCallbacks;\n macroTimerFunc = function () {\n port.postMessage(1);\n };\n} else {\n /* istanbul ignore next */\n macroTimerFunc = function () {\n setTimeout(flushCallbacks, 0);\n };\n}\n\n// Determine microtask defer implementation.\n/* istanbul ignore next, $flow-disable-line */\nif (typeof Promise !== 'undefined' && isNative(Promise)) {\n var p = Promise.resolve();\n microTimerFunc = function () {\n p.then(flushCallbacks);\n // in problematic UIWebViews, Promise.then doesn't completely break, but\n // it can get stuck in a weird state where callbacks are pushed into the\n // microtask queue but the queue isn't being flushed, until the browser\n // needs to do some other work, e.g. handle a timer. Therefore we can\n // \"force\" the microtask queue to be flushed by adding an empty timer.\n if (isIOS) { setTimeout(noop); }\n };\n} else {\n // fallback to macro\n microTimerFunc = macroTimerFunc;\n}\n\n/**\n * Wrap a function so that if any code inside triggers state change,\n * the changes are queued using a (macro) task instead of a microtask.\n */\nfunction withMacroTask (fn) {\n return fn._withTask || (fn._withTask = function () {\n useMacroTask = true;\n var res = fn.apply(null, arguments);\n useMacroTask = false;\n return res\n })\n}\n\nfunction nextTick (cb, ctx) {\n var _resolve;\n callbacks.push(function () {\n if (cb) {\n try {\n cb.call(ctx);\n } catch (e) {\n handleError(e, ctx, 'nextTick');\n }\n } else if (_resolve) {\n _resolve(ctx);\n }\n });\n if (!pending) {\n pending = true;\n if (useMacroTask) {\n macroTimerFunc();\n } else {\n microTimerFunc();\n }\n }\n // $flow-disable-line\n if (!cb && typeof Promise !== 'undefined') {\n return new Promise(function (resolve) {\n _resolve = resolve;\n })\n }\n}\n\n/* */\n\n/* not type checking this file because flow doesn't play well with Proxy */\n\nvar initProxy;\n\nif (process.env.NODE_ENV !== 'production') {\n var allowedGlobals = makeMap(\n 'Infinity,undefined,NaN,isFinite,isNaN,' +\n 'parseFloat,parseInt,decodeURI,decodeURIComponent,encodeURI,encodeURIComponent,' +\n 'Math,Number,Date,Array,Object,Boolean,String,RegExp,Map,Set,JSON,Intl,' +\n 'require' // for Webpack/Browserify\n );\n\n var warnNonPresent = function (target, key) {\n warn(\n \"Property or method \\\"\" + key + \"\\\" is not defined on the instance but \" +\n 'referenced during render. Make sure that this property is reactive, ' +\n 'either in the data option, or for class-based components, by ' +\n 'initializing the property. ' +\n 'See: https://vuejs.org/v2/guide/reactivity.html#Declaring-Reactive-Properties.',\n target\n );\n };\n\n var hasProxy =\n typeof Proxy !== 'undefined' && isNative(Proxy);\n\n if (hasProxy) {\n var isBuiltInModifier = makeMap('stop,prevent,self,ctrl,shift,alt,meta,exact');\n config.keyCodes = new Proxy(config.keyCodes, {\n set: function set (target, key, value) {\n if (isBuiltInModifier(key)) {\n warn((\"Avoid overwriting built-in modifier in config.keyCodes: .\" + key));\n return false\n } else {\n target[key] = value;\n return true\n }\n }\n });\n }\n\n var hasHandler = {\n has: function has (target, key) {\n var has = key in target;\n var isAllowed = allowedGlobals(key) || key.charAt(0) === '_';\n if (!has && !isAllowed) {\n warnNonPresent(target, key);\n }\n return has || !isAllowed\n }\n };\n\n var getHandler = {\n get: function get (target, key) {\n if (typeof key === 'string' && !(key in target)) {\n warnNonPresent(target, key);\n }\n return target[key]\n }\n };\n\n initProxy = function initProxy (vm) {\n if (hasProxy) {\n // determine which proxy handler to use\n var options = vm.$options;\n var handlers = options.render && options.render._withStripped\n ? getHandler\n : hasHandler;\n vm._renderProxy = new Proxy(vm, handlers);\n } else {\n vm._renderProxy = vm;\n }\n };\n}\n\n/* */\n\nvar seenObjects = new _Set();\n\n/**\n * Recursively traverse an object to evoke all converted\n * getters, so that every nested property inside the object\n * is collected as a \"deep\" dependency.\n */\nfunction traverse (val) {\n _traverse(val, seenObjects);\n seenObjects.clear();\n}\n\nfunction _traverse (val, seen) {\n var i, keys;\n var isA = Array.isArray(val);\n if ((!isA && !isObject(val)) || Object.isFrozen(val) || val instanceof VNode) {\n return\n }\n if (val.__ob__) {\n var depId = val.__ob__.dep.id;\n if (seen.has(depId)) {\n return\n }\n seen.add(depId);\n }\n if (isA) {\n i = val.length;\n while (i--) { _traverse(val[i], seen); }\n } else {\n keys = Object.keys(val);\n i = keys.length;\n while (i--) { _traverse(val[keys[i]], seen); }\n }\n}\n\nvar mark;\nvar measure;\n\nif (process.env.NODE_ENV !== 'production') {\n var perf = inBrowser && window.performance;\n /* istanbul ignore if */\n if (\n perf &&\n perf.mark &&\n perf.measure &&\n perf.clearMarks &&\n perf.clearMeasures\n ) {\n mark = function (tag) { return perf.mark(tag); };\n measure = function (name, startTag, endTag) {\n perf.measure(name, startTag, endTag);\n perf.clearMarks(startTag);\n perf.clearMarks(endTag);\n perf.clearMeasures(name);\n };\n }\n}\n\n/* */\n\nvar normalizeEvent = cached(function (name) {\n var passive = name.charAt(0) === '&';\n name = passive ? name.slice(1) : name;\n var once$$1 = name.charAt(0) === '~'; // Prefixed last, checked first\n name = once$$1 ? name.slice(1) : name;\n var capture = name.charAt(0) === '!';\n name = capture ? name.slice(1) : name;\n return {\n name: name,\n once: once$$1,\n capture: capture,\n passive: passive\n }\n});\n\nfunction createFnInvoker (fns) {\n function invoker () {\n var arguments$1 = arguments;\n\n var fns = invoker.fns;\n if (Array.isArray(fns)) {\n var cloned = fns.slice();\n for (var i = 0; i < cloned.length; i++) {\n cloned[i].apply(null, arguments$1);\n }\n } else {\n // return handler return value for single handlers\n return fns.apply(null, arguments)\n }\n }\n invoker.fns = fns;\n return invoker\n}\n\nfunction updateListeners (\n on,\n oldOn,\n add,\n remove$$1,\n vm\n) {\n var name, def, cur, old, event;\n for (name in on) {\n def = cur = on[name];\n old = oldOn[name];\n event = normalizeEvent(name);\n /* istanbul ignore if */\n if (isUndef(cur)) {\n process.env.NODE_ENV !== 'production' && warn(\n \"Invalid handler for event \\\"\" + (event.name) + \"\\\": got \" + String(cur),\n vm\n );\n } else if (isUndef(old)) {\n if (isUndef(cur.fns)) {\n cur = on[name] = createFnInvoker(cur);\n }\n add(event.name, cur, event.once, event.capture, event.passive, event.params);\n } else if (cur !== old) {\n old.fns = cur;\n on[name] = old;\n }\n }\n for (name in oldOn) {\n if (isUndef(on[name])) {\n event = normalizeEvent(name);\n remove$$1(event.name, oldOn[name], event.capture);\n }\n }\n}\n\n/* */\n\nfunction mergeVNodeHook (def, hookKey, hook) {\n if (def instanceof VNode) {\n def = def.data.hook || (def.data.hook = {});\n }\n var invoker;\n var oldHook = def[hookKey];\n\n function wrappedHook () {\n hook.apply(this, arguments);\n // important: remove merged hook to ensure it's called only once\n // and prevent memory leak\n remove(invoker.fns, wrappedHook);\n }\n\n if (isUndef(oldHook)) {\n // no existing hook\n invoker = createFnInvoker([wrappedHook]);\n } else {\n /* istanbul ignore if */\n if (isDef(oldHook.fns) && isTrue(oldHook.merged)) {\n // already a merged invoker\n invoker = oldHook;\n invoker.fns.push(wrappedHook);\n } else {\n // existing plain hook\n invoker = createFnInvoker([oldHook, wrappedHook]);\n }\n }\n\n invoker.merged = true;\n def[hookKey] = invoker;\n}\n\n/* */\n\nfunction extractPropsFromVNodeData (\n data,\n Ctor,\n tag\n) {\n // we are only extracting raw values here.\n // validation and default values are handled in the child\n // component itself.\n var propOptions = Ctor.options.props;\n if (isUndef(propOptions)) {\n return\n }\n var res = {};\n var attrs = data.attrs;\n var props = data.props;\n if (isDef(attrs) || isDef(props)) {\n for (var key in propOptions) {\n var altKey = hyphenate(key);\n if (process.env.NODE_ENV !== 'production') {\n var keyInLowerCase = key.toLowerCase();\n if (\n key !== keyInLowerCase &&\n attrs && hasOwn(attrs, keyInLowerCase)\n ) {\n tip(\n \"Prop \\\"\" + keyInLowerCase + \"\\\" is passed to component \" +\n (formatComponentName(tag || Ctor)) + \", but the declared prop name is\" +\n \" \\\"\" + key + \"\\\". \" +\n \"Note that HTML attributes are case-insensitive and camelCased \" +\n \"props need to use their kebab-case equivalents when using in-DOM \" +\n \"templates. You should probably use \\\"\" + altKey + \"\\\" instead of \\\"\" + key + \"\\\".\"\n );\n }\n }\n checkProp(res, props, key, altKey, true) ||\n checkProp(res, attrs, key, altKey, false);\n }\n }\n return res\n}\n\nfunction checkProp (\n res,\n hash,\n key,\n altKey,\n preserve\n) {\n if (isDef(hash)) {\n if (hasOwn(hash, key)) {\n res[key] = hash[key];\n if (!preserve) {\n delete hash[key];\n }\n return true\n } else if (hasOwn(hash, altKey)) {\n res[key] = hash[altKey];\n if (!preserve) {\n delete hash[altKey];\n }\n return true\n }\n }\n return false\n}\n\n/* */\n\n// The template compiler attempts to minimize the need for normalization by\n// statically analyzing the template at compile time.\n//\n// For plain HTML markup, normalization can be completely skipped because the\n// generated render function is guaranteed to return Array. There are\n// two cases where extra normalization is needed:\n\n// 1. When the children contains components - because a functional component\n// may return an Array instead of a single root. In this case, just a simple\n// normalization is needed - if any child is an Array, we flatten the whole\n// thing with Array.prototype.concat. It is guaranteed to be only 1-level deep\n// because functional components already normalize their own children.\nfunction simpleNormalizeChildren (children) {\n for (var i = 0; i < children.length; i++) {\n if (Array.isArray(children[i])) {\n return Array.prototype.concat.apply([], children)\n }\n }\n return children\n}\n\n// 2. When the children contains constructs that always generated nested Arrays,\n// e.g.