UNPKG

matrix-react-sdk

Version:
165 lines (161 loc) 27.4 kB
"use strict"; var _interopRequireDefault = require("@babel/runtime/helpers/interopRequireDefault"); Object.defineProperty(exports, "__esModule", { value: true }); exports.default = exports.Alignment = void 0; var _defineProperty2 = _interopRequireDefault(require("@babel/runtime/helpers/defineProperty")); var _react = _interopRequireDefault(require("react")); var _reactDom = _interopRequireDefault(require("react-dom")); var _classnames = _interopRequireDefault(require("classnames")); var _UIStore = _interopRequireDefault(require("../../../stores/UIStore")); var _objects = require("../../../utils/objects"); function ownKeys(e, r) { var t = Object.keys(e); if (Object.getOwnPropertySymbols) { var o = Object.getOwnPropertySymbols(e); r && (o = o.filter(function (r) { return Object.getOwnPropertyDescriptor(e, r).enumerable; })), t.push.apply(t, o); } return t; } function _objectSpread(e) { for (var r = 1; r < arguments.length; r++) { var t = null != arguments[r] ? arguments[r] : {}; r % 2 ? ownKeys(Object(t), !0).forEach(function (r) { (0, _defineProperty2.default)(e, r, t[r]); }) : Object.getOwnPropertyDescriptors ? Object.defineProperties(e, Object.getOwnPropertyDescriptors(t)) : ownKeys(Object(t)).forEach(function (r) { Object.defineProperty(e, r, Object.getOwnPropertyDescriptor(t, r)); }); } return e; } /* Copyright 2024 New Vector Ltd. Copyright 2019, 2020 The Matrix.org Foundation C.I.C. Copyright 2019 New Vector Ltd Copyright 2019 Michael Telatynski <7t3chguy@gmail.com> Copyright 2015, 2016 OpenMarket Ltd SPDX-License-Identifier: AGPL-3.0-only OR GPL-3.0-only Please see LICENSE files in the repository root for full details. */ let Alignment = exports.Alignment = /*#__PURE__*/function (Alignment) { Alignment[Alignment["Natural"] = 0] = "Natural"; Alignment[Alignment["Left"] = 1] = "Left"; Alignment[Alignment["Right"] = 2] = "Right"; Alignment[Alignment["Top"] = 3] = "Top"; Alignment[Alignment["Bottom"] = 4] = "Bottom"; Alignment[Alignment["InnerBottom"] = 5] = "InnerBottom"; Alignment[Alignment["TopRight"] = 6] = "TopRight"; return Alignment; }({}); // On top of the target, right aligned /** * @deprecated Use [compound tooltip](https://element-hq.github.io/compound-web/?path=/docs/tooltip--docs) instead */ class Tooltip extends _react.default.PureComponent { constructor(props) { super(props); (0, _defineProperty2.default)(this, "parent", null); // Add the parent's position to the tooltips, so it's correctly // positioned, also taking into account any window zoom (0, _defineProperty2.default)(this, "updatePosition", () => { // When the tooltip is hidden, no need to thrash the DOM with `style` attribute updates (performance) if (!this.props.visible || !this.parent) return; const parentBox = this.parent.getBoundingClientRect(); const width = _UIStore.default.instance.windowWidth; const spacing = 6; const parentWidth = this.props.maxParentWidth ? Math.min(parentBox.width, this.props.maxParentWidth) : parentBox.width; const baseTop = parentBox.top + window.scrollY; const centerTop = parentBox.top + window.scrollY + parentBox.height / 2; const right = width - parentBox.left - window.scrollX; const left = parentBox.right + window.scrollX; const horizontalCenter = parentBox.left - window.scrollX + parentWidth / 2; const style = {}; switch (this.props.alignment) { case Alignment.Natural: if (parentBox.right > width / 2) { style.right = right + spacing; style.top = centerTop; style.transform = "translateY(-50%)"; break; } // fall through to Right case Alignment.Right: style.left = left + spacing; style.top = centerTop; style.transform = "translateY(-50%)"; break; case Alignment.Left: style.right = right + spacing; style.top = centerTop; style.transform = "translateY(-50%)"; break; case Alignment.Top: style.top = baseTop - spacing; // Attempt to center the tooltip on the element while clamping // its horizontal translation to keep it on screen // eslint-disable-next-line max-len style.transform = `translate(max(10px, min(calc(${horizontalCenter}px - 50%), calc(100vw - 100% - 10px))), -100%)`; break; case Alignment.Bottom: style.top = baseTop + parentBox.height + spacing; // Attempt to center the tooltip on the element while clamping // its horizontal translation to keep it on screen // eslint-disable-next-line max-len style.transform = `translate(max(10px, min(calc(${horizontalCenter}px - 50%), calc(100vw - 100% - 10px))))`; break; case Alignment.InnerBottom: style.top = baseTop + parentBox.height - 50; // Attempt to center the tooltip on the element while clamping // its horizontal translation to keep it on screen // eslint-disable-next-line max-len style.transform = `translate(max(10px, min(calc(${horizontalCenter}px - 50%), calc(100vw - 100% - 10px))))`; break; case Alignment.TopRight: style.top = baseTop - spacing; style.right = width - parentBox.right - window.scrollX; style.transform = "translateY(-100%)"; break; } this.setState(style); }); this.state = {}; // Create a wrapper for the tooltips and attach it to the body element if (!Tooltip.container) { Tooltip.container = document.createElement("div"); Tooltip.container.className = "mx_Tooltip_wrapper"; document.body.appendChild(Tooltip.container); } } componentDidMount() { window.addEventListener("scroll", this.updatePosition, { passive: true, capture: true }); this.parent = _reactDom.default.findDOMNode(this)?.parentNode ?? null; this.updatePosition(); } componentDidUpdate(prevProps) { if ((0, _objects.objectHasDiff)(prevProps, this.props)) { this.updatePosition(); } } // Remove the wrapper element, as the tooltip has finished using it componentWillUnmount() { window.removeEventListener("scroll", this.updatePosition, { capture: true }); } render() { const tooltipClasses = (0, _classnames.default)("mx_Tooltip", this.props.tooltipClassName, { mx_Tooltip_visible: this.props.visible, mx_Tooltip_invisible: !this.props.visible }); const style = _objectSpread({}, this.state); // Hide the entire container when not visible. // This prevents flashing of the tooltip if it is not meant to be visible on first mount. style.display = this.props.visible ? "block" : "none"; const tooltip = /*#__PURE__*/_react.default.createElement("div", { id: this.props.id, role: this.props.role || "tooltip", className: tooltipClasses, style: style }, /*#__PURE__*/_react.default.createElement("div", { className: "mx_Tooltip_chevron" }), this.props.label); return /*#__PURE__*/_react.default.createElement("div", { className: this.props.className }, /*#__PURE__*/_reactDom.default.createPortal(tooltip, Tooltip.container)); } } exports.default = Tooltip; (0, _defineProperty2.default)(Tooltip, "container", void 0); // XXX: This is because some components (Field) are unable to `import` the Tooltip class, // so we expose the Alignment options off of us statically. (0, _defineProperty2.default)(Tooltip, "Alignment", Alignment); (0, _defineProperty2.default)(Tooltip, "defaultProps", { visible: true, alignment: Alignment.Natural }); //# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJuYW1lcyI6WyJfcmVhY3QiLCJfaW50ZXJvcFJlcXVpcmVEZWZhdWx0IiwicmVxdWlyZSIsIl9yZWFjdERvbSIsIl9jbGFzc25hbWVzIiwiX1VJU3RvcmUiLCJfb2JqZWN0cyIsIm93bktleXMiLCJlIiwiciIsInQiLCJPYmplY3QiLCJrZXlzIiwiZ2V0T3duUHJvcGVydHlTeW1ib2xzIiwibyIsImZpbHRlciIsImdldE93blByb3BlcnR5RGVzY3JpcHRvciIsImVudW1lcmFibGUiLCJwdXNoIiwiYXBwbHkiLCJfb2JqZWN0U3ByZWFkIiwiYXJndW1lbnRzIiwibGVuZ3RoIiwiZm9yRWFjaCIsIl9kZWZpbmVQcm9wZXJ0eTIiLCJkZWZhdWx0IiwiZ2V0T3duUHJvcGVydHlEZXNjcmlwdG9ycyIsImRlZmluZVByb3BlcnRpZXMiLCJkZWZpbmVQcm9wZXJ0eSIsIkFsaWdubWVudCIsImV4cG9ydHMiLCJUb29sdGlwIiwiUmVhY3QiLCJQdXJlQ29tcG9uZW50IiwiY29uc3RydWN0b3IiLCJwcm9wcyIsInZpc2libGUiLCJwYXJlbnQiLCJwYXJlbnRCb3giLCJnZXRCb3VuZGluZ0NsaWVudFJlY3QiLCJ3aWR0aCIsIlVJU3RvcmUiLCJpbnN0YW5jZSIsIndpbmRvd1dpZHRoIiwic3BhY2luZyIsInBhcmVudFdpZHRoIiwibWF4UGFyZW50V2lkdGgiLCJNYXRoIiwibWluIiwiYmFzZVRvcCIsInRvcCIsIndpbmRvdyIsInNjcm9sbFkiLCJjZW50ZXJUb3AiLCJoZWlnaHQiLCJyaWdodCIsImxlZnQiLCJzY3JvbGxYIiwiaG9yaXpvbnRhbENlbnRlciIsInN0eWxlIiwiYWxpZ25tZW50IiwiTmF0dXJhbCIsInRyYW5zZm9ybSIsIlJpZ2h0IiwiTGVmdCIsIlRvcCIsIkJvdHRvbSIsIklubmVyQm90dG9tIiwiVG9wUmlnaHQiLCJzZXRTdGF0ZSIsInN0YXRlIiwiY29udGFpbmVyIiwiZG9jdW1lbnQiLCJjcmVhdGVFbGVtZW50IiwiY2xhc3NOYW1lIiwiYm9keSIsImFwcGVuZENoaWxkIiwiY29tcG9uZW50RGlkTW91bnQiLCJhZGRFdmVudExpc3RlbmVyIiwidXBkYXRlUG9zaXRpb24iLCJwYXNzaXZlIiwiY2FwdHVyZSIsIlJlYWN0RE9NIiwiZmluZERPTU5vZGUiLCJwYXJlbnROb2RlIiwiY29tcG9uZW50RGlkVXBkYXRlIiwicHJldlByb3BzIiwib2JqZWN0SGFzRGlmZiIsImNvbXBvbmVudFdpbGxVbm1vdW50IiwicmVtb3ZlRXZlbnRMaXN0ZW5lciIsInJlbmRlciIsInRvb2x0aXBDbGFzc2VzIiwiY2xhc3NOYW1lcyIsInRvb2x0aXBDbGFzc05hbWUiLCJteF9Ub29sdGlwX3Zpc2libGUiLCJteF9Ub29sdGlwX2ludmlzaWJsZSIsImRpc3BsYXkiLCJ0b29sdGlwIiwiaWQiLCJyb2xlIiwibGFiZWwiLCJjcmVhdGVQb3J0YWwiXSwic291cmNlcyI6WyIuLi8uLi8uLi8uLi9zcmMvY29tcG9uZW50cy92aWV3cy9lbGVtZW50cy9Ub29sdGlwLnRzeCJdLCJzb3VyY2VzQ29udGVudCI6WyIvKlxuQ29weXJpZ2h0IDIwMjQgTmV3IFZlY3RvciBMdGQuXG5Db3B5cmlnaHQgMjAxOSwgMjAyMCBUaGUgTWF0cml4Lm9yZyBGb3VuZGF0aW9uIEMuSS5DLlxuQ29weXJpZ2h0IDIwMTkgTmV3IFZlY3RvciBMdGRcbkNvcHlyaWdodCAyMDE5IE1pY2hhZWwgVGVsYXR5bnNraSA8N3QzY2hndXlAZ21haWwuY29tPlxuQ29weXJpZ2h0IDIwMTUsIDIwMTYgT3Blbk1hcmtldCBMdGRcblxuU1BEWC1MaWNlbnNlLUlkZW50aWZpZXI6IEFHUEwtMy4wLW9ubHkgT1IgR1BMLTMuMC1vbmx5XG5QbGVhc2Ugc2VlIExJQ0VOU0UgZmlsZXMgaW4gdGhlIHJlcG9zaXRvcnkgcm9vdCBmb3IgZnVsbCBkZXRhaWxzLlxuKi9cblxuaW1wb3J0IFJlYWN0LCB7IENTU1Byb3BlcnRpZXMgfSBmcm9tIFwicmVhY3RcIjtcbmltcG9ydCBSZWFjdERPTSBmcm9tIFwicmVhY3QtZG9tXCI7XG5pbXBvcnQgY2xhc3NOYW1lcyBmcm9tIFwiY2xhc3NuYW1lc1wiO1xuXG5pbXBvcnQgVUlTdG9yZSBmcm9tIFwiLi4vLi4vLi4vc3RvcmVzL1VJU3RvcmVcIjtcbmltcG9ydCB7IG9iamVjdEhhc0RpZmYgfSBmcm9tIFwiLi4vLi4vLi4vdXRpbHMvb2JqZWN0c1wiO1xuXG5leHBvcnQgZW51bSBBbGlnbm1lbnQge1xuICAgIE5hdHVyYWwsIC8vIFBpY2sgbGVmdCBvciByaWdodFxuICAgIExlZnQsXG4gICAgUmlnaHQsXG4gICAgVG9wLCAvLyBDZW50ZXJlZFxuICAgIEJvdHRvbSwgLy8gQ2VudGVyZWRcbiAgICBJbm5lckJvdHRvbSwgLy8gSW5zaWRlIHRoZSB0YXJnZXQsIGF0IHRoZSBib3R0b21cbiAgICBUb3BSaWdodCwgLy8gT24gdG9wIG9mIHRoZSB0YXJnZXQsIHJpZ2h0IGFsaWduZWRcbn1cblxuZXhwb3J0IGludGVyZmFjZSBJVG9vbHRpcFByb3BzIHtcbiAgICAvLyBDbGFzcyBhcHBsaWVkIHRvIHRoZSBlbGVtZW50IHVzZWQgdG8gcG9zaXRpb24gdGhlIHRvb2x0aXBcbiAgICBjbGFzc05hbWU/OiBzdHJpbmc7XG4gICAgLy8gQ2xhc3MgYXBwbGllZCB0byB0aGUgdG9vbHRpcCBpdHNlbGZcbiAgICB0b29sdGlwQ2xhc3NOYW1lPzogc3RyaW5nO1xuICAgIC8vIFdoZXRoZXIgdGhlIHRvb2x0aXAgaXMgdmlzaWJsZSBvciBoaWRkZW4uXG4gICAgLy8gVGhlIGhpZGRlbiBzdGF0ZSBhbGxvd3MgYW5pbWF0aW5nIHRoZSB0b29sdGlwIGF3YXkgdmlhIENTUy5cbiAgICAvLyBEZWZhdWx0cyB0byB2aXNpYmxlIGlmIHVuc2V0LlxuICAgIHZpc2libGU/OiBib29sZWFuO1xuICAgIC8vIHRoZSByZWFjdCBlbGVtZW50IHRvIHB1dCBpbnRvIHRoZSB0b29sdGlwXG4gICAgbGFiZWw6IFJlYWN0LlJlYWN0Tm9kZTtcbiAgICBhbGlnbm1lbnQ/OiBBbGlnbm1lbnQ7IC8vIGRlZmF1bHRzIHRvIE5hdHVyYWxcbiAgICAvLyBpZCBkZXNjcmliaW5nIHRvb2x0aXBcbiAgICAvLyB1c2VkIHRvIGFzc29jaWF0ZSB0b29sdGlwIHdpdGggdGFyZ2V0IGZvciBhMTF5XG4gICAgaWQ/OiBzdHJpbmc7XG4gICAgLy8gSWYgdGhlIHBhcmVudCBpcyBvdmVyIHRoaXMgd2lkdGgsIGFjdCBhcyBpZiBpdCBpcyBvbmx5IHRoaXMgd2lkZVxuICAgIG1heFBhcmVudFdpZHRoPzogbnVtYmVyO1xuICAgIC8vIGFyaWEtcm9sZSBwYXNzZWQgdG8gdGhlIHRvb2x0aXBcbiAgICByb2xlPzogUmVhY3QuQXJpYVJvbGU7XG59XG5cbnR5cGUgU3RhdGUgPSBQYXJ0aWFsPFBpY2s8Q1NTUHJvcGVydGllcywgXCJkaXNwbGF5XCIgfCBcInJpZ2h0XCIgfCBcInRvcFwiIHwgXCJ0cmFuc2Zvcm1cIiB8IFwibGVmdFwiPj47XG5cbi8qKlxuICogQGRlcHJlY2F0ZWQgVXNlIFtjb21wb3VuZCB0b29sdGlwXShodHRwczovL2VsZW1lbnQtaHEuZ2l0aHViLmlvL2NvbXBvdW5kLXdlYi8/cGF0aD0vZG9jcy90b29sdGlwLS1kb2NzKSBpbnN0ZWFkXG4gKi9cbmV4cG9ydCBkZWZhdWx0IGNsYXNzIFRvb2x0aXAgZXh0ZW5kcyBSZWFjdC5QdXJlQ29tcG9uZW50PElUb29sdGlwUHJvcHMsIFN0YXRlPiB7XG4gICAgcHJpdmF0ZSBzdGF0aWMgY29udGFpbmVyOiBIVE1MRWxlbWVudDtcbiAgICBwcml2YXRlIHBhcmVudDogRWxlbWVudCB8IG51bGwgPSBudWxsO1xuXG4gICAgLy8gWFhYOiBUaGlzIGlzIGJlY2F1c2Ugc29tZSBjb21wb25lbnRzIChGaWVsZCkgYXJlIHVuYWJsZSB0byBgaW1wb3J0YCB0aGUgVG9vbHRpcCBjbGFzcyxcbiAgICAvLyBzbyB3ZSBleHBvc2UgdGhlIEFsaWdubWVudCBvcHRpb25zIG9mZiBvZiB1cyBzdGF0aWNhbGx5LlxuICAgIHB1YmxpYyBzdGF0aWMgcmVhZG9ubHkgQWxpZ25tZW50ID0gQWxpZ25tZW50O1xuXG4gICAgcHVibGljIHN0YXRpYyByZWFkb25seSBkZWZhdWx0UHJvcHMgPSB7XG4gICAgICAgIHZpc2libGU6IHRydWUsXG4gICAgICAgIGFsaWdubWVudDogQWxpZ25tZW50Lk5hdHVyYWwsXG4gICAgfTtcblxuICAgIHB1YmxpYyBjb25zdHJ1Y3Rvcihwcm9wczogSVRvb2x0aXBQcm9wcykge1xuICAgICAgICBzdXBlcihwcm9wcyk7XG5cbiAgICAgICAgdGhpcy5zdGF0ZSA9IHt9O1xuXG4gICAgICAgIC8vIENyZWF0ZSBhIHdyYXBwZXIgZm9yIHRoZSB0b29sdGlwcyBhbmQgYXR0YWNoIGl0IHRvIHRoZSBib2R5IGVsZW1lbnRcbiAgICAgICAgaWYgKCFUb29sdGlwLmNvbnRhaW5lcikge1xuICAgICAgICAgICAgVG9vbHRpcC5jb250YWluZXIgPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KFwiZGl2XCIpO1xuICAgICAgICAgICAgVG9vbHRpcC5jb250YWluZXIuY2xhc3NOYW1lID0gXCJteF9Ub29sdGlwX3dyYXBwZXJcIjtcbiAgICAgICAgICAgIGRvY3VtZW50LmJvZHkuYXBwZW5kQ2hpbGQoVG9vbHRpcC5jb250YWluZXIpO1xuICAgICAgICB9XG4gICAgfVxuXG4gICAgcHVibGljIGNvbXBvbmVudERpZE1vdW50KCk6IHZvaWQge1xuICAgICAgICB3aW5kb3cuYWRkRXZlbnRMaXN0ZW5lcihcInNjcm9sbFwiLCB0aGlzLnVwZGF0ZVBvc2l0aW9uLCB7XG4gICAgICAgICAgICBwYXNzaXZlOiB0cnVlLFxuICAgICAgICAgICAgY2FwdHVyZTogdHJ1ZSxcbiAgICAgICAgfSk7XG5cbiAgICAgICAgdGhpcy5wYXJlbnQgPSAoUmVhY3RET00uZmluZERPTU5vZGUodGhpcyk/LnBhcmVudE5vZGUgYXMgRWxlbWVudCkgPz8gbnVsbDtcblxuICAgICAgICB0aGlzLnVwZGF0ZVBvc2l0aW9uKCk7XG4gICAgfVxuXG4gICAgcHVibGljIGNvbXBvbmVudERpZFVwZGF0ZShwcmV2UHJvcHM6IElUb29sdGlwUHJvcHMpOiB2b2lkIHtcbiAgICAgICAgaWYgKG9iamVjdEhhc0RpZmYocHJldlByb3BzLCB0aGlzLnByb3BzKSkge1xuICAgICAgICAgICAgdGhpcy51cGRhdGVQb3NpdGlvbigpO1xuICAgICAgICB9XG4gICAgfVxuXG4gICAgLy8gUmVtb3ZlIHRoZSB3cmFwcGVyIGVsZW1lbnQsIGFzIHRoZSB0b29sdGlwIGhhcyBmaW5pc2hlZCB1c2luZyBpdFxuICAgIHB1YmxpYyBjb21wb25lbnRXaWxsVW5tb3VudCgpOiB2b2lkIHtcbiAgICAgICAgd2luZG93LnJlbW92ZUV2ZW50TGlzdGVuZXIoXCJzY3JvbGxcIiwgdGhpcy51cGRhdGVQb3NpdGlvbiwge1xuICAgICAgICAgICAgY2FwdHVyZTogdHJ1ZSxcbiAgICAgICAgfSk7XG4gICAgfVxuXG4gICAgLy8gQWRkIHRoZSBwYXJlbnQncyBwb3NpdGlvbiB0byB0aGUgdG9vbHRpcHMsIHNvIGl0J3MgY29ycmVjdGx5XG4gICAgLy8gcG9zaXRpb25lZCwgYWxzbyB0YWtpbmcgaW50byBhY2NvdW50IGFueSB3aW5kb3cgem9vbVxuICAgIHByaXZhdGUgdXBkYXRlUG9zaXRpb24gPSAoKTogdm9pZCA9PiB7XG4gICAgICAgIC8vIFdoZW4gdGhlIHRvb2x0aXAgaXMgaGlkZGVuLCBubyBuZWVkIHRvIHRocmFzaCB0aGUgRE9NIHdpdGggYHN0eWxlYCBhdHRyaWJ1dGUgdXBkYXRlcyAocGVyZm9ybWFuY2UpXG4gICAgICAgIGlmICghdGhpcy5wcm9wcy52aXNpYmxlIHx8ICF0aGlzLnBhcmVudCkgcmV0dXJuO1xuXG4gICAgICAgIGNvbnN0IHBhcmVudEJveCA9IHRoaXMucGFyZW50LmdldEJvdW5kaW5nQ2xpZW50UmVjdCgpO1xuICAgICAgICBjb25zdCB3aWR0aCA9IFVJU3RvcmUuaW5zdGFuY2Uud2luZG93V2lkdGg7XG4gICAgICAgIGNvbnN0IHNwYWNpbmcgPSA2O1xuICAgICAgICBjb25zdCBwYXJlbnRXaWR0aCA9IHRoaXMucHJvcHMubWF4UGFyZW50V2lkdGhcbiAgICAgICAgICAgID8gTWF0aC5taW4ocGFyZW50Qm94LndpZHRoLCB0aGlzLnByb3BzLm1heFBhcmVudFdpZHRoKVxuICAgICAgICAgICAgOiBwYXJlbnRCb3gud2lkdGg7XG4gICAgICAgIGNvbnN0IGJhc2VUb3AgPSBwYXJlbnRCb3gudG9wICsgd2luZG93LnNjcm9sbFk7XG4gICAgICAgIGNvbnN0IGNlbnRlclRvcCA9IHBhcmVudEJveC50b3AgKyB3aW5kb3cuc2Nyb2xsWSArIHBhcmVudEJveC5oZWlnaHQgLyAyO1xuICAgICAgICBjb25zdCByaWdodCA9IHdpZHRoIC0gcGFyZW50Qm94LmxlZnQgLSB3aW5kb3cuc2Nyb2xsWDtcbiAgICAgICAgY29uc3QgbGVmdCA9IHBhcmVudEJveC5yaWdodCArIHdpbmRvdy5zY3JvbGxYO1xuICAgICAgICBjb25zdCBob3Jpem9udGFsQ2VudGVyID0gcGFyZW50Qm94LmxlZnQgLSB3aW5kb3cuc2Nyb2xsWCArIHBhcmVudFdpZHRoIC8gMjtcblxuICAgICAgICBjb25zdCBzdHlsZTogU3RhdGUgPSB7fTtcbiAgICAgICAgc3dpdGNoICh0aGlzLnByb3BzLmFsaWdubWVudCkge1xuICAgICAgICAgICAgY2FzZSBBbGlnbm1lbnQuTmF0dXJhbDpcbiAgICAgICAgICAgICAgICBpZiAocGFyZW50Qm94LnJpZ2h0ID4gd2lkdGggLyAyKSB7XG4gICAgICAgICAgICAgICAgICAgIHN0eWxlLnJpZ2h0ID0gcmlnaHQgKyBzcGFjaW5nO1xuICAgICAgICAgICAgICAgICAgICBzdHlsZS50b3AgPSBjZW50ZXJUb3A7XG4gICAgICAgICAgICAgICAgICAgIHN0eWxlLnRyYW5zZm9ybSA9IFwidHJhbnNsYXRlWSgtNTAlKVwiO1xuICAgICAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAvLyBmYWxsIHRocm91Z2ggdG8gUmlnaHRcbiAgICAgICAgICAgIGNhc2UgQWxpZ25tZW50LlJpZ2h0OlxuICAgICAgICAgICAgICAgIHN0eWxlLmxlZnQgPSBsZWZ0ICsgc3BhY2luZztcbiAgICAgICAgICAgICAgICBzdHlsZS50b3AgPSBjZW50ZXJUb3A7XG4gICAgICAgICAgICAgICAgc3R5bGUudHJhbnNmb3JtID0gXCJ0cmFuc2xhdGVZKC01MCUpXCI7XG4gICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICBjYXNlIEFsaWdubWVudC5MZWZ0OlxuICAgICAgICAgICAgICAgIHN0eWxlLnJpZ2h0ID0gcmlnaHQgKyBzcGFjaW5nO1xuICAgICAgICAgICAgICAgIHN0eWxlLnRvcCA9IGNlbnRlclRvcDtcbiAgICAgICAgICAgICAgICBzdHlsZS50cmFuc2Zvcm0gPSBcInRyYW5zbGF0ZVkoLTUwJSlcIjtcbiAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgIGNhc2UgQWxpZ25tZW50LlRvcDpcbiAgICAgICAgICAgICAgICBzdHlsZS50b3AgPSBiYXNlVG9wIC0gc3BhY2luZztcbiAgICAgICAgICAgICAgICAvLyBBdHRlbXB0IHRvIGNlbnRlciB0aGUgdG9vbHRpcCBvbiB0aGUgZWxlbWVudCB3aGlsZSBjbGFtcGluZ1xuICAgICAgICAgICAgICAgIC8vIGl0cyBob3Jpem9udGFsIHRyYW5zbGF0aW9uIHRvIGtlZXAgaXQgb24gc2NyZWVuXG4gICAgICAgICAgICAgICAgLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIG1heC1sZW5cbiAgICAgICAgICAgICAgICBzdHlsZS50cmFuc2Zvcm0gPSBgdHJhbnNsYXRlKG1heCgxMHB4LCBtaW4oY2FsYygke2hvcml6b250YWxDZW50ZXJ9cHggLSA1MCUpLCBjYWxjKDEwMHZ3IC0gMTAwJSAtIDEwcHgpKSksIC0xMDAlKWA7XG4gICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICBjYXNlIEFsaWdubWVudC5Cb3R0b206XG4gICAgICAgICAgICAgICAgc3R5bGUudG9wID0gYmFzZVRvcCArIHBhcmVudEJveC5oZWlnaHQgKyBzcGFjaW5nO1xuICAgICAgICAgICAgICAgIC8vIEF0dGVtcHQgdG8gY2VudGVyIHRoZSB0b29sdGlwIG9uIHRoZSBlbGVtZW50IHdoaWxlIGNsYW1waW5nXG4gICAgICAgICAgICAgICAgLy8gaXRzIGhvcml6b250YWwgdHJhbnNsYXRpb24gdG8ga2VlcCBpdCBvbiBzY3JlZW5cbiAgICAgICAgICAgICAgICAvLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgbWF4LWxlblxuICAgICAgICAgICAgICAgIHN0eWxlLnRyYW5zZm9ybSA9IGB0cmFuc2xhdGUobWF4KDEwcHgsIG1pbihjYWxjKCR7aG9yaXpvbnRhbENlbnRlcn1weCAtIDUwJSksIGNhbGMoMTAwdncgLSAxMDAlIC0gMTBweCkpKSlgO1xuICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgY2FzZSBBbGlnbm1lbnQuSW5uZXJCb3R0b206XG4gICAgICAgICAgICAgICAgc3R5bGUudG9wID0gYmFzZVRvcCArIHBhcmVudEJveC5oZWlnaHQgLSA1MDtcbiAgICAgICAgICAgICAgICAvLyBBdHRlbXB0IHRvIGNlbnRlciB0aGUgdG9vbHRpcCBvbiB0aGUgZWxlbWVudCB3aGlsZSBjbGFtcGluZ1xuICAgICAgICAgICAgICAgIC8vIGl0cyBob3Jpem9udGFsIHRyYW5zbGF0aW9uIHRvIGtlZXAgaXQgb24gc2NyZWVuXG4gICAgICAgICAgICAgICAgLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIG1heC1sZW5cbiAgICAgICAgICAgICAgICBzdHlsZS50cmFuc2Zvcm0gPSBgdHJhbnNsYXRlKG1heCgxMHB4LCBtaW4oY2FsYygke2hvcml6b250YWxDZW50ZXJ9cHggLSA1MCUpLCBjYWxjKDEwMHZ3IC0gMTAwJSAtIDEwcHgpKSkpYDtcbiAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgIGNhc2UgQWxpZ25tZW50LlRvcFJpZ2h0OlxuICAgICAgICAgICAgICAgIHN0eWxlLnRvcCA9IGJhc2VUb3AgLSBzcGFjaW5nO1xuICAgICAgICAgICAgICAgIHN0eWxlLnJpZ2h0ID0gd2lkdGggLSBwYXJlbnRCb3gucmlnaHQgLSB3aW5kb3cuc2Nyb2xsWDtcbiAgICAgICAgICAgICAgICBzdHlsZS50cmFuc2Zvcm0gPSBcInRyYW5zbGF0ZVkoLTEwMCUpXCI7XG4gICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgIH1cblxuICAgICAgICB0aGlzLnNldFN0YXRlKHN0eWxlKTtcbiAgICB9O1xuXG4gICAgcHVibGljIHJlbmRlcigpOiBSZWFjdC5SZWFjdE5vZGUge1xuICAgICAgICBjb25zdCB0b29sdGlwQ2xhc3NlcyA9IGNsYXNzTmFtZXMoXCJteF9Ub29sdGlwXCIsIHRoaXMucHJvcHMudG9vbHRpcENsYXNzTmFtZSwge1xuICAgICAgICAgICAgbXhfVG9vbHRpcF92aXNpYmxlOiB0aGlzLnByb3BzLnZpc2libGUsXG4gICAgICAgICAgICBteF9Ub29sdGlwX2ludmlzaWJsZTogIXRoaXMucHJvcHMudmlzaWJsZSxcbiAgICAgICAgfSk7XG5cbiAgICAgICAgY29uc3Qgc3R5bGUgPSB7IC4uLnRoaXMuc3RhdGUgfTtcbiAgICAgICAgLy8gSGlkZSB0aGUgZW50aXJlIGNvbnRhaW5lciB3aGVuIG5vdCB2aXNpYmxlLlxuICAgICAgICAvLyBUaGlzIHByZXZlbnRzIGZsYXNoaW5nIG9mIHRoZSB0b29sdGlwIGlmIGl0IGlzIG5vdCBtZWFudCB0byBiZSB2aXNpYmxlIG9uIGZpcnN0IG1vdW50LlxuICAgICAgICBzdHlsZS5kaXNwbGF5ID0gdGhpcy5wcm9wcy52aXNpYmxlID8gXCJibG9ja1wiIDogXCJub25lXCI7XG5cbiAgICAgICAgY29uc3QgdG9vbHRpcCA9IChcbiAgICAgICAgICAgIDxkaXYgaWQ9e3RoaXMucHJvcHMuaWR9IHJvbGU9e3RoaXMucHJvcHMucm9sZSB8fCBcInRvb2x0aXBcIn0gY2xhc3NOYW1lPXt0b29sdGlwQ2xhc3Nlc30gc3R5bGU9e3N0eWxlfT5cbiAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzTmFtZT1cIm14X1Rvb2x0aXBfY2hldnJvblwiIC8+XG4gICAgICAgICAgICAgICAge3RoaXMucHJvcHMubGFiZWx9XG4gICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgKTtcblxuICAgICAgICByZXR1cm4gPGRpdiBjbGFzc05hbWU9e3RoaXMucHJvcHMuY2xhc3NOYW1lfT57UmVhY3RET00uY3JlYXRlUG9ydGFsKHRvb2x0aXAsIFRvb2x0aXAuY29udGFpbmVyKX08L2Rpdj47XG4gICAgfVxufVxuIl0sIm1hcHBpbmdzIjoiOzs7Ozs7OztBQVdBLElBQUFBLE1BQUEsR0FBQUMsc0JBQUEsQ0FBQUMsT0FBQTtBQUNBLElBQUFDLFNBQUEsR0FBQUYsc0JBQUEsQ0FBQUMsT0FBQTtBQUNBLElBQUFFLFdBQUEsR0FBQUgsc0JBQUEsQ0FBQUMsT0FBQTtBQUVBLElBQUFHLFFBQUEsR0FBQUosc0JBQUEsQ0FBQUMsT0FBQTtBQUNBLElBQUFJLFFBQUEsR0FBQUosT0FBQTtBQUF1RCxTQUFBSyxRQUFBQyxDQUFBLEVBQUFDLENBQUEsUUFBQUMsQ0FBQSxHQUFBQyxNQUFBLENBQUFDLElBQUEsQ0FBQUosQ0FBQSxPQUFBRyxNQUFBLENBQUFFLHFCQUFBLFFBQUFDLENBQUEsR0FBQUgsTUFBQSxDQUFBRSxxQkFBQSxDQUFBTCxDQUFBLEdBQUFDLENBQUEsS0FBQUssQ0FBQSxHQUFBQSxDQUFBLENBQUFDLE1BQUEsV0FBQU4sQ0FBQSxXQUFBRSxNQUFBLENBQUFLLHdCQUFBLENBQUFSLENBQUEsRUFBQUMsQ0FBQSxFQUFBUSxVQUFBLE9BQUFQLENBQUEsQ0FBQVEsSUFBQSxDQUFBQyxLQUFBLENBQUFULENBQUEsRUFBQUksQ0FBQSxZQUFBSixDQUFBO0FBQUEsU0FBQVUsY0FBQVosQ0FBQSxhQUFBQyxDQUFBLE1BQUFBLENBQUEsR0FBQVksU0FBQSxDQUFBQyxNQUFBLEVBQUFiLENBQUEsVUFBQUMsQ0FBQSxXQUFBVyxTQUFBLENBQUFaLENBQUEsSUFBQVksU0FBQSxDQUFBWixDQUFBLFFBQUFBLENBQUEsT0FBQUYsT0FBQSxD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