From d20440be7470cd128feed80aa12d32b75ea8e905 Mon Sep 17 00:00:00 2001 From: John Furrow Date: Thu, 18 Feb 2016 23:08:15 -0800 Subject: [PATCH] Allow removing added torrents before uploading --- .../scripts/components/modals/AddTorrentsByFile.js | 14 ++++++++++---- server/assets/app.js | 2 +- 2 files changed, 11 insertions(+), 5 deletions(-) diff --git a/client/source/scripts/components/modals/AddTorrentsByFile.js b/client/source/scripts/components/modals/AddTorrentsByFile.js index bb09ef0e..2eb39253 100644 --- a/client/source/scripts/components/modals/AddTorrentsByFile.js +++ b/client/source/scripts/components/modals/AddTorrentsByFile.js @@ -12,7 +12,8 @@ import TorrentActions from '../../actions/TorrentActions'; const METHODS_TO_BIND = [ 'handleAddTorrents', 'handleDestinationChange', - 'handleFileDrop' + 'handleFileDrop', + 'handleFileRemove' ]; export default class AddTorrents extends React.Component { @@ -33,8 +34,11 @@ export default class AddTorrents extends React.Component { this.setState({files}); } - handleFileRemove(file) { - console.log(file); + handleFileRemove(fileIndex) { + let files = this.state.files; + files.splice(fileIndex, 1); + + this.setState({files}); } handleFilesClick(event) { @@ -97,7 +101,9 @@ export default class AddTorrents extends React.Component {
  • {file.name} - + + +
  • ); }); diff --git a/server/assets/app.js b/server/assets/app.js index ae9e2301..218b93c9 100644 --- a/server/assets/app.js +++ b/server/assets/app.js @@ -1076,7 +1076,7 @@ /* 172 */ /***/ 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 _classnames = __webpack_require__(171);\n\nvar _classnames2 = _interopRequireDefault(_classnames);\n\nvar _reactDropzone = __webpack_require__(173);\n\nvar _reactDropzone2 = _interopRequireDefault(_reactDropzone);\n\nvar _react = __webpack_require__(1);\n\nvar _react2 = _interopRequireDefault(_react);\n\nvar _AddTorrentsDestination = __webpack_require__(175);\n\nvar _AddTorrentsDestination2 = _interopRequireDefault(_AddTorrentsDestination);\n\nvar _iconsClose = __webpack_require__(201);\n\nvar _iconsClose2 = _interopRequireDefault(_iconsClose);\n\nvar _iconsFile = __webpack_require__(203);\n\nvar _iconsFile2 = _interopRequireDefault(_iconsFile);\n\nvar _iconsFiles = __webpack_require__(204);\n\nvar _iconsFiles2 = _interopRequireDefault(_iconsFiles);\n\nvar _ModalActions = __webpack_require__(205);\n\nvar _ModalActions2 = _interopRequireDefault(_ModalActions);\n\nvar _actionsTorrentActions = __webpack_require__(186);\n\nvar _actionsTorrentActions2 = _interopRequireDefault(_actionsTorrentActions);\n\nvar METHODS_TO_BIND = ['handleAddTorrents', 'handleDestinationChange', 'handleFileDrop'];\n\nvar AddTorrents = (function (_React$Component) {\n _inherits(AddTorrents, _React$Component);\n\n function AddTorrents() {\n var _this = this;\n\n _classCallCheck(this, AddTorrents);\n\n _get(Object.getPrototypeOf(AddTorrents.prototype), 'constructor', this).call(this);\n\n this.state = {\n isAddingTorrents: false,\n files: null\n };\n\n METHODS_TO_BIND.forEach(function (method) {\n _this[method] = _this[method].bind(_this);\n });\n }\n\n _createClass(AddTorrents, [{\n key: 'handleFileDrop',\n value: function handleFileDrop(files) {\n this.setState({ files: files });\n }\n }, {\n key: 'handleFileRemove',\n value: function handleFileRemove(file) {\n console.log(file);\n }\n }, {\n key: 'handleFilesClick',\n value: function handleFilesClick(event) {\n event.stopPropagation();\n }\n }, {\n key: 'getActions',\n value: function getActions() {\n var icon = null;\n var primaryButtonText = 'Add Torrent';\n\n if (this.state.isAddingTorrents) {\n icon = _react2['default'].createElement(LoadingIndicatorDots, { viewBox: '0 0 32 32' });\n primaryButtonText = 'Adding...';\n }\n\n return [{\n clickHandler: null,\n content: 'Cancel',\n triggerDismiss: true,\n type: 'secondary'\n }, {\n clickHandler: this.handleAddTorrents,\n content: _react2['default'].createElement(\n 'span',\n null,\n icon,\n primaryButtonText\n ),\n supplementalClassName: icon != null ? 'has-icon' : '',\n triggerDismiss: false,\n type: 'primary'\n }];\n }\n }, {\n key: 'getModalContent',\n value: function getModalContent() {\n var _this2 = this;\n\n var dropzoneClasses = (0, _classnames2['default'])('form__dropzone dropzone', {\n 'is-fulfilled': this.state.files && this.state.files.length > 0\n });\n\n var content = _react2['default'].createElement(\n _reactDropzone2['default'],\n { activeClassName: 'dropzone--is-dragging',\n className: dropzoneClasses, ref: 'dropzone',\n onDrop: this.handleFileDrop, disablePreview: true },\n _react2['default'].createElement(\n 'div',\n { className: 'dropzone__copy' },\n _react2['default'].createElement(\n 'div',\n { className: 'dropzone__icon' },\n _react2['default'].createElement(_iconsFiles2['default'], null)\n ),\n 'Drop some files here, ',\n _react2['default'].createElement(\n 'span',\n { className: 'dropzone__browse-button' },\n 'or click to browse'\n ),\n '.'\n )\n );\n\n if (this.state.files && this.state.files.length > 0) {\n var files = this.state.files.map(function (file, index) {\n return _react2['default'].createElement(\n 'li',\n { className: 'dropzone__selected-files__file', key: index },\n _react2['default'].createElement(_iconsFile2['default'], null),\n file.name,\n _react2['default'].createElement(_iconsClose2['default'], { onClick: _this2.handleFileRemove.bind(_this2, file) })\n );\n });\n\n content = _react2['default'].createElement(\n 'ul',\n { className: 'dropzone__selected-files', onClick: this.handleFilesClick },\n files\n );\n }\n\n return content;\n }\n }, {\n key: 'handleAddTorrents',\n value: function handleAddTorrents() {\n if (!this.state.files || this.state.files.length === 0) {\n return;\n }\n\n var fileData = new FormData();\n\n this.state.files.forEach(function (file) {\n fileData.append('torrents', file);\n });\n\n fileData.append('destination', this.state.destination);\n\n _actionsTorrentActions2['default'].addTorrentsByFiles(fileData, this.state.destination);\n }\n }, {\n key: 'handleDestinationChange',\n value: function handleDestinationChange(destination) {\n this.setState({ destination: destination });\n }\n }, {\n key: 'render',\n value: function render() {\n return _react2['default'].createElement(\n 'div',\n { className: 'form' },\n _react2['default'].createElement(\n 'div',\n { className: 'form__row' },\n _react2['default'].createElement(\n 'label',\n { className: 'form__label' },\n 'Torrents'\n ),\n this.getModalContent()\n ),\n _react2['default'].createElement(_AddTorrentsDestination2['default'], { onChange: this.handleDestinationChange }),\n _react2['default'].createElement(_ModalActions2['default'], { actions: this.getActions(), dismiss: this.props.dismiss })\n );\n }\n }]);\n\n return AddTorrents;\n})(_react2['default'].Component);\n\nexports['default'] = AddTorrents;\nmodule.exports = exports['default'];//@ sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIndlYnBhY2s6Ly8vLi9jbGllbnQvc291cmNlL3NjcmlwdHMvY29tcG9uZW50cy9tb2RhbHMvQWRkVG9ycmVudHNCeUZpbGUuanM/MWI4NyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQTs7QUFFQTtBQUNBO0FBQ0EsQ0FBQzs7QUFFRCxpQ0FBaUMsMkNBQTJDLGdCQUFnQixrQkFBa0IsT0FBTywyQkFBMkIsd0RBQXdELGdDQUFnQyx1REFBdUQsMkRBQTJELEVBQUUsRUFBRSx5REFBeUQscUVBQXFFLDZEQUE2RCxvQkFBb0IsR0FBRyxFQUFFOztBQUVsakIsdUNBQXVDLG1CQUFtQiw0QkFBNEIsaURBQWlELGdCQUFnQixrREFBa0QsOERBQThELDBCQUEwQiw0Q0FBNEMsdUJBQXVCLGtCQUFrQixFQUFFLE9BQU8sYUFBYSxnQkFBZ0IsZ0JBQWdCLGVBQWUsMkJBQTJCLG9CQUFvQixFQUFFLEVBQUUsNEJBQTRCLG1CQUFtQixFQUFFLE9BQU8sdUJBQXVCLDRCQUE0QixrQkFBa0IsRUFBRSw4QkFBOEIsRUFBRSxFQUFFOztBQUUvb0Isc0NBQXNDLHVDQUF1QyxrQkFBa0I7O0FBRS9GLGlEQUFpRCwwQ0FBMEMsMERBQTBELEVBQUU7O0FBRXZKLDBDQUEwQywrREFBK0QscUdBQXFHLEVBQUUseUVBQXlFLGVBQWUseUVBQXlFLEVBQUUsRUFBRSx1SEFBdUg7O0FBRTVlOztBQUVBOztBQUVBOztBQUVBOztBQUVBOztBQUVBOztBQUVBOztBQUVBOztBQUVBOztBQUVBOztBQUVBOztBQUVBOztBQUVBOztBQUVBOztBQUVBOztBQUVBOztBQUVBOztBQUVBOztBQUVBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQTs7QUFFQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0EsS0FBSztBQUNMOztBQUVBO0FBQ0E7QUFDQTtBQUNBLHFCQUFxQixlQUFlO0FBQ3BDO0FBQ0EsR0FBRztBQUNIO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsR0FBRztBQUNIO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsR0FBRztBQUNIO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0EsdUVBQXVFLHVCQUF1QjtBQUM5RjtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxPQUFPO0FBQ1A7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxPQUFPO0FBQ1A7QUFDQSxHQUFHO0FBQ0g7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQSxPQUFPOztBQUVQO0FBQ0E7QUFDQSxTQUFTO0FBQ1Q7QUFDQSw2REFBNkQ7QUFDN0Q7QUFDQTtBQUNBLFdBQVcsOEJBQThCO0FBQ3pDO0FBQ0E7QUFDQSxhQUFhLDhCQUE4QjtBQUMzQztBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsYUFBYSx1Q0FBdUM7QUFDcEQ7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLGFBQWEsMERBQTBEO0FBQ3ZFO0FBQ0E7QUFDQSx1RUFBdUUsc0RBQXNEO0FBQzdIO0FBQ0EsU0FBUzs7QUFFVDtBQUNBO0FBQ0EsV0FBVyx3RUFBd0U7QUFDbkY7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQSxHQUFHO0FBQ0g7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTs7QUFFQTtBQUNBO0FBQ0EsT0FBTzs7QUFFUDs7QUFFQTtBQUNBO0FBQ0EsR0FBRztBQUNIO0FBQ0E7QUFDQSxxQkFBcUIsMkJBQTJCO0FBQ2hEO0FBQ0EsR0FBRztBQUNIO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsU0FBUyxvQkFBb0I7QUFDN0I7QUFDQTtBQUNBLFdBQVcseUJBQXlCO0FBQ3BDO0FBQ0E7QUFDQSxhQUFhLDJCQUEyQjtBQUN4QztBQUNBO0FBQ0E7QUFDQTtBQUNBLCtFQUErRSx5Q0FBeUM7QUFDeEgscUVBQXFFLDBEQUEwRDtBQUMvSDtBQUNBO0FBQ0EsR0FBRzs7QUFFSDtBQUNBLENBQUM7O0FBRUQ7QUFDQSIsImZpbGUiOiIxNzIuanMiLCJzb3VyY2VzQ29udGVudCI6WyIndXNlIHN0cmljdCc7XG5cbk9iamVjdC5kZWZpbmVQcm9wZXJ0eShleHBvcnRzLCAnX19lc01vZHVsZScsIHtcbiAgdmFsdWU6IHRydWVcbn0pO1xuXG52YXIgX2NyZWF0ZUNsYXNzID0gKGZ1bmN0aW9uICgpIHsgZnVuY3Rpb24gZGVmaW5lUHJvcGVydGllcyh0YXJnZXQsIHByb3BzKSB7IGZvciAodmFyIGkgPSAwOyBpIDwgcHJvcHMubGVuZ3RoOyBpKyspIHsgdmFyIGRlc2NyaXB0b3IgPSBwcm9wc1tpXTsgZGVzY3JpcHRvci5lbnVtZXJhYmxlID0gZGVzY3JpcHRvci5lbnVtZXJhYmxlIHx8IGZhbHNlOyBkZXNjcmlwdG9yLmNvbmZpZ3VyYWJsZSA9IHRydWU7IGlmICgndmFsdWUnIGluIGRlc2NyaXB0b3IpIGRlc2NyaXB0b3Iud3JpdGFibGUgPSB0cnVlOyBPYmplY3QuZGVmaW5lUHJvcGVydHkodGFyZ2V0LCBkZXNjcmlwdG9yLmtleSwgZGVzY3JpcHRvcik7IH0gfSByZXR1cm4gZnVuY3Rpb24gKENvbnN0cnVjdG9yLCBwcm90b1Byb3BzLCBzdGF0aWNQcm9wcykgeyBpZiAocHJvdG9Qcm9wcykgZGVmaW5lUHJvcGVydGllcyhDb25zdHJ1Y3Rvci5wcm90b3R5cGUsIHByb3RvUHJvcHMpOyBpZiAoc3RhdGljUHJvcHMpIGRlZmluZVByb3BlcnRpZXMoQ29uc3RydWN0b3IsIHN0YXRpY1Byb3BzKTsgcmV0dXJuIENvbnN0cnVjdG9yOyB9OyB9KSgpO1xuXG52YXIgX2dldCA9IGZ1bmN0aW9uIGdldChfeCwgX3gyLCBfeDMpIHsgdmFyIF9hZ2FpbiA9IHRydWU7IF9mdW5jdGlvbjogd2hpbGUgKF9hZ2FpbikgeyB2YXIgb2JqZWN0ID0gX3gsIHByb3BlcnR5ID0gX3gyLCByZWNlaXZlciA9IF94MzsgX2FnYWluID0gZmFsc2U7IGlmIChvYmplY3QgPT09IG51bGwpIG9iamVjdCA9IEZ1bmN0aW9uLnByb3RvdHlwZTsgdmFyIGRlc2MgPSBPYmplY3QuZ2V0T3duUHJvcGVydHlEZXNjcmlwdG9yKG9iamVjdCwgcHJvcGVydHkpOyBpZiAoZGVzYyA9PT0gdW5kZWZpbmVkKSB7IHZhciBwYXJlbnQgPSBPYmplY3QuZ2V0UHJvdG90eXBlT2Yob2JqZWN0KTsgaWYgKHBhcmVudCA9PT0gbnVsbCkgeyByZXR1cm4gdW5kZWZpbmVkOyB9IGVsc2UgeyBfeCA9IHBhcmVudDsgX3gyID0gcHJvcGVydHk7IF94MyA9IHJlY2VpdmVyOyBfYWdhaW4gPSB0cnVlOyBkZXNjID0gcGFyZW50ID0gdW5kZWZpbmVkOyBjb250aW51ZSBfZnVuY3Rpb247IH0gfSBlbHNlIGlmICgndmFsdWUnIGluIGRlc2MpIHsgcmV0dXJuIGRlc2MudmFsdWU7IH0gZWxzZSB7IHZhciBnZXR0ZXIgPSBkZXNjLmdldDsgaWYgKGdldHRlciA9PT0gdW5kZWZpbmVkKSB7IHJldHVybiB1bmRlZmluZWQ7IH0gcmV0dXJuIGdldHRlci5jYWxsKHJlY2VpdmVyKTsgfSB9IH07XG5cbmZ1bmN0aW9uIF9pbnRlcm9wUmVxdWlyZURlZmF1bHQob2JqKSB7IHJldHVybiBvYmogJiYgb2JqLl9fZXNNb2R1bGUgPyBvYmogOiB7ICdkZWZhdWx0Jzogb2JqIH07IH1cblxuZnVuY3Rpb24gX2NsYXNzQ2FsbENoZWNrKGluc3RhbmNlLCBDb25zdHJ1Y3RvcikgeyBpZiAoIShpbnN0YW5jZSBpbnN0YW5jZW9mIENvbnN0cnVjdG9yKSkgeyB0aHJvdyBuZXcgVHlwZUVycm9yKCdDYW5ub3QgY2FsbCBhIGNsYXNzIGFzIGEgZnVuY3Rpb24nKTsgfSB9XG5cbmZ1bmN0aW9uIF9pbmhlcml0cyhzdWJDbGFzcywgc3VwZXJDbGFzcykgeyBpZiAodHlwZW9mIHN1cGVyQ2xhc3MgIT09ICdmdW5jdGlvbicgJiYgc3VwZXJDbGFzcyAhPT0gbnVsbCkgeyB0aHJvdyBuZXcgVHlwZUVycm9yKCdTdXBlciBleHByZXNzaW9uIG11c3QgZWl0aGVyIGJlIG51bGwgb3IgYSBmdW5jdGlvbiwgbm90ICcgKyB0eXBlb2Ygc3VwZXJDbGFzcyk7IH0gc3ViQ2xhc3MucHJvdG90eXBlID0gT2JqZWN0LmNyZWF0ZShzdXBlckNsYXNzICYmIHN1cGVyQ2xhc3MucHJvdG90eXBlLCB7IGNvbnN0cnVjdG9yOiB7IHZhbHVlOiBzdWJDbGFzcywgZW51bWVyYWJsZTogZmFsc2UsIHdyaXRhYmxlOiB0cnVlLCBjb25maWd1cmFibGU6IHRydWUgfSB9KTsgaWYgKHN1cGVyQ2xhc3MpIE9iamVjdC5zZXRQcm90b3R5cGVPZiA/IE9iamVjdC5zZXRQcm90b3R5cGVPZihzdWJDbGFzcywgc3VwZXJDbGFzcykgOiBzdWJDbGFzcy5fX3Byb3RvX18gPSBzdXBlckNsYXNzOyB9XG5cbnZhciBfY2xhc3NuYW1lcyA9IHJlcXVpcmUoJ2NsYXNzbmFtZXMnKTtcblxudmFyIF9jbGFzc25hbWVzMiA9IF9pbnRlcm9wUmVxdWlyZURlZmF1bHQoX2NsYXNzbmFtZXMpO1xuXG52YXIgX3JlYWN0RHJvcHpvbmUgPSByZXF1aXJlKCdyZWFjdC1kcm9wem9uZScpO1xuXG52YXIgX3JlYWN0RHJvcHpvbmUyID0gX2ludGVyb3BSZXF1aXJlRGVmYXVsdChfcmVhY3REcm9wem9uZSk7XG5cbnZhciBfcmVhY3QgPSByZXF1aXJlKCdyZWFjdCcpO1xuXG52YXIgX3JlYWN0MiA9IF9pbnRlcm9wUmVxdWlyZURlZmF1bHQoX3JlYWN0KTtcblxudmFyIF9BZGRUb3JyZW50c0Rlc3RpbmF0aW9uID0gcmVxdWlyZSgnLi9BZGRUb3JyZW50c0Rlc3RpbmF0aW9uJyk7XG5cbnZhciBfQWRkVG9ycmVudHNEZXN0aW5hdGlvbjIgPSBfaW50ZXJvcFJlcXVpcmVEZWZhdWx0KF9BZGRUb3JyZW50c0Rlc3RpbmF0aW9uKTtcblxudmFyIF9pY29uc0Nsb3NlID0gcmVxdWlyZSgnLi4vaWNvbnMvQ2xvc2UnKTtcblxudmFyIF9pY29uc0Nsb3NlMiA9IF9pbnRlcm9wUmVxdWlyZURlZmF1bHQoX2ljb25zQ2xvc2UpO1xuXG52YXIgX2ljb25zRmlsZSA9IHJlcXVpcmUoJy4uL2ljb25zL0ZpbGUnKTtcblxudmFyIF9pY29uc0ZpbGUyID0gX2ludGVyb3BSZXF1aXJlRGVmYXVsdChfaWNvbnNGaWxlKTtcblxudmFyIF9pY29uc0ZpbGVzID0gcmVxdWlyZSgnLi4vaWNvbnMvRmlsZXMnKTtcblxudmFyIF9pY29uc0ZpbGVzMiA9IF9pbnRlcm9wUmVxdWlyZURlZmF1bHQoX2ljb25zRmlsZXMpO1xuXG52YXIgX01vZGFsQWN0aW9ucyA9IHJlcXVpcmUoJy4vTW9kYWxBY3Rpb25zJyk7XG5cbnZhciBfTW9kYWxBY3Rpb25zMiA9IF9pbnRlcm9wUmVxdWlyZURlZmF1bHQoX01vZGFsQWN0aW9ucyk7XG5cbnZhciBfYWN0aW9uc1RvcnJlbnRBY3Rpb25zID0gcmVxdWlyZSgnLi4vLi4vYWN0aW9ucy9Ub3JyZW50QWN0aW9ucycpO1xuXG52YXIgX2FjdGlvbnNUb3JyZW50QWN0aW9uczIgPSBfaW50ZXJvcFJlcXVpcmVEZWZhdWx0KF9hY3Rpb25zVG9ycmVudEFjdGlvbnMpO1xuXG52YXIgTUVUSE9EU19UT19CSU5EID0gWydoYW5kbGVBZGRUb3JyZW50cycsICdoYW5kbGVEZXN0aW5hdGlvbkNoYW5nZScsICdoYW5kbGVGaWxlRHJvcCddO1xuXG52YXIgQWRkVG9ycmVudHMgPSAoZnVuY3Rpb24gKF9SZWFjdCRDb21wb25lbnQpIHtcbiAgX2luaGVyaXRzKEFkZFRvcnJlbnRzLCBfUmVhY3QkQ29tcG9uZW50KTtcblxuICBmdW5jdGlvbiBBZGRUb3JyZW50cygpIHtcbiAgICB2YXIgX3RoaXMgPSB0aGlzO1xuXG4gICAgX2NsYXNzQ2FsbENoZWNrKHRoaXMsIEFkZFRvcnJlbnRzKTtcblxuICAgIF9nZXQoT2JqZWN0LmdldFByb3RvdHlwZU9mKEFkZFRvcnJlbnRzLnByb3RvdHlwZSksICdjb25zdHJ1Y3RvcicsIHRoaXMpLmNhbGwodGhpcyk7XG5cbiAgICB0aGlzLnN0YXRlID0ge1xuICAgICAgaXNBZGRpbmdUb3JyZW50czogZmFsc2UsXG4gICAgICBmaWxlczogbnVsbFxuICAgIH07XG5cbiAgICBNRVRIT0RTX1RPX0JJTkQuZm9yRWFjaChmdW5jdGlvbiAobWV0aG9kKSB7XG4gICAgICBfdGhpc1ttZXRob2RdID0gX3RoaXNbbWV0aG9kXS5iaW5kKF90aGlzKTtcbiAgICB9KTtcbiAgfVxuXG4gIF9jcmVhdGVDbGFzcyhBZGRUb3JyZW50cywgW3tcbiAgICBrZXk6ICdoYW5kbGVGaWxlRHJvcCcsXG4gICAgdmFsdWU6IGZ1bmN0aW9uIGhhbmRsZUZpbGVEcm9wKGZpbGVzKSB7XG4gICAgICB0aGlzLnNldFN0YXRlKHsgZmlsZXM6IGZpbGVzIH0pO1xuICAgIH1cbiAgfSwge1xuICAgIGtleTogJ2hhbmRsZUZpbGVSZW1vdmUnLFxuICAgIHZhbHVlOiBmdW5jdGlvbiBoYW5kbGVGaWxlUmVtb3ZlKGZpbGUpIHtcbiAgICAgIGNvbnNvbGUubG9nKGZpbGUpO1xuICAgIH1cbiAgfSwge1xuICAgIGtleTogJ2hhbmRsZUZpbGVzQ2xpY2snLFxuICAgIHZhbHVlOiBmdW5jdGlvbiBoYW5kbGVGaWxlc0NsaWNrKGV2ZW50KSB7XG4gICAgICBldmVudC5zdG9wUHJvcGFnYXRpb24oKTtcbiAgICB9XG4gIH0sIHtcbiAgICBrZXk6ICdnZXRBY3Rpb25zJyxcbiAgICB2YWx1ZTogZnVuY3Rpb24gZ2V0QWN0aW9ucygpIHtcbiAgICAgIHZhciBpY29uID0gbnVsbDtcbiAgICAgIHZhciBwcmltYXJ5QnV0dG9uVGV4dCA9ICdBZGQgVG9ycmVudCc7XG5cbiAgICAgIGlmICh0aGlzLnN0YXRlLmlzQWRkaW5nVG9ycmVudHMpIHtcbiAgICAgICAgaWNvbiA9IF9yZWFjdDJbJ2RlZmF1bHQnXS5jcmVhdGVFbGVtZW50KExvYWRpbmdJbmRpY2F0b3JEb3RzLCB7IHZpZXdCb3g6ICcwIDAgMzIgMzInIH0pO1xuICAgICAgICBwcmltYXJ5QnV0dG9uVGV4dCA9ICdBZGRpbmcuLi4nO1xuICAgICAgfVxuXG4gICAgICByZXR1cm4gW3tcbiAgICAgICAgY2xpY2tIYW5kbGVyOiBudWxsLFxuICAgICAgICBjb250ZW50OiAnQ2FuY2VsJyxcbiAgICAgICAgdHJpZ2dlckRpc21pc3M6IHRydWUsXG4gICAgICAgIHR5cGU6ICdzZWNvbmRhcnknXG4gICAgICB9LCB7XG4gICAgICAgIGNsaWNrSGFuZGxlcjogdGhpcy5oYW5kbGVBZGRUb3JyZW50cyxcbiAgICAgICAgY29udGVudDogX3JlYWN0MlsnZGVmYXVsdCddLmNyZWF0ZUVsZW1lbnQoXG4gICAgICAgICAgJ3NwYW4nLFxuICAgICAgICAgIG51bGwsXG4gICAgICAgICAgaWNvbixcbiAgICAgICAgICBwcmltYXJ5QnV0dG9uVGV4dFxuICAgICAgICApLFxuICAgICAgICBzdXBwbGVtZW50YWxDbGFzc05hbWU6IGljb24gIT0gbnVsbCA/ICdoYXMtaWNvbicgOiAnJyxcbiAgICAgICAgdHJpZ2dlckRpc21pc3M6IGZhbHNlLFxuICAgICAgICB0eXBlOiAncHJpbWFyeSdcbiAgICAgIH1dO1xuICAgIH1cbiAgfSwge1xuICAgIGtleTogJ2dldE1vZGFsQ29udGVudCcsXG4gICAgdmFsdWU6IGZ1bmN0aW9uIGdldE1vZGFsQ29udGVudCgpIHtcbiAgICAgIHZhciBfdGhpczIgPSB0aGlzO1xuXG4gICAgICB2YXIgZHJvcHpvbmVDbGFzc2VzID0gKDAsIF9jbGFzc25hbWVzMlsnZGVmYXVsdCddKSgnZm9ybV9fZHJvcHpvbmUgZHJvcHpvbmUnLCB7XG4gICAgICAgICdpcy1mdWxmaWxsZWQnOiB0aGlzLnN0YXRlLmZpbGVzICYmIHRoaXMuc3RhdGUuZmlsZXMubGVuZ3RoID4gMFxuICAgICAgfSk7XG5cbiAgICAgIHZhciBjb250ZW50ID0gX3JlYWN0MlsnZGVmYXVsdCddLmNyZWF0ZUVsZW1lbnQoXG4gICAgICAgIF9yZWFjdERyb3B6b25lMlsnZGVmYXVsdCddLFxuICAgICAgICB7IGFjdGl2ZUNsYXNzTmFtZTogJ2Ryb3B6b25lLS1pcy1kcmFnZ2luZycsXG4gICAgICAgICAgY2xhc3NOYW1lOiBkcm9wem9uZUNsYXNzZXMsIHJlZjogJ2Ryb3B6b25lJyxcbiAgICAgICAgICBvbkRyb3A6IHRoaXMuaGFuZGxlRmlsZURyb3AsIGRpc2FibGVQcmV2aWV3OiB0cnVlIH0sXG4gICAgICAgIF9yZWFjdDJbJ2RlZmF1bHQnXS5jcmVhdGVFbGVtZW50KFxuICAgICAgICAgICdkaXYnLFxuICAgICAgICAgIHsgY2xhc3NOYW1lOiAnZHJvcHpvbmVfX2NvcHknIH0sXG4gICAgICAgICAgX3JlYWN0MlsnZGVmYXVsdCddLmNyZWF0ZUVsZW1lbnQoXG4gICAgICAgICAgICAnZGl2JyxcbiAgICAgICAgICAgIHsgY2xhc3NOYW1lOiAnZHJvcHpvbmVfX2ljb24nIH0sXG4gICAgICAgICAgICBfcmVhY3QyWydkZWZhdWx0J10uY3JlYXRlRWxlbWVudChfaWNvbnNGaWxlczJbJ2RlZmF1bHQnXSwgbnVsbClcbiAgICAgICAgICApLFxuICAgICAgICAgICdEcm9wIHNvbWUgZmlsZXMgaGVyZSwgJyxcbiAgICAgICAgICBfcmVhY3QyWydkZWZhdWx0J10uY3JlYXRlRWxlbWVudChcbiAgICAgICAgICAgICdzcGFuJyxcbiAgICAgICAgICAgIHsgY2xhc3NOYW1lOiAnZHJvcHpvbmVfX2Jyb3dzZS1idXR0b24nIH0sXG4gICAgICAgICAgICAnb3IgY2xpY2sgdG8gYnJvd3NlJ1xuICAgICAgICAgICksXG4gICAgICAgICAgJy4nXG4gICAgICAgIClcbiAgICAgICk7XG5cbiAgICAgIGlmICh0aGlzLnN0YXRlLmZpbGVzICYmIHRoaXMuc3RhdGUuZmlsZXMubGVuZ3RoID4gMCkge1xuICAgICAgICB2YXIgZmlsZXMgPSB0aGlzLnN0YXRlLmZpbGVzLm1hcChmdW5jdGlvbiAoZmlsZSwgaW5kZXgpIHtcbiAgICAgICAgICByZXR1cm4gX3JlYWN0MlsnZGVmYXVsdCddLmNyZWF0ZUVsZW1lbnQoXG4gICAgICAgICAgICAnbGknLFxuICAgICAgICAgICAgeyBjbGFzc05hbWU6ICdkcm9wem9uZV9fc2VsZWN0ZWQtZmlsZXNfX2ZpbGUnLCBrZXk6IGluZGV4IH0sXG4gICAgICAgICAgICBfcmVhY3QyWydkZWZhdWx0J10uY3JlYXRlRWxlbWVudChfaWNvbnNGaWxlMlsnZGVmYXVsdCddLCBudWxsKSxcbiAgICAgICAgICAgIGZpbGUubmFtZSxcbiAgICAgICAgICAgIF9yZWFjdDJbJ2RlZmF1bHQnXS5jcmVhdGVFbGVtZW50KF9pY29uc0Nsb3NlMlsnZGVmYXVsdCddLCB7IG9uQ2xpY2s6IF90aGlzMi5oYW5kbGVGaWxlUmVtb3ZlLmJpbmQoX3RoaXMyLCBmaWxlKSB9KVxuICAgICAgICAgICk7XG4gICAgICAgIH0pO1xuXG4gICAgICAgIGNvbnRlbnQgPSBfcmVhY3QyWydkZWZhdWx0J10uY3JlYXRlRWxlbWVudChcbiAgICAgICAgICAndWwnLFxuICAgICAgICAgIHsgY2xhc3NOYW1lOiAnZHJvcHpvbmVfX3NlbGVjdGVkLWZpbGVzJywgb25DbGljazogdGhpcy5oYW5kbGVGaWxlc0NsaWNrIH0sXG4gICAgICAgICAgZmlsZXNcbiAgICAgICAgKTtcbiAgICAgIH1cblxuICAgICAgcmV0dXJuIGNvbnRlbnQ7XG4gICAgfVxuICB9LCB7XG4gICAga2V5OiAnaGFuZGxlQWRkVG9ycmVudHMnLFxuICAgIHZhbHVlOiBmdW5jdGlvbiBoYW5kbGVBZGRUb3JyZW50cygpIHtcbiAgICAgIGlmICghdGhpcy5zdGF0ZS5maWxlcyB8fCB0aGlzLnN0YXRlLmZpbGVzLmxlbmd0aCA9PT0gMCkge1xuICAgICAgICByZXR1cm47XG4gICAgICB9XG5cbiAgICAgIHZhciBmaWxlRGF0YSA9IG5ldyBGb3JtRGF0YSgpO1xuXG4gICAgICB0aGlzLnN0YXRlLmZpbGVzLmZvckVhY2goZnVuY3Rpb24gKGZpbGUpIHtcbiAgICAgICAgZmlsZURhdGEuYXBwZW5kKCd0b3JyZW50cycsIGZpbGUpO1xuICAgICAgfSk7XG5cbiAgICAgIGZpbGVEYXRhLmFwcGVuZCgnZGVzdGluYXRpb24nLCB0aGlzLnN0YXRlLmRlc3RpbmF0aW9uKTtcblxuICAgICAgX2FjdGlvbnNUb3JyZW50QWN0aW9uczJbJ2RlZmF1bHQnXS5hZGRUb3JyZW50c0J5RmlsZXMoZmlsZURhdGEsIHRoaXMuc3RhdGUuZGVzdGluYXRpb24pO1xuICAgIH1cbiAgfSwge1xuICAgIGtleTogJ2hhbmRsZURlc3RpbmF0aW9uQ2hhbmdlJyxcbiAgICB2YWx1ZTogZnVuY3Rpb24gaGFuZGxlRGVzdGluYXRpb25DaGFuZ2UoZGVzdGluYXRpb24pIHtcbiAgICAgIHRoaXMuc2V0U3RhdGUoeyBkZXN0aW5hdGlvbjogZGVzdGluYXRpb24gfSk7XG4gICAgfVxuICB9LCB7XG4gICAga2V5OiAncmVuZGVyJyxcbiAgICB2YWx1ZTogZnVuY3Rpb24gcmVuZGVyKCkge1xuICAgICAgcmV0dXJuIF9yZWFjdDJbJ2RlZmF1bHQnXS5jcmVhdGVFbGVtZW50KFxuICAgICAgICAnZGl2JyxcbiAgICAgICAgeyBjbGFzc05hbWU6ICdmb3JtJyB9LFxuICAgICAgICBfcmVhY3QyWydkZWZhdWx0J10uY3JlYXRlRWxlbWVudChcbiAgICAgICAgICAnZGl2JyxcbiAgICAgICAgICB7IGNsYXNzTmFtZTogJ2Zvcm1fX3JvdycgfSxcbiAgICAgICAgICBfcmVhY3QyWydkZWZhdWx0J10uY3JlYXRlRWxlbWVudChcbiAgICAgICAgICAgICdsYWJlbCcsXG4gICAgICAgICAgICB7IGNsYXNzTmFtZTogJ2Zvcm1fX2xhYmVsJyB9LFxuICAgICAgICAgICAgJ1RvcnJlbnRzJ1xuICAgICAgICAgICksXG4gICAgICAgICAgdGhpcy5nZXRNb2RhbENvbnRlbnQoKVxuICAgICAgICApLFxuICAgICAgICBfcmVhY3QyWydkZWZhdWx0J10uY3JlYXRlRWxlbWVudChfQWRkVG9ycmVudHNEZXN0aW5hdGlvbjJbJ2RlZmF1bHQnXSwgeyBvbkNoYW5nZTogdGhpcy5oYW5kbGVEZXN0aW5hdGlvbkNoYW5nZSB9KSxcbiAgICAgICAgX3JlYWN0MlsnZGVmYXVsdCddLmNyZWF0ZUVsZW1lbnQoX01vZGFsQWN0aW9uczJbJ2RlZmF1bHQnXSwgeyBhY3Rpb25zOiB0aGlzLmdldEFjdGlvbnMoKSwgZGlzbWlzczogdGhpcy5wcm9wcy5kaXNtaXNzIH0pXG4gICAgICApO1xuICAgIH1cbiAgfV0pO1xuXG4gIHJldHVybiBBZGRUb3JyZW50cztcbn0pKF9yZWFjdDJbJ2RlZmF1bHQnXS5Db21wb25lbnQpO1xuXG5leHBvcnRzWydkZWZhdWx0J10gPSBBZGRUb3JyZW50cztcbm1vZHVsZS5leHBvcnRzID0gZXhwb3J0c1snZGVmYXVsdCddO1xuXG5cbi8qKioqKioqKioqKioqKioqKlxuICoqIFdFQlBBQ0sgRk9PVEVSXG4gKiogLi9jbGllbnQvc291cmNlL3NjcmlwdHMvY29tcG9uZW50cy9tb2RhbHMvQWRkVG9ycmVudHNCeUZpbGUuanNcbiAqKiBtb2R1bGUgaWQgPSAxNzJcbiAqKiBtb2R1bGUgY2h1bmtzID0gMFxuICoqLyJdLCJzb3VyY2VSb290IjoiIn0="); + 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 _classnames = __webpack_require__(171);\n\nvar _classnames2 = _interopRequireDefault(_classnames);\n\nvar _reactDropzone = __webpack_require__(173);\n\nvar _reactDropzone2 = _interopRequireDefault(_reactDropzone);\n\nvar _react = __webpack_require__(1);\n\nvar _react2 = _interopRequireDefault(_react);\n\nvar _AddTorrentsDestination = __webpack_require__(175);\n\nvar _AddTorrentsDestination2 = _interopRequireDefault(_AddTorrentsDestination);\n\nvar _iconsClose = __webpack_require__(201);\n\nvar _iconsClose2 = _interopRequireDefault(_iconsClose);\n\nvar _iconsFile = __webpack_require__(203);\n\nvar _iconsFile2 = _interopRequireDefault(_iconsFile);\n\nvar _iconsFiles = __webpack_require__(204);\n\nvar _iconsFiles2 = _interopRequireDefault(_iconsFiles);\n\nvar _ModalActions = __webpack_require__(205);\n\nvar _ModalActions2 = _interopRequireDefault(_ModalActions);\n\nvar _actionsTorrentActions = __webpack_require__(186);\n\nvar _actionsTorrentActions2 = _interopRequireDefault(_actionsTorrentActions);\n\nvar METHODS_TO_BIND = ['handleAddTorrents', 'handleDestinationChange', 'handleFileDrop', 'handleFileRemove'];\n\nvar AddTorrents = (function (_React$Component) {\n _inherits(AddTorrents, _React$Component);\n\n function AddTorrents() {\n var _this = this;\n\n _classCallCheck(this, AddTorrents);\n\n _get(Object.getPrototypeOf(AddTorrents.prototype), 'constructor', this).call(this);\n\n this.state = {\n isAddingTorrents: false,\n files: null\n };\n\n METHODS_TO_BIND.forEach(function (method) {\n _this[method] = _this[method].bind(_this);\n });\n }\n\n _createClass(AddTorrents, [{\n key: 'handleFileDrop',\n value: function handleFileDrop(files) {\n this.setState({ files: files });\n }\n }, {\n key: 'handleFileRemove',\n value: function handleFileRemove(fileIndex) {\n var files = this.state.files;\n files.splice(fileIndex, 1);\n\n this.setState({ files: files });\n }\n }, {\n key: 'handleFilesClick',\n value: function handleFilesClick(event) {\n event.stopPropagation();\n }\n }, {\n key: 'getActions',\n value: function getActions() {\n var icon = null;\n var primaryButtonText = 'Add Torrent';\n\n if (this.state.isAddingTorrents) {\n icon = _react2['default'].createElement(LoadingIndicatorDots, { viewBox: '0 0 32 32' });\n primaryButtonText = 'Adding...';\n }\n\n return [{\n clickHandler: null,\n content: 'Cancel',\n triggerDismiss: true,\n type: 'secondary'\n }, {\n clickHandler: this.handleAddTorrents,\n content: _react2['default'].createElement(\n 'span',\n null,\n icon,\n primaryButtonText\n ),\n supplementalClassName: icon != null ? 'has-icon' : '',\n triggerDismiss: false,\n type: 'primary'\n }];\n }\n }, {\n key: 'getModalContent',\n value: function getModalContent() {\n var _this2 = this;\n\n var dropzoneClasses = (0, _classnames2['default'])('form__dropzone dropzone', {\n 'is-fulfilled': this.state.files && this.state.files.length > 0\n });\n\n var content = _react2['default'].createElement(\n _reactDropzone2['default'],\n { activeClassName: 'dropzone--is-dragging',\n className: dropzoneClasses, ref: 'dropzone',\n onDrop: this.handleFileDrop, disablePreview: true },\n _react2['default'].createElement(\n 'div',\n { className: 'dropzone__copy' },\n _react2['default'].createElement(\n 'div',\n { className: 'dropzone__icon' },\n _react2['default'].createElement(_iconsFiles2['default'], null)\n ),\n 'Drop some files here, ',\n _react2['default'].createElement(\n 'span',\n { className: 'dropzone__browse-button' },\n 'or click to browse'\n ),\n '.'\n )\n );\n\n if (this.state.files && this.state.files.length > 0) {\n var files = this.state.files.map(function (file, index) {\n return _react2['default'].createElement(\n 'li',\n { className: 'dropzone__selected-files__file', key: index },\n _react2['default'].createElement(_iconsFile2['default'], null),\n file.name,\n _react2['default'].createElement(\n 'span',\n { onClick: _this2.handleFileRemove.bind(_this2, index) },\n _react2['default'].createElement(_iconsClose2['default'], null)\n )\n );\n });\n\n content = _react2['default'].createElement(\n 'ul',\n { className: 'dropzone__selected-files', onClick: this.handleFilesClick },\n files\n );\n }\n\n return content;\n }\n }, {\n key: 'handleAddTorrents',\n value: function handleAddTorrents() {\n if (!this.state.files || this.state.files.length === 0) {\n return;\n }\n\n var fileData = new FormData();\n\n this.state.files.forEach(function (file) {\n fileData.append('torrents', file);\n });\n\n fileData.append('destination', this.state.destination);\n\n _actionsTorrentActions2['default'].addTorrentsByFiles(fileData, this.state.destination);\n }\n }, {\n key: 'handleDestinationChange',\n value: function handleDestinationChange(destination) {\n this.setState({ destination: destination });\n }\n }, {\n key: 'render',\n value: function render() {\n return _react2['default'].createElement(\n 'div',\n { className: 'form' },\n _react2['default'].createElement(\n 'div',\n { className: 'form__row' },\n _react2['default'].createElement(\n 'label',\n { className: 'form__label' },\n 'Torrents'\n ),\n this.getModalContent()\n ),\n _react2['default'].createElement(_AddTorrentsDestination2['default'], { onChange: this.handleDestinationChange }),\n _react2['default'].createElement(_ModalActions2['default'], { actions: this.getActions(), dismiss: this.props.dismiss })\n );\n }\n }]);\n\n return AddTorrents;\n})(_react2['default'].Component);\n\nexports['default'] = AddTorrents;\nmodule.exports = exports['default'];//@ sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIndlYnBhY2s6Ly8vLi9jbGllbnQvc291cmNlL3NjcmlwdHMvY29tcG9uZW50cy9tb2RhbHMvQWRkVG9ycmVudHNCeUZpbGUuanM/MWI4NyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQTs7QUFFQTtBQUNBO0FBQ0EsQ0FBQzs7QUFFRCxpQ0FBaUMsMkNBQTJDLGdCQUFnQixrQkFBa0IsT0FBTywyQkFBMkIsd0RBQXdELGdDQUFnQyx1REFBdUQsMkRBQTJELEVBQUUsRUFBRSx5REFBeUQscUVBQXFFLDZEQUE2RCxvQkFBb0IsR0FBRyxFQUFFOztBQUVsakIsdUNBQXVDLG1CQUFtQiw0QkFBNEIsaURBQWlELGdCQUFnQixrREFBa0QsOERBQThELDBCQUEwQiw0Q0FBNEMsdUJBQXVCLGtCQUFrQixFQUFFLE9BQU8sYUFBYSxnQkFBZ0IsZ0JBQWdCLGVBQWUsMkJBQTJCLG9CQUFvQixFQUFFLEVBQUUsNEJBQTRCLG1CQUFtQixFQUFFLE9BQU8sdUJBQXVCLDRCQUE0QixrQkFBa0IsRUFBRSw4QkFBOEIsRUFBRSxFQUFFOztBQUUvb0Isc0NBQXNDLHVDQUF1QyxrQkFBa0I7O0FBRS9GLGlEQUFpRCwwQ0FBMEMsMERBQTBELEVBQUU7O0FBRXZKLDBDQUEwQywrREFBK0QscUdBQXFHLEVBQUUseUVBQXlFLGVBQWUseUVBQXlFLEVBQUUsRUFBRSx1SEFBdUg7O0FBRTVlOztBQUVBOztBQUVBOztBQUVBOztBQUVBOztBQUVBOztBQUVBOztBQUVBOztBQUVBOztBQUVBOztBQUVBOztBQUVBOztBQUVBOztBQUVBOztBQUVBOztBQUVBOztBQUVBOztBQUVBOztBQUVBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQTs7QUFFQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0EsS0FBSztBQUNMOztBQUVBO0FBQ0E7QUFDQTtBQUNBLHFCQUFxQixlQUFlO0FBQ3BDO0FBQ0EsR0FBRztBQUNIO0FBQ0E7QUFDQTtBQUNBOztBQUVBLHFCQUFxQixlQUFlO0FBQ3BDO0FBQ0EsR0FBRztBQUNIO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsR0FBRztBQUNIO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0EsdUVBQXVFLHVCQUF1QjtBQUM5RjtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxPQUFPO0FBQ1A7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxPQUFPO0FBQ1A7QUFDQSxHQUFHO0FBQ0g7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQSxPQUFPOztBQUVQO0FBQ0E7QUFDQSxTQUFTO0FBQ1Q7QUFDQSw2REFBNkQ7QUFDN0Q7QUFDQTtBQUNBLFdBQVcsOEJBQThCO0FBQ3pDO0FBQ0E7QUFDQSxhQUFhLDhCQUE4QjtBQUMzQztBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsYUFBYSx1Q0FBdUM7QUFDcEQ7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLGFBQWEsMERBQTBEO0FBQ3ZFO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsZUFBZSx1REFBdUQ7QUFDdEU7QUFDQTtBQUNBO0FBQ0EsU0FBUzs7QUFFVDtBQUNBO0FBQ0EsV0FBVyx3RUFBd0U7QUFDbkY7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQSxHQUFHO0FBQ0g7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTs7QUFFQTtBQUNBO0FBQ0EsT0FBTzs7QUFFUDs7QUFFQTtBQUNBO0FBQ0EsR0FBRztBQUNIO0FBQ0E7QUFDQSxxQkFBcUIsMkJBQTJCO0FBQ2hEO0FBQ0EsR0FBRztBQUNIO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsU0FBUyxvQkFBb0I7QUFDN0I7QUFDQTtBQUNBLFdBQVcseUJBQXlCO0FBQ3BDO0FBQ0E7QUFDQSxhQUFhLDJCQUEyQjtBQUN4QztBQUNBO0FBQ0E7QUFDQTtBQUNBLCtFQUErRSx5Q0FBeUM7QUFDeEgscUVBQXFFLDBEQUEwRDtBQUMvSDtBQUNBO0FBQ0EsR0FBRzs7QUFFSDtBQUNBLENBQUM7O0FBRUQ7QUFDQSIsImZpbGUiOiIxNzIuanMiLCJzb3VyY2VzQ29udGVudCI6WyIndXNlIHN0cmljdCc7XG5cbk9iamVjdC5kZWZpbmVQcm9wZXJ0eShleHBvcnRzLCAnX19lc01vZHVsZScsIHtcbiAgdmFsdWU6IHRydWVcbn0pO1xuXG52YXIgX2NyZWF0ZUNsYXNzID0gKGZ1bmN0aW9uICgpIHsgZnVuY3Rpb24gZGVmaW5lUHJvcGVydGllcyh0YXJnZXQsIHByb3BzKSB7IGZvciAodmFyIGkgPSAwOyBpIDwgcHJvcHMubGVuZ3RoOyBpKyspIHsgdmFyIGRlc2NyaXB0b3IgPSBwcm9wc1tpXTsgZGVzY3JpcHRvci5lbnVtZXJhYmxlID0gZGVzY3JpcHRvci5lbnVtZXJhYmxlIHx8IGZhbHNlOyBkZXNjcmlwdG9yLmNvbmZpZ3VyYWJsZSA9IHRydWU7IGlmICgndmFsdWUnIGluIGRlc2NyaXB0b3IpIGRlc2NyaXB0b3Iud3JpdGFibGUgPSB0cnVlOyBPYmplY3QuZGVmaW5lUHJvcGVydHkodGFyZ2V0LCBkZXNjcmlwdG9yLmtleSwgZGVzY3JpcHRvcik7IH0gfSByZXR1cm4gZnVuY3Rpb24gKENvbnN0cnVjdG9yLCBwcm90b1Byb3BzLCBzdGF0aWNQcm9wcykgeyBpZiAocHJvdG9Qcm9wcykgZGVmaW5lUHJvcGVydGllcyhDb25zdHJ1Y3Rvci5wcm90b3R5cGUsIHByb3RvUHJvcHMpOyBpZiAoc3RhdGljUHJvcHMpIGRlZmluZVByb3BlcnRpZXMoQ29uc3RydWN0b3IsIHN0YXRpY1Byb3BzKTsgcmV0dXJuIENvbnN0cnVjdG9yOyB9OyB9KSgpO1xuXG52YXIgX2dldCA9IGZ1bmN0aW9uIGdldChfeCwgX3gyLCBfeDMpIHsgdmFyIF9hZ2FpbiA9IHRydWU7IF9mdW5jdGlvbjogd2hpbGUgKF9hZ2FpbikgeyB2YXIgb2JqZWN0ID0gX3gsIHByb3BlcnR5ID0gX3gyLCByZWNlaXZlciA9IF94MzsgX2FnYWluID0gZmFsc2U7IGlmIChvYmplY3QgPT09IG51bGwpIG9iamVjdCA9IEZ1bmN0aW9uLnByb3RvdHlwZTsgdmFyIGRlc2MgPSBPYmplY3QuZ2V0T3duUHJvcGVydHlEZXNjcmlwdG9yKG9iamVjdCwgcHJvcGVydHkpOyBpZiAoZGVzYyA9PT0gdW5kZWZpbmVkKSB7IHZhciBwYXJlbnQgPSBPYmplY3QuZ2V0UHJvdG90eXBlT2Yob2JqZWN0KTsgaWYgKHBhcmVudCA9PT0gbnVsbCkgeyByZXR1cm4gdW5kZWZpbmVkOyB9IGVsc2UgeyBfeCA9IHBhcmVudDsgX3gyID0gcHJvcGVydHk7IF94MyA9IHJlY2VpdmVyOyBfYWdhaW4gPSB0cnVlOyBkZXNjID0gcGFyZW50ID0gdW5kZWZpbmVkOyBjb250aW51ZSBfZnVuY3Rpb247IH0gfSBlbHNlIGlmICgndmFsdWUnIGluIGRlc2MpIHsgcmV0dXJuIGRlc2MudmFsdWU7IH0gZWxzZSB7IHZhciBnZXR0ZXIgPSBkZXNjLmdldDsgaWYgKGdldHRlciA9PT0gdW5kZWZpbmVkKSB7IHJldHVybiB1bmRlZmluZWQ7IH0gcmV0dXJuIGdldHRlci5jYWxsKHJlY2VpdmVyKTsgfSB9IH07XG5cbmZ1bmN0aW9uIF9pbnRlcm9wUmVxdWlyZURlZmF1bHQob2JqKSB7IHJldHVybiBvYmogJiYgb2JqLl9fZXNNb2R1bGUgPyBvYmogOiB7ICdkZWZhdWx0Jzogb2JqIH07IH1cblxuZnVuY3Rpb24gX2NsYXNzQ2FsbENoZWNrKGluc3RhbmNlLCBDb25zdHJ1Y3RvcikgeyBpZiAoIShpbnN0YW5jZSBpbnN0YW5jZW9mIENvbnN0cnVjdG9yKSkgeyB0aHJvdyBuZXcgVHlwZUVycm9yKCdDYW5ub3QgY2FsbCBhIGNsYXNzIGFzIGEgZnVuY3Rpb24nKTsgfSB9XG5cbmZ1bmN0aW9uIF9pbmhlcml0cyhzdWJDbGFzcywgc3VwZXJDbGFzcykgeyBpZiAodHlwZW9mIHN1cGVyQ2xhc3MgIT09ICdmdW5jdGlvbicgJiYgc3VwZXJDbGFzcyAhPT0gbnVsbCkgeyB0aHJvdyBuZXcgVHlwZUVycm9yKCdTdXBlciBleHByZXNzaW9uIG11c3QgZWl0aGVyIGJlIG51bGwgb3IgYSBmdW5jdGlvbiwgbm90ICcgKyB0eXBlb2Ygc3VwZXJDbGFzcyk7IH0gc3ViQ2xhc3MucHJvdG90eXBlID0gT2JqZWN0LmNyZWF0ZShzdXBlckNsYXNzICYmIHN1cGVyQ2xhc3MucHJvdG90eXBlLCB7IGNvbnN0cnVjdG9yOiB7IHZhbHVlOiBzdWJDbGFzcywgZW51bWVyYWJsZTogZmFsc2UsIHdyaXRhYmxlOiB0cnVlLCBjb25maWd1cmFibGU6IHRydWUgfSB9KTsgaWYgKHN1cGVyQ2xhc3MpIE9iamVjdC5zZXRQcm90b3R5cGVPZiA/IE9iamVjdC5zZXRQcm90b3R5cGVPZihzdWJDbGFzcywgc3VwZXJDbGFzcykgOiBzdWJDbGFzcy5fX3Byb3RvX18gPSBzdXBlckNsYXNzOyB9XG5cbnZhciBfY2xhc3NuYW1lcyA9IHJlcXVpcmUoJ2NsYXNzbmFtZXMnKTtcblxudmFyIF9jbGFzc25hbWVzMiA9IF9pbnRlcm9wUmVxdWlyZURlZmF1bHQoX2NsYXNzbmFtZXMpO1xuXG52YXIgX3JlYWN0RHJvcHpvbmUgPSByZXF1aXJlKCdyZWFjdC1kcm9wem9uZScpO1xuXG52YXIgX3JlYWN0RHJvcHpvbmUyID0gX2ludGVyb3BSZXF1aXJlRGVmYXVsdChfcmVhY3REcm9wem9uZSk7XG5cbnZhciBfcmVhY3QgPSByZXF1aXJlKCdyZWFjdCcpO1xuXG52YXIgX3JlYWN0MiA9IF9pbnRlcm9wUmVxdWlyZURlZmF1bHQoX3JlYWN0KTtcblxudmFyIF9BZGRUb3JyZW50c0Rlc3RpbmF0aW9uID0gcmVxdWlyZSgnLi9BZGRUb3JyZW50c0Rlc3RpbmF0aW9uJyk7XG5cbnZhciBfQWRkVG9ycmVudHNEZXN0aW5hdGlvbjIgPSBfaW50ZXJvcFJlcXVpcmVEZWZhdWx0KF9BZGRUb3JyZW50c0Rlc3RpbmF0aW9uKTtcblxudmFyIF9pY29uc0Nsb3NlID0gcmVxdWlyZSgnLi4vaWNvbnMvQ2xvc2UnKTtcblxudmFyIF9pY29uc0Nsb3NlMiA9IF9pbnRlcm9wUmVxdWlyZURlZmF1bHQoX2ljb25zQ2xvc2UpO1xuXG52YXIgX2ljb25zRmlsZSA9IHJlcXVpcmUoJy4uL2ljb25zL0ZpbGUnKTtcblxudmFyIF9pY29uc0ZpbGUyID0gX2ludGVyb3BSZXF1aXJlRGVmYXVsdChfaWNvbnNGaWxlKTtcblxudmFyIF9pY29uc0ZpbGVzID0gcmVxdWlyZSgnLi4vaWNvbnMvRmlsZXMnKTtcblxudmFyIF9pY29uc0ZpbGVzMiA9IF9pbnRlcm9wUmVxdWlyZURlZmF1bHQoX2ljb25zRmlsZXMpO1xuXG52YXIgX01vZGFsQWN0aW9ucyA9IHJlcXVpcmUoJy4vTW9kYWxBY3Rpb25zJyk7XG5cbnZhciBfTW9kYWxBY3Rpb25zMiA9IF9pbnRlcm9wUmVxdWlyZURlZmF1bHQoX01vZGFsQWN0aW9ucyk7XG5cbnZhciBfYWN0aW9uc1RvcnJlbnRBY3Rpb25zID0gcmVxdWlyZSgnLi4vLi4vYWN0aW9ucy9Ub3JyZW50QWN0aW9ucycpO1xuXG52YXIgX2FjdGlvbnNUb3JyZW50QWN0aW9uczIgPSBfaW50ZXJvcFJlcXVpcmVEZWZhdWx0KF9hY3Rpb25zVG9ycmVudEFjdGlvbnMpO1xuXG52YXIgTUVUSE9EU19UT19CSU5EID0gWydoYW5kbGVBZGRUb3JyZW50cycsICdoYW5kbGVEZXN0aW5hdGlvbkNoYW5nZScsICdoYW5kbGVGaWxlRHJvcCcsICdoYW5kbGVGaWxlUmVtb3ZlJ107XG5cbnZhciBBZGRUb3JyZW50cyA9IChmdW5jdGlvbiAoX1JlYWN0JENvbXBvbmVudCkge1xuICBfaW5oZXJpdHMoQWRkVG9ycmVudHMsIF9SZWFjdCRDb21wb25lbnQpO1xuXG4gIGZ1bmN0aW9uIEFkZFRvcnJlbnRzKCkge1xuICAgIHZhciBfdGhpcyA9IHRoaXM7XG5cbiAgICBfY2xhc3NDYWxsQ2hlY2sodGhpcywgQWRkVG9ycmVudHMpO1xuXG4gICAgX2dldChPYmplY3QuZ2V0UHJvdG90eXBlT2YoQWRkVG9ycmVudHMucHJvdG90eXBlKSwgJ2NvbnN0cnVjdG9yJywgdGhpcykuY2FsbCh0aGlzKTtcblxuICAgIHRoaXMuc3RhdGUgPSB7XG4gICAgICBpc0FkZGluZ1RvcnJlbnRzOiBmYWxzZSxcbiAgICAgIGZpbGVzOiBudWxsXG4gICAgfTtcblxuICAgIE1FVEhPRFNfVE9fQklORC5mb3JFYWNoKGZ1bmN0aW9uIChtZXRob2QpIHtcbiAgICAgIF90aGlzW21ldGhvZF0gPSBfdGhpc1ttZXRob2RdLmJpbmQoX3RoaXMpO1xuICAgIH0pO1xuICB9XG5cbiAgX2NyZWF0ZUNsYXNzKEFkZFRvcnJlbnRzLCBbe1xuICAgIGtleTogJ2hhbmRsZUZpbGVEcm9wJyxcbiAgICB2YWx1ZTogZnVuY3Rpb24gaGFuZGxlRmlsZURyb3AoZmlsZXMpIHtcbiAgICAgIHRoaXMuc2V0U3RhdGUoeyBmaWxlczogZmlsZXMgfSk7XG4gICAgfVxuICB9LCB7XG4gICAga2V5OiAnaGFuZGxlRmlsZVJlbW92ZScsXG4gICAgdmFsdWU6IGZ1bmN0aW9uIGhhbmRsZUZpbGVSZW1vdmUoZmlsZUluZGV4KSB7XG4gICAgICB2YXIgZmlsZXMgPSB0aGlzLnN0YXRlLmZpbGVzO1xuICAgICAgZmlsZXMuc3BsaWNlKGZpbGVJbmRleCwgMSk7XG5cbiAgICAgIHRoaXMuc2V0U3RhdGUoeyBmaWxlczogZmlsZXMgfSk7XG4gICAgfVxuICB9LCB7XG4gICAga2V5OiAnaGFuZGxlRmlsZXNDbGljaycsXG4gICAgdmFsdWU6IGZ1bmN0aW9uIGhhbmRsZUZpbGVzQ2xpY2soZXZlbnQpIHtcbiAgICAgIGV2ZW50LnN0b3BQcm9wYWdhdGlvbigpO1xuICAgIH1cbiAgfSwge1xuICAgIGtleTogJ2dldEFjdGlvbnMnLFxuICAgIHZhbHVlOiBmdW5jdGlvbiBnZXRBY3Rpb25zKCkge1xuICAgICAgdmFyIGljb24gPSBudWxsO1xuICAgICAgdmFyIHByaW1hcnlCdXR0b25UZXh0ID0gJ0FkZCBUb3JyZW50JztcblxuICAgICAgaWYgKHRoaXMuc3RhdGUuaXNBZGRpbmdUb3JyZW50cykge1xuICAgICAgICBpY29uID0gX3JlYWN0MlsnZGVmYXVsdCddLmNyZWF0ZUVsZW1lbnQoTG9hZGluZ0luZGljYXRvckRvdHMsIHsgdmlld0JveDogJzAgMCAzMiAzMicgfSk7XG4gICAgICAgIHByaW1hcnlCdXR0b25UZXh0ID0gJ0FkZGluZy4uLic7XG4gICAgICB9XG5cbiAgICAgIHJldHVybiBbe1xuICAgICAgICBjbGlja0hhbmRsZXI6IG51bGwsXG4gICAgICAgIGNvbnRlbnQ6ICdDYW5jZWwnLFxuICAgICAgICB0cmlnZ2VyRGlzbWlzczogdHJ1ZSxcbiAgICAgICAgdHlwZTogJ3NlY29uZGFyeSdcbiAgICAgIH0sIHtcbiAgICAgICAgY2xpY2tIYW5kbGVyOiB0aGlzLmhhbmRsZUFkZFRvcnJlbnRzLFxuICAgICAgICBjb250ZW50OiBfcmVhY3QyWydkZWZhdWx0J10uY3JlYXRlRWxlbWVudChcbiAgICAgICAgICAnc3BhbicsXG4gICAgICAgICAgbnVsbCxcbiAgICAgICAgICBpY29uLFxuICAgICAgICAgIHByaW1hcnlCdXR0b25UZXh0XG4gICAgICAgICksXG4gICAgICAgIHN1cHBsZW1lbnRhbENsYXNzTmFtZTogaWNvbiAhPSBudWxsID8gJ2hhcy1pY29uJyA6ICcnLFxuICAgICAgICB0cmlnZ2VyRGlzbWlzczogZmFsc2UsXG4gICAgICAgIHR5cGU6ICdwcmltYXJ5J1xuICAgICAgfV07XG4gICAgfVxuICB9LCB7XG4gICAga2V5OiAnZ2V0TW9kYWxDb250ZW50JyxcbiAgICB2YWx1ZTogZnVuY3Rpb24gZ2V0TW9kYWxDb250ZW50KCkge1xuICAgICAgdmFyIF90aGlzMiA9IHRoaXM7XG5cbiAgICAgIHZhciBkcm9wem9uZUNsYXNzZXMgPSAoMCwgX2NsYXNzbmFtZXMyWydkZWZhdWx0J10pKCdmb3JtX19kcm9wem9uZSBkcm9wem9uZScsIHtcbiAgICAgICAgJ2lzLWZ1bGZpbGxlZCc6IHRoaXMuc3RhdGUuZmlsZXMgJiYgdGhpcy5zdGF0ZS5maWxlcy5sZW5ndGggPiAwXG4gICAgICB9KTtcblxuICAgICAgdmFyIGNvbnRlbnQgPSBfcmVhY3QyWydkZWZhdWx0J10uY3JlYXRlRWxlbWVudChcbiAgICAgICAgX3JlYWN0RHJvcHpvbmUyWydkZWZhdWx0J10sXG4gICAgICAgIHsgYWN0aXZlQ2xhc3NOYW1lOiAnZHJvcHpvbmUtLWlzLWRyYWdnaW5nJyxcbiAgICAgICAgICBjbGFzc05hbWU6IGRyb3B6b25lQ2xhc3NlcywgcmVmOiAnZHJvcHpvbmUnLFxuICAgICAgICAgIG9uRHJvcDogdGhpcy5oYW5kbGVGaWxlRHJvcCwgZGlzYWJsZVByZXZpZXc6IHRydWUgfSxcbiAgICAgICAgX3JlYWN0MlsnZGVmYXVsdCddLmNyZWF0ZUVsZW1lbnQoXG4gICAgICAgICAgJ2RpdicsXG4gICAgICAgICAgeyBjbGFzc05hbWU6ICdkcm9wem9uZV9fY29weScgfSxcbiAgICAgICAgICBfcmVhY3QyWydkZWZhdWx0J10uY3JlYXRlRWxlbWVudChcbiAgICAgICAgICAgICdkaXYnLFxuICAgICAgICAgICAgeyBjbGFzc05hbWU6ICdkcm9wem9uZV9faWNvbicgfSxcbiAgICAgICAgICAgIF9yZWFjdDJbJ2RlZmF1bHQnXS5jcmVhdGVFbGVtZW50KF9pY29uc0ZpbGVzMlsnZGVmYXVsdCddLCBudWxsKVxuICAgICAgICAgICksXG4gICAgICAgICAgJ0Ryb3Agc29tZSBmaWxlcyBoZXJlLCAnLFxuICAgICAgICAgIF9yZWFjdDJbJ2RlZmF1bHQnXS5jcmVhdGVFbGVtZW50KFxuICAgICAgICAgICAgJ3NwYW4nLFxuICAgICAgICAgICAgeyBjbGFzc05hbWU6ICdkcm9wem9uZV9fYnJvd3NlLWJ1dHRvbicgfSxcbiAgICAgICAgICAgICdvciBjbGljayB0byBicm93c2UnXG4gICAgICAgICAgKSxcbiAgICAgICAgICAnLidcbiAgICAgICAgKVxuICAgICAgKTtcblxuICAgICAgaWYgKHRoaXMuc3RhdGUuZmlsZXMgJiYgdGhpcy5zdGF0ZS5maWxlcy5sZW5ndGggPiAwKSB7XG4gICAgICAgIHZhciBmaWxlcyA9IHRoaXMuc3RhdGUuZmlsZXMubWFwKGZ1bmN0aW9uIChmaWxlLCBpbmRleCkge1xuICAgICAgICAgIHJldHVybiBfcmVhY3QyWydkZWZhdWx0J10uY3JlYXRlRWxlbWVudChcbiAgICAgICAgICAgICdsaScsXG4gICAgICAgICAgICB7IGNsYXNzTmFtZTogJ2Ryb3B6b25lX19zZWxlY3RlZC1maWxlc19fZmlsZScsIGtleTogaW5kZXggfSxcbiAgICAgICAgICAgIF9yZWFjdDJbJ2RlZmF1bHQnXS5jcmVhdGVFbGVtZW50KF9pY29uc0ZpbGUyWydkZWZhdWx0J10sIG51bGwpLFxuICAgICAgICAgICAgZmlsZS5uYW1lLFxuICAgICAgICAgICAgX3JlYWN0MlsnZGVmYXVsdCddLmNyZWF0ZUVsZW1lbnQoXG4gICAgICAgICAgICAgICdzcGFuJyxcbiAgICAgICAgICAgICAgeyBvbkNsaWNrOiBfdGhpczIuaGFuZGxlRmlsZVJlbW92ZS5iaW5kKF90aGlzMiwgaW5kZXgpIH0sXG4gICAgICAgICAgICAgIF9yZWFjdDJbJ2RlZmF1bHQnXS5jcmVhdGVFbGVtZW50KF9pY29uc0Nsb3NlMlsnZGVmYXVsdCddLCBudWxsKVxuICAgICAgICAgICAgKVxuICAgICAgICAgICk7XG4gICAgICAgIH0pO1xuXG4gICAgICAgIGNvbnRlbnQgPSBfcmVhY3QyWydkZWZhdWx0J10uY3JlYXRlRWxlbWVudChcbiAgICAgICAgICAndWwnLFxuICAgICAgICAgIHsgY2xhc3NOYW1lOiAnZHJvcHpvbmVfX3NlbGVjdGVkLWZpbGVzJywgb25DbGljazogdGhpcy5oYW5kbGVGaWxlc0NsaWNrIH0sXG4gICAgICAgICAgZmlsZXNcbiAgICAgICAgKTtcbiAgICAgIH1cblxuICAgICAgcmV0dXJuIGNvbnRlbnQ7XG4gICAgfVxuICB9LCB7XG4gICAga2V5OiAnaGFuZGxlQWRkVG9ycmVudHMnLFxuICAgIHZhbHVlOiBmdW5jdGlvbiBoYW5kbGVBZGRUb3JyZW50cygpIHtcbiAgICAgIGlmICghdGhpcy5zdGF0ZS5maWxlcyB8fCB0aGlzLnN0YXRlLmZpbGVzLmxlbmd0aCA9PT0gMCkge1xuICAgICAgICByZXR1cm47XG4gICAgICB9XG5cbiAgICAgIHZhciBmaWxlRGF0YSA9IG5ldyBGb3JtRGF0YSgpO1xuXG4gICAgICB0aGlzLnN0YXRlLmZpbGVzLmZvckVhY2goZnVuY3Rpb24gKGZpbGUpIHtcbiAgICAgICAgZmlsZURhdGEuYXBwZW5kKCd0b3JyZW50cycsIGZpbGUpO1xuICAgICAgfSk7XG5cbiAgICAgIGZpbGVEYXRhLmFwcGVuZCgnZGVzdGluYXRpb24nLCB0aGlzLnN0YXRlLmRlc3RpbmF0aW9uKTtcblxuICAgICAgX2FjdGlvbnNUb3JyZW50QWN0aW9uczJbJ2RlZmF1bHQnXS5hZGRUb3JyZW50c0J5RmlsZXMoZmlsZURhdGEsIHRoaXMuc3RhdGUuZGVzdGluYXRpb24pO1xuICAgIH1cbiAgfSwge1xuICAgIGtleTogJ2hhbmRsZURlc3RpbmF0aW9uQ2hhbmdlJyxcbiAgICB2YWx1ZTogZnVuY3Rpb24gaGFuZGxlRGVzdGluYXRpb25DaGFuZ2UoZGVzdGluYXRpb24pIHtcbiAgICAgIHRoaXMuc2V0U3RhdGUoeyBkZXN0aW5hdGlvbjogZGVzdGluYXRpb24gfSk7XG4gICAgfVxuICB9LCB7XG4gICAga2V5OiAncmVuZGVyJyxcbiAgICB2YWx1ZTogZnVuY3Rpb24gcmVuZGVyKCkge1xuICAgICAgcmV0dXJuIF9yZWFjdDJbJ2RlZmF1bHQnXS5jcmVhdGVFbGVtZW50KFxuICAgICAgICAnZGl2JyxcbiAgICAgICAgeyBjbGFzc05hbWU6ICdmb3JtJyB9LFxuICAgICAgICBfcmVhY3QyWydkZWZhdWx0J10uY3JlYXRlRWxlbWVudChcbiAgICAgICAgICAnZGl2JyxcbiAgICAgICAgICB7IGNsYXNzTmFtZTogJ2Zvcm1fX3JvdycgfSxcbiAgICAgICAgICBfcmVhY3QyWydkZWZhdWx0J10uY3JlYXRlRWxlbWVudChcbiAgICAgICAgICAgICdsYWJlbCcsXG4gICAgICAgICAgICB7IGNsYXNzTmFtZTogJ2Zvcm1fX2xhYmVsJyB9LFxuICAgICAgICAgICAgJ1RvcnJlbnRzJ1xuICAgICAgICAgICksXG4gICAgICAgICAgdGhpcy5nZXRNb2RhbENvbnRlbnQoKVxuICAgICAgICApLFxuICAgICAgICBfcmVhY3QyWydkZWZhdWx0J10uY3JlYXRlRWxlbWVudChfQWRkVG9ycmVudHNEZXN0aW5hdGlvbjJbJ2RlZmF1bHQnXSwgeyBvbkNoYW5nZTogdGhpcy5oYW5kbGVEZXN0aW5hdGlvbkNoYW5nZSB9KSxcbiAgICAgICAgX3JlYWN0MlsnZGVmYXVsdCddLmNyZWF0ZUVsZW1lbnQoX01vZGFsQWN0aW9uczJbJ2RlZmF1bHQnXSwgeyBhY3Rpb25zOiB0aGlzLmdldEFjdGlvbnMoKSwgZGlzbWlzczogdGhpcy5wcm9wcy5kaXNtaXNzIH0pXG4gICAgICApO1xuICAgIH1cbiAgfV0pO1xuXG4gIHJldHVybiBBZGRUb3JyZW50cztcbn0pKF9yZWFjdDJbJ2RlZmF1bHQnXS5Db21wb25lbnQpO1xuXG5leHBvcnRzWydkZWZhdWx0J10gPSBBZGRUb3JyZW50cztcbm1vZHVsZS5leHBvcnRzID0gZXhwb3J0c1snZGVmYXVsdCddO1xuXG5cbi8qKioqKioqKioqKioqKioqKlxuICoqIFdFQlBBQ0sgRk9PVEVSXG4gKiogLi9jbGllbnQvc291cmNlL3NjcmlwdHMvY29tcG9uZW50cy9tb2RhbHMvQWRkVG9ycmVudHNCeUZpbGUuanNcbiAqKiBtb2R1bGUgaWQgPSAxNzJcbiAqKiBtb2R1bGUgY2h1bmtzID0gMFxuICoqLyJdLCJzb3VyY2VSb290IjoiIn0="); /***/ }, /* 173 */