matrix-react-sdk
Version:
SDK for matrix.org using React
181 lines (177 loc) • 35.3 kB
JavaScript
"use strict";
var _interopRequireDefault = require("@babel/runtime/helpers/interopRequireDefault");
Object.defineProperty(exports, "__esModule", {
value: true
});
exports.default = exports.RoomSettingsTab = void 0;
var _defineProperty2 = _interopRequireDefault(require("@babel/runtime/helpers/defineProperty"));
var _react = _interopRequireDefault(require("react"));
var _matrix = require("matrix-js-sdk/src/matrix");
var _TabbedView = _interopRequireWildcard(require("../../structures/TabbedView"));
var _languageHandler = require("../../../languageHandler");
var _AdvancedRoomSettingsTab = _interopRequireDefault(require("../settings/tabs/room/AdvancedRoomSettingsTab"));
var _RolesRoomSettingsTab = _interopRequireDefault(require("../settings/tabs/room/RolesRoomSettingsTab"));
var _GeneralRoomSettingsTab = _interopRequireDefault(require("../settings/tabs/room/GeneralRoomSettingsTab"));
var _SecurityRoomSettingsTab = _interopRequireDefault(require("../settings/tabs/room/SecurityRoomSettingsTab"));
var _NotificationSettingsTab = _interopRequireDefault(require("../settings/tabs/room/NotificationSettingsTab"));
var _BridgeSettingsTab = _interopRequireDefault(require("../settings/tabs/room/BridgeSettingsTab"));
var _MatrixClientPeg = require("../../../MatrixClientPeg");
var _dispatcher = _interopRequireDefault(require("../../../dispatcher/dispatcher"));
var _SettingsStore = _interopRequireDefault(require("../../../settings/SettingsStore"));
var _UIFeature = require("../../../settings/UIFeature");
var _BaseDialog = _interopRequireDefault(require("./BaseDialog"));
var _actions = require("../../../dispatcher/actions");
var _VoipRoomSettingsTab = require("../settings/tabs/room/VoipRoomSettingsTab");
var _PollHistoryTab = require("../settings/tabs/room/PollHistoryTab");
var _ErrorBoundary = _interopRequireDefault(require("../elements/ErrorBoundary"));
var _PeopleRoomSettingsTab = require("../settings/tabs/room/PeopleRoomSettingsTab");
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 2023 The Matrix.org Foundation C.I.C.
Copyright 2019 New Vector Ltd
Copyright 2019 Michael Telatynski <7t3chguy@gmail.com>
SPDX-License-Identifier: AGPL-3.0-only OR GPL-3.0-only
Please see LICENSE files in the repository root for full details.
*/
let RoomSettingsTab = exports.RoomSettingsTab = /*#__PURE__*/function (RoomSettingsTab) {
RoomSettingsTab["General"] = "ROOM_GENERAL_TAB";
RoomSettingsTab["People"] = "ROOM_PEOPLE_TAB";
RoomSettingsTab["Voip"] = "ROOM_VOIP_TAB";
RoomSettingsTab["Security"] = "ROOM_SECURITY_TAB";
RoomSettingsTab["Roles"] = "ROOM_ROLES_TAB";
RoomSettingsTab["Notifications"] = "ROOM_NOTIFICATIONS_TAB";
RoomSettingsTab["Bridges"] = "ROOM_BRIDGES_TAB";
RoomSettingsTab["Advanced"] = "ROOM_ADVANCED_TAB";
RoomSettingsTab["PollHistory"] = "ROOM_POLL_HISTORY_TAB";
return RoomSettingsTab;
}({});
class RoomSettingsDialog extends _react.default.Component {
constructor(props) {
super(props);
(0, _defineProperty2.default)(this, "dispatcherRef", void 0);
(0, _defineProperty2.default)(this, "onAction", payload => {
// When view changes below us, close the room settings
// whilst the modal is open this can only be triggered when someone hits Leave Room
if (payload.action === _actions.Action.ViewHomePage) {
this.props.onFinished(true);
}
});
(0, _defineProperty2.default)(this, "onRoomName", () => {
// rerender when the room name changes
this.forceUpdate();
});
(0, _defineProperty2.default)(this, "onStateEvent", event => {
if (event.getType() === _matrix.EventType.RoomJoinRules) this.forceUpdate();
});
(0, _defineProperty2.default)(this, "onTabChange", tabId => {
this.setState({
activeTabId: tabId
});
});
const room = this.getRoom();
this.state = {
room,
activeTabId: props.initialTabId || RoomSettingsTab.General
};
}
componentDidMount() {
this.dispatcherRef = _dispatcher.default.register(this.onAction);
_MatrixClientPeg.MatrixClientPeg.safeGet().on(_matrix.RoomEvent.Name, this.onRoomName);
_MatrixClientPeg.MatrixClientPeg.safeGet().on(_matrix.RoomStateEvent.Events, this.onStateEvent);
this.onRoomName();
}
componentDidUpdate() {
if (this.props.roomId !== this.state.room.roomId) {
const room = this.getRoom();
this.setState({
room
});
}
}
componentWillUnmount() {
if (this.dispatcherRef) {
_dispatcher.default.unregister(this.dispatcherRef);
}
_MatrixClientPeg.MatrixClientPeg.get()?.removeListener(_matrix.RoomEvent.Name, this.onRoomName);
_MatrixClientPeg.MatrixClientPeg.get()?.removeListener(_matrix.RoomStateEvent.Events, this.onStateEvent);
}
/**
* Get room from client
* @returns Room
* @throws when room is not found
*/
getRoom() {
const room = _MatrixClientPeg.MatrixClientPeg.safeGet().getRoom(this.props.roomId);
// something is really wrong if we encounter this
if (!room) {
throw new Error(`Cannot find room ${this.props.roomId}`);
}
return room;
}
getTabs() {
const tabs = [];
tabs.push(new _TabbedView.Tab(RoomSettingsTab.General, (0, _languageHandler._td)("common|general"), "mx_RoomSettingsDialog_settingsIcon", /*#__PURE__*/_react.default.createElement(_GeneralRoomSettingsTab.default, {
room: this.state.room
}), "RoomSettingsGeneral"));
if (_SettingsStore.default.getValue("feature_ask_to_join") && this.state.room.getJoinRule() === "knock") {
tabs.push(new _TabbedView.Tab(RoomSettingsTab.People, (0, _languageHandler._td)("common|people"), "mx_RoomSettingsDialog_peopleIcon", /*#__PURE__*/_react.default.createElement(_PeopleRoomSettingsTab.PeopleRoomSettingsTab, {
room: this.state.room
})));
}
if (_SettingsStore.default.getValue("feature_group_calls")) {
tabs.push(new _TabbedView.Tab(RoomSettingsTab.Voip, (0, _languageHandler._td)("settings|voip|title"), "mx_RoomSettingsDialog_voiceIcon", /*#__PURE__*/_react.default.createElement(_VoipRoomSettingsTab.VoipRoomSettingsTab, {
room: this.state.room
})));
}
tabs.push(new _TabbedView.Tab(RoomSettingsTab.Security, (0, _languageHandler._td)("room_settings|security|title"), "mx_RoomSettingsDialog_securityIcon", /*#__PURE__*/_react.default.createElement(_SecurityRoomSettingsTab.default, {
room: this.state.room,
closeSettingsFn: () => this.props.onFinished(true)
}), "RoomSettingsSecurityPrivacy"));
tabs.push(new _TabbedView.Tab(RoomSettingsTab.Roles, (0, _languageHandler._td)("room_settings|permissions|title"), "mx_RoomSettingsDialog_rolesIcon", /*#__PURE__*/_react.default.createElement(_RolesRoomSettingsTab.default, {
room: this.state.room
}), "RoomSettingsRolesPermissions"));
tabs.push(new _TabbedView.Tab(RoomSettingsTab.Notifications, (0, _languageHandler._td)("notifications|enable_prompt_toast_title"), "mx_RoomSettingsDialog_notificationsIcon", /*#__PURE__*/_react.default.createElement(_NotificationSettingsTab.default, {
roomId: this.state.room.roomId,
closeSettingsFn: () => this.props.onFinished(true)
}), "RoomSettingsNotifications"));
if (_SettingsStore.default.getValue("feature_bridge_state")) {
tabs.push(new _TabbedView.Tab(RoomSettingsTab.Bridges, (0, _languageHandler._td)("room_settings|bridges|title"), "mx_RoomSettingsDialog_bridgesIcon", /*#__PURE__*/_react.default.createElement(_BridgeSettingsTab.default, {
room: this.state.room
}), "RoomSettingsBridges"));
}
tabs.push(new _TabbedView.Tab(RoomSettingsTab.PollHistory, (0, _languageHandler._td)("right_panel|polls_button"), "mx_RoomSettingsDialog_pollsIcon", /*#__PURE__*/_react.default.createElement(_PollHistoryTab.PollHistoryTab, {
room: this.state.room,
onFinished: () => this.props.onFinished(true)
})));
if (_SettingsStore.default.getValue(_UIFeature.UIFeature.AdvancedSettings)) {
tabs.push(new _TabbedView.Tab(RoomSettingsTab.Advanced, (0, _languageHandler._td)("common|advanced"), "mx_RoomSettingsDialog_warningIcon", /*#__PURE__*/_react.default.createElement(_AdvancedRoomSettingsTab.default, {
room: this.state.room,
closeSettingsFn: () => this.props.onFinished(true)
}), "RoomSettingsAdvanced"));
}
return tabs;
}
render() {
const roomName = this.state.room.name;
return /*#__PURE__*/_react.default.createElement(_BaseDialog.default, {
className: "mx_RoomSettingsDialog",
hasCancel: true,
onFinished: this.props.onFinished,
title: (0, _languageHandler._t)("room_settings|title", {
roomName
})
}, /*#__PURE__*/_react.default.createElement("div", {
className: "mx_SettingsDialog_content"
}, /*#__PURE__*/_react.default.createElement(_TabbedView.default, {
tabs: this.getTabs(),
activeTabId: this.state.activeTabId,
screenName: "RoomSettings",
onChange: this.onTabChange
})));
}
}
const WrappedRoomSettingsDialog = props => /*#__PURE__*/_react.default.createElement(_ErrorBoundary.default, null, /*#__PURE__*/_react.default.createElement(RoomSettingsDialog, props));
var _default = exports.default = WrappedRoomSettingsDialog;
//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJuYW1lcyI6WyJfcmVhY3QiLCJfaW50ZXJvcFJlcXVpcmVEZWZhdWx0IiwicmVxdWlyZSIsIl9tYXRyaXgiLCJfVGFiYmVkVmlldyIsIl9pbnRlcm9wUmVxdWlyZVdpbGRjYXJkIiwiX2xhbmd1YWdlSGFuZGxlciIsIl9BZHZhbmNlZFJvb21TZXR0aW5nc1RhYiIsIl9Sb2xlc1Jvb21TZXR0aW5nc1RhYiIsIl9HZW5lcmFsUm9vbVNldHRpbmdzVGFiIiwiX1NlY3VyaXR5Um9vbVNldHRpbmdzVGFiIiwiX05vdGlmaWNhdGlvblNldHRpbmdzVGFiIiwiX0JyaWRnZVNldHRpbmdzVGFiIiwiX01hdHJpeENsaWVudFBlZyIsIl9kaXNwYXRjaGVyIiwiX1NldHRpbmdzU3RvcmUiLCJfVUlGZWF0dXJlIiwiX0Jhc2VEaWFsb2ciLCJfYWN0aW9ucyIsIl9Wb2lwUm9vbVNldHRpbmdzVGFiIiwiX1BvbGxIaXN0b3J5VGFiIiwiX0Vycm9yQm91bmRhcnkiLCJfUGVvcGxlUm9vbVNldHRpbmdzVGFiIiwiX2dldFJlcXVpcmVXaWxkY2FyZENhY2hlIiwiZSIsIldlYWtNYXAiLCJyIiwidCIsIl9fZXNNb2R1bGUiLCJkZWZhdWx0IiwiaGFzIiwiZ2V0IiwibiIsIl9fcHJvdG9fXyIsImEiLCJPYmplY3QiLCJkZWZpbmVQcm9wZXJ0eSIsImdldE93blByb3BlcnR5RGVzY3JpcHRvciIsInUiLCJoYXNPd25Qcm9wZXJ0eSIsImNhbGwiLCJpIiwic2V0IiwiUm9vbVNldHRpbmdzVGFiIiwiZXhwb3J0cyIsIlJvb21TZXR0aW5nc0RpYWxvZyIsIlJlYWN0IiwiQ29tcG9uZW50IiwiY29uc3RydWN0b3IiLCJwcm9wcyIsIl9kZWZpbmVQcm9wZXJ0eTIiLCJwYXlsb2FkIiwiYWN0aW9uIiwiQWN0aW9uIiwiVmlld0hvbWVQYWdlIiwib25GaW5pc2hlZCIsImZvcmNlVXBkYXRlIiwiZXZlbnQiLCJnZXRUeXBlIiwiRXZlbnRUeXBlIiwiUm9vbUpvaW5SdWxlcyIsInRhYklkIiwic2V0U3RhdGUiLCJhY3RpdmVUYWJJZCIsInJvb20iLCJnZXRSb29tIiwic3RhdGUiLCJpbml0aWFsVGFiSWQiLCJHZW5lcmFsIiwiY29tcG9uZW50RGlkTW91bnQiLCJkaXNwYXRjaGVyUmVmIiwiZGlzIiwicmVnaXN0ZXIiLCJvbkFjdGlvbiIsIk1hdHJpeENsaWVudFBlZyIsInNhZmVHZXQiLCJvbiIsIlJvb21FdmVudCIsIk5hbWUiLCJvblJvb21OYW1lIiwiUm9vbVN0YXRlRXZlbnQiLCJFdmVudHMiLCJvblN0YXRlRXZlbnQiLCJjb21wb25lbnREaWRVcGRhdGUiLCJyb29tSWQiLCJjb21wb25lbnRXaWxsVW5tb3VudCIsInVucmVnaXN0ZXIiLCJyZW1vdmVMaXN0ZW5lciIsIkVycm9yIiwiZ2V0VGFicyIsInRhYnMiLCJwdXNoIiwiVGFiIiwiX3RkIiwiY3JlYXRlRWxlbWVudCIsIlNldHRpbmdzU3RvcmUiLCJnZXRWYWx1ZSIsImdldEpvaW5SdWxlIiwiUGVvcGxlIiwiUGVvcGxlUm9vbVNldHRpbmdzVGFiIiwiVm9pcCIsIlZvaXBSb29tU2V0dGluZ3NUYWIiLCJTZWN1cml0eSIsImNsb3NlU2V0dGluZ3NGbiIsIlJvbGVzIiwiTm90aWZpY2F0aW9ucyIsIkJyaWRnZXMiLCJQb2xsSGlzdG9yeSIsIlBvbGxIaXN0b3J5VGFiIiwiVUlGZWF0dXJlIiwiQWR2YW5jZWRTZXR0aW5ncyIsIkFkdmFuY2VkIiwicmVuZGVyIiwicm9vbU5hbWUiLCJuYW1lIiwiY2xhc3NOYW1lIiwiaGFzQ2FuY2VsIiwidGl0bGUiLCJfdCIsInNjcmVlbk5hbWUiLCJvbkNoYW5nZSIsIm9uVGFiQ2hhbmdlIiwiV3JhcHBlZFJvb21TZXR0aW5nc0RpYWxvZyIsIl9kZWZhdWx0Il0sInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vc3JjL2NvbXBvbmVudHMvdmlld3MvZGlhbG9ncy9Sb29tU2V0dGluZ3NEaWFsb2cudHN4Il0sInNvdXJjZXNDb250ZW50IjpbIi8qXG5Db3B5cmlnaHQgMjAyNCBOZXcgVmVjdG9yIEx0ZC5cbkNvcHlyaWdodCAyMDIzIFRoZSBNYXRyaXgub3JnIEZvdW5kYXRpb24gQy5JLkMuXG5Db3B5cmlnaHQgMjAxOSBOZXcgVmVjdG9yIEx0ZFxuQ29weXJpZ2h0IDIwMTkgTWljaGFlbCBUZWxhdHluc2tpIDw3dDNjaGd1eUBnbWFpbC5jb20+XG5cblNQRFgtTGljZW5zZS1JZGVudGlmaWVyOiBBR1BMLTMuMC1vbmx5IE9SIEdQTC0zLjAtb25seVxuUGxlYXNlIHNlZSBMSUNFTlNFIGZpbGVzIGluIHRoZSByZXBvc2l0b3J5IHJvb3QgZm9yIGZ1bGwgZGV0YWlscy5cbiovXG5cbmltcG9ydCBSZWFjdCBmcm9tIFwicmVhY3RcIjtcbmltcG9ydCB7IFJvb21FdmVudCwgUm9vbSwgUm9vbVN0YXRlRXZlbnQsIE1hdHJpeEV2ZW50LCBFdmVudFR5cGUgfSBmcm9tIFwibWF0cml4LWpzLXNkay9zcmMvbWF0cml4XCI7XG5cbmltcG9ydCBUYWJiZWRWaWV3LCB7IFRhYiB9IGZyb20gXCIuLi8uLi9zdHJ1Y3R1cmVzL1RhYmJlZFZpZXdcIjtcbmltcG9ydCB7IF90LCBfdGQgfSBmcm9tIFwiLi4vLi4vLi4vbGFuZ3VhZ2VIYW5kbGVyXCI7XG5pbXBvcnQgQWR2YW5jZWRSb29tU2V0dGluZ3NUYWIgZnJvbSBcIi4uL3NldHRpbmdzL3RhYnMvcm9vbS9BZHZhbmNlZFJvb21TZXR0aW5nc1RhYlwiO1xuaW1wb3J0IFJvbGVzUm9vbVNldHRpbmdzVGFiIGZyb20gXCIuLi9zZXR0aW5ncy90YWJzL3Jvb20vUm9sZXNSb29tU2V0dGluZ3NUYWJcIjtcbmltcG9ydCBHZW5lcmFsUm9vbVNldHRpbmdzVGFiIGZyb20gXCIuLi9zZXR0aW5ncy90YWJzL3Jvb20vR2VuZXJhbFJvb21TZXR0aW5nc1RhYlwiO1xuaW1wb3J0IFNlY3VyaXR5Um9vbVNldHRpbmdzVGFiIGZyb20gXCIuLi9zZXR0aW5ncy90YWJzL3Jvb20vU2VjdXJpdHlSb29tU2V0dGluZ3NUYWJcIjtcbmltcG9ydCBOb3RpZmljYXRpb25TZXR0aW5nc1RhYiBmcm9tIFwiLi4vc2V0dGluZ3MvdGFicy9yb29tL05vdGlmaWNhdGlvblNldHRpbmdzVGFiXCI7XG5pbXBvcnQgQnJpZGdlU2V0dGluZ3NUYWIgZnJvbSBcIi4uL3NldHRpbmdzL3RhYnMvcm9vbS9CcmlkZ2VTZXR0aW5nc1RhYlwiO1xuaW1wb3J0IHsgTWF0cml4Q2xpZW50UGVnIH0gZnJvbSBcIi4uLy4uLy4uL01hdHJpeENsaWVudFBlZ1wiO1xuaW1wb3J0IGRpcyBmcm9tIFwiLi4vLi4vLi4vZGlzcGF0Y2hlci9kaXNwYXRjaGVyXCI7XG5pbXBvcnQgU2V0dGluZ3NTdG9yZSBmcm9tIFwiLi4vLi4vLi4vc2V0dGluZ3MvU2V0dGluZ3NTdG9yZVwiO1xuaW1wb3J0IHsgVUlGZWF0dXJlIH0gZnJvbSBcIi4uLy4uLy4uL3NldHRpbmdzL1VJRmVhdHVyZVwiO1xuaW1wb3J0IEJhc2VEaWFsb2cgZnJvbSBcIi4vQmFzZURpYWxvZ1wiO1xuaW1wb3J0IHsgQWN0aW9uIH0gZnJvbSBcIi4uLy4uLy4uL2Rpc3BhdGNoZXIvYWN0aW9uc1wiO1xuaW1wb3J0IHsgVm9pcFJvb21TZXR0aW5nc1RhYiB9IGZyb20gXCIuLi9zZXR0aW5ncy90YWJzL3Jvb20vVm9pcFJvb21TZXR0aW5nc1RhYlwiO1xuaW1wb3J0IHsgQWN0aW9uUGF5bG9hZCB9IGZyb20gXCIuLi8uLi8uLi9kaXNwYXRjaGVyL3BheWxvYWRzXCI7XG5pbXBvcnQgeyBOb25FbXB0eUFycmF5IH0gZnJvbSBcIi4uLy4uLy4uL0B0eXBlcy9jb21tb25cIjtcbmltcG9ydCB7IFBvbGxIaXN0b3J5VGFiIH0gZnJvbSBcIi4uL3NldHRpbmdzL3RhYnMvcm9vbS9Qb2xsSGlzdG9yeVRhYlwiO1xuaW1wb3J0IEVycm9yQm91bmRhcnkgZnJvbSBcIi4uL2VsZW1lbnRzL0Vycm9yQm91bmRhcnlcIjtcbmltcG9ydCB7IFBlb3BsZVJvb21TZXR0aW5nc1RhYiB9IGZyb20gXCIuLi9zZXR0aW5ncy90YWJzL3Jvb20vUGVvcGxlUm9vbVNldHRpbmdzVGFiXCI7XG5cbmV4cG9ydCBjb25zdCBlbnVtIFJvb21TZXR0aW5nc1RhYiB7XG4gICAgR2VuZXJhbCA9IFwiUk9PTV9HRU5FUkFMX1RBQlwiLFxuICAgIFBlb3BsZSA9IFwiUk9PTV9QRU9QTEVfVEFCXCIsXG4gICAgVm9pcCA9IFwiUk9PTV9WT0lQX1RBQlwiLFxuICAgIFNlY3VyaXR5ID0gXCJST09NX1NFQ1VSSVRZX1RBQlwiLFxuICAgIFJvbGVzID0gXCJST09NX1JPTEVTX1RBQlwiLFxuICAgIE5vdGlmaWNhdGlvbnMgPSBcIlJPT01fTk9USUZJQ0FUSU9OU19UQUJcIixcbiAgICBCcmlkZ2VzID0gXCJST09NX0JSSURHRVNfVEFCXCIsXG4gICAgQWR2YW5jZWQgPSBcIlJPT01fQURWQU5DRURfVEFCXCIsXG4gICAgUG9sbEhpc3RvcnkgPSBcIlJPT01fUE9MTF9ISVNUT1JZX1RBQlwiLFxufVxuXG5pbnRlcmZhY2UgSVByb3BzIHtcbiAgICByb29tSWQ6IHN0cmluZztcbiAgICBvbkZpbmlzaGVkOiAoc3VjY2Vzcz86IGJvb2xlYW4pID0+IHZvaWQ7XG4gICAgaW5pdGlhbFRhYklkPzogUm9vbVNldHRpbmdzVGFiO1xufVxuXG5pbnRlcmZhY2UgSVN0YXRlIHtcbiAgICByb29tOiBSb29tO1xuICAgIGFjdGl2ZVRhYklkOiBSb29tU2V0dGluZ3NUYWI7XG59XG5cbmNsYXNzIFJvb21TZXR0aW5nc0RpYWxvZyBleHRlbmRzIFJlYWN0LkNvbXBvbmVudDxJUHJvcHMsIElTdGF0ZT4ge1xuICAgIHByaXZhdGUgZGlzcGF0Y2hlclJlZj86IHN0cmluZztcblxuICAgIHB1YmxpYyBjb25zdHJ1Y3Rvcihwcm9wczogSVByb3BzKSB7XG4gICAgICAgIHN1cGVyKHByb3BzKTtcblxuICAgICAgICBjb25zdCByb29tID0gdGhpcy5nZXRSb29tKCk7XG4gICAgICAgIHRoaXMuc3RhdGUgPSB7IHJvb20sIGFjdGl2ZVRhYklkOiBwcm9wcy5pbml0aWFsVGFiSWQgfHwgUm9vbVNldHRpbmdzVGFiLkdlbmVyYWwgfTtcbiAgICB9XG5cbiAgICBwdWJsaWMgY29tcG9uZW50RGlkTW91bnQoKTogdm9pZCB7XG4gICAgICAgIHRoaXMuZGlzcGF0Y2hlclJlZiA9IGRpcy5yZWdpc3Rlcih0aGlzLm9uQWN0aW9uKTtcbiAgICAgICAgTWF0cml4Q2xpZW50UGVnLnNhZmVHZXQoKS5vbihSb29tRXZlbnQuTmFtZSwgdGhpcy5vblJvb21OYW1lKTtcbiAgICAgICAgTWF0cml4Q2xpZW50UGVnLnNhZmVHZXQoKS5vbihSb29tU3RhdGVFdmVudC5FdmVudHMsIHRoaXMub25TdGF0ZUV2ZW50KTtcbiAgICAgICAgdGhpcy5vblJvb21OYW1lKCk7XG4gICAgfVxuXG4gICAgcHVibGljIGNvbXBvbmVudERpZFVwZGF0ZSgpOiB2b2lkIHtcbiAgICAgICAgaWYgKHRoaXMucHJvcHMucm9vbUlkICE9PSB0aGlzLnN0YXRlLnJvb20ucm9vbUlkKSB7XG4gICAgICAgICAgICBjb25zdCByb29tID0gdGhpcy5nZXRSb29tKCk7XG4gICAgICAgICAgICB0aGlzLnNldFN0YXRlKHsgcm9vbSB9KTtcbiAgICAgICAgfVxuICAgIH1cblxuICAgIHB1YmxpYyBjb21wb25lbnRXaWxsVW5tb3VudCgpOiB2b2lkIHtcbiAgICAgICAgaWYgKHRoaXMuZGlzcGF0Y2hlclJlZikge1xuICAgICAgICAgICAgZGlzLnVucmVnaXN0ZXIodGhpcy5kaXNwYXRjaGVyUmVmKTtcbiAgICAgICAgfVxuXG4gICAgICAgIE1hdHJpeENsaWVudFBlZy5nZXQoKT8ucmVtb3ZlTGlzdGVuZXIoUm9vbUV2ZW50Lk5hbWUsIHRoaXMub25Sb29tTmFtZSk7XG4gICAgICAgIE1hdHJpeENsaWVudFBlZy5nZXQoKT8ucmVtb3ZlTGlzdGVuZXIoUm9vbVN0YXRlRXZlbnQuRXZlbnRzLCB0aGlzLm9uU3RhdGVFdmVudCk7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogR2V0IHJvb20gZnJvbSBjbGllbnRcbiAgICAgKiBAcmV0dXJucyBSb29tXG4gICAgICogQHRocm93cyB3aGVuIHJvb20gaXMgbm90IGZvdW5kXG4gICAgICovXG4gICAgcHJpdmF0ZSBnZXRSb29tKCk6IFJvb20ge1xuICAgICAgICBjb25zdCByb29tID0gTWF0cml4Q2xpZW50UGVnLnNhZmVHZXQoKS5nZXRSb29tKHRoaXMucHJvcHMucm9vbUlkKSE7XG5cbiAgICAgICAgLy8gc29tZXRoaW5nIGlzIHJlYWxseSB3cm9uZyBpZiB3ZSBlbmNvdW50ZXIgdGhpc1xuICAgICAgICBpZiAoIXJvb20pIHtcbiAgICAgICAgICAgIHRocm93IG5ldyBFcnJvcihgQ2Fubm90IGZpbmQgcm9vbSAke3RoaXMucHJvcHMucm9vbUlkfWApO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiByb29tO1xuICAgIH1cblxuICAgIHByaXZhdGUgb25BY3Rpb24gPSAocGF5bG9hZDogQWN0aW9uUGF5bG9hZCk6IHZvaWQgPT4ge1xuICAgICAgICAvLyBXaGVuIHZpZXcgY2hhbmdlcyBiZWxvdyB1cywgY2xvc2UgdGhlIHJvb20gc2V0dGluZ3NcbiAgICAgICAgLy8gd2hpbHN0IHRoZSBtb2RhbCBpcyBvcGVuIHRoaXMgY2FuIG9ubHkgYmUgdHJpZ2dlcmVkIHdoZW4gc29tZW9uZSBoaXRzIExlYXZlIFJvb21cbiAgICAgICAgaWYgKHBheWxvYWQuYWN0aW9uID09PSBBY3Rpb24uVmlld0hvbWVQYWdlKSB7XG4gICAgICAgICAgICB0aGlzLnByb3BzLm9uRmluaXNoZWQodHJ1ZSk7XG4gICAgICAgIH1cbiAgICB9O1xuXG4gICAgcHJpdmF0ZSBvblJvb21OYW1lID0gKCk6IHZvaWQgPT4ge1xuICAgICAgICAvLyByZXJlbmRlciB3aGVuIHRoZSByb29tIG5hbWUgY2hhbmdlc1xuICAgICAgICB0aGlzLmZvcmNlVXBkYXRlKCk7XG4gICAgfTtcblxuICAgIHByaXZhdGUgb25TdGF0ZUV2ZW50ID0gKGV2ZW50OiBNYXRyaXhFdmVudCk6IHZvaWQgPT4ge1xuICAgICAgICBpZiAoZXZlbnQuZ2V0VHlwZSgpID09PSBFdmVudFR5cGUuUm9vbUpvaW5SdWxlcykgdGhpcy5mb3JjZVVwZGF0ZSgpO1xuICAgIH07XG5cbiAgICBwcml2YXRlIG9uVGFiQ2hhbmdlID0gKHRhYklkOiBSb29tU2V0dGluZ3NUYWIpOiB2b2lkID0+IHtcbiAgICAgICAgdGhpcy5zZXRTdGF0ZSh7IGFjdGl2ZVRhYklkOiB0YWJJZCB9KTtcbiAgICB9O1xuXG4gICAgcHJpdmF0ZSBnZXRUYWJzKCk6IE5vbkVtcHR5QXJyYXk8VGFiPFJvb21TZXR0aW5nc1RhYj4+IHtcbiAgICAgICAgY29uc3QgdGFiczogVGFiPFJvb21TZXR0aW5nc1RhYj5bXSA9IFtdO1xuXG4gICAgICAgIHRhYnMucHVzaChcbiAgICAgICAgICAgIG5ldyBUYWIoXG4gICAgICAgICAgICAgICAgUm9vbVNldHRpbmdzVGFiLkdlbmVyYWwsXG4gICAgICAgICAgICAgICAgX3RkKFwiY29tbW9ufGdlbmVyYWxcIiksXG4gICAgICAgICAgICAgICAgXCJteF9Sb29tU2V0dGluZ3NEaWFsb2dfc2V0dGluZ3NJY29uXCIsXG4gICAgICAgICAgICAgICAgPEdlbmVyYWxSb29tU2V0dGluZ3NUYWIgcm9vbT17dGhpcy5zdGF0ZS5yb29tfSAvPixcbiAgICAgICAgICAgICAgICBcIlJvb21TZXR0aW5nc0dlbmVyYWxcIixcbiAgICAgICAgICAgICksXG4gICAgICAgICk7XG4gICAgICAgIGlmIChTZXR0aW5nc1N0b3JlLmdldFZhbHVlKFwiZmVhdHVyZV9hc2tfdG9fam9pblwiKSAmJiB0aGlzLnN0YXRlLnJvb20uZ2V0Sm9pblJ1bGUoKSA9PT0gXCJrbm9ja1wiKSB7XG4gICAgICAgICAgICB0YWJzLnB1c2goXG4gICAgICAgICAgICAgICAgbmV3IFRhYihcbiAgICAgICAgICAgICAgICAgICAgUm9vbVNldHRpbmdzVGFiLlBlb3BsZSxcbiAgICAgICAgICAgICAgICAgICAgX3RkKFwiY29tbW9ufHBlb3BsZVwiKSxcbiAgICAgICAgICAgICAgICAgICAgXCJteF9Sb29tU2V0dGluZ3NEaWFsb2dfcGVvcGxlSWNvblwiLFxuICAgICAgICAgICAgICAgICAgICA8UGVvcGxlUm9vbVNldHRpbmdzVGFiIHJvb209e3RoaXMuc3RhdGUucm9vbX0gLz4sXG4gICAgICAgICAgICAgICAgKSxcbiAgICAgICAgICAgICk7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKFNldHRpbmdzU3RvcmUuZ2V0VmFsdWUoXCJmZWF0dXJlX2dyb3VwX2NhbGxzXCIpKSB7XG4gICAgICAgICAgICB0YWJzLnB1c2goXG4gICAgICAgICAgICAgICAgbmV3IFRhYihcbiAgICAgICAgICAgICAgICAgICAgUm9vbVNldHRpbmdzVGFiLlZvaXAsXG4gICAgICAgICAgICAgICAgICAgIF90ZChcInNldHRpbmdzfHZvaXB8dGl0bGVcIiksXG4gICAgICAgICAgICAgICAgICAgIFwibXhfUm9vbVNldHRpbmdzRGlhbG9nX3ZvaWNlSWNvblwiLFxuICAgICAgICAgICAgICAgICAgICA8Vm9pcFJvb21TZXR0aW5nc1RhYiByb29tPXt0aGlzLnN0YXRlLnJvb219IC8+LFxuICAgICAgICAgICAgICAgICksXG4gICAgICAgICAgICApO1xuICAgICAgICB9XG4gICAgICAgIHRhYnMucHVzaChcbiAgICAgICAgICAgIG5ldyBUYWIoXG4gICAgICAgICAgICAgICAgUm9vbVNldHRpbmdzVGFiLlNlY3VyaXR5LFxuICAgICAgICAgICAgICAgIF90ZChcInJvb21fc2V0dGluZ3N8c2VjdXJpdHl8dGl0bGVcIiksXG4gICAgICAgICAgICAgICAgXCJteF9Sb29tU2V0dGluZ3NEaWFsb2dfc2VjdXJpdHlJY29uXCIsXG4gICAgICAgICAgICAgICAgPFNlY3VyaXR5Um9vbVNldHRpbmdzVGFiIHJvb209e3RoaXMuc3RhdGUucm9vbX0gY2xvc2VTZXR0aW5nc0ZuPXsoKSA9PiB0aGlzLnByb3BzLm9uRmluaXNoZWQodHJ1ZSl9IC8+LFxuICAgICAgICAgICAgICAgIFwiUm9vbVNldHRpbmdzU2VjdXJpdHlQcml2YWN5XCIsXG4gICAgICAgICAgICApLFxuICAgICAgICApO1xuICAgICAgICB0YWJzLnB1c2goXG4gICAgICAgICAgICBuZXcgVGFiKFxuICAgICAgICAgICAgICAgIFJvb21TZXR0aW5nc1RhYi5Sb2xlcyxcbiAgICAgICAgICAgICAgICBfdGQoXCJyb29tX3NldHRpbmdzfHBlcm1pc3Npb25zfHRpdGxlXCIpLFxuICAgICAgICAgICAgICAgIFwibXhfUm9vbVNldHRpbmdzRGlhbG9nX3JvbGVzSWNvblwiLFxuICAgICAgICAgICAgICAgIDxSb2xlc1Jvb21TZXR0aW5nc1RhYiByb29tPXt0aGlzLnN0YXRlLnJvb219IC8+LFxuICAgICAgICAgICAgICAgIFwiUm9vbVNldHRpbmdzUm9sZXNQZXJtaXNzaW9uc1wiLFxuICAgICAgICAgICAgKSxcbiAgICAgICAgKTtcbiAgICAgICAgdGFicy5wdXNoKFxuICAgICAgICAgICAgbmV3IFRhYihcbiAgICAgICAgICAgICAgICBSb29tU2V0dGluZ3NUYWIuTm90aWZpY2F0aW9ucyxcbiAgICAgICAgICAgICAgICBfdGQoXCJub3RpZmljYXRpb25zfGVuYWJsZV9wcm9tcHRfdG9hc3RfdGl0bGVcIiksXG4gICAgICAgICAgICAgICAgXCJteF9Sb29tU2V0dGluZ3NEaWFsb2dfbm90aWZpY2F0aW9uc0ljb25cIixcbiAgICAgICAgICAgICAgICAoXG4gICAgICAgICAgICAgICAgICAgIDxOb3RpZmljYXRpb25TZXR0aW5nc1RhYlxuICAgICAgICAgICAgICAgICAgICAgICAgcm9vbUlkPXt0aGlzLnN0YXRlLnJvb20ucm9vbUlkfVxuICAgICAgICAgICAgICAgICAgICAgICAgY2xvc2VTZXR0aW5nc0ZuPXsoKSA9PiB0aGlzLnByb3BzLm9uRmluaXNoZWQodHJ1ZSl9XG4gICAgICAgICAgICAgICAgICAgIC8+XG4gICAgICAgICAgICAgICAgKSxcbiAgICAgICAgICAgICAgICBcIlJvb21TZXR0aW5nc05vdGlmaWNhdGlvbnNcIixcbiAgICAgICAgICAgICksXG4gICAgICAgICk7XG5cbiAgICAgICAgaWYgKFNldHRpbmdzU3RvcmUuZ2V0VmFsdWUoXCJmZWF0dXJlX2JyaWRnZV9zdGF0ZVwiKSkge1xuICAgICAgICAgICAgdGFicy5wdXNoKFxuICAgICAgICAgICAgICAgIG5ldyBUYWIoXG4gICAgICAgICAgICAgICAgICAgIFJvb21TZXR0aW5nc1RhYi5CcmlkZ2VzLFxuICAgICAgICAgICAgICAgICAgICBfdGQoXCJyb29tX3NldHRpbmdzfGJyaWRnZXN8dGl0bGVcIiksXG4gICAgICAgICAgICAgICAgICAgIFwibXhfUm9vbVNldHRpbmdzRGlhbG9nX2JyaWRnZXNJY29uXCIsXG4gICAgICAgICAgICAgICAgICAgIDxCcmlkZ2VTZXR0aW5nc1RhYiByb29tPXt0aGlzLnN0YXRlLnJvb219IC8+LFxuICAgICAgICAgICAgICAgICAgICBcIlJvb21TZXR0aW5nc0JyaWRnZXNcIixcbiAgICAgICAgICAgICAgICApLFxuICAgICAgICAgICAgKTtcbiAgICAgICAgfVxuXG4gICAgICAgIHRhYnMucHVzaChcbiAgICAgICAgICAgIG5ldyBUYWIoXG4gICAgICAgICAgICAgICAgUm9vbVNldHRpbmdzVGFiLlBvbGxIaXN0b3J5LFxuICAgICAgICAgICAgICAgIF90ZChcInJpZ2h0X3BhbmVsfHBvbGxzX2J1dHRvblwiKSxcbiAgICAgICAgICAgICAgICBcIm14X1Jvb21TZXR0aW5nc0RpYWxvZ19wb2xsc0ljb25cIixcbiAgICAgICAgICAgICAgICA8UG9sbEhpc3RvcnlUYWIgcm9vbT17dGhpcy5zdGF0ZS5yb29tfSBvbkZpbmlzaGVkPXsoKSA9PiB0aGlzLnByb3BzLm9uRmluaXNoZWQodHJ1ZSl9IC8+LFxuICAgICAgICAgICAgKSxcbiAgICAgICAgKTtcblxuICAgICAgICBpZiAoU2V0dGluZ3NTdG9yZS5nZXRWYWx1ZShVSUZlYXR1cmUuQWR2YW5jZWRTZXR0aW5ncykpIHtcbiAgICAgICAgICAgIHRhYnMucHVzaChcbiAgICAgICAgICAgICAgICBuZXcgVGFiKFxuICAgICAgICAgICAgICAgICAgICBSb29tU2V0dGluZ3NUYWIuQWR2YW5jZWQsXG4gICAgICAgICAgICAgICAgICAgIF90ZChcImNvbW1vbnxhZHZhbmNlZFwiKSxcbiAgICAgICAgICAgICAgICAgICAgXCJteF9Sb29tU2V0dGluZ3NEaWFsb2dfd2FybmluZ0ljb25cIixcbiAgICAgICAgICAgICAgICAgICAgKFxuICAgICAgICAgICAgICAgICAgICAgICAgPEFkdmFuY2VkUm9vbVNldHRpbmdzVGFiXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgcm9vbT17dGhpcy5zdGF0ZS5yb29tfVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNsb3NlU2V0dGluZ3NGbj17KCkgPT4gdGhpcy5wcm9wcy5vbkZpbmlzaGVkKHRydWUpfVxuICAgICAgICAgICAgICAgICAgICAgICAgLz5cbiAgICAgICAgICAgICAgICAgICAgKSxcbiAgICAgICAgICAgICAgICAgICAgXCJSb29tU2V0dGluZ3NBZHZhbmNlZFwiLFxuICAgICAgICAgICAgICAgICksXG4gICAgICAgICAgICApO1xuICAgICAgICB9XG5cbiAgICAgICAgcmV0dXJuIHRhYnMgYXMgTm9uRW1wdHlBcnJheTxUYWI8Um9vbVNldHRpbmdzVGFiPj47XG4gICAgfVxuXG4gICAgcHVibGljIHJlbmRlcigpOiBSZWFjdC5SZWFjdE5vZGUge1xuICAgICAgICBjb25zdCByb29tTmFtZSA9IHRoaXMuc3RhdGUucm9vbS5uYW1lO1xuICAgICAgICByZXR1cm4gKFxuICAgICAgICAgICAgPEJhc2VEaWFsb2dcbiAgICAgICAgICAgICAgICBjbGFzc05hbWU9XCJteF9Sb29tU2V0dGluZ3NEaWFsb2dcIlxuICAgICAgICAgICAgICAgIGhhc0NhbmNlbD17dHJ1ZX1cbiAgICAgICAgICAgICAgICBvbkZpbmlzaGVkPXt0aGlzLnByb3BzLm9uRmluaXNoZWR9XG4gICAgICAgICAgICAgICAgdGl0bGU9e190KFwicm9vbV9zZXR0aW5nc3x0aXRsZVwiLCB7IHJvb21OYW1lIH0pfVxuICAgICAgICAgICAgPlxuICAgICAgICAgICAgICAgIDxkaXYgY2xhc3NOYW1lPVwibXhfU2V0dGluZ3NEaWFsb2dfY29udGVudFwiPlxuICAgICAgICAgICAgICAgICAgICA8VGFiYmVkVmlld1xuICAgICAgICAgICAgICAgICAgICAgICAgdGFicz17dGhpcy5nZXRUYWJzKCl9XG4gICAgICAgICAgICAgICAgICAgICAgICBhY3RpdmVUYWJJZD17dGhpcy5zdGF0ZS5hY3RpdmVUYWJJZH1cbiAgICAgICAgICAgICAgICAgICAgICAgIHNjcmVlbk5hbWU9XCJSb29tU2V0dGluZ3NcIlxuICAgICAgICAgICAgICAgICAgICAgICAgb25DaGFuZ2U9e3RoaXMub25UYWJDaGFuZ2V9XG4gICAgICAgICAgICAgICAgICAgIC8+XG4gICAgICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgICA8L0Jhc2VEaWFsb2c+XG4gICAgICAgICk7XG4gICAgfVxufVxuXG5jb25zdCBXcmFwcGVkUm9vbVNldHRpbmdzRGlhbG9nOiBSZWFjdC5GQzxJUHJvcHM+ID0gKHByb3BzKSA9PiAoXG4gICAgPEVycm9yQm91bmRhcnk+XG4gICAgICAgIDxSb29tU2V0dGluZ3NEaWFsb2cgey4uLnByb3BzfSAvPlxuICAgIDwvRXJyb3JCb3VuZGFyeT5cbik7XG5cbmV4cG9ydCBkZWZhdWx0IFdyYXBwZWRSb29tU2V0dGluZ3NEaWFsb2c7XG4iXSwibWFwcGluZ3MiOiI7Ozs7Ozs7O0FBVUEsSUFBQUEsTUFBQSxHQUFBQyxzQkFBQSxDQUFBQyxPQUFBO0FBQ0EsSUFBQUMsT0FBQSxHQUFBRCxPQUFBO0FBRUEsSUFBQUUsV0FBQSxHQUFBQyx1QkFBQSxDQUFBSCxPQUFBO0FBQ0EsSUFBQUksZ0JBQUEsR0FBQUosT0FBQTtBQUNBLElBQUFLLHdCQUFBLEdBQUFOLHNCQUFBLENBQUFDLE9BQUE7QUFDQSxJQUFBTSxxQkFBQSxHQUFBUCxzQkFBQSxDQUFBQyxPQUFBO0FBQ0EsSUFBQU8sdUJBQUEsR0FBQVIsc0JBQUEsQ0FBQUMsT0FBQTtBQUNBLElBQUFRLHdCQUFBLEdBQUFU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