UNPKG

matrix-react-sdk

Version:
157 lines (154 loc) 24.3 kB
"use strict"; var _interopRequireDefault = require("@babel/runtime/helpers/interopRequireDefault"); Object.defineProperty(exports, "__esModule", { value: true }); exports.TabLocation = exports.Tab = void 0; exports.default = TabbedView; exports.useActiveTabWithDefault = useActiveTabWithDefault; var React = _interopRequireWildcard(require("react")); var _classnames = _interopRequireDefault(require("classnames")); var _languageHandler = require("../../languageHandler"); var _AutoHideScrollbar = _interopRequireDefault(require("./AutoHideScrollbar")); var _PosthogTrackers = require("../../PosthogTrackers"); var _RovingTabIndex = require("../../accessibility/RovingTabIndex"); var _useWindowWidth = require("../../hooks/useWindowWidth"); function _getRequireWildcardCache(e) { if ("function" != typeof WeakMap) return null; var r = new WeakMap(), t = new WeakMap(); return (_getRequireWildcardCache = function (e) { return e ? t : r; })(e); } function _interopRequireWildcard(e, r) { if (!r && e && e.__esModule) return e; if (null === e || "object" != typeof e && "function" != typeof e) return { default: e }; var t = _getRequireWildcardCache(r); if (t && t.has(e)) return t.get(e); var n = { __proto__: null }, a = Object.defineProperty && Object.getOwnPropertyDescriptor; for (var u in e) if ("default" !== u && {}.hasOwnProperty.call(e, u)) { var i = a ? Object.getOwnPropertyDescriptor(e, u) : null; i && (i.get || i.set) ? Object.defineProperty(n, u, i) : n[u] = e[u]; } return n.default = e, t && t.set(e, n), n; } /* Copyright 2024 New Vector Ltd. Copyright 2019, 2020 , 2024 The Matrix.org Foundation C.I.C. Copyright 2019 New Vector Ltd Copyright 2017 Travis Ralston SPDX-License-Identifier: AGPL-3.0-only OR GPL-3.0-only Please see LICENSE files in the repository root for full details. */ /** * Represents a tab for the TabbedView. */ class Tab { /** * Creates a new tab. * @param {string} id The tab's ID. * @param {string} label The untranslated tab label. * @param {string|JSX.Element} icon An SVG element to use for the tab icon. Can also be a string for legacy icons, in which case it is the class for the tab icon. This should be a simple mask. * @param {React.ReactNode} body The JSX for the tab container. * @param {string} screenName The screen name to report to Posthog. */ constructor(id, label, icon, body, screenName) { this.id = id; this.label = label; this.icon = icon; this.body = body; this.screenName = screenName; } } exports.Tab = Tab; function useActiveTabWithDefault(tabs, defaultTabID, initialTabID) { const [activeTabId, setActiveTabId] = React.useState(initialTabID && tabs.some(t => t.id === initialTabID) ? initialTabID : defaultTabID); return [activeTabId, setActiveTabId]; } let TabLocation = exports.TabLocation = /*#__PURE__*/function (TabLocation) { TabLocation["LEFT"] = "left"; TabLocation["TOP"] = "top"; return TabLocation; }({}); function domIDForTabID(tabId) { return `mx_tabpanel_${tabId}`; } function TabPanel({ tab }) { return /*#__PURE__*/React.createElement("div", { className: "mx_TabbedView_tabPanel", key: tab.id, id: domIDForTabID(tab.id), "aria-labelledby": `${domIDForTabID(tab.id)}_label` }, /*#__PURE__*/React.createElement(_AutoHideScrollbar.default, { className: "mx_TabbedView_tabPanelContent" }, tab.body)); } function TabLabel({ tab, isActive, showToolip, onClick }) { const classes = (0, _classnames.default)("mx_TabbedView_tabLabel", { mx_TabbedView_tabLabel_active: isActive }); let tabIcon; if (tab.icon) { if (typeof tab.icon === "object") { tabIcon = tab.icon; } else if (typeof tab.icon === "string") { tabIcon = /*#__PURE__*/React.createElement("span", { className: `mx_TabbedView_maskedIcon ${tab.icon}` }); } } const id = domIDForTabID(tab.id); const label = (0, _languageHandler._t)(tab.label); return /*#__PURE__*/React.createElement(_RovingTabIndex.RovingAccessibleButton, { className: classes, onClick: onClick, "data-testid": `settings-tab-${tab.id}`, role: "tab", "aria-selected": isActive, "aria-controls": id, element: "li", title: showToolip ? label : undefined }, tabIcon, /*#__PURE__*/React.createElement("span", { className: "mx_TabbedView_tabLabel_text", id: `${id}_label` }, label)); } /** * A tabbed view component. Given objects representing content with titles, displays * them in a tabbed view where the user can select which one of the items to view at once. */ function TabbedView(props) { const tabLocation = props.tabLocation ?? TabLocation.LEFT; const getTabById = id => { return props.tabs.find(tab => tab.id === id); }; const windowWidth = (0, _useWindowWidth.useWindowWidth)(); const labels = props.tabs.map(tab => /*#__PURE__*/React.createElement(TabLabel, { key: "tab_label_" + tab.id, tab: tab, isActive: tab.id === props.activeTabId, onClick: () => props.onChange(tab.id) // This should be the same as the the CSS breakpoint at which the tab labels are hidden , showToolip: windowWidth < 1024 && tabLocation == TabLocation.LEFT })); const tab = getTabById(props.activeTabId); const panel = tab ? /*#__PURE__*/React.createElement(TabPanel, { tab: tab }) : null; const tabbedViewClasses = (0, _classnames.default)({ mx_TabbedView: true, mx_TabbedView_tabsOnLeft: tabLocation == TabLocation.LEFT, mx_TabbedView_tabsOnTop: tabLocation == TabLocation.TOP, mx_TabbedView_responsive: props.responsive }); const screenName = tab?.screenName ?? props.screenName; return /*#__PURE__*/React.createElement("div", { className: tabbedViewClasses }, screenName && /*#__PURE__*/React.createElement(_PosthogTrackers.PosthogScreenTracker, { screenName: screenName }), /*#__PURE__*/React.createElement(_RovingTabIndex.RovingTabIndexProvider, { handleLoop: true, handleHomeEnd: true, handleLeftRight: tabLocation == TabLocation.TOP, handleUpDown: tabLocation == TabLocation.LEFT }, ({ onKeyDownHandler }) => /*#__PURE__*/React.createElement("ul", { className: "mx_TabbedView_tabLabels", role: "tablist", "aria-orientation": tabLocation == TabLocation.LEFT ? "vertical" : "horizontal", onKeyDown: onKeyDownHandler }, labels)), panel); } //# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJuYW1lcyI6WyJSZWFjdCIsIl9pbnRlcm9wUmVxdWlyZVdpbGRjYXJkIiwicmVxdWlyZSIsIl9jbGFzc25hbWVzIiwiX2ludGVyb3BSZXF1aXJlRGVmYXVsdCIsIl9sYW5ndWFnZUhhbmRsZXIiLCJfQXV0b0hpZGVTY3JvbGxiYXIiLCJfUG9zdGhvZ1RyYWNrZXJzIiwiX1JvdmluZ1RhYkluZGV4IiwiX3VzZVdpbmRvd1dpZHRoIiwiX2dldFJlcXVpcmVXaWxkY2FyZENhY2hlIiwiZSIsIldlYWtNYXAiLCJyIiwidCIsIl9fZXNNb2R1bGUiLCJkZWZhdWx0IiwiaGFzIiwiZ2V0IiwibiIsIl9fcHJvdG9fXyIsImEiLCJPYmplY3QiLCJkZWZpbmVQcm9wZXJ0eSIsImdldE93blByb3BlcnR5RGVzY3JpcHRvciIsInUiLCJoYXNPd25Qcm9wZXJ0eSIsImNhbGwiLCJpIiwic2V0IiwiVGFiIiwiY29uc3RydWN0b3IiLCJpZCIsImxhYmVsIiwiaWNvbiIsImJvZHkiLCJzY3JlZW5OYW1lIiwiZXhwb3J0cyIsInVzZUFjdGl2ZVRhYldpdGhEZWZhdWx0IiwidGFicyIsImRlZmF1bHRUYWJJRCIsImluaXRpYWxUYWJJRCIsImFjdGl2ZVRhYklkIiwic2V0QWN0aXZlVGFiSWQiLCJ1c2VTdGF0ZSIsInNvbWUiLCJUYWJMb2NhdGlvbiIsImRvbUlERm9yVGFiSUQiLCJ0YWJJZCIsIlRhYlBhbmVsIiwidGFiIiwiY3JlYXRlRWxlbWVudCIsImNsYXNzTmFtZSIsImtleSIsIlRhYkxhYmVsIiwiaXNBY3RpdmUiLCJzaG93VG9vbGlwIiwib25DbGljayIsImNsYXNzZXMiLCJjbGFzc05hbWVzIiwibXhfVGFiYmVkVmlld190YWJMYWJlbF9hY3RpdmUiLCJ0YWJJY29uIiwiX3QiLCJSb3ZpbmdBY2Nlc3NpYmxlQnV0dG9uIiwicm9sZSIsImVsZW1lbnQiLCJ0aXRsZSIsInVuZGVmaW5lZCIsIlRhYmJlZFZpZXciLCJwcm9wcyIsInRhYkxvY2F0aW9uIiwiTEVGVCIsImdldFRhYkJ5SWQiLCJmaW5kIiwid2luZG93V2lkdGgiLCJ1c2VXaW5kb3dXaWR0aCIsImxhYmVscyIsIm1hcCIsIm9uQ2hhbmdlIiwicGFuZWwiLCJ0YWJiZWRWaWV3Q2xhc3NlcyIsIm14X1RhYmJlZFZpZXciLCJteF9UYWJiZWRWaWV3X3RhYnNPbkxlZnQiLCJteF9UYWJiZWRWaWV3X3RhYnNPblRvcCIsIlRPUCIsIm14X1RhYmJlZFZpZXdfcmVzcG9uc2l2ZSIsInJlc3BvbnNpdmUiLCJQb3N0aG9nU2NyZWVuVHJhY2tlciIsIlJvdmluZ1RhYkluZGV4UHJvdmlkZXIiLCJoYW5kbGVMb29wIiwiaGFuZGxlSG9tZUVuZCIsImhhbmRsZUxlZnRSaWdodCIsImhhbmRsZVVwRG93biIsIm9uS2V5RG93bkhhbmRsZXIiLCJvbktleURvd24iXSwic291cmNlcyI6WyIuLi8uLi8uLi9zcmMvY29tcG9uZW50cy9zdHJ1Y3R1cmVzL1RhYmJlZFZpZXcudHN4Il0sInNvdXJjZXNDb250ZW50IjpbIi8qXG5Db3B5cmlnaHQgMjAyNCBOZXcgVmVjdG9yIEx0ZC5cbkNvcHlyaWdodCAyMDE5LCAyMDIwICwgMjAyNCBUaGUgTWF0cml4Lm9yZyBGb3VuZGF0aW9uIEMuSS5DLlxuQ29weXJpZ2h0IDIwMTkgTmV3IFZlY3RvciBMdGRcbkNvcHlyaWdodCAyMDE3IFRyYXZpcyBSYWxzdG9uXG5cblNQRFgtTGljZW5zZS1JZGVudGlmaWVyOiBBR1BMLTMuMC1vbmx5IE9SIEdQTC0zLjAtb25seVxuUGxlYXNlIHNlZSBMSUNFTlNFIGZpbGVzIGluIHRoZSByZXBvc2l0b3J5IHJvb3QgZm9yIGZ1bGwgZGV0YWlscy5cbiovXG5cbmltcG9ydCAqIGFzIFJlYWN0IGZyb20gXCJyZWFjdFwiO1xuaW1wb3J0IGNsYXNzTmFtZXMgZnJvbSBcImNsYXNzbmFtZXNcIjtcblxuaW1wb3J0IHsgX3QsIFRyYW5zbGF0aW9uS2V5IH0gZnJvbSBcIi4uLy4uL2xhbmd1YWdlSGFuZGxlclwiO1xuaW1wb3J0IEF1dG9IaWRlU2Nyb2xsYmFyIGZyb20gXCIuL0F1dG9IaWRlU2Nyb2xsYmFyXCI7XG5pbXBvcnQgeyBQb3N0aG9nU2NyZWVuVHJhY2tlciwgU2NyZWVuTmFtZSB9IGZyb20gXCIuLi8uLi9Qb3N0aG9nVHJhY2tlcnNcIjtcbmltcG9ydCB7IE5vbkVtcHR5QXJyYXkgfSBmcm9tIFwiLi4vLi4vQHR5cGVzL2NvbW1vblwiO1xuaW1wb3J0IHsgUm92aW5nQWNjZXNzaWJsZUJ1dHRvbiwgUm92aW5nVGFiSW5kZXhQcm92aWRlciB9IGZyb20gXCIuLi8uLi9hY2Nlc3NpYmlsaXR5L1JvdmluZ1RhYkluZGV4XCI7XG5pbXBvcnQgeyB1c2VXaW5kb3dXaWR0aCB9IGZyb20gXCIuLi8uLi9ob29rcy91c2VXaW5kb3dXaWR0aFwiO1xuXG4vKipcbiAqIFJlcHJlc2VudHMgYSB0YWIgZm9yIHRoZSBUYWJiZWRWaWV3LlxuICovXG5leHBvcnQgY2xhc3MgVGFiPFQgZXh0ZW5kcyBzdHJpbmc+IHtcbiAgICAvKipcbiAgICAgKiBDcmVhdGVzIGEgbmV3IHRhYi5cbiAgICAgKiBAcGFyYW0ge3N0cmluZ30gaWQgVGhlIHRhYidzIElELlxuICAgICAqIEBwYXJhbSB7c3RyaW5nfSBsYWJlbCBUaGUgdW50cmFuc2xhdGVkIHRhYiBsYWJlbC5cbiAgICAgKiBAcGFyYW0ge3N0cmluZ3xKU1guRWxlbWVudH0gaWNvbiBBbiBTVkcgZWxlbWVudCB0byB1c2UgZm9yIHRoZSB0YWIgaWNvbi4gQ2FuIGFsc28gYmUgYSBzdHJpbmcgZm9yIGxlZ2FjeSBpY29ucywgaW4gd2hpY2ggY2FzZSBpdCBpcyB0aGUgY2xhc3MgZm9yIHRoZSB0YWIgaWNvbi4gVGhpcyBzaG91bGQgYmUgYSBzaW1wbGUgbWFzay5cbiAgICAgKiBAcGFyYW0ge1JlYWN0LlJlYWN0Tm9kZX0gYm9keSBUaGUgSlNYIGZvciB0aGUgdGFiIGNvbnRhaW5lci5cbiAgICAgKiBAcGFyYW0ge3N0cmluZ30gc2NyZWVuTmFtZSBUaGUgc2NyZWVuIG5hbWUgdG8gcmVwb3J0IHRvIFBvc3Rob2cuXG4gICAgICovXG4gICAgcHVibGljIGNvbnN0cnVjdG9yKFxuICAgICAgICBwdWJsaWMgcmVhZG9ubHkgaWQ6IFQsXG4gICAgICAgIHB1YmxpYyByZWFkb25seSBsYWJlbDogVHJhbnNsYXRpb25LZXksXG4gICAgICAgIHB1YmxpYyByZWFkb25seSBpY29uOiBzdHJpbmcgfCBKU1guRWxlbWVudCB8IG51bGwsXG4gICAgICAgIHB1YmxpYyByZWFkb25seSBib2R5OiBSZWFjdC5SZWFjdE5vZGUsXG4gICAgICAgIHB1YmxpYyByZWFkb25seSBzY3JlZW5OYW1lPzogU2NyZWVuTmFtZSxcbiAgICApIHt9XG59XG5cbmV4cG9ydCBmdW5jdGlvbiB1c2VBY3RpdmVUYWJXaXRoRGVmYXVsdDxUIGV4dGVuZHMgc3RyaW5nPihcbiAgICB0YWJzOiBOb25FbXB0eUFycmF5PFRhYjxzdHJpbmc+PixcbiAgICBkZWZhdWx0VGFiSUQ6IFQsXG4gICAgaW5pdGlhbFRhYklEPzogVCxcbik6IFtULCAodGFiSWQ6IFQpID0+IHZvaWRdIHtcbiAgICBjb25zdCBbYWN0aXZlVGFiSWQsIHNldEFjdGl2ZVRhYklkXSA9IFJlYWN0LnVzZVN0YXRlKFxuICAgICAgICBpbml0aWFsVGFiSUQgJiYgdGFicy5zb21lKCh0KSA9PiB0LmlkID09PSBpbml0aWFsVGFiSUQpID8gaW5pdGlhbFRhYklEIDogZGVmYXVsdFRhYklELFxuICAgICk7XG5cbiAgICByZXR1cm4gW2FjdGl2ZVRhYklkLCBzZXRBY3RpdmVUYWJJZF07XG59XG5cbmV4cG9ydCBlbnVtIFRhYkxvY2F0aW9uIHtcbiAgICBMRUZUID0gXCJsZWZ0XCIsXG4gICAgVE9QID0gXCJ0b3BcIixcbn1cblxuaW50ZXJmYWNlIElUYWJQYW5lbFByb3BzPFQgZXh0ZW5kcyBzdHJpbmc+IHtcbiAgICB0YWI6IFRhYjxUPjtcbn1cblxuZnVuY3Rpb24gZG9tSURGb3JUYWJJRCh0YWJJZDogc3RyaW5nKTogc3RyaW5nIHtcbiAgICByZXR1cm4gYG14X3RhYnBhbmVsXyR7dGFiSWR9YDtcbn1cblxuZnVuY3Rpb24gVGFiUGFuZWw8VCBleHRlbmRzIHN0cmluZz4oeyB0YWIgfTogSVRhYlBhbmVsUHJvcHM8VD4pOiBKU1guRWxlbWVudCB7XG4gICAgcmV0dXJuIChcbiAgICAgICAgPGRpdlxuICAgICAgICAgICAgY2xhc3NOYW1lPVwibXhfVGFiYmVkVmlld190YWJQYW5lbFwiXG4gICAgICAgICAgICBrZXk9e3RhYi5pZH1cbiAgICAgICAgICAgIGlkPXtkb21JREZvclRhYklEKHRhYi5pZCl9XG4gICAgICAgICAgICBhcmlhLWxhYmVsbGVkYnk9e2Ake2RvbUlERm9yVGFiSUQodGFiLmlkKX1fbGFiZWxgfVxuICAgICAgICA+XG4gICAgICAgICAgICA8QXV0b0hpZGVTY3JvbGxiYXIgY2xhc3NOYW1lPVwibXhfVGFiYmVkVmlld190YWJQYW5lbENvbnRlbnRcIj57dGFiLmJvZHl9PC9BdXRvSGlkZVNjcm9sbGJhcj5cbiAgICAgICAgPC9kaXY+XG4gICAgKTtcbn1cblxuaW50ZXJmYWNlIElUYWJMYWJlbFByb3BzPFQgZXh0ZW5kcyBzdHJpbmc+IHtcbiAgICB0YWI6IFRhYjxUPjtcbiAgICBpc0FjdGl2ZTogYm9vbGVhbjtcbiAgICBzaG93VG9vbGlwOiBib29sZWFuO1xuICAgIG9uQ2xpY2s6ICgpID0+IHZvaWQ7XG59XG5cbmZ1bmN0aW9uIFRhYkxhYmVsPFQgZXh0ZW5kcyBzdHJpbmc+KHsgdGFiLCBpc0FjdGl2ZSwgc2hvd1Rvb2xpcCwgb25DbGljayB9OiBJVGFiTGFiZWxQcm9wczxUPik6IEpTWC5FbGVtZW50IHtcbiAgICBjb25zdCBjbGFzc2VzID0gY2xhc3NOYW1lcyhcIm14X1RhYmJlZFZpZXdfdGFiTGFiZWxcIiwge1xuICAgICAgICBteF9UYWJiZWRWaWV3X3RhYkxhYmVsX2FjdGl2ZTogaXNBY3RpdmUsXG4gICAgfSk7XG5cbiAgICBsZXQgdGFiSWNvbjogSlNYLkVsZW1lbnQgfCB1bmRlZmluZWQ7XG4gICAgaWYgKHRhYi5pY29uKSB7XG4gICAgICAgIGlmICh0eXBlb2YgdGFiLmljb24gPT09IFwib2JqZWN0XCIpIHtcbiAgICAgICAgICAgIHRhYkljb24gPSB0YWIuaWNvbjtcbiAgICAgICAgfSBlbHNlIGlmICh0eXBlb2YgdGFiLmljb24gPT09IFwic3RyaW5nXCIpIHtcbiAgICAgICAgICAgIHRhYkljb24gPSA8c3BhbiBjbGFzc05hbWU9e2BteF9UYWJiZWRWaWV3X21hc2tlZEljb24gJHt0YWIuaWNvbn1gfSAvPjtcbiAgICAgICAgfVxuICAgIH1cblxuICAgIGNvbnN0IGlkID0gZG9tSURGb3JUYWJJRCh0YWIuaWQpO1xuXG4gICAgY29uc3QgbGFiZWwgPSBfdCh0YWIubGFiZWwpO1xuICAgIHJldHVybiAoXG4gICAgICAgIDxSb3ZpbmdBY2Nlc3NpYmxlQnV0dG9uXG4gICAgICAgICAgICBjbGFzc05hbWU9e2NsYXNzZXN9XG4gICAgICAgICAgICBvbkNsaWNrPXtvbkNsaWNrfVxuICAgICAgICAgICAgZGF0YS10ZXN0aWQ9e2BzZXR0aW5ncy10YWItJHt0YWIuaWR9YH1cbiAgICAgICAgICAgIHJvbGU9XCJ0YWJcIlxuICAgICAgICAgICAgYXJpYS1zZWxlY3RlZD17aXNBY3RpdmV9XG4gICAgICAgICAgICBhcmlhLWNvbnRyb2xzPXtpZH1cbiAgICAgICAgICAgIGVsZW1lbnQ9XCJsaVwiXG4gICAgICAgICAgICB0aXRsZT17c2hvd1Rvb2xpcCA/IGxhYmVsIDogdW5kZWZpbmVkfVxuICAgICAgICA+XG4gICAgICAgICAgICB7dGFiSWNvbn1cbiAgICAgICAgICAgIDxzcGFuIGNsYXNzTmFtZT1cIm14X1RhYmJlZFZpZXdfdGFiTGFiZWxfdGV4dFwiIGlkPXtgJHtpZH1fbGFiZWxgfT5cbiAgICAgICAgICAgICAgICB7bGFiZWx9XG4gICAgICAgICAgICA8L3NwYW4+XG4gICAgICAgIDwvUm92aW5nQWNjZXNzaWJsZUJ1dHRvbj5cbiAgICApO1xufVxuXG5pbnRlcmZhY2UgSVByb3BzPFQgZXh0ZW5kcyBzdHJpbmc+IHtcbiAgICAvLyBBbiBhcnJheSBvZiBvYmplY3RzIHJlcHJlc2VudGlnbiB0YWJzIHRoYXQgdGhlIHRhYmJlZCB2aWV3IHdpbGwgZGlzcGxheS5cbiAgICB0YWJzOiBOb25FbXB0eUFycmF5PFRhYjxUPj47XG4gICAgLy8gVGhlIElEIG9mIHRoZSB0YWIgdG8gc2hvd1xuICAgIGFjdGl2ZVRhYklkOiBUO1xuICAgIC8vIFRoZSBsb2NhdGlvbiBvZiB0aGUgdGFicywgZGljdGF0aW5nIHRoZSBsYXlvdXQgb2YgdGhlIFRhYmJlZFZpZXcuXG4gICAgdGFiTG9jYXRpb24/OiBUYWJMb2NhdGlvbjtcbiAgICAvLyBBIGNhbGxiYWNrIHRoYXQgaXMgY2FsbGVkIHdoZW4gdGhlIGFjdGl2ZSB0YWIgc2hvdWxkIGNoYW5nZVxuICAgIG9uQ2hhbmdlOiAodGFiSWQ6IFQpID0+IHZvaWQ7XG4gICAgLy8gVGhlIHNjcmVlbiBuYW1lIHRvIHJlcG9ydCB0byBQb3N0aG9nLlxuICAgIHNjcmVlbk5hbWU/OiBTY3JlZW5OYW1lO1xuICAgIC8qKlxuICAgICAqIElmIHRydWUsIHRoZSBsYXlvdXQgb2YgdGhlIHRhYmJlZCB2aWV3IHdpbGwgYmUgcmVzcG9uc2l2ZSB0byB0aGUgdmlld3BvcnQgc2l6ZSAoZWcsIGp1c3Qgc2hvd2luZyBpY29uc1xuICAgICAqIGluc3RlYWQgb2YgbmFtZXMgb2YgdGFicykuXG4gICAgICogT25seSBhcHBsaWVzIGlmIGB0YWJMb2NhdGlvbiA9PT0gVGFiTG9jYXRpb24uTEVGVGAuXG4gICAgICogRGVmYXVsdDogZmFsc2UuXG4gICAgICovXG4gICAgcmVzcG9uc2l2ZT86IGJvb2xlYW47XG59XG5cbi8qKlxuICogQSB0YWJiZWQgdmlldyBjb21wb25lbnQuIEdpdmVuIG9iamVjdHMgcmVwcmVzZW50aW5nIGNvbnRlbnQgd2l0aCB0aXRsZXMsIGRpc3BsYXlzXG4gKiB0aGVtIGluIGEgdGFiYmVkIHZpZXcgd2hlcmUgdGhlIHVzZXIgY2FuIHNlbGVjdCB3aGljaCBvbmUgb2YgdGhlIGl0ZW1zIHRvIHZpZXcgYXQgb25jZS5cbiAqL1xuZXhwb3J0IGRlZmF1bHQgZnVuY3Rpb24gVGFiYmVkVmlldzxUIGV4dGVuZHMgc3RyaW5nPihwcm9wczogSVByb3BzPFQ+KTogSlNYLkVsZW1lbnQge1xuICAgIGNvbnN0IHRhYkxvY2F0aW9uID0gcHJvcHMudGFiTG9jYXRpb24gPz8gVGFiTG9jYXRpb24uTEVGVDtcblxuICAgIGNvbnN0IGdldFRhYkJ5SWQgPSAoaWQ6IFQpOiBUYWI8VD4gfCB1bmRlZmluZWQgPT4ge1xuICAgICAgICByZXR1cm4gcHJvcHMudGFicy5maW5kKCh0YWIpID0+IHRhYi5pZCA9PT0gaWQpO1xuICAgIH07XG5cbiAgICBjb25zdCB3aW5kb3dXaWR0aCA9IHVzZVdpbmRvd1dpZHRoKCk7XG5cbiAgICBjb25zdCBsYWJlbHMgPSBwcm9wcy50YWJzLm1hcCgodGFiKSA9PiAoXG4gICAgICAgIDxUYWJMYWJlbFxuICAgICAgICAgICAga2V5PXtcInRhYl9sYWJlbF9cIiArIHRhYi5pZH1cbiAgICAgICAgICAgIHRhYj17dGFifVxuICAgICAgICAgICAgaXNBY3RpdmU9e3RhYi5pZCA9PT0gcHJvcHMuYWN0aXZlVGFiSWR9XG4gICAgICAgICAgICBvbkNsaWNrPXsoKSA9PiBwcm9wcy5vbkNoYW5nZSh0YWIuaWQpfVxuICAgICAgICAgICAgLy8gVGhpcyBzaG91bGQgYmUgdGhlIHNhbWUgYXMgdGhlIHRoZSBDU1MgYnJlYWtwb2ludCBhdCB3aGljaCB0aGUgdGFiIGxhYmVscyBhcmUgaGlkZGVuXG4gICAgICAgICAgICBzaG93VG9vbGlwPXt3aW5kb3dXaWR0aCA8IDEwMjQgJiYgdGFiTG9jYXRpb24gPT0gVGFiTG9jYXRpb24uTEVGVH1cbiAgICAgICAgLz5cbiAgICApKTtcbiAgICBjb25zdCB0YWIgPSBnZXRUYWJCeUlkKHByb3BzLmFjdGl2ZVRhYklkKTtcbiAgICBjb25zdCBwYW5lbCA9IHRhYiA/IDxUYWJQYW5lbCB0YWI9e3RhYn0gLz4gOiBudWxsO1xuXG4gICAgY29uc3QgdGFiYmVkVmlld0NsYXNzZXMgPSBjbGFzc05hbWVzKHtcbiAgICAgICAgbXhfVGFiYmVkVmlldzogdHJ1ZSxcbiAgICAgICAgbXhfVGFiYmVkVmlld190YWJzT25MZWZ0OiB0YWJMb2NhdGlvbiA9PSBUYWJMb2NhdGlvbi5MRUZULFxuICAgICAgICBteF9UYWJiZWRWaWV3X3RhYnNPblRvcDogdGFiTG9jYXRpb24gPT0gVGFiTG9jYXRpb24uVE9QLFxuICAgICAgICBteF9UYWJiZWRWaWV3X3Jlc3BvbnNpdmU6IHByb3BzLnJlc3BvbnNpdmUsXG4gICAgfSk7XG5cbiAgICBjb25zdCBzY3JlZW5OYW1lID0gdGFiPy5zY3JlZW5OYW1lID8/IHByb3BzLnNjcmVlbk5hbWU7XG5cbiAgICByZXR1cm4gKFxuICAgICAgICA8ZGl2IGNsYXNzTmFtZT17dGFiYmVkVmlld0NsYXNzZXN9PlxuICAgICAgICAgICAge3NjcmVlbk5hbWUgJiYgPFBvc3Rob2dTY3JlZW5UcmFja2VyIHNjcmVlbk5hbWU9e3NjcmVlbk5hbWV9IC8+fVxuICAgICAgICAgICAgPFJvdmluZ1RhYkluZGV4UHJvdmlkZXJcbiAgICAgICAgICAgICAgICBoYW5kbGVMb29wXG4gICAgICAgICAgICAgICAgaGFuZGxlSG9tZUVuZFxuICAgICAgICAgICAgICAgIGhhbmRsZUxlZnRSaWdodD17dGFiTG9jYXRpb24gPT0gVGFiTG9jYXRpb24uVE9QfVxuICAgICAgICAgICAgICAgIGhhbmRsZVVwRG93bj17dGFiTG9jYXRpb24gPT0gVGFiTG9jYXRpb24uTEVGVH1cbiAgICAgICAgICAgID5cbiAgICAgICAgICAgICAgICB7KHsgb25LZXlEb3duSGFuZGxlciB9KSA9PiAoXG4gICAgICAgICAgICAgICAgICAgIDx1bFxuICAgICAgICAgICAgICAgICAgICAgICAgY2xhc3NOYW1lPVwibXhfVGFiYmVkVmlld190YWJMYWJlbHNcIlxuICAgICAgICAgICAgICAgICAgICAgICAgcm9sZT1cInRhYmxpc3RcIlxuICAgICAgICAgICAgICAgICAgICAgICAgYXJpYS1vcmllbnRhdGlvbj17dGFiTG9jYXRpb24gPT0gVGFiTG9jYXRpb24uTEVGVCA/IFwidmVydGljYWxcIiA6IFwiaG9yaXpvbnRhbFwifVxuICAgICAgICAgICAgICAgICAgICAgICAgb25LZXlEb3duPXtvbktleURvd25IYW5kbGVyfVxuICAgICAgICAgICAgICAgICAgICA+XG4gICAgICAgICAgICAgICAgICAgICAgICB7bGFiZWxzfVxuICAgICAgICAgICAgICAgICAgICA8L3VsPlxuICAgICAgICAgICAgICAgICl9XG4gICAgICAgICAgICA8L1JvdmluZ1RhYkluZGV4UHJvdmlkZXI+XG4gICAgICAgICAgICB7cGFuZWx9XG4gICAgICAgIDwvZGl2PlxuICAgICk7XG59XG4iXSwibWFwcGluZ3MiOiI7Ozs7Ozs7OztBQVVBLElBQUFBLEtBQUEsR0FBQUMsdUJBQUEsQ0FBQUMsT0FBQTtBQUNBLElBQUFDLFdBQUEsR0FBQUMsc0JBQUEsQ0FBQUYsT0FBQTtBQUVBLElBQUFHLGdCQUFBLEdBQUFILE9BQUE7QUFDQSxJQUFBSSxrQkFBQSxHQUFBRixzQkFBQSxDQUFBRixPQUFBO0FBQ0EsSUFBQUssZ0JBQUEsR0FBQUwsT0FBQTtBQUVBLElBQUFNLGVBQUEsR0FBQU4sT0FBQTtBQUNBLElBQUFPLGVBQUEsR0FBQVAsT0FBQTtBQUE0RCxTQUFBUSx5QkFBQUMsQ0FBQSw2QkFBQUMsT0FBQSxtQkFBQUMsQ0FBQSxPQUFBRCxPQUFBLElBQUFFLENBQUEsT0FBQUYsT0FBQSxZQUFBRix3QkFBQSxZQUFBQSxDQUFBQyxDQUFBLFdBQUFBLENBQUEsR0FBQUcsQ0FBQSxHQUFBRCxDQUFBLEtBQUFGLENBQUE7QUFBQSxTQUFBVix3QkFBQVUsQ0FBQSxFQUFBRSxDQUFBLFNBQUFBLENBQUEsSUFBQUYsQ0FBQSxJQUFBQSxDQUFBLENBQUFJLFVBQUEsU0FBQUosQ0FBQSxlQUFBQSxDQUFBLHVCQUFBQSxDQUFBLHlCQUFBQSxDQUFBLFdBQUFLLE9BQUEsRUFBQUwsQ0FBQSxRQUFBRyxDQUFBLEdBQUFKLHdCQUFBLENBQUFHLENBQUEsT0FBQUMsQ0FBQSxJQUFB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