UNPKG

matrix-react-sdk

Version:
143 lines (140 loc) 21.8 kB
"use strict"; var _interopRequireDefault = require("@babel/runtime/helpers/interopRequireDefault"); Object.defineProperty(exports, "__esModule", { value: true }); exports.usePublicRoomDirectory = exports.ALL_ROOMS = void 0; var _react = require("react"); var _MatrixClientPeg = require("../MatrixClientPeg"); var _SdkConfig = _interopRequireDefault(require("../SdkConfig")); var _SettingsStore = _interopRequireDefault(require("../settings/SettingsStore")); var _useLatestResult = require("./useLatestResult"); var _useSettings = require("./useSettings"); /* Copyright 2024 New Vector Ltd. Copyright 2022 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. */ const ALL_ROOMS = exports.ALL_ROOMS = "ALL_ROOMS"; const LAST_SERVER_KEY = "mx_last_room_directory_server"; const LAST_INSTANCE_KEY = "mx_last_room_directory_instance"; let thirdParty; const NSFW_KEYWORD = "nsfw"; const cheapNsfwFilter = room => !room.name?.toLocaleLowerCase().includes(NSFW_KEYWORD) && !room.topic?.toLocaleLowerCase().includes(NSFW_KEYWORD); const usePublicRoomDirectory = () => { const [publicRooms, setPublicRooms] = (0, _react.useState)([]); const [config, setConfigInternal] = (0, _react.useState)(undefined); const [protocols, setProtocols] = (0, _react.useState)(null); const [ready, setReady] = (0, _react.useState)(false); const [loading, setLoading] = (0, _react.useState)(false); const [error, setError] = (0, _react.useState)(); const [updateQuery, updateResult] = (0, _useLatestResult.useLatestResult)(setPublicRooms); const showNsfwPublicRooms = (0, _useSettings.useSettingValue)("SpotlightSearch.showNsfwPublicRooms"); async function initProtocols() { if (!_MatrixClientPeg.MatrixClientPeg.get()) { // We may not have a client yet when invoked from welcome page setReady(true); } else if (thirdParty) { setProtocols(thirdParty); } else { const response = await _MatrixClientPeg.MatrixClientPeg.safeGet().getThirdpartyProtocols(); thirdParty = response; setProtocols(response); } } function setConfig(config) { if (!ready) { throw new Error("public room configuration not initialised yet"); } else { setConfigInternal(config); } } const search = (0, _react.useCallback)(async ({ limit = 20, query, roomTypes }) => { const opts = { limit }; if (config?.roomServer != _MatrixClientPeg.MatrixClientPeg.safeGet().getDomain()) { opts.server = config?.roomServer; } if (config?.instanceId === ALL_ROOMS) { opts.include_all_networks = true; } else if (config?.instanceId) { opts.third_party_instance_id = config.instanceId; } if (query || roomTypes) { opts.filter = { generic_search_term: query, room_types: roomTypes && (await _MatrixClientPeg.MatrixClientPeg.safeGet().doesServerSupportUnstableFeature("org.matrix.msc3827.stable")) ? Array.from(roomTypes) : undefined }; } updateQuery(opts); setLoading(true); setError(undefined); try { const { chunk } = await _MatrixClientPeg.MatrixClientPeg.safeGet().publicRooms(opts); updateResult(opts, showNsfwPublicRooms ? chunk : chunk.filter(cheapNsfwFilter)); return true; } catch (e) { setError(e instanceof Error ? e : true); console.error("Could not fetch public rooms for params", opts, e); updateResult(opts, []); return false; } finally { setLoading(false); } }, [config, updateQuery, updateResult, showNsfwPublicRooms]); (0, _react.useEffect)(() => { initProtocols(); }, []); (0, _react.useEffect)(() => { if (protocols === null) { return; } const myHomeserver = _MatrixClientPeg.MatrixClientPeg.safeGet().getDomain(); const lsRoomServer = localStorage.getItem(LAST_SERVER_KEY); const lsInstanceId = localStorage.getItem(LAST_INSTANCE_KEY) ?? undefined; let roomServer = myHomeserver; if (lsRoomServer && (_SdkConfig.default.getObject("room_directory")?.get("servers")?.includes(lsRoomServer) || _SettingsStore.default.getValue("room_directory_servers")?.includes(lsRoomServer))) { roomServer = lsRoomServer; } let instanceId = undefined; if (roomServer === myHomeserver && (lsInstanceId === ALL_ROOMS || Object.values(protocols).some(p => { p.instances.some(i => i.instance_id === lsInstanceId); }))) { instanceId = lsInstanceId; } setReady(true); setConfigInternal({ roomServer, instanceId }); }, [protocols]); (0, _react.useEffect)(() => { if (!config) return; localStorage.setItem(LAST_SERVER_KEY, config.roomServer); if (config.instanceId) { localStorage.setItem(LAST_INSTANCE_KEY, config.instanceId); } else { localStorage.removeItem(LAST_INSTANCE_KEY); } }, [config]); return { ready, loading, publicRooms, protocols, config, search, setConfig, error }; }; exports.usePublicRoomDirectory = usePublicRoomDirectory; //# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJuYW1lcyI6WyJfcmVhY3QiLCJyZXF1aXJlIiwiX01hdHJpeENsaWVudFBlZyIsIl9TZGtDb25maWciLCJfaW50ZXJvcFJlcXVpcmVEZWZhdWx0IiwiX1NldHRpbmdzU3RvcmUiLCJfdXNlTGF0ZXN0UmVzdWx0IiwiX3VzZVNldHRpbmdzIiwiQUxMX1JPT01TIiwiZXhwb3J0cyIsIkxBU1RfU0VSVkVSX0tFWSIsIkxBU1RfSU5TVEFOQ0VfS0VZIiwidGhpcmRQYXJ0eSIsIk5TRldfS0VZV09SRCIsImNoZWFwTnNmd0ZpbHRlciIsInJvb20iLCJuYW1lIiwidG9Mb2NhbGVMb3dlckNhc2UiLCJpbmNsdWRlcyIsInRvcGljIiwidXNlUHVibGljUm9vbURpcmVjdG9yeSIsInB1YmxpY1Jvb21zIiwic2V0UHVibGljUm9vbXMiLCJ1c2VTdGF0ZSIsImNvbmZpZyIsInNldENvbmZpZ0ludGVybmFsIiwidW5kZWZpbmVkIiwicHJvdG9jb2xzIiwic2V0UHJvdG9jb2xzIiwicmVhZHkiLCJzZXRSZWFkeSIsImxvYWRpbmciLCJzZXRMb2FkaW5nIiwiZXJyb3IiLCJzZXRFcnJvciIsInVwZGF0ZVF1ZXJ5IiwidXBkYXRlUmVzdWx0IiwidXNlTGF0ZXN0UmVzdWx0Iiwic2hvd05zZndQdWJsaWNSb29tcyIsInVzZVNldHRpbmdWYWx1ZSIsImluaXRQcm90b2NvbHMiLCJNYXRyaXhDbGllbnRQZWciLCJnZXQiLCJyZXNwb25zZSIsInNhZmVHZXQiLCJnZXRUaGlyZHBhcnR5UHJvdG9jb2xzIiwic2V0Q29uZmlnIiwiRXJyb3IiLCJzZWFyY2giLCJ1c2VDYWxsYmFjayIsImxpbWl0IiwicXVlcnkiLCJyb29tVHlwZXMiLCJvcHRzIiwicm9vbVNlcnZlciIsImdldERvbWFpbiIsInNlcnZlciIsImluc3RhbmNlSWQiLCJpbmNsdWRlX2FsbF9uZXR3b3JrcyIsInRoaXJkX3BhcnR5X2luc3RhbmNlX2lkIiwiZmlsdGVyIiwiZ2VuZXJpY19zZWFyY2hfdGVybSIsInJvb21fdHlwZXMiLCJkb2VzU2VydmVyU3VwcG9ydFVuc3RhYmxlRmVhdHVyZSIsIkFycmF5IiwiZnJvbSIsImNodW5rIiwiZSIsImNvbnNvbGUiLCJ1c2VFZmZlY3QiLCJteUhvbWVzZXJ2ZXIiLCJsc1Jvb21TZXJ2ZXIiLCJsb2NhbFN0b3JhZ2UiLCJnZXRJdGVtIiwibHNJbnN0YW5jZUlkIiwiU2RrQ29uZmlnIiwiZ2V0T2JqZWN0IiwiU2V0dGluZ3NTdG9yZSIsImdldFZhbHVlIiwiT2JqZWN0IiwidmFsdWVzIiwic29tZSIsInAiLCJpbnN0YW5jZXMiLCJpIiwiaW5zdGFuY2VfaWQiLCJzZXRJdGVtIiwicmVtb3ZlSXRlbSJdLCJzb3VyY2VzIjpbIi4uLy4uL3NyYy9ob29rcy91c2VQdWJsaWNSb29tRGlyZWN0b3J5LnRzIl0sInNvdXJjZXNDb250ZW50IjpbIi8qXG5Db3B5cmlnaHQgMjAyNCBOZXcgVmVjdG9yIEx0ZC5cbkNvcHlyaWdodCAyMDIyIFRoZSBNYXRyaXgub3JnIEZvdW5kYXRpb24gQy5JLkMuXG5cblNQRFgtTGljZW5zZS1JZGVudGlmaWVyOiBBR1BMLTMuMC1vbmx5IE9SIEdQTC0zLjAtb25seVxuUGxlYXNlIHNlZSBMSUNFTlNFIGZpbGVzIGluIHRoZSByZXBvc2l0b3J5IHJvb3QgZm9yIGZ1bGwgZGV0YWlscy5cbiovXG5cbmltcG9ydCB7IFJvb21UeXBlLCBJUHJvdG9jb2wsIElQdWJsaWNSb29tc0NodW5rUm9vbSwgSVJvb21EaXJlY3RvcnlPcHRpb25zIH0gZnJvbSBcIm1hdHJpeC1qcy1zZGsvc3JjL21hdHJpeFwiO1xuaW1wb3J0IHsgdXNlQ2FsbGJhY2ssIHVzZUVmZmVjdCwgdXNlU3RhdGUgfSBmcm9tIFwicmVhY3RcIjtcblxuaW1wb3J0IHsgSVB1YmxpY1Jvb21EaXJlY3RvcnlDb25maWcgfSBmcm9tIFwiLi4vY29tcG9uZW50cy92aWV3cy9kaXJlY3RvcnkvTmV0d29ya0Ryb3Bkb3duXCI7XG5pbXBvcnQgeyBNYXRyaXhDbGllbnRQZWcgfSBmcm9tIFwiLi4vTWF0cml4Q2xpZW50UGVnXCI7XG5pbXBvcnQgU2RrQ29uZmlnIGZyb20gXCIuLi9TZGtDb25maWdcIjtcbmltcG9ydCBTZXR0aW5nc1N0b3JlIGZyb20gXCIuLi9zZXR0aW5ncy9TZXR0aW5nc1N0b3JlXCI7XG5pbXBvcnQgeyBQcm90b2NvbHMgfSBmcm9tIFwiLi4vdXRpbHMvRGlyZWN0b3J5VXRpbHNcIjtcbmltcG9ydCB7IHVzZUxhdGVzdFJlc3VsdCB9IGZyb20gXCIuL3VzZUxhdGVzdFJlc3VsdFwiO1xuaW1wb3J0IHsgdXNlU2V0dGluZ1ZhbHVlIH0gZnJvbSBcIi4vdXNlU2V0dGluZ3NcIjtcblxuZXhwb3J0IGNvbnN0IEFMTF9ST09NUyA9IFwiQUxMX1JPT01TXCI7XG5jb25zdCBMQVNUX1NFUlZFUl9LRVkgPSBcIm14X2xhc3Rfcm9vbV9kaXJlY3Rvcnlfc2VydmVyXCI7XG5jb25zdCBMQVNUX0lOU1RBTkNFX0tFWSA9IFwibXhfbGFzdF9yb29tX2RpcmVjdG9yeV9pbnN0YW5jZVwiO1xuXG5leHBvcnQgaW50ZXJmYWNlIElQdWJsaWNSb29tc09wdHMge1xuICAgIGxpbWl0OiBudW1iZXI7XG4gICAgcXVlcnk/OiBzdHJpbmc7XG4gICAgcm9vbVR5cGVzPzogU2V0PFJvb21UeXBlIHwgbnVsbD47XG59XG5cbmxldCB0aGlyZFBhcnR5OiBQcm90b2NvbHM7XG5cbmNvbnN0IE5TRldfS0VZV09SRCA9IFwibnNmd1wiO1xuY29uc3QgY2hlYXBOc2Z3RmlsdGVyID0gKHJvb206IElQdWJsaWNSb29tc0NodW5rUm9vbSk6IGJvb2xlYW4gPT5cbiAgICAhcm9vbS5uYW1lPy50b0xvY2FsZUxvd2VyQ2FzZSgpLmluY2x1ZGVzKE5TRldfS0VZV09SRCkgJiYgIXJvb20udG9waWM/LnRvTG9jYWxlTG93ZXJDYXNlKCkuaW5jbHVkZXMoTlNGV19LRVlXT1JEKTtcblxuZXhwb3J0IGNvbnN0IHVzZVB1YmxpY1Jvb21EaXJlY3RvcnkgPSAoKToge1xuICAgIHJlYWR5OiBib29sZWFuO1xuICAgIGxvYWRpbmc6IGJvb2xlYW47XG4gICAgcHVibGljUm9vbXM6IElQdWJsaWNSb29tc0NodW5rUm9vbVtdO1xuICAgIHByb3RvY29sczogUHJvdG9jb2xzIHwgbnVsbDtcbiAgICBjb25maWc/OiBJUHVibGljUm9vbURpcmVjdG9yeUNvbmZpZyB8IG51bGw7XG4gICAgc2V0Q29uZmlnKGNvbmZpZzogSVB1YmxpY1Jvb21EaXJlY3RvcnlDb25maWcgfCBudWxsKTogdm9pZDtcbiAgICBzZWFyY2gob3B0czogSVB1YmxpY1Jvb21zT3B0cyk6IFByb21pc2U8Ym9vbGVhbj47XG4gICAgZXJyb3I/OiBFcnJvciB8IHRydWU7IC8vIHRydWUgaWYgYW4gdW5rbm93biBlcnJvciBpcyBlbmNvdW50ZXJlZFxufSA9PiB7XG4gICAgY29uc3QgW3B1YmxpY1Jvb21zLCBzZXRQdWJsaWNSb29tc10gPSB1c2VTdGF0ZTxJUHVibGljUm9vbXNDaHVua1Jvb21bXT4oW10pO1xuXG4gICAgY29uc3QgW2NvbmZpZywgc2V0Q29uZmlnSW50ZXJuYWxdID0gdXNlU3RhdGU8SVB1YmxpY1Jvb21EaXJlY3RvcnlDb25maWcgfCBudWxsIHwgdW5kZWZpbmVkPih1bmRlZmluZWQpO1xuXG4gICAgY29uc3QgW3Byb3RvY29scywgc2V0UHJvdG9jb2xzXSA9IHVzZVN0YXRlPFByb3RvY29scyB8IG51bGw+KG51bGwpO1xuXG4gICAgY29uc3QgW3JlYWR5LCBzZXRSZWFkeV0gPSB1c2VTdGF0ZShmYWxzZSk7XG4gICAgY29uc3QgW2xvYWRpbmcsIHNldExvYWRpbmddID0gdXNlU3RhdGUoZmFsc2UpO1xuICAgIGNvbnN0IFtlcnJvciwgc2V0RXJyb3JdID0gdXNlU3RhdGU8RXJyb3IgfCB0cnVlIHwgdW5kZWZpbmVkPigpO1xuXG4gICAgY29uc3QgW3VwZGF0ZVF1ZXJ5LCB1cGRhdGVSZXN1bHRdID0gdXNlTGF0ZXN0UmVzdWx0PElSb29tRGlyZWN0b3J5T3B0aW9ucywgSVB1YmxpY1Jvb21zQ2h1bmtSb29tW10+KHNldFB1YmxpY1Jvb21zKTtcblxuICAgIGNvbnN0IHNob3dOc2Z3UHVibGljUm9vbXMgPSB1c2VTZXR0aW5nVmFsdWU8Ym9vbGVhbj4oXCJTcG90bGlnaHRTZWFyY2guc2hvd05zZndQdWJsaWNSb29tc1wiKTtcblxuICAgIGFzeW5jIGZ1bmN0aW9uIGluaXRQcm90b2NvbHMoKTogUHJvbWlzZTx2b2lkPiB7XG4gICAgICAgIGlmICghTWF0cml4Q2xpZW50UGVnLmdldCgpKSB7XG4gICAgICAgICAgICAvLyBXZSBtYXkgbm90IGhhdmUgYSBjbGllbnQgeWV0IHdoZW4gaW52b2tlZCBmcm9tIHdlbGNvbWUgcGFnZVxuICAgICAgICAgICAgc2V0UmVhZHkodHJ1ZSk7XG4gICAgICAgIH0gZWxzZSBpZiAodGhpcmRQYXJ0eSkge1xuICAgICAgICAgICAgc2V0UHJvdG9jb2xzKHRoaXJkUGFydHkpO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgY29uc3QgcmVzcG9uc2UgPSBhd2FpdCBNYXRyaXhDbGllbnRQZWcuc2FmZUdldCgpLmdldFRoaXJkcGFydHlQcm90b2NvbHMoKTtcbiAgICAgICAgICAgIHRoaXJkUGFydHkgPSByZXNwb25zZTtcbiAgICAgICAgICAgIHNldFByb3RvY29scyhyZXNwb25zZSk7XG4gICAgICAgIH1cbiAgICB9XG5cbiAgICBmdW5jdGlvbiBzZXRDb25maWcoY29uZmlnOiBJUHVibGljUm9vbURpcmVjdG9yeUNvbmZpZyk6IHZvaWQge1xuICAgICAgICBpZiAoIXJlYWR5KSB7XG4gICAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoXCJwdWJsaWMgcm9vbSBjb25maWd1cmF0aW9uIG5vdCBpbml0aWFsaXNlZCB5ZXRcIik7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICBzZXRDb25maWdJbnRlcm5hbChjb25maWcpO1xuICAgICAgICB9XG4gICAgfVxuXG4gICAgY29uc3Qgc2VhcmNoID0gdXNlQ2FsbGJhY2soXG4gICAgICAgIGFzeW5jICh7IGxpbWl0ID0gMjAsIHF1ZXJ5LCByb29tVHlwZXMgfTogSVB1YmxpY1Jvb21zT3B0cyk6IFByb21pc2U8Ym9vbGVhbj4gPT4ge1xuICAgICAgICAgICAgY29uc3Qgb3B0czogSVJvb21EaXJlY3RvcnlPcHRpb25zID0geyBsaW1pdCB9O1xuXG4gICAgICAgICAgICBpZiAoY29uZmlnPy5yb29tU2VydmVyICE9IE1hdHJpeENsaWVudFBlZy5zYWZlR2V0KCkuZ2V0RG9tYWluKCkpIHtcbiAgICAgICAgICAgICAgICBvcHRzLnNlcnZlciA9IGNvbmZpZz8ucm9vbVNlcnZlcjtcbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgaWYgKGNvbmZpZz8uaW5zdGFuY2VJZCA9PT0gQUxMX1JPT01TKSB7XG4gICAgICAgICAgICAgICAgb3B0cy5pbmNsdWRlX2FsbF9uZXR3b3JrcyA9IHRydWU7XG4gICAgICAgICAgICB9IGVsc2UgaWYgKGNvbmZpZz8uaW5zdGFuY2VJZCkge1xuICAgICAgICAgICAgICAgIG9wdHMudGhpcmRfcGFydHlfaW5zdGFuY2VfaWQgPSBjb25maWcuaW5zdGFuY2VJZDtcbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgaWYgKHF1ZXJ5IHx8IHJvb21UeXBlcykge1xuICAgICAgICAgICAgICAgIG9wdHMuZmlsdGVyID0ge1xuICAgICAgICAgICAgICAgICAgICBnZW5lcmljX3NlYXJjaF90ZXJtOiBxdWVyeSxcbiAgICAgICAgICAgICAgICAgICAgcm9vbV90eXBlczpcbiAgICAgICAgICAgICAgICAgICAgICAgIHJvb21UeXBlcyAmJlxuICAgICAgICAgICAgICAgICAgICAgICAgKGF3YWl0IE1hdHJpeENsaWVudFBlZy5zYWZlR2V0KCkuZG9lc1NlcnZlclN1cHBvcnRVbnN0YWJsZUZlYXR1cmUoXCJvcmcubWF0cml4Lm1zYzM4Mjcuc3RhYmxlXCIpKVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgID8gQXJyYXkuZnJvbTxSb29tVHlwZSB8IG51bGw+KHJvb21UeXBlcylcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA6IHVuZGVmaW5lZCxcbiAgICAgICAgICAgICAgICB9O1xuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICB1cGRhdGVRdWVyeShvcHRzKTtcbiAgICAgICAgICAgIHNldExvYWRpbmcodHJ1ZSk7XG4gICAgICAgICAgICBzZXRFcnJvcih1bmRlZmluZWQpO1xuICAgICAgICAgICAgdHJ5IHtcbiAgICAgICAgICAgICAgICBjb25zdCB7IGNodW5rIH0gPSBhd2FpdCBNYXRyaXhDbGllbnRQZWcuc2FmZUdldCgpLnB1YmxpY1Jvb21zKG9wdHMpO1xuICAgICAgICAgICAgICAgIHVwZGF0ZVJlc3VsdChvcHRzLCBzaG93TnNmd1B1YmxpY1Jvb21zID8gY2h1bmsgOiBjaHVuay5maWx0ZXIoY2hlYXBOc2Z3RmlsdGVyKSk7XG4gICAgICAgICAgICAgICAgcmV0dXJuIHRydWU7XG4gICAgICAgICAgICB9IGNhdGNoIChlKSB7XG4gICAgICAgICAgICAgICAgc2V0RXJyb3IoZSBpbnN0YW5jZW9mIEVycm9yID8gZSA6IHRydWUpO1xuICAgICAgICAgICAgICAgIGNvbnNvbGUuZXJyb3IoXCJDb3VsZCBub3QgZmV0Y2ggcHVibGljIHJvb21zIGZvciBwYXJhbXNcIiwgb3B0cywgZSk7XG4gICAgICAgICAgICAgICAgdXBkYXRlUmVzdWx0KG9wdHMsIFtdKTtcbiAgICAgICAgICAgICAgICByZXR1cm4gZmFsc2U7XG4gICAgICAgICAgICB9IGZpbmFsbHkge1xuICAgICAgICAgICAgICAgIHNldExvYWRpbmcoZmFsc2UpO1xuICAgICAgICAgICAgfVxuICAgICAgICB9LFxuICAgICAgICBbY29uZmlnLCB1cGRhdGVRdWVyeSwgdXBkYXRlUmVzdWx0LCBzaG93TnNmd1B1YmxpY1Jvb21zXSxcbiAgICApO1xuXG4gICAgdXNlRWZmZWN0KCgpID0+IHtcbiAgICAgICAgaW5pdFByb3RvY29scygpO1xuICAgIH0sIFtdKTtcblxuICAgIHVzZUVmZmVjdCgoKSA9PiB7XG4gICAgICAgIGlmIChwcm90b2NvbHMgPT09IG51bGwpIHtcbiAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgfVxuXG4gICAgICAgIGNvbnN0IG15SG9tZXNlcnZlciA9IE1hdHJpeENsaWVudFBlZy5zYWZlR2V0KCkuZ2V0RG9tYWluKCkhO1xuICAgICAgICBjb25zdCBsc1Jvb21TZXJ2ZXIgPSBsb2NhbFN0b3JhZ2UuZ2V0SXRlbShMQVNUX1NFUlZFUl9LRVkpO1xuICAgICAgICBjb25zdCBsc0luc3RhbmNlSWQ6IHN0cmluZyB8IHVuZGVmaW5lZCA9IGxvY2FsU3RvcmFnZS5nZXRJdGVtKExBU1RfSU5TVEFOQ0VfS0VZKSA/PyB1bmRlZmluZWQ7XG5cbiAgICAgICAgbGV0IHJvb21TZXJ2ZXI6IHN0cmluZyA9IG15SG9tZXNlcnZlcjtcbiAgICAgICAgaWYgKFxuICAgICAgICAgICAgbHNSb29tU2VydmVyICYmXG4gICAgICAgICAgICAoU2RrQ29uZmlnLmdldE9iamVjdChcInJvb21fZGlyZWN0b3J5XCIpPy5nZXQoXCJzZXJ2ZXJzXCIpPy5pbmNsdWRlcyhsc1Jvb21TZXJ2ZXIpIHx8XG4gICAgICAgICAgICAgICAgU2V0dGluZ3NTdG9yZS5nZXRWYWx1ZShcInJvb21fZGlyZWN0b3J5X3NlcnZlcnNcIik/LmluY2x1ZGVzKGxzUm9vbVNlcnZlcikpXG4gICAgICAgICkge1xuICAgICAgICAgICAgcm9vbVNlcnZlciA9IGxzUm9vbVNlcnZlciE7XG4gICAgICAgIH1cblxuICAgICAgICBsZXQgaW5zdGFuY2VJZDogc3RyaW5nIHwgdW5kZWZpbmVkID0gdW5kZWZpbmVkO1xuICAgICAgICBpZiAoXG4gICAgICAgICAgICByb29tU2VydmVyID09PSBteUhvbWVzZXJ2ZXIgJiZcbiAgICAgICAgICAgIChsc0luc3RhbmNlSWQgPT09IEFMTF9ST09NUyB8fFxuICAgICAgICAgICAgICAgIE9iamVjdC52YWx1ZXMocHJvdG9jb2xzKS5zb21lKChwOiBJUHJvdG9jb2wpID0+IHtcbiAgICAgICAgICAgICAgICAgICAgcC5pbnN0YW5jZXMuc29tZSgoaSkgPT4gaS5pbnN0YW5jZV9pZCA9PT0gbHNJbnN0YW5jZUlkKTtcbiAgICAgICAgICAgICAgICB9KSlcbiAgICAgICAgKSB7XG4gICAgICAgICAgICBpbnN0YW5jZUlkID0gbHNJbnN0YW5jZUlkO1xuICAgICAgICB9XG5cbiAgICAgICAgc2V0UmVhZHkodHJ1ZSk7XG4gICAgICAgIHNldENvbmZpZ0ludGVybmFsKHsgcm9vbVNlcnZlciwgaW5zdGFuY2VJZCB9KTtcbiAgICB9LCBbcHJvdG9jb2xzXSk7XG5cbiAgICB1c2VFZmZlY3QoKCkgPT4ge1xuICAgICAgICBpZiAoIWNvbmZpZykgcmV0dXJuO1xuICAgICAgICBsb2NhbFN0b3JhZ2Uuc2V0SXRlbShMQVNUX1NFUlZFUl9LRVksIGNvbmZpZy5yb29tU2VydmVyKTtcbiAgICAgICAgaWYgKGNvbmZpZy5pbnN0YW5jZUlkKSB7XG4gICAgICAgICAgICBsb2NhbFN0b3JhZ2Uuc2V0SXRlbShMQVNUX0lOU1RBTkNFX0tFWSwgY29uZmlnLmluc3RhbmNlSWQpO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgbG9jYWxTdG9yYWdlLnJlbW92ZUl0ZW0oTEFTVF9JTlNUQU5DRV9LRVkpO1xuICAgICAgICB9XG4gICAgfSwgW2NvbmZpZ10pO1xuXG4gICAgcmV0dXJuIHtcbiAgICAgICAgcmVhZHksXG4gICAgICAgIGxvYWRpbmcsXG4gICAgICAgIHB1YmxpY1Jvb21zLFxuICAgICAgICBwcm90b2NvbHMsXG4gICAgICAgIGNvbmZpZyxcbiAgICAgICAgc2VhcmNoLFxuICAgICAgICBzZXRDb25maWcsXG4gICAgICAgIGVycm9yLFxuICAgIH0gYXMgY29uc3Q7XG59O1xuIl0sIm1hcHBpbmdzIjoiOzs7Ozs7O0FBU0EsSUFBQUEsTUFBQSxHQUFBQyxPQUFBO0FBR0EsSUFBQUMsZ0JBQUEsR0FBQUQsT0FBQTtBQUNBLElBQUFFLFVBQUEsR0FBQUMsc0JBQUEsQ0FBQUgsT0FBQTtBQUNBLElBQUFJLGNBQUEsR0FBQUQsc0JBQUEsQ0FBQUgsT0FBQTtBQUVBLElBQUFLLGdCQUFBLEdBQUFMLE9BQUE7QUFDQSxJQUFBTSxZQUFBLEdBQUFOLE9BQUE7QUFqQkE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBYU8sTUFBTU8sU0FBUyxHQUFBQyxPQUFBLENBQUFELFNBQUEsR0FBRyxXQUFXO0FBQ3BDLE1BQU1FLGVBQWUsR0FBRywrQkFBK0I7QUFDdkQsTUFBTUMsaUJBQWlCLEdBQUcsaUNBQWlDO0FBUTNELElBQUlDLFVBQXFCO0FBRXpCLE1BQU1DLFlBQVksR0FBRyxNQUFNO0FBQzNCLE1BQU1DLGVBQWUsR0FBSUMsSUFBMkIsSUFDaEQsQ0FBQ0EsSUFBSSxDQUFDQyxJQUFJLEVBQUVDLGlCQUFpQixDQUFDLENBQUMsQ0FBQ0MsUUFBUSxDQUFDTCxZQUFZLENBQUMsSUFBSSxDQUFDRSxJQUFJLENBQUNJLEtBQUssRUFBRUYsaUJBQWlCLENBQUMsQ0FBQyxDQUFDQyxRQUFRLENBQUNMLFlBQVksQ0FBQztBQUU5RyxNQUFNTyxzQkFBc0IsR0FBR0EsQ0FBQSxLQVNqQztFQUNELE1BQU0sQ0FBQ0MsV0FBVyxFQUFFQyxjQUFjLENBQUMsR0FBRyxJQUFBQyxlQUFRLEVBQTBCLEVBQUUsQ0FBQztFQUUzRSxNQUFNLENBQUNDLE1BQU0sRUFBRUMsaUJBQWlCLENBQUMsR0FBRyxJQUFBRixlQUFRLEVBQWdERyxTQUFTLENBQUM7RUFFdEcsTUFBTSxDQUFDQyxTQUFTLEVBQUVDLFlBQVksQ0FBQyxHQUFHLElBQUFMLGVBQVEsRUFBbUIsSUFBSSxDQUFDO0VBRWxFLE1BQU0sQ0FBQ00sS0FBSyxFQUFFQyxRQUFRLENBQUMsR0FBRyxJQUFBUCxlQUFRLEVBQUMsS0FBSyxDQUFDO0VBQ3pDLE1BQU0sQ0FBQ1EsT0FBTyxFQUFFQyxVQUFVLENBQUMsR0FBRyxJQUFBVCxlQUFRLEVBQUMsS0FBSyxDQUFDO0VBQzdDLE1BQU0sQ0FBQ1UsS0FBSyxFQUFFQyxRQUFRLENBQUMsR0FBRyxJQUFBWCxlQUFRLEVBQTJCLENBQUM7RUFFOUQsTUFBTSxDQUFDWSxXQUFXLEVBQUVDLFlBQVksQ0FBQyxHQUFHLElBQUFDLGdDQUFlLEVBQWlEZixjQUFjLENBQUM7RUFFbkgsTUFBTWdCLG1CQUFtQixHQUFHLElBQUFDLDRCQUFlLEVBQVUscUNBQXFDLENBQUM7RUFFM0YsZUFBZUMsYUFBYUEsQ0FBQSxFQUFrQjtJQUMxQyxJQUFJLENBQUNDLGdDQUFlLENBQUNDLEdBQUcsQ0FBQyxDQUFDLEVBQUU7TUFDeEI7TUFDQVosUUFBUSxDQUFDLElBQUksQ0FBQztJQUNsQixDQUFDLE1BQU0sSUFBSWxCLFVBQVUsRUFBRTtNQUNuQmdCLFlBQVksQ0FBQ2hCLFVBQVUsQ0FBQztJQUM1QixDQUFDLE1BQU07TUFDSCxNQUFNK0IsUUFBUSxHQUFHLE1BQU1GLGdDQUFlLENBQUNHLE9BQU8sQ0FBQyxDQUFDLENBQUNDLHNCQUFzQixDQUFDLENBQUM7TUFDekVqQyxVQUFVLEdBQUcrQixRQUFRO01BQ3JCZixZQUFZLENBQUNlLFFBQVEsQ0FBQztJQUMxQjtFQUNKO0VBRUEsU0FBU0csU0FBU0EsQ0FBQ3RCLE1BQWtDLEVBQVE7SUFDekQsSUFBSSxDQUFDSyxLQUFLLEVBQUU7TUFDUixNQUFNLElBQUlrQixLQUFLLENBQUMsK0NBQStDLENBQUM7SUFDcEUsQ0FBQyxNQUFNO01BQ0h0QixpQkFBaUIsQ0FBQ0QsTUFBTSxDQUFDO0lBQzdCO0VBQ0o7RUFFQSxNQUFNd0IsTUFBTSxHQUFHLElBQUFDLGtCQUFXLEVBQ3RCLE9BQU87SUFBRUMsS0FBSyxHQUFHLEVBQUU7SUFBRUMsS0FBSztJQUFFQztFQUE0QixDQUFDLEtBQXVCO0lBQzVFLE1BQU1DLElBQTJCLEdBQUc7TUFBRUg7SUFBTSxDQUFDO0lBRTdDLElBQUkxQixNQUFNLEVBQUU4QixVQUFVLElBQUliLGdDQUFlLENBQUNHLE9BQU8sQ0FBQyxDQUFDLENBQUNXLFNBQVMsQ0FBQyxDQUFDLEVBQUU7TUFDN0RGLElBQUksQ0FBQ0csTUFBTSxHQUFHaEMsTUFBTSxFQUFFOEIsVUFBVTtJQUNwQztJQUVBLElBQUk5QixNQUFNLEVBQUVpQyxVQUFVLEtBQUtqRCxTQUFTLEVBQUU7TUFDbEM2QyxJQUFJLENBQUNLLG9CQUFvQixHQUFHLElBQUk7SUFDcEMsQ0FBQyxNQUFNLElBQUlsQyxNQUFNLEVBQUVpQyxVQUFVLEVBQUU7TUFDM0JKLElBQUksQ0FBQ00sdUJBQXVCLEdBQUduQyxNQUFNLENBQUNpQyxVQUFVO0lBQ3BEO0lBRUEsSUFBSU4sS0FBSyxJQUFJQyxTQUFTLEVBQUU7TUFDcEJDLElBQUksQ0FBQ08sTUFBTSxHQUFHO1FBQ1ZDLG1CQUFtQixFQUFFVixLQUFLO1FBQzFCVyxVQUFVLEVBQ05WLFNBQVMsS0FDUixNQUFNWCxnQ0FBZSxDQUFDRyxPQUFPLENBQUMsQ0FBQyxDQUFDbUIsZ0NBQWdDLENBQUMsMkJBQTJCLENBQUMsQ0FBQyxHQUN6RkMsS0FBSyxDQUFDQyxJQUFJLENBQWtCYixTQUFTLENBQUMsR0FDdEMxQjtNQUNkLENBQUM7SUFDTDtJQUVBUyxXQUFXLENBQUNrQixJQUFJLENBQUM7SUFDakJyQixVQUFVLENBQUMsSUFBSSxDQUFDO0lBQ2hCRSxRQUFRLENBQUNSLFNBQVMsQ0FBQztJQUNuQixJQUFJO01BQ0EsTUFBTTtRQUFFd0M7TUFBTSxDQUFDLEdBQUcsTUFBTXpCLGdDQUFlLENBQUNHLE9BQU8sQ0FBQyxDQUFDLENBQUN2QixXQUFXLENBQUNnQyxJQUFJLENBQUM7TUFDbkVqQixZQUFZLENBQUNpQixJQUFJLEVBQUVmLG1CQUFtQixHQUFHNEIsS0FBSyxHQUFHQSxLQUFLLENBQUNOLE1BQU0sQ0FBQzlDLGVBQWUsQ0FBQyxDQUFDO01BQy9FLE9BQU8sSUFBSTtJQUNmLENBQUMsQ0FBQyxPQUFPcUQsQ0FBQyxFQUFFO01BQ1JqQyxRQUFRLENBQUNpQyxDQUFDLFlBQVlwQixLQUFLLEdBQUdvQixDQUFDLEdBQUcsSUFBSSxDQUFDO01BQ3ZDQyxPQUFPLENBQUNuQyxLQUFLLENBQUMseUNBQXlDLEVBQUVvQixJQUFJLEVBQUVjLENBQUMsQ0FBQztNQUNqRS9CLFlBQVksQ0FBQ2lCLElBQUksRUFBRSxFQUFFLENBQUM7TUFDdEIsT0FBTyxLQUFLO0lBQ2hCLENBQUMsU0FBUztNQUNOckIsVUFBVSxDQUFDLEtBQUssQ0FBQztJQUNyQjtFQUNKLENBQUMsRUFDRCxDQUFDUixNQUFNLEVBQUVXLFdBQVcsRUFBRUMsWUFBWSxFQUFFRSxtQkFBbUIsQ0FDM0QsQ0FBQztFQUVELElBQUErQixnQkFBUyxFQUFDLE1BQU07SUFDWjdCLGFBQWEsQ0FBQyxDQUFDO0VBQ25CLENBQUMsRUFBRSxFQUFFLENBQUM7RUFFTixJQUFBNkIsZ0JBQVMsRUFBQyxNQUFNO0lBQ1osSUFBSTFDLFNBQVMsS0FBSyxJQUFJLEVBQUU7TUFDcEI7SUFDSjtJQUVBLE1BQU0yQyxZQUFZLEdBQUc3QixnQ0FBZSxDQUFDRyxPQUFPLENBQUMsQ0FBQyxDQUFDVyxTQUFTLENBQUMsQ0FBRTtJQUMzRCxNQUFNZ0IsWUFBWSxHQUFHQyxZQUFZLENBQUNDLE9BQU8sQ0FBQy9ELGVBQWUsQ0FBQztJQUMxRCxNQUFNZ0UsWUFBZ0MsR0FBR0YsWUFBWSxDQUFDQyxPQUFPLENBQUM5RCxpQkFBaUIsQ0FBQyxJQUFJZSxTQUFTO0lBRTdGLElBQUk0QixVQUFrQixHQUFHZ0IsWUFBWTtJQUNyQyxJQUNJQyxZQUFZLEtBQ1hJLGtCQUFTLENBQUNDLFNBQVMsQ0FBQyxnQkFBZ0IsQ0FBQyxFQUFFbEMsR0FBRyxDQUFDLFNBQVMsQ0FBQyxFQUFFeEIsUUFBUSxDQUFDcUQsWUFBWSxDQUFDLElBQzFFTSxzQkFBYSxDQUFDQyxRQUFRLENBQUMsd0JBQXdCLENBQUMsRUFBRTVELFFBQVEsQ0FBQ3FELFlBQVksQ0FBQyxDQUFDLEVBQy9FO01BQ0VqQixVQUFVLEdBQUdpQixZQUFhO0lBQzlCO0lBRUEsSUFBSWQsVUFBOEIsR0FBRy9CLFNBQVM7SUFDOUMsSUFDSTRCLFVBQVUsS0FBS2dCLFlBQVksS0FDMUJJLFlBQVksS0FBS2xFLFNBQVMsSUFDdkJ1RSxNQUFNLENBQUNDLE1BQU0sQ0FBQ3JELFNBQVMsQ0FBQyxDQUFDc0QsSUFBSSxDQUFFQyxDQUFZLElBQUs7TUFDNUNBLENBQUMsQ0FBQ0MsU0FBUyxDQUFDRixJQUFJLENBQUVHLENBQUMsSUFBS0EsQ0FBQyxDQUFDQyxXQUFXLEtBQUtYLFlBQVksQ0FBQztJQUMzRCxDQUFDLENBQUMsQ0FBQyxFQUNUO01BQ0VqQixVQUFVLEdBQUdpQixZQUFZO0lBQzdCO0lBRUE1QyxRQUFRLENBQUMsSUFBSSxDQUFDO0lBQ2RMLGlCQUFpQixDQUFDO01BQUU2QixVQUFVO01BQUVHO0lBQVcsQ0FBQyxDQUFDO0VBQ2pELENBQUMsRUFBRSxDQUFDOUIsU0FBUyxDQUFDLENBQUM7RUFFZixJQUFBMEMsZ0JBQVMsRUFBQyxNQUFNO0lBQ1osSUFBSSxDQUFDN0MsTUFBTSxFQUFFO0lBQ2JnRCxZQUFZLENBQUNjLE9BQU8sQ0FBQzVFLGVBQWUsRUFBRWMsTUFBTSxDQUFDOEIsVUFBVSxDQUFDO0lBQ3hELElBQUk5QixNQUFNLENBQUNpQyxVQUFVLEVBQUU7TUFDbkJlLFlBQVksQ0FBQ2MsT0FBTyxDQUFDM0UsaUJBQWlCLEVBQUVhLE1BQU0sQ0FBQ2lDLFVBQVUsQ0FBQztJQUM5RCxDQUFDLE1BQU07TUFDSGUsWUFBWSxDQUFDZSxVQUFVLENBQUM1RSxpQkFBaUIsQ0FBQztJQUM5QztFQUNKLENBQUMsRUFBRSxDQUFDYSxNQUFNLENBQUMsQ0FBQztFQUVaLE9BQU87SUFDSEssS0FBSztJQUNMRSxPQUFPO0lBQ1BWLFdBQVc7SUFDWE0sU0FBUztJQUNUSCxNQUFNO0lBQ053QixNQUFNO0lBQ05GLFNBQVM7SUFDVGI7RUFDSixDQUFDO0FBQ0wsQ0FBQztBQUFDeEIsT0FBQSxDQUFBVyxzQkFBQSxHQUFBQSxzQkFBQSIsImlnbm9yZUxpc3QiOltdfQ==