UNPKG

matrix-react-sdk

Version:
291 lines (244 loc) 32.2 kB
"use strict"; var _interopRequireDefault = require("@babel/runtime/helpers/interopRequireDefault"); var _interopRequireWildcard = require("@babel/runtime/helpers/interopRequireWildcard"); Object.defineProperty(exports, "__esModule", { value: true }); exports.default = void 0; var _react = _interopRequireWildcard(require("react")); var _classnames = _interopRequireDefault(require("classnames")); var _languageHandler = require("../../../languageHandler"); var _RoomAvatar = _interopRequireDefault(require("../avatars/RoomAvatar")); var _ContextMenu = require("../../structures/ContextMenu"); var _SpaceCreateMenu = _interopRequireDefault(require("./SpaceCreateMenu")); var _SpaceTreeLevel = require("./SpaceTreeLevel"); var _AccessibleTooltipButton = _interopRequireDefault(require("../elements/AccessibleTooltipButton")); var _useEventEmitter = require("../../../hooks/useEventEmitter"); var _SpaceStore = _interopRequireWildcard(require("../../../stores/SpaceStore")); var _AutoHideScrollbar = _interopRequireDefault(require("../../structures/AutoHideScrollbar")); var _NotificationBadge = _interopRequireDefault(require("../rooms/NotificationBadge")); var _RovingTabIndex = require("../../../accessibility/RovingTabIndex"); var _Keyboard = require("../../../Keyboard"); var _RoomNotificationStateStore = require("../../../stores/notifications/RoomNotificationStateStore"); /* Copyright 2021 The Matrix.org Foundation C.I.C. Licensed under the Apache License, Version 2.0 (the "License"); you may not use this file except in compliance with the License. You may obtain a copy of the License at http://www.apache.org/licenses/LICENSE-2.0 Unless required by applicable law or agreed to in writing, software distributed under the License is distributed on an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the License for the specific language governing permissions and limitations under the License. */ const SpaceButton /*: React.FC<IButtonProps>*/ = ({ space, className, selected, onClick, tooltip, notificationState, isNarrow, children }) => { const classes = (0, _classnames.default)("mx_SpaceButton", className, { mx_SpaceButton_active: selected, mx_SpaceButton_narrow: isNarrow }); let avatar = /*#__PURE__*/_react.default.createElement("div", { className: "mx_SpaceButton_avatarPlaceholder" }, /*#__PURE__*/_react.default.createElement("div", { className: "mx_SpaceButton_icon" })); if (space) { avatar = /*#__PURE__*/_react.default.createElement(_RoomAvatar.default, { width: 32, height: 32, room: space }); } let notifBadge; if (notificationState) { notifBadge = /*#__PURE__*/_react.default.createElement("div", { className: "mx_SpacePanel_badgeContainer" }, /*#__PURE__*/_react.default.createElement(_NotificationBadge.default, { forceCount: false, notification: notificationState })); } let button; if (isNarrow) { button = /*#__PURE__*/_react.default.createElement(_RovingTabIndex.RovingAccessibleTooltipButton, { className: classes, title: tooltip, onClick: onClick, role: "treeitem" }, /*#__PURE__*/_react.default.createElement("div", { className: "mx_SpaceButton_selectionWrapper" }, avatar, notifBadge, children)); } else { button = /*#__PURE__*/_react.default.createElement(_RovingTabIndex.RovingAccessibleButton, { className: classes, onClick: onClick, role: "treeitem" }, /*#__PURE__*/_react.default.createElement("div", { className: "mx_SpaceButton_selectionWrapper" }, avatar, /*#__PURE__*/_react.default.createElement("span", { className: "mx_SpaceButton_name" }, tooltip), notifBadge, children)); } return /*#__PURE__*/_react.default.createElement("li", { className: (0, _classnames.default)({ "mx_SpaceItem": true, "collapsed": isNarrow }) }, button); }; const useSpaces = () => /*: [Room[], Room[], Room | null]*/ { const [invites, setInvites] = (0, _react.useState)(_SpaceStore.default.instance.invitedSpaces); (0, _useEventEmitter.useEventEmitter)(_SpaceStore.default.instance, _SpaceStore.UPDATE_INVITED_SPACES, setInvites); const [spaces, setSpaces] = (0, _react.useState)(_SpaceStore.default.instance.spacePanelSpaces); (0, _useEventEmitter.useEventEmitter)(_SpaceStore.default.instance, _SpaceStore.UPDATE_TOP_LEVEL_SPACES, setSpaces); const [activeSpace, setActiveSpace] = (0, _react.useState)(_SpaceStore.default.instance.activeSpace); (0, _useEventEmitter.useEventEmitter)(_SpaceStore.default.instance, _SpaceStore.UPDATE_SELECTED_SPACE, setActiveSpace); return [invites, spaces, activeSpace]; }; const SpacePanel = () => { // We don't need the handle as we position the menu in a constant location // eslint-disable-next-line @typescript-eslint/no-unused-vars const [menuDisplayed, handle, openMenu, closeMenu] = (0, _ContextMenu.useContextMenu)(); const [invites, spaces, activeSpace] = useSpaces(); const [isPanelCollapsed, setPanelCollapsed] = (0, _react.useState)(true); const newClasses = (0, _classnames.default)("mx_SpaceButton_new", { mx_SpaceButton_newCancel: menuDisplayed }); let contextMenu = null; if (menuDisplayed) { contextMenu = /*#__PURE__*/_react.default.createElement(_SpaceCreateMenu.default, { onFinished: closeMenu }); } const onKeyDown = (ev /*: React.KeyboardEvent*/ ) => { let handled = true; switch (ev.key) { case _Keyboard.Key.ARROW_UP: onMoveFocus(ev.target, true); break; case _Keyboard.Key.ARROW_DOWN: onMoveFocus(ev.target, false); break; default: handled = false; } if (handled) { // consume all other keys in context menu ev.stopPropagation(); ev.preventDefault(); } }; const onMoveFocus = (element /*: Element*/ , up /*: boolean*/ ) => { let descending = false; // are we currently descending or ascending through the DOM tree? let classes /*: DOMTokenList*/ ; do { const child = up ? element.lastElementChild : element.firstElementChild; const sibling = up ? element.previousElementSibling : element.nextElementSibling; if (descending) { if (child) { element = child; } else if (sibling) { element = sibling; } else { descending = false; element = element.parentElement; } } else { if (sibling) { element = sibling; descending = true; } else { element = element.parentElement; } } if (element) { if (element.classList.contains("mx_ContextualMenu")) { // we hit the top element = up ? element.lastElementChild : element.firstElementChild; descending = true; } classes = element.classList; } } while (element && !classes.contains("mx_SpaceButton")); if (element) { element.focus(); } }; const activeSpaces = activeSpace ? [activeSpace] : []; const expandCollapseButtonTitle = isPanelCollapsed ? (0, _languageHandler._t)("Expand space panel") : (0, _languageHandler._t)("Collapse space panel"); // TODO drag and drop for re-arranging order return /*#__PURE__*/_react.default.createElement(_RovingTabIndex.RovingTabIndexProvider, { handleHomeEnd: true, onKeyDown: onKeyDown }, ({ onKeyDownHandler }) => /*#__PURE__*/_react.default.createElement("ul", { className: (0, _classnames.default)("mx_SpacePanel", { collapsed: isPanelCollapsed }), onKeyDown: onKeyDownHandler }, /*#__PURE__*/_react.default.createElement(_AutoHideScrollbar.default, { className: "mx_SpacePanel_spaceTreeWrapper" }, /*#__PURE__*/_react.default.createElement("div", { className: "mx_SpaceTreeLevel" }, /*#__PURE__*/_react.default.createElement(SpaceButton, { className: "mx_SpaceButton_home", onClick: () => _SpaceStore.default.instance.setActiveSpace(null), selected: !activeSpace, tooltip: (0, _languageHandler._t)("All rooms"), notificationState: _RoomNotificationStateStore.RoomNotificationStateStore.instance.globalState, isNarrow: isPanelCollapsed }), invites.map(s => /*#__PURE__*/_react.default.createElement(_SpaceTreeLevel.SpaceItem, { key: s.roomId, space: s, activeSpaces: activeSpaces, isPanelCollapsed: isPanelCollapsed, onExpand: () => setPanelCollapsed(false) })), spaces.map(s => /*#__PURE__*/_react.default.createElement(_SpaceTreeLevel.SpaceItem, { key: s.roomId, space: s, activeSpaces: activeSpaces, isPanelCollapsed: isPanelCollapsed, onExpand: () => setPanelCollapsed(false) }))), /*#__PURE__*/_react.default.createElement(SpaceButton, { className: newClasses, tooltip: menuDisplayed ? (0, _languageHandler._t)("Cancel") : (0, _languageHandler._t)("Create a space"), onClick: menuDisplayed ? closeMenu : () => { openMenu(); if (!isPanelCollapsed) setPanelCollapsed(true); }, isNarrow: isPanelCollapsed })), /*#__PURE__*/_react.default.createElement(_AccessibleTooltipButton.default, { className: (0, _classnames.default)("mx_SpacePanel_toggleCollapse", { expanded: !isPanelCollapsed }), onClick: () => { setPanelCollapsed(!isPanelCollapsed); if (menuDisplayed) closeMenu(); }, title: expandCollapseButtonTitle }), contextMenu)); }; var _default = SpacePanel; exports.default = _default; //# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uL3NyYy9jb21wb25lbnRzL3ZpZXdzL3NwYWNlcy9TcGFjZVBhbmVsLnRzeCJdLCJuYW1lcyI6WyJTcGFjZUJ1dHRvbiIsInNwYWNlIiwiY2xhc3NOYW1lIiwic2VsZWN0ZWQiLCJvbkNsaWNrIiwidG9vbHRpcCIsIm5vdGlmaWNhdGlvblN0YXRlIiwiaXNOYXJyb3ciLCJjaGlsZHJlbiIsImNsYXNzZXMiLCJteF9TcGFjZUJ1dHRvbl9hY3RpdmUiLCJteF9TcGFjZUJ1dHRvbl9uYXJyb3ciLCJhdmF0YXIiLCJub3RpZkJhZGdlIiwiYnV0dG9uIiwidXNlU3BhY2VzIiwiaW52aXRlcyIsInNldEludml0ZXMiLCJTcGFjZVN0b3JlIiwiaW5zdGFuY2UiLCJpbnZpdGVkU3BhY2VzIiwiVVBEQVRFX0lOVklURURfU1BBQ0VTIiwic3BhY2VzIiwic2V0U3BhY2VzIiwic3BhY2VQYW5lbFNwYWNlcyIsIlVQREFURV9UT1BfTEVWRUxfU1BBQ0VTIiwiYWN0aXZlU3BhY2UiLCJzZXRBY3RpdmVTcGFjZSIsIlVQREFURV9TRUxFQ1RFRF9TUEFDRSIsIlNwYWNlUGFuZWwiLCJtZW51RGlzcGxheWVkIiwiaGFuZGxlIiwib3Blbk1lbnUiLCJjbG9zZU1lbnUiLCJpc1BhbmVsQ29sbGFwc2VkIiwic2V0UGFuZWxDb2xsYXBzZWQiLCJuZXdDbGFzc2VzIiwibXhfU3BhY2VCdXR0b25fbmV3Q2FuY2VsIiwiY29udGV4dE1lbnUiLCJvbktleURvd24iLCJldiIsImhhbmRsZWQiLCJrZXkiLCJLZXkiLCJBUlJPV19VUCIsIm9uTW92ZUZvY3VzIiwidGFyZ2V0IiwiQVJST1dfRE9XTiIsInN0b3BQcm9wYWdhdGlvbiIsInByZXZlbnREZWZhdWx0IiwiZWxlbWVudCIsInVwIiwiZGVzY2VuZGluZyIsImNoaWxkIiwibGFzdEVsZW1lbnRDaGlsZCIsImZpcnN0RWxlbWVudENoaWxkIiwic2libGluZyIsInByZXZpb3VzRWxlbWVudFNpYmxpbmciLCJuZXh0RWxlbWVudFNpYmxpbmciLCJwYXJlbnRFbGVtZW50IiwiY2xhc3NMaXN0IiwiY29udGFpbnMiLCJmb2N1cyIsImFjdGl2ZVNwYWNlcyIsImV4cGFuZENvbGxhcHNlQnV0dG9uVGl0bGUiLCJvbktleURvd25IYW5kbGVyIiwiY29sbGFwc2VkIiwiUm9vbU5vdGlmaWNhdGlvblN0YXRlU3RvcmUiLCJnbG9iYWxTdGF0ZSIsIm1hcCIsInMiLCJyb29tSWQiLCJleHBhbmRlZCJdLCJtYXBwaW5ncyI6Ijs7Ozs7Ozs7Ozs7QUFnQkE7O0FBQ0E7O0FBR0E7O0FBQ0E7O0FBQ0E7O0FBQ0E7O0FBQ0E7O0FBQ0E7O0FBQ0E7O0FBQ0E7O0FBS0E7O0FBQ0E7O0FBQ0E7O0FBS0E7O0FBQ0E7O0FBeENBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQXVDQSxNQUFNQTtBQUFtQztBQUFBLEVBQUcsQ0FBQztBQUN6Q0MsRUFBQUEsS0FEeUM7QUFFekNDLEVBQUFBLFNBRnlDO0FBR3pDQyxFQUFBQSxRQUh5QztBQUl6Q0MsRUFBQUEsT0FKeUM7QUFLekNDLEVBQUFBLE9BTHlDO0FBTXpDQyxFQUFBQSxpQkFOeUM7QUFPekNDLEVBQUFBLFFBUHlDO0FBUXpDQyxFQUFBQTtBQVJ5QyxDQUFELEtBU3RDO0FBQ0YsUUFBTUMsT0FBTyxHQUFHLHlCQUFXLGdCQUFYLEVBQTZCUCxTQUE3QixFQUF3QztBQUNwRFEsSUFBQUEscUJBQXFCLEVBQUVQLFFBRDZCO0FBRXBEUSxJQUFBQSxxQkFBcUIsRUFBRUo7QUFGNkIsR0FBeEMsQ0FBaEI7O0FBS0EsTUFBSUssTUFBTSxnQkFBRztBQUFLLElBQUEsU0FBUyxFQUFDO0FBQWYsa0JBQWtEO0FBQUssSUFBQSxTQUFTLEVBQUM7QUFBZixJQUFsRCxDQUFiOztBQUNBLE1BQUlYLEtBQUosRUFBVztBQUNQVyxJQUFBQSxNQUFNLGdCQUFHLDZCQUFDLG1CQUFEO0FBQVksTUFBQSxLQUFLLEVBQUUsRUFBbkI7QUFB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QU8sRUFBRU4sYUFBYSxHQUFHLHlCQUFHLFFBQUgsQ0FBSCxHQUFrQix5QkFBRyxnQkFBSCxDQUY1QztBQUdJLElBQUEsT0FBTyxFQUFFQSxhQUFhLEdBQUdHLFNBQUgsR0FBZSxNQUFNO0FBQ3ZDRCxNQUFBQSxRQUFRO0FBQ1IsVUFBSSxDQUFDRSxnQkFBTCxFQUF1QkMsaUJBQWlCLENBQUMsSUFBRCxDQUFqQjtBQUMxQixLQU5MO0FBT0ksSUFBQSxRQUFRLEVBQUVEO0FBUGQsSUF6QkosQ0FKSixlQXVDSSw2QkFBQyxnQ0FBRDtBQUNJLElBQUEsU0FBUyxFQUFFLHlCQUFXLDhCQUFYLEVBQTJDO0FBQUNzQyxNQUFBQSxRQUFRLEVBQUUsQ0FBQ3RDO0FBQVosS0FBM0MsQ0FEZjtBQUVJLElBQUEsT0FBTyxFQUFFLE1BQU07QUFDWEMsTUFBQUEsaUJBQWlCLENBQUMsQ0FBQ0QsZ0JBQUYsQ0FBakI7QUFDQSxVQUFJSixhQUFKLEVBQW1CRyxTQUFTO0FBQy9CLEtBTEw7QUFNSSxJQUFBLEtBQUssRUFBRStCO0FBTlgsSUF2Q0osRUErQ00xQixXQS9DTixDQUZELENBQVA7QUFxREgsQ0FySUQ7O2VBdUllVCxVIiwic291cmNlc0NvbnRlbnQiOlsiLypcbkNvcHlyaWdodCAyMDIxIFRoZSBNYXRyaXgub3JnIEZvdW5kYXRpb24gQy5JLkMuXG5cbkxpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSBcIkxpY2Vuc2VcIik7XG55b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuXG5Zb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXRcblxuICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMFxuXG5Vbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlXG5kaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiBcIkFTIElTXCIgQkFTSVMsXG5XSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC5cblNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmRcbmxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLlxuKi9cblxuaW1wb3J0IFJlYWN0LCB7dXNlU3RhdGV9IGZyb20gXCJyZWFjdFwiO1xuaW1wb3J0IGNsYXNzTmFtZXMgZnJvbSBcImNsYXNzbmFtZXNcIjtcbmltcG9ydCB7Um9vbX0gZnJvbSBcIm1hdHJpeC1qcy1zZGsvc3JjL21vZGVscy9yb29tXCI7XG5cbmltcG9ydCB7X3R9IGZyb20gXCIuLi8uLi8uLi9sYW5ndWFnZUhhbmRsZXJcIjtcbmltcG9ydCBSb29tQXZhdGFyIGZyb20gXCIuLi9hdmF0YXJzL1Jvb21BdmF0YXJcIjtcbmltcG9ydCB7dXNlQ29udGV4dE1lbnV9IGZyb20gXCIuLi8uLi9zdHJ1Y3R1cmVzL0NvbnRleHRNZW51XCI7XG5pbXBvcnQgU3BhY2VDcmVhdGVNZW51IGZyb20gXCIuL1NwYWNlQ3JlYXRlTWVudVwiO1xuaW1wb3J0IHtTcGFjZUl0ZW19IGZyb20gXCIuL1NwYWNlVHJlZUxldmVsXCI7XG5pbXBvcnQgQWNjZXNzaWJsZVRvb2x0aXBCdXR0b24gZnJvbSBcIi4uL2VsZW1lbnRzL0FjY2Vzc2libGVUb29sdGlwQnV0dG9uXCI7XG5pbXBvcnQge3VzZUV2ZW50RW1pdHRlcn0gZnJvbSBcIi4uLy4uLy4uL2hvb2tzL3VzZUV2ZW50RW1pdHRlclwiO1xuaW1wb3J0IFNwYWNlU3RvcmUsIHtcbiAgICBVUERBVEVfSU5WSVRFRF9TUEFDRVMsXG4gICAgVVBEQVRFX1NFTEVDVEVEX1NQQUNFLFxuICAgIFVQREFURV9UT1BfTEVWRUxfU1BBQ0VTLFxufSBmcm9tIFwiLi4vLi4vLi4vc3RvcmVzL1NwYWNlU3RvcmVcIjtcbmltcG9ydCBBdXRvSGlkZVNjcm9sbGJhciBmcm9tIFwiLi4vLi4vc3RydWN0dXJlcy9BdXRvSGlkZVNjcm9sbGJhclwiO1xuaW1wb3J0IE5vdGlmaWNhdGlvbkJhZGdlIGZyb20gXCIuLi9yb29tcy9Ob3RpZmljYXRpb25CYWRnZVwiO1xuaW1wb3J0IHtcbiAgICBSb3ZpbmdBY2Nlc3NpYmxlQnV0dG9uLFxuICAgIFJvdmluZ0FjY2Vzc2libGVUb29sdGlwQnV0dG9uLFxuICAgIFJvdmluZ1RhYkluZGV4UHJvdmlkZXIsXG59IGZyb20gXCIuLi8uLi8uLi9hY2Nlc3NpYmlsaXR5L1JvdmluZ1RhYkluZGV4XCI7XG5pbXBvcnQge0tleX0gZnJvbSBcIi4uLy4uLy4uL0tleWJvYXJkXCI7XG5pbXBvcnQge1Jvb21Ob3RpZmljYXRpb25TdGF0ZVN0b3JlfSBmcm9tIFwiLi4vLi4vLi4vc3RvcmVzL25vdGlmaWNhdGlvbnMvUm9vbU5vdGlmaWNhdGlvblN0YXRlU3RvcmVcIjtcbmltcG9ydCB7Tm90aWZpY2F0aW9uU3RhdGV9IGZyb20gXCIuLi8uLi8uLi9zdG9yZXMvbm90aWZpY2F0aW9ucy9Ob3RpZmljYXRpb25TdGF0ZVwiO1xuXG5pbnRlcmZhY2UgSUJ1dHRvblByb3BzIHtcbiAgICBzcGFjZT86IFJvb207XG4gICAgY2xhc3NOYW1lPzogc3RyaW5nO1xuICAgIHNlbGVjdGVkPzogYm9vbGVhbjtcbiAgICB0b29sdGlwPzogc3RyaW5nO1xuICAgIG5vdGlmaWNhdGlvblN0YXRlPzogTm90aWZpY2F0aW9uU3RhdGU7XG4gICAgaXNOYXJyb3c/OiBib29sZWFuO1xuICAgIG9uQ2xpY2soKTogdm9pZDtcbn1cblxuY29uc3QgU3BhY2VCdXR0b246IFJlYWN0LkZDPElCdXR0b25Qcm9wcz4gPSAoe1xuICAgIHNwYWNlLFxuICAgIGNsYXNzTmFtZSxcbiAgICBzZWxlY3RlZCxcbiAgICBvbkNsaWNrLFxuICAgIHRvb2x0aXAsXG4gICAgbm90aWZpY2F0aW9uU3RhdGUsXG4gICAgaXNOYXJyb3csXG4gICAgY2hpbGRyZW4sXG59KSA9PiB7XG4gICAgY29uc3QgY2xhc3NlcyA9IGNsYXNzTmFtZXMoXCJteF9TcGFjZUJ1dHRvblwiLCBjbGFzc05hbWUsIHtcbiAgICAgICAgbXhfU3BhY2VCdXR0b25fYWN0aXZlOiBzZWxlY3RlZCxcbiAgICAgICAgbXhfU3BhY2VCdXR0b25fbmFycm93OiBpc05hcnJvdyxcbiAgICB9KTtcblxuICAgIGxldCBhdmF0YXIgPSA8ZGl2IGNsYXNzTmFtZT1cIm14X1NwYWNlQnV0dG9uX2F2YXRhclBsYWNlaG9sZGVyXCI+PGRpdiBjbGFzc05hbWU9XCJteF9TcGFjZUJ1dHRvbl9pY29uXCIgLz48L2Rpdj47XG4gICAgaWYgKHNwYWNlKSB7XG4gICAgICAgIGF2YXRhciA9IDxSb29tQXZhdGFyIHdpZHRoPXszMn0gaGVpZ2h0PXszMn0gcm9vbT17c3BhY2V9IC8+O1xuICAgIH1cblxuICAgIGxldCBub3RpZkJhZGdlO1xuICAgIGlmIChub3RpZmljYXRpb25TdGF0ZSkge1xuICAgICAgICBub3RpZkJhZGdlID0gPGRpdiBjbGFzc05hbWU9XCJteF9TcGFjZVBhbmVsX2JhZGdlQ29udGFpbmVyXCI+XG4gICAgICAgICAgICA8Tm90aWZpY2F0aW9uQmFkZ2UgZm9yY2VDb3VudD17ZmFsc2V9IG5vdGlmaWNhdGlvbj17bm90aWZpY2F0aW9uU3RhdGV9IC8+XG4gICAgICAgIDwvZGl2PjtcbiAgICB9XG5cbiAgICBsZXQgYnV0dG9uO1xuICAgIGlmIChpc05hcnJvdykge1xuICAgICAgICBidXR0b24gPSAoXG4gICAgICAgICAgICA8Um92aW5nQWNjZXNzaWJsZVRvb2x0aXBCdXR0b24gY2xhc3NOYW1lPXtjbGFzc2VzfSB0aXRsZT17dG9vbHRpcH0gb25DbGljaz17b25DbGlja30gcm9sZT1cInRyZWVpdGVtXCI+XG4gICAgICAgICAgICAgICAgPGRpdiBjbGFzc05hbWU9XCJteF9TcGFjZUJ1dHRvbl9zZWxlY3Rpb25XcmFwcGVyXCI+XG4gICAgICAgICAgICAgICAgICAgIHsgYXZhdGFyIH1cbiAgICAgICAgICAgICAgICAgICAgeyBub3RpZkJhZGdlIH1cbiAgICAgICAgICAgICAgICAgICAgeyBjaGlsZHJlbiB9XG4gICAgICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgICA8L1JvdmluZ0FjY2Vzc2libGVUb29sdGlwQnV0dG9uPlxuICAgICAgICApO1xuICAgIH0gZWxzZSB7XG4gICAgICAgIGJ1dHRvbiA9IChcbiAgICAgICAgICAgIDxSb3ZpbmdBY2Nlc3NpYmxlQnV0dG9uIGNsYXNzTmFtZT17Y2xhc3Nlc30gb25DbGljaz17b25DbGlja30gcm9sZT1cInRyZWVpdGVtXCI+XG4gICAgICAgICAgICAgICAgPGRpdiBjbGFzc05hbWU9XCJteF9TcGFjZUJ1dHRvbl9zZWxlY3Rpb25XcmFwcGVyXCI+XG4gICAgICAgICAgICAgICAgICAgIHsgYXZhdGFyIH1cbiAgICAgICAgICAgICAgICAgICAgPHNwYW4gY2xhc3NOYW1lPVwibXhfU3BhY2VCdXR0b25fbmFtZVwiPnsgdG9vbHRpcCB9PC9zcGFuPlxuICAgICAgICAgICAgICAgICAgICB7IG5vdGlmQmFkZ2UgfVxuICAgICAgICAgICAgICAgICAgICB7IGNoaWxkcmVuIH1cbiAgICAgICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICAgIDwvUm92aW5nQWNjZXNzaWJsZUJ1dHRvbj5cbiAgICAgICAgKTtcbiAgICB9XG5cbiAgICByZXR1cm4gPGxpIGNsYXNzTmFtZT17Y2xhc3NOYW1lcyh7XG4gICAgICAgIFwibXhfU3BhY2VJdGVtXCI6IHRydWUsXG4gICAgICAgIFwiY29sbGFwc2VkXCI6IGlzTmFycm93LFxuICAgIH0pfT5cbiAgICAgICAgeyBidXR0b24gfVxuICAgIDwvbGk+O1xufVxuXG5jb25zdCB1c2VTcGFjZXMgPSAoKTogW1Jvb21bXSwgUm9vbVtdLCBSb29tIHwgbnVsbF0gPT4ge1xuICAgIGNvbnN0IFtpbnZpdGVzLCBzZXRJbnZpdGVzXSA9IHVzZVN0YXRlPFJvb21bXT4oU3BhY2VTdG9yZS5pbnN0YW5jZS5pbnZpdGVkU3BhY2VzKTtcbiAgICB1c2VFdmVudEVtaXR0ZXIoU3BhY2VTdG9yZS5pbnN0YW5jZSwgVVBEQVRFX0lOVklURURfU1BBQ0VTLCBzZXRJbnZpdGVzKTtcbiAgICBjb25zdCBbc3BhY2VzLCBzZXRTcGFjZXNdID0gdXNlU3RhdGU8Um9vbVtdPihTcGFjZVN0b3JlLmluc3RhbmNlLnNwYWNlUGFuZWxTcGFjZXMpO1xuICAgIHVzZUV2ZW50RW1pdHRlcihTcGFjZVN0b3JlLmluc3RhbmNlLCBVUERBVEVfVE9QX0xFVkVMX1NQQUNFUywgc2V0U3BhY2VzKTtcbiAgICBjb25zdCBbYWN0aXZlU3BhY2UsIHNldEFjdGl2ZVNwYWNlXSA9IHVzZVN0YXRlPFJvb20+KFNwYWNlU3RvcmUuaW5zdGFuY2UuYWN0aXZlU3BhY2UpO1xuICAgIHVzZUV2ZW50RW1pdHRlcihTcGFjZVN0b3JlLmluc3RhbmNlLCBVUERBVEVfU0VMRUNURURfU1BBQ0UsIHNldEFjdGl2ZVNwYWNlKTtcbiAgICByZXR1cm4gW2ludml0ZXMsIHNwYWNlcywgYWN0aXZlU3BhY2VdO1xufTtcblxuY29uc3QgU3BhY2VQYW5lbCA9ICgpID0+IHtcbiAgICAvLyBXZSBkb24ndCBuZWVkIHRoZSBoYW5kbGUgYXMgd2UgcG9zaXRpb24gdGhlIG1lbnUgaW4gYSBjb25zdGFudCBsb2NhdGlvblxuICAgIC8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBAdHlwZXNjcmlwdC1lc2xpbnQvbm8tdW51c2VkLXZhcnNcbiAgICBjb25zdCBbbWVudURpc3BsYXllZCwgaGFuZGxlLCBvcGVuTWVudSwgY2xvc2VNZW51XSA9IHVzZUNvbnRleHRNZW51PHZvaWQ+KCk7XG4gICAgY29uc3QgW2ludml0ZXMsIHNwYWNlcywgYWN0aXZlU3BhY2VdID0gdXNlU3BhY2VzKCk7XG4gICAgY29uc3QgW2lzUGFuZWxDb2xsYXBzZWQsIHNldFBhbmVsQ29sbGFwc2VkXSA9IHVzZVN0YXRlKHRydWUpO1xuXG4gICAgY29uc3QgbmV3Q2xhc3NlcyA9IGNsYXNzTmFtZXMoXCJteF9TcGFjZUJ1dHRvbl9uZXdcIiwge1xuICAgICAgICBteF9TcGFjZUJ1dHRvbl9uZXdDYW5jZWw6IG1lbnVEaXNwbGF5ZWQsXG4gICAgfSk7XG5cbiAgICBsZXQgY29udGV4dE1lbnUgPSBudWxsO1xuICAgIGlmIChtZW51RGlzcGxheWVkKSB7XG4gICAgICAgIGNvbnRleHRNZW51ID0gPFNwYWNlQ3JlYXRlTWVudSBvbkZpbmlzaGVkPXtjbG9zZU1lbnV9IC8+O1xuICAgIH1cblxuICAgIGNvbnN0IG9uS2V5RG93biA9IChldjogUmVhY3QuS2V5Ym9hcmRFdmVudCkgPT4ge1xuICAgICAgICBsZXQgaGFuZGxlZCA9IHRydWU7XG5cbiAgICAgICAgc3dpdGNoIChldi5rZXkpIHtcbiAgICAgICAgICAgIGNhc2UgS2V5LkFSUk9XX1VQOlxuICAgICAgICAgICAgICAgIG9uTW92ZUZvY3VzKGV2LnRhcmdldCBhcyBFbGVtZW50LCB0cnVlKTtcbiAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgIGNhc2UgS2V5LkFSUk9XX0RPV046XG4gICAgICAgICAgICAgICAgb25Nb3ZlRm9jdXMoZXYudGFyZ2V0IGFzIEVsZW1lbnQsIGZhbHNlKTtcbiAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgIGRlZmF1bHQ6XG4gICAgICAgICAgICAgICAgaGFuZGxlZCA9IGZhbHNlO1xuICAgICAgICB9XG5cbiAgICAgICAgaWYgKGhhbmRsZWQpIHtcbiAgICAgICAgICAgIC8vIGNvbnN1bWUgYWxsIG90aGVyIGtleXMgaW4gY29udGV4dCBtZW51XG4gICAgICAgICAgICBldi5zdG9wUHJvcGFnYXRpb24oKTtcbiAgICAgICAgICAgIGV2LnByZXZlbnREZWZhdWx0KCk7XG4gICAgICAgIH1cbiAgICB9O1xuXG4gICAgY29uc3Qgb25Nb3ZlRm9jdXMgPSAoZWxlbWVudDogRWxlbWVudCwgdXA6IGJvb2xlYW4pID0+IHtcbiAgICAgICAgbGV0IGRlc2NlbmRpbmcgPSBmYWxzZTsgLy8gYXJlIHdlIGN1cnJlbnRseSBkZXNjZW5kaW5nIG9yIGFzY2VuZGluZyB0aHJvdWdoIHRoZSBET00gdHJlZT9cbiAgICAgICAgbGV0IGNsYXNzZXM6IERPTVRva2VuTGlzdDtcblxuICAgICAgICBkbyB7XG4gICAgICAgICAgICBjb25zdCBjaGlsZCA9IHVwID8gZWxlbWVudC5sYXN0RWxlbWVudENoaWxkIDogZWxlbWVudC5maXJzdEVsZW1lbnRDaGlsZDtcbiAgICAgICAgICAgIGNvbnN0IHNpYmxpbmcgPSB1cCA/IGVsZW1lbnQucHJldmlvdXNFbGVtZW50U2libGluZyA6IGVsZW1lbnQubmV4dEVsZW1lbnRTaWJsaW5nO1xuXG4gICAgICAgICAgICBpZiAoZGVzY2VuZGluZykge1xuICAgICAgICAgICAgICAgIGlmIChjaGlsZCkge1xuICAgICAgICAgICAgICAgICAgICBlbGVtZW50ID0gY2hpbGQ7XG4gICAgICAgICAgICAgICAgfSBlbHNlIGlmIChzaWJsaW5nKSB7XG4gICAgICAgICAgICAgICAgICAgIGVsZW1lbnQgPSBzaWJsaW5nO1xuICAgICAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgICAgIGRlc2NlbmRpbmcgPSBmYWxzZTtcbiAgICAgICAgICAgICAgICAgICAgZWxlbWVudCA9IGVsZW1lbnQucGFyZW50RWxlbWVudDtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgIGlmIChzaWJsaW5nKSB7XG4gICAgICAgICAgICAgICAgICAgIGVsZW1lbnQgPSBzaWJsaW5nO1xuICAgICAgICAgICAgICAgICAgICBkZXNjZW5kaW5nID0gdHJ1ZTtcbiAgICAgICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgICAgICBlbGVtZW50ID0gZWxlbWVudC5wYXJlbnRFbGVtZW50O1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgaWYgKGVsZW1lbnQpIHtcbiAgICAgICAgICAgICAgICBpZiAoZWxlbWVudC5jbGFzc0xpc3QuY29udGFpbnMoXCJteF9Db250ZXh0dWFsTWVudVwiKSkgeyAvLyB3ZSBoaXQgdGhlIHRvcFxuICAgICAgICAgICAgICAgICAgICBlbGVtZW50ID0gdXAgPyBlbGVtZW50Lmxhc3RFbGVtZW50Q2hpbGQgOiBlbGVtZW50LmZpcnN0RWxlbWVudENoaWxkO1xuICAgICAgICAgICAgICAgICAgICBkZXNjZW5kaW5nID0gdHJ1ZTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgY2xhc3NlcyA9IGVsZW1lbnQuY2xhc3NMaXN0O1xuICAgICAgICAgICAgfVxuICAgICAgICB9IHdoaWxlIChlbGVtZW50ICYmICFjbGFzc2VzLmNvbnRhaW5zKFwibXhfU3BhY2VCdXR0b25cIikpO1xuXG4gICAgICAgIGlmIChlbGVtZW50KSB7XG4gICAgICAgICAgICAoZWxlbWVudCBhcyBIVE1MRWxlbWVudCkuZm9jdXMoKTtcbiAgICAgICAgfVxuICAgIH07XG5cbiAgICBjb25zdCBhY3RpdmVTcGFjZXMgPSBhY3RpdmVTcGFjZSA/IFthY3RpdmVTcGFjZV0gOiBbXTtcbiAgICBjb25zdCBleHBhbmRDb2xsYXBzZUJ1dHRvblRpdGxlID0gaXNQYW5lbENvbGxhcHNlZCA/IF90KFwiRXhwYW5kIHNwYWNlIHBhbmVsXCIpIDogX3QoXCJDb2xsYXBzZSBzcGFjZSBwYW5lbFwiKTtcbiAgICAvLyBUT0RPIGRyYWcgYW5kIGRyb3AgZm9yIHJlLWFycmFuZ2luZyBvcmRlclxuICAgIHJldHVybiA8Um92aW5nVGFiSW5kZXhQcm92aWRlciBoYW5kbGVIb21lRW5kPXt0cnVlfSBvbktleURvd249e29uS2V5RG93bn0+XG4gICAgICAgIHsoe29uS2V5RG93bkhhbmRsZXJ9KSA9PiAoXG4gICAgICAgICAgICA8dWxcbiAgICAgICAgICAgICAgICBjbGFzc05hbWU9e2NsYXNzTmFtZXMoXCJteF9TcGFjZVBhbmVsXCIsIHsgY29sbGFwc2VkOiBpc1BhbmVsQ29sbGFwc2VkIH0pfVxuICAgICAgICAgICAgICAgIG9uS2V5RG93bj17b25LZXlEb3duSGFuZGxlcn1cbiAgICAgICAgICAgID5cbiAgICAgICAgICAgICAgICA8QXV0b0hpZGVTY3JvbGxiYXIgY2xhc3NOYW1lPVwibXhfU3BhY2VQYW5lbF9zcGFjZVRyZWVXcmFwcGVyXCI+XG4gICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3NOYW1lPVwibXhfU3BhY2VUcmVlTGV2ZWxcIj5cbiAgICAgICAgICAgICAgICAgICAgICAgIDxTcGFjZUJ1dHRvblxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNsYXNzTmFtZT1cIm14X1NwYWNlQnV0dG9uX2hvbWVcIlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIG9uQ2xpY2s9eygpID0+IFNwYWNlU3RvcmUuaW5zdGFuY2Uuc2V0QWN0aXZlU3BhY2UobnVsbCl9XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgc2VsZWN0ZWQ9eyFhY3RpdmVTcGFjZX1cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB0b29sdGlwPXtfdChcIkFsbCByb29tc1wiKX1cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBub3RpZmljYXRpb25TdGF0ZT17Um9vbU5vdGlmaWNhdGlvblN0YXRlU3RvcmUuaW5zdGFuY2UuZ2xvYmFsU3RhdGV9XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgaXNOYXJyb3c9e2lzUGFuZWxDb2xsYXBzZWR9XG4gICAgICAgICAgICAgICAgICAgICAgICAvPlxuICAgICAgICAgICAgICAgICAgICAgICAgeyBpbnZpdGVzLm1hcChzID0+IDxTcGFjZUl0ZW1cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBrZXk9e3Mucm9vbUlkfVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNwYWNlPXtzfVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGFjdGl2ZVNwYWNlcz17YWN0aXZlU3BhY2VzfVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlzUGFuZWxDb2xsYXBzZWQ9e2lzUGFuZWxDb2xsYXBzZWR9XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgb25FeHBhbmQ9eygpID0+IHNldFBhbmVsQ29sbGFwc2VkKGZhbHNlKX1cbiAgICAgICAgICAgICAgICAgICAgICAgIC8+KSB9XG4gICAgICAgICAgICAgICAgICAgICAgICB7IHNwYWNlcy5tYXAocyA9PiA8U3BhY2VJdGVtXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAga2V5PXtzLnJvb21JZH1cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBzcGFjZT17c31cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBhY3RpdmVTcGFjZXM9e2FjdGl2ZVNwYWNlc31cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBpc1BhbmVsQ29sbGFwc2VkPXtpc1BhbmVsQ29sbGFwc2VkfVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIG9uRXhwYW5kPXsoKSA9PiBzZXRQYW5lbENvbGxhcHNlZChmYWxzZSl9XG4gICAgICAgICAgICAgICAgICAgICAgICAvPikgfVxuICAgICAgICAgICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICAgICAgICAgICAgPFNwYWNlQnV0dG9uXG4gICAgICAgICAgICAgICAgICAgICAgICBjbGFzc05hbWU9e25ld0NsYXNzZXN9XG4gICAgICAgICAgICAgICAgICAgICAgICB0b29sdGlwPXttZW51RGlzcGxheWVkID8gX3QoXCJDYW5jZWxcIikgOiBfdChcIkNyZWF0ZSBhIHNwYWNlXCIpfVxuICAgICAgICAgICAgICAgICAgICAgICAgb25DbGljaz17bWVudURpc3BsYXllZCA/IGNsb3NlTWVudSA6ICgpID0+IHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBvcGVuTWVudSgpO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmICghaXNQYW5lbENvbGxhcHNlZCkgc2V0UGFuZWxDb2xsYXBzZWQodHJ1ZSk7XG4gICAgICAgICAgICAgICAgICAgICAgICB9fVxuICAgICAgICAgICAgICAgICAgICAgICAgaXNOYXJyb3c9e2lzUGFuZWxDb2xsYXBzZWR9XG4gICAgICAgICAgICAgICAgICAgIC8+XG4gICAgICAgICAgICAgICAgPC9BdXRvSGlkZVNjcm9sbGJhcj5cbiAgICAgICAgICAgICAgICA8QWNjZXNzaWJsZVRvb2x0aXBCdXR0b25cbiAgICAgICAgICAgICAgICAgICAgY2xhc3NOYW1lPXtjbGFzc05hbWVzKFwibXhfU3BhY2VQYW5lbF90b2dnbGVDb2xsYXBzZVwiLCB7ZXhwYW5kZWQ6ICFpc1BhbmVsQ29sbGFwc2VkfSl9XG4gICAgICAgICAgICAgICAgICAgIG9uQ2xpY2s9eygpID0+IHtcbiAgICAgICAgICAgICAgICAgICAgICAgIHNldFBhbmVsQ29sbGFwc2VkKCFpc1BhbmVsQ29sbGFwc2VkKTtcbiAgICAgICAgICAgICAgICAgICAgICAgIGlmIChtZW51RGlzcGxheWVkKSBjbG9zZU1lbnUoKTtcbiAgICAgICAgICAgICAgICAgICAgfX1cbiAgICAgICAgICAgICAgICAgICAgdGl0bGU9e2V4cGFuZENvbGxhcHNlQnV0dG9uVGl0bGV9XG4gICAgICAgICAgICAgICAgLz5cbiAgICAgICAgICAgICAgICB7IGNvbnRleHRNZW51IH1cbiAgICAgICAgICAgIDwvdWw+XG4gICAgICAgICl9XG4gICAgPC9Sb3ZpbmdUYWJJbmRleFByb3ZpZGVyPlxufTtcblxuZXhwb3J0IGRlZmF1bHQgU3BhY2VQYW5lbDtcbiJdfQ==