UNPKG

easyui-draganddrop

Version:

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

479 lines (375 loc) 43.2 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; }; }(); var _get = function get(object, property, receiver) { 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 { return get(parent, property, receiver); } } else if ("value" in desc) { return desc.value; } else { var getter = desc.get; if (getter === undefined) { return undefined; } return getter.call(receiver); } }; 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'), React = easyui.React; var util = require('../../util'), Entry = require('../entry'), Entries = require('../entries'), ToggleButton = require('../toggleButton'), DraggableEntry = require('../draggableEntry'); var Directory = function (_DraggableEntry) { _inherits(Directory, _DraggableEntry); function Directory(selector, name, explorer) { var collapsed = arguments.length > 3 && arguments[3] !== undefined ? arguments[3] : false; _classCallCheck(this, Directory); var type = Entry.types.DIRECTORY; var _this = _possibleConstructorReturn(this, (Directory.__proto__ || Object.getPrototypeOf(Directory)).call(this, selector, name, explorer, type)); var updateHandler = _this.toggleButtonUpdateHandler.bind(_this), toggleButton = React.createElement(ToggleButton, { updateHandler: updateHandler, className: 'toggle' }), entries = React.createElement(Entries, { Directory: Directory, className: 'entries' }); _this.onDoubleClick(_this.doubleClickHandler.bind(_this)); _this.toggleButton = toggleButton; _this.entries = entries; _this.append(entries); _this.prepend(toggleButton); collapsed ? _this.collapse() : _this.expand(); return _this; } _createClass(Directory, [{ key: 'isDirectory', value: function isDirectory() { return true; } }, { key: 'isBefore', value: function isBefore(entry) { var entryType = entry.getType(); switch (entryType) { case Entry.types.FILE: case Entry.types.MARKER: return true; case Entry.types.DIRECTORY: var name = this.getName(), entryName = entry.getName(), before = name.localeCompare(entryName) < 0; return before; } } }, { key: 'getSubEntries', value: function getSubEntries() { var subEntries = []; this.forEachFile(function (file) { var subEntry = file; /// subEntries.push(subEntry); }); this.forEachDirectory(function (directory) { var subEntry = directory, /// directorySubEntries = directory.getSubEntries(); subEntries.push(subEntry); subEntries = subEntries.concat(directorySubEntries); }); return subEntries; } }, { key: 'getFilePaths', value: function getFilePaths() { var filePaths = []; this.forEachFile(function (file) { var filePath = file.getPath(); filePaths.push(filePath); }); this.forEachDirectory(function (directory) { var directoryFilePaths = directory.getFilePaths(); filePaths = filePaths.concat(directoryFilePaths); }); return filePaths; } }, { key: 'getCollapsedBounds', value: function getCollapsedBounds() { var collapsed = this.isCollapsed(); this.collapse(); var bounds = _get(Directory.prototype.__proto__ || Object.getPrototypeOf(Directory.prototype), 'getBounds', this).call(this), collapsedBounds = bounds; /// if (!collapsed) { this.expand(); } return collapsedBounds; } }, { key: 'isOverlappingDraggableEntry', value: function isOverlappingDraggableEntry(draggableEntry) { var overlappingDraggableEntry = void 0; if (this === draggableEntry) { overlappingDraggableEntry = false; } else { var collapsed = this.isCollapsed(); if (collapsed) { overlappingDraggableEntry = false; } else { var draggableEntryCollapsedBounds = draggableEntry.getCollapsedBounds(), overlappingDraggableEntryCollapsedBounds = _get(Directory.prototype.__proto__ || Object.getPrototypeOf(Directory.prototype), 'isOverlappingCollapsedBounds', this).call(this, draggableEntryCollapsedBounds); overlappingDraggableEntry = overlappingDraggableEntryCollapsedBounds; } } return overlappingDraggableEntry; } }, { key: 'isCollapsed', value: function isCollapsed() { return this.toggleButton.isCollapsed(); } }, { key: 'expand', value: function expand() { this.toggleButton.expand(); } }, { key: 'collapse', value: function collapse() { this.toggleButton.collapse(); } }, { key: 'addFile', value: function addFile(filePath) { var addIfNecessary = true, topmostDirectory = this.topmostDirectory(filePath, addIfNecessary); if (topmostDirectory !== null) { var filePathWithoutTopmostDirectoryName = util.pathWithoutTopmostDirectoryName(filePath); topmostDirectory.addFile(filePathWithoutTopmostDirectoryName); } else { var fileName = filePath, /// entriesFile = this.entries.hasFile(fileName); if (!entriesFile) { var explorer = this.getExplorer(); this.entries.addFile(fileName, explorer); } } } }, { key: 'addDirectory', value: function addDirectory(directoryPath, collapsed) { var addIfNecessary = true, topmostDirectory = this.topmostDirectory(directoryPath, addIfNecessary); if (topmostDirectory !== null) { var directoryPathWithoutTopmostDirectoryName = util.pathWithoutTopmostDirectoryName(directoryPath); topmostDirectory.addDirectory(directoryPathWithoutTopmostDirectoryName, collapsed); } else { var directoryName = directoryPath, /// entriesDirectory = this.entries.hasDirectory(directoryName); if (!entriesDirectory) { var explorer = this.getExplorer(); this.entries.addDirectory(directoryName, explorer, collapsed); } } } }, { key: 'removeFile', value: function removeFile(filePath) { var removeEmptyParentDirectories = null; /// var addIfNecessary = false, topmostDirectory = this.topmostDirectory(filePath, addIfNecessary); if (topmostDirectory !== null) { var filePathWithoutTopmostDirectoryName = util.pathWithoutTopmostDirectoryName(filePath); removeEmptyParentDirectories = topmostDirectory.removeFile(filePathWithoutTopmostDirectoryName); } else { var fileName = filePath, /// entriesFile = this.entries.hasFile(fileName); if (entriesFile) { removeEmptyParentDirectories = this.entries.removeFile(fileName); } } if (removeEmptyParentDirectories === true) { var rootDirectory = this.isRootDirectory(); if (!rootDirectory) { var empty = this.isEmpty(); if (empty) { this.remove(); } } } return removeEmptyParentDirectories; } }, { key: 'removeDirectory', value: function removeDirectory(directoryPath) { var removeEmptyParentDirectories = null; /// var addIfNecessary = false, topmostDirectory = this.topmostDirectory(directoryPath, addIfNecessary); if (topmostDirectory !== null) { var directoryPathWithoutTopmostDirectoryName = util.pathWithoutTopmostDirectoryName(directoryPath); removeEmptyParentDirectories = topmostDirectory.removeDirectory(directoryPathWithoutTopmostDirectoryName); } else { var directoryName = directoryPath, /// entriesDirectory = this.entries.hasDirectory(directoryName); if (entriesDirectory) { removeEmptyParentDirectories = this.entries.removeDirectory(directoryName); } } if (removeEmptyParentDirectories === true) { var rootDirectory = this.isRootDirectory(); if (!rootDirectory) { var empty = this.isEmpty(); if (empty) { this.remove(); } } } return removeEmptyParentDirectories; } }, { key: 'addMarker', value: function addMarker(markerPath, draggableEntryType) { var topmostDirectoryName = util.topmostDirectoryName(markerPath); if (topmostDirectoryName === null) { var markerName = markerPath; /// this.entries.addMarker(markerName, draggableEntryType); } else { var topmostDirectory = this.entries.retrieveDirectory(topmostDirectoryName), markerPathWithoutTopmostDirectoryName = util.pathWithoutTopmostDirectoryName(markerPath); topmostDirectory.addMarker(markerPathWithoutTopmostDirectoryName, draggableEntryType); } } }, { key: 'removeMarker', value: function removeMarker() { var removed = void 0; var entriesMarked = this.entries.isMarked(); if (entriesMarked) { this.entries.removeMarker(); removed = true; } else { removed = this.entries.someDirectory(function (directory) { var removed = directory.removeMarker(); return removed; }); } return removed; } }, { key: 'isMarked', value: function isMarked() { var marked = void 0; var entriesMarked = this.entries.isMarked(); if (entriesMarked) { marked = entriesMarked; } else { var directoryMarked = this.entries.someDirectory(function (directory) { var directoryMarked = directory.isMarked(); return directoryMarked; }); marked = directoryMarked; } return marked; } }, { key: 'isEmpty', value: function isEmpty() { return this.entries.isEmpty(); } }, { key: 'forEachFile', value: function forEachFile(callback) { this.entries.forEachFile(callback); } }, { key: 'forEachDirectory', value: function forEachDirectory(callback) { this.entries.forEachDirectory(callback); } }, { key: 'someDirectory', value: function someDirectory(callback) { this.entries.someDirectory(callback); } }, { key: 'getDraggableEntryPath', value: function getDraggableEntryPath(draggableEntry) { var draggableEntryPath = void 0; var name = this.getName(); if (draggableEntry === this) { draggableEntryPath = name; /// } else { draggableEntryPath = this.entries.getDraggableEntryPath(draggableEntry); if (draggableEntryPath !== null) { draggableEntryPath = name + '/' + draggableEntryPath; } } return draggableEntryPath; } }, { key: 'topmostDirectory', value: function topmostDirectory(path, addIfNecessary) { var topmostDirectory = void 0; var topmostDirectoryName = util.topmostDirectoryName(path); if (topmostDirectoryName === null) { topmostDirectory = null; } else { if (addIfNecessary) { var entriesDirectory = this.entries.hasDirectory(topmostDirectoryName); if (!entriesDirectory) { var collapsed = true, explorer = this.getExplorer(); this.entries.addDirectory(topmostDirectoryName, explorer, collapsed); } } topmostDirectory = this.entries.retrieveDirectory(topmostDirectoryName); } return topmostDirectory; } }, { key: 'getMarkedDirectory', value: function getMarkedDirectory() { var markedDirectory = this.entries.getMarkedDirectory(); if (markedDirectory === null) { var marked = this.isMarked(); if (marked) { markedDirectory = this; } } return markedDirectory; } }, { key: 'getDirectoryOverlappingDraggableEntry', value: function getDirectoryOverlappingDraggableEntry(draggableEntry) { var directoryOverlappingDraggableEntry = null; var overlappingDraggableEntry = this.isOverlappingDraggableEntry(draggableEntry); if (overlappingDraggableEntry) { directoryOverlappingDraggableEntry = this.entries.getDirectoryOverlappingDraggableEntry(draggableEntry); if (directoryOverlappingDraggableEntry === null) { directoryOverlappingDraggableEntry = this; } } return directoryOverlappingDraggableEntry; } }, { key: 'toggleButtonUpdateHandler', value: function toggleButtonUpdateHandler(collapsed) { collapsed ? this.addClass('collapsed') : this.removeClass('collapsed'); } }, { key: 'doubleClickHandler', value: function doubleClickHandler() { this.toggleButton.toggle(); } }], [{ key: 'fromProperties', value: function fromProperties(Class, properties) { if (arguments.length === 1) { properties = Class; Class = Directory; } var _properties = properties, name = _properties.name, explorer = _properties.explorer, collapsed = _properties.collapsed; return DraggableEntry.fromProperties(Class, properties, name, explorer, collapsed); } }]); return Directory; }(DraggableEntry); Object.assign(Directory, { ignoredAttributes: ['name', 'explorer', 'collapsed'] }); module.exports = Directory; //# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIi4uLy4uLy4uL2VzNi9leHBsb3Jlci9kcmFnZ2FibGVFbnRyeS9kaXJlY3RvcnkuanMiXSwibmFtZXMiOlsiZWFzeXVpIiwicmVxdWlyZSIsIlJlYWN0IiwidXRpbCIsIkVudHJ5IiwiRW50cmllcyIsIlRvZ2dsZUJ1dHRvbiIsIkRyYWdnYWJsZUVudHJ5IiwiRGlyZWN0b3J5Iiwic2VsZWN0b3IiLCJuYW1lIiwiZXhwbG9yZXIiLCJjb2xsYXBzZWQiLCJ0eXBlIiwidHlwZXMiLCJESVJFQ1RPUlkiLCJ1cGRhdGVIYW5kbGVyIiwidG9nZ2xlQnV0dG9uVXBkYXRlSGFuZGxlciIsImJpbmQiLCJ0b2dnbGVCdXR0b24iLCJlbnRyaWVzIiwib25Eb3VibGVDbGljayIsImRvdWJsZUNsaWNrSGFuZGxlciIsImFwcGVuZCIsInByZXBlbmQiLCJjb2xsYXBzZSIsImV4cGFuZCIsImVudHJ5IiwiZW50cnlUeXBlIiwiZ2V0VHlwZSIsIkZJTEUiLCJNQVJLRVIiLCJnZXROYW1lIiwiZW50cnlOYW1lIiwiYmVmb3JlIiwibG9jYWxlQ29tcGFyZSIsInN1YkVudHJpZXMiLCJmb3JFYWNoRmlsZSIsImZpbGUiLCJzdWJFbnRyeSIsInB1c2giLCJmb3JFYWNoRGlyZWN0b3J5IiwiZGlyZWN0b3J5IiwiZGlyZWN0b3J5U3ViRW50cmllcyIsImdldFN1YkVudHJpZXMiLCJjb25jYXQiLCJmaWxlUGF0aHMiLCJmaWxlUGF0aCIsImdldFBhdGgiLCJkaXJlY3RvcnlGaWxlUGF0aHMiLCJnZXRGaWxlUGF0aHMiLCJpc0NvbGxhcHNlZCIsImJvdW5kcyIsImNvbGxhcHNlZEJvdW5kcyIsImRyYWdnYWJsZUVudHJ5Iiwib3ZlcmxhcHBpbmdEcmFnZ2FibGVFbnRyeSIsImRyYWdnYWJsZUVudHJ5Q29sbGFwc2VkQm91bmRzIiwiZ2V0Q29sbGFwc2VkQm91bmRzIiwib3ZlcmxhcHBpbmdEcmFnZ2FibGVFbnRyeUNvbGxhcHNlZEJvdW5kcyIsImFkZElmTmVjZXNzYXJ5IiwidG9wbW9zdERpcmVjdG9yeSIsImZpbGVQYXRoV2l0aG91dFRvcG1vc3REaXJlY3RvcnlOYW1lIiwicGF0aFdpdGhvdXRUb3Btb3N0RGlyZWN0b3J5TmFtZSIsImFkZEZpbGUiLCJmaWxlTmFtZSIsImVudHJpZXNGaWxlIiwiaGFzRmlsZSIsImdldEV4cGxvcmVyIiwiZGlyZWN0b3J5UGF0aCIsImRpcmVjdG9yeVBhdGhXaXRob3V0VG9wbW9zdERpcmVjdG9yeU5hbWUiLCJhZGREaXJlY3RvcnkiLCJkaXJlY3RvcnlOYW1lIiwiZW50cmllc0RpcmVjdG9yeSIsImhhc0RpcmVjdG9yeSIsInJlbW92ZUVtcHR5UGFyZW50RGlyZWN0b3JpZXMiLCJyZW1vdmVGaWxlIiwicm9vdERpcmVjdG9yeSIsImlzUm9vdERpcmVjdG9yeSIsImVtcHR5IiwiaXNFbXB0eSIsInJlbW92ZSIsInJlbW92ZURpcmVjdG9yeSIsIm1hcmtlclBhdGgiLCJkcmFnZ2FibGVFbnRyeVR5cGUiLCJ0b3Btb3N0RGlyZWN0b3J5TmFtZSIsIm1hcmtlck5hbWUiLCJhZGRNYXJrZXIiLCJyZXRyaWV2ZURpcmVjdG9yeSIsIm1hcmtlclBhdGhXaXRob3V0VG9wbW9zdERpcmVjdG9yeU5hbWUiLCJyZW1vdmVkIiwiZW50cmllc01hcmtlZCIsImlzTWFya2VkIiwicmVtb3ZlTWFya2VyIiwic29tZURpcmVjdG9yeSIsIm1hcmtlZCIsImRpcmVjdG9yeU1hcmtlZCIsImNhbGxiYWNrIiwiZHJhZ2dhYmxlRW50cnlQYXRoIiwiZ2V0RHJhZ2dhYmxlRW50cnlQYXRoIiwicGF0aCIsIm1hcmtlZERpcmVjdG9yeSIsImdldE1hcmtlZERpcmVjdG9yeSIsImRpcmVjdG9yeU92ZXJsYXBwaW5nRHJhZ2dhYmxlRW50cnkiLCJpc092ZXJsYXBwaW5nRHJhZ2dhYmxlRW50cnkiLCJnZXREaXJlY3RvcnlPdmVybGFwcGluZ0RyYWdnYWJsZUVudHJ5IiwiYWRkQ2xhc3MiLCJyZW1vdmVDbGFzcyIsInRvZ2dsZSIsIkNsYXNzIiwicHJvcGVydGllcyIsImFyZ3VtZW50cyIsImxlbmd0aCIsImZyb21Qcm9wZXJ0aWVzIiwiT2JqZWN0IiwiYXNzaWduIiwiaWdub3JlZEF0dHJpYnV0ZXMiLCJtb2R1bGUiLCJleHBvcnRzIl0sIm1hcHBpbmdzIjoiQUFBQTs7Ozs7Ozs7Ozs7O0FBRUEsSUFBTUEsU0FBU0MsUUFBUSxRQUFSLENBQWY7QUFBQSxJQUNNQyxRQUFRRixPQUFPRSxLQURyQjs7QUFHQSxJQUFNQyxPQUFPRixRQUFRLFlBQVIsQ0FBYjtBQUFBLElBQ01HLFFBQVFILFFBQVEsVUFBUixDQURkO0FBQUEsSUFFTUksVUFBVUosUUFBUSxZQUFSLENBRmhCO0FBQUEsSUFHTUssZUFBZUwsUUFBUSxpQkFBUixDQUhyQjtBQUFBLElBSU1NLGlCQUFpQk4sUUFBUSxtQkFBUixDQUp2Qjs7SUFNTU8sUzs7O0FBQ0oscUJBQVlDLFFBQVosRUFBc0JDLElBQXRCLEVBQTRCQyxRQUE1QixFQUF5RDtBQUFBLFFBQW5CQyxTQUFtQix1RUFBUCxLQUFPOztBQUFBOztBQUN2RCxRQUFNQyxPQUFPVCxNQUFNVSxLQUFOLENBQVlDLFNBQXpCOztBQUR1RCxzSEFHakROLFFBSGlELEVBR3ZDQyxJQUh1QyxFQUdqQ0MsUUFIaUMsRUFHdkJFLElBSHVCOztBQUt2RCxRQUFNRyxnQkFBZ0IsTUFBS0MseUJBQUwsQ0FBK0JDLElBQS9CLE9BQXRCO0FBQUEsUUFDTUMsZUFBZSxvQkFBQyxZQUFELElBQWMsZUFBZUgsYUFBN0IsRUFBNEMsV0FBVSxRQUF0RCxHQURyQjtBQUFBLFFBRU1JLFVBQVUsb0JBQUMsT0FBRCxJQUFTLFdBQVdaLFNBQXBCLEVBQStCLFdBQVUsU0FBekMsR0FGaEI7O0FBSUEsVUFBS2EsYUFBTCxDQUFtQixNQUFLQyxrQkFBTCxDQUF3QkosSUFBeEIsT0FBbkI7O0FBRUEsVUFBS0MsWUFBTCxHQUFvQkEsWUFBcEI7O0FBRUEsVUFBS0MsT0FBTCxHQUFlQSxPQUFmOztBQUVBLFVBQUtHLE1BQUwsQ0FBWUgsT0FBWjs7QUFFQSxVQUFLSSxPQUFMLENBQWFMLFlBQWI7O0FBRUFQ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QixFQUdqQixXQUhpQjtBQURJLENBQXpCOztBQVFBQyxPQUFPQyxPQUFQLEdBQWlCN0csU0FBakIiLCJmaWxlIjoiZGlyZWN0b3J5LmpzIiwic291cmNlc0NvbnRlbnQiOlsiJ3VzZSBzdHJpY3QnO1xuXG5jb25zdCBlYXN5dWkgPSByZXF1aXJlKCdlYXN5dWknKSxcbiAgICAgIFJlYWN0ID0gZWFzeXVpLlJlYWN0O1xuXG5jb25zdCB1dGlsID0gcmVxdWlyZSgnLi4vLi4vdXRpbCcpLFxuICAgICAgRW50cnkgPSByZXF1aXJlKCcuLi9lbnRyeScpLFxuICAgICAgRW50cmllcyA9IHJlcXVpcmUoJy4uL2VudHJpZXMnKSxcbiAgICAgIFRvZ2dsZUJ1dHRvbiA9IHJlcXVpcmUoJy4uL3RvZ2dsZUJ1dHRvbicpLFxuICAgICAgRHJhZ2dhYmxlRW50cnkgPSByZXF1aXJlKCcuLi9kcmFnZ2FibGVFbnRyeScpO1xuXG5jbGFzcyBEaXJlY3RvcnkgZXh0ZW5kcyBEcmFnZ2FibGVFbnRyeSB7XG4gIGNvbnN0cnVjdG9yKHNlbGVjdG9yLCBuYW1lLCBleHBsb3JlciwgY29sbGFwc2VkID0gZmFsc2UpIHtcbiAgICBjb25zdCB0eXBlID0gRW50cnkudHlwZXMuRElSRUNUT1JZO1xuXG4gICAgc3VwZXIoc2VsZWN0b3IsIG5hbWUsIGV4cGxvcmVyLCB0eXBlKTtcbiAgICBcbiAgICBjb25zdCB1cGRhdGVIYW5kbGVyID0gdGhpcy50b2dnbGVCdXR0b25VcGRhdGVIYW5kbGVyLmJpbmQodGhpcyksXG4gICAgICAgICAgdG9nZ2xlQnV0dG9uID0gPFRvZ2dsZUJ1dHRvbiB1cGRhdGVIYW5kbGVyPXt1cGRhdGVIYW5kbGVyfSBjbGFzc05hbWU9XCJ0b2dnbGVcIiAvPixcbiAgICAgICAgICBlbnRyaWVzID0gPEVudHJpZXMgRGlyZWN0b3J5PXtEaXJlY3Rvcnl9IGNsYXNzTmFtZT1cImVudHJpZXNcIiAvPjtcbiAgICBcbiAgICB0aGlzLm9uRG91YmxlQ2xpY2sodGhpcy5kb3VibGVDbGlja0hhbmRsZXIuYmluZCh0aGlzKSk7XG5cbiAgICB0aGlzLnRvZ2dsZUJ1dHRvbiA9IHRvZ2dsZUJ1dHRvbjtcblxuICAgIHRoaXMuZW50cmllcyA9IGVudHJpZXM7XG5cbiAgICB0aGlzLmFwcGVuZChlbnRyaWVzKTtcblxuICAgIHRoaXMucHJlcGVuZCh0b2dnbGVCdXR0b24pO1xuXG4gICAgY29sbGFwc2VkID9cbiAgICAgIHRoaXMuY29sbGFwc2UoKSA6XG4gICAgICAgIHRoaXMuZXhwYW5kKCk7XG4gIH1cblxuICBpc0RpcmVjdG9yeSgpIHtcbiAgICByZXR1cm4gdHJ1ZTtcbiAgfVxuXG4gIGlzQmVmb3JlKGVudHJ5KSB7XG4gICAgY29uc3QgZW50cnlUeXBlID0gZW50cnkuZ2V0VHlwZSgpO1xuXG4gICAgc3dpdGNoIChlbnRyeVR5cGUpIHtcbiAgICAgIGNhc2UgRW50cnkudHlwZXMuRklMRTpcbiAgICAgIGNhc2UgRW50cnkudHlwZXMuTUFSS0VSOlxuXG4gICAgICAgIHJldHVybiB0cnVlO1xuXG4gICAgICBjYXNlIEVudHJ5LnR5cGVzLkRJUkVDVE9SWTpcblxuICAgICAgICBjb25zdCBuYW1lID0gdGhpcy5nZXROYW1lKCksXG4gICAgICAgICAgICAgIGVudHJ5TmFtZSA9IGVudHJ5LmdldE5hbWUoKSxcbiAgICAgICAgICAgICAgYmVmb3JlID0gbmFtZS5sb2NhbGVDb21wYXJlKGVudHJ5TmFtZSkgPCAwO1xuXG4gICAgICAgIHJldHVybiBiZWZvcmU7XG4gICAgfVxuICB9XG4gIFxuICBnZXRTdWJFbnRyaWVzKCkge1xuICAgIGxldCBzdWJFbnRyaWVzID0gW107XG5cbiAgICB0aGlzLmZvckVhY2hGaWxlKGZ1bmN0aW9uKGZpbGUpIHtcbiAgICAgIGNvbnN0IHN1YkVudHJ5ID0gZmlsZTsgLy8vXG5cbiAgICAgIHN1YkVudHJpZXMucHVzaChzdWJFbnRyeSk7XG4gICAgfSk7XG5cbiAgICB0aGlzLmZvckVhY2hEaXJlY3RvcnkoZnVuY3Rpb24oZGlyZWN0b3J5KSB7XG4gICAgICBjb25zdCBzdWJFbnRyeSA9IGRpcmVjdG9yeSwgLy8vXG4gICAgICAgICAgICBkaXJlY3RvcnlTdWJFbnRyaWVzID0gZGlyZWN0b3J5LmdldFN1YkVudHJpZXMoKTtcblxuICAgICAgc3ViRW50cmllcy5wdXNoKHN1YkVudHJ5KTtcbiAgICAgIFxuICAgICAgc3ViRW50cmllcyA9IHN1YkVudHJpZXMuY29uY2F0KGRpcmVjdG9yeVN1YkVudHJpZXMpO1xuICAgIH0pO1xuXG4gICAgcmV0dXJuIHN1YkVudHJpZXM7XG4gIH1cblxuICBnZXRGaWxlUGF0aHMoKSB7XG4gICAgbGV0IGZpbGVQYXRocyA9IFtdO1xuXG4gICAgdGhpcy5mb3JFYWNoRmlsZShmdW5jdGlvbihmaWxlKSB7XG4gICAgICBjb25zdCBmaWxlUGF0aCA9IGZpbGUuZ2V0UGF0aCgpO1xuXG4gICAgICBmaWxlUGF0aHMucHVzaChmaWxlUGF0aCk7XG4gICAgfSk7XG5cbiAgICB0aGlzLmZvckVhY2hEaXJlY3RvcnkoZnVuY3Rpb24oZGlyZWN0b3J5KSB7XG4gICAgICBjb25zdCBkaXJlY3RvcnlGaWxlUGF0aHMgPSBkaXJlY3RvcnkuZ2V0RmlsZVBhdGhzKCk7XG4gICAgICBcbiAgICAgIGZpbGVQYXRocyA9IGZpbGVQYXRocy5jb25jYXQoZGlyZWN0b3J5RmlsZVBhdGhzKTtcbiAgICB9KTtcblxuICAgIHJldHVybiBmaWxlUGF0aHM7XG4gIH1cblxuICBnZXRDb2xsYXBzZWRCb3VuZHMoKSB7XG4gICAgY29uc3QgY29sbGFwc2VkID0gdGhpcy5pc0NvbGxhcHNlZCgpO1xuXG4gICAgdGhpcy5jb2xsYXBzZSgpO1xuXG4gICAgY29uc3QgYm91bmRzID0gc3VwZXIuZ2V0Qm91bmRzKCksXG4gICAgICAgIGNvbGxhcHNlZEJvdW5kcyA9IGJvdW5kczsgIC8vL1xuXG4gICAgaWYgKCFjb2xsYXBzZWQpIHtcbiAgICAgIHRoaXMuZXhwYW5kKCk7XG4gICAgfVxuXG4gICAgcmV0dXJuIGNvbGxhcHNlZEJvdW5kcztcbiAgfVxuXG4gIGlzT3ZlcmxhcHBpbmdEcmFnZ2FibGVFbnRyeShkcmFnZ2FibGVFbnRyeSkge1xuICAgIGxldCBvdmVybGFwcGluZ0RyYWdnYWJsZUVudHJ5O1xuICAgIFxuICAgIGlmICh0aGlzID09PSBkcmFnZ2FibGVFbnRyeSkge1xuICAgICAgb3ZlcmxhcHBpbmdEcmFnZ2FibGVFbnRyeSA9IGZhbHNlO1xuICAgIH0gZWxzZSB7XG4gICAgICBjb25zdCBjb2xsYXBzZWQgPSB0aGlzLmlzQ29sbGFwc2VkKCk7XG4gICAgICBcbiAgICAgIGlmIChjb2xsYXBzZWQpIHtcbiAgICAgICAgb3ZlcmxhcHBpbmdEcmFnZ2FibGVFbnRyeSA9IGZhbHNlO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgY29uc3QgZHJhZ2dhYmxlRW50cnlDb2xsYXBzZWRCb3VuZHMgPSBkcmFnZ2FibGVFbnRyeS5nZXRDb2xsYXBzZWRCb3VuZHMoKSxcbiAgICAgICAgICAgIG92ZXJsYXBwaW5nRHJhZ2dhYmxlRW50cnlDb2xsYXBzZWRCb3VuZHMgPSBzdXBlci5pc092ZXJsYXBwaW5nQ29sbGFwc2VkQm91bmRzKGRyYWdnYWJsZUVudHJ5Q29sbGFwc2VkQm91bmRzKTtcblxuICAgICAgICBvdmVybGFwcGluZ0RyYWdnYWJsZUVudHJ5ID0gb3ZlcmxhcHBpbmdEcmFnZ2FibGVFbnRyeUNvbGxhcHNlZEJvdW5kcztcbiAgICAgIH1cbiAgICB9XG5cbiAgICByZXR1cm4gb3ZlcmxhcHBpbmdEcmFnZ2FibGVFbnRyeTtcbiAgfVxuXG4gIGlzQ29sbGFwc2VkKCkgeyByZXR1cm4gdGhpcy50b2dnbGVCdXR0b24uaXNDb2xsYXBzZWQoKTsgfVxuXG4gIGV4cGFuZCgpIHsgdGhpcy50b2dnbGVCdXR0b24uZXhwYW5kKCk7IH1cblxuICBjb2xsYXBzZSgpIHsgdGhpcy50b2dnbGVCdXR0b24uY29sbGFwc2UoKTsgfVxuXG4gIGFkZEZpbGUoZmlsZVBhdGgpIHtcbiAgICBjb25zdCBhZGRJZk5lY2Vzc2FyeSA9IHRydWUsXG4gICAgICAgICAgdG9wbW9zdERpcmVjdG9yeSA9IHRoaXMudG9wbW9zdERpcmVjdG9yeShmaWxlUGF0aCwgYWRkSWZOZWNlc3NhcnkpO1xuXG4gICAgaWYgKHRvcG1vc3REaXJlY3RvcnkgIT09IG51bGwpIHtcbiAgICAgIGNvbnN0IGZpbGVQYXRoV2l0aG91dFRvcG1vc3REaXJlY3RvcnlOYW1lID0gdXRpbC5wYXRoV2l0aG91dFRvcG1vc3REaXJlY3RvcnlOYW1lKGZpbGVQYXRoKTtcblxuICAgICAgdG9wbW9zdERpcmVjdG9yeS5hZGRGaWxlKGZpbGVQYXRoV2l0aG91dFRvcG1vc3REaXJlY3RvcnlOYW1lKTtcbiAgICB9IGVsc2Uge1xuICAgICAgY29uc3QgZmlsZU5hbWUgPSBmaWxlUGF0aCwgIC8vL1xuICAgICAgICAgICAgZW50cmllc0ZpbGUgPSB0aGlzLmVudHJpZXMuaGFzRmlsZShmaWxlTmFtZSk7XG5cbiAgICAgIGlmICghZW50cmllc0ZpbGUpIHtcbiAgICAgICAgY29uc3QgZXhwbG9yZXIgPSB0aGlzLmdldEV4cGxvcmVyKCk7XG4gICAgICAgIFxuICAgICAgICB0aGlzLmVudHJpZXMuYWRkRmlsZShmaWxlTmFtZSwgZXhwbG9yZXIpO1xuICAgICAgfVxuICAgIH1cbiAgfVxuXG4gIGFkZERpcmVjdG9yeShkaXJlY3RvcnlQYXRoLCBjb2xsYXBzZWQpIHtcbiAgICBjb25zdCBhZGRJZk5lY2Vzc2FyeSA9IHRydWUsXG4gICAgICAgICAgdG9wbW9zdERpcmVjdG9yeSA9IHRoaXMudG9wbW9zdERpcmVjdG9yeShkaXJlY3RvcnlQYXRoLCBhZGRJZk5lY2Vzc2FyeSk7XG5cbiAgICBpZiAodG9wbW9zdERpcmVjdG9yeSAhPT0gbnVsbCkge1xuICAgICAgY29uc3QgZGlyZWN0b3J5UGF0aFdpdGhvdXRUb3Btb3N0RGlyZWN0b3J5TmFtZSA9IHV0aWwucGF0aFdpdGhvdXRUb3Btb3N0RGlyZWN0b3J5TmFtZShkaXJlY3RvcnlQYXRoKTtcblxuICAgICAgdG9wbW9zdERpcmVjdG9yeS5hZGREaXJlY3RvcnkoZGlyZWN0b3J5UGF0aFdpdGhvdXRUb3Btb3N0RGlyZWN0b3J5TmFtZSwgY29sbGFwc2VkKTtcbiAgICB9IGVsc2Uge1xuICAgICAgY29uc3QgZGlyZWN0b3J5TmFtZSA9IGRpcmVjdG9yeVBhdGgsICAvLy9cbiAgICAgICAgICAgIGVudHJpZXNEaXJlY3RvcnkgPSB0aGlzLmVudHJpZXMuaGFzRGlyZWN0b3J5KGRpcmVjdG9yeU5hbWUpO1xuXG4gICAgICBpZiAoIWVudHJpZXNEaXJlY3RvcnkpIHtcbiAgICAgICAgY29uc3QgZXhwbG9yZXIgPSB0aGlzLmdldEV4cGxvcmVyKCk7XG5cbiAgICAgICAgdGhpcy5lbnRyaWVzLmFkZERpcmVjdG9yeShkaXJlY3RvcnlOYW1lLCBleHBsb3JlciwgY29sbGFwc2VkKTtcbiAgICAgIH1cbiAgICB9XG4gIH1cblxuICByZW1vdmVGaWxlKGZpbGVQYXRoKSB7XG4gICAgbGV0IHJlbW92ZUVtcHR5UGFyZW50RGlyZWN0b3JpZXMgPSBudWxsOyAvLy9cblxuICAgIGNvbnN0IGFkZElmTmVjZXNzYXJ5ID0gZmFsc2UsXG4gICAgICAgICAgdG9wbW9zdERpcmVjdG9yeSA9IHRoaXMudG9wbW9zdERpcmVjdG9yeShmaWxlUGF0aCwgYWRkSWZOZWNlc3NhcnkpO1xuXG4gICAgaWYgKHRvcG1vc3REaXJlY3RvcnkgIT09IG51bGwpIHtcbiAgICAgIGNvbnN0IGZpbGVQYXRoV2l0aG91dFRvcG1vc3REaXJlY3RvcnlOYW1lID0gdXRpbC5wYXRoV2l0aG91dFRvcG1vc3REaXJlY3RvcnlOYW1lKGZpbGVQYXRoKTtcblxuICAgICAgcmVtb3ZlRW1wdHlQYXJlbnREaXJlY3RvcmllcyA9IHRvcG1vc3REaXJlY3RvcnkucmVtb3ZlRmlsZShmaWxlUGF0aFdpdGhvdXRUb3Btb3N0RGlyZWN0b3J5TmFtZSk7XG4gICAgfSBlbHNlIHtcbiAgICAgIGNvbnN0IGZpbGVOYW1lID0gZmlsZVBhdGgsICAvLy9cbiAgICAgICAgICAgIGVudHJpZXNGaWxlID0gdGhpcy5lbnRyaWVzLmhhc0ZpbGUoZmlsZU5hbWUpO1xuXG4gICAgICBpZiAoZW50cmllc0ZpbGUpIHtcbiAgICAgICAgcmVtb3ZlRW1wdHlQYXJlbnREaXJlY3RvcmllcyA9IHRoaXMuZW50cmllcy5yZW1vdmVGaWxlKGZpbGVOYW1lKTtcbiAgICAgIH1cbiAgICB9XG5cbiAgICBpZiAocmVtb3ZlRW1wdHlQYXJlbnREaXJlY3RvcmllcyA9PT0gdHJ1ZSkge1xuICAgICAgY29uc3Qgcm9vdERpcmVjdG9yeSA9IHRoaXMuaXNSb290RGlyZWN0b3J5KCk7XG5cbiAgICAgIGlmICghcm9vdERpcmVjdG9yeSkge1xuICAgICAgICBjb25zdCBlbXB0eSA9IHRoaXMuaXNFbXB0eSgpO1xuXG4gICAgICAgIGlmIChlbXB0eSkge1xuICAgICAgICAgIHRoaXMucmVtb3ZlKCk7XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICB9XG5cbiAgICByZXR1cm4gcmVtb3ZlRW1wdHlQYXJlbnREaXJlY3RvcmllcztcbiAgfVxuXG4gIHJlbW92ZURpcmVjdG9yeShkaXJlY3RvcnlQYXRoKSB7XG4gICAgbGV0IHJlbW92ZUVtcHR5UGFyZW50RGlyZWN0b3JpZXMgPSBudWxsOyAvLy9cblxuICAgIGNvbnN0IGFkZElmTmVjZXNzYXJ5ID0gZmFsc2UsXG4gICAgICAgICAgdG9wbW9zdERpcmVjdG9yeSA9IHRoaXMudG9wbW9zdERpcmVjdG9yeShkaXJlY3RvcnlQYXRoLCBhZGRJZk5lY2Vzc2FyeSk7XG5cbiAgICBpZiAodG9wbW9zdERpcmVjdG9yeSAhPT0gbnVsbCkge1xuICAgICAgY29uc3QgZGlyZWN0b3J5UGF0aFdpdGhvdXRUb3Btb3N0RGlyZWN0b3J5TmFtZSA9IHV0aWwucGF0aFdpdGhvdXRUb3Btb3N0RGlyZWN0b3J5TmFtZShkaXJlY3RvcnlQYXRoKTtcblxuICAgICAgcmVtb3ZlRW1wdHlQYXJlbnREaXJlY3RvcmllcyA9IHRvcG1vc3REaXJlY3RvcnkucmVtb3ZlRGlyZWN0b3J5KGRpcmVjdG9yeVBhdGhXaXRob3V0VG9wbW9zdERpcmVjdG9yeU5hbWUpO1xuICAgIH0gZWxzZSB7XG4gICAgICBjb25zdCBkaXJlY3RvcnlOYW1lID0gZGlyZWN0b3J5UGF0aCwgIC8vL1xuICAgICAgICAgIGVudHJpZXNEaXJlY3RvcnkgPSB0aGlzLmVudHJpZXMuaGFzRGlyZWN0b3J5KGRpcmVjdG9yeU5hbWUpO1xuXG4gICAgICBpZiAoZW50cmllc0RpcmVjdG9yeSkge1xuICAgICAgICByZW1vdmVFbXB0eVBhcmVudERpcmVjdG9yaWVzID0gdGhpcy5lbnRyaWVzLnJlbW92ZURpcmVjdG9yeShkaXJlY3RvcnlOYW1lKTtcbiAgICAgIH1cbiAgICB9XG5cbiAgICBpZiAocmVtb3ZlRW1wdHlQYXJlbnREaXJlY3RvcmllcyA9PT0gdHJ1ZSkge1xuICAgICAgY29uc3Qgcm9vdERpcmVjdG9yeSA9IHRoaXMuaXNSb290RGlyZWN0b3J5KCk7XG5cbiAgICAgIGlmICghcm9vdERpcmVjdG9yeSkge1xuICAgICAgICBjb25zdCBlbXB0eSA9IHRoaXMuaXNFbXB0eSgpO1xuXG4gICAgICAgIGlmIChlbXB0eSkge1xuICAgICAgICAgIHRoaXMucmVtb3ZlKCk7XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICB9XG5cbiAgICByZXR1cm4gcmVtb3ZlRW1wdHlQYXJlbnREaXJlY3RvcmllcztcbiAgfVxuICBcbiAgYWRkTWFya2VyKG1hcmtlclBhdGgsIGRyYWdnYWJsZUVudHJ5VHlwZSkge1xuICAgIGNvbnN0IHRvcG1vc3REaXJlY3RvcnlOYW1lID0gdXRpbC50b3Btb3N0RGlyZWN0b3J5TmFtZShtYXJrZXJQYXRoKTtcblxuICAgIGlmICh0b3Btb3N0RGlyZWN0b3J5TmFtZSA9PT0gbnVsbCkge1xuICAgICAgY29uc3QgbWFya2VyTmFtZSA9IG1hcmtlclBhdGg7ICAvLy9cblxuICAgICAgdGhpcy5lbnRyaWVzLmFkZE1hcmtlcihtYXJrZXJOYW1lLCBkcmFnZ2FibGVFbnRyeVR5cGUpO1xuICAgIH0gZWxzZSB7XG4gICAgICBjb25zdCB0b3Btb3N0RGlyZWN0b3J5ID0gdGhpcy5lbnRyaWVzLnJldHJpZXZlRGlyZWN0b3J5KHRvcG1vc3REaXJlY3RvcnlOYW1lKSxcbiAgICAgICAgICBtYXJrZXJQYXRoV2l0aG91dFRvcG1vc3REaXJlY3RvcnlOYW1lID0gdXRpbC5wYXRoV2l0aG91dFRvcG1vc3REaXJlY3RvcnlOYW1lKG1hcmtlclBhdGgpO1xuXG4gICAgICB0b3Btb3N0RGlyZWN0b3J5LmFkZE1hcmtlcihtYXJrZXJQYXRoV2l0aG91dFRvcG1vc3REaXJlY3RvcnlOYW1lLCBkcmFnZ2FibGVFbnRyeVR5cGUpO1xuICAgIH1cbiAgfVxuXG4gIHJlbW92ZU1hcmtlcigpIHtcbiAgICBsZXQgcmVtb3ZlZDtcblxuICAgIGNvbnN0IGVudHJpZXNNYXJrZWQgPSB0aGlzLmVudHJpZXMuaXNNYXJrZWQoKTtcbiAgICBcbiAgICBpZiAoZW50cmllc01hcmtlZCkge1xuICAgICAgdGhpcy5lbnRyaWVzLnJlbW92ZU1hcmtlcigpO1xuXG4gICAgICByZW1vdmVkID0gdHJ1ZTtcbiAgICB9IGVsc2Uge1xuICAgICAgcmVtb3ZlZCA9IHRoaXMuZW50cmllcy5zb21lRGlyZWN0b3J5KGZ1bmN0aW9uKGRpcmVjdG9yeSkge1xuICAgICAgICBjb25zdCByZW1vdmVkID0gZGlyZWN0b3J5LnJlbW92ZU1hcmtlcigpO1xuICAgICAgICBcbiAgICAgICAgcmV0dXJuIHJlbW92ZWQ7XG4gICAgICB9KTtcbiAgICB9XG4gICAgXG4gICAgcmV0dXJuIHJlbW92ZWQ7XG4gIH1cblxuICBpc01hcmtlZCgpIHtcbiAgICBsZXQgbWFya2VkO1xuXG4gICAgY29uc3QgZW50cmllc01hcmtlZCA9IHRoaXMuZW50cmllcy5pc01hcmtlZCgpO1xuICAgIFxuICAgIGlmIChlbnRyaWVzTWFya2VkKSB7XG4gICAgICBtYXJrZWQgPSBlbnRyaWVzTWFya2VkO1xuICAgIH0gZWxzZSB7XG4gICAgICBjb25zdCBkaXJlY3RvcnlNYXJrZWQgPSB0aGlzLmVudHJpZXMuc29tZURpcmVjdG9yeShmdW5jdGlvbihkaXJlY3RvcnkpIHtcbiAgICAgICAgY29uc3QgZGlyZWN0b3J5TWFya2VkID0gZGlyZWN0b3J5LmlzTWFya2VkKCk7XG4gICAgICAgIFxuICAgICAgICByZXR1cm4gZGlyZWN0b3J5TWFya2VkO1xuICAgICAgfSk7XG5cbiAgICAgIG1hcmtlZCA9IGRpcmVjdG9yeU1hcmtlZDtcbiAgICB9XG4gICAgXG4gICAgcmV0dXJuIG1hcmtlZDtcbiAgfVxuXG4gIGlzRW1wdHkoKSB7IHJldHVybiB0aGlzLmVudHJpZXMuaXNFbXB0eSgpOyB9XG5cbiAgZm9yRWFjaEZpbGUoY2FsbGJhY2spIHsgdGhpcy5lbnRyaWVzLmZvckVhY2hGaWxlKGNhbGxiYWNrKTsgfVxuXG4gIGZvckVhY2hEaXJlY3RvcnkoY2FsbGJhY2spIHsgdGhpcy5lbnRyaWVzLmZvckVhY2hEaXJlY3RvcnkoY2FsbGJhY2spOyB9XG5cbiAgc29tZURpcmVjdG9yeShjYWxsYmFjaykgeyB0aGlzLmVudHJpZXMuc29tZURpcmVjdG9yeShjYWxsYmFjayk7IH1cblxuICBnZXREcmFnZ2FibGVFbnRyeVBhdGgoZHJhZ2dhYmxlRW50cnkpIHtcbiAgICBsZXQgZHJhZ2dhYmxlRW50cnlQYXRoO1xuXG4gICAgY29uc3QgbmFtZSA9IHRoaXMuZ2V0TmFtZSgpO1xuXG4gICAgaWYgKGRyYWdnYWJsZUVudHJ5ID09PSB0aGlzKSB7XG4gICAgICBkcmFnZ2FibGVFbnRyeVBhdGggPSBuYW1lOyAgLy8vXG4gICAgfSBlbHNlIHtcbiAgICAgIGRyYWdnYWJsZUVudHJ5UGF0aCA9IHRoaXMuZW50cmllcy5nZXREcmFnZ2FibGVFbnRyeVBhdGgoZHJhZ2dhYmxlRW50cnkpO1xuXG4gICAgICBpZiAoZHJhZ2dhYmxlRW50cnlQYXRoICE9PSBudWxsKSB7XG4gICAgICAgIGRyYWdnYWJsZUVudHJ5UGF0aCA9IG5hbWUgKyAnLycgKyBkcmFnZ2FibGVFbnRyeVBhdGg7XG4gICAgICB9XG4gICAgfVxuXG4gICAgcmV0dXJuIGRyYWdnYWJsZUVudHJ5UGF0aDtcbiAgfVxuXG4gIHRvcG1vc3REaXJlY3RvcnkocGF0aCwgYWRkSWZOZWNlc3NhcnkpIHtcbiAgICBsZXQgdG9wbW9zdERpcmVjdG9yeTtcblxuICAgIGNvbnN0IHRvcG1vc3REaXJlY3RvcnlOYW1lID0gdXRpbC50b3Btb3N0RGlyZWN0b3J5TmFtZShwYXRoKTtcblxuICAgIGlmICh0b3Btb3N0RGlyZWN0b3J5TmFtZSA9PT0gbnVsbCkge1xuICAgICAgdG9wbW9zdERpcmVjdG9yeSA9IG51bGw7XG4gICAgfSBlbHNlIHtcbiAgICAgIGlmIChhZGRJZk5lY2Vzc2FyeSkge1xuICAgICAgICBjb25zdCBlbnRyaWVzRGlyZWN0b3J5ID0gdGhpcy5lbnRyaWVzLmhhc0RpcmVjdG9yeSh0b3Btb3N0RGlyZWN0b3J5TmFtZSk7XG5cbiAgICAgICAgaWYgKCFlbnRyaWVzRGlyZWN0b3J5KSB7XG4gICAgICAgICAgY29uc3QgY29sbGFwc2VkID0gdHJ1ZSxcbiAgICAgICAgICAgICAgICBleHBsb3JlciA9IHRoaXMuZ2V0RXhwbG9yZXIoKTtcblxuICAgICAgICAgIHRoaXMuZW50cmllcy5hZGREaXJlY3RvcnkodG9wbW9zdERpcmVjdG9yeU5hbWUsIGV4cGxvcmVyLCBjb2xsYXBzZWQpO1xuICAgICAgICB9XG4gICAgICB9XG5cbiAgICAgIHRvcG1vc3REaXJlY3RvcnkgPSB0aGlzLmVudHJpZXMucmV0cmlldmVEaXJlY3RvcnkodG9wbW9zdERpcmVjdG9yeU5hbWUpO1xuICAgIH1cblxuICAgIHJldHVybiB0b3Btb3N0RGlyZWN0b3J5O1xuICB9XG5cbiAgZ2V0TWFya2VkRGlyZWN0b3J5KCkge1xuICAgIGxldCBtYXJrZWREaXJlY3RvcnkgPSB0aGlzLmVudHJpZXMuZ2V0TWFya2VkRGlyZWN0b3J5KCk7XG5cbiAgICBpZiAobWFya2VkRGlyZWN0b3J5ID09PSBudWxsKSB7XG4gICAgICBjb25zdCBtYXJrZWQgPSB0aGlzLmlzTWFya2VkKCk7XG4gICAgICBcbiAgICAgIGlmIChtYXJrZWQpIHtcbiAgICAgICAgbWFya2VkRGlyZWN0b3J5ID0gdGhpcztcbiAgICAgIH1cbiAgICB9XG5cbiAgICByZXR1cm4gbWFya2VkRGlyZWN0b3J5O1xuICB9XG5cbiAgZ2V0RGlyZWN0b3J5T3ZlcmxhcHBpbmdEcmFnZ2FibGVFbnRyeShkcmFnZ2FibGVFbnRyeSkge1xuICAgIGxldCBkaXJlY3RvcnlPdmVybGFwcGluZ0RyYWdnYWJsZUVudHJ5ID0gbnVsbDtcblxuICAgIGNvbnN0IG92ZXJsYXBwaW5nRHJhZ2dhYmxlRW50cnkgPSB0aGlzLmlzT3ZlcmxhcHBpbmdEcmFnZ2FibGVFbnRyeShkcmFnZ2FibGVFbnRyeSk7XG5cbiAgICBpZiAob3ZlcmxhcHBpbmdEcmFnZ2FibGVFbnRyeSkge1xuICAgICAgZGlyZWN0b3J5T3ZlcmxhcHBpbmdEcmFnZ2FibGVFbnRyeSA9IHRoaXMuZW50cmllcy5nZXREaXJlY3RvcnlPdmVybGFwcGluZ0RyYWdnYWJsZUVudHJ5KGRyYWdnYWJsZUVudHJ5KTtcblxuICAgICAgaWYgKGRpcmVjdG9yeU92ZXJsYXBwaW5nRHJhZ2dhYmxlRW50cnkgPT09IG51bGwpIHtcbiAgICAgICAgZGlyZWN0b3J5T3ZlcmxhcHBpbmdEcmFnZ2FibGVFbnRyeSA9IHRoaXM7XG4gICAgICB9XG4gICAgfVxuXG4gICAgcmV0dXJuIGRpcmVjdG9yeU92ZXJsYXBwaW5nRHJhZ2dhYmxlRW50cnk7XG4gIH1cbiAgXG4gIHRvZ2dsZUJ1dHRvblVwZGF0ZUhhbmRsZXIoY29sbGFwc2VkKSB7XG4gICAgY29sbGFwc2VkID8gXG4gICAgICB0aGlzLmFkZENsYXNzKCdjb2xsYXBzZWQnKSA6IFxuICAgICAgICB0aGlzLnJlbW92ZUNsYXNzKCdjb2xsYXBzZWQnKTtcbiAgfVxuXG4gIGRvdWJsZUNsaWNrSGFuZGxlcigpIHtcbiAgICB0aGlzLnRvZ2dsZUJ1dHRvbi50b2dnbGUoKTtcbiAgfVxuXG4gIHN0YXRpYyBmcm9tUHJvcGVydGllcyhDbGFzcywgcHJvcGVydGllcykge1xuICAgIGlmIChhcmd1bWVudHMubGVuZ3RoID09PSAxKSB7XG4gICAgICBwcm9wZXJ0aWVzID0gQ2xhc3M7XG4gICAgICBDbGFzcyA9IERpcmVjdG9yeTtcbiAgICB9XG4gICAgXG4gICAgY29uc3QgeyBuYW1lLCBleHBsb3JlciwgY29sbGFwc2VkIH0gPSBwcm9wZXJ0aWVzO1xuICAgIFxuICAgIHJldHVybiBEcmFnZ2FibGVFbnRyeS5mcm9tUHJvcGVydGllcyhDbGFzcywgcHJvcGVydGllcywgbmFtZSwgZXhwbG9yZXIsIGNvbGxhcHNlZCk7XG4gIH1cbn1cblxuT2JqZWN0LmFzc2lnbihEaXJlY3RvcnksIHtcbiAgaWdub3JlZEF0dHJpYnV0ZXM6IFtcbiAgICAnbmFtZScsXG4gICAgJ2V4cGxvcmVyJyxcbiAgICAnY29sbGFwc2VkJ1xuICBdXG59KTtcblxubW9kdWxlLmV4cG9ydHMgPSBEaXJlY3Rvcnk7XG4iXX0=