UNPKG

matrix-react-sdk

Version:
145 lines (140 loc) 25.4 kB
"use strict"; var _interopRequireDefault = require("@babel/runtime/helpers/interopRequireDefault"); Object.defineProperty(exports, "__esModule", { value: true }); exports.JoinRuleDialog = exports.CallGuestLinkButton = void 0; var _link = _interopRequireDefault(require("@vector-im/compound-design-tokens/assets/web/icons/link")); var _compoundWeb = require("@vector-im/compound-web"); var _react = _interopRequireWildcard(require("react")); var _logger = require("matrix-js-sdk/src/logger"); var _matrix = require("matrix-js-sdk/src/matrix"); var _Modal = _interopRequireDefault(require("../../../../Modal")); var _ShareDialog = _interopRequireDefault(require("../../dialogs/ShareDialog")); var _languageHandler = require("../../../../languageHandler"); var _SettingsStore = _interopRequireDefault(require("../../../../settings/SettingsStore")); var _Permalinks = require("../../../../utils/permalinks/Permalinks"); var _BaseDialog = _interopRequireDefault(require("../../dialogs/BaseDialog")); var _useGuestAccessInformation = require("../../../../hooks/room/useGuestAccessInformation"); 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 2024 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. */ /** * Display a button to open a dialog to share a link to the call using a element call guest spa url (`element_call:guest_spa_url` in the EW config). * @param room * @returns Nothing if there is not the option to share a link (No guest_spa_url is set) or a button to open a dialog to share the link. */ const CallGuestLinkButton = ({ room }) => { const { canInviteGuests, guestSpaUrl, isRoomJoinable, canInvite } = (0, _useGuestAccessInformation.useGuestAccessInformation)(room); const generateCallLink = (0, _react.useCallback)(() => { if (!isRoomJoinable()) throw new Error("Cannot create link for room that users can not join without invite."); if (!guestSpaUrl) throw new Error("No guest SPA url for external links provided."); const url = new URL(guestSpaUrl); url.pathname = "/room/"; // Set params for the sharable url url.searchParams.set("roomId", room.roomId); if (room.hasEncryptionStateEvent()) url.searchParams.set("perParticipantE2EE", "true"); for (const server of (0, _Permalinks.calculateRoomVia)(room)) { url.searchParams.set("viaServers", server); } // Move params into hash url.hash = "/" + room.name + url.search; url.search = ""; _logger.logger.info("Generated element call external url:", url); return url; }, [guestSpaUrl, isRoomJoinable, room]); const showLinkModal = (0, _react.useCallback)(() => { try { // generateCallLink throws if the invite rules are not met const target = generateCallLink(); _Modal.default.createDialog(_ShareDialog.default, { target, customTitle: (0, _languageHandler._t)("share|share_call"), subtitle: (0, _languageHandler._t)("share|share_call_subtitle") }); } catch (e) { _logger.logger.error("Could not generate call link.", e); } }, [generateCallLink]); const shareClick = (0, _react.useCallback)(() => { if (isRoomJoinable()) { showLinkModal(); } else { // the room needs to be set to public or knock to generate a link _Modal.default.createDialog(JoinRuleDialog, { room, // If the user cannot invite the Knocking is not given as an option. canInvite }).finished.then(() => { if (isRoomJoinable()) showLinkModal(); }); } }, [isRoomJoinable, showLinkModal, room, canInvite]); return /*#__PURE__*/_react.default.createElement(_react.default.Fragment, null, canInviteGuests && /*#__PURE__*/_react.default.createElement(_compoundWeb.Tooltip, { label: (0, _languageHandler._t)("voip|get_call_link") }, /*#__PURE__*/_react.default.createElement(_compoundWeb.IconButton, { onClick: shareClick }, /*#__PURE__*/_react.default.createElement(_link.default, null)))); }; /** * A dialog to change the join rule of a room to public or knock. * @param room The room to change the join rule of. * @param onFinished Callback that is getting called if the dialog wants to close. */ exports.CallGuestLinkButton = CallGuestLinkButton; const JoinRuleDialog = ({ onFinished, room, canInvite }) => { const askToJoinEnabled = _SettingsStore.default.getValue("feature_ask_to_join"); const [isUpdating, setIsUpdating] = _react.default.useState(undefined); const changeJoinRule = (0, _react.useCallback)(async newRule => { if (isUpdating !== undefined) return; setIsUpdating(newRule); await room.client.sendStateEvent(room.roomId, _matrix.EventType.RoomJoinRules, { join_rule: newRule }, ""); // Show the dialog for a bit to give the user feedback setTimeout(() => onFinished(), 500); }, [isUpdating, onFinished, room.client, room.roomId]); return /*#__PURE__*/_react.default.createElement(_BaseDialog.default, { title: (0, _languageHandler._t)("update_room_access_modal|title"), onFinished: onFinished, className: "mx_JoinRuleDialog" }, /*#__PURE__*/_react.default.createElement("p", null, (0, _languageHandler._t)("update_room_access_modal|description")), /*#__PURE__*/_react.default.createElement("div", { className: "mx_JoinRuleDialogButtons" }, askToJoinEnabled && canInvite && /*#__PURE__*/_react.default.createElement(_compoundWeb.Button, { kind: "secondary", className: "mx_Dialog_nonDialogButton", disabled: isUpdating === _matrix.JoinRule.Knock, onClick: () => changeJoinRule(_matrix.JoinRule.Knock) }, (0, _languageHandler._t)("action|ask_to_join")), /*#__PURE__*/_react.default.createElement(_compoundWeb.Button, { className: "mx_Dialog_nonDialogButton", kind: "destructive", disabled: isUpdating === _matrix.JoinRule.Public, onClick: () => changeJoinRule(_matrix.JoinRule.Public) }, (0, _languageHandler._t)("common|public"))), /*#__PURE__*/_react.default.createElement("p", null, (0, _languageHandler._t)("update_room_access_modal|dont_change_description")), /*#__PURE__*/_react.default.createElement("div", { className: "mx_JoinRuleDialogButtons" }, /*#__PURE__*/_react.default.createElement(_compoundWeb.Button, { kind: "tertiary", className: "mx_Dialog_nonDialogButton", onClick: () => { if (isUpdating === undefined) onFinished(); } }, (0, _languageHandler._t)("update_room_access_modal|no_change")))); }; exports.JoinRuleDialog = JoinRuleDialog; //# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJuYW1lcyI6WyJfbGluayIsIl9pbnRlcm9wUmVxdWlyZURlZmF1bHQiLCJyZXF1aXJlIiwiX2NvbXBvdW5kV2ViIiwiX3JlYWN0IiwiX2ludGVyb3BSZXF1aXJlV2lsZGNhcmQiLCJfbG9nZ2VyIiwiX21hdHJpeCIsIl9Nb2RhbCIsIl9TaGFyZURpYWxvZyIsIl9sYW5ndWFnZUhhbmRsZXIiLCJfU2V0dGluZ3NTdG9yZSIsIl9QZXJtYWxpbmtzIiwiX0Jhc2VEaWFsb2ciLCJfdXNlR3Vlc3RBY2Nlc3NJbmZvcm1hdGlvbiIsIl9nZXRSZXF1aXJlV2lsZGNhcmRDYWNoZSIsImUiLCJXZWFrTWFwIiwiciIsInQiLCJfX2VzTW9kdWxlIiwiZGVmYXVsdCIsImhhcyIsImdldCIsIm4iLCJfX3Byb3RvX18iLCJhIiwiT2JqZWN0IiwiZGVmaW5lUHJvcGVydHkiLCJnZXRPd25Qcm9wZXJ0eURlc2NyaXB0b3IiLCJ1IiwiaGFzT3duUHJvcGVydHkiLCJjYWxsIiwiaSIsInNldCIsIkNhbGxHdWVzdExpbmtCdXR0b24iLCJyb29tIiwiY2FuSW52aXRlR3Vlc3RzIiwiZ3Vlc3RTcGFVcmwiLCJpc1Jvb21Kb2luYWJsZSIsImNhbkludml0ZSIsInVzZUd1ZXN0QWNjZXNzSW5mb3JtYXRpb24iLCJnZW5lcmF0ZUNhbGxMaW5rIiwidXNlQ2FsbGJhY2siLCJFcnJvciIsInVybCIsIlVSTCIsInBhdGhuYW1lIiwic2VhcmNoUGFyYW1zIiwicm9vbUlkIiwiaGFzRW5jcnlwdGlvblN0YXRlRXZlbnQiLCJzZXJ2ZXIiLCJjYWxjdWxhdGVSb29tVmlhIiwiaGFzaCIsIm5hbWUiLCJzZWFyY2giLCJsb2dnZXIiLCJpbmZvIiwic2hvd0xpbmtNb2RhbCIsInRhcmdldCIsIk1vZGFsIiwiY3JlYXRlRGlhbG9nIiwiU2hhcmVEaWFsb2ciLCJjdXN0b21UaXRsZSIsIl90Iiwic3VidGl0bGUiLCJlcnJvciIsInNoYXJlQ2xpY2siLCJKb2luUnVsZURpYWxvZyIsImZpbmlzaGVkIiwidGhlbiIsImNyZWF0ZUVsZW1lbnQiLCJGcmFnbWVudCIsIlRvb2x0aXAiLCJsYWJlbCIsIkljb25CdXR0b24iLCJvbkNsaWNrIiwiZXhwb3J0cyIsIm9uRmluaXNoZWQiLCJhc2tUb0pvaW5FbmFibGVkIiwiU2V0dGluZ3NTdG9yZSIsImdldFZhbHVlIiwiaXNVcGRhdGluZyIsInNldElzVXBkYXRpbmciLCJSZWFjdCIsInVzZVN0YXRlIiwidW5kZWZpbmVkIiwiY2hhbmdlSm9pblJ1bGUiLCJuZXdSdWxlIiwiY2xpZW50Iiwic2VuZFN0YXRlRXZlbnQiLCJFdmVudFR5cGUiLCJSb29tSm9pblJ1bGVzIiwiam9pbl9ydWxlIiwic2V0VGltZW91dCIsInRpdGxlIiwiY2xhc3NOYW1lIiwiQnV0dG9uIiwia2luZCIsImRpc2FibGVkIiwiSm9pblJ1bGUiLCJLbm9jayIsIlB1YmxpYyJdLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uLy4uL3NyYy9jb21wb25lbnRzL3ZpZXdzL3Jvb21zL1Jvb21IZWFkZXIvQ2FsbEd1ZXN0TGlua0J1dHRvbi50c3giXSwic291cmNlc0NvbnRlbnQiOlsiLypcbkNvcHlyaWdodCAyMDI0IE5ldyBWZWN0b3IgTHRkLlxuQ29weXJpZ2h0IDIwMjQgVGhlIE1hdHJpeC5vcmcgRm91bmRhdGlvbiBDLkkuQy5cblxuU1BEWC1MaWNlbnNlLUlkZW50aWZpZXI6IEFHUEwtMy4wLW9ubHkgT1IgR1BMLTMuMC1vbmx5XG5QbGVhc2Ugc2VlIExJQ0VOU0UgZmlsZXMgaW4gdGhlIHJlcG9zaXRvcnkgcm9vdCBmb3IgZnVsbCBkZXRhaWxzLlxuKi9cbmltcG9ydCBFeHRlcm5hbExpbmtJY29uIGZyb20gXCJAdmVjdG9yLWltL2NvbXBvdW5kLWRlc2lnbi10b2tlbnMvYXNzZXRzL3dlYi9pY29ucy9saW5rXCI7XG5pbXBvcnQgeyBCdXR0b24sIEljb25CdXR0b24sIFRvb2x0aXAgfSBmcm9tIFwiQHZlY3Rvci1pbS9jb21wb3VuZC13ZWJcIjtcbmltcG9ydCBSZWFjdCwgeyB1c2VDYWxsYmFjayB9IGZyb20gXCJyZWFjdFwiO1xuaW1wb3J0IHsgbG9nZ2VyIH0gZnJvbSBcIm1hdHJpeC1qcy1zZGsvc3JjL2xvZ2dlclwiO1xuaW1wb3J0IHsgRXZlbnRUeXBlLCBKb2luUnVsZSwgUm9vbSB9IGZyb20gXCJtYXRyaXgtanMtc2RrL3NyYy9tYXRyaXhcIjtcblxuaW1wb3J0IE1vZGFsIGZyb20gXCIuLi8uLi8uLi8uLi9Nb2RhbFwiO1xuaW1wb3J0IFNoYXJlRGlhbG9nIGZyb20gXCIuLi8uLi9kaWFsb2dzL1NoYXJlRGlhbG9nXCI7XG5pbXBvcnQgeyBfdCB9IGZyb20gXCIuLi8uLi8uLi8uLi9sYW5ndWFnZUhhbmRsZXJcIjtcbmltcG9ydCBTZXR0aW5nc1N0b3JlIGZyb20gXCIuLi8uLi8uLi8uLi9zZXR0aW5ncy9TZXR0aW5nc1N0b3JlXCI7XG5pbXBvcnQgeyBjYWxjdWxhdGVSb29tVmlhIH0gZnJvbSBcIi4uLy4uLy4uLy4uL3V0aWxzL3Blcm1hbGlua3MvUGVybWFsaW5rc1wiO1xuaW1wb3J0IEJhc2VEaWFsb2cgZnJvbSBcIi4uLy4uL2RpYWxvZ3MvQmFzZURpYWxvZ1wiO1xuaW1wb3J0IHsgdXNlR3Vlc3RBY2Nlc3NJbmZvcm1hdGlvbiB9IGZyb20gXCIuLi8uLi8uLi8uLi9ob29rcy9yb29tL3VzZUd1ZXN0QWNjZXNzSW5mb3JtYXRpb25cIjtcblxuLyoqXG4gKiBEaXNwbGF5IGEgYnV0dG9uIHRvIG9wZW4gYSBkaWFsb2cgdG8gc2hhcmUgYSBsaW5rIHRvIHRoZSBjYWxsIHVzaW5nIGEgZWxlbWVudCBjYWxsIGd1ZXN0IHNwYSB1cmwgKGBlbGVtZW50X2NhbGw6Z3Vlc3Rfc3BhX3VybGAgaW4gdGhlIEVXIGNvbmZpZykuXG4gKiBAcGFyYW0gcm9vbVxuICogQHJldHVybnMgTm90aGluZyBpZiB0aGVyZSBpcyBub3QgdGhlIG9wdGlvbiB0byBzaGFyZSBhIGxpbmsgKE5vIGd1ZXN0X3NwYV91cmwgaXMgc2V0KSBvciBhIGJ1dHRvbiB0byBvcGVuIGEgZGlhbG9nIHRvIHNoYXJlIHRoZSBsaW5rLlxuICovXG5leHBvcnQgY29uc3QgQ2FsbEd1ZXN0TGlua0J1dHRvbjogUmVhY3QuRkM8eyByb29tOiBSb29tIH0+ID0gKHsgcm9vbSB9KSA9PiB7XG4gICAgY29uc3QgeyBjYW5JbnZpdGVHdWVzdHMsIGd1ZXN0U3BhVXJsLCBpc1Jvb21Kb2luYWJsZSwgY2FuSW52aXRlIH0gPSB1c2VHdWVzdEFjY2Vzc0luZm9ybWF0aW9uKHJvb20pO1xuXG4gICAgY29uc3QgZ2VuZXJhdGVDYWxsTGluayA9IHVzZUNhbGxiYWNrKCgpID0+IHtcbiAgICAgICAgaWYgKCFpc1Jvb21Kb2luYWJsZSgpKSB0aHJvdyBuZXcgRXJyb3IoXCJDYW5ub3QgY3JlYXRlIGxpbmsgZm9yIHJvb20gdGhhdCB1c2VycyBjYW4gbm90IGpvaW4gd2l0aG91dCBpbnZpdGUuXCIpO1xuICAgICAgICBpZiAoIWd1ZXN0U3BhVXJsKSB0aHJvdyBuZXcgRXJyb3IoXCJObyBndWVzdCBTUEEgdXJsIGZvciBleHRlcm5hbCBsaW5rcyBwcm92aWRlZC5cIik7XG4gICAgICAgIGNvbnN0IHVybCA9IG5ldyBVUkwoZ3Vlc3RTcGFVcmwpO1xuICAgICAgICB1cmwucGF0aG5hbWUgPSBcIi9yb29tL1wiO1xuICAgICAgICAvLyBTZXQgcGFyYW1zIGZvciB0aGUgc2hhcmFibGUgdXJsXG4gICAgICAgIHVybC5zZWFyY2hQYXJhbXMuc2V0KFwicm9vbUlkXCIsIHJvb20ucm9vbUlkKTtcbiAgICAgICAgaWYgKHJvb20uaGFzRW5jcnlwdGlvblN0YXRlRXZlbnQoKSkgdXJsLnNlYXJjaFBhcmFtcy5zZXQoXCJwZXJQYXJ0aWNpcGFudEUyRUVcIiwgXCJ0cnVlXCIpO1xuICAgICAgICBmb3IgKGNvbnN0IHNlcnZlciBvZiBjYWxjdWxhdGVSb29tVmlhKHJvb20pKSB7XG4gICAgICAgICAgICB1cmwuc2VhcmNoUGFyYW1zLnNldChcInZpYVNlcnZlcnNcIiwgc2VydmVyKTtcbiAgICAgICAgfVxuXG4gICAgICAgIC8vIE1vdmUgcGFyYW1zIGludG8gaGFzaFxuICAgICAgICB1cmwuaGFzaCA9IFwiL1wiICsgcm9vbS5uYW1lICsgdXJsLnNlYXJjaDtcbiAgICAgICAgdXJsLnNlYXJjaCA9IFwiXCI7XG5cbiAgICAgICAgbG9nZ2VyLmluZm8oXCJHZW5lcmF0ZWQgZWxlbWVudCBjYWxsIGV4dGVybmFsIHVybDpcIiwgdXJsKTtcbiAgICAgICAgcmV0dXJuIHVybDtcbiAgICB9LCBbZ3Vlc3RTcGFVcmwsIGlzUm9vbUpvaW5hYmxlLCByb29tXSk7XG5cbiAgICBjb25zdCBzaG93TGlua01vZGFsID0gdXNlQ2FsbGJhY2soKCkgPT4ge1xuICAgICAgICB0cnkge1xuICAgICAgICAgICAgLy8gZ2VuZXJhdGVDYWxsTGluayB0aHJvd3MgaWYgdGhlIGludml0ZSBydWxlcyBhcmUgbm90IG1ldFxuICAgICAgICAgICAgY29uc3QgdGFyZ2V0ID0gZ2VuZXJhdGVDYWxsTGluaygpO1xuICAgICAgICAgICAgTW9kYWwuY3JlYXRlRGlhbG9nKFNoYXJlRGlhbG9nLCB7XG4gICAgICAgICAgICAgICAgdGFyZ2V0LFxuICAgICAgICAgICAgICAgIGN1c3RvbVRpdGxlOiBfdChcInNoYXJlfHNoYXJlX2NhbGxcIiksXG4gICAgICAgICAgICAgICAgc3VidGl0bGU6IF90KFwic2hhcmV8c2hhcmVfY2FsbF9zdWJ0aXRsZVwiKSxcbiAgICAgICAgICAgIH0pO1xuICAgICAgICB9IGNhdGNoIChlKSB7XG4gICAgICAgICAgICBsb2dnZXIuZXJyb3IoXCJDb3VsZCBub3QgZ2VuZXJhdGUgY2FsbCBsaW5rLlwiLCBlKTtcbiAgICAgICAgfVxuICAgIH0sIFtnZW5lcmF0ZUNhbGxMaW5rXSk7XG5cbiAgICBjb25zdCBzaGFyZUNsaWNrID0gdXNlQ2FsbGJhY2soKCkgPT4ge1xuICAgICAgICBpZiAoaXNSb29tSm9pbmFibGUoKSkge1xuICAgICAgICAgICAgc2hvd0xpbmtNb2RhbCgpO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgLy8gdGhlIHJvb20gbmVlZHMgdG8gYmUgc2V0IHRvIHB1YmxpYyBvciBrbm9jayB0byBnZW5lcmF0ZSBhIGxpbmtcbiAgICAgICAgICAgIE1vZGFsLmNyZWF0ZURpYWxvZyhKb2luUnVsZURpYWxvZywge1xuICAgICAgICAgICAgICAgIHJvb20sXG4gICAgICAgICAgICAgICAgLy8gSWYgdGhlIHVzZXIgY2Fubm90IGludml0ZSB0aGUgS25vY2tpbmcgaXMgbm90IGdpdmVuIGFzIGFuIG9wdGlvbi5cbiAgICAgICAgICAgICAgICBjYW5JbnZpdGUsXG4gICAgICAgICAgICB9KS5maW5pc2hlZC50aGVuKCgpID0+IHtcbiAgICAgICAgICAgICAgICBpZiAoaXNSb29tSm9pbmFibGUoKSkgc2hvd0xpbmtNb2RhbCgpO1xuICAgICAgICAgICAgfSk7XG4gICAgICAgIH1cbiAgICB9LCBbaXNSb29tSm9pbmFibGUsIHNob3dMaW5rTW9kYWwsIHJvb20sIGNhbkludml0ZV0pO1xuXG4gICAgcmV0dXJuIChcbiAgICAgICAgPD5cbiAgICAgICAgICAgIHtjYW5JbnZpdGVHdWVzdHMgJiYgKFxuICAgICAgICAgICAgICAgIDxUb29sdGlwIGxhYmVsPXtfdChcInZvaXB8Z2V0X2NhbGxfbGlua1wiKX0+XG4gICAgICAgICAgICAgICAgICAgIDxJY29uQnV0dG9uIG9uQ2xpY2s9e3NoYXJlQ2xpY2t9PlxuICAgICAgICAgICAgICAgICAgICAgICAgPEV4dGVybmFsTGlua0ljb24gLz5cbiAgICAgICAgICAgICAgICAgICAgPC9JY29uQnV0dG9uPlxuICAgICAgICAgICAgICAgIDwvVG9vbHRpcD5cbiAgICAgICAgICAgICl9XG4gICAgICAgIDwvPlxuICAgICk7XG59O1xuXG4vKipcbiAqIEEgZGlhbG9nIHRvIGNoYW5nZSB0aGUgam9pbiBydWxlIG9mIGEgcm9vbSB0byBwdWJsaWMgb3Iga25vY2suXG4gKiBAcGFyYW0gcm9vbSBUaGUgcm9vbSB0byBjaGFuZ2UgdGhlIGpvaW4gcnVsZSBvZi5cbiAqIEBwYXJhbSBvbkZpbmlzaGVkIENhbGxiYWNrIHRoYXQgaXMgZ2V0dGluZyBjYWxsZWQgaWYgdGhlIGRpYWxvZyB3YW50cyB0byBjbG9zZS5cbiAqL1xuZXhwb3J0IGNvbnN0IEpvaW5SdWxlRGlhbG9nOiBSZWFjdC5GQzx7XG4gICAgb25GaW5pc2hlZCgpOiB2b2lkO1xuICAgIHJvb206IFJvb207XG4gICAgY2FuSW52aXRlOiBib29sZWFuO1xufT4gPSAoeyBvbkZpbmlzaGVkLCByb29tLCBjYW5JbnZpdGUgfSkgPT4ge1xuICAgIGNvbnN0IGFza1RvSm9pbkVuYWJsZWQgPSBTZXR0aW5nc1N0b3JlLmdldFZhbHVlKFwiZmVhdHVyZV9hc2tfdG9fam9pblwiKTtcbiAgICBjb25zdCBbaXNVcGRhdGluZywgc2V0SXNVcGRhdGluZ10gPSBSZWFjdC51c2VTdGF0ZTx1bmRlZmluZWQgfCBKb2luUnVsZT4odW5kZWZpbmVkKTtcbiAgICBjb25zdCBjaGFuZ2VKb2luUnVsZSA9IHVzZUNhbGxiYWNrKFxuICAgICAgICBhc3luYyAobmV3UnVsZTogSm9pblJ1bGUpID0+IHtcbiAgICAgICAgICAgIGlmIChpc1VwZGF0aW5nICE9PSB1bmRlZmluZWQpIHJldHVybjtcbiAgICAgICAgICAgIHNldElzVXBkYXRpbmcobmV3UnVsZSk7XG4gICAgICAgICAgICBhd2FpdCByb29tLmNsaWVudC5zZW5kU3RhdGVFdmVudChcbiAgICAgICAgICAgICAgICByb29tLnJvb21JZCxcbiAgICAgICAgICAgICAgICBFdmVudFR5cGUuUm9vbUpvaW5SdWxlcyxcbiAgICAgICAgICAgICAgICB7XG4gICAgICAgICAgICAgICAgICAgIGpvaW5fcnVsZTogbmV3UnVsZSxcbiAgICAgICAgICAgICAgICB9LFxuICAgICAgICAgICAgICAgIFwiXCIsXG4gICAgICAgICAgICApO1xuICAgICAgICAgICAgLy8gU2hvdyB0aGUgZGlhbG9nIGZvciBhIGJpdCB0byBnaXZlIHRoZSB1c2VyIGZlZWRiYWNrXG4gICAgICAgICAgICBzZXRUaW1lb3V0KCgpID0+IG9uRmluaXNoZWQoKSwgNTAwKTtcbiAgICAgICAgfSxcbiAgICAgICAgW2lzVXBkYXRpbmcsIG9uRmluaXNoZWQsIHJvb20uY2xpZW50LCByb29tLnJvb21JZF0sXG4gICAgKTtcbiAgICByZXR1cm4gKFxuICAgICAgICA8QmFzZURpYWxvZyB0aXRsZT17X3QoXCJ1cGRhdGVfcm9vbV9hY2Nlc3NfbW9kYWx8dGl0bGVcIil9IG9uRmluaXNoZWQ9e29uRmluaXNoZWR9IGNsYXNzTmFtZT1cIm14X0pvaW5SdWxlRGlhbG9nXCI+XG4gICAgICAgICAgICA8cD57X3QoXCJ1cGRhdGVfcm9vbV9hY2Nlc3NfbW9kYWx8ZGVzY3JpcHRpb25cIil9PC9wPlxuICAgICAgICAgICAgPGRpdiBjbGFzc05hbWU9XCJteF9Kb2luUnVsZURpYWxvZ0J1dHRvbnNcIj5cbiAgICAgICAgICAgICAgICB7YXNrVG9Kb2luRW5hYmxlZCAmJiBjYW5JbnZpdGUgJiYgKFxuICAgICAgICAgICAgICAgICAgICA8QnV0dG9uXG4gICAgICAgICAgICAgICAgICAgICAgICBraW5kPVwic2Vjb25kYXJ5XCJcbiAgICAgICAgICAgICAgICAgICAgICAgIGNsYXNzTmFtZT1cIm14X0RpYWxvZ19ub25EaWFsb2dCdXR0b25cIlxuICAgICAgICAgICAgICAgICAgICAgICAgZGlzYWJsZWQ9e2lzVXBkYXRpbmcgPT09IEpvaW5SdWxlLktub2NrfVxuICAgICAgICAgICAgICAgICAgICAgICAgb25DbGljaz17KCkgPT4gY2hhbmdlSm9pblJ1bGUoSm9pblJ1bGUuS25vY2spfVxuICAgICAgICAgICAgICAgICAgICA+XG4gICAgICAgICAgICAgICAgICAgICAgICB7X3QoXCJhY3Rpb258YXNrX3RvX2pvaW5cIil9XG4gICAgICAgICAgICAgICAgICAgIDwvQnV0dG9uPlxuICAgICAgICAgICAgICAgICl9XG4gICAgICAgICAgICAgICAgPEJ1dHRvblxuICAgICAgICAgICAgICAgICAgICBjbGFzc05hbWU9XCJteF9EaWFsb2dfbm9uRGlhbG9nQnV0dG9uXCJcbiAgICAgICAgICAgICAgICAgICAga2luZD1cImRlc3RydWN0aXZlXCJcbiAgICAgICAgICAgICAgICAgICAgZGlzYWJsZWQ9e2lzVXBkYXRpbmcgPT09IEpvaW5SdWxlLlB1YmxpY31cbiAgICAgICAgICAgICAgICAgICAgb25DbGljaz17KCkgPT4gY2hhbmdlSm9pblJ1bGUoSm9pblJ1bGUuUHVibGljKX1cbiAgICAgICAgICAgICAgICA+XG4gICAgICAgICAgICAgICAgICAgIHtfdChcImNvbW1vbnxwdWJsaWNcIil9XG4gICAgICAgICAgICAgICAgPC9CdXR0b24+XG4gICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICAgIDxwPntfdChcInVwZGF0ZV9yb29tX2FjY2Vzc19tb2RhbHxkb250X2NoYW5nZV9kZXNjcmlwdGlvblwiKX08L3A+XG4gICAgICAgICAgICA8ZGl2IGNsYXNzTmFtZT1cIm14X0pvaW5SdWxlRGlhbG9nQnV0dG9uc1wiPlxuICAgICAgICAgICAgICAgIDxCdXR0b25cbiAgICAgICAgICAgICAgICAgICAga2luZD1cInRlcnRpYXJ5XCJcbiAgICAgICAgICAgICAgICAgICAgY2xhc3NOYW1lPVwibXhfRGlhbG9nX25vbkRpYWxvZ0J1dHRvblwiXG4gICAgICAgICAgICAgICAgICAgIG9uQ2xpY2s9eygpID0+IHtcbiAgICAgICAgICAgICAgICAgICAgICAgIGlmIChpc1VwZGF0aW5nID09PSB1bmRlZmluZWQpIG9uRmluaXNoZWQoKTtcbiAgICAgICAgICAgICAgICAgICAgfX1cbiAgICAgICAgICAgICAgICA+XG4gICAgICAgICAgICAgICAgICAgIHtfdChcInVwZGF0ZV9yb29tX2FjY2Vzc19tb2RhbHxub19jaGFuZ2VcIil9XG4gICAgICAgICAgICAgICAgPC9CdXR0b24+XG4gICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgPC9CYXNlRGlhbG9nPlxuICAgICk7XG59O1xuIl0sIm1hcHBpbmdzIjoiOzs7Ozs7O0FBT0EsSUFBQUEsS0FBQSxHQUFBQyxzQkFBQSxDQUFBQyxPQUFBO0FBQ0Es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