UNPKG

easyui-draganddrop

Version:

Drag and drop elements including a file explorer and a rubbish bin.

293 lines (238 loc) 25.7 kB
'use strict'; var _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; }; }(); function _classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError("Cannot call a class as a function"); } } function _possibleConstructorReturn(self, call) { if (!self) { throw new ReferenceError("this hasn't been initialised - super() hasn't been called"); } return call && (typeof call === "object" || typeof call === "function") ? call : self; } function _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; } var easyui = require('easyui'), Element = easyui.Element, window = easyui.window, React = easyui.React; var options = require('../options'), NameButton = require('./nameButton'); var ESCAPE_KEYCODE = 27, START_DRAGGING_DELAY = 175; var DraggableEntry = function (_Element) { _inherits(DraggableEntry, _Element); function DraggableEntry(selector, name, explorer, type) { _classCallCheck(this, DraggableEntry); var _this = _possibleConstructorReturn(this, (DraggableEntry.__proto__ || Object.getPrototypeOf(DraggableEntry)).call(this, selector)); var nameButton = React.createElement( NameButton, { className: 'name' }, name ); _this.explorer = explorer; _this.type = type; _this.timeout = null; _this.topOffset = null; _this.leftOffset = null; _this.nameButton = nameButton; _this.append(nameButton); _this.onMouseDown(_this.mouseDownHandler.bind(_this)); return _this; } _createClass(DraggableEntry, [{ key: 'getName', value: function getName() { return this.nameButton.getName(); } }, { key: 'getExplorer', value: function getExplorer() { return this.explorer; } }, { key: 'getType', value: function getType() { return this.type; } }, { key: 'getPath', value: function getPath() { var path = this.explorer.getDraggableEntryPath(this); return path; } }, { key: 'getCollapsedBounds', value: function getCollapsedBounds() { var bounds = this.getBounds(), collapsedBounds = bounds; /// return collapsedBounds; } }, { key: 'isRootDirectory', value: function isRootDirectory() { return false; } }, { key: 'isOverlappingCollapsedBounds', value: function isOverlappingCollapsedBounds(collapsedBounds) { var bounds = this.getBounds(), overlappingCollapsedBounds = bounds.areOverlapping(collapsedBounds); return overlappingCollapsedBounds; } }, { key: 'setName', value: function setName(name) { this.nameButton.setName(name); } }, { key: 'onDoubleClick', value: function onDoubleClick(handler) { this.nameButton.onDoubleClick(handler); } }, { key: 'startDragging', value: function startDragging(mouseTop, mouseLeft) { var escapeKeyStopsDragging = this.explorer.hasOption(options.ESCAPE_KEY_STOPS_DRAGGING), bounds = this.getBounds(), boundsTop = bounds.getTop(), boundsLeft = bounds.getLeft(); this.topOffset = boundsTop - mouseTop; this.leftOffset = boundsLeft - mouseLeft; if (escapeKeyStopsDragging) { this.on('keydown', this.keyDownHandler.bind(this)); } this.addClass('dragging'); this.drag(mouseTop, mouseLeft); } }, { key: 'stopDragging', value: function stopDragging() { var escapeKeyStopsDragging = this.explorer.hasOption(options.ESCAPE_KEY_STOPS_DRAGGING); if (escapeKeyStopsDragging) { this.off('keydown', this.keyDownHandler.bind(this)); } this.removeClass('dragging'); } }, { key: 'dragging', value: function dragging(mouseTop, mouseLeft) { this.drag(mouseTop, mouseLeft); this.explorer.dragging(this); } }, { key: 'startWaitingToDrag', value: function startWaitingToDrag(mouseTop, mouseLeft, mouseButton) { if (this.timeout === null) { this.timeout = setTimeout(function () { this.timeout = null; var rootDirectory = this.isRootDirectory(), subEntry = !rootDirectory, /// noDragging = this.explorer.hasOption(options.NO_DRAGGING), noDraggingSubEntries = this.explorer.hasOption(options.NO_DRAGGING_SUB_ENTRIES), noDraggingRootDirectory = this.explorer.hasOption(options.NO_DRAGGING_ROOT_DIRECTORY); if (noDragging || subEntry && noDraggingSubEntries || rootDirectory && noDraggingRootDirectory) { return; } var mouseOver = this.isMouseOver(mouseTop, mouseLeft); if (mouseOver) { var startedDragging = this.explorer.startDragging(this); if (startedDragging) { this.startDragging(mouseTop, mouseLeft); } } }.bind(this), START_DRAGGING_DELAY); } } }, { key: 'stopWaitingToDrag', value: function stopWaitingToDrag() { if (this.timeout !== null) { clearTimeout(this.timeout); this.timeout = null; } } }, { key: 'isDragging', value: function isDragging() { var dragging = this.hasClass('dragging'); return dragging; } }, { key: 'isMouseOver', value: function isMouseOver(mouseTop, mouseLeft) { var collapsedBounds = this.getCollapsedBounds(), collapsedBoundsOverlappingMouse = collapsedBounds.isOverlappingMouse(mouseTop, mouseLeft), mouseOver = collapsedBoundsOverlappingMouse; return mouseOver; } }, { key: 'mouseDownHandler', value: function mouseDownHandler(mouseTop, mouseLeft, mouseButton) { window.on('mouseup blur', this.mouseUpHandler.bind(this)); window.onMouseMove(this.mouseMoveHandler.bind(this)); if (mouseButton === Element.LEFT_MOUSE_BUTTON) { var dragging = this.isDragging(); if (!dragging) { this.startWaitingToDrag(mouseTop, mouseLeft); } } } }, { key: 'mouseUpHandler', value: function mouseUpHandler(mouseTop, mouseLeft, mouseButton) { window.off('mouseup blur', this.mouseUpHandler.bind(this)); window.offMouseMove(this.mouseMoveHandler.bind(this)); var dragging = this.isDragging(); if (dragging) { this.explorer.stopDragging(this, function () { this.stopDragging(); }.bind(this)); } else { this.stopWaitingToDrag(); } } }, { key: 'mouseMoveHandler', value: function mouseMoveHandler(mouseTop, mouseLeft, mouseButton) { var dragging = this.isDragging(); if (dragging) { this.dragging(mouseTop, mouseLeft); } } }, { key: 'keyDownHandler', value: function keyDownHandler(event) { var keyCode = event.keyCode || event.which; if (keyCode === ESCAPE_KEYCODE) { var dragging = this.isDragging(); if (dragging) { this.explorer.escapeDragging(); this.stopDragging(); } } } }, { key: 'drag', value: function drag(mouseTop, mouseLeft) { var pageXOffset = window.getPageXOffset(), pageYOffset = window.getPageYOffset(); var top = mouseTop + this.topOffset - pageXOffset, left = mouseLeft + this.leftOffset - pageYOffset; top = top + 'px'; left = left + 'px'; var css = { top: top, left: left }; this.css(css); this.explorer.dragging(this); } }], [{ key: 'fromProperties', value: function fromProperties(Class, properties) { for (var _len = arguments.length, remainingArguments = Array(_len > 2 ? _len - 2 : 0), _key = 2; _key < _len; _key++) { remainingArguments[_key - 2] = arguments[_key]; } return Element.fromProperties.apply(Element, [Class, properties].concat(remainingArguments)); } }]); return DraggableEntry; }(Element); Object.assign(DraggableEntry, { tagName: 'li' }); module.exports = DraggableEntry; //# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIi4uLy4uL2VzNi9leHBsb3Jlci9kcmFnZ2FibGVFbnRyeS5qcyJdLCJuYW1lcyI6WyJlYXN5dWkiLCJyZXF1aXJlIiwiRWxlbWVudCIsIndpbmRvdyIsIlJlYWN0Iiwib3B0aW9ucyIsIk5hbWVCdXR0b24iLCJFU0NBUEVfS0VZQ09ERSIsIlNUQVJUX0RSQUdHSU5HX0RFTEFZIiwiRHJhZ2dhYmxlRW50cnkiLCJzZWxlY3RvciIsIm5hbWUiLCJleHBsb3JlciIsInR5cGUiLCJuYW1lQnV0dG9uIiwidGltZW91dCIsInRvcE9mZnNldCIsImxlZnRPZmZzZXQiLCJhcHBlbmQiLCJvbk1vdXNlRG93biIsIm1vdXNlRG93bkhhbmRsZXIiLCJiaW5kIiwiZ2V0TmFtZSIsInBhdGgiLCJnZXREcmFnZ2FibGVFbnRyeVBhdGgiLCJib3VuZHMiLCJnZXRCb3VuZHMiLCJjb2xsYXBzZWRCb3VuZHMiLCJvdmVybGFwcGluZ0NvbGxhcHNlZEJvdW5kcyIsImFyZU92ZXJsYXBwaW5nIiwic2V0TmFtZSIsImhhbmRsZXIiLCJvbkRvdWJsZUNsaWNrIiwibW91c2VUb3AiLCJtb3VzZUxlZnQiLCJlc2NhcGVLZXlTdG9wc0RyYWdnaW5nIiwiaGFzT3B0aW9uIiwiRVNDQVBFX0tFWV9TVE9QU19EUkFHR0lORyIsImJvdW5kc1RvcCIsImdldFRvcCIsImJvdW5kc0xlZnQiLCJnZXRMZWZ0Iiwib24iLCJrZXlEb3duSGFuZGxlciIsImFkZENsYXNzIiwiZHJhZyIsIm9mZiIsInJlbW92ZUNsYXNzIiwiZHJhZ2dpbmciLCJtb3VzZUJ1dHRvbiIsInNldFRpbWVvdXQiLCJyb290RGlyZWN0b3J5IiwiaXNSb290RGlyZWN0b3J5Iiwic3ViRW50cnkiLCJub0RyYWdnaW5nIiwiTk9fRFJBR0dJTkciLCJub0RyYWdnaW5nU3ViRW50cmllcyIsIk5PX0RSQUdHSU5HX1NVQl9FTlRSSUVTIiwibm9EcmFnZ2luZ1Jvb3REaXJlY3RvcnkiLCJOT19EUkFHR0lOR19ST09UX0RJUkVDVE9SWSIsIm1vdXNlT3ZlciIsImlzTW91c2VPdmVyIiwic3RhcnRlZERyYWdnaW5nIiwic3RhcnREcmFnZ2luZyIsImNsZWFyVGltZW91dCIsImhhc0NsYXNzIiwiZ2V0Q29sbGFwc2VkQm91bmRzIiwiY29sbGFwc2VkQm91bmRzT3ZlcmxhcHBpbmdNb3VzZSIsImlzT3ZlcmxhcHBpbmdNb3VzZSIsIm1vdXNlVXBIYW5kbGVyIiwib25Nb3VzZU1vdmUiLCJtb3VzZU1vdmVIYW5kbGVyIiwiTEVGVF9NT1VTRV9CVVRUT04iLCJpc0RyYWdnaW5nIiwic3RhcnRXYWl0aW5nVG9EcmFnIiwib2ZmTW91c2VNb3ZlIiwic3RvcERyYWdnaW5nIiwic3RvcFdhaXRpbmdUb0RyYWciLCJldmVudCIsImtleUNvZGUiLCJ3aGljaCIsImVzY2FwZURyYWdnaW5nIiwicGFnZVhPZmZzZXQiLCJnZXRQYWdlWE9mZnNldCIsInBhZ2VZT2Zmc2V0IiwiZ2V0UGFnZVlPZmZzZXQiLCJ0b3AiLCJsZWZ0IiwiY3NzIiwiQ2xhc3MiLCJwcm9wZXJ0aWVzIiwicmVtYWluaW5nQXJndW1lbnRzIiwiZnJvbVByb3BlcnRpZXMiLCJPYmplY3QiLCJhc3NpZ24iLCJ0YWdOYW1lIiwibW9kdWxlIiwiZXhwb3J0cyJdLCJtYXBwaW5ncyI6IkFBQUE7Ozs7Ozs7Ozs7QUFFQSxJQUFNQSxTQUFTQyxRQUFRLFFBQVIsQ0FBZjtBQUFBLElBQ01DLFVBQVVGLE9BQU9FLE9BRHZCO0FBQUEsSUFFTUMsU0FBU0gsT0FBT0csTUFGdEI7QUFBQSxJQUdNQyxRQUFRSixPQUFPSSxLQUhyQjs7QUFLQSxJQUFNQyxVQUFVSixRQUFRLFlBQVIsQ0FBaEI7QUFBQSxJQUNNSyxhQUFhTCxRQUFRLGNBQVIsQ0FEbkI7O0FBR0EsSUFBTU0saUJBQWlCLEVBQXZCO0FBQUEsSUFDTUMsdUJBQXVCLEdBRDdCOztJQUdNQyxjOzs7QUFDSiwwQkFBWUMsUUFBWixFQUFzQkMsSUFBdEIsRUFBNEJDLFFBQTVCLEVBQXNDQyxJQUF0QyxFQUE0QztBQUFBOztBQUFBLGdJQUNwQ0gs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MEJ6RixPOztBQTRON0IyRixPQUFPQyxNQUFQLENBQWNyRixjQUFkLEVBQThCO0FBQzVCc0YsV0FBUztBQURtQixDQUE5Qjs7QUFJQUMsT0FBT0MsT0FBUCxHQUFpQnhGLGNBQWpCIiwiZmlsZSI6ImRyYWdnYWJsZUVudHJ5LmpzIiwic291cmNlc0NvbnRlbnQiOlsiJ3VzZSBzdHJpY3QnO1xuXG5jb25zdCBlYXN5dWkgPSByZXF1aXJlKCdlYXN5dWknKSxcbiAgICAgIEVsZW1lbnQgPSBlYXN5dWkuRWxlbWVudCxcbiAgICAgIHdpbmRvdyA9IGVhc3l1aS53aW5kb3csXG4gICAgICBSZWFjdCA9IGVhc3l1aS5SZWFjdDtcblxuY29uc3Qgb3B0aW9ucyA9IHJlcXVpcmUoJy4uL29wdGlvbnMnKSxcbiAgICAgIE5hbWVCdXR0b24gPSByZXF1aXJlKCcuL25hbWVCdXR0b24nKTtcblxuY29uc3QgRVNDQVBFX0tFWUNPREUgPSAyNyxcbiAgICAgIFNUQVJUX0RSQUdHSU5HX0RFTEFZID0gMTc1O1xuXG5jbGFzcyBEcmFnZ2FibGVFbnRyeSBleHRlbmRzIEVsZW1lbnQge1xuICBjb25zdHJ1Y3RvcihzZWxlY3RvciwgbmFtZSwgZXhwbG9yZXIsIHR5cGUpIHtcbiAgICBzdXBlcihzZWxlY3Rvcik7XG5cbiAgICBjb25zdCBuYW1lQnV0dG9uID0gPE5hbWVCdXR0b24gY2xhc3NOYW1lPVwibmFtZVwiPntuYW1lfTwvTmFtZUJ1dHRvbj47XG5cbiAgICB0aGlzLmV4cGxvcmVyID0gZXhwbG9yZXI7XG4gICAgXG4gICAgdGhpcy50eXBlID0gdHlwZTtcblxuICAgIHRoaXMudGltZW91dCA9IG51bGw7XG4gICAgdGhpcy50b3BPZmZzZXQgPSBudWxsO1xuICAgIHRoaXMubGVmdE9mZnNldCA9IG51bGw7XG4gICAgXG4gICAgdGhpcy5uYW1lQnV0dG9uID0gbmFtZUJ1dHRvbjtcbiAgICBcbiAgICB0aGlzLmFwcGVuZChuYW1lQnV0dG9uKTtcblxuICAgIHRoaXMub25Nb3VzZURvd24odGhpcy5tb3VzZURvd25IYW5kbGVyLmJpbmQodGhpcykpO1xuICB9XG5cbiAgZ2V0TmFtZSgpIHsgcmV0dXJuIHRoaXMubmFtZUJ1dHRvbi5nZXROYW1lKCk7IH1cblxuICBnZXRFeHBsb3JlcigpIHtcbiAgICByZXR1cm4gdGhpcy5leHBsb3JlcjtcbiAgfVxuXG4gIGdldFR5cGUoKSB7XG4gICAgcmV0dXJuIHRoaXMudHlwZTtcbiAgfVxuXG4gIGdldFBhdGgoKSB7XG4gICAgY29uc3QgcGF0aCA9IHRoaXMuZXhwbG9yZXIuZ2V0RHJhZ2dhYmxlRW50cnlQYXRoKHRoaXMpO1xuICAgIFxuICAgIHJldHVybiBwYXRoO1xuICB9XG4gIFxuICBnZXRDb2xsYXBzZWRCb3VuZHMoKSB7XG4gICAgY29uc3QgYm91bmRzID0gdGhpcy5nZXRCb3VuZHMoKSxcbiAgICAgICAgICBjb2xsYXBzZWRCb3VuZHMgPSBib3VuZHM7ICAvLy9cblxuICAgIHJldHVybiBjb2xsYXBzZWRCb3VuZHM7XG4gIH1cblxuICBpc1Jvb3REaXJlY3RvcnkoKSB7XG4gICAgcmV0dXJuIGZhbHNlO1xuICB9XG5cbiAgaXNPdmVybGFwcGluZ0NvbGxhcHNlZEJvdW5kcyhjb2xsYXBzZWRCb3VuZHMpIHtcbiAgICBjb25zdCBib3VuZHMgPSB0aGlzLmdldEJvdW5kcygpLFxuICAgICAgICAgIG92ZXJsYXBwaW5nQ29sbGFwc2VkQm91bmRzID0gYm91bmRzLmFyZU92ZXJsYXBwaW5nKGNvbGxhcHNlZEJvdW5kcyk7XG5cbiAgICByZXR1cm4gb3ZlcmxhcHBpbmdDb2xsYXBzZWRCb3VuZHM7XG4gIH1cblxuICBzZXROYW1lKG5hbWUpIHsgdGhpcy5uYW1lQnV0dG9uLnNldE5hbWUobmFtZSk7IH1cblxuICBvbkRvdWJsZUNsaWNrKGhhbmRsZXIpIHsgdGhpcy5uYW1lQnV0dG9uLm9uRG91YmxlQ2xpY2soaGFuZGxlcik7IH1cblxuICBzdGFydERyYWdnaW5nKG1vdXNlVG9wLCBtb3VzZUxlZnQpIHtcbiAgICBjb25zdCBlc2NhcGVLZXlTdG9wc0RyYWdnaW5nID0gdGhpcy5leHBsb3Jlci5oYXNPcHRpb24ob3B0aW9ucy5FU0NBUEVfS0VZX1NUT1BTX0RSQUdHSU5HKSxcbiAgICAgICAgICBib3VuZHMgPSB0aGlzLmdldEJvdW5kcygpLFxuICAgICAgICAgIGJvdW5kc1RvcCA9IGJvdW5kcy5nZXRUb3AoKSxcbiAgICAgICAgICBib3VuZHNMZWZ0ID0gYm91bmRzLmdldExlZnQoKTtcblxuICAgIHRoaXMudG9wT2Zmc2V0ID0gYm91bmRzVG9wIC0gbW91c2VUb3A7XG4gICAgdGhpcy5sZWZ0T2Zmc2V0ID0gYm91bmRzTGVmdCAtIG1vdXNlTGVmdDtcblxuICAgIGlmIChlc2NhcGVLZXlTdG9wc0RyYWdnaW5nKSB7XG4gICAgICB0aGlzLm9uKCdrZXlkb3duJywgdGhpcy5rZXlEb3duSGFuZGxlci5iaW5kKHRoaXMpKTtcbiAgICB9XG5cbiAgICB0aGlzLmFkZENsYXNzKCdkcmFnZ2luZycpO1xuXG4gICAgdGhpcy5kcmFnKG1vdXNlVG9wLCBtb3VzZUxlZnQpO1xuICB9XG5cbiAgc3RvcERyYWdnaW5nKCkge1xuICAgIGNvbnN0IGVzY2FwZUtleVN0b3BzRHJhZ2dpbmcgPSB0aGlzLmV4cGxvcmVyLmhhc09wdGlvbihvcHRpb25zLkVTQ0FQRV9LRVlfU1RPUFNfRFJBR0dJTkcpO1xuXG4gICAgaWYgKGVzY2FwZUtleVN0b3BzRHJhZ2dpbmcpIHtcbiAgICAgIHRoaXMub2ZmKCdrZXlkb3duJywgdGhpcy5rZXlEb3duSGFuZGxlci5iaW5kKHRoaXMpKTtcbiAgICB9XG5cbiAgICB0aGlzLnJlbW92ZUNsYXNzKCdkcmFnZ2luZycpO1xuICB9XG5cbiAgZHJhZ2dpbmcobW91c2VUb3AsIG1vdXNlTGVmdCkge1xuICAgIHRoaXMuZHJhZyhtb3VzZVRvcCwgbW91c2VMZWZ0KTtcblxuICAgIHRoaXMuZXhwbG9yZXIuZHJhZ2dpbmcodGhpcyk7XG4gIH1cblxuICBzdGFydFdhaXRpbmdUb0RyYWcobW91c2VUb3AsIG1vdXNlTGVmdCwgbW91c2VCdXR0b24pIHtcbiAgICBpZiAodGhpcy50aW1lb3V0ID09PSBudWxsKSB7XG4gICAgICB0aGlzLnRpbWVvdXQgPSBzZXRUaW1lb3V0KGZ1bmN0aW9uKCkge1xuICAgICAgICB0aGlzLnRpbWVvdXQgPSBudWxsO1xuXG4gICAgICAgIGNvbnN0IHJvb3REaXJlY3RvcnkgPSB0aGlzLmlzUm9vdERpcmVjdG9yeSgpLFxuICAgICAgICAgICAgICBzdWJFbnRyeSA9ICFyb290RGlyZWN0b3J5LCAgLy8vXG4gICAgICAgICAgICAgIG5vRHJhZ2dpbmcgPSB0aGlzLmV4cGxvcmVyLmhhc09wdGlvbihvcHRpb25zLk5PX0RSQUdHSU5HKSxcbiAgICAgICAgICAgICAgbm9EcmFnZ2luZ1N1YkVudHJpZXMgPSB0aGlzLmV4cGxvcmVyLmhhc09wdGlvbihvcHRpb25zLk5PX0RSQUdHSU5HX1NVQl9FTlRSSUVTKSxcbiAgICAgICAgICAgICAgbm9EcmFnZ2luZ1Jvb3REaXJlY3RvcnkgPSB0aGlzLmV4cGxvcmVyLmhhc09wdGlvbihvcHRpb25zLk5PX0RSQUdHSU5HX1JPT1RfRElSRUNUT1JZKTtcblxuICAgICAgICBpZiAoKG5vRHJhZ2dpbmcpIHx8IChzdWJFbnRyeSAmJiBub0RyYWdnaW5nU3ViRW50cmllcykgfHwgKHJvb3REaXJlY3RvcnkgJiYgbm9EcmFnZ2luZ1Jvb3REaXJlY3RvcnkpKSB7XG4gICAgICAgICAgcmV0dXJuO1xuICAgICAgICB9XG5cbiAgICAgICAgY29uc3QgbW91c2VPdmVyID0gdGhpcy5pc01vdXNlT3Zlcihtb3VzZVRvcCwgbW91c2VMZWZ0KTtcblxuICAgICAgICBpZiAobW91c2VPdmVyKSB7XG4gICAgICAgICAgY29uc3Qgc3RhcnRlZERyYWdnaW5nID0gdGhpcy5leHBsb3Jlci5zdGFydERyYWdnaW5nKHRoaXMpO1xuXG4gICAgICAgICAgaWYgKHN0YXJ0ZWREcmFnZ2luZykge1xuICAgICAgICAgICAgdGhpcy5zdGFydERyYWdnaW5nKG1vdXNlVG9wLCBtb3VzZUxlZnQpO1xuICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgfS5iaW5kKHRoaXMpLCBTVEFSVF9EUkFHR0lOR19ERUxBWSk7XG4gICAgfVxuICB9XG5cbiAgc3RvcFdhaXRpbmdUb0RyYWcoKSB7XG4gICAgaWYgKHRoaXMudGltZW91dCAhPT0gbnVsbCkge1xuICAgICAgY2xlYXJUaW1lb3V0KHRoaXMudGltZW91dCk7XG5cbiAgICAgIHRoaXMudGltZW91dCA9IG51bGw7XG4gICAgfVxuICB9XG5cbiAgaXNEcmFnZ2luZygpIHtcbiAgICBjb25zdCBkcmFnZ2luZyA9IHRoaXMuaGFzQ2xhc3MoJ2RyYWdnaW5nJyk7XG4gICAgXG4gICAgcmV0dXJuIGRyYWdnaW5nO1xuICB9XG5cbiAgaXNNb3VzZU92ZXIobW91c2VUb3AsIG1vdXNlTGVmdCkge1xuICAgIGNvbnN0IGNvbGxhcHNlZEJvdW5kcyA9IHRoaXMuZ2V0Q29sbGFwc2VkQm91bmRzKCksXG4gICAgICAgICAgY29sbGFwc2VkQm91bmRzT3ZlcmxhcHBpbmdNb3VzZSA9IGNvbGxhcHNlZEJvdW5kcy5pc092ZXJsYXBwaW5nTW91c2UobW91c2VUb3AsIG1vdXNlTGVmdCksXG4gICAgICAgICAgbW91c2VPdmVyID0gY29sbGFwc2VkQm91bmRzT3ZlcmxhcHBpbmdNb3VzZTtcblxuICAgIHJldHVybiBtb3VzZU92ZXI7XG4gIH1cblxuICBtb3VzZURvd25IYW5kbGVyKG1vdXNlVG9wLCBtb3VzZUxlZnQsIG1vdXNlQnV0dG9uKSB7XG4gICAgd2luZG93Lm9uKCdtb3VzZXVwIGJsdXInLCB0aGlzLm1vdXNlVXBIYW5kbGVyLmJpbmQodGhpcykpO1xuICAgIFxuICAgIHdpbmRvdy5vbk1vdXNlTW92ZSh0aGlzLm1vdXNlTW92ZUhhbmRsZXIuYmluZCh0aGlzKSk7XG5cbiAgICBpZiAobW91c2VCdXR0b24gPT09IEVsZW1lbnQuTEVGVF9NT1VTRV9CVVRUT04pIHtcbiAgICAgIGNvbnN0IGRyYWdnaW5nID0gdGhpcy5pc0RyYWdnaW5nKCk7XG5cbiAgICAgIGlmICghZHJhZ2dpbmcpIHtcbiAgICAgICAgdGhpcy5zdGFydFdhaXRpbmdUb0RyYWcobW91c2VUb3AsIG1vdXNlTGVmdCk7XG4gICAgICB9XG4gICAgfVxuICB9XG5cbiAgbW91c2VVcEhhbmRsZXIobW91c2VUb3AsIG1vdXNlTGVmdCwgbW91c2VCdXR0b24pIHtcbiAgICB3aW5kb3cub2ZmKCdtb3VzZXVwIGJsdXInLCB0aGlzLm1vdXNlVXBIYW5kbGVyLmJpbmQodGhpcykpO1xuICAgIFxuICAgIHdpbmRvdy5vZmZNb3VzZU1vdmUodGhpcy5tb3VzZU1vdmVIYW5kbGVyLmJpbmQodGhpcykpO1xuXG4gICAgY29uc3QgZHJhZ2dpbmcgPSB0aGlzLmlzRHJhZ2dpbmcoKTtcblxuICAgIGlmIChkcmFnZ2luZykge1xuICAgICAgdGhpcy5leHBsb3Jlci5zdG9wRHJhZ2dpbmcodGhpcywgZnVuY3Rpb24oKSB7XG4gICAgICAgIHRoaXMuc3RvcERyYWdnaW5nKCk7XG4gICAgICB9LmJpbmQodGhpcykpO1xuICAgIH0gZWxzZSB7XG4gICAgICB0aGlzLnN0b3BXYWl0aW5nVG9EcmFnKCk7XG4gICAgfVxuICB9XG5cbiAgbW91c2VNb3ZlSGFuZGxlcihtb3VzZVRvcCwgbW91c2VMZWZ0LCBtb3VzZUJ1dHRvbikge1xuICAgIGNvbnN0IGRyYWdnaW5nID0gdGhpcy5pc0RyYWdnaW5nKCk7XG5cbiAgICBpZiAoZHJhZ2dpbmcpIHtcbiAgICAgIHRoaXMuZHJhZ2dpbmcobW91c2VUb3AsIG1vdXNlTGVmdCk7XG4gICAgfVxuICB9XG5cbiAga2V5RG93bkhhbmRsZXIoZXZlbnQpIHtcbiAgICBjb25zdCBrZXlDb2RlID0gZXZlbnQua2V5Q29kZSB8fCBldmVudC53aGljaDtcblxuICAgIGlmIChrZXlDb2RlID09PSBFU0NBUEVfS0VZQ09ERSkge1xuICAgICAgY29uc3QgZHJhZ2dpbmcgPSB0aGlzLmlzRHJhZ2dpbmcoKTtcblxuICAgICAgaWYgKGRyYWdnaW5nKSB7XG4gICAgICAgIHRoaXMuZXhwbG9yZXIuZXNjYXBlRHJhZ2dpbmcoKTtcblxuICAgICAgICB0aGlzLnN0b3BEcmFnZ2luZygpO1xuICAgICAgfVxuICAgIH1cbiAgfVxuICBcbiAgZHJhZyhtb3VzZVRvcCwgbW91c2VMZWZ0KSB7XG4gICAgY29uc3QgcGFnZVhPZmZzZXQgPSB3aW5kb3cuZ2V0UGFnZVhPZmZzZXQoKSxcbiAgICAgICAgICBwYWdlWU9mZnNldCA9IHdpbmRvdy5nZXRQYWdlWU9mZnNldCgpO1xuICAgIFxuICAgIGxldCB0b3AgPSBtb3VzZVRvcCArIHRoaXMudG9wT2Zmc2V0IC0gcGFnZVhPZmZzZXQsXG4gICAgICAgIGxlZnQgPSBtb3VzZUxlZnQgKyB0aGlzLmxlZnRPZmZzZXQgLSBwYWdlWU9mZnNldDtcblxuICAgIHRvcCA9IGAke3RvcH1weGA7XG4gICAgbGVmdCA9IGAke2xlZnR9cHhgO1xuXG4gICAgY29uc3QgY3NzID0ge1xuICAgICAgdG9wOiB0b3AsXG4gICAgICBsZWZ0OiBsZWZ0XG4gICAgfTtcblxuICAgIHRoaXMuY3NzKGNzcyk7XG5cbiAgICB0aGlzLmV4cGxvcmVyLmRyYWdnaW5nKHRoaXMpO1xuICB9XG4gIFxuICBzdGF0aWMgZnJvbVByb3BlcnRpZXMoQ2xhc3MsIHByb3BlcnRpZXMsIC4uLnJlbWFpbmluZ0FyZ3VtZW50cykge1xuICAgIHJldHVybiBFbGVtZW50LmZyb21Qcm9wZXJ0aWVzKENsYXNzLCBwcm9wZXJ0aWVzLCAuLi5yZW1haW5pbmdBcmd1bWVudHMpO1xuICB9XG59XG5cbk9iamVjdC5hc3NpZ24oRHJhZ2dhYmxlRW50cnksIHtcbiAgdGFnTmFtZTogJ2xpJ1xufSk7XG5cbm1vZHVsZS5leHBvcnRzID0gRHJhZ2dhYmxlRW50cnk7XG4iXX0=