From dd5fded210c07e416ce661f411889f8ce4c33045 Mon Sep 17 00:00:00 2001 From: John Furrow Date: Sat, 27 Feb 2016 18:33:32 -0800 Subject: [PATCH] Handle errors properly --- client/source/scripts/constants/EventTypes.js | 3 ++ .../scripts/stores/TorrentFilterStore.js | 10 ++++-- .../scripts/stores/TransferDataStore.js | 2 +- server/assets/app.js | 6 ++-- server/models/ClientRequest.js | 24 ++++++++++++-- server/models/HistoryEra.js | 24 +++++++++----- server/models/client.js | 33 ++++++++++++------- server/models/history.js | 9 ++--- server/models/uiSettings.js | 16 ++++----- server/util/ajaxUtil.js | 8 +++-- 10 files changed, 91 insertions(+), 44 deletions(-) diff --git a/client/source/scripts/constants/EventTypes.js b/client/source/scripts/constants/EventTypes.js index e2cfc8dc..e4ffb87d 100644 --- a/client/source/scripts/constants/EventTypes.js +++ b/client/source/scripts/constants/EventTypes.js @@ -5,12 +5,15 @@ const EventTypes = { CLIENT_SET_THROTTLE_SUCCESS: 'CLIENT_SET_THROTTLE_SUCCESS', CLIENT_TORRENTS_REQUEST_ERROR: 'CLIENT_TORRENTS_REQUEST_ERROR', CLIENT_TORRENT_STATUS_COUNT_CHANGE: 'CLIENT_TORRENT_STATUS_COUNT_CHANGE', + CLIENT_TORRENT_STATUS_COUNT_REQUEST_ERROR: 'CLIENT_TORRENT_STATUS_COUNT_REQUEST_ERROR', CLIENT_TORRENT_TRACKER_COUNT_CHANGE: 'CLIENT_TORRENT_TRACKER_COUNT_CHANGE', + CLIENT_TORRENT_TRACKER_COUNT_REQUEST_ERROR: 'CLIENT_TORRENT_TRACKER_COUNT_REQUEST_ERROR', CLIENT_TORRENTS_REQUEST_SUCCESS: 'CLIENT_TORRENTS_REQUEST_SUCCESS', CLIENT_TORRENT_DETAILS_CHANGE: 'CLIENT_TORRENT_DETAILS_CHANGE', CLIENT_TRANSFER_DATA_REQUEST_SUCCESS: 'CLIENT_TRANSFER_DATA_REQUEST_SUCCESS', CLIENT_TRANSFER_DATA_REQUEST_ERROR: 'CLIENT_TRANSFER_DATA_REQUEST_ERROR', CLIENT_TRANSFER_HISTORY_REQUEST_SUCCESS: 'CLIENT_TRANSFER_HISTORY_REQUEST_SUCCESS', + CLIENT_TRANSFER_HISTORY_REQUEST_ERROR: 'CLIENT_TRANSFER_HISTORY_REQUEST_ERROR', UI_CONTEXT_MENU_CHANGE: 'UI_CONTEXT_MENU_CHANGE', UI_MODAL_CHANGE: 'UI_MODAL_CHANGE', UI_LATEST_TORRENT_LOCATION_CHANGE: 'UI_LATEST_TORRENT_LOCATION_CHANGE', diff --git a/client/source/scripts/stores/TorrentFilterStore.js b/client/source/scripts/stores/TorrentFilterStore.js index a6065ce4..a4799dee 100644 --- a/client/source/scripts/stores/TorrentFilterStore.js +++ b/client/source/scripts/stores/TorrentFilterStore.js @@ -60,8 +60,12 @@ class TorrentFilterStoreClass extends BaseStore { this.setTorrentsSort(sortBy); } - handleTorrentStatusCountRequestError() { + handleTorrentTrackerCountRequestError(error) { + this.emit(EventTypes.CLIENT_TORRENT_TRACKER_COUNT_REQUEST_ERROR); + } + handleTorrentStatusCountRequestError(error) { + this.emit(EventTypes.CLIENT_TORRENT_STATUS_COUNT_REQUEST_ERROR); } isFilterActive() { @@ -127,13 +131,13 @@ AppDispatcher.register((payload) => { TorrentFilterStore.setTorrentStatusCount(action.data); break; case ActionTypes.CLIENT_FETCH_TORRENT_STATUS_COUNT_REQUEST_ERROR: - TorrentFilterStore.handleTorrentStatusCountRequestError(action.data); + TorrentFilterStore.handleTorrentStatusCountRequestError(action.error); break; case ActionTypes.CLIENT_FETCH_TORRENT_TRACKER_COUNT_REQUEST_SUCCESS: TorrentFilterStore.setTorrentTrackerCount(action.data); break; case ActionTypes.CLIENT_FETCH_TORRENT_TRACKER_COUNT_REQUEST_ERROR: - TorrentFilterStore.handleTorrentTrackerCountRequestError(action.data); + TorrentFilterStore.handleTorrentTrackerCountRequestError(action.error); break; } }); diff --git a/client/source/scripts/stores/TransferDataStore.js b/client/source/scripts/stores/TransferDataStore.js index 98c4734b..9cdbfd38 100644 --- a/client/source/scripts/stores/TransferDataStore.js +++ b/client/source/scripts/stores/TransferDataStore.js @@ -108,7 +108,7 @@ class TransferDataStoreClass extends BaseStore { } handleTransferHistoryError(error) { - console.trace(error); + this.emit(EventTypes.CLIENT_TRANSFER_HISTORY_REQUEST_ERROR); } handleTransferHistorySuccess(transferData) { diff --git a/server/assets/app.js b/server/assets/app.js index ce7be1f0..bf1e74d2 100644 --- a/server/assets/app.js +++ b/server/assets/app.js @@ -1100,7 +1100,7 @@ /* 176 */ /***/ function(module, exports) { - eval("'use strict';\n\nObject.defineProperty(exports, '__esModule', {\n value: true\n});\nvar EventTypes = {\n CLIENT_ADD_TORRENT_ERROR: 'CLIENT_ADD_TORRENT_ERROR',\n CLIENT_ADD_TORRENT_SUCCESS: 'CLIENT_ADD_TORRENT_SUCCESS',\n CLIENT_SET_THROTTLE_ERROR: 'CLIENT_SET_THROTTLE_ERROR',\n CLIENT_SET_THROTTLE_SUCCESS: 'CLIENT_SET_THROTTLE_SUCCESS',\n CLIENT_TORRENTS_REQUEST_ERROR: 'CLIENT_TORRENTS_REQUEST_ERROR',\n CLIENT_TORRENT_STATUS_COUNT_CHANGE: 'CLIENT_TORRENT_STATUS_COUNT_CHANGE',\n CLIENT_TORRENT_TRACKER_COUNT_CHANGE: 'CLIENT_TORRENT_TRACKER_COUNT_CHANGE',\n CLIENT_TORRENTS_REQUEST_SUCCESS: 'CLIENT_TORRENTS_REQUEST_SUCCESS',\n CLIENT_TORRENT_DETAILS_CHANGE: 'CLIENT_TORRENT_DETAILS_CHANGE',\n CLIENT_TRANSFER_DATA_REQUEST_SUCCESS: 'CLIENT_TRANSFER_DATA_REQUEST_SUCCESS',\n CLIENT_TRANSFER_DATA_REQUEST_ERROR: 'CLIENT_TRANSFER_DATA_REQUEST_ERROR',\n CLIENT_TRANSFER_HISTORY_REQUEST_SUCCESS: 'CLIENT_TRANSFER_HISTORY_REQUEST_SUCCESS',\n UI_CONTEXT_MENU_CHANGE: 'UI_CONTEXT_MENU_CHANGE',\n UI_MODAL_CHANGE: 'UI_MODAL_CHANGE',\n UI_LATEST_TORRENT_LOCATION_CHANGE: 'UI_LATEST_TORRENT_LOCATION_CHANGE',\n UI_TORRENT_DETAILS_HASH_CHANGE: 'UI_TORRENT_DETAILS_HASH_CHANGE',\n UI_TORRENT_DETAILS_OPEN_CHANGE: 'UI_TORRENT_DETAILS_OPEN_CHANGE',\n UI_TORRENT_SELECTION_CHANGE: 'UI_TORRENT_SELECTION_CHANGE',\n UI_TORRENTS_FILTER_CHANGE: 'UI_TORRENTS_FILTER_CHANGE',\n UI_TORRENTS_FILTER_STATUS_CHANGE: 'UI_TORRENTS_FILTER_STATUS_CHANGE',\n UI_TORRENTS_FILTER_TRACKER_CHANGE: 'UI_TORRENTS_FILTER_TRACKER_CHANGE',\n UI_TORRENTS_FILTER_SEARCH_CHANGE: 'UI_TORRENTS_FILTER_SEARCH_CHANGE',\n UI_TORRENTS_SORT_CHANGE: 'UI_TORRENTS_SORT_CHANGE'\n};\n\nexports['default'] = EventTypes;\nmodule.exports = exports['default'];//@ sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIndlYnBhY2s6Ly8vLi9jbGllbnQvc291cmNlL3NjcmlwdHMvY29uc3RhbnRzL0V2ZW50VHlwZXMuanM/ZTRiMyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQTs7QUFFQTtBQUNBO0FBQ0EsQ0FBQztBQUNEO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0EiLCJmaWxlIjoiMTc2LmpzIiwic291cmNlc0NvbnRlbnQiOlsiJ3VzZSBzdHJpY3QnO1xuXG5PYmplY3QuZGVmaW5lUHJvcGVydHkoZXhwb3J0cywgJ19fZXNNb2R1bGUnLCB7XG4gIHZhbHVlOiB0cnVlXG59KTtcbnZhciBFdmVudFR5cGVzID0ge1xuICBDTElFTlRfQUREX1RPUlJFTlRfRVJST1I6ICdDTElFTlRfQUREX1RPUlJFTlRfRVJST1InLFxuICBDTElFTlRfQUREX1RPUlJFTlRfU1VDQ0VTUzogJ0NMSUVOVF9BRERfVE9SUkVOVF9TVUNDRVNTJyxcbiAgQ0xJRU5UX1NFVF9USFJPVFRMRV9FUlJPUjogJ0NMSUVOVF9TRVRfVEhST1RUTEVfRVJST1InLFxuICBDTElFTlRfU0VUX1RIUk9UVExFX1NVQ0NFU1M6ICdDTElFTlRfU0VUX1RIUk9UVExFX1NVQ0NFU1MnLFxuICBDTElFTlRfVE9SUkVOVFNfUkVRVUVTVF9FUlJPUjogJ0NMSUVOVF9UT1JSRU5UU19SRVFVRVNUX0VSUk9SJyxcbiAgQ0xJRU5UX1RPUlJFTlRfU1RBVFVTX0NPVU5UX0NIQU5HRTogJ0NMSUVOVF9UT1JSRU5UX1NUQVRVU19DT1VOVF9DSEFOR0UnLFxuICBDTElFTlRfVE9SUkVOVF9UUkFDS0VSX0NPVU5UX0NIQU5HRTogJ0NMSUVOVF9UT1JSRU5UX1RSQUNLRVJfQ09VTlRfQ0hBTkdFJyxcbiAgQ0xJRU5UX1RPUlJFTlRTX1JFUVVFU1RfU1VDQ0VTUzogJ0NMSUVOVF9UT1JSRU5UU19SRVFVRVNUX1NVQ0NFU1MnLFxuICBDTElFTlRfVE9SUkVOVF9ERVRBSUxTX0NIQU5HRTogJ0NMSUVOVF9UT1JSRU5UX0RFVEFJTFNfQ0hBTkdFJyxcbiAgQ0xJRU5UX1RSQU5TRkVSX0RBVEFfUkVRVUVTVF9TVUNDRVNTOiAnQ0xJRU5UX1RSQU5TRkVSX0RBVEFfUkVRVUVTVF9TVUNDRVNTJyxcbiAgQ0xJRU5UX1RSQU5TRkVSX0RBVEFfUkVRVUVTVF9FUlJPUjogJ0NMSUVOVF9UUkFOU0ZFUl9EQVRBX1JFUVVFU1RfRVJST1InLFxuICBDTElFTlRfVFJBTlNGRVJfSElTVE9SWV9SRVFVRVNUX1NVQ0NFU1M6ICdDTElFTlRfVFJBTlNGRVJfSElTVE9SWV9SRVFVRVNUX1NVQ0NFU1MnLFxuICBVSV9DT05URVhUX01FTlVfQ0hBTkdFOiAnVUlfQ09OVEVYVF9NRU5VX0NIQU5HRScsXG4gIFVJX01PREFMX0NIQU5HRTogJ1VJX01PREFMX0NIQU5HRScsXG4gIFVJX0xBVEVTVF9UT1JSRU5UX0xPQ0FUSU9OX0NIQU5HRTogJ1VJX0xBVEVTVF9UT1JSRU5UX0xPQ0FUSU9OX0NIQU5HRScsXG4gIFVJX1RPUlJFTlRfREVUQUlMU19IQVNIX0NIQU5HRTogJ1VJX1RPUlJFTlRfREVUQUlMU19IQVNIX0NIQU5HRScsXG4gIFVJX1RPUlJFTlRfREVUQUlMU19PUEVOX0NIQU5HRTogJ1VJX1RPUlJFTlRfREVUQUlMU19PUEVOX0NIQU5HRScsXG4gIFVJX1RPUlJFTlRfU0VMRUNUSU9OX0NIQU5HRTogJ1VJX1RPUlJFTlRfU0VMRUNUSU9OX0NIQU5HRScsXG4gIFVJX1RPUlJFTlRTX0ZJTFRFUl9DSEFOR0U6ICdVSV9UT1JSRU5UU19GSUxURVJfQ0hBTkdFJyxcbiAgVUlfVE9SUkVOVFNfRklMVEVSX1NUQVRVU19DSEFOR0U6ICdVSV9UT1JSRU5UU19GSUxURVJfU1RBVFVTX0NIQU5HRScsXG4gIFVJX1RPUlJFTlRTX0ZJTFRFUl9UUkFDS0VSX0NIQU5HRTogJ1VJX1RPUlJFTlRTX0ZJTFRFUl9UUkFDS0VSX0NIQU5HRScsXG4gIFVJX1RPUlJFTlRTX0ZJTFRFUl9TRUFSQ0hfQ0hBTkdFOiAnVUlfVE9SUkVOVFNfRklMVEVSX1NFQVJDSF9DSEFOR0UnLFxuICBVSV9UT1JSRU5UU19TT1JUX0NIQU5HRTogJ1VJX1RPUlJFTlRTX1NPUlRfQ0hBTkdFJ1xufTtcblxuZXhwb3J0c1snZGVmYXVsdCddID0gRXZlbnRUeXBlcztcbm1vZHVsZS5leHBvcnRzID0gZXhwb3J0c1snZGVmYXVsdCddO1xuXG5cbi8qKioqKioqKioqKioqKioqKlxuICoqIFdFQlBBQ0sgRk9PVEVSXG4gKiogLi9jbGllbnQvc291cmNlL3NjcmlwdHMvY29uc3RhbnRzL0V2ZW50VHlwZXMuanNcbiAqKiBtb2R1bGUgaWQgPSAxNzZcbiAqKiBtb2R1bGUgY2h1bmtzID0gMFxuICoqLyJdLCJzb3VyY2VSb290IjoiIn0="); + eval("'use strict';\n\nObject.defineProperty(exports, '__esModule', {\n value: true\n});\nvar EventTypes = {\n CLIENT_ADD_TORRENT_ERROR: 'CLIENT_ADD_TORRENT_ERROR',\n CLIENT_ADD_TORRENT_SUCCESS: 'CLIENT_ADD_TORRENT_SUCCESS',\n CLIENT_SET_THROTTLE_ERROR: 'CLIENT_SET_THROTTLE_ERROR',\n CLIENT_SET_THROTTLE_SUCCESS: 'CLIENT_SET_THROTTLE_SUCCESS',\n CLIENT_TORRENTS_REQUEST_ERROR: 'CLIENT_TORRENTS_REQUEST_ERROR',\n CLIENT_TORRENT_STATUS_COUNT_CHANGE: 'CLIENT_TORRENT_STATUS_COUNT_CHANGE',\n CLIENT_TORRENT_STATUS_COUNT_REQUEST_ERROR: 'CLIENT_TORRENT_STATUS_COUNT_REQUEST_ERROR',\n CLIENT_TORRENT_TRACKER_COUNT_CHANGE: 'CLIENT_TORRENT_TRACKER_COUNT_CHANGE',\n CLIENT_TORRENT_TRACKER_COUNT_REQUEST_ERROR: 'CLIENT_TORRENT_TRACKER_COUNT_REQUEST_ERROR',\n CLIENT_TORRENTS_REQUEST_SUCCESS: 'CLIENT_TORRENTS_REQUEST_SUCCESS',\n CLIENT_TORRENT_DETAILS_CHANGE: 'CLIENT_TORRENT_DETAILS_CHANGE',\n CLIENT_TRANSFER_DATA_REQUEST_SUCCESS: 'CLIENT_TRANSFER_DATA_REQUEST_SUCCESS',\n CLIENT_TRANSFER_DATA_REQUEST_ERROR: 'CLIENT_TRANSFER_DATA_REQUEST_ERROR',\n CLIENT_TRANSFER_HISTORY_REQUEST_SUCCESS: 'CLIENT_TRANSFER_HISTORY_REQUEST_SUCCESS',\n CLIENT_TRANSFER_HISTORY_REQUEST_ERROR: 'CLIENT_TRANSFER_HISTORY_REQUEST_ERROR',\n UI_CONTEXT_MENU_CHANGE: 'UI_CONTEXT_MENU_CHANGE',\n UI_MODAL_CHANGE: 'UI_MODAL_CHANGE',\n UI_LATEST_TORRENT_LOCATION_CHANGE: 'UI_LATEST_TORRENT_LOCATION_CHANGE',\n UI_TORRENT_DETAILS_HASH_CHANGE: 'UI_TORRENT_DETAILS_HASH_CHANGE',\n UI_TORRENT_DETAILS_OPEN_CHANGE: 'UI_TORRENT_DETAILS_OPEN_CHANGE',\n UI_TORRENT_SELECTION_CHANGE: 'UI_TORRENT_SELECTION_CHANGE',\n UI_TORRENTS_FILTER_CHANGE: 'UI_TORRENTS_FILTER_CHANGE',\n UI_TORRENTS_FILTER_STATUS_CHANGE: 'UI_TORRENTS_FILTER_STATUS_CHANGE',\n UI_TORRENTS_FILTER_TRACKER_CHANGE: 'UI_TORRENTS_FILTER_TRACKER_CHANGE',\n UI_TORRENTS_FILTER_SEARCH_CHANGE: 'UI_TORRENTS_FILTER_SEARCH_CHANGE',\n UI_TORRENTS_SORT_CHANGE: 'UI_TORRENTS_SORT_CHANGE'\n};\n\nexports['default'] = EventTypes;\nmodule.exports = exports['default'];//@ sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIndlYnBhY2s6Ly8vLi9jbGllbnQvc291cmNlL3NjcmlwdHMvY29uc3RhbnRzL0V2ZW50VHlwZXMuanM/ZTRiMyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQTs7QUFFQTtBQUNBO0FBQ0EsQ0FBQztBQUNEO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0EiLCJmaWxlIjoiMTc2LmpzIiwic291cmNlc0NvbnRlbnQiOlsiJ3VzZSBzdHJpY3QnO1xuXG5PYmplY3QuZGVmaW5lUHJvcGVydHkoZXhwb3J0cywgJ19fZXNNb2R1bGUnLCB7XG4gIHZhbHVlOiB0cnVlXG59KTtcbnZhciBFdmVudFR5cGVzID0ge1xuICBDTElFTlRfQUREX1RPUlJFTlRfRVJST1I6ICdDTElFTlRfQUREX1RPUlJFTlRfRVJST1InLFxuICBDTElFTlRfQUREX1RPUlJFTlRfU1VDQ0VTUzogJ0NMSUVOVF9BRERfVE9SUkVOVF9TVUNDRVNTJyxcbiAgQ0xJRU5UX1NFVF9USFJPVFRMRV9FUlJPUjogJ0NMSUVOVF9TRVRfVEhST1RUTEVfRVJST1InLFxuICBDTElFTlRfU0VUX1RIUk9UVExFX1NVQ0NFU1M6ICdDTElFTlRfU0VUX1RIUk9UVExFX1NVQ0NFU1MnLFxuICBDTElFTlRfVE9SUkVOVFNfUkVRVUVTVF9FUlJPUjogJ0NMSUVOVF9UT1JSRU5UU19SRVFVRVNUX0VSUk9SJyxcbiAgQ0xJRU5UX1RPUlJFTlRfU1RBVFVTX0NPVU5UX0NIQU5HRTogJ0NMSUVOVF9UT1JSRU5UX1NUQVRVU19DT1VOVF9DSEFOR0UnLFxuICBDTElFTlRfVE9SUkVOVF9TVEFUVVNfQ09VTlRfUkVRVUVTVF9FUlJPUjogJ0NMSUVOVF9UT1JSRU5UX1NUQVRVU19DT1VOVF9SRVFVRVNUX0VSUk9SJyxcbiAgQ0xJRU5UX1RPUlJFTlRfVFJBQ0tFUl9DT1VOVF9DSEFOR0U6ICdDTElFTlRfVE9SUkVOVF9UUkFDS0VSX0NPVU5UX0NIQU5HRScsXG4gIENMSUVOVF9UT1JSRU5UX1RSQUNLRVJfQ09VTlRfUkVRVUVTVF9FUlJPUjogJ0NMSUVOVF9UT1JSRU5UX1RSQUNLRVJfQ09VTlRfUkVRVUVTVF9FUlJPUicsXG4gIENMSUVOVF9UT1JSRU5UU19SRVFVRVNUX1NVQ0NFU1M6ICdDTElFTlRfVE9SUkVOVFNfUkVRVUVTVF9TVUNDRVNTJyxcbiAgQ0xJRU5UX1RPUlJFTlRfREVUQUlMU19DSEFOR0U6ICdDTElFTlRfVE9SUkVOVF9ERVRBSUxTX0NIQU5HRScsXG4gIENMSUVOVF9UUkFOU0ZFUl9EQVRBX1JFUVVFU1RfU1VDQ0VTUzogJ0NMSUVOVF9UUkFOU0ZFUl9EQVRBX1JFUVVFU1RfU1VDQ0VTUycsXG4gIENMSUVOVF9UUkFOU0ZFUl9EQVRBX1JFUVVFU1RfRVJST1I6ICdDTElFTlRfVFJBTlNGRVJfREFUQV9SRVFVRVNUX0VSUk9SJyxcbiAgQ0xJRU5UX1RSQU5TRkVSX0hJU1RPUllfUkVRVUVTVF9TVUNDRVNTOiAnQ0xJRU5UX1RSQU5TRkVSX0hJU1RPUllfUkVRVUVTVF9TVUNDRVNTJyxcbiAgQ0xJRU5UX1RSQU5TRkVSX0hJU1RPUllfUkVRVUVTVF9FUlJPUjogJ0NMSUVOVF9UUkFOU0ZFUl9ISVNUT1JZX1JFUVVFU1RfRVJST1InLFxuICBVSV9DT05URVhUX01FTlVfQ0hBTkdFOiAnVUlfQ09OVEVYVF9NRU5VX0NIQU5HRScsXG4gIFVJX01PREFMX0NIQU5HRTogJ1VJX01PREFMX0NIQU5HRScsXG4gIFVJX0xBVEVTVF9UT1JSRU5UX0xPQ0FUSU9OX0NIQU5HRTogJ1VJX0xBVEVTVF9UT1JSRU5UX0xPQ0FUSU9OX0NIQU5HRScsXG4gIFVJX1RPUlJFTlRfREVUQUlMU19IQVNIX0NIQU5HRTogJ1VJX1RPUlJFTlRfREVUQUlMU19IQVNIX0NIQU5HRScsXG4gIFVJX1RPUlJFTlRfREVUQUlMU19PUEVOX0NIQU5HRTogJ1VJX1RPUlJFTlRfREVUQUlMU19PUEVOX0NIQU5HRScsXG4gIFVJX1RPUlJFTlRfU0VMRUNUSU9OX0NIQU5HRTogJ1VJX1RPUlJFTlRfU0VMRUNUSU9OX0NIQU5HRScsXG4gIFVJX1RPUlJFTlRTX0ZJTFRFUl9DSEFOR0U6ICdVSV9UT1JSRU5UU19GSUxURVJfQ0hBTkdFJyxcbiAgVUlfVE9SUkVOVFNfRklMVEVSX1NUQVRVU19DSEFOR0U6ICdVSV9UT1JSRU5UU19GSUxURVJfU1RBVFVTX0NIQU5HRScsXG4gIFVJX1RPUlJFTlRTX0ZJTFRFUl9UUkFDS0VSX0NIQU5HRTogJ1VJX1RPUlJFTlRTX0ZJTFRFUl9UUkFDS0VSX0NIQU5HRScsXG4gIFVJX1RPUlJFTlRTX0ZJTFRFUl9TRUFSQ0hfQ0hBTkdFOiAnVUlfVE9SUkVOVFNfRklMVEVSX1NFQVJDSF9DSEFOR0UnLFxuICBVSV9UT1JSRU5UU19TT1JUX0NIQU5HRTogJ1VJX1RPUlJFTlRTX1NPUlRfQ0hBTkdFJ1xufTtcblxuZXhwb3J0c1snZGVmYXVsdCddID0gRXZlbnRUeXBlcztcbm1vZHVsZS5leHBvcnRzID0gZXhwb3J0c1snZGVmYXVsdCddO1xuXG5cbi8qKioqKioqKioqKioqKioqKlxuICoqIFdFQlBBQ0sgRk9PVEVSXG4gKiogLi9jbGllbnQvc291cmNlL3NjcmlwdHMvY29uc3RhbnRzL0V2ZW50VHlwZXMuanNcbiAqKiBtb2R1bGUgaWQgPSAxNzZcbiAqKiBtb2R1bGUgY2h1bmtzID0gMFxuICoqLyJdLCJzb3VyY2VSb290IjoiIn0="); /***/ }, /* 177 */ @@ -1466,7 +1466,7 @@ /* 237 */ /***/ function(module, exports, __webpack_require__) { - eval("'use strict';\n\nObject.defineProperty(exports, '__esModule', {\n value: true\n});\n\nvar _createClass = (function () { function defineProperties(target, props) { for (var i = 0; i < props.length; i++) { var descriptor = props[i]; descriptor.enumerable = descriptor.enumerable || false; descriptor.configurable = true; if ('value' in descriptor) descriptor.writable = true; Object.defineProperty(target, descriptor.key, descriptor); } } return function (Constructor, protoProps, staticProps) { if (protoProps) defineProperties(Constructor.prototype, protoProps); if (staticProps) defineProperties(Constructor, staticProps); return Constructor; }; })();\n\nvar _get = function get(_x, _x2, _x3) { var _again = true; _function: while (_again) { var object = _x, property = _x2, receiver = _x3; _again = false; if (object === null) object = Function.prototype; var desc = Object.getOwnPropertyDescriptor(object, property); if (desc === undefined) { var parent = Object.getPrototypeOf(object); if (parent === null) { return undefined; } else { _x = parent; _x2 = property; _x3 = receiver; _again = true; desc = parent = undefined; continue _function; } } else if ('value' in desc) { return desc.value; } else { var getter = desc.get; if (getter === undefined) { return undefined; } return getter.call(receiver); } } };\n\nfunction _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { 'default': obj }; }\n\nfunction _classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError('Cannot call a class as a function'); } }\n\nfunction _inherits(subClass, superClass) { if (typeof superClass !== 'function' && superClass !== null) { throw new TypeError('Super expression must either be null or a function, not ' + typeof superClass); } subClass.prototype = Object.create(superClass && superClass.prototype, { constructor: { value: subClass, enumerable: false, writable: true, configurable: true } }); if (superClass) Object.setPrototypeOf ? Object.setPrototypeOf(subClass, superClass) : subClass.__proto__ = superClass; }\n\nvar _constantsActionTypes = __webpack_require__(178);\n\nvar _constantsActionTypes2 = _interopRequireDefault(_constantsActionTypes);\n\nvar _dispatcherAppDispatcher = __webpack_require__(179);\n\nvar _dispatcherAppDispatcher2 = _interopRequireDefault(_dispatcherAppDispatcher);\n\nvar _BaseStore2 = __webpack_require__(183);\n\nvar _BaseStore3 = _interopRequireDefault(_BaseStore2);\n\nvar _constantsEventTypes = __webpack_require__(176);\n\nvar _constantsEventTypes2 = _interopRequireDefault(_constantsEventTypes);\n\nvar _actionsTorrentActions = __webpack_require__(186);\n\nvar _actionsTorrentActions2 = _interopRequireDefault(_actionsTorrentActions);\n\nvar _actionsUIActions = __webpack_require__(206);\n\nvar _actionsUIActions2 = _interopRequireDefault(_actionsUIActions);\n\nvar TorrentFilterStoreClass = (function (_BaseStore) {\n _inherits(TorrentFilterStoreClass, _BaseStore);\n\n function TorrentFilterStoreClass() {\n _classCallCheck(this, TorrentFilterStoreClass);\n\n _get(Object.getPrototypeOf(TorrentFilterStoreClass.prototype), 'constructor', this).call(this);\n\n this.searchFilter = null;\n this.statusFilter = 'all';\n this.trackerFilter = 'all';\n this.sortTorrentsBy = {\n direction: 'desc',\n displayName: 'Date Added',\n property: 'sortBy',\n value: 'added'\n };\n }\n\n _createClass(TorrentFilterStoreClass, [{\n key: 'fetchSortProps',\n value: function fetchSortProps() {\n _actionsUIActions2['default'].fetchSortProps();\n }\n }, {\n key: 'fetchTorrentStatusCount',\n value: function fetchTorrentStatusCount() {\n _actionsTorrentActions2['default'].fetchTorrentStatusCount();\n }\n }, {\n key: 'fetchTorrentTrackerCount',\n value: function fetchTorrentTrackerCount() {\n _actionsTorrentActions2['default'].fetchTorrentTrackerCount();\n }\n }, {\n key: 'getSearchFilter',\n value: function getSearchFilter() {\n return this.searchFilter;\n }\n }, {\n key: 'getStatusFilter',\n value: function getStatusFilter() {\n return this.statusFilter;\n }\n }, {\n key: 'getTrackerFilter',\n value: function getTrackerFilter() {\n return this.trackerFilter;\n }\n }, {\n key: 'getTorrentsSort',\n value: function getTorrentsSort() {\n return this.sortTorrentsBy;\n }\n }, {\n key: 'getTorrentStatusCount',\n value: function getTorrentStatusCount() {\n return this.torrentStatusCount;\n }\n }, {\n key: 'getTorrentTrackerCount',\n value: function getTorrentTrackerCount() {\n return this.torrentTrackerCount;\n }\n }, {\n key: 'handleSortPropsRequestSuccess',\n value: function handleSortPropsRequestSuccess(sortBy) {\n this.setTorrentsSort(sortBy);\n }\n }, {\n key: 'handleTorrentStatusCountRequestError',\n value: function handleTorrentStatusCountRequestError() {}\n }, {\n key: 'isFilterActive',\n value: function isFilterActive() {\n return this.getStatusFilter() || this.getSearchFilter() || this.getTrackerFilter();\n }\n }, {\n key: 'setSearchFilter',\n value: function setSearchFilter(filter) {\n this.searchFilter = filter;\n this.emit(_constantsEventTypes2['default'].UI_TORRENTS_FILTER_SEARCH_CHANGE);\n }\n }, {\n key: 'setStatusFilter',\n value: function setStatusFilter(filter) {\n this.statusFilter = filter;\n this.emit(_constantsEventTypes2['default'].UI_TORRENTS_FILTER_CHANGE);\n this.emit(_constantsEventTypes2['default'].UI_TORRENTS_FILTER_STATUS_CHANGE);\n }\n }, {\n key: 'setTrackerFilter',\n value: function setTrackerFilter(filter) {\n this.trackerFilter = filter;\n this.emit(_constantsEventTypes2['default'].UI_TORRENTS_FILTER_CHANGE);\n this.emit(_constantsEventTypes2['default'].UI_TORRENTS_FILTER_TRACKER_CHANGE);\n }\n }, {\n key: 'setTorrentsSort',\n value: function setTorrentsSort(sortBy) {\n this.sortTorrentsBy = sortBy;\n this.emit(_constantsEventTypes2['default'].UI_TORRENTS_SORT_CHANGE);\n }\n }, {\n key: 'setTorrentStatusCount',\n value: function setTorrentStatusCount(statusCount) {\n this.torrentStatusCount = statusCount;\n this.emit(_constantsEventTypes2['default'].CLIENT_TORRENT_STATUS_COUNT_CHANGE);\n }\n }, {\n key: 'setTorrentTrackerCount',\n value: function setTorrentTrackerCount(statusCount) {\n this.torrentTrackerCount = statusCount;\n this.emit(_constantsEventTypes2['default'].CLIENT_TORRENT_TRACKER_COUNT_CHANGE);\n }\n }]);\n\n return TorrentFilterStoreClass;\n})(_BaseStore3['default']);\n\nvar TorrentFilterStore = new TorrentFilterStoreClass();\n\n_dispatcherAppDispatcher2['default'].register(function (payload) {\n var action = payload.action;\n var source = payload.source;\n\n switch (action.type) {\n case _constantsActionTypes2['default'].UI_SET_TORRENT_SEARCH_FILTER:\n TorrentFilterStore.setSearchFilter(action.data);\n break;\n case _constantsActionTypes2['default'].UI_SET_TORRENT_STATUS_FILTER:\n TorrentFilterStore.setStatusFilter(action.data);\n break;\n case _constantsActionTypes2['default'].UI_SET_TORRENT_TRACKER_FILTER:\n TorrentFilterStore.setTrackerFilter(action.data);\n break;\n case _constantsActionTypes2['default'].UI_SET_TORRENT_SORT:\n TorrentFilterStore.setTorrentsSort(action.data);\n break;\n case _constantsActionTypes2['default'].UI_SORT_PROPS_REQUEST_SUCCESS:\n TorrentFilterStore.handleSortPropsRequestSuccess(action.data);\n break;\n case _constantsActionTypes2['default'].CLIENT_FETCH_TORRENT_STATUS_COUNT_REQUEST_SUCCESS:\n TorrentFilterStore.setTorrentStatusCount(action.data);\n break;\n case _constantsActionTypes2['default'].CLIENT_FETCH_TORRENT_STATUS_COUNT_REQUEST_ERROR:\n TorrentFilterStore.handleTorrentStatusCountRequestError(action.data);\n break;\n case _constantsActionTypes2['default'].CLIENT_FETCH_TORRENT_TRACKER_COUNT_REQUEST_SUCCESS:\n TorrentFilterStore.setTorrentTrackerCount(action.data);\n break;\n case _constantsActionTypes2['default'].CLIENT_FETCH_TORRENT_TRACKER_COUNT_REQUEST_ERROR:\n TorrentFilterStore.handleTorrentTrackerCountRequestError(action.data);\n break;\n }\n});\n\nexports['default'] = TorrentFilterStore;\nmodule.exports = exports['default'];//@ sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIndlYnBhY2s6Ly8vLi9jbGllbnQvc291cmNlL3NjcmlwdHMvc3RvcmVzL1RvcnJlbnRGaWx0ZXJTdG9yZS5qcz9kM2ZjIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBOztBQUVBO0FBQ0E7QUFDQSxDQUFDOztBQUVELGlDQUFpQywyQ0FBMkMsZ0JBQWdCLGtCQUFrQixPQUFPLDJCQUEyQix3REFBd0QsZ0NBQWdDLHVEQUF1RCwyREFBMkQsRUFBRSxFQUFFLHlEQUF5RCxxRUFBcUUsNkRBQTZELG9CQUFvQixHQUFHLEVBQUU7O0FBRWxqQix1Q0FBdUMsbUJBQW1CLDRCQUE0QixpREFBaUQsZ0JBQWdCLGtEQUFrRCw4REFBOEQsMEJBQTBCLDRDQUE0Qyx1QkFBdUIsa0JBQWtCLEVBQUUsT0FBTyxhQUFhLGdCQUFnQixnQkFBZ0IsZUFBZSwyQkFBMkIsb0JBQW9CLEVBQUUsRUFBRSw0QkFBNEIsbUJBQW1CLEVBQUUsT0FBTyx1QkFBdUIsNEJBQTRCLGtCQUFrQixFQUFFLDhCQUE4QixFQUFFLEVBQUU7O0FBRS9vQixzQ0FBc0MsdUNBQXVDLGtCQUFrQjs7QUFFL0YsaURBQWlELDBDQUEwQywwREFBMEQsRUFBRTs7QUFFdkosMENBQTBDLCtEQUErRCxxR0FBcUcsRUFBRSx5RUFBeUUsZUFBZSx5RUFBeUUsRUFBRSxFQUFFLHVIQUF1SDs7QUFFNWU7O0FBRUE7O0FBRUE7O0FBRUE7O0FBRUE7O0FBRUE7O0FBRUE7O0FBRUE7O0FBRUE7O0FBRUE7O0FBRUE7O0FBRUE7O0FBRUE7QUFDQTs7QUFFQTtBQUNBOztBQUVBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxHQUFHO0FBQ0g7QUFDQTtBQUNBO0FBQ0E7QUFDQSxHQUFHO0FBQ0g7QUFDQTtBQUNBO0FBQ0E7QUFDQSxHQUFHO0FBQ0g7QUFDQTtBQUNBO0FBQ0E7QUFDQSxHQUFHO0FBQ0g7QUFDQTtBQUNBO0FBQ0E7QUFDQSxHQUFHO0FBQ0g7QUFDQTtBQUNBO0FBQ0E7QUFDQSxHQUFHO0FBQ0g7QUFDQTtBQUNBO0FBQ0E7QUFDQSxHQUFHO0FBQ0g7QUFDQTtBQUNBO0FBQ0E7QUFDQSxHQUFHO0FBQ0g7QUFDQTtBQUNBO0FBQ0E7QUFDQSxHQUFHO0FBQ0g7QUFDQTtBQUNBO0FBQ0E7QUFDQSxHQUFHO0FBQ0g7QUFDQTtBQUNBLEdBQUc7QUFDSDtBQUNBO0FBQ0E7QUFDQTtBQUNBLEdBQUc7QUFDSDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsR0FBRztBQUNIO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLEdBQUc7QUFDSDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxHQUFHO0FBQ0g7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLEdBQUc7QUFDSDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsR0FBRztBQUNIO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxHQUFHOztBQUVIO0FBQ0EsQ0FBQzs7QUFFRDs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLENBQUM7O0FBRUQ7QUFDQSIsImZpbGUiOiIyMzcuanMiLCJzb3VyY2VzQ29udGVudCI6WyIndXNlIHN0cmljdCc7XG5cbk9iamVjdC5kZWZpbmVQcm9wZXJ0eShleHBvcnRzLCAnX19lc01vZHVsZScsIHtcbiAgdmFsdWU6IHRydWVcbn0pO1xuXG52YXIgX2NyZWF0ZUNsYXNzID0gKGZ1bmN0aW9uICgpIHsgZnVuY3Rpb24gZGVmaW5lUHJvcGVydGllcyh0YXJnZXQsIHByb3BzKSB7IGZvciAodmFyIGkgPSAwOyBpIDwgcHJvcHMubGVuZ3RoOyBpKyspIHsgdmFyIGRlc2NyaXB0b3IgPSBwcm9wc1tpXTsgZGVzY3JpcHRvci5lbnVtZXJhYmxlID0gZGVzY3JpcHRvci5lbnVtZXJhYmxlIHx8IGZhbHNlOyBkZXNjcmlwdG9yLmNvbmZpZ3VyYWJsZSA9IHRydWU7IGlmICgndmFsdWUnIGluIGRlc2NyaXB0b3IpIGRlc2NyaXB0b3Iud3JpdGFibGUgPSB0cnVlOyBPYmplY3QuZGVmaW5lUHJvcGVydHkodGFyZ2V0LCBkZXNjcmlwdG9yLmtleSwgZGVzY3JpcHRvcik7IH0gfSByZXR1cm4gZnVuY3Rpb24gKENvbnN0cnVjdG9yLCBwcm90b1Byb3BzLCBzdGF0aWNQcm9wcykgeyBpZiAocHJvdG9Qcm9wcykgZGVmaW5lUHJvcGVydGllcyhDb25zdHJ1Y3Rvci5wcm90b3R5cGUsIHByb3RvUHJvcHMpOyBpZiAoc3RhdGljUHJvcHMpIGRlZmluZVByb3BlcnRpZXMoQ29uc3RydWN0b3IsIHN0YXRpY1Byb3BzKTsgcmV0dXJuIENvbnN0cnVjdG9yOyB9OyB9KSgpO1xuXG52YXIgX2dldCA9IGZ1bmN0aW9uIGdldChfeCwgX3gyLCBfeDMpIHsgdmFyIF9hZ2FpbiA9IHRydWU7IF9mdW5jdGlvbjogd2hpbGUgKF9hZ2FpbikgeyB2YXIgb2JqZWN0ID0gX3gsIHByb3BlcnR5ID0gX3gyLCByZWNlaXZlciA9IF94MzsgX2FnYWluID0gZmFsc2U7IGlmIChvYmplY3QgPT09IG51bGwpIG9iamVjdCA9IEZ1bmN0aW9uLnByb3RvdHlwZTsgdmFyIGRlc2MgPSBPYmplY3QuZ2V0T3duUHJvcGVydHlEZXNjcmlwdG9yKG9iamVjdCwgcHJvcGVydHkpOyBpZiAoZGVzYyA9PT0gdW5kZWZpbmVkKSB7IHZhciBwYXJlbnQgPSBPYmplY3QuZ2V0UHJvdG90eXBlT2Yob2JqZWN0KTsgaWYgKHBhcmVudCA9PT0gbnVsbCkgeyByZXR1cm4gdW5kZWZpbmVkOyB9IGVsc2UgeyBfeCA9IHBhcmVudDsgX3gyID0gcHJvcGVydHk7IF94MyA9IHJlY2VpdmVyOyBfYWdhaW4gPSB0cnVlOyBkZXNjID0gcGFyZW50ID0gdW5kZWZpbmVkOyBjb250aW51ZSBfZnVuY3Rpb247IH0gfSBlbHNlIGlmICgndmFsdWUnIGluIGRlc2MpIHsgcmV0dXJuIGRlc2MudmFsdWU7IH0gZWxzZSB7IHZhciBnZXR0ZXIgPSBkZXNjLmdldDsgaWYgKGdldHRlciA9PT0gdW5kZWZpbmVkKSB7IHJldHVybiB1bmRlZmluZWQ7IH0gcmV0dXJuIGdldHRlci5jYWxsKHJlY2VpdmVyKTsgfSB9IH07XG5cbmZ1bmN0aW9uIF9pbnRlcm9wUmVxdWlyZURlZmF1bHQob2JqKSB7IHJldHVybiBvYmogJiYgb2JqLl9fZXNNb2R1bGUgPyBvYmogOiB7ICdkZWZhdWx0Jzogb2JqIH07IH1cblxuZnVuY3Rpb24gX2NsYXNzQ2FsbENoZWNrKGluc3RhbmNlLCBDb25zdHJ1Y3RvcikgeyBpZiAoIShpbnN0YW5jZSBpbnN0YW5jZW9mIENvbnN0cnVjdG9yKSkgeyB0aHJvdyBuZXcgVHlwZUVycm9yKCdDYW5ub3QgY2FsbCBhIGNsYXNzIGFzIGEgZnVuY3Rpb24nKTsgfSB9XG5cbmZ1bmN0aW9uIF9pbmhlcml0cyhzdWJDbGFzcywgc3VwZXJDbGFzcykgeyBpZiAodHlwZW9mIHN1cGVyQ2xhc3MgIT09ICdmdW5jdGlvbicgJiYgc3VwZXJDbGFzcyAhPT0gbnVsbCkgeyB0aHJvdyBuZXcgVHlwZUVycm9yKCdTdXBlciBleHByZXNzaW9uIG11c3QgZWl0aGVyIGJlIG51bGwgb3IgYSBmdW5jdGlvbiwgbm90ICcgKyB0eXBlb2Ygc3VwZXJDbGFzcyk7IH0gc3ViQ2xhc3MucHJvdG90eXBlID0gT2JqZWN0LmNyZWF0ZShzdXBlckNsYXNzICYmIHN1cGVyQ2xhc3MucHJvdG90eXBlLCB7IGNvbnN0cnVjdG9yOiB7IHZhbHVlOiBzdWJDbGFzcywgZW51bWVyYWJsZTogZmFsc2UsIHdyaXRhYmxlOiB0cnVlLCBjb25maWd1cmFibGU6IHRydWUgfSB9KTsgaWYgKHN1cGVyQ2xhc3MpIE9iamVjdC5zZXRQcm90b3R5cGVPZiA/IE9iamVjdC5zZXRQcm90b3R5cGVPZihzdWJDbGFzcywgc3VwZXJDbGFzcykgOiBzdWJDbGFzcy5fX3Byb3RvX18gPSBzdXBlckNsYXNzOyB9XG5cbnZhciBfY29uc3RhbnRzQWN0aW9uVHlwZXMgPSByZXF1aXJlKCcuLi9jb25zdGFudHMvQWN0aW9uVHlwZXMnKTtcblxudmFyIF9jb25zdGFudHNBY3Rpb25UeXBlczIgPSBfaW50ZXJvcFJlcXVpcmVEZWZhdWx0KF9jb25zdGFudHNBY3Rpb25UeXBlcyk7XG5cbnZhciBfZGlzcGF0Y2hlckFwcERpc3BhdGNoZXIgPSByZXF1aXJlKCcuLi9kaXNwYXRjaGVyL0FwcERpc3BhdGNoZXInKTtcblxudmFyIF9kaXNwYXRjaGVyQXBwRGlzcGF0Y2hlcjIgPSBfaW50ZXJvcFJlcXVpcmVEZWZhdWx0KF9kaXNwYXRjaGVyQXBwRGlzcGF0Y2hlcik7XG5cbnZhciBfQmFzZVN0b3JlMiA9IHJlcXVpcmUoJy4vQmFzZVN0b3JlJyk7XG5cbnZhciBfQmFzZVN0b3JlMyA9IF9pbnRlcm9wUmVxdWlyZURlZmF1bHQoX0Jhc2VTdG9yZTIpO1xuXG52YXIgX2NvbnN0YW50c0V2ZW50VHlwZXMgPSByZXF1aXJlKCcuLi9jb25zdGFudHMvRXZlbnRUeXBlcycpO1xuXG52YXIgX2NvbnN0YW50c0V2ZW50VHlwZXMyID0gX2ludGVyb3BSZXF1aXJlRGVmYXVsdChfY29uc3RhbnRzRXZlbnRUeXBlcyk7XG5cbnZhciBfYWN0aW9uc1RvcnJlbnRBY3Rpb25zID0gcmVxdWlyZSgnLi4vYWN0aW9ucy9Ub3JyZW50QWN0aW9ucycpO1xuXG52YXIgX2FjdGlvbnNUb3JyZW50QWN0aW9uczIgPSBfaW50ZXJvcFJlcXVpcmVEZWZhdWx0KF9hY3Rpb25zVG9ycmVudEFjdGlvbnMpO1xuXG52YXIgX2FjdGlvbnNVSUFjdGlvbnMgPSByZXF1aXJlKCcuLi9hY3Rpb25zL1VJQWN0aW9ucycpO1xuXG52YXIgX2FjdGlvbnNVSUFjdGlvbnMyID0gX2ludGVyb3BSZXF1aXJlRGVmYXVsdChfYWN0aW9uc1VJQWN0aW9ucyk7XG5cbnZhciBUb3JyZW50RmlsdGVyU3RvcmVDbGFzcyA9IChmdW5jdGlvbiAoX0Jhc2VTdG9yZSkge1xuICBfaW5oZXJpdHMoVG9ycmVudEZpbHRlclN0b3JlQ2xhc3MsIF9CYXNlU3RvcmUpO1xuXG4gIGZ1bmN0aW9uIFRvcnJlbnRGaWx0ZXJTdG9yZUNsYXNzKCkge1xuICAgIF9jbGFzc0NhbGxDaGVjayh0aGlzLCBUb3JyZW50RmlsdGVyU3RvcmVDbGFzcyk7XG5cbiAgICBfZ2V0KE9iamVjdC5nZXRQcm90b3R5cGVPZihUb3JyZW50RmlsdGVyU3RvcmVDbGFzcy5wcm90b3R5cGUpLCAnY29uc3RydWN0b3InLCB0aGlzKS5jYWxsKHRoaXMpO1xuXG4gICAgdGhpcy5zZWFyY2hGaWx0ZXIgPSBudWxsO1xuICAgIHRoaXMuc3RhdHVzRmlsdGVyID0gJ2FsbCc7XG4gICAgdGhpcy50cmFja2VyRmlsdGVyID0gJ2FsbCc7XG4gICAgdGhpcy5zb3J0VG9ycmVudHNCeSA9IHtcbiAgICAgIGRpcmVjdGlvbjogJ2Rlc2MnLFxuICAgICAgZGlzcGxheU5hbWU6ICdEYXRlIEFkZGVkJyxcbiAgICAgIHByb3BlcnR5OiAnc29ydEJ5JyxcbiAgICAgIHZhbHVlOiAnYWRkZWQnXG4gICAgfTtcbiAgfVxuXG4gIF9jcmVhdGVDbGFzcyhUb3JyZW50RmlsdGVyU3RvcmVDbGFzcywgW3tcbiAgICBrZXk6ICdmZXRjaFNvcnRQcm9wcycsXG4gICAgdmFsdWU6IGZ1bmN0aW9uIGZldGNoU29ydFByb3BzKCkge1xuICAgICAgX2FjdGlvbnNVSUFjdGlvbnMyWydkZWZhdWx0J10uZmV0Y2hTb3J0UHJvcHMoKTtcbiAgICB9XG4gIH0sIHtcbiAgICBrZXk6ICdmZXRjaFRvcnJlbnRTdGF0dXNDb3VudCcsXG4gICAgdmFsdWU6IGZ1bmN0aW9uIGZldGNoVG9ycmVudFN0YXR1c0NvdW50KCkge1xuICAgICAgX2FjdGlvbnNUb3JyZW50QWN0aW9uczJbJ2RlZmF1bHQnXS5mZXRjaFRvcnJlbnRTdGF0dXNDb3VudCgpO1xuICAgIH1cbiAgfSwge1xuICAgIGtleTogJ2ZldGNoVG9ycmVudFRyYWNrZXJDb3VudCcsXG4gICAgdmFsdWU6IGZ1bmN0aW9uIGZldGNoVG9ycmVudFRyYWNrZXJDb3VudCgpIHtcbiAgICAgIF9hY3Rpb25zVG9ycmVudEFjdGlvbnMyWydkZWZhdWx0J10uZmV0Y2hUb3JyZW50VHJhY2tlckNvdW50KCk7XG4gICAgfVxuICB9LCB7XG4gICAga2V5OiAnZ2V0U2VhcmNoRmlsdGVyJyxcbiAgICB2YWx1ZTogZnVuY3Rpb24gZ2V0U2VhcmNoRmlsdGVyKCkge1xuICAgICAgcmV0dXJuIHRoaXMuc2VhcmNoRmlsdGVyO1xuICAgIH1cbiAgfSwge1xuICAgIGtleTogJ2dldFN0YXR1c0ZpbHRlcicsXG4gICAgdmFsdWU6IGZ1bmN0aW9uIGdldFN0YXR1c0ZpbHRlcigpIHtcbiAgICAgIHJldHVybiB0aGlzLnN0YXR1c0ZpbHRlcjtcbiAgICB9XG4gIH0sIHtcbiAgICBrZXk6ICdnZXRUcmFja2VyRmlsdGVyJyxcbiAgICB2YWx1ZTogZnVuY3Rpb24gZ2V0VHJhY2tlckZpbHRlcigpIHtcbiAgICAgIHJldHVybiB0aGlzLnRyYWNrZXJGaWx0ZXI7XG4gICAgfVxuICB9LCB7XG4gICAga2V5OiAnZ2V0VG9ycmVudHNTb3J0JyxcbiAgICB2YWx1ZTogZnVuY3Rpb24gZ2V0VG9ycmVudHNTb3J0KCkge1xuICAgICAgcmV0dXJuIHRoaXMuc29ydFRvcnJlbnRzQnk7XG4gICAgfVxuICB9LCB7XG4gICAga2V5OiAnZ2V0VG9ycmVudFN0YXR1c0NvdW50JyxcbiAgICB2YWx1ZTogZnVuY3Rpb24gZ2V0VG9ycmVudFN0YXR1c0NvdW50KCkge1xuICAgICAgcmV0dXJuIHRoaXMudG9ycmVudFN0YXR1c0NvdW50O1xuICAgIH1cbiAgfSwge1xuICAgIGtleTogJ2dldFRvcnJlbnRUcmFja2VyQ291bnQnLFxuICAgIHZhbHVlOiBmdW5jdGlvbiBnZXRUb3JyZW50VHJhY2tlckNvdW50KCkge1xuICAgICAgcmV0dXJuIHRoaXMudG9ycmVudFRyYWNrZXJDb3VudDtcbiAgICB9XG4gIH0sIHtcbiAgICBrZXk6ICdoYW5kbGVTb3J0UHJvcHNSZXF1ZXN0U3VjY2VzcycsXG4gICAgdmFsdWU6IGZ1bmN0aW9uIGhhbmRsZVNvcnRQcm9wc1JlcXVlc3RTdWNjZXNzKHNvcnRCeSkge1xuICAgICAgdGhpcy5zZXRUb3JyZW50c1NvcnQoc29ydEJ5KTtcbiAgICB9XG4gIH0sIHtcbiAgICBrZXk6ICdoYW5kbGVUb3JyZW50U3RhdHVzQ291bnRSZXF1ZXN0RXJyb3InLFxuICAgIHZhbHVlOiBmdW5jdGlvbiBoYW5kbGVUb3JyZW50U3RhdHVzQ291bnRSZXF1ZXN0RXJyb3IoKSB7fVxuICB9LCB7XG4gICAga2V5OiAnaXNGaWx0ZXJBY3RpdmUnLFxuICAgIHZhbHVlOiBmdW5jdGlvbiBpc0ZpbHRlckFjdGl2ZSgpIHtcbiAgICAgIHJldHVybiB0aGlzLmdldFN0YXR1c0ZpbHRlcigpIHx8IHRoaXMuZ2V0U2VhcmNoRmlsdGVyKCkgfHwgdGhpcy5nZXRUcmFja2VyRmlsdGVyKCk7XG4gICAgfVxuICB9LCB7XG4gICAga2V5OiAnc2V0U2VhcmNoRmlsdGVyJyxcbiAgICB2YWx1ZTogZnVuY3Rpb24gc2V0U2VhcmNoRmlsdGVyKGZpbHRlcikge1xuICAgICAgdGhpcy5zZWFyY2hGaWx0ZXIgPSBmaWx0ZXI7XG4gICAgICB0aGlzLmVtaXQoX2NvbnN0YW50c0V2ZW50VHlwZXMyWydkZWZhdWx0J10uVUlfVE9SUkVOVFNfRklMVEVSX1NFQVJDSF9DSEFOR0UpO1xuICAgIH1cbiAgfSwge1xuICAgIGtleTogJ3NldFN0YXR1c0ZpbHRlcicsXG4gICAgdmFsdWU6IGZ1bmN0aW9uIHNldFN0YXR1c0ZpbHRlcihmaWx0ZXIpIHtcbiAgICAgIHRoaXMuc3RhdHVzRmlsdGVyID0gZmlsdGVyO1xuICAgICAgdGhpcy5lbWl0KF9jb25zdGFudHNFdmVudFR5cGVzMlsnZGVmYXVsdCddLlVJX1RPUlJFTlRTX0ZJTFRFUl9DSEFOR0UpO1xuICAgICAgdGhpcy5lbWl0KF9jb25zdGFudHNFdmVudFR5cGVzMlsnZGVmYXVsdCddLlVJX1RPUlJFTlRTX0ZJTFRFUl9TVEFUVVNfQ0hBTkdFKTtcbiAgICB9XG4gIH0sIHtcbiAgICBrZXk6ICdzZXRUcmFja2VyRmlsdGVyJyxcbiAgICB2YWx1ZTogZnVuY3Rpb24gc2V0VHJhY2tlckZpbHRlcihmaWx0ZXIpIHtcbiAgICAgIHRoaXMudHJhY2tlckZpbHRlciA9IGZpbHRlcjtcbiAgICAgIHRoaXMuZW1pdChfY29uc3RhbnRzRXZlbnRUeXBlczJbJ2RlZmF1bHQnXS5VSV9UT1JSRU5UU19GSUxURVJfQ0hBTkdFKTtcbiAgICAgIHRoaXMuZW1pdChfY29uc3RhbnRzRXZlbnRUeXBlczJbJ2RlZmF1bHQnXS5VSV9UT1JSRU5UU19GSUxURVJfVFJBQ0tFUl9DSEFOR0UpO1xuICAgIH1cbiAgfSwge1xuICAgIGtleTogJ3NldFRvcnJlbnRzU29ydCcsXG4gICAgdmFsdWU6IGZ1bmN0aW9uIHNldFRvcnJlbnRzU29ydChzb3J0QnkpIHtcbiAgICAgIHRoaXMuc29ydFRvcnJlbnRzQnkgPSBzb3J0Qnk7XG4gICAgICB0aGlzLmVtaXQoX2NvbnN0YW50c0V2ZW50VHlwZXMyWydkZWZhdWx0J10uVUlfVE9SUkVOVFNfU09SVF9DSEFOR0UpO1xuICAgIH1cbiAgfSwge1xuICAgIGtleTogJ3NldFRvcnJlbnRTdGF0dXNDb3VudCcsXG4gICAgdmFsdWU6IGZ1bmN0aW9uIHNldFRvcnJlbnRTdGF0dXNDb3VudChzdGF0dXNDb3VudCkge1xuICAgICAgdGhpcy50b3JyZW50U3RhdHVzQ291bnQgPSBzdGF0dXNDb3VudDtcbiAgICAgIHRoaXMuZW1pdChfY29uc3RhbnRzRXZlbnRUeXBlczJbJ2RlZmF1bHQnXS5DTElFTlRfVE9SUkVOVF9TVEFUVVNfQ09VTlRfQ0hBTkdFKTtcbiAgICB9XG4gIH0sIHtcbiAgICBrZXk6ICdzZXRUb3JyZW50VHJhY2tlckNvdW50JyxcbiAgICB2YWx1ZTogZnVuY3Rpb24gc2V0VG9ycmVudFRyYWNrZXJDb3VudChzdGF0dXNDb3VudCkge1xuICAgICAgdGhpcy50b3JyZW50VHJhY2tlckNvdW50ID0gc3RhdHVzQ291bnQ7XG4gICAgICB0aGlzLmVtaXQoX2NvbnN0YW50c0V2ZW50VHlwZXMyWydkZWZhdWx0J10uQ0xJRU5UX1RPUlJFTlRfVFJBQ0tFUl9DT1VOVF9DSEFOR0UpO1xuICAgIH1cbiAgfV0pO1xuXG4gIHJldHVybiBUb3JyZW50RmlsdGVyU3RvcmVDbGFzcztcbn0pKF9CYXNlU3RvcmUzWydkZWZhdWx0J10pO1xuXG52YXIgVG9ycmVudEZpbHRlclN0b3JlID0gbmV3IFRvcnJlbnRGaWx0ZXJTdG9yZUNsYXNzKCk7XG5cbl9kaXNwYXRjaGVyQXBwRGlzcGF0Y2hlcjJbJ2RlZmF1bHQnXS5yZWdpc3RlcihmdW5jdGlvbiAocGF5bG9hZCkge1xuICB2YXIgYWN0aW9uID0gcGF5bG9hZC5hY3Rpb247XG4gIHZhciBzb3VyY2UgPSBwYXlsb2FkLnNvdXJjZTtcblxuICBzd2l0Y2ggKGFjdGlvbi50eXBlKSB7XG4gICAgY2FzZSBfY29uc3RhbnRzQWN0aW9uVHlwZXMyWydkZWZhdWx0J10uVUlfU0VUX1RPUlJFTlRfU0VBUkNIX0ZJTFRFUjpcbiAgICAgIFRvcnJlbnRGaWx0ZXJTdG9yZS5zZXRTZWFyY2hGaWx0ZXIoYWN0aW9uLmRhdGEpO1xuICAgICAgYnJlYWs7XG4gICAgY2FzZSBfY29uc3RhbnRzQWN0aW9uVHlwZXMyWydkZWZhdWx0J10uVUlfU0VUX1RPUlJFTlRfU1RBVFVTX0ZJTFRFUjpcbiAgICAgIFRvcnJlbnRGaWx0ZXJTdG9yZS5zZXRTdGF0dXNGaWx0ZXIoYWN0aW9uLmRhdGEpO1xuICAgICAgYnJlYWs7XG4gICAgY2FzZSBfY29uc3RhbnRzQWN0aW9uVHlwZXMyWydkZWZhdWx0J10uVUlfU0VUX1RPUlJFTlRfVFJBQ0tFUl9GSUxURVI6XG4gICAgICBUb3JyZW50RmlsdGVyU3RvcmUuc2V0VHJhY2tlckZpbHRlcihhY3Rpb24uZGF0YSk7XG4gICAgICBicmVhaztcbiAgICBjYXNlIF9jb25zdGFudHNBY3Rpb25UeXBlczJbJ2RlZmF1bHQnXS5VSV9TRVRfVE9SUkVOVF9TT1JUOlxuICAgICAgVG9ycmVudEZpbHRlclN0b3JlLnNldFRvcnJlbnRzU29ydChhY3Rpb24uZGF0YSk7XG4gICAgICBicmVhaztcbiAgICBjYXNlIF9jb25zdGFudHNBY3Rpb25UeXBlczJbJ2RlZmF1bHQnXS5VSV9TT1JUX1BST1BTX1JFUVVFU1RfU1VDQ0VTUzpcbiAgICAgIFRvcnJlbnRGaWx0ZXJTdG9yZS5oYW5kbGVTb3J0UHJvcHNSZXF1ZXN0U3VjY2VzcyhhY3Rpb24uZGF0YSk7XG4gICAgICBicmVhaztcbiAgICBjYXNlIF9jb25zdGFudHNBY3Rpb25UeXBlczJbJ2RlZmF1bHQnXS5DTElFTlRfRkVUQ0hfVE9SUkVOVF9TVEFUVVNfQ09VTlRfUkVRVUVTVF9TVUNDRVNTOlxuICAgICAgVG9ycmVudEZpbHRlclN0b3JlLnNldFRvcnJlbnRTdGF0dXNDb3VudChhY3Rpb24uZGF0YSk7XG4gICAgICBicmVhaztcbiAgICBjYXNlIF9jb25zdGFudHNBY3Rpb25UeXBlczJbJ2RlZmF1bHQnXS5DTElFTlRfRkVUQ0hfVE9SUkVOVF9TVEFUVVNfQ09VTlRfUkVRVUVTVF9FUlJPUjpcbiAgICAgIFRvcnJlbnRGaWx0ZXJTdG9yZS5oYW5kbGVUb3JyZW50U3RhdHVzQ291bnRSZXF1ZXN0RXJyb3IoYWN0aW9uLmRhdGEpO1xuICAgICAgYnJlYWs7XG4gICAgY2FzZSBfY29uc3RhbnRzQWN0aW9uVHlwZXMyWydkZWZhdWx0J10uQ0xJRU5UX0ZFVENIX1RPUlJFTlRfVFJBQ0tFUl9DT1VOVF9SRVFVRVNUX1NVQ0NFU1M6XG4gICAgICBUb3JyZW50RmlsdGVyU3RvcmUuc2V0VG9ycmVudFRyYWNrZXJDb3VudChhY3Rpb24uZGF0YSk7XG4gICAgICBicmVhaztcbiAgICBjYXNlIF9jb25zdGFudHNBY3Rpb25UeXBlczJbJ2RlZmF1bHQnXS5DTElFTlRfRkVUQ0hfVE9SUkVOVF9UUkFDS0VSX0NPVU5UX1JFUVVFU1RfRVJST1I6XG4gICAgICBUb3JyZW50RmlsdGVyU3RvcmUuaGFuZGxlVG9ycmVudFRyYWNrZXJDb3VudFJlcXVlc3RFcnJvcihhY3Rpb24uZGF0YSk7XG4gICAgICBicmVhaztcbiAgfVxufSk7XG5cbmV4cG9ydHNbJ2RlZmF1bHQnXSA9IFRvcnJlbnRGaWx0ZXJTdG9yZTtcbm1vZHVsZS5leHBvcnRzID0gZXhwb3J0c1snZGVmYXVsdCddO1xuXG5cbi8qKioqKioqKioqKioqKioqKlxuICoqIFdFQlBBQ0sgRk9PVEVSXG4gKiogLi9jbGllbnQvc291cmNlL3NjcmlwdHMvc3RvcmVzL1RvcnJlbnRGaWx0ZXJTdG9yZS5qc1xuICoqIG1vZHVsZSBpZCA9IDIzN1xuICoqIG1vZHVsZSBjaHVua3MgPSAwXG4gKiovIl0sInNvdXJjZVJvb3QiOiIifQ=="); + eval("'use strict';\n\nObject.defineProperty(exports, '__esModule', {\n value: true\n});\n\nvar _createClass = (function () { function defineProperties(target, props) { for (var i = 0; i < props.length; i++) { var descriptor = props[i]; descriptor.enumerable = descriptor.enumerable || false; descriptor.configurable = true; if ('value' in descriptor) descriptor.writable = true; Object.defineProperty(target, descriptor.key, descriptor); } } return function (Constructor, protoProps, staticProps) { if (protoProps) defineProperties(Constructor.prototype, protoProps); if (staticProps) defineProperties(Constructor, staticProps); return Constructor; }; })();\n\nvar _get = function get(_x, _x2, _x3) { var _again = true; _function: while (_again) { var object = _x, property = _x2, receiver = _x3; _again = false; if (object === null) object = Function.prototype; var desc = Object.getOwnPropertyDescriptor(object, property); if (desc === undefined) { var parent = Object.getPrototypeOf(object); if (parent === null) { return undefined; } else { _x = parent; _x2 = property; _x3 = receiver; _again = true; desc = parent = undefined; continue _function; } } else if ('value' in desc) { return desc.value; } else { var getter = desc.get; if (getter === undefined) { return undefined; } return getter.call(receiver); } } };\n\nfunction _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { 'default': obj }; }\n\nfunction _classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError('Cannot call a class as a function'); } }\n\nfunction _inherits(subClass, superClass) { if (typeof superClass !== 'function' && superClass !== null) { throw new TypeError('Super expression must either be null or a function, not ' + typeof superClass); } subClass.prototype = Object.create(superClass && superClass.prototype, { constructor: { value: subClass, enumerable: false, writable: true, configurable: true } }); if (superClass) Object.setPrototypeOf ? Object.setPrototypeOf(subClass, superClass) : subClass.__proto__ = superClass; }\n\nvar _constantsActionTypes = __webpack_require__(178);\n\nvar _constantsActionTypes2 = _interopRequireDefault(_constantsActionTypes);\n\nvar _dispatcherAppDispatcher = __webpack_require__(179);\n\nvar _dispatcherAppDispatcher2 = _interopRequireDefault(_dispatcherAppDispatcher);\n\nvar _BaseStore2 = __webpack_require__(183);\n\nvar _BaseStore3 = _interopRequireDefault(_BaseStore2);\n\nvar _constantsEventTypes = __webpack_require__(176);\n\nvar _constantsEventTypes2 = _interopRequireDefault(_constantsEventTypes);\n\nvar _actionsTorrentActions = __webpack_require__(186);\n\nvar _actionsTorrentActions2 = _interopRequireDefault(_actionsTorrentActions);\n\nvar _actionsUIActions = __webpack_require__(206);\n\nvar _actionsUIActions2 = _interopRequireDefault(_actionsUIActions);\n\nvar TorrentFilterStoreClass = (function (_BaseStore) {\n _inherits(TorrentFilterStoreClass, _BaseStore);\n\n function TorrentFilterStoreClass() {\n _classCallCheck(this, TorrentFilterStoreClass);\n\n _get(Object.getPrototypeOf(TorrentFilterStoreClass.prototype), 'constructor', this).call(this);\n\n this.searchFilter = null;\n this.statusFilter = 'all';\n this.trackerFilter = 'all';\n this.sortTorrentsBy = {\n direction: 'desc',\n displayName: 'Date Added',\n property: 'sortBy',\n value: 'added'\n };\n }\n\n _createClass(TorrentFilterStoreClass, [{\n key: 'fetchSortProps',\n value: function fetchSortProps() {\n _actionsUIActions2['default'].fetchSortProps();\n }\n }, {\n key: 'fetchTorrentStatusCount',\n value: function fetchTorrentStatusCount() {\n _actionsTorrentActions2['default'].fetchTorrentStatusCount();\n }\n }, {\n key: 'fetchTorrentTrackerCount',\n value: function fetchTorrentTrackerCount() {\n _actionsTorrentActions2['default'].fetchTorrentTrackerCount();\n }\n }, {\n key: 'getSearchFilter',\n value: function getSearchFilter() {\n return this.searchFilter;\n }\n }, {\n key: 'getStatusFilter',\n value: function getStatusFilter() {\n return this.statusFilter;\n }\n }, {\n key: 'getTrackerFilter',\n value: function getTrackerFilter() {\n return this.trackerFilter;\n }\n }, {\n key: 'getTorrentsSort',\n value: function getTorrentsSort() {\n return this.sortTorrentsBy;\n }\n }, {\n key: 'getTorrentStatusCount',\n value: function getTorrentStatusCount() {\n return this.torrentStatusCount;\n }\n }, {\n key: 'getTorrentTrackerCount',\n value: function getTorrentTrackerCount() {\n return this.torrentTrackerCount;\n }\n }, {\n key: 'handleSortPropsRequestSuccess',\n value: function handleSortPropsRequestSuccess(sortBy) {\n this.setTorrentsSort(sortBy);\n }\n }, {\n key: 'handleTorrentTrackerCountRequestError',\n value: function handleTorrentTrackerCountRequestError(error) {\n this.emit(_constantsEventTypes2['default'].CLIENT_TORRENT_TRACKER_COUNT_REQUEST_ERROR);\n }\n }, {\n key: 'handleTorrentStatusCountRequestError',\n value: function handleTorrentStatusCountRequestError(error) {\n this.emit(_constantsEventTypes2['default'].CLIENT_TORRENT_STATUS_COUNT_REQUEST_ERROR);\n }\n }, {\n key: 'isFilterActive',\n value: function isFilterActive() {\n return this.getStatusFilter() || this.getSearchFilter() || this.getTrackerFilter();\n }\n }, {\n key: 'setSearchFilter',\n value: function setSearchFilter(filter) {\n this.searchFilter = filter;\n this.emit(_constantsEventTypes2['default'].UI_TORRENTS_FILTER_SEARCH_CHANGE);\n }\n }, {\n key: 'setStatusFilter',\n value: function setStatusFilter(filter) {\n this.statusFilter = filter;\n this.emit(_constantsEventTypes2['default'].UI_TORRENTS_FILTER_CHANGE);\n this.emit(_constantsEventTypes2['default'].UI_TORRENTS_FILTER_STATUS_CHANGE);\n }\n }, {\n key: 'setTrackerFilter',\n value: function setTrackerFilter(filter) {\n this.trackerFilter = filter;\n this.emit(_constantsEventTypes2['default'].UI_TORRENTS_FILTER_CHANGE);\n this.emit(_constantsEventTypes2['default'].UI_TORRENTS_FILTER_TRACKER_CHANGE);\n }\n }, {\n key: 'setTorrentsSort',\n value: function setTorrentsSort(sortBy) {\n this.sortTorrentsBy = sortBy;\n this.emit(_constantsEventTypes2['default'].UI_TORRENTS_SORT_CHANGE);\n }\n }, {\n key: 'setTorrentStatusCount',\n value: function setTorrentStatusCount(statusCount) {\n this.torrentStatusCount = statusCount;\n this.emit(_constantsEventTypes2['default'].CLIENT_TORRENT_STATUS_COUNT_CHANGE);\n }\n }, {\n key: 'setTorrentTrackerCount',\n value: function setTorrentTrackerCount(statusCount) {\n this.torrentTrackerCount = statusCount;\n this.emit(_constantsEventTypes2['default'].CLIENT_TORRENT_TRACKER_COUNT_CHANGE);\n }\n }]);\n\n return TorrentFilterStoreClass;\n})(_BaseStore3['default']);\n\nvar TorrentFilterStore = new TorrentFilterStoreClass();\n\n_dispatcherAppDispatcher2['default'].register(function (payload) {\n var action = payload.action;\n var source = payload.source;\n\n switch (action.type) {\n case _constantsActionTypes2['default'].UI_SET_TORRENT_SEARCH_FILTER:\n TorrentFilterStore.setSearchFilter(action.data);\n break;\n case _constantsActionTypes2['default'].UI_SET_TORRENT_STATUS_FILTER:\n TorrentFilterStore.setStatusFilter(action.data);\n break;\n case _constantsActionTypes2['default'].UI_SET_TORRENT_TRACKER_FILTER:\n TorrentFilterStore.setTrackerFilter(action.data);\n break;\n case _constantsActionTypes2['default'].UI_SET_TORRENT_SORT:\n TorrentFilterStore.setTorrentsSort(action.data);\n break;\n case _constantsActionTypes2['default'].UI_SORT_PROPS_REQUEST_SUCCESS:\n TorrentFilterStore.handleSortPropsRequestSuccess(action.data);\n break;\n case _constantsActionTypes2['default'].CLIENT_FETCH_TORRENT_STATUS_COUNT_REQUEST_SUCCESS:\n TorrentFilterStore.setTorrentStatusCount(action.data);\n break;\n case _constantsActionTypes2['default'].CLIENT_FETCH_TORRENT_STATUS_COUNT_REQUEST_ERROR:\n TorrentFilterStore.handleTorrentStatusCountRequestError(action.error);\n break;\n case _constantsActionTypes2['default'].CLIENT_FETCH_TORRENT_TRACKER_COUNT_REQUEST_SUCCESS:\n TorrentFilterStore.setTorrentTrackerCount(action.data);\n break;\n case _constantsActionTypes2['default'].CLIENT_FETCH_TORRENT_TRACKER_COUNT_REQUEST_ERROR:\n TorrentFilterStore.handleTorrentTrackerCountRequestError(action.error);\n break;\n }\n});\n\nexports['default'] = TorrentFilterStore;\nmodule.exports = exports['default'];//@ sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIndlYnBhY2s6Ly8vLi9jbGllbnQvc291cmNlL3NjcmlwdHMvc3RvcmVzL1RvcnJlbnRGaWx0ZXJTdG9yZS5qcz9kM2ZjIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBOztBQUVBO0FBQ0E7QUFDQSxDQUFDOztBQUVELGlDQUFpQywyQ0FBMkMsZ0JBQWdCLGtCQUFrQixPQUFPLDJCQUEyQix3REFBd0QsZ0NBQWdDLHVEQUF1RCwyREFBMkQsRUFBRSxFQUFFLHlEQUF5RCxxRUFBcUUsNkRBQTZELG9CQUFvQixHQUFHLEVBQUU7O0FBRWxqQix1Q0FBdUMsbUJBQW1CLDRCQUE0QixpREFBaUQsZ0JBQWdCLGtEQUFrRCw4REFBOEQsMEJBQTBCLDRDQUE0Qyx1QkFBdUIsa0JBQWtCLEVBQUUsT0FBTyxhQUFhLGdCQUFnQixnQkFBZ0IsZUFBZSwyQkFBMkIsb0JBQW9CLEVBQUUsRUFBRSw0QkFBNEIsbUJBQW1CLEVBQUUsT0FBTyx1QkFBdUIsNEJBQTRCLGtCQUFrQixFQUFFLDhCQUE4QixFQUFFLEVBQUU7O0FBRS9vQixzQ0FBc0MsdUNBQXVDLGtCQUFrQjs7QUFFL0YsaURBQWlELDBDQUEwQywwREFBMEQsRUFBRTs7QUFFdkosMENBQTBDLCtEQUErRCxxR0FBcUcsRUFBRSx5RUFBeUUsZUFBZSx5RUFBeUUsRUFBRSxFQUFFLHVIQUF1SDs7QUFFNWU7O0FBRUE7O0FBRUE7O0FBRUE7O0FBRUE7O0FBRUE7O0FBRUE7O0FBRUE7O0FBRUE7O0FBRUE7O0FBRUE7O0FBRUE7O0FBRUE7QUFDQTs7QUFFQTtBQUNBOztBQUVBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxHQUFHO0FBQ0g7QUFDQTtBQUNBO0FBQ0E7QUFDQSxHQUFHO0FBQ0g7QUFDQTtBQUNBO0FBQ0E7QUFDQSxHQUFHO0FBQ0g7QUFDQTtBQUNBO0FBQ0E7QUFDQSxHQUFHO0FBQ0g7QUFDQTtBQUNBO0FBQ0E7QUFDQSxHQUFHO0FBQ0g7QUFDQTtBQUNBO0FBQ0E7QUFDQSxHQUFHO0FBQ0g7QUFDQTtBQUNBO0FBQ0E7QUFDQSxHQUFHO0FBQ0g7QUFDQTtBQUNBO0FBQ0E7QUFDQSxHQUFHO0FBQ0g7QUFDQTtBQUNBO0FBQ0E7QUFDQSxHQUFHO0FBQ0g7QUFDQTtBQUNBO0FBQ0E7QUFDQSxHQUFHO0FBQ0g7QUFDQTtBQUNBO0FBQ0E7QUFDQSxHQUFHO0FBQ0g7QUFDQTtBQUNBO0FBQ0E7QUFDQSxHQUFHO0FBQ0g7QUFDQTtBQUNBO0FBQ0E7QUFDQSxHQUFHO0FBQ0g7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLEdBQUc7QUFDSDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxHQUFHO0FBQ0g7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsR0FBRztBQUNIO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxHQUFHO0FBQ0g7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLEdBQUc7QUFDSDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsR0FBRzs7QUFFSDtBQUNBLENBQUM7O0FBRUQ7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxDQUFDOztBQUVEO0FBQ0EiLCJmaWxlIjoiMjM3LmpzIiwic291cmNlc0NvbnRlbnQiOlsiJ3VzZSBzdHJpY3QnO1xuXG5PYmplY3QuZGVmaW5lUHJvcGVydHkoZXhwb3J0cywgJ19fZXNNb2R1bGUnLCB7XG4gIHZhbHVlOiB0cnVlXG59KTtcblxudmFyIF9jcmVhdGVDbGFzcyA9IChmdW5jdGlvbiAoKSB7IGZ1bmN0aW9uIGRlZmluZVByb3BlcnRpZXModGFyZ2V0LCBwcm9wcykgeyBmb3IgKHZhciBpID0gMDsgaSA8IHByb3BzLmxlbmd0aDsgaSsrKSB7IHZhciBkZXNjcmlwdG9yID0gcHJvcHNbaV07IGRlc2NyaXB0b3IuZW51bWVyYWJsZSA9IGRlc2NyaXB0b3IuZW51bWVyYWJsZSB8fCBmYWxzZTsgZGVzY3JpcHRvci5jb25maWd1cmFibGUgPSB0cnVlOyBpZiAoJ3ZhbHVlJyBpbiBkZXNjcmlwdG9yKSBkZXNjcmlwdG9yLndyaXRhYmxlID0gdHJ1ZTsgT2JqZWN0LmRlZmluZVByb3BlcnR5KHRhcmdldCwgZGVzY3JpcHRvci5rZXksIGRlc2NyaXB0b3IpOyB9IH0gcmV0dXJuIGZ1bmN0aW9uIChDb25zdHJ1Y3RvciwgcHJvdG9Qcm9wcywgc3RhdGljUHJvcHMpIHsgaWYgKHByb3RvUHJvcHMpIGRlZmluZVByb3BlcnRpZXMoQ29uc3RydWN0b3IucHJvdG90eXBlLCBwcm90b1Byb3BzKTsgaWYgKHN0YXRpY1Byb3BzKSBkZWZpbmVQcm9wZXJ0aWVzKENvbnN0cnVjdG9yLCBzdGF0aWNQcm9wcyk7IHJldHVybiBDb25zdHJ1Y3RvcjsgfTsgfSkoKTtcblxudmFyIF9nZXQgPSBmdW5jdGlvbiBnZXQoX3gsIF94MiwgX3gzKSB7IHZhciBfYWdhaW4gPSB0cnVlOyBfZnVuY3Rpb246IHdoaWxlIChfYWdhaW4pIHsgdmFyIG9iamVjdCA9IF94LCBwcm9wZXJ0eSA9IF94MiwgcmVjZWl2ZXIgPSBfeDM7IF9hZ2FpbiA9IGZhbHNlOyBpZiAob2JqZWN0ID09PSBudWxsKSBvYmplY3QgPSBGdW5jdGlvbi5wcm90b3R5cGU7IHZhciBkZXNjID0gT2JqZWN0LmdldE93blByb3BlcnR5RGVzY3JpcHRvcihvYmplY3QsIHByb3BlcnR5KTsgaWYgKGRlc2MgPT09IHVuZGVmaW5lZCkgeyB2YXIgcGFyZW50ID0gT2JqZWN0LmdldFByb3RvdHlwZU9mKG9iamVjdCk7IGlmIChwYXJlbnQgPT09IG51bGwpIHsgcmV0dXJuIHVuZGVmaW5lZDsgfSBlbHNlIHsgX3ggPSBwYXJlbnQ7IF94MiA9IHByb3BlcnR5OyBfeDMgPSByZWNlaXZlcjsgX2FnYWluID0gdHJ1ZTsgZGVzYyA9IHBhcmVudCA9IHVuZGVmaW5lZDsgY29udGludWUgX2Z1bmN0aW9uOyB9IH0gZWxzZSBpZiAoJ3ZhbHVlJyBpbiBkZXNjKSB7IHJldHVybiBkZXNjLnZhbHVlOyB9IGVsc2UgeyB2YXIgZ2V0dGVyID0gZGVzYy5nZXQ7IGlmIChnZXR0ZXIgPT09IHVuZGVmaW5lZCkgeyByZXR1cm4gdW5kZWZpbmVkOyB9IHJldHVybiBnZXR0ZXIuY2FsbChyZWNlaXZlcik7IH0gfSB9O1xuXG5mdW5jdGlvbiBfaW50ZXJvcFJlcXVpcmVEZWZhdWx0KG9iaikgeyByZXR1cm4gb2JqICYmIG9iai5fX2VzTW9kdWxlID8gb2JqIDogeyAnZGVmYXVsdCc6IG9iaiB9OyB9XG5cbmZ1bmN0aW9uIF9jbGFzc0NhbGxDaGVjayhpbnN0YW5jZSwgQ29uc3RydWN0b3IpIHsgaWYgKCEoaW5zdGFuY2UgaW5zdGFuY2VvZiBDb25zdHJ1Y3RvcikpIHsgdGhyb3cgbmV3IFR5cGVFcnJvcignQ2Fubm90IGNhbGwgYSBjbGFzcyBhcyBhIGZ1bmN0aW9uJyk7IH0gfVxuXG5mdW5jdGlvbiBfaW5oZXJpdHMoc3ViQ2xhc3MsIHN1cGVyQ2xhc3MpIHsgaWYgKHR5cGVvZiBzdXBlckNsYXNzICE9PSAnZnVuY3Rpb24nICYmIHN1cGVyQ2xhc3MgIT09IG51bGwpIHsgdGhyb3cgbmV3IFR5cGVFcnJvcignU3VwZXIgZXhwcmVzc2lvbiBtdXN0IGVpdGhlciBiZSBudWxsIG9yIGEgZnVuY3Rpb24sIG5vdCAnICsgdHlwZW9mIHN1cGVyQ2xhc3MpOyB9IHN1YkNsYXNzLnByb3RvdHlwZSA9IE9iamVjdC5jcmVhdGUoc3VwZXJDbGFzcyAmJiBzdXBlckNsYXNzLnByb3RvdHlwZSwgeyBjb25zdHJ1Y3RvcjogeyB2YWx1ZTogc3ViQ2xhc3MsIGVudW1lcmFibGU6IGZhbHNlLCB3cml0YWJsZTogdHJ1ZSwgY29uZmlndXJhYmxlOiB0cnVlIH0gfSk7IGlmIChzdXBlckNsYXNzKSBPYmplY3Quc2V0UHJvdG90eXBlT2YgPyBPYmplY3Quc2V0UHJvdG90eXBlT2Yoc3ViQ2xhc3MsIHN1cGVyQ2xhc3MpIDogc3ViQ2xhc3MuX19wcm90b19fID0gc3VwZXJDbGFzczsgfVxuXG52YXIgX2NvbnN0YW50c0FjdGlvblR5cGVzID0gcmVxdWlyZSgnLi4vY29uc3RhbnRzL0FjdGlvblR5cGVzJyk7XG5cbnZhciBfY29uc3RhbnRzQWN0aW9uVHlwZXMyID0gX2ludGVyb3BSZXF1aXJlRGVmYXVsdChfY29uc3RhbnRzQWN0aW9uVHlwZXMpO1xuXG52YXIgX2Rpc3BhdGNoZXJBcHBEaXNwYXRjaGVyID0gcmVxdWlyZSgnLi4vZGlzcGF0Y2hlci9BcHBEaXNwYXRjaGVyJyk7XG5cbnZhciBfZGlzcGF0Y2hlckFwcERpc3BhdGNoZXIyID0gX2ludGVyb3BSZXF1aXJlRGVmYXVsdChfZGlzcGF0Y2hlckFwcERpc3BhdGNoZXIpO1xuXG52YXIgX0Jhc2VTdG9yZTIgPSByZXF1aXJlKCcuL0Jhc2VTdG9yZScpO1xuXG52YXIgX0Jhc2VTdG9yZTMgPSBfaW50ZXJvcFJlcXVpcmVEZWZhdWx0KF9CYXNlU3RvcmUyKTtcblxudmFyIF9jb25zdGFudHNFdmVudFR5cGVzID0gcmVxdWlyZSgnLi4vY29uc3RhbnRzL0V2ZW50VHlwZXMnKTtcblxudmFyIF9jb25zdGFudHNFdmVudFR5cGVzMiA9IF9pbnRlcm9wUmVxdWlyZURlZmF1bHQoX2NvbnN0YW50c0V2ZW50VHlwZXMpO1xuXG52YXIgX2FjdGlvbnNUb3JyZW50QWN0aW9ucyA9IHJlcXVpcmUoJy4uL2FjdGlvbnMvVG9ycmVudEFjdGlvbnMnKTtcblxudmFyIF9hY3Rpb25zVG9ycmVudEFjdGlvbnMyID0gX2ludGVyb3BSZXF1aXJlRGVmYXVsdChfYWN0aW9uc1RvcnJlbnRBY3Rpb25zKTtcblxudmFyIF9hY3Rpb25zVUlBY3Rpb25zID0gcmVxdWlyZSgnLi4vYWN0aW9ucy9VSUFjdGlvbnMnKTtcblxudmFyIF9hY3Rpb25zVUlBY3Rpb25zMiA9IF9pbnRlcm9wUmVxdWlyZURlZmF1bHQoX2FjdGlvbnNVSUFjdGlvbnMpO1xuXG52YXIgVG9ycmVudEZpbHRlclN0b3JlQ2xhc3MgPSAoZnVuY3Rpb24gKF9CYXNlU3RvcmUpIHtcbiAgX2luaGVyaXRzKFRvcnJlbnRGaWx0ZXJTdG9yZUNsYXNzLCBfQmFzZVN0b3JlKTtcblxuICBmdW5jdGlvbiBUb3JyZW50RmlsdGVyU3RvcmVDbGFzcygpIHtcbiAgICBfY2xhc3NDYWxsQ2hlY2sodGhpcywgVG9ycmVudEZpbHRlclN0b3JlQ2xhc3MpO1xuXG4gICAgX2dldChPYmplY3QuZ2V0UHJvdG90eXBlT2YoVG9ycmVudEZpbHRlclN0b3JlQ2xhc3MucHJvdG90eXBlKSwgJ2NvbnN0cnVjdG9yJywgdGhpcykuY2FsbCh0aGlzKTtcblxuICAgIHRoaXMuc2VhcmNoRmlsdGVyID0gbnVsbDtcbiAgICB0aGlzLnN0YXR1c0ZpbHRlciA9ICdhbGwnO1xuICAgIHRoaXMudHJhY2tlckZpbHRlciA9ICdhbGwnO1xuICAgIHRoaXMuc29ydFRvcnJlbnRzQnkgPSB7XG4gICAgICBkaXJlY3Rpb246ICdkZXNjJyxcbiAgICAgIGRpc3BsYXlOYW1lOiAnRGF0ZSBBZGRlZCcsXG4gICAgICBwcm9wZXJ0eTogJ3NvcnRCeScsXG4gICAgICB2YWx1ZTogJ2FkZGVkJ1xuICAgIH07XG4gIH1cblxuICBfY3JlYXRlQ2xhc3MoVG9ycmVudEZpbHRlclN0b3JlQ2xhc3MsIFt7XG4gICAga2V5OiAnZmV0Y2hTb3J0UHJvcHMnLFxuICAgIHZhbHVlOiBmdW5jdGlvbiBmZXRjaFNvcnRQcm9wcygpIHtcbiAgICAgIF9hY3Rpb25zVUlBY3Rpb25zMlsnZGVmYXVsdCddLmZldGNoU29ydFByb3BzKCk7XG4gICAgfVxuICB9LCB7XG4gICAga2V5OiAnZmV0Y2hUb3JyZW50U3RhdHVzQ291bnQnLFxuICAgIHZhbHVlOiBmdW5jdGlvbiBmZXRjaFRvcnJlbnRTdGF0dXNDb3VudCgpIHtcbiAgICAgIF9hY3Rpb25zVG9ycmVudEFjdGlvbnMyWydkZWZhdWx0J10uZmV0Y2hUb3JyZW50U3RhdHVzQ291bnQoKTtcbiAgICB9XG4gIH0sIHtcbiAgICBrZXk6ICdmZXRjaFRvcnJlbnRUcmFja2VyQ291bnQnLFxuICAgIHZhbHVlOiBmdW5jdGlvbiBmZXRjaFRvcnJlbnRUcmFja2VyQ291bnQoKSB7XG4gICAgICBfYWN0aW9uc1RvcnJlbnRBY3Rpb25zMlsnZGVmYXVsdCddLmZldGNoVG9ycmVudFRyYWNrZXJDb3VudCgpO1xuICAgIH1cbiAgfSwge1xuICAgIGtleTogJ2dldFNlYXJjaEZpbHRlcicsXG4gICAgdmFsdWU6IGZ1bmN0aW9uIGdldFNlYXJjaEZpbHRlcigpIHtcbiAgICAgIHJldHVybiB0aGlzLnNlYXJjaEZpbHRlcjtcbiAgICB9XG4gIH0sIHtcbiAgICBrZXk6ICdnZXRTdGF0dXNGaWx0ZXInLFxuICAgIHZhbHVlOiBmdW5jdGlvbiBnZXRTdGF0dXNGaWx0ZXIoKSB7XG4gICAgICByZXR1cm4gdGhpcy5zdGF0dXNGaWx0ZXI7XG4gICAgfVxuICB9LCB7XG4gICAga2V5OiAnZ2V0VHJhY2tlckZpbHRlcicsXG4gICAgdmFsdWU6IGZ1bmN0aW9uIGdldFRyYWNrZXJGaWx0ZXIoKSB7XG4gICAgICByZXR1cm4gdGhpcy50cmFja2VyRmlsdGVyO1xuICAgIH1cbiAgfSwge1xuICAgIGtleTogJ2dldFRvcnJlbnRzU29ydCcsXG4gICAgdmFsdWU6IGZ1bmN0aW9uIGdldFRvcnJlbnRzU29ydCgpIHtcbiAgICAgIHJldHVybiB0aGlzLnNvcnRUb3JyZW50c0J5O1xuICAgIH1cbiAgfSwge1xuICAgIGtleTogJ2dldFRvcnJlbnRTdGF0dXNDb3VudCcsXG4gICAgdmFsdWU6IGZ1bmN0aW9uIGdldFRvcnJlbnRTdGF0dXNDb3VudCgpIHtcbiAgICAgIHJldHVybiB0aGlzLnRvcnJlbnRTdGF0dXNDb3VudDtcbiAgICB9XG4gIH0sIHtcbiAgICBrZXk6ICdnZXRUb3JyZW50VHJhY2tlckNvdW50JyxcbiAgICB2YWx1ZTogZnVuY3Rpb24gZ2V0VG9ycmVudFRyYWNrZXJDb3VudCgpIHtcbiAgICAgIHJldHVybiB0aGlzLnRvcnJlbnRUcmFja2VyQ291bnQ7XG4gICAgfVxuICB9LCB7XG4gICAga2V5OiAnaGFuZGxlU29ydFByb3BzUmVxdWVzdFN1Y2Nlc3MnLFxuICAgIHZhbHVlOiBmdW5jdGlvbiBoYW5kbGVTb3J0UHJvcHNSZXF1ZXN0U3VjY2Vzcyhzb3J0QnkpIHtcbiAgICAgIHRoaXMuc2V0VG9ycmVudHNTb3J0KHNvcnRCeSk7XG4gICAgfVxuICB9LCB7XG4gICAga2V5OiAnaGFuZGxlVG9ycmVudFRyYWNrZXJDb3VudFJlcXVlc3RFcnJvcicsXG4gICAgdmFsdWU6IGZ1bmN0aW9uIGhhbmRsZVRvcnJlbnRUcmFja2VyQ291bnRSZXF1ZXN0RXJyb3IoZXJyb3IpIHtcbiAgICAgIHRoaXMuZW1pdChfY29uc3RhbnRzRXZlbnRUeXBlczJbJ2RlZmF1bHQnXS5DTElFTlRfVE9SUkVOVF9UUkFDS0VSX0NPVU5UX1JFUVVFU1RfRVJST1IpO1xuICAgIH1cbiAgfSwge1xuICAgIGtleTogJ2hhbmRsZVRvcnJlbnRTdGF0dXNDb3VudFJlcXVlc3RFcnJvcicsXG4gICAgdmFsdWU6IGZ1bmN0aW9uIGhhbmRsZVRvcnJlbnRTdGF0dXNDb3VudFJlcXVlc3RFcnJvcihlcnJvcikge1xuICAgICAgdGhpcy5lbWl0KF9jb25zdGFudHNFdmVudFR5cGVzMlsnZGVmYXVsdCddLkNMSUVOVF9UT1JSRU5UX1NUQVRVU19DT1VOVF9SRVFVRVNUX0VSUk9SKTtcbiAgICB9XG4gIH0sIHtcbiAgICBrZXk6ICdpc0ZpbHRlckFjdGl2ZScsXG4gICAgdmFsdWU6IGZ1bmN0aW9uIGlzRmlsdGVyQWN0aXZlKCkge1xuICAgICAgcmV0dXJuIHRoaXMuZ2V0U3RhdHVzRmlsdGVyKCkgfHwgdGhpcy5nZXRTZWFyY2hGaWx0ZXIoKSB8fCB0aGlzLmdldFRyYWNrZXJGaWx0ZXIoKTtcbiAgICB9XG4gIH0sIHtcbiAgICBrZXk6ICdzZXRTZWFyY2hGaWx0ZXInLFxuICAgIHZhbHVlOiBmdW5jdGlvbiBzZXRTZWFyY2hGaWx0ZXIoZmlsdGVyKSB7XG4gICAgICB0aGlzLnNlYXJjaEZpbHRlciA9IGZpbHRlcjtcbiAgICAgIHRoaXMuZW1pdChfY29uc3RhbnRzRXZlbnRUeXBlczJbJ2RlZmF1bHQnXS5VSV9UT1JSRU5UU19GSUxURVJfU0VBUkNIX0NIQU5HRSk7XG4gICAgfVxuICB9LCB7XG4gICAga2V5OiAnc2V0U3RhdHVzRmlsdGVyJyxcbiAgICB2YWx1ZTogZnVuY3Rpb24gc2V0U3RhdHVzRmlsdGVyKGZpbHRlcikge1xuICAgICAgdGhpcy5zdGF0dXNGaWx0ZXIgPSBmaWx0ZXI7XG4gICAgICB0aGlzLmVtaXQoX2NvbnN0YW50c0V2ZW50VHlwZXMyWydkZWZhdWx0J10uVUlfVE9SUkVOVFNfRklMVEVSX0NIQU5HRSk7XG4gICAgICB0aGlzLmVtaXQoX2NvbnN0YW50c0V2ZW50VHlwZXMyWydkZWZhdWx0J10uVUlfVE9SUkVOVFNfRklMVEVSX1NUQVRVU19DSEFOR0UpO1xuICAgIH1cbiAgfSwge1xuICAgIGtleTogJ3NldFRyYWNrZXJGaWx0ZXInLFxuICAgIHZhbHVlOiBmdW5jdGlvbiBzZXRUcmFja2VyRmlsdGVyKGZpbHRlcikge1xuICAgICAgdGhpcy50cmFja2VyRmlsdGVyID0gZmlsdGVyO1xuICAgICAgdGhpcy5lbWl0KF9jb25zdGFudHNFdmVudFR5cGVzMlsnZGVmYXVsdCddLlVJX1RPUlJFTlRTX0ZJTFRFUl9DSEFOR0UpO1xuICAgICAgdGhpcy5lbWl0KF9jb25zdGFudHNFdmVudFR5cGVzMlsnZGVmYXVsdCddLlVJX1RPUlJFTlRTX0ZJTFRFUl9UUkFDS0VSX0NIQU5HRSk7XG4gICAgfVxuICB9LCB7XG4gICAga2V5OiAnc2V0VG9ycmVudHNTb3J0JyxcbiAgICB2YWx1ZTogZnVuY3Rpb24gc2V0VG9ycmVudHNTb3J0KHNvcnRCeSkge1xuICAgICAgdGhpcy5zb3J0VG9ycmVudHNCeSA9IHNvcnRCeTtcbiAgICAgIHRoaXMuZW1pdChfY29uc3RhbnRzRXZlbnRUeXBlczJbJ2RlZmF1bHQnXS5VSV9UT1JSRU5UU19TT1JUX0NIQU5HRSk7XG4gICAgfVxuICB9LCB7XG4gICAga2V5OiAnc2V0VG9ycmVudFN0YXR1c0NvdW50JyxcbiAgICB2YWx1ZTogZnVuY3Rpb24gc2V0VG9ycmVudFN0YXR1c0NvdW50KHN0YXR1c0NvdW50KSB7XG4gICAgICB0aGlzLnRvcnJlbnRTdGF0dXNDb3VudCA9IHN0YXR1c0NvdW50O1xuICAgICAgdGhpcy5lbWl0KF9jb25zdGFudHNFdmVudFR5cGVzMlsnZGVmYXVsdCddLkNMSUVOVF9UT1JSRU5UX1NUQVRVU19DT1VOVF9DSEFOR0UpO1xuICAgIH1cbiAgfSwge1xuICAgIGtleTogJ3NldFRvcnJlbnRUcmFja2VyQ291bnQnLFxuICAgIHZhbHVlOiBmdW5jdGlvbiBzZXRUb3JyZW50VHJhY2tlckNvdW50KHN0YXR1c0NvdW50KSB7XG4gICAgICB0aGlzLnRvcnJlbnRUcmFja2VyQ291bnQgPSBzdGF0dXNDb3VudDtcbiAgICAgIHRoaXMuZW1pdChfY29uc3RhbnRzRXZlbnRUeXBlczJbJ2RlZmF1bHQnXS5DTElFTlRfVE9SUkVOVF9UUkFDS0VSX0NPVU5UX0NIQU5HRSk7XG4gICAgfVxuICB9XSk7XG5cbiAgcmV0dXJuIFRvcnJlbnRGaWx0ZXJTdG9yZUNsYXNzO1xufSkoX0Jhc2VTdG9yZTNbJ2RlZmF1bHQnXSk7XG5cbnZhciBUb3JyZW50RmlsdGVyU3RvcmUgPSBuZXcgVG9ycmVudEZpbHRlclN0b3JlQ2xhc3MoKTtcblxuX2Rpc3BhdGNoZXJBcHBEaXNwYXRjaGVyMlsnZGVmYXVsdCddLnJlZ2lzdGVyKGZ1bmN0aW9uIChwYXlsb2FkKSB7XG4gIHZhciBhY3Rpb24gPSBwYXlsb2FkLmFjdGlvbjtcbiAgdmFyIHNvdXJjZSA9IHBheWxvYWQuc291cmNlO1xuXG4gIHN3aXRjaCAoYWN0aW9uLnR5cGUpIHtcbiAgICBjYXNlIF9jb25zdGFudHNBY3Rpb25UeXBlczJbJ2RlZmF1bHQnXS5VSV9TRVRfVE9SUkVOVF9TRUFSQ0hfRklMVEVSOlxuICAgICAgVG9ycmVudEZpbHRlclN0b3JlLnNldFNlYXJjaEZpbHRlcihhY3Rpb24uZGF0YSk7XG4gICAgICBicmVhaztcbiAgICBjYXNlIF9jb25zdGFudHNBY3Rpb25UeXBlczJbJ2RlZmF1bHQnXS5VSV9TRVRfVE9SUkVOVF9TVEFUVVNfRklMVEVSOlxuICAgICAgVG9ycmVudEZpbHRlclN0b3JlLnNldFN0YXR1c0ZpbHRlcihhY3Rpb24uZGF0YSk7XG4gICAgICBicmVhaztcbiAgICBjYXNlIF9jb25zdGFudHNBY3Rpb25UeXBlczJbJ2RlZmF1bHQnXS5VSV9TRVRfVE9SUkVOVF9UUkFDS0VSX0ZJTFRFUjpcbiAgICAgIFRvcnJlbnRGaWx0ZXJTdG9yZS5zZXRUcmFja2VyRmlsdGVyKGFjdGlvbi5kYXRhKTtcbiAgICAgIGJyZWFrO1xuICAgIGNhc2UgX2NvbnN0YW50c0FjdGlvblR5cGVzMlsnZGVmYXVsdCddLlVJX1NFVF9UT1JSRU5UX1NPUlQ6XG4gICAgICBUb3JyZW50RmlsdGVyU3RvcmUuc2V0VG9ycmVudHNTb3J0KGFjdGlvbi5kYXRhKTtcbiAgICAgIGJyZWFrO1xuICAgIGNhc2UgX2NvbnN0YW50c0FjdGlvblR5cGVzMlsnZGVmYXVsdCddLlVJX1NPUlRfUFJPUFNfUkVRVUVTVF9TVUNDRVNTOlxuICAgICAgVG9ycmVudEZpbHRlclN0b3JlLmhhbmRsZVNvcnRQcm9wc1JlcXVlc3RTdWNjZXNzKGFjdGlvbi5kYXRhKTtcbiAgICAgIGJyZWFrO1xuICAgIGNhc2UgX2NvbnN0YW50c0FjdGlvblR5cGVzMlsnZGVmYXVsdCddLkNMSUVOVF9GRVRDSF9UT1JSRU5UX1NUQVRVU19DT1VOVF9SRVFVRVNUX1NVQ0NFU1M6XG4gICAgICBUb3JyZW50RmlsdGVyU3RvcmUuc2V0VG9ycmVudFN0YXR1c0NvdW50KGFjdGlvbi5kYXRhKTtcbiAgICAgIGJyZWFrO1xuICAgIGNhc2UgX2NvbnN0YW50c0FjdGlvblR5cGVzMlsnZGVmYXVsdCddLkNMSUVOVF9GRVRDSF9UT1JSRU5UX1NUQVRVU19DT1VOVF9SRVFVRVNUX0VSUk9SOlxuICAgICAgVG9ycmVudEZpbHRlclN0b3JlLmhhbmRsZVRvcnJlbnRTdGF0dXNDb3VudFJlcXVlc3RFcnJvcihhY3Rpb24uZXJyb3IpO1xuICAgICAgYnJlYWs7XG4gICAgY2FzZSBfY29uc3RhbnRzQWN0aW9uVHlwZXMyWydkZWZhdWx0J10uQ0xJRU5UX0ZFVENIX1RPUlJFTlRfVFJBQ0tFUl9DT1VOVF9SRVFVRVNUX1NVQ0NFU1M6XG4gICAgICBUb3JyZW50RmlsdGVyU3RvcmUuc2V0VG9ycmVudFRyYWNrZXJDb3VudChhY3Rpb24uZGF0YSk7XG4gICAgICBicmVhaztcbiAgICBjYXNlIF9jb25zdGFudHNBY3Rpb25UeXBlczJbJ2RlZmF1bHQnXS5DTElFTlRfRkVUQ0hfVE9SUkVOVF9UUkFDS0VSX0NPVU5UX1JFUVVFU1RfRVJST1I6XG4gICAgICBUb3JyZW50RmlsdGVyU3RvcmUuaGFuZGxlVG9ycmVudFRyYWNrZXJDb3VudFJlcXVlc3RFcnJvcihhY3Rpb24uZXJyb3IpO1xuICAgICAgYnJlYWs7XG4gIH1cbn0pO1xuXG5leHBvcnRzWydkZWZhdWx0J10gPSBUb3JyZW50RmlsdGVyU3RvcmU7XG5tb2R1bGUuZXhwb3J0cyA9IGV4cG9ydHNbJ2RlZmF1bHQnXTtcblxuXG4vKioqKioqKioqKioqKioqKipcbiAqKiBXRUJQQUNLIEZPT1RFUlxuICoqIC4vY2xpZW50L3NvdXJjZS9zY3JpcHRzL3N0b3Jlcy9Ub3JyZW50RmlsdGVyU3RvcmUuanNcbiAqKiBtb2R1bGUgaWQgPSAyMzdcbiAqKiBtb2R1bGUgY2h1bmtzID0gMFxuICoqLyJdLCJzb3VyY2VSb290IjoiIn0="); /***/ }, /* 238 */ @@ -1514,7 +1514,7 @@ /* 245 */ /***/ function(module, exports, __webpack_require__) { - eval("'use strict';\n\nObject.defineProperty(exports, '__esModule', {\n value: true\n});\n\nvar _createClass = (function () { function defineProperties(target, props) { for (var i = 0; i < props.length; i++) { var descriptor = props[i]; descriptor.enumerable = descriptor.enumerable || false; descriptor.configurable = true; if ('value' in descriptor) descriptor.writable = true; Object.defineProperty(target, descriptor.key, descriptor); } } return function (Constructor, protoProps, staticProps) { if (protoProps) defineProperties(Constructor.prototype, protoProps); if (staticProps) defineProperties(Constructor, staticProps); return Constructor; }; })();\n\nvar _get = function get(_x2, _x3, _x4) { var _again = true; _function: while (_again) { var object = _x2, property = _x3, receiver = _x4; _again = false; if (object === null) object = Function.prototype; var desc = Object.getOwnPropertyDescriptor(object, property); if (desc === undefined) { var parent = Object.getPrototypeOf(object); if (parent === null) { return undefined; } else { _x2 = parent; _x3 = property; _x4 = receiver; _again = true; desc = parent = undefined; continue _function; } } else if ('value' in desc) { return desc.value; } else { var getter = desc.get; if (getter === undefined) { return undefined; } return getter.call(receiver); } } };\n\nfunction _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { 'default': obj }; }\n\nfunction _classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError('Cannot call a class as a function'); } }\n\nfunction _inherits(subClass, superClass) { if (typeof superClass !== 'function' && superClass !== null) { throw new TypeError('Super expression must either be null or a function, not ' + typeof superClass); } subClass.prototype = Object.create(superClass && superClass.prototype, { constructor: { value: subClass, enumerable: false, writable: true, configurable: true } }); if (superClass) Object.setPrototypeOf ? Object.setPrototypeOf(subClass, superClass) : subClass.__proto__ = superClass; }\n\nvar _constantsActionTypes = __webpack_require__(178);\n\nvar _constantsActionTypes2 = _interopRequireDefault(_constantsActionTypes);\n\nvar _dispatcherAppDispatcher = __webpack_require__(179);\n\nvar _dispatcherAppDispatcher2 = _interopRequireDefault(_dispatcherAppDispatcher);\n\nvar _BaseStore2 = __webpack_require__(183);\n\nvar _BaseStore3 = _interopRequireDefault(_BaseStore2);\n\nvar _actionsClientActions = __webpack_require__(246);\n\nvar _actionsClientActions2 = _interopRequireDefault(_actionsClientActions);\n\nvar _config = __webpack_require__(232);\n\nvar _config2 = _interopRequireDefault(_config);\n\nvar _constantsEventTypes = __webpack_require__(176);\n\nvar _constantsEventTypes2 = _interopRequireDefault(_constantsEventTypes);\n\nvar TransferDataStoreClass = (function (_BaseStore) {\n _inherits(TransferDataStoreClass, _BaseStore);\n\n function TransferDataStoreClass() {\n _classCallCheck(this, TransferDataStoreClass);\n\n _get(Object.getPrototypeOf(TransferDataStoreClass.prototype), 'constructor', this).call(this);\n\n this.pollTransferDataID = null;\n this.transferRates = { download: [], upload: [] };\n this.transferTotals = { download: null, upload: null };\n this.throttles = { download: null, upload: null };\n }\n\n _createClass(TransferDataStoreClass, [{\n key: 'fetchTransferData',\n value: function fetchTransferData() {\n _actionsClientActions2['default'].fetchTransferHistory({\n snapshot: 'fiveMin'\n });\n\n _actionsClientActions2['default'].fetchTransferData();\n\n if (this.pollTransferDataID === null) {\n this.startPollingTransferData();\n }\n }\n }, {\n key: 'getThrottles',\n value: function getThrottles() {\n var options = arguments.length <= 0 || arguments[0] === undefined ? {} : arguments[0];\n\n if (options.latest) {\n return {\n download: this.throttles.download ? this.throttles.download[this.throttles.download.length - 1] : null,\n upload: this.throttles.upload ? this.throttles.upload[this.throttles.upload.length - 1] : null\n };\n }\n return this.throttles;\n }\n }, {\n key: 'getTransferTotals',\n value: function getTransferTotals() {\n return this.transferTotals;\n }\n }, {\n key: 'getTransferRate',\n value: function getTransferRate() {\n return this.transferRate;\n }\n }, {\n key: 'getTransferRates',\n value: function getTransferRates() {\n return this.transferRates;\n }\n }, {\n key: 'handleSetThrottleSuccess',\n value: function handleSetThrottleSuccess(data) {\n this.fetchTransferData();\n this.emit(_constantsEventTypes2['default'].CLIENT_SET_THROTTLE_SUCCESS);\n }\n }, {\n key: 'handleSetThrottleError',\n value: function handleSetThrottleError(error) {\n this.emit(_constantsEventTypes2['default'].CLIENT_SET_THROTTLE_ERROR);\n }\n }, {\n key: 'handleTransferDataSuccess',\n value: function handleTransferDataSuccess(transferData) {\n this.transferTotals = {\n download: transferData.downloadTotal,\n upload: transferData.uploadTotal\n };\n\n this.transferRate = {\n download: transferData.downloadRate,\n upload: transferData.uploadRate\n };\n\n // add the latest download & upload throttles to the end of the array and\n // remove the first element in the array. if the arrays are empty, fill in\n // zeros the last known throttle value.\n var index = 0;\n var downloadRateThrottleHistory = Object.assign([], this.throttles.download);\n var uploadRateThrottleHistory = Object.assign([], this.throttles.upload);\n\n if (downloadRateThrottleHistory.length === _config2['default'].maxHistoryStates) {\n\n downloadRateThrottleHistory.shift();\n uploadRateThrottleHistory.shift();\n\n downloadRateThrottleHistory.push(parseInt(transferData.downloadThrottle));\n uploadRateThrottleHistory.push(parseInt(transferData.uploadThrottle));\n } else {\n while (index < _config2['default'].maxHistoryStates) {\n // we assume the throttle history has been the same for all previous\n // history states.\n uploadRateThrottleHistory[index] = parseInt(transferData.uploadThrottle);\n downloadRateThrottleHistory[index] = parseInt(transferData.downloadThrottle);\n index++;\n }\n }\n\n this.throttles = {\n download: downloadRateThrottleHistory,\n upload: uploadRateThrottleHistory\n };\n\n this.emit(_constantsEventTypes2['default'].CLIENT_TRANSFER_DATA_REQUEST_SUCCESS);\n }\n }, {\n key: 'handleTransferDataError',\n value: function handleTransferDataError() {\n this.emit(_constantsEventTypes2['default'].CLIENT_TRANSFER_DATA_REQUEST_ERROR);\n }\n }, {\n key: 'handleTransferHistoryError',\n value: function handleTransferHistoryError(error) {\n console.trace(error);\n }\n }, {\n key: 'handleTransferHistorySuccess',\n value: function handleTransferHistorySuccess(transferData) {\n this.transferRates = {\n download: transferData.download,\n upload: transferData.upload\n };\n\n this.emit(_constantsEventTypes2['default'].CLIENT_TRANSFER_HISTORY_REQUEST_SUCCESS);\n }\n }, {\n key: 'startPollingTransferData',\n value: function startPollingTransferData() {\n this.pollTransferDataID = setInterval(this.fetchTransferData.bind(this), _config2['default'].pollInterval);\n }\n }]);\n\n return TransferDataStoreClass;\n})(_BaseStore3['default']);\n\nvar TransferDataStore = new TransferDataStoreClass();\n\n_dispatcherAppDispatcher2['default'].register(function (payload) {\n var action = payload.action;\n var source = payload.source;\n\n switch (action.type) {\n case _constantsActionTypes2['default'].CLIENT_FETCH_TRANSFER_DATA_SUCCESS:\n TransferDataStore.handleTransferDataSuccess(action.data.transferData);\n break;\n case _constantsActionTypes2['default'].CLIENT_FETCH_TRANSFER_DATA_ERROR:\n TransferDataStore.handleTransferDataError(action.data.error);\n break;\n case _constantsActionTypes2['default'].CLIENT_SET_THROTTLE_SUCCESS:\n TransferDataStore.handleSetThrottleSuccess(action.data.transferData);\n break;\n case _constantsActionTypes2['default'].CLIENT_SET_THROTTLE_ERROR:\n TransferDataStore.handleSetThrottleError(action.data.error);\n break;\n case _constantsActionTypes2['default'].CLIENT_FETCH_TRANSFER_HISTORY_ERROR:\n TransferDataStore.handleTransferHistoryError(action.error);\n break;\n case _constantsActionTypes2['default'].CLIENT_FETCH_TRANSFER_HISTORY_SUCCESS:\n TransferDataStore.handleTransferHistorySuccess(action.data);\n break;\n }\n});\n\nexports['default'] = TransferDataStore;\nmodule.exports = exports['default'];//@ sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIndlYnBhY2s6Ly8vLi9jbGllbnQvc291cmNlL3NjcmlwdHMvc3RvcmVzL1RyYW5zZmVyRGF0YVN0b3JlLmpzPzExZDEiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUE7O0FBRUE7QUFDQTtBQUNBLENBQUM7O0FBRUQsaUNBQWlDLDJDQUEyQyxnQkFBZ0Isa0JBQWtCLE9BQU8sMkJBQTJCLHdEQUF3RCxnQ0FBZ0MsdURBQXVELDJEQUEyRCxFQUFFLEVBQUUseURBQXlELHFFQUFxRSw2REFBNkQsb0JBQW9CLEdBQUcsRUFBRTs7QUFFbGpCLHdDQUF3QyxtQkFBbUIsNEJBQTRCLGtEQUFrRCxnQkFBZ0Isa0RBQWtELDhEQUE4RCwwQkFBMEIsNENBQTRDLHVCQUF1QixrQkFBa0IsRUFBRSxPQUFPLGNBQWMsZ0JBQWdCLGdCQUFnQixlQUFlLDJCQUEyQixvQkFBb0IsRUFBRSxFQUFFLDRCQUE0QixtQkFBbUIsRUFBRSxPQUFPLHVCQUF1Qiw0QkFBNEIsa0JBQWtCLEVBQUUsOEJBQThCLEVBQUUsRUFBRTs7QUFFbHBCLHNDQUFzQyx1Q0FBdUMsa0JBQWtCOztBQUUvRixpREFBaUQsMENBQTBDLDBEQUEwRCxFQUFFOztBQUV2SiwwQ0FBMEMsK0RBQStELHFHQUFxRyxFQUFFLHlFQUF5RSxlQUFlLHlFQUF5RSxFQUFFLEVBQUUsdUhBQXVIOztBQUU1ZTs7QUFFQTs7QUFFQTs7QUFFQTs7QUFFQTs7QUFFQTs7QUFFQTs7QUFFQTs7QUFFQTs7QUFFQTs7QUFFQTs7QUFFQTs7QUFFQTtBQUNBOztBQUVBO0FBQ0E7O0FBRUE7O0FBRUE7QUFDQSwwQkFBMEI7QUFDMUIsMkJBQTJCO0FBQzNCLHNCQUFzQjtBQUN0Qjs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsT0FBTzs7QUFFUDs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLEdBQUc7QUFDSDtBQUNBO0FBQ0EsNEVBQTRFOztBQUU1RTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsR0FBRztBQUNIO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsR0FBRztBQUNIO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsR0FBRztBQUNIO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsR0FBRztBQUNIO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxHQUFHO0FBQ0g7QUFDQTtBQUNBO0FBQ0E7QUFDQSxHQUFHO0FBQ0g7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTs7QUFFQTtBQUNBOztBQUVBO0FBQ0E7QUFDQSxPQUFPO0FBQ1A7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0EsR0FBRztBQUNIO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsR0FBRztBQUNIO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsR0FBRztBQUNIO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0EsR0FBRztBQUNIO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsR0FBRzs7QUFFSDtBQUNBLENBQUM7O0FBRUQ7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxDQUFDOztBQUVEO0FBQ0EiLCJmaWxlIjoiMjQ1LmpzIiwic291cmNlc0NvbnRlbnQiOlsiJ3VzZSBzdHJpY3QnO1xuXG5PYmplY3QuZGVmaW5lUHJvcGVydHkoZXhwb3J0cywgJ19fZXNNb2R1bGUnLCB7XG4gIHZhbHVlOiB0cnVlXG59KTtcblxudmFyIF9jcmVhdGVDbGFzcyA9IChmdW5jdGlvbiAoKSB7IGZ1bmN0aW9uIGRlZmluZVByb3BlcnRpZXModGFyZ2V0LCBwcm9wcykgeyBmb3IgKHZhciBpID0gMDsgaSA8IHByb3BzLmxlbmd0aDsgaSsrKSB7IHZhciBkZXNjcmlwdG9yID0gcHJvcHNbaV07IGRlc2NyaXB0b3IuZW51bWVyYWJsZSA9IGRlc2NyaXB0b3IuZW51bWVyYWJsZSB8fCBmYWxzZTsgZGVzY3JpcHRvci5jb25maWd1cmFibGUgPSB0cnVlOyBpZiAoJ3ZhbHVlJyBpbiBkZXNjcmlwdG9yKSBkZXNjcmlwdG9yLndyaXRhYmxlID0gdHJ1ZTsgT2JqZWN0LmRlZmluZVByb3BlcnR5KHRhcmdldCwgZGVzY3JpcHRvci5rZXksIGRlc2NyaXB0b3IpOyB9IH0gcmV0dXJuIGZ1bmN0aW9uIChDb25zdHJ1Y3RvciwgcHJvdG9Qcm9wcywgc3RhdGljUHJvcHMpIHsgaWYgKHByb3RvUHJvcHMpIGRlZmluZVByb3BlcnRpZXMoQ29uc3RydWN0b3IucHJvdG90eXBlLCBwcm90b1Byb3BzKTsgaWYgKHN0YXRpY1Byb3BzKSBkZWZpbmVQcm9wZXJ0aWVzKENvbnN0cnVjdG9yLCBzdGF0aWNQcm9wcyk7IHJldHVybiBDb25zdHJ1Y3RvcjsgfTsgfSkoKTtcblxudmFyIF9nZXQgPSBmdW5jdGlvbiBnZXQoX3gyLCBfeDMsIF94NCkgeyB2YXIgX2FnYWluID0gdHJ1ZTsgX2Z1bmN0aW9uOiB3aGlsZSAoX2FnYWluKSB7IHZhciBvYmplY3QgPSBfeDIsIHByb3BlcnR5ID0gX3gzLCByZWNlaXZlciA9IF94NDsgX2FnYWluID0gZmFsc2U7IGlmIChvYmplY3QgPT09IG51bGwpIG9iamVjdCA9IEZ1bmN0aW9uLnByb3RvdHlwZTsgdmFyIGRlc2MgPSBPYmplY3QuZ2V0T3duUHJvcGVydHlEZXNjcmlwdG9yKG9iamVjdCwgcHJvcGVydHkpOyBpZiAoZGVzYyA9PT0gdW5kZWZpbmVkKSB7IHZhciBwYXJlbnQgPSBPYmplY3QuZ2V0UHJvdG90eXBlT2Yob2JqZWN0KTsgaWYgKHBhcmVudCA9PT0gbnVsbCkgeyByZXR1cm4gdW5kZWZpbmVkOyB9IGVsc2UgeyBfeDIgPSBwYXJlbnQ7IF94MyA9IHByb3BlcnR5OyBfeDQgPSByZWNlaXZlcjsgX2FnYWluID0gdHJ1ZTsgZGVzYyA9IHBhcmVudCA9IHVuZGVmaW5lZDsgY29udGludWUgX2Z1bmN0aW9uOyB9IH0gZWxzZSBpZiAoJ3ZhbHVlJyBpbiBkZXNjKSB7IHJldHVybiBkZXNjLnZhbHVlOyB9IGVsc2UgeyB2YXIgZ2V0dGVyID0gZGVzYy5nZXQ7IGlmIChnZXR0ZXIgPT09IHVuZGVmaW5lZCkgeyByZXR1cm4gdW5kZWZpbmVkOyB9IHJldHVybiBnZXR0ZXIuY2FsbChyZWNlaXZlcik7IH0gfSB9O1xuXG5mdW5jdGlvbiBfaW50ZXJvcFJlcXVpcmVEZWZhdWx0KG9iaikgeyByZXR1cm4gb2JqICYmIG9iai5fX2VzTW9kdWxlID8gb2JqIDogeyAnZGVmYXVsdCc6IG9iaiB9OyB9XG5cbmZ1bmN0aW9uIF9jbGFzc0NhbGxDaGVjayhpbnN0YW5jZSwgQ29uc3RydWN0b3IpIHsgaWYgKCEoaW5zdGFuY2UgaW5zdGFuY2VvZiBDb25zdHJ1Y3RvcikpIHsgdGhyb3cgbmV3IFR5cGVFcnJvcignQ2Fubm90IGNhbGwgYSBjbGFzcyBhcyBhIGZ1bmN0aW9uJyk7IH0gfVxuXG5mdW5jdGlvbiBfaW5oZXJpdHMoc3ViQ2xhc3MsIHN1cGVyQ2xhc3MpIHsgaWYgKHR5cGVvZiBzdXBlckNsYXNzICE9PSAnZnVuY3Rpb24nICYmIHN1cGVyQ2xhc3MgIT09IG51bGwpIHsgdGhyb3cgbmV3IFR5cGVFcnJvcignU3VwZXIgZXhwcmVzc2lvbiBtdXN0IGVpdGhlciBiZSBudWxsIG9yIGEgZnVuY3Rpb24sIG5vdCAnICsgdHlwZW9mIHN1cGVyQ2xhc3MpOyB9IHN1YkNsYXNzLnByb3RvdHlwZSA9IE9iamVjdC5jcmVhdGUoc3VwZXJDbGFzcyAmJiBzdXBlckNsYXNzLnByb3RvdHlwZSwgeyBjb25zdHJ1Y3RvcjogeyB2YWx1ZTogc3ViQ2xhc3MsIGVudW1lcmFibGU6IGZhbHNlLCB3cml0YWJsZTogdHJ1ZSwgY29uZmlndXJhYmxlOiB0cnVlIH0gfSk7IGlmIChzdXBlckNsYXNzKSBPYmplY3Quc2V0UHJvdG90eXBlT2YgPyBPYmplY3Quc2V0UHJvdG90eXBlT2Yoc3ViQ2xhc3MsIHN1cGVyQ2xhc3MpIDogc3ViQ2xhc3MuX19wcm90b19fID0gc3VwZXJDbGFzczsgfVxuXG52YXIgX2NvbnN0YW50c0FjdGlvblR5cGVzID0gcmVxdWlyZSgnLi4vY29uc3RhbnRzL0FjdGlvblR5cGVzJyk7XG5cbnZhciBfY29uc3RhbnRzQWN0aW9uVHlwZXMyID0gX2ludGVyb3BSZXF1aXJlRGVmYXVsdChfY29uc3RhbnRzQWN0aW9uVHlwZXMpO1xuXG52YXIgX2Rpc3BhdGNoZXJBcHBEaXNwYXRjaGVyID0gcmVxdWlyZSgnLi4vZGlzcGF0Y2hlci9BcHBEaXNwYXRjaGVyJyk7XG5cbnZhciBfZGlzcGF0Y2hlckFwcERpc3BhdGNoZXIyID0gX2ludGVyb3BSZXF1aXJlRGVmYXVsdChfZGlzcGF0Y2hlckFwcERpc3BhdGNoZXIpO1xuXG52YXIgX0Jhc2VTdG9yZTIgPSByZXF1aXJlKCcuL0Jhc2VTdG9yZScpO1xuXG52YXIgX0Jhc2VTdG9yZTMgPSBfaW50ZXJvcFJlcXVpcmVEZWZhdWx0KF9CYXNlU3RvcmUyKTtcblxudmFyIF9hY3Rpb25zQ2xpZW50QWN0aW9ucyA9IHJlcXVpcmUoJy4uL2FjdGlvbnMvQ2xpZW50QWN0aW9ucycpO1xuXG52YXIgX2FjdGlvbnNDbGllbnRBY3Rpb25zMiA9IF9pbnRlcm9wUmVxdWlyZURlZmF1bHQoX2FjdGlvbnNDbGllbnRBY3Rpb25zKTtcblxudmFyIF9jb25maWcgPSByZXF1aXJlKCcuLi8uLi8uLi8uLi9jb25maWcnKTtcblxudmFyIF9jb25maWcyID0gX2ludGVyb3BSZXF1aXJlRGVmYXVsdChfY29uZmlnKTtcblxudmFyIF9jb25zdGFudHNFdmVudFR5cGVzID0gcmVxdWlyZSgnLi4vY29uc3RhbnRzL0V2ZW50VHlwZXMnKTtcblxudmFyIF9jb25zdGFudHNFdmVudFR5cGVzMiA9IF9pbnRlcm9wUmVxdWlyZURlZmF1bHQoX2NvbnN0YW50c0V2ZW50VHlwZXMpO1xuXG52YXIgVHJhbnNmZXJEYXRhU3RvcmVDbGFzcyA9IChmdW5jdGlvbiAoX0Jhc2VTdG9yZSkge1xuICBfaW5oZXJpdHMoVHJhbnNmZXJEYXRhU3RvcmVDbGFzcywgX0Jhc2VTdG9yZSk7XG5cbiAgZnVuY3Rpb24gVHJhbnNmZXJEYXRhU3RvcmVDbGFzcygpIHtcbiAgICBfY2xhc3NDYWxsQ2hlY2sodGhpcywgVHJhbnNmZXJEYXRhU3RvcmVDbGFzcyk7XG5cbiAgICBfZ2V0KE9iamVjdC5nZXRQcm90b3R5cGVPZihUcmFuc2ZlckRhdGFTdG9yZUNsYXNzLnByb3RvdHlwZSksICdjb25zdHJ1Y3RvcicsIHRoaXMpLmNhbGwodGhpcyk7XG5cbiAgICB0aGlzLnBvbGxUcmFuc2ZlckRhdGFJRCA9IG51bGw7XG4gICAgdGhpcy50cmFuc2ZlclJhdGVzID0geyBkb3dubG9hZDogW10sIHVwbG9hZDogW10gfTtcbiAgICB0aGlzLnRyYW5zZmVyVG90YWxzID0geyBkb3dubG9hZDogbnVsbCwgdXBsb2FkOiBudWxsIH07XG4gICAgdGhpcy50aHJvdHRsZXMgPSB7IGRvd25sb2FkOiBudWxsLCB1cGxvYWQ6IG51bGwgfTtcbiAgfVxuXG4gIF9jcmVhdGVDbGFzcyhUcmFuc2ZlckRhdGFTdG9yZUNsYXNzLCBbe1xuICAgIGtleTogJ2ZldGNoVHJhbnNmZXJEYXRhJyxcbiAgICB2YWx1ZTogZnVuY3Rpb24gZmV0Y2hUcmFuc2ZlckRhdGEoKSB7XG4gICAgICBfYWN0aW9uc0NsaWVudEFjdGlvbnMyWydkZWZhdWx0J10uZmV0Y2hUcmFuc2Zlckhpc3Rvcnkoe1xuICAgICAgICBzbmFwc2hvdDogJ2ZpdmVNaW4nXG4gICAgICB9KTtcblxuICAgICAgX2FjdGlvbnNDbGllbnRBY3Rpb25zMlsnZGVmYXVsdCddLmZldGNoVHJhbnNmZXJEYXRhKCk7XG5cbiAgICAgIGlmICh0aGlzLnBvbGxUcmFuc2ZlckRhdGFJRCA9PT0gbnVsbCkge1xuICAgICAgICB0aGlzLnN0YXJ0UG9sbGluZ1RyYW5zZmVyRGF0YSgpO1xuICAgICAgfVxuICAgIH1cbiAgfSwge1xuICAgIGtleTogJ2dldFRocm90dGxlcycsXG4gICAgdmFsdWU6IGZ1bmN0aW9uIGdldFRocm90dGxlcygpIHtcbiAgICAgIHZhciBvcHRpb25zID0gYXJndW1lbnRzLmxlbmd0aCA8PSAwIHx8IGFyZ3VtZW50c1swXSA9PT0gdW5kZWZpbmVkID8ge30gOiBhcmd1bWVudHNbMF07XG5cbiAgICAgIGlmIChvcHRpb25zLmxhdGVzdCkge1xuICAgICAgICByZXR1cm4ge1xuICAgICAgICAgIGRvd25sb2FkOiB0aGlzLnRocm90dGxlcy5kb3dubG9hZCA/IHRoaXMudGhyb3R0bGVzLmRvd25sb2FkW3RoaXMudGhyb3R0bGVzLmRvd25sb2FkLmxlbmd0aCAtIDFdIDogbnVsbCxcbiAgICAgICAgICB1cGxvYWQ6IHRoaXMudGhyb3R0bGVzLnVwbG9hZCA/IHRoaXMudGhyb3R0bGVzLnVwbG9hZFt0aGlzLnRocm90dGxlcy51cGxvYWQubGVuZ3RoIC0gMV0gOiBudWxsXG4gICAgICAgIH07XG4gICAgICB9XG4gICAgICByZXR1cm4gdGhpcy50aHJvdHRsZXM7XG4gICAgfVxuICB9LCB7XG4gICAga2V5OiAnZ2V0VHJhbnNmZXJUb3RhbHMnLFxuICAgIHZhbHVlOiBmdW5jdGlvbiBnZXRUcmFuc2ZlclRvdGFscygpIHtcbiAgICAgIHJldHVybiB0aGlzLnRyYW5zZmVyVG90YWxzO1xuICAgIH1cbiAgfSwge1xuICAgIGtleTogJ2dldFRyYW5zZmVyUmF0ZScsXG4gICAgdmFsdWU6IGZ1bmN0aW9uIGdldFRyYW5zZmVyUmF0ZSgpIHtcbiAgICAgIHJldHVybiB0aGlzLnRyYW5zZmVyUmF0ZTtcbiAgICB9XG4gIH0sIHtcbiAgICBrZXk6ICdnZXRUcmFuc2ZlclJhdGVzJyxcbiAgICB2YWx1ZTogZnVuY3Rpb24gZ2V0VHJhbnNmZXJSYXRlcygpIHtcbiAgICAgIHJldHVybiB0aGlzLnRyYW5zZmVyUmF0ZXM7XG4gICAgfVxuICB9LCB7XG4gICAga2V5OiAnaGFuZGxlU2V0VGhyb3R0bGVTdWNjZXNzJyxcbiAgICB2YWx1ZTogZnVuY3Rpb24gaGFuZGxlU2V0VGhyb3R0bGVTdWNjZXNzKGRhdGEpIHtcbiAgICAgIHRoaXMuZmV0Y2hUcmFuc2ZlckRhdGEoKTtcbiAgICAgIHRoaXMuZW1pdChfY29uc3RhbnRzRXZlbnRUeXBlczJbJ2RlZmF1bHQnXS5DTElFTlRfU0VUX1RIUk9UVExFX1NVQ0NFU1MpO1xuICAgIH1cbiAgfSwge1xuICAgIGtleTogJ2hhbmRsZVNldFRocm90dGxlRXJyb3InLFxuICAgIHZhbHVlOiBmdW5jdGlvbiBoYW5kbGVTZXRUaHJvdHRsZUVycm9yKGVycm9yKSB7XG4gICAgICB0aGlzLmVtaXQoX2NvbnN0YW50c0V2ZW50VHlwZXMyWydkZWZhdWx0J10uQ0xJRU5UX1NFVF9USFJPVFRMRV9FUlJPUik7XG4gICAgfVxuICB9LCB7XG4gICAga2V5OiAnaGFuZGxlVHJhbnNmZXJEYXRhU3VjY2VzcycsXG4gICAgdmFsdWU6IGZ1bmN0aW9uIGhhbmRsZVRyYW5zZmVyRGF0YVN1Y2Nlc3ModHJhbnNmZXJEYXRhKSB7XG4gICAgICB0aGlzLnRyYW5zZmVyVG90YWxzID0ge1xuICAgICAgICBkb3dubG9hZDogdHJhbnNmZXJEYXRhLmRvd25sb2FkVG90YWwsXG4gICAgICAgIHVwbG9hZDogdHJhbnNmZXJEYXRhLnVwbG9hZFRvdGFsXG4gICAgICB9O1xuXG4gICAgICB0aGlzLnRyYW5zZmVyUmF0ZSA9IHtcbiAgICAgICAgZG93bmxvYWQ6IHRyYW5zZmVyRGF0YS5kb3dubG9hZFJhdGUsXG4gICAgICAgIHVwbG9hZDogdHJhbnNmZXJEYXRhLnVwbG9hZFJhdGVcbiAgICAgIH07XG5cbiAgICAgIC8vIGFkZCB0aGUgbGF0ZXN0IGRvd25sb2FkICYgdXBsb2FkIHRocm90dGxlcyB0byB0aGUgZW5kIG9mIHRoZSBhcnJheSBhbmRcbiAgICAgIC8vIHJlbW92ZSB0aGUgZmlyc3QgZWxlbWVudCBpbiB0aGUgYXJyYXkuIGlmIHRoZSBhcnJheXMgYXJlIGVtcHR5LCBmaWxsIGluXG4gICAgICAvLyB6ZXJvcyB0aGUgbGFzdCBrbm93biB0aHJvdHRsZSB2YWx1ZS5cbiAgICAgIHZhciBpbmRleCA9IDA7XG4gICAgICB2YXIgZG93bmxvYWRSYXRlVGhyb3R0bGVIaXN0b3J5ID0gT2JqZWN0LmFzc2lnbihbXSwgdGhpcy50aHJvdHRsZXMuZG93bmxvYWQpO1xuICAgICAgdmFyIHVwbG9hZFJhdGVUaHJvdHRsZUhpc3RvcnkgPSBPYmplY3QuYXNzaWduKFtdLCB0aGlzLnRocm90dGxlcy51cGxvYWQpO1xuXG4gICAgICBpZiAoZG93bmxvYWRSYXRlVGhyb3R0bGVIaXN0b3J5Lmxlbmd0aCA9PT0gX2NvbmZpZzJbJ2RlZmF1bHQnXS5tYXhIaXN0b3J5U3RhdGVzKSB7XG5cbiAgICAgICAgZG93bmxvYWRSYXRlVGhyb3R0bGVIaXN0b3J5LnNoaWZ0KCk7XG4gICAgICAgIHVwbG9hZFJhdGVUaHJvdHRsZUhpc3Rvcnkuc2hpZnQoKTtcblxuICAgICAgICBkb3dubG9hZFJhdGVUaHJvdHRsZUhpc3RvcnkucHVzaChwYXJzZUludCh0cmFuc2ZlckRhdGEuZG93bmxvYWRUaHJvdHRsZSkpO1xuICAgICAgICB1cGxvYWRSYXRlVGhyb3R0bGVIaXN0b3J5LnB1c2gocGFyc2VJbnQodHJhbnNmZXJEYXRhLnVwbG9hZFRocm90dGxlKSk7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICB3aGlsZSAoaW5kZXggPCBfY29uZmlnMlsnZGVmYXVsdCddLm1heEhpc3RvcnlTdGF0ZXMpIHtcbiAgICAgICAgICAvLyB3ZSBhc3N1bWUgdGhlIHRocm90dGxlIGhpc3RvcnkgaGFzIGJlZW4gdGhlIHNhbWUgZm9yIGFsbCBwcmV2aW91c1xuICAgICAgICAgIC8vIGhpc3Rvcnkgc3RhdGVzLlxuICAgICAgICAgIHVwbG9hZFJhdGVUaHJvdHRsZUhpc3RvcnlbaW5kZXhdID0gcGFyc2VJbnQodHJhbnNmZXJEYXRhLnVwbG9hZFRocm90dGxlKTtcbiAgICAgICAgICBkb3dubG9hZFJhdGVUaHJvdHRsZUhpc3RvcnlbaW5kZXhdID0gcGFyc2VJbnQodHJhbnNmZXJEYXRhLmRvd25sb2FkVGhyb3R0bGUpO1xuICAgICAgICAgIGluZGV4Kys7XG4gICAgICAgIH1cbiAgICAgIH1cblxuICAgICAgdGhpcy50aHJvdHRsZXMgPSB7XG4gICAgICAgIGRvd25sb2FkOiBkb3dubG9hZFJhdGVUaHJvdHRsZUhpc3RvcnksXG4gICAgICAgIHVwbG9hZDogdXBsb2FkUmF0ZVRocm90dGxlSGlzdG9yeVxuICAgICAgfTtcblxuICAgICAgdGhpcy5lbWl0KF9jb25zdGFudHNFdmVudFR5cGVzMlsnZGVmYXVsdCddLkNMSUVOVF9UUkFOU0ZFUl9EQVRBX1JFUVVFU1RfU1VDQ0VTUyk7XG4gICAgfVxuICB9LCB7XG4gICAga2V5OiAnaGFuZGxlVHJhbnNmZXJEYXRhRXJyb3InLFxuICAgIHZhbHVlOiBmdW5jdGlvbiBoYW5kbGVUcmFuc2ZlckRhdGFFcnJvcigpIHtcbiAgICAgIHRoaXMuZW1pdChfY29uc3RhbnRzRXZlbnRUeXBlczJbJ2RlZmF1bHQnXS5DTElFTlRfVFJBTlNGRVJfREFUQV9SRVFVRVNUX0VSUk9SKTtcbiAgICB9XG4gIH0sIHtcbiAgICBrZXk6ICdoYW5kbGVUcmFuc2Zlckhpc3RvcnlFcnJvcicsXG4gICAgdmFsdWU6IGZ1bmN0aW9uIGhhbmRsZVRyYW5zZmVySGlzdG9yeUVycm9yKGVycm9yKSB7XG4gICAgICBjb25zb2xlLnRyYWNlKGVycm9yKTtcbiAgICB9XG4gIH0sIHtcbiAgICBrZXk6ICdoYW5kbGVUcmFuc2Zlckhpc3RvcnlTdWNjZXNzJyxcbiAgICB2YWx1ZTogZnVuY3Rpb24gaGFuZGxlVHJhbnNmZXJIaXN0b3J5U3VjY2Vzcyh0cmFuc2ZlckRhdGEpIHtcbiAgICAgIHRoaXMudHJhbnNmZXJSYXRlcyA9IHtcbiAgICAgICAgZG93bmxvYWQ6IHRyYW5zZmVyRGF0YS5kb3dubG9hZCxcbiAgICAgICAgdXBsb2FkOiB0cmFuc2ZlckRhdGEudXBsb2FkXG4gICAgICB9O1xuXG4gICAgICB0aGlzLmVtaXQoX2NvbnN0YW50c0V2ZW50VHlwZXMyWydkZWZhdWx0J10uQ0xJRU5UX1RSQU5TRkVSX0hJU1RPUllfUkVRVUVTVF9TVUNDRVNTKTtcbiAgICB9XG4gIH0sIHtcbiAgICBrZXk6ICdzdGFydFBvbGxpbmdUcmFuc2ZlckRhdGEnLFxuICAgIHZhbHVlOiBmdW5jdGlvbiBzdGFydFBvbGxpbmdUcmFuc2ZlckRhdGEoKSB7XG4gICAgICB0aGlzLnBvbGxUcmFuc2ZlckRhdGFJRCA9IHNldEludGVydmFsKHRoaXMuZmV0Y2hUcmFuc2ZlckRhdGEuYmluZCh0aGlzKSwgX2NvbmZpZzJbJ2RlZmF1bHQnXS5wb2xsSW50ZXJ2YWwpO1xuICAgIH1cbiAgfV0pO1xuXG4gIHJldHVybiBUcmFuc2ZlckRhdGFTdG9yZUNsYXNzO1xufSkoX0Jhc2VTdG9yZTNbJ2RlZmF1bHQnXSk7XG5cbnZhciBUcmFuc2ZlckRhdGFTdG9yZSA9IG5ldyBUcmFuc2ZlckRhdGFTdG9yZUNsYXNzKCk7XG5cbl9kaXNwYXRjaGVyQXBwRGlzcGF0Y2hlcjJbJ2RlZmF1bHQnXS5yZWdpc3RlcihmdW5jdGlvbiAocGF5bG9hZCkge1xuICB2YXIgYWN0aW9uID0gcGF5bG9hZC5hY3Rpb247XG4gIHZhciBzb3VyY2UgPSBwYXlsb2FkLnNvdXJjZTtcblxuICBzd2l0Y2ggKGFjdGlvbi50eXBlKSB7XG4gICAgY2FzZSBfY29uc3RhbnRzQWN0aW9uVHlwZXMyWydkZWZhdWx0J10uQ0xJRU5UX0ZFVENIX1RSQU5TRkVSX0RBVEFfU1VDQ0VTUzpcbiAgICAgIFRyYW5zZmVyRGF0YVN0b3JlLmhhbmRsZVRyYW5zZmVyRGF0YVN1Y2Nlc3MoYWN0aW9uLmRhdGEudHJhbnNmZXJEYXRhKTtcbiAgICAgIGJyZWFrO1xuICAgIGNhc2UgX2NvbnN0YW50c0FjdGlvblR5cGVzMlsnZGVmYXVsdCddLkNMSUVOVF9GRVRDSF9UUkFOU0ZFUl9EQVRBX0VSUk9SOlxuICAgICAgVHJhbnNmZXJEYXRhU3RvcmUuaGFuZGxlVHJhbnNmZXJEYXRhRXJyb3IoYWN0aW9uLmRhdGEuZXJyb3IpO1xuICAgICAgYnJlYWs7XG4gICAgY2FzZSBfY29uc3RhbnRzQWN0aW9uVHlwZXMyWydkZWZhdWx0J10uQ0xJRU5UX1NFVF9USFJPVFRMRV9TVUNDRVNTOlxuICAgICAgVHJhbnNmZXJEYXRhU3RvcmUuaGFuZGxlU2V0VGhyb3R0bGVTdWNjZXNzKGFjdGlvbi5kYXRhLnRyYW5zZmVyRGF0YSk7XG4gICAgICBicmVhaztcbiAgICBjYXNlIF9jb25zdGFudHNBY3Rpb25UeXBlczJbJ2RlZmF1bHQnXS5DTElFTlRfU0VUX1RIUk9UVExFX0VSUk9SOlxuICAgICAgVHJhbnNmZXJEYXRhU3RvcmUuaGFuZGxlU2V0VGhyb3R0bGVFcnJvcihhY3Rpb24uZGF0YS5lcnJvcik7XG4gICAgICBicmVhaztcbiAgICBjYXNlIF9jb25zdGFudHNBY3Rpb25UeXBlczJbJ2RlZmF1bHQnXS5DTElFTlRfRkVUQ0hfVFJBTlNGRVJfSElTVE9SWV9FUlJPUjpcbiAgICAgIFRyYW5zZmVyRGF0YVN0b3JlLmhhbmRsZVRyYW5zZmVySGlzdG9yeUVycm9yKGFjdGlvbi5lcnJvcik7XG4gICAgICBicmVhaztcbiAgICBjYXNlIF9jb25zdGFudHNBY3Rpb25UeXBlczJbJ2RlZmF1bHQnXS5DTElFTlRfRkVUQ0hfVFJBTlNGRVJfSElTVE9SWV9TVUNDRVNTOlxuICAgICAgVHJhbnNmZXJEYXRhU3RvcmUuaGFuZGxlVHJhbnNmZXJIaXN0b3J5U3VjY2VzcyhhY3Rpb24uZGF0YSk7XG4gICAgICBicmVhaztcbiAgfVxufSk7XG5cbmV4cG9ydHNbJ2RlZmF1bHQnXSA9IFRyYW5zZmVyRGF0YVN0b3JlO1xubW9kdWxlLmV4cG9ydHMgPSBleHBvcnRzWydkZWZhdWx0J107XG5cblxuLyoqKioqKioqKioqKioqKioqXG4gKiogV0VCUEFDSyBGT09URVJcbiAqKiAuL2NsaWVudC9zb3VyY2Uvc2NyaXB0cy9zdG9yZXMvVHJhbnNmZXJEYXRhU3RvcmUuanNcbiAqKiBtb2R1bGUgaWQgPSAyNDVcbiAqKiBtb2R1bGUgY2h1bmtzID0gMFxuICoqLyJdLCJzb3VyY2VSb290IjoiIn0="); + eval("'use strict';\n\nObject.defineProperty(exports, '__esModule', {\n value: true\n});\n\nvar _createClass = (function () { function defineProperties(target, props) { for (var i = 0; i < props.length; i++) { var descriptor = props[i]; descriptor.enumerable = descriptor.enumerable || false; descriptor.configurable = true; if ('value' in descriptor) descriptor.writable = true; Object.defineProperty(target, descriptor.key, descriptor); } } return function (Constructor, protoProps, staticProps) { if (protoProps) defineProperties(Constructor.prototype, protoProps); if (staticProps) defineProperties(Constructor, staticProps); return Constructor; }; })();\n\nvar _get = function get(_x2, _x3, _x4) { var _again = true; _function: while (_again) { var object = _x2, property = _x3, receiver = _x4; _again = false; if (object === null) object = Function.prototype; var desc = Object.getOwnPropertyDescriptor(object, property); if (desc === undefined) { var parent = Object.getPrototypeOf(object); if (parent === null) { return undefined; } else { _x2 = parent; _x3 = property; _x4 = receiver; _again = true; desc = parent = undefined; continue _function; } } else if ('value' in desc) { return desc.value; } else { var getter = desc.get; if (getter === undefined) { return undefined; } return getter.call(receiver); } } };\n\nfunction _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { 'default': obj }; }\n\nfunction _classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError('Cannot call a class as a function'); } }\n\nfunction _inherits(subClass, superClass) { if (typeof superClass !== 'function' && superClass !== null) { throw new TypeError('Super expression must either be null or a function, not ' + typeof superClass); } subClass.prototype = Object.create(superClass && superClass.prototype, { constructor: { value: subClass, enumerable: false, writable: true, configurable: true } }); if (superClass) Object.setPrototypeOf ? Object.setPrototypeOf(subClass, superClass) : subClass.__proto__ = superClass; }\n\nvar _constantsActionTypes = __webpack_require__(178);\n\nvar _constantsActionTypes2 = _interopRequireDefault(_constantsActionTypes);\n\nvar _dispatcherAppDispatcher = __webpack_require__(179);\n\nvar _dispatcherAppDispatcher2 = _interopRequireDefault(_dispatcherAppDispatcher);\n\nvar _BaseStore2 = __webpack_require__(183);\n\nvar _BaseStore3 = _interopRequireDefault(_BaseStore2);\n\nvar _actionsClientActions = __webpack_require__(246);\n\nvar _actionsClientActions2 = _interopRequireDefault(_actionsClientActions);\n\nvar _config = __webpack_require__(232);\n\nvar _config2 = _interopRequireDefault(_config);\n\nvar _constantsEventTypes = __webpack_require__(176);\n\nvar _constantsEventTypes2 = _interopRequireDefault(_constantsEventTypes);\n\nvar TransferDataStoreClass = (function (_BaseStore) {\n _inherits(TransferDataStoreClass, _BaseStore);\n\n function TransferDataStoreClass() {\n _classCallCheck(this, TransferDataStoreClass);\n\n _get(Object.getPrototypeOf(TransferDataStoreClass.prototype), 'constructor', this).call(this);\n\n this.pollTransferDataID = null;\n this.transferRates = { download: [], upload: [] };\n this.transferTotals = { download: null, upload: null };\n this.throttles = { download: null, upload: null };\n }\n\n _createClass(TransferDataStoreClass, [{\n key: 'fetchTransferData',\n value: function fetchTransferData() {\n _actionsClientActions2['default'].fetchTransferHistory({\n snapshot: 'fiveMin'\n });\n\n _actionsClientActions2['default'].fetchTransferData();\n\n if (this.pollTransferDataID === null) {\n this.startPollingTransferData();\n }\n }\n }, {\n key: 'getThrottles',\n value: function getThrottles() {\n var options = arguments.length <= 0 || arguments[0] === undefined ? {} : arguments[0];\n\n if (options.latest) {\n return {\n download: this.throttles.download ? this.throttles.download[this.throttles.download.length - 1] : null,\n upload: this.throttles.upload ? this.throttles.upload[this.throttles.upload.length - 1] : null\n };\n }\n return this.throttles;\n }\n }, {\n key: 'getTransferTotals',\n value: function getTransferTotals() {\n return this.transferTotals;\n }\n }, {\n key: 'getTransferRate',\n value: function getTransferRate() {\n return this.transferRate;\n }\n }, {\n key: 'getTransferRates',\n value: function getTransferRates() {\n return this.transferRates;\n }\n }, {\n key: 'handleSetThrottleSuccess',\n value: function handleSetThrottleSuccess(data) {\n this.fetchTransferData();\n this.emit(_constantsEventTypes2['default'].CLIENT_SET_THROTTLE_SUCCESS);\n }\n }, {\n key: 'handleSetThrottleError',\n value: function handleSetThrottleError(error) {\n this.emit(_constantsEventTypes2['default'].CLIENT_SET_THROTTLE_ERROR);\n }\n }, {\n key: 'handleTransferDataSuccess',\n value: function handleTransferDataSuccess(transferData) {\n this.transferTotals = {\n download: transferData.downloadTotal,\n upload: transferData.uploadTotal\n };\n\n this.transferRate = {\n download: transferData.downloadRate,\n upload: transferData.uploadRate\n };\n\n // add the latest download & upload throttles to the end of the array and\n // remove the first element in the array. if the arrays are empty, fill in\n // zeros the last known throttle value.\n var index = 0;\n var downloadRateThrottleHistory = Object.assign([], this.throttles.download);\n var uploadRateThrottleHistory = Object.assign([], this.throttles.upload);\n\n if (downloadRateThrottleHistory.length === _config2['default'].maxHistoryStates) {\n\n downloadRateThrottleHistory.shift();\n uploadRateThrottleHistory.shift();\n\n downloadRateThrottleHistory.push(parseInt(transferData.downloadThrottle));\n uploadRateThrottleHistory.push(parseInt(transferData.uploadThrottle));\n } else {\n while (index < _config2['default'].maxHistoryStates) {\n // we assume the throttle history has been the same for all previous\n // history states.\n uploadRateThrottleHistory[index] = parseInt(transferData.uploadThrottle);\n downloadRateThrottleHistory[index] = parseInt(transferData.downloadThrottle);\n index++;\n }\n }\n\n this.throttles = {\n download: downloadRateThrottleHistory,\n upload: uploadRateThrottleHistory\n };\n\n this.emit(_constantsEventTypes2['default'].CLIENT_TRANSFER_DATA_REQUEST_SUCCESS);\n }\n }, {\n key: 'handleTransferDataError',\n value: function handleTransferDataError() {\n this.emit(_constantsEventTypes2['default'].CLIENT_TRANSFER_DATA_REQUEST_ERROR);\n }\n }, {\n key: 'handleTransferHistoryError',\n value: function handleTransferHistoryError(error) {\n this.emit(_constantsEventTypes2['default'].CLIENT_TRANSFER_HISTORY_REQUEST_ERROR);\n }\n }, {\n key: 'handleTransferHistorySuccess',\n value: function handleTransferHistorySuccess(transferData) {\n this.transferRates = {\n download: transferData.download,\n upload: transferData.upload\n };\n\n this.emit(_constantsEventTypes2['default'].CLIENT_TRANSFER_HISTORY_REQUEST_SUCCESS);\n }\n }, {\n key: 'startPollingTransferData',\n value: function startPollingTransferData() {\n this.pollTransferDataID = setInterval(this.fetchTransferData.bind(this), _config2['default'].pollInterval);\n }\n }]);\n\n return TransferDataStoreClass;\n})(_BaseStore3['default']);\n\nvar TransferDataStore = new TransferDataStoreClass();\n\n_dispatcherAppDispatcher2['default'].register(function (payload) {\n var action = payload.action;\n var source = payload.source;\n\n switch (action.type) {\n case _constantsActionTypes2['default'].CLIENT_FETCH_TRANSFER_DATA_SUCCESS:\n TransferDataStore.handleTransferDataSuccess(action.data.transferData);\n break;\n case _constantsActionTypes2['default'].CLIENT_FETCH_TRANSFER_DATA_ERROR:\n TransferDataStore.handleTransferDataError(action.data.error);\n break;\n case _constantsActionTypes2['default'].CLIENT_SET_THROTTLE_SUCCESS:\n TransferDataStore.handleSetThrottleSuccess(action.data.transferData);\n break;\n case _constantsActionTypes2['default'].CLIENT_SET_THROTTLE_ERROR:\n TransferDataStore.handleSetThrottleError(action.data.error);\n break;\n case _constantsActionTypes2['default'].CLIENT_FETCH_TRANSFER_HISTORY_ERROR:\n TransferDataStore.handleTransferHistoryError(action.error);\n break;\n case _constantsActionTypes2['default'].CLIENT_FETCH_TRANSFER_HISTORY_SUCCESS:\n TransferDataStore.handleTransferHistorySuccess(action.data);\n break;\n }\n});\n\nexports['default'] = TransferDataStore;\nmodule.exports = exports['default'];//@ sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIndlYnBhY2s6Ly8vLi9jbGllbnQvc291cmNlL3NjcmlwdHMvc3RvcmVzL1RyYW5zZmVyRGF0YVN0b3JlLmpzPzExZDEiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUE7O0FBRUE7QUFDQTtBQUNBLENBQUM7O0FBRUQsaUNBQWlDLDJDQUEyQyxnQkFBZ0Isa0JBQWtCLE9BQU8sMkJBQTJCLHdEQUF3RCxnQ0FBZ0MsdURBQXVELDJEQUEyRCxFQUFFLEVBQUUseURBQXlELHFFQUFxRSw2REFBNkQsb0JBQW9CLEdBQUcsRUFBRTs7QUFFbGpCLHdDQUF3QyxtQkFBbUIsNEJBQTRCLGtEQUFrRCxnQkFBZ0Isa0RBQWtELDhEQUE4RCwwQkFBMEIsNENBQTRDLHVCQUF1QixrQkFBa0IsRUFBRSxPQUFPLGNBQWMsZ0JBQWdCLGdCQUFnQixlQUFlLDJCQUEyQixvQkFBb0IsRUFBRSxFQUFFLDRCQUE0QixtQkFBbUIsRUFBRSxPQUFPLHVCQUF1Qiw0QkFBNEIsa0JBQWtCLEVBQUUsOEJBQThCLEVBQUUsRUFBRTs7QUFFbHBCLHNDQUFzQyx1Q0FBdUMsa0JBQWtCOztBQUUvRixpREFBaUQsMENBQTBDLDBEQUEwRCxFQUFFOztBQUV2SiwwQ0FBMEMsK0RBQStELHFHQUFxRyxFQUFFLHlFQUF5RSxlQUFlLHlFQUF5RSxFQUFFLEVBQUUsdUhBQXVIOztBQUU1ZTs7QUFFQTs7QUFFQTs7QUFFQTs7QUFFQTs7QUFFQTs7QUFFQTs7QUFFQTs7QUFFQTs7QUFFQTs7QUFFQTs7QUFFQTs7QUFFQTtBQUNBOztBQUVBO0FBQ0E7O0FBRUE7O0FBRUE7QUFDQSwwQkFBMEI7QUFDMUIsMkJBQTJCO0FBQzNCLHNCQUFzQjtBQUN0Qjs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsT0FBTzs7QUFFUDs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLEdBQUc7QUFDSDtBQUNBO0FBQ0EsNEVBQTRFOztBQUU1RTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsR0FBRztBQUNIO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsR0FBRztBQUNIO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsR0FBRztBQUNIO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsR0FBRztBQUNIO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxHQUFHO0FBQ0g7QUFDQTtBQUNBO0FBQ0E7QUFDQSxHQUFHO0FBQ0g7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTs7QUFFQTtBQUNBOztBQUVBO0FBQ0E7QUFDQSxPQUFPO0FBQ1A7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0EsR0FBRztBQUNIO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsR0FBRztBQUNIO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsR0FBRztBQUNIO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0EsR0FBRztBQUNIO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsR0FBRzs7QUFFSDtBQUNBLENBQUM7O0FBRUQ7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxDQUFDOztBQUVEO0FBQ0EiLCJmaWxlIjoiMjQ1LmpzIiwic291cmNlc0NvbnRlbnQiOlsiJ3VzZSBzdHJpY3QnO1xuXG5PYmplY3QuZGVmaW5lUHJvcGVydHkoZXhwb3J0cywgJ19fZXNNb2R1bGUnLCB7XG4gIHZhbHVlOiB0cnVlXG59KTtcblxudmFyIF9jcmVhdGVDbGFzcyA9IChmdW5jdGlvbiAoKSB7IGZ1bmN0aW9uIGRlZmluZVByb3BlcnRpZXModGFyZ2V0LCBwcm9wcykgeyBmb3IgKHZhciBpID0gMDsgaSA8IHByb3BzLmxlbmd0aDsgaSsrKSB7IHZhciBkZXNjcmlwdG9yID0gcHJvcHNbaV07IGRlc2NyaXB0b3IuZW51bWVyYWJsZSA9IGRlc2NyaXB0b3IuZW51bWVyYWJsZSB8fCBmYWxzZTsgZGVzY3JpcHRvci5jb25maWd1cmFibGUgPSB0cnVlOyBpZiAoJ3ZhbHVlJyBpbiBkZXNjcmlwdG9yKSBkZXNjcmlwdG9yLndyaXRhYmxlID0gdHJ1ZTsgT2JqZWN0LmRlZmluZVByb3BlcnR5KHRhcmdldCwgZGVzY3JpcHRvci5rZXksIGRlc2NyaXB0b3IpOyB9IH0gcmV0dXJuIGZ1bmN0aW9uIChDb25zdHJ1Y3RvciwgcHJvdG9Qcm9wcywgc3RhdGljUHJvcHMpIHsgaWYgKHByb3RvUHJvcHMpIGRlZmluZVByb3BlcnRpZXMoQ29uc3RydWN0b3IucHJvdG90eXBlLCBwcm90b1Byb3BzKTsgaWYgKHN0YXRpY1Byb3BzKSBkZWZpbmVQcm9wZXJ0aWVzKENvbnN0cnVjdG9yLCBzdGF0aWNQcm9wcyk7IHJldHVybiBDb25zdHJ1Y3RvcjsgfTsgfSkoKTtcblxudmFyIF9nZXQgPSBmdW5jdGlvbiBnZXQoX3gyLCBfeDMsIF94NCkgeyB2YXIgX2FnYWluID0gdHJ1ZTsgX2Z1bmN0aW9uOiB3aGlsZSAoX2FnYWluKSB7IHZhciBvYmplY3QgPSBfeDIsIHByb3BlcnR5ID0gX3gzLCByZWNlaXZlciA9IF94NDsgX2FnYWluID0gZmFsc2U7IGlmIChvYmplY3QgPT09IG51bGwpIG9iamVjdCA9IEZ1bmN0aW9uLnByb3RvdHlwZTsgdmFyIGRlc2MgPSBPYmplY3QuZ2V0T3duUHJvcGVydHlEZXNjcmlwdG9yKG9iamVjdCwgcHJvcGVydHkpOyBpZiAoZGVzYyA9PT0gdW5kZWZpbmVkKSB7IHZhciBwYXJlbnQgPSBPYmplY3QuZ2V0UHJvdG90eXBlT2Yob2JqZWN0KTsgaWYgKHBhcmVudCA9PT0gbnVsbCkgeyByZXR1cm4gdW5kZWZpbmVkOyB9IGVsc2UgeyBfeDIgPSBwYXJlbnQ7IF94MyA9IHByb3BlcnR5OyBfeDQgPSByZWNlaXZlcjsgX2FnYWluID0gdHJ1ZTsgZGVzYyA9IHBhcmVudCA9IHVuZGVmaW5lZDsgY29udGludWUgX2Z1bmN0aW9uOyB9IH0gZWxzZSBpZiAoJ3ZhbHVlJyBpbiBkZXNjKSB7IHJldHVybiBkZXNjLnZhbHVlOyB9IGVsc2UgeyB2YXIgZ2V0dGVyID0gZGVzYy5nZXQ7IGlmIChnZXR0ZXIgPT09IHVuZGVmaW5lZCkgeyByZXR1cm4gdW5kZWZpbmVkOyB9IHJldHVybiBnZXR0ZXIuY2FsbChyZWNlaXZlcik7IH0gfSB9O1xuXG5mdW5jdGlvbiBfaW50ZXJvcFJlcXVpcmVEZWZhdWx0KG9iaikgeyByZXR1cm4gb2JqICYmIG9iai5fX2VzTW9kdWxlID8gb2JqIDogeyAnZGVmYXVsdCc6IG9iaiB9OyB9XG5cbmZ1bmN0aW9uIF9jbGFzc0NhbGxDaGVjayhpbnN0YW5jZSwgQ29uc3RydWN0b3IpIHsgaWYgKCEoaW5zdGFuY2UgaW5zdGFuY2VvZiBDb25zdHJ1Y3RvcikpIHsgdGhyb3cgbmV3IFR5cGVFcnJvcignQ2Fubm90IGNhbGwgYSBjbGFzcyBhcyBhIGZ1bmN0aW9uJyk7IH0gfVxuXG5mdW5jdGlvbiBfaW5oZXJpdHMoc3ViQ2xhc3MsIHN1cGVyQ2xhc3MpIHsgaWYgKHR5cGVvZiBzdXBlckNsYXNzICE9PSAnZnVuY3Rpb24nICYmIHN1cGVyQ2xhc3MgIT09IG51bGwpIHsgdGhyb3cgbmV3IFR5cGVFcnJvcignU3VwZXIgZXhwcmVzc2lvbiBtdXN0IGVpdGhlciBiZSBudWxsIG9yIGEgZnVuY3Rpb24sIG5vdCAnICsgdHlwZW9mIHN1cGVyQ2xhc3MpOyB9IHN1YkNsYXNzLnByb3RvdHlwZSA9IE9iamVjdC5jcmVhdGUoc3VwZXJDbGFzcyAmJiBzdXBlckNsYXNzLnByb3RvdHlwZSwgeyBjb25zdHJ1Y3RvcjogeyB2YWx1ZTogc3ViQ2xhc3MsIGVudW1lcmFibGU6IGZhbHNlLCB3cml0YWJsZTogdHJ1ZSwgY29uZmlndXJhYmxlOiB0cnVlIH0gfSk7IGlmIChzdXBlckNsYXNzKSBPYmplY3Quc2V0UHJvdG90eXBlT2YgPyBPYmplY3Quc2V0UHJvdG90eXBlT2Yoc3ViQ2xhc3MsIHN1cGVyQ2xhc3MpIDogc3ViQ2xhc3MuX19wcm90b19fID0gc3VwZXJDbGFzczsgfVxuXG52YXIgX2NvbnN0YW50c0FjdGlvblR5cGVzID0gcmVxdWlyZSgnLi4vY29uc3RhbnRzL0FjdGlvblR5cGVzJyk7XG5cbnZhciBfY29uc3RhbnRzQWN0aW9uVHlwZXMyID0gX2ludGVyb3BSZXF1aXJlRGVmYXVsdChfY29uc3RhbnRzQWN0aW9uVHlwZXMpO1xuXG52YXIgX2Rpc3BhdGNoZXJBcHBEaXNwYXRjaGVyID0gcmVxdWlyZSgnLi4vZGlzcGF0Y2hlci9BcHBEaXNwYXRjaGVyJyk7XG5cbnZhciBfZGlzcGF0Y2hlckFwcERpc3BhdGNoZXIyID0gX2ludGVyb3BSZXF1aXJlRGVmYXVsdChfZGlzcGF0Y2hlckFwcERpc3BhdGNoZXIpO1xuXG52YXIgX0Jhc2VTdG9yZTIgPSByZXF1aXJlKCcuL0Jhc2VTdG9yZScpO1xuXG52YXIgX0Jhc2VTdG9yZTMgPSBfaW50ZXJvcFJlcXVpcmVEZWZhdWx0KF9CYXNlU3RvcmUyKTtcblxudmFyIF9hY3Rpb25zQ2xpZW50QWN0aW9ucyA9IHJlcXVpcmUoJy4uL2FjdGlvbnMvQ2xpZW50QWN0aW9ucycpO1xuXG52YXIgX2FjdGlvbnNDbGllbnRBY3Rpb25zMiA9IF9pbnRlcm9wUmVxdWlyZURlZmF1bHQoX2FjdGlvbnNDbGllbnRBY3Rpb25zKTtcblxudmFyIF9jb25maWcgPSByZXF1aXJlKCcuLi8uLi8uLi8uLi9jb25maWcnKTtcblxudmFyIF9jb25maWcyID0gX2ludGVyb3BSZXF1aXJlRGVmYXVsdChfY29uZmlnKTtcblxudmFyIF9jb25zdGFudHNFdmVudFR5cGVzID0gcmVxdWlyZSgnLi4vY29uc3RhbnRzL0V2ZW50VHlwZXMnKTtcblxudmFyIF9jb25zdGFudHNFdmVudFR5cGVzMiA9IF9pbnRlcm9wUmVxdWlyZURlZmF1bHQoX2NvbnN0YW50c0V2ZW50VHlwZXMpO1xuXG52YXIgVHJhbnNmZXJEYXRhU3RvcmVDbGFzcyA9IChmdW5jdGlvbiAoX0Jhc2VTdG9yZSkge1xuICBfaW5oZXJpdHMoVHJhbnNmZXJEYXRhU3RvcmVDbGFzcywgX0Jhc2VTdG9yZSk7XG5cbiAgZnVuY3Rpb24gVHJhbnNmZXJEYXRhU3RvcmVDbGFzcygpIHtcbiAgICBfY2xhc3NDYWxsQ2hlY2sodGhpcywgVHJhbnNmZXJEYXRhU3RvcmVDbGFzcyk7XG5cbiAgICBfZ2V0KE9iamVjdC5nZXRQcm90b3R5cGVPZihUcmFuc2ZlckRhdGFTdG9yZUNsYXNzLnByb3RvdHlwZSksICdjb25zdHJ1Y3RvcicsIHRoaXMpLmNhbGwodGhpcyk7XG5cbiAgICB0aGlzLnBvbGxUcmFuc2ZlckRhdGFJRCA9IG51bGw7XG4gICAgdGhpcy50cmFuc2ZlclJhdGVzID0geyBkb3dubG9hZDogW10sIHVwbG9hZDogW10gfTtcbiAgICB0aGlzLnRyYW5zZmVyVG90YWxzID0geyBkb3dubG9hZDogbnVsbCwgdXBsb2FkOiBudWxsIH07XG4gICAgdGhpcy50aHJvdHRsZXMgPSB7IGRvd25sb2FkOiBudWxsLCB1cGxvYWQ6IG51bGwgfTtcbiAgfVxuXG4gIF9jcmVhdGVDbGFzcyhUcmFuc2ZlckRhdGFTdG9yZUNsYXNzLCBbe1xuICAgIGtleTogJ2ZldGNoVHJhbnNmZXJEYXRhJyxcbiAgICB2YWx1ZTogZnVuY3Rpb24gZmV0Y2hUcmFuc2ZlckRhdGEoKSB7XG4gICAgICBfYWN0aW9uc0NsaWVudEFjdGlvbnMyWydkZWZhdWx0J10uZmV0Y2hUcmFuc2Zlckhpc3Rvcnkoe1xuICAgICAgICBzbmFwc2hvdDogJ2ZpdmVNaW4nXG4gICAgICB9KTtcblxuICAgICAgX2FjdGlvbnNDbGllbnRBY3Rpb25zMlsnZGVmYXVsdCddLmZldGNoVHJhbnNmZXJEYXRhKCk7XG5cbiAgICAgIGlmICh0aGlzLnBvbGxUcmFuc2ZlckRhdGFJRCA9PT0gbnVsbCkge1xuICAgICAgICB0aGlzLnN0YXJ0UG9sbGluZ1RyYW5zZmVyRGF0YSgpO1xuICAgICAgfVxuICAgIH1cbiAgfSwge1xuICAgIGtleTogJ2dldFRocm90dGxlcycsXG4gICAgdmFsdWU6IGZ1bmN0aW9uIGdldFRocm90dGxlcygpIHtcbiAgICAgIHZhciBvcHRpb25zID0gYXJndW1lbnRzLmxlbmd0aCA8PSAwIHx8IGFyZ3VtZW50c1swXSA9PT0gdW5kZWZpbmVkID8ge30gOiBhcmd1bWVudHNbMF07XG5cbiAgICAgIGlmIChvcHRpb25zLmxhdGVzdCkge1xuICAgICAgICByZXR1cm4ge1xuICAgICAgICAgIGRvd25sb2FkOiB0aGlzLnRocm90dGxlcy5kb3dubG9hZCA/IHRoaXMudGhyb3R0bGVzLmRvd25sb2FkW3RoaXMudGhyb3R0bGVzLmRvd25sb2FkLmxlbmd0aCAtIDFdIDogbnVsbCxcbiAgICAgICAgICB1cGxvYWQ6IHRoaXMudGhyb3R0bGVzLnVwbG9hZCA/IHRoaXMudGhyb3R0bGVzLnVwbG9hZFt0aGlzLnRocm90dGxlcy51cGxvYWQubGVuZ3RoIC0gMV0gOiBudWxsXG4gICAgICAgIH07XG4gICAgICB9XG4gICAgICByZXR1cm4gdGhpcy50aHJvdHRsZXM7XG4gICAgfVxuICB9LCB7XG4gICAga2V5OiAnZ2V0VHJhbnNmZXJUb3RhbHMnLFxuICAgIHZhbHVlOiBmdW5jdGlvbiBnZXRUcmFuc2ZlclRvdGFscygpIHtcbiAgICAgIHJldHVybiB0aGlzLnRyYW5zZmVyVG90YWxzO1xuICAgIH1cbiAgfSwge1xuICAgIGtleTogJ2dldFRyYW5zZmVyUmF0ZScsXG4gICAgdmFsdWU6IGZ1bmN0aW9uIGdldFRyYW5zZmVyUmF0ZSgpIHtcbiAgICAgIHJldHVybiB0aGlzLnRyYW5zZmVyUmF0ZTtcbiAgICB9XG4gIH0sIHtcbiAgICBrZXk6ICdnZXRUcmFuc2ZlclJhdGVzJyxcbiAgICB2YWx1ZTogZnVuY3Rpb24gZ2V0VHJhbnNmZXJSYXRlcygpIHtcbiAgICAgIHJldHVybiB0aGlzLnRyYW5zZmVyUmF0ZXM7XG4gICAgfVxuICB9LCB7XG4gICAga2V5OiAnaGFuZGxlU2V0VGhyb3R0bGVTdWNjZXNzJyxcbiAgICB2YWx1ZTogZnVuY3Rpb24gaGFuZGxlU2V0VGhyb3R0bGVTdWNjZXNzKGRhdGEpIHtcbiAgICAgIHRoaXMuZmV0Y2hUcmFuc2ZlckRhdGEoKTtcbiAgICAgIHRoaXMuZW1pdChfY29uc3RhbnRzRXZlbnRUeXBlczJbJ2RlZmF1bHQnXS5DTElFTlRfU0VUX1RIUk9UVExFX1NVQ0NFU1MpO1xuICAgIH1cbiAgfSwge1xuICAgIGtleTogJ2hhbmRsZVNldFRocm90dGxlRXJyb3InLFxuICAgIHZhbHVlOiBmdW5jdGlvbiBoYW5kbGVTZXRUaHJvdHRsZUVycm9yKGVycm9yKSB7XG4gICAgICB0aGlzLmVtaXQoX2NvbnN0YW50c0V2ZW50VHlwZXMyWydkZWZhdWx0J10uQ0xJRU5UX1NFVF9USFJPVFRMRV9FUlJPUik7XG4gICAgfVxuICB9LCB7XG4gICAga2V5OiAnaGFuZGxlVHJhbnNmZXJEYXRhU3VjY2VzcycsXG4gICAgdmFsdWU6IGZ1bmN0aW9uIGhhbmRsZVRyYW5zZmVyRGF0YVN1Y2Nlc3ModHJhbnNmZXJEYXRhKSB7XG4gICAgICB0aGlzLnRyYW5zZmVyVG90YWxzID0ge1xuICAgICAgICBkb3dubG9hZDogdHJhbnNmZXJEYXRhLmRvd25sb2FkVG90YWwsXG4gICAgICAgIHVwbG9hZDogdHJhbnNmZXJEYXRhLnVwbG9hZFRvdGFsXG4gICAgICB9O1xuXG4gICAgICB0aGlzLnRyYW5zZmVyUmF0ZSA9IHtcbiAgICAgICAgZG93bmxvYWQ6IHRyYW5zZmVyRGF0YS5kb3dubG9hZFJhdGUsXG4gICAgICAgIHVwbG9hZDogdHJhbnNmZXJEYXRhLnVwbG9hZFJhdGVcbiAgICAgIH07XG5cbiAgICAgIC8vIGFkZCB0aGUgbGF0ZXN0IGRvd25sb2FkICYgdXBsb2FkIHRocm90dGxlcyB0byB0aGUgZW5kIG9mIHRoZSBhcnJheSBhbmRcbiAgICAgIC8vIHJlbW92ZSB0aGUgZmlyc3QgZWxlbWVudCBpbiB0aGUgYXJyYXkuIGlmIHRoZSBhcnJheXMgYXJlIGVtcHR5LCBmaWxsIGluXG4gICAgICAvLyB6ZXJvcyB0aGUgbGFzdCBrbm93biB0aHJvdHRsZSB2YWx1ZS5cbiAgICAgIHZhciBpbmRleCA9IDA7XG4gICAgICB2YXIgZG93bmxvYWRSYXRlVGhyb3R0bGVIaXN0b3J5ID0gT2JqZWN0LmFzc2lnbihbXSwgdGhpcy50aHJvdHRsZXMuZG93bmxvYWQpO1xuICAgICAgdmFyIHVwbG9hZFJhdGVUaHJvdHRsZUhpc3RvcnkgPSBPYmplY3QuYXNzaWduKFtdLCB0aGlzLnRocm90dGxlcy51cGxvYWQpO1xuXG4gICAgICBpZiAoZG93bmxvYWRSYXRlVGhyb3R0bGVIaXN0b3J5Lmxlbmd0aCA9PT0gX2NvbmZpZzJbJ2RlZmF1bHQnXS5tYXhIaXN0b3J5U3RhdGVzKSB7XG5cbiAgICAgICAgZG93bmxvYWRSYXRlVGhyb3R0bGVIaXN0b3J5LnNoaWZ0KCk7XG4gICAgICAgIHVwbG9hZFJhdGVUaHJvdHRsZUhpc3Rvcnkuc2hpZnQoKTtcblxuICAgICAgICBkb3dubG9hZFJhdGVUaHJvdHRsZUhpc3RvcnkucHVzaChwYXJzZUludCh0cmFuc2ZlckRhdGEuZG93bmxvYWRUaHJvdHRsZSkpO1xuICAgICAgICB1cGxvYWRSYXRlVGhyb3R0bGVIaXN0b3J5LnB1c2gocGFyc2VJbnQodHJhbnNmZXJEYXRhLnVwbG9hZFRocm90dGxlKSk7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICB3aGlsZSAoaW5kZXggPCBfY29uZmlnMlsnZGVmYXVsdCddLm1heEhpc3RvcnlTdGF0ZXMpIHtcbiAgICAgICAgICAvLyB3ZSBhc3N1bWUgdGhlIHRocm90dGxlIGhpc3RvcnkgaGFzIGJlZW4gdGhlIHNhbWUgZm9yIGFsbCBwcmV2aW91c1xuICAgICAgICAgIC8vIGhpc3Rvcnkgc3RhdGVzLlxuICAgICAgICAgIHVwbG9hZFJhdGVUaHJvdHRsZUhpc3RvcnlbaW5kZXhdID0gcGFyc2VJbnQodHJhbnNmZXJEYXRhLnVwbG9hZFRocm90dGxlKTtcbiAgICAgICAgICBkb3dubG9hZFJhdGVUaHJvdHRsZUhpc3RvcnlbaW5kZXhdID0gcGFyc2VJbnQodHJhbnNmZXJEYXRhLmRvd25sb2FkVGhyb3R0bGUpO1xuICAgICAgICAgIGluZGV4Kys7XG4gICAgICAgIH1cbiAgICAgIH1cblxuICAgICAgdGhpcy50aHJvdHRsZXMgPSB7XG4gICAgICAgIGRvd25sb2FkOiBkb3dubG9hZFJhdGVUaHJvdHRsZUhpc3RvcnksXG4gICAgICAgIHVwbG9hZDogdXBsb2FkUmF0ZVRocm90dGxlSGlzdG9yeVxuICAgICAgfTtcblxuICAgICAgdGhpcy5lbWl0KF9jb25zdGFudHNFdmVudFR5cGVzMlsnZGVmYXVsdCddLkNMSUVOVF9UUkFOU0ZFUl9EQVRBX1JFUVVFU1RfU1VDQ0VTUyk7XG4gICAgfVxuICB9LCB7XG4gICAga2V5OiAnaGFuZGxlVHJhbnNmZXJEYXRhRXJyb3InLFxuICAgIHZhbHVlOiBmdW5jdGlvbiBoYW5kbGVUcmFuc2ZlckRhdGFFcnJvcigpIHtcbiAgICAgIHRoaXMuZW1pdChfY29uc3RhbnRzRXZlbnRUeXBlczJbJ2RlZmF1bHQnXS5DTElFTlRfVFJBTlNGRVJfREFUQV9SRVFVRVNUX0VSUk9SKTtcbiAgICB9XG4gIH0sIHtcbiAgICBrZXk6ICdoYW5kbGVUcmFuc2Zlckhpc3RvcnlFcnJvcicsXG4gICAgdmFsdWU6IGZ1bmN0aW9uIGhhbmRsZVRyYW5zZmVySGlzdG9yeUVycm9yKGVycm9yKSB7XG4gICAgICB0aGlzLmVtaXQoX2NvbnN0YW50c0V2ZW50VHlwZXMyWydkZWZhdWx0J10uQ0xJRU5UX1RSQU5TRkVSX0hJU1RPUllfUkVRVUVTVF9FUlJPUik7XG4gICAgfVxuICB9LCB7XG4gICAga2V5OiAnaGFuZGxlVHJhbnNmZXJIaXN0b3J5U3VjY2VzcycsXG4gICAgdmFsdWU6IGZ1bmN0aW9uIGhhbmRsZVRyYW5zZmVySGlzdG9yeVN1Y2Nlc3ModHJhbnNmZXJEYXRhKSB7XG4gICAgICB0aGlzLnRyYW5zZmVyUmF0ZXMgPSB7XG4gICAgICAgIGRvd25sb2FkOiB0cmFuc2ZlckRhdGEuZG93bmxvYWQsXG4gICAgICAgIHVwbG9hZDogdHJhbnNmZXJEYXRhLnVwbG9hZFxuICAgICAgfTtcblxuICAgICAgdGhpcy5lbWl0KF9jb25zdGFudHNFdmVudFR5cGVzMlsnZGVmYXVsdCddLkNMSUVOVF9UUkFOU0ZFUl9ISVNUT1JZX1JFUVVFU1RfU1VDQ0VTUyk7XG4gICAgfVxuICB9LCB7XG4gICAga2V5OiAnc3RhcnRQb2xsaW5nVHJhbnNmZXJEYXRhJyxcbiAgICB2YWx1ZTogZnVuY3Rpb24gc3RhcnRQb2xsaW5nVHJhbnNmZXJEYXRhKCkge1xuICAgICAgdGhpcy5wb2xsVHJhbnNmZXJEYXRhSUQgPSBzZXRJbnRlcnZhbCh0aGlzLmZldGNoVHJhbnNmZXJEYXRhLmJpbmQodGhpcyksIF9jb25maWcyWydkZWZhdWx0J10ucG9sbEludGVydmFsKTtcbiAgICB9XG4gIH1dKTtcblxuICByZXR1cm4gVHJhbnNmZXJEYXRhU3RvcmVDbGFzcztcbn0pKF9CYXNlU3RvcmUzWydkZWZhdWx0J10pO1xuXG52YXIgVHJhbnNmZXJEYXRhU3RvcmUgPSBuZXcgVHJhbnNmZXJEYXRhU3RvcmVDbGFzcygpO1xuXG5fZGlzcGF0Y2hlckFwcERpc3BhdGNoZXIyWydkZWZhdWx0J10ucmVnaXN0ZXIoZnVuY3Rpb24gKHBheWxvYWQpIHtcbiAgdmFyIGFjdGlvbiA9IHBheWxvYWQuYWN0aW9uO1xuICB2YXIgc291cmNlID0gcGF5bG9hZC5zb3VyY2U7XG5cbiAgc3dpdGNoIChhY3Rpb24udHlwZSkge1xuICAgIGNhc2UgX2NvbnN0YW50c0FjdGlvblR5cGVzMlsnZGVmYXVsdCddLkNMSUVOVF9GRVRDSF9UUkFOU0ZFUl9EQVRBX1NVQ0NFU1M6XG4gICAgICBUcmFuc2ZlckRhdGFTdG9yZS5oYW5kbGVUcmFuc2ZlckRhdGFTdWNjZXNzKGFjdGlvbi5kYXRhLnRyYW5zZmVyRGF0YSk7XG4gICAgICBicmVhaztcbiAgICBjYXNlIF9jb25zdGFudHNBY3Rpb25UeXBlczJbJ2RlZmF1bHQnXS5DTElFTlRfRkVUQ0hfVFJBTlNGRVJfREFUQV9FUlJPUjpcbiAgICAgIFRyYW5zZmVyRGF0YVN0b3JlLmhhbmRsZVRyYW5zZmVyRGF0YUVycm9yKGFjdGlvbi5kYXRhLmVycm9yKTtcbiAgICAgIGJyZWFrO1xuICAgIGNhc2UgX2NvbnN0YW50c0FjdGlvblR5cGVzMlsnZGVmYXVsdCddLkNMSUVOVF9TRVRfVEhST1RUTEVfU1VDQ0VTUzpcbiAgICAgIFRyYW5zZmVyRGF0YVN0b3JlLmhhbmRsZVNldFRocm90dGxlU3VjY2VzcyhhY3Rpb24uZGF0YS50cmFuc2ZlckRhdGEpO1xuICAgICAgYnJlYWs7XG4gICAgY2FzZSBfY29uc3RhbnRzQWN0aW9uVHlwZXMyWydkZWZhdWx0J10uQ0xJRU5UX1NFVF9USFJPVFRMRV9FUlJPUjpcbiAgICAgIFRyYW5zZmVyRGF0YVN0b3JlLmhhbmRsZVNldFRocm90dGxlRXJyb3IoYWN0aW9uLmRhdGEuZXJyb3IpO1xuICAgICAgYnJlYWs7XG4gICAgY2FzZSBfY29uc3RhbnRzQWN0aW9uVHlwZXMyWydkZWZhdWx0J10uQ0xJRU5UX0ZFVENIX1RSQU5TRkVSX0hJU1RPUllfRVJST1I6XG4gICAgICBUcmFuc2ZlckRhdGFTdG9yZS5oYW5kbGVUcmFuc2Zlckhpc3RvcnlFcnJvcihhY3Rpb24uZXJyb3IpO1xuICAgICAgYnJlYWs7XG4gICAgY2FzZSBfY29uc3RhbnRzQWN0aW9uVHlwZXMyWydkZWZhdWx0J10uQ0xJRU5UX0ZFVENIX1RSQU5TRkVSX0hJU1RPUllfU1VDQ0VTUzpcbiAgICAgIFRyYW5zZmVyRGF0YVN0b3JlLmhhbmRsZVRyYW5zZmVySGlzdG9yeVN1Y2Nlc3MoYWN0aW9uLmRhdGEpO1xuICAgICAgYnJlYWs7XG4gIH1cbn0pO1xuXG5leHBvcnRzWydkZWZhdWx0J10gPSBUcmFuc2ZlckRhdGFTdG9yZTtcbm1vZHVsZS5leHBvcnRzID0gZXhwb3J0c1snZGVmYXVsdCddO1xuXG5cbi8qKioqKioqKioqKioqKioqKlxuICoqIFdFQlBBQ0sgRk9PVEVSXG4gKiogLi9jbGllbnQvc291cmNlL3NjcmlwdHMvc3RvcmVzL1RyYW5zZmVyRGF0YVN0b3JlLmpzXG4gKiogbW9kdWxlIGlkID0gMjQ1XG4gKiogbW9kdWxlIGNodW5rcyA9IDBcbiAqKi8iXSwic291cmNlUm9vdCI6IiJ9"); /***/ }, /* 246 */ diff --git a/server/models/ClientRequest.js b/server/models/ClientRequest.js index f115f6e2..a3db819a 100644 --- a/server/models/ClientRequest.js +++ b/server/models/ClientRequest.js @@ -3,6 +3,7 @@ let util = require('util'); let clientUtil = require('../util/clientUtil'); +let Q = require('q'); let rTorrentPropMap = require('../util/rTorrentPropMap'); let scgi = require('../util/scgi'); let stringUtil = require('../../shared/util/stringUtil'); @@ -40,6 +41,10 @@ class ClientRequest { return item; } + clearRequestQueue() { + this.requests = []; + } + getMethodCall(methodName, params) { params = params || []; return {methodName, params}; @@ -48,19 +53,24 @@ class ClientRequest { handleError(error) { console.trace(error); + this.clearRequestQueue(); + if (this.onCompleteFn) { - this.onCompleteFn(error); + this.onCompleteFn(null, error); } } handleSuccess(data) { let response = data; + + this.clearRequestQueue(); + if (this.postProcessFn) { response = this.postProcessFn(data); } if (this.onCompleteFn) { - this.onCompleteFn(null, response); + this.onCompleteFn(response); } } @@ -147,6 +157,16 @@ class ClientRequest { this.requests.push(this.getMethodCall(options.method, [args])); } + moveTorrentsMethodCall(options) { + let hashes = this.getEnsuredArray(options.hashes); + let destinationPath = options.destinationPath; + let sourcePath = options.sourcePath; + + this.moveInProgress = true; + + // let {hashes, destinationPath, sourcePath} = options; + } + removeTorrentsMethodCall(options) { let hashes = this.getEnsuredArray(options.hashes); diff --git a/server/models/HistoryEra.js b/server/models/HistoryEra.js index 261db2b0..de7664a7 100644 --- a/server/models/HistoryEra.js +++ b/server/models/HistoryEra.js @@ -49,7 +49,7 @@ class HistoryEra { addData(data) { if (!this.ready) { - console.warn('database is not ready'); + console.error('database is not ready'); return; } @@ -74,12 +74,13 @@ class HistoryEra { let downAvg = ((currentDownAvg * numUpdates + Number(data.download)) / (numUpdates + 1)).toFixed(1); let upAvg = ((currentUpAvg * numUpdates + Number(data.upload)) / (numUpdates + 1)).toFixed(1); + // TODO: Remove this nonsense, I think this bug is resolved. if (downAvg == null || upAvg == null) { - console.log('\n\n'); - console.log('Warning: null values set in database!'); - console.log(`DB: ${this.opts.name}`); - console.log(`numUpdates: ${numUpdates}\ncurrentDownAvg: ${currentDownAvg}\ncurrentUpAvg: ${currentUpAvg}\ndownAvg: ${downAvg}\nupAvg: ${upAvg}`); - console.log('\n\n'); + console.error('\n\n'); + console.error('Warning: null values set in database!'); + console.error(`DB: ${this.opts.name}`); + console.error(`numUpdates: ${numUpdates}\ncurrentDownAvg: ${currentDownAvg}\ncurrentUpAvg: ${currentUpAvg}\ndownAvg: ${downAvg}\nupAvg: ${upAvg}`); + console.error('\n\n'); } this.db.update({ts: this.lastUpdate}, {ts: this.lastUpdate, up: Number(upAvg), dn: Number(downAvg), num: numUpdates + 1}); @@ -99,7 +100,12 @@ class HistoryEra { this.db.find({ts: {$gte: minTimestamp}}) .sort({ts: 1}) .exec(function (err, docs) { - callback(err, docs); + if (err) { + callback(null, err); + return; + } + + callback(docs); } ); } @@ -109,7 +115,7 @@ class HistoryEra { REQUIRED_FIELDS.forEach(function (field) { if (opts[field] == null) { - console.warn(`HistoryEra requires ${field}`); + console.error(`HistoryEra requires ${field}`); requirementsMet = false; } }); @@ -131,7 +137,7 @@ class HistoryEra { if (this.opts.maxTime > 0) { let minTimestamp = Date.now() - this.opts.maxTime; db.remove({ts: {$lt: minTimestamp}}, {multi: true}, (err, numRemoved) => { - console.log(`removed ${numRemoved} entries from ${this.opts.name}`) + console.error(`removed ${numRemoved} entries from ${this.opts.name}`) }); } } diff --git a/server/models/client.js b/server/models/client.js index 705cb319..239c3658 100644 --- a/server/models/client.js +++ b/server/models/client.js @@ -21,22 +21,24 @@ var client = { let files = req.files; let path = req.body.destination; let request = new ClientRequest(); - + request.add('createDirectory', {path}); request.send(); - // TODO: Clean this up, it's ugly. // Each torrent is sent individually because rTorrent accepts a total - // filesize of 524 kilobytes or less. + // filesize of 524 kilobytes or less. This allows the user to send many + // torrent files reliably. files.forEach((file, index) => { let fileRequest = new ClientRequest(); fileRequest.add('addFiles', {files: file, path}); - // Call the callback on the last request. + + // Set the callback for only the last request. if (index === files.length - 1) { fileRequest.onComplete(function (data) { callback(data); }); } + fileRequest.send(); }); }, @@ -61,11 +63,11 @@ var client = { }, getTorrentStatusCount: function(callback) { - callback(null, _statusCount); + callback(_statusCount); }, getTorrentTrackerCount: function(callback) { - callback(null, _trackerCount); + callback(_trackerCount); }, getTorrentDetails: function(hash, callback) { @@ -88,6 +90,7 @@ var client = { request.add('getTorrentList', {props: clientUtil.defaults.torrentPropertyMethods}); request.postProcess(function(data) { + // TODO: Remove this nasty nested array business. _torrentCollection.updateTorrents(data[0][0]); _statusCount = _torrentCollection.statusCount; _trackerCount = _torrentCollection.trackerCount; @@ -107,11 +110,19 @@ var client = { }, moveFiles: function(data, callback) { - // loop through the torrents: - // stop torrents, call d.stop and d.close - // move torrents - // set new torrent directory - // start torrents, call d.start and d.open + let destinationPath = data.destination; + let hashes = data.hashes; + let sourcePath = data.source; + let request = new ClientRequest(); + + request.add('createDirectory', {path: destinationPath}); + request.add('stopTorrents', {hashes}); + request.onComplete(function () { + request.add('moveTorrents', {hashes, destinationPath, sourcePath}); + request.add('startTorrents', {hashes}); + request.onComplete(callback); + }) + request.send(); }, setFilePriority: function (hashes, data, callback) { diff --git a/server/models/history.js b/server/models/history.js index 503ca2a7..164266c0 100644 --- a/server/models/history.js +++ b/server/models/history.js @@ -60,9 +60,10 @@ let fiveMinSnapshot = new HistoryEra({ nextEra: thirtyMinSnapshot }); -let processData = function (opts, callback, error, data) { +let processData = function (opts, callback, data, error) { if (error) { - callback(error); + callback(null, error); + return; } data = data.slice(data.length - config.maxHistoryStates); @@ -75,7 +76,7 @@ let processData = function (opts, callback, error, data) { uploadRateHistory.push(snapshot.up); }); - callback(error, { + callback({ download: downloadRateHistory, upload: uploadRateHistory }); @@ -104,7 +105,7 @@ let history = { startPolling: function () { pollInterval = setInterval(function() { - client.getTransferStats(function (err, data) { + client.getTransferStats(function (data, err) { if (err) { return; } diff --git a/server/models/uiSettings.js b/server/models/uiSettings.js index 7e9e29c0..b9dd7b44 100644 --- a/server/models/uiSettings.js +++ b/server/models/uiSettings.js @@ -15,12 +15,12 @@ let uiSettings = { getLatestTorrentLocation: function(callback) { uiDB.find({type: 'location'}, function(error, docs) { if (error) { - callback(error); + callback(null, error); return; } if (docs.length) { - callback(error, docs[0]); + callback(docs[0]); } }); }, @@ -28,12 +28,12 @@ let uiSettings = { getSortProps: function(callback) { uiDB.find({type: 'sort'}, function(error, docs) { if (error) { - callback(error); + callback(null, error); return; } if (docs.length) { - callback(error, docs[0]); + callback(docs[0]); } }); }, @@ -42,12 +42,12 @@ let uiSettings = { let newLocationData = Object.assign({}, {type: 'location'}, {path: data.destination}); uiDB.update({type: 'location'}, newLocationData, {upsert: true}, function (error, docs) { if (error) { - callback(error); + callback(null, error); return; } if (docs.length) { - callback(error, docs); + callback(docs); } }); }, @@ -56,12 +56,12 @@ let uiSettings = { let newSortPropData = Object.assign({}, {type: 'sort'}, sortProps); uiDB.update({type: 'sort'}, newSortPropData, {upsert: true}, function (error, docs) { if (error) { - callback(error); + callback(null, error); return; } if (docs.length) { - callback(error, docs); + callback(docs); } }); } diff --git a/server/util/ajaxUtil.js b/server/util/ajaxUtil.js index 65acecf8..e0691cb4 100644 --- a/server/util/ajaxUtil.js +++ b/server/util/ajaxUtil.js @@ -2,11 +2,13 @@ let ajaxUtil = { getResponseFn: function (res) { - return function (error, response) { + return function (data, error) { if (error) { - console.log('error in getResponseFn', error); + res.status(500).json(error); + return; + } else { + res.json(data); } - res.json(response); } } };