UNPKG

matrix-react-sdk

Version:
171 lines (164 loc) 24.9 kB
"use strict"; var _interopRequireDefault = require("@babel/runtime/helpers/interopRequireDefault"); Object.defineProperty(exports, "__esModule", { value: true }); exports.default = void 0; var _defineProperty2 = _interopRequireDefault(require("@babel/runtime/helpers/defineProperty")); var _lodash = require("lodash"); /* Copyright 2024 New Vector Ltd. Copyright 2018-2020 The Matrix.org Foundation C.I.C. SPDX-License-Identifier: AGPL-3.0-only OR GPL-3.0-only Please see LICENSE files in the repository root for full details. */ class Resizer { // TODO move vertical/horizontal to config option/container class // as it doesn't make sense to mix them within one container/Resizer constructor(container, distributorCtor, config) { (0, _defineProperty2.default)(this, "classNames", void 0); (0, _defineProperty2.default)(this, "onMouseDown", event => { const LEFT_MOUSE_BUTTON = 0; if (event.button !== LEFT_MOUSE_BUTTON) { return; } // use closest in case the resize handle contains // child dom nodes that can be the target const resizeHandle = event.target && event.target.closest(`.${this.classNames.handle}`); const hasHandler = this?.config?.handler; // prevent that stacked resizer's are both activated with one mouse event // (this is possible because the mouse events are connected to the containers not the handles) if (!resizeHandle || // if no resizeHandle exist / mouse event hit the container not the handle !hasHandler && resizeHandle.parentElement !== this.container || // no handler from config -> check if the containers match hasHandler && resizeHandle !== hasHandler) { // handler from config -> check if the handlers match return; } // prevent starting a drag operation event.preventDefault(); // mark as currently resizing if (this.classNames.resizing) { this.container?.classList?.add(this.classNames.resizing); } this.config?.onResizeStart?.(); const { sizer, distributor } = this.createSizerAndDistributor(resizeHandle); distributor.start(); const onMouseMove = event => { const offset = sizer.offsetFromEvent(event); distributor.resizeFromContainerOffset(offset); }; const body = document.body; const finishResize = () => { if (this.classNames.resizing) { this.container?.classList?.remove(this.classNames.resizing); } distributor.finish(); this.config?.onResizeStop?.(); body.removeEventListener("mouseup", finishResize, false); document.removeEventListener("mouseleave", finishResize, false); body.removeEventListener("mousemove", onMouseMove, false); }; body.addEventListener("mouseup", finishResize, false); document.addEventListener("mouseleave", finishResize, false); body.addEventListener("mousemove", onMouseMove, false); }); (0, _defineProperty2.default)(this, "onResize", (0, _lodash.throttle)(() => { const distributors = this.getDistributors(); // relax all items if they had any overconstrained flexboxes distributors.forEach(d => d.start()); distributors.forEach(d => d.finish()); }, 100, { trailing: true, leading: true })); (0, _defineProperty2.default)(this, "getDistributors", () => { return this.getResizeHandles().map(handle => { const { distributor } = this.createSizerAndDistributor(handle); return distributor; }); }); this.container = container; this.distributorCtor = distributorCtor; this.config = config; this.classNames = { handle: "resizer-handle", reverse: "resizer-reverse", vertical: "resizer-vertical", resizing: "resizer-resizing" }; } setClassNames(classNames) { this.classNames = classNames; } attach() { const attachment = this?.config?.handler?.parentElement ?? this.container; attachment?.addEventListener("mousedown", this.onMouseDown, false); window.addEventListener("resize", this.onResize); } detach() { const attachment = this?.config?.handler?.parentElement ?? this.container; attachment?.removeEventListener("mousedown", this.onMouseDown, false); window.removeEventListener("resize", this.onResize); } /** Gives the distributor for a specific resize handle, as if you would have started to drag that handle. Can be used to manipulate the size of an item programmatically. @param {number} handleIndex the index of the resize handle in the container @return {FixedDistributor} a new distributor for the given handle */ forHandleAt(handleIndex) { const handles = this.getResizeHandles(); const handle = handles[handleIndex]; if (handle) { const { distributor } = this.createSizerAndDistributor(handle); return distributor; } } forHandleWithId(id) { const handles = this.getResizeHandles(); const handle = handles.find(h => h.getAttribute("data-id") === id); if (handle) { const { distributor } = this.createSizerAndDistributor(handle); return distributor; } } isReverseResizeHandle(el) { return el.classList.contains(this.classNames.reverse); } isResizeHandle(el) { return el.classList.contains(this.classNames.handle); } createSizerAndDistributor(resizeHandle) { const vertical = resizeHandle.classList.contains(this.classNames.vertical); const reverse = this.isReverseResizeHandle(resizeHandle); const Distributor = this.distributorCtor; const useItemContainer = this.config?.handler ? this.container : undefined; const sizer = Distributor.createSizer(this.container, vertical, reverse); const item = Distributor.createItem(resizeHandle, this, sizer, useItemContainer ?? undefined); const distributor = new Distributor(item); return { sizer, distributor }; } getResizeHandles() { if (this?.config?.handler) { return [this.config.handler]; } if (!this.container?.children) return []; return Array.from(this.container.querySelectorAll(`.${this.classNames.handle}`)); } } exports.default = Resizer; //# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJuYW1lcyI6WyJfbG9kYXNoIiwicmVxdWlyZSIsIlJlc2l6ZXIiLCJjb25zdHJ1Y3RvciIsImNvbnRhaW5lciIsImRpc3RyaWJ1dG9yQ3RvciIsImNvbmZpZyIsIl9kZWZpbmVQcm9wZXJ0eTIiLCJkZWZhdWx0IiwiZXZlbnQiLCJMRUZUX01PVVNFX0JVVFRPTiIsImJ1dHRvbiIsInJlc2l6ZUhhbmRsZSIsInRhcmdldCIsImNsb3Nlc3QiLCJjbGFzc05hbWVzIiwiaGFuZGxlIiwiaGFzSGFuZGxlciIsImhhbmRsZXIiLCJwYXJlbnRFbGVtZW50IiwicHJldmVudERlZmF1bHQiLCJyZXNpemluZyIsImNsYXNzTGlzdCIsImFkZCIsIm9uUmVzaXplU3RhcnQiLCJzaXplciIsImRpc3RyaWJ1dG9yIiwiY3JlYXRlU2l6ZXJBbmREaXN0cmlidXRvciIsInN0YXJ0Iiwib25Nb3VzZU1vdmUiLCJvZmZzZXQiLCJvZmZzZXRGcm9tRXZlbnQiLCJyZXNpemVGcm9tQ29udGFpbmVyT2Zmc2V0IiwiYm9keSIsImRvY3VtZW50IiwiZmluaXNoUmVzaXplIiwicmVtb3ZlIiwiZmluaXNoIiwib25SZXNpemVTdG9wIiwicmVtb3ZlRXZlbnRMaXN0ZW5lciIsImFkZEV2ZW50TGlzdGVuZXIiLCJ0aHJvdHRsZSIsImRpc3RyaWJ1dG9ycyIsImdldERpc3RyaWJ1dG9ycyIsImZvckVhY2giLCJkIiwidHJhaWxpbmciLCJsZWFkaW5nIiwiZ2V0UmVzaXplSGFuZGxlcyIsIm1hcCIsInJldmVyc2UiLCJ2ZXJ0aWNhbCIsInNldENsYXNzTmFtZXMiLCJhdHRhY2giLCJhdHRhY2htZW50Iiwib25Nb3VzZURvd24iLCJ3aW5kb3ciLCJvblJlc2l6ZSIsImRldGFjaCIsImZvckhhbmRsZUF0IiwiaGFuZGxlSW5kZXgiLCJoYW5kbGVzIiwiZm9ySGFuZGxlV2l0aElkIiwiaWQiLCJmaW5kIiwiaCIsImdldEF0dHJpYnV0ZSIsImlzUmV2ZXJzZVJlc2l6ZUhhbmRsZSIsImVsIiwiY29udGFpbnMiLCJpc1Jlc2l6ZUhhbmRsZSIsIkRpc3RyaWJ1dG9yIiwidXNlSXRlbUNvbnRhaW5lciIsInVuZGVmaW5lZCIsImNyZWF0ZVNpemVyIiwiaXRlbSIsImNyZWF0ZUl0ZW0iLCJjaGlsZHJlbiIsIkFycmF5IiwiZnJvbSIsInF1ZXJ5U2VsZWN0b3JBbGwiLCJleHBvcnRzIl0sInNvdXJjZXMiOlsiLi4vLi4vc3JjL3Jlc2l6ZXIvcmVzaXplci50cyJdLCJzb3VyY2VzQ29udGVudCI6WyIvKlxuQ29weXJpZ2h0IDIwMjQgTmV3IFZlY3RvciBMdGQuXG5Db3B5cmlnaHQgMjAxOC0yMDIwIFRoZSBNYXRyaXgub3JnIEZvdW5kYXRpb24gQy5JLkMuXG5cblNQRFgtTGljZW5zZS1JZGVudGlmaWVyOiBBR1BMLTMuMC1vbmx5IE9SIEdQTC0zLjAtb25seVxuUGxlYXNlIHNlZSBMSUNFTlNFIGZpbGVzIGluIHRoZSByZXBvc2l0b3J5IHJvb3QgZm9yIGZ1bGwgZGV0YWlscy5cbiovXG5cbmltcG9ydCB7IHRocm90dGxlIH0gZnJvbSBcImxvZGFzaFwiO1xuXG5pbXBvcnQgRml4ZWREaXN0cmlidXRvciBmcm9tIFwiLi9kaXN0cmlidXRvcnMvZml4ZWRcIjtcbmltcG9ydCBSZXNpemVJdGVtIGZyb20gXCIuL2l0ZW1cIjtcbmltcG9ydCBTaXplciBmcm9tIFwiLi9zaXplclwiO1xuXG5pbnRlcmZhY2UgSUNsYXNzTmFtZXMge1xuICAgIC8vIGNsYXNzIG9uIHJlc2l6ZS1oYW5kbGVcbiAgICBoYW5kbGU/OiBzdHJpbmc7XG4gICAgLy8gY2xhc3Mgb24gcmVzaXplLWhhbmRsZVxuICAgIHJldmVyc2U/OiBzdHJpbmc7XG4gICAgLy8gY2xhc3Mgb24gcmVzaXplLWhhbmRsZVxuICAgIHZlcnRpY2FsPzogc3RyaW5nO1xuICAgIC8vIGNsYXNzIG9uIGNvbnRhaW5lclxuICAgIHJlc2l6aW5nPzogc3RyaW5nO1xufVxuXG5leHBvcnQgaW50ZXJmYWNlIElDb25maWcge1xuICAgIG9uUmVzaXplU3RhcnQ/KCk6IHZvaWQ7XG4gICAgb25SZXNpemVTdG9wPygpOiB2b2lkO1xuICAgIG9uUmVzaXplZD8oc2l6ZTogbnVtYmVyIHwgbnVsbCwgaWQ6IHN0cmluZyB8IG51bGwsIGVsZW1lbnQ6IEhUTUxFbGVtZW50KTogdm9pZDtcbiAgICBoYW5kbGVyPzogSFRNTERpdkVsZW1lbnQ7XG59XG5cbmV4cG9ydCBkZWZhdWx0IGNsYXNzIFJlc2l6ZXI8QyBleHRlbmRzIElDb25maWcsIEkgZXh0ZW5kcyBSZXNpemVJdGVtPEM+ID0gUmVzaXplSXRlbTxDPj4ge1xuICAgIHByaXZhdGUgY2xhc3NOYW1lczogSUNsYXNzTmFtZXM7XG5cbiAgICAvLyBUT0RPIG1vdmUgdmVydGljYWwvaG9yaXpvbnRhbCB0byBjb25maWcgb3B0aW9uL2NvbnRhaW5lciBjbGFzc1xuICAgIC8vIGFzIGl0IGRvZXNuJ3QgbWFrZSBzZW5zZSB0byBtaXggdGhlbSB3aXRoaW4gb25lIGNvbnRhaW5lci9SZXNpemVyXG4gICAgcHVibGljIGNvbnN0cnVjdG9yKFxuICAgICAgICBwdWJsaWMgY29udGFpbmVyOiBIVE1MRWxlbWVudCB8IG51bGwsXG4gICAgICAgIHByaXZhdGUgcmVhZG9ubHkgZGlzdHJpYnV0b3JDdG9yOiB7XG4gICAgICAgICAgICBuZXcgKGl0ZW06IEkpOiBGaXhlZERpc3RyaWJ1dG9yPEMsIEk+O1xuICAgICAgICAgICAgY3JlYXRlSXRlbShyZXNpemVIYW5kbGU6IEhUTUxEaXZFbGVtZW50LCByZXNpemVyOiBSZXNpemVyPEMsIEk+LCBzaXplcjogU2l6ZXIsIGNvbnRhaW5lcj86IEhUTUxFbGVtZW50KTogSTtcbiAgICAgICAgICAgIGNyZWF0ZVNpemVyKGNvbnRhaW5lckVsZW1lbnQ6IEhUTUxFbGVtZW50IHwgbnVsbCwgdmVydGljYWw6IGJvb2xlYW4sIHJldmVyc2U6IGJvb2xlYW4pOiBTaXplcjtcbiAgICAgICAgfSxcbiAgICAgICAgcHVibGljIHJlYWRvbmx5IGNvbmZpZz86IEMsXG4gICAgKSB7XG4gICAgICAgIHRoaXMuY2xhc3NOYW1lcyA9IHtcbiAgICAgICAgICAgIGhhbmRsZTogXCJyZXNpemVyLWhhbmRsZVwiLFxuICAgICAgICAgICAgcmV2ZXJzZTogXCJyZXNpemVyLXJldmVyc2VcIixcbiAgICAgICAgICAgIHZlcnRpY2FsOiBcInJlc2l6ZXItdmVydGljYWxcIixcbiAgICAgICAgICAgIHJlc2l6aW5nOiBcInJlc2l6ZXItcmVzaXppbmdcIixcbiAgICAgICAgfTtcbiAgICB9XG5cbiAgICBwdWJsaWMgc2V0Q2xhc3NOYW1lcyhjbGFzc05hbWVzOiBJQ2xhc3NOYW1lcyk6IHZvaWQge1xuICAgICAgICB0aGlzLmNsYXNzTmFtZXMgPSBjbGFzc05hbWVzO1xuICAgIH1cblxuICAgIHB1YmxpYyBhdHRhY2goKTogdm9pZCB7XG4gICAgICAgIGNvbnN0IGF0dGFjaG1lbnQgPSB0aGlzPy5jb25maWc/LmhhbmRsZXI/LnBhcmVudEVsZW1lbnQgPz8gdGhpcy5jb250YWluZXI7XG4gICAgICAgIGF0dGFjaG1lbnQ/LmFkZEV2ZW50TGlzdGVuZXIoXCJtb3VzZWRvd25cIiwgdGhpcy5vbk1vdXNlRG93biwgZmFsc2UpO1xuICAgICAgICB3aW5kb3cuYWRkRXZlbnRMaXN0ZW5lcihcInJlc2l6ZVwiLCB0aGlzLm9uUmVzaXplKTtcbiAgICB9XG5cbiAgICBwdWJsaWMgZGV0YWNoKCk6IHZvaWQge1xuICAgICAgICBjb25zdCBhdHRhY2htZW50ID0gdGhpcz8uY29uZmlnPy5oYW5kbGVyPy5wYXJlbnRFbGVtZW50ID8/IHRoaXMuY29udGFpbmVyO1xuICAgICAgICBhdHRhY2htZW50Py5yZW1vdmVFdmVudExpc3RlbmVyKFwibW91c2Vkb3duXCIsIHRoaXMub25Nb3VzZURvd24sIGZhbHNlKTtcbiAgICAgICAgd2luZG93LnJlbW92ZUV2ZW50TGlzdGVuZXIoXCJyZXNpemVcIiwgdGhpcy5vblJlc2l6ZSk7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgR2l2ZXMgdGhlIGRpc3RyaWJ1dG9yIGZvciBhIHNwZWNpZmljIHJlc2l6ZSBoYW5kbGUsIGFzIGlmIHlvdSB3b3VsZCBoYXZlIHN0YXJ0ZWRcbiAgICB0byBkcmFnIHRoYXQgaGFuZGxlLiBDYW4gYmUgdXNlZCB0byBtYW5pcHVsYXRlIHRoZSBzaXplIG9mIGFuIGl0ZW0gcHJvZ3JhbW1hdGljYWxseS5cbiAgICBAcGFyYW0ge251bWJlcn0gaGFuZGxlSW5kZXggdGhlIGluZGV4IG9mIHRoZSByZXNpemUgaGFuZGxlIGluIHRoZSBjb250YWluZXJcbiAgICBAcmV0dXJuIHtGaXhlZERpc3RyaWJ1dG9yfSBhIG5ldyBkaXN0cmlidXRvciBmb3IgdGhlIGdpdmVuIGhhbmRsZVxuICAgICovXG4gICAgcHVibGljIGZvckhhbmRsZUF0KGhhbmRsZUluZGV4OiBudW1iZXIpOiBGaXhlZERpc3RyaWJ1dG9yPEMsIEk+IHwgdW5kZWZpbmVkIHtcbiAgICAgICAgY29uc3QgaGFuZGxlcyA9IHRoaXMuZ2V0UmVzaXplSGFuZGxlcygpO1xuICAgICAgICBjb25zdCBoYW5kbGUgPSBoYW5kbGVzW2hhbmRsZUluZGV4XTtcbiAgICAgICAgaWYgKGhhbmRsZSkge1xuICAgICAgICAgICAgY29uc3QgeyBkaXN0cmlidXRvciB9ID0gdGhpcy5jcmVhdGVTaXplckFuZERpc3RyaWJ1dG9yKDxIVE1MRGl2RWxlbWVudD5oYW5kbGUpO1xuICAgICAgICAgICAgcmV0dXJuIGRpc3RyaWJ1dG9yO1xuICAgICAgICB9XG4gICAgfVxuXG4gICAgcHVibGljIGZvckhhbmRsZVdpdGhJZChpZDogc3RyaW5nKTogRml4ZWREaXN0cmlidXRvcjxDLCBJPiB8IHVuZGVmaW5lZCB7XG4gICAgICAgIGNvbnN0IGhhbmRsZXMgPSB0aGlzLmdldFJlc2l6ZUhhbmRsZXMoKTtcbiAgICAgICAgY29uc3QgaGFuZGxlID0gaGFuZGxlcy5maW5kKChoKSA9PiBoLmdldEF0dHJpYnV0ZShcImRhdGEtaWRcIikgPT09IGlkKTtcbiAgICAgICAgaWYgKGhhbmRsZSkge1xuICAgICAgICAgICAgY29uc3QgeyBkaXN0cmlidXRvciB9ID0gdGhpcy5jcmVhdGVTaXplckFuZERpc3RyaWJ1dG9yKDxIVE1MRGl2RWxlbWVudD5oYW5kbGUpO1xuICAgICAgICAgICAgcmV0dXJuIGRpc3RyaWJ1dG9yO1xuICAgICAgICB9XG4gICAgfVxuXG4gICAgcHVibGljIGlzUmV2ZXJzZVJlc2l6ZUhhbmRsZShlbDogSFRNTEVsZW1lbnQpOiBib29sZWFuIHtcbiAgICAgICAgcmV0dXJuIGVsLmNsYXNzTGlzdC5jb250YWlucyh0aGlzLmNsYXNzTmFtZXMucmV2ZXJzZSEpO1xuICAgIH1cblxuICAgIHB1YmxpYyBpc1Jlc2l6ZUhhbmRsZShlbDogSFRNTEVsZW1lbnQpOiBib29sZWFuIHtcbiAgICAgICAgcmV0dXJuIGVsLmNsYXNzTGlzdC5jb250YWlucyh0aGlzLmNsYXNzTmFtZXMuaGFuZGxlISk7XG4gICAgfVxuXG4gICAgcHJpdmF0ZSBvbk1vdXNlRG93biA9IChldmVudDogTW91c2VFdmVudCk6IHZvaWQgPT4ge1xuICAgICAgICBjb25zdCBMRUZUX01PVVNFX0JVVFRPTiA9IDA7XG4gICAgICAgIGlmIChldmVudC5idXR0b24gIT09IExFRlRfTU9VU0VfQlVUVE9OKSB7XG4gICAgICAgICAgICByZXR1cm47XG4gICAgICAgIH1cbiAgICAgICAgLy8gdXNlIGNsb3Nlc3QgaW4gY2FzZSB0aGUgcmVzaXplIGhhbmRsZSBjb250YWluc1xuICAgICAgICAvLyBjaGlsZCBkb20gbm9kZXMgdGhhdCBjYW4gYmUgdGhlIHRhcmdldFxuICAgICAgICBjb25zdCByZXNpemVIYW5kbGUgPSBldmVudC50YXJnZXQgJiYgKDxIVE1MRGl2RWxlbWVudD5ldmVudC50YXJnZXQpLmNsb3Nlc3QoYC4ke3RoaXMuY2xhc3NOYW1lcy5oYW5kbGV9YCk7XG4gICAgICAgIGNvbnN0IGhhc0hhbmRsZXIgPSB0aGlzPy5jb25maWc/LmhhbmRsZXI7XG4gICAgICAgIC8vIHByZXZlbnQgdGhhdCBzdGFja2VkIHJlc2l6ZXIncyBhcmUgYm90aCBhY3RpdmF0ZWQgd2l0aCBvbmUgbW91c2UgZXZlbnRcbiAgICAgICAgLy8gKHRoaXMgaXMgcG9zc2libGUgYmVjYXVzZSB0aGUgbW91c2UgZXZlbnRzIGFyZSBjb25uZWN0ZWQgdG8gdGhlIGNvbnRhaW5lcnMgbm90IHRoZSBoYW5kbGVzKVxuICAgICAgICBpZiAoXG4gICAgICAgICAgICAhcmVzaXplSGFuZGxlIHx8IC8vIGlmIG5vIHJlc2l6ZUhhbmRsZSBleGlzdCAvIG1vdXNlIGV2ZW50IGhpdCB0aGUgY29udGFpbmVyIG5vdCB0aGUgaGFuZGxlXG4gICAgICAgICAgICAoIWhhc0hhbmRsZXIgJiYgcmVzaXplSGFuZGxlLnBhcmVudEVsZW1lbnQgIT09IHRoaXMuY29udGFpbmVyKSB8fCAvLyBubyBoYW5kbGVyIGZyb20gY29uZmlnIC0+IGNoZWNrIGlmIHRoZSBjb250YWluZXJzIG1hdGNoXG4gICAgICAgICAgICAoaGFzSGFuZGxlciAmJiByZXNpemVIYW5kbGUgIT09IGhhc0hhbmRsZXIpXG4gICAgICAgICkge1xuICAgICAgICAgICAgLy8gaGFuZGxlciBmcm9tIGNvbmZpZyAtPiBjaGVjayBpZiB0aGUgaGFuZGxlcnMgbWF0Y2hcbiAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgfVxuXG4gICAgICAgIC8vIHByZXZlbnQgc3RhcnRpbmcgYSBkcmFnIG9wZXJhdGlvblxuICAgICAgICBldmVudC5wcmV2ZW50RGVmYXVsdCgpO1xuXG4gICAgICAgIC8vIG1hcmsgYXMgY3VycmVudGx5IHJlc2l6aW5nXG4gICAgICAgIGlmICh0aGlzLmNsYXNzTmFtZXMucmVzaXppbmcpIHtcbiAgICAgICAgICAgIHRoaXMuY29udGFpbmVyPy5jbGFzc0xpc3Q/LmFkZCh0aGlzLmNsYXNzTmFtZXMucmVzaXppbmcpO1xuICAgICAgICB9XG4gICAgICAgIHRoaXMuY29uZmlnPy5vblJlc2l6ZVN0YXJ0Py4oKTtcblxuICAgICAgICBjb25zdCB7IHNpemVyLCBkaXN0cmlidXRvciB9ID0gdGhpcy5jcmVhdGVTaXplckFuZERpc3RyaWJ1dG9yKDxIVE1MRGl2RWxlbWVudD5yZXNpemVIYW5kbGUpO1xuICAgICAgICBkaXN0cmlidXRvci5zdGFydCgpO1xuXG4gICAgICAgIGNvbnN0IG9uTW91c2VNb3ZlID0gKGV2ZW50OiBNb3VzZUV2ZW50KTogdm9pZCA9PiB7XG4gICAgICAgICAgICBjb25zdCBvZmZzZXQgPSBzaXplci5vZmZzZXRGcm9tRXZlbnQoZXZlbnQpO1xuICAgICAgICAgICAgZGlzdHJpYnV0b3IucmVzaXplRnJvbUNvbnRhaW5lck9mZnNldChvZmZzZXQpO1xuICAgICAgICB9O1xuXG4gICAgICAgIGNvbnN0IGJvZHkgPSBkb2N1bWVudC5ib2R5O1xuICAgICAgICBjb25zdCBmaW5pc2hSZXNpemUgPSAoKTogdm9pZCA9PiB7XG4gICAgICAgICAgICBpZiAodGhpcy5jbGFzc05hbWVzLnJlc2l6aW5nKSB7XG4gICAgICAgICAgICAgICAgdGhpcy5jb250YWluZXI/LmNsYXNzTGlzdD8ucmVtb3ZlKHRoaXMuY2xhc3NOYW1lcy5yZXNpemluZyk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBkaXN0cmlidXRvci5maW5pc2goKTtcbiAgICAgICAgICAgIHRoaXMuY29uZmlnPy5vblJlc2l6ZVN0b3A/LigpO1xuICAgICAgICAgICAgYm9keS5yZW1vdmVFdmVudExpc3RlbmVyKFwibW91c2V1cFwiLCBmaW5pc2hSZXNpemUsIGZhbHNlKTtcbiAgICAgICAgICAgIGRvY3VtZW50LnJlbW92ZUV2ZW50TGlzdGVuZXIoXCJtb3VzZWxlYXZlXCIsIGZpbmlzaFJlc2l6ZSwgZmFsc2UpO1xuICAgICAgICAgICAgYm9keS5yZW1vdmVFdmVudExpc3RlbmVyKFwibW91c2Vtb3ZlXCIsIG9uTW91c2VNb3ZlLCBmYWxzZSk7XG4gICAgICAgIH07XG4gICAgICAgIGJvZHkuYWRkRXZlbnRMaXN0ZW5lcihcIm1vdXNldXBcIiwgZmluaXNoUmVzaXplLCBmYWxzZSk7XG4gICAgICAgIGRvY3VtZW50LmFkZEV2ZW50TGlzdGVuZXIoXCJtb3VzZWxlYXZlXCIsIGZpbmlzaFJlc2l6ZSwgZmFsc2UpO1xuICAgICAgICBib2R5LmFkZEV2ZW50TGlzdGVuZXIoXCJtb3VzZW1vdmVcIiwgb25Nb3VzZU1vdmUsIGZhbHNlKTtcbiAgICB9O1xuXG4gICAgcHJpdmF0ZSBvblJlc2l6ZSA9IHRocm90dGxlKFxuICAgICAgICAoKSA9PiB7XG4gICAgICAgICAgICBjb25zdCBkaXN0cmlidXRvcnMgPSB0aGlzLmdldERpc3RyaWJ1dG9ycygpO1xuXG4gICAgICAgICAgICAvLyByZWxheCBhbGwgaXRlbXMgaWYgdGhleSBoYWQgYW55IG92ZXJjb25zdHJhaW5lZCBmbGV4Ym94ZXNcbiAgICAgICAgICAgIGRpc3RyaWJ1dG9ycy5mb3JFYWNoKChkKSA9PiBkLnN0YXJ0KCkpO1xuICAgICAgICAgICAgZGlzdHJpYnV0b3JzLmZvckVhY2goKGQpID0+IGQuZmluaXNoKCkpO1xuICAgICAgICB9LFxuICAgICAgICAxMDAsXG4gICAgICAgIHsgdHJhaWxpbmc6IHRydWUsIGxlYWRpbmc6IHRydWUgfSxcbiAgICApO1xuXG4gICAgcHVibGljIGdldERpc3RyaWJ1dG9ycyA9ICgpOiBGaXhlZERpc3RyaWJ1dG9yPEMsIEk+W10gPT4ge1xuICAgICAgICByZXR1cm4gdGhpcy5nZXRSZXNpemVIYW5kbGVzKCkubWFwKChoYW5kbGUpID0+IHtcbiAgICAgICAgICAgIGNvbnN0IHsgZGlzdHJpYnV0b3IgfSA9IHRoaXMuY3JlYXRlU2l6ZXJBbmREaXN0cmlidXRvcig8SFRNTERpdkVsZW1lbnQ+aGFuZGxlKTtcbiAgICAgICAgICAgIHJldHVybiBkaXN0cmlidXRvcjtcbiAgICAgICAgfSk7XG4gICAgfTtcblxuICAgIHByaXZhdGUgY3JlYXRlU2l6ZXJBbmREaXN0cmlidXRvcihyZXNpemVIYW5kbGU6IEhUTUxEaXZFbGVtZW50KToge1xuICAgICAgICBzaXplcjogU2l6ZXI7XG4gICAgICAgIGRpc3RyaWJ1dG9yOiBGaXhlZERpc3RyaWJ1dG9yPEMsIEk+O1xuICAgIH0ge1xuICAgICAgICBjb25zdCB2ZXJ0aWNhbCA9IHJlc2l6ZUhhbmRsZS5jbGFzc0xpc3QuY29udGFpbnModGhpcy5jbGFzc05hbWVzLnZlcnRpY2FsISk7XG4gICAgICAgIGNvbnN0IHJldmVyc2UgPSB0aGlzLmlzUmV2ZXJzZVJlc2l6ZUhhbmRsZShyZXNpemVIYW5kbGUpO1xuICAgICAgICBjb25zdCBEaXN0cmlidXRvciA9IHRoaXMuZGlzdHJpYnV0b3JDdG9yO1xuICAgICAgICBjb25zdCB1c2VJdGVtQ29udGFpbmVyID0gdGhpcy5jb25maWc/LmhhbmRsZXIgPyB0aGlzLmNvbnRhaW5lciA6IHVuZGVmaW5lZDtcbiAgICAgICAgY29uc3Qgc2l6ZXIgPSBEaXN0cmlidXRvci5jcmVhdGVTaXplcih0aGlzLmNvbnRhaW5lciwgdmVydGljYWwsIHJldmVyc2UpO1xuICAgICAgICBjb25zdCBpdGVtID0gRGlzdHJpYnV0b3IuY3JlYXRlSXRlbShyZXNpemVIYW5kbGUsIHRoaXMsIHNpemVyLCB1c2VJdGVtQ29udGFpbmVyID8/IHVuZGVmaW5lZCk7XG4gICAgICAgIGNvbnN0IGRpc3RyaWJ1dG9yID0gbmV3IERpc3RyaWJ1dG9yKGl0ZW0pO1xuICAgICAgICByZXR1cm4geyBzaXplciwgZGlzdHJpYnV0b3IgfTtcbiAgICB9XG5cbiAgICBwcml2YXRlIGdldFJlc2l6ZUhhbmRsZXMoKTogSFRNTEVsZW1lbnRbXSB7XG4gICAgICAgIGlmICh0aGlzPy5jb25maWc/LmhhbmRsZXIpIHtcbiAgICAgICAgICAgIHJldHVybiBbdGhpcy5jb25maWcuaGFuZGxlcl07XG4gICAgICAgIH1cbiAgICAgICAgaWYgKCF0aGlzLmNvbnRhaW5lcj8uY2hpbGRyZW4pIHJldHVybiBbXTtcbiAgICAgICAgcmV0dXJuIEFycmF5LmZyb20odGhpcy5jb250YWluZXIucXVlcnlTZWxlY3RvckFsbChgLiR7dGhpcy5jbGFzc05hbWVzLmhhbmRsZX1gKSk7XG4gICAgfVxufVxuIl0sIm1hcHBpbmdzIjoiOzs7Ozs7OztBQVFB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