UNPKG

matrix-react-sdk

Version:
651 lines (545 loc) 84.2 kB
"use strict"; var _interopRequireWildcard = require("@babel/runtime/helpers/interopRequireWildcard"); var _interopRequireDefault = require("@babel/runtime/helpers/interopRequireDefault"); Object.defineProperty(exports, "__esModule", { value: true }); exports.default = exports.SpaceHierarchy = exports.useSpaceSummary = exports.HierarchyLevel = exports.showRoom = void 0; var _defineProperty2 = _interopRequireDefault(require("@babel/runtime/helpers/defineProperty")); var _extends2 = _interopRequireDefault(require("@babel/runtime/helpers/extends")); var _react = _interopRequireWildcard(require("react")); var _event = require("matrix-js-sdk/src/@types/event"); var _classnames = _interopRequireDefault(require("classnames")); var _lodash = require("lodash"); var _MatrixClientPeg = require("../../MatrixClientPeg"); var _dispatcher = _interopRequireDefault(require("../../dispatcher/dispatcher")); var _languageHandler = require("../../languageHandler"); var _AccessibleButton = _interopRequireDefault(require("../views/elements/AccessibleButton")); var _BaseDialog = _interopRequireDefault(require("../views/dialogs/BaseDialog")); var _Spinner = _interopRequireDefault(require("../views/elements/Spinner")); var _SearchBox = _interopRequireDefault(require("./SearchBox")); var _RoomAvatar = _interopRequireDefault(require("../views/avatars/RoomAvatar")); var _RoomName = _interopRequireDefault(require("../views/elements/RoomName")); var _useAsyncMemo = require("../../hooks/useAsyncMemo"); var _maps = require("../../utils/maps"); var _StyledCheckbox = _interopRequireDefault(require("../views/elements/StyledCheckbox")); var _AutoHideScrollbar = _interopRequireDefault(require("./AutoHideScrollbar")); var _BaseAvatar = _interopRequireDefault(require("../views/avatars/BaseAvatar")); var _Media = require("../../customisations/Media"); var _InfoTooltip = _interopRequireDefault(require("../views/elements/InfoTooltip")); var _TextWithTooltip = _interopRequireDefault(require("../views/elements/TextWithTooltip")); var _useStateToggle = require("../../hooks/useStateToggle"); var _SpaceStore = require("../../stores/SpaceStore"); var _AccessibleTooltipButton = _interopRequireDefault(require("../views/elements/AccessibleTooltipButton")); var _HtmlUtils = require("../../HtmlUtils"); function ownKeys(object, enumerableOnly) { var keys = Object.keys(object); if (Object.getOwnPropertySymbols) { var symbols = Object.getOwnPropertySymbols(object); if (enumerableOnly) symbols = symbols.filter(function (sym) { return Object.getOwnPropertyDescriptor(object, sym).enumerable; }); keys.push.apply(keys, symbols); } return keys; } function _objectSpread(target) { for (var i = 1; i < arguments.length; i++) { var source = arguments[i] != null ? arguments[i] : {}; if (i % 2) { ownKeys(Object(source), true).forEach(function (key) { (0, _defineProperty2.default)(target, key, source[key]); }); } else if (Object.getOwnPropertyDescriptors) { Object.defineProperties(target, Object.getOwnPropertyDescriptors(source)); } else { ownKeys(Object(source)).forEach(function (key) { Object.defineProperty(target, key, Object.getOwnPropertyDescriptor(source, key)); }); } } return target; } const Tile /*: React.FC<ITileProps>*/ = ({ room, suggested, selected, hasPermissions, onToggleClick, onViewRoomClick, numChildRooms, children }) => { const name = room.name || room.canonical_alias || room.aliases?.[0] || (room.room_type === _event.RoomType.Space ? (0, _languageHandler._t)("Unnamed Space") : (0, _languageHandler._t)("Unnamed Room")); const [showChildren, toggleShowChildren] = (0, _useStateToggle.useStateToggle)(true); const cli = _MatrixClientPeg.MatrixClientPeg.get(); const cliRoom = cli.getRoom(room.room_id); const myMembership = cliRoom?.getMyMembership(); const onPreviewClick = (ev /*: ButtonEvent*/ ) => { ev.preventDefault(); ev.stopPropagation(); onViewRoomClick(false); }; const onJoinClick = (ev /*: ButtonEvent*/ ) => { ev.preventDefault(); ev.stopPropagation(); onViewRoomClick(true); }; let button; if (myMembership === "join") { button = /*#__PURE__*/_react.default.createElement(_AccessibleButton.default, { onClick: onPreviewClick, kind: "primary_outline" }, (0, _languageHandler._t)("View")); } else if (onJoinClick) { button = /*#__PURE__*/_react.default.createElement(_AccessibleButton.default, { onClick: onJoinClick, kind: "primary" }, (0, _languageHandler._t)("Join")); } let checkbox; if (onToggleClick) { if (hasPermissions) { checkbox = /*#__PURE__*/_react.default.createElement(_StyledCheckbox.default, { checked: !!selected, onChange: onToggleClick }); } else { checkbox = /*#__PURE__*/_react.default.createElement(_TextWithTooltip.default, { tooltip: (0, _languageHandler._t)("You don't have permission"), onClick: ev => { ev.stopPropagation(); } }, /*#__PURE__*/_react.default.createElement(_StyledCheckbox.default, { disabled: true })); } } let url /*: string*/ ; if (room.avatar_url) { url = (0, _Media.mediaFromMxc)(room.avatar_url).getSquareThumbnailHttp(20); } let description = (0, _languageHandler._t)("%(count)s members", { count: room.num_joined_members }); if (numChildRooms) { description += " · " + (0, _languageHandler._t)("%(count)s rooms", { count: numChildRooms }); } if (room.topic) { description += " · " + room.topic; } let suggestedSection; if (suggested) { suggestedSection = /*#__PURE__*/_react.default.createElement(_InfoTooltip.default, { tooltip: (0, _languageHandler._t)("This room is suggested as a good one to join") }, (0, _languageHandler._t)("Suggested")); } const content = /*#__PURE__*/_react.default.createElement(_react.default.Fragment, null, /*#__PURE__*/_react.default.createElement(_BaseAvatar.default, { name: name, idName: room.room_id, url: url, width: 20, height: 20 }), /*#__PURE__*/_react.default.createElement("div", { className: "mx_SpaceRoomDirectory_roomTile_name" }, name, suggestedSection), /*#__PURE__*/_react.default.createElement("div", { className: "mx_SpaceRoomDirectory_roomTile_info", ref: e => e && (0, _HtmlUtils.linkifyElement)(e), onClick: ev => { // prevent clicks on links from bubbling up to the room tile if (ev.target.tagName === "A") { ev.stopPropagation(); } } }, description), /*#__PURE__*/_react.default.createElement("div", { className: "mx_SpaceRoomDirectory_actions" }, button, checkbox)); let childToggle; let childSection; if (children) { // the chevron is purposefully a div rather than a button as it should be ignored for a11y childToggle = /*#__PURE__*/_react.default.createElement("div", { className: (0, _classnames.default)("mx_SpaceRoomDirectory_subspace_toggle", { mx_SpaceRoomDirectory_subspace_toggle_shown: showChildren }), onClick: ev => { ev.stopPropagation(); toggleShowChildren(); } }); if (showChildren) { childSection = /*#__PURE__*/_react.default.createElement("div", { className: "mx_SpaceRoomDirectory_subspace_children" }, children); } } return /*#__PURE__*/_react.default.createElement(_react.default.Fragment, null, /*#__PURE__*/_react.default.createElement(_AccessibleButton.default, { className: (0, _classnames.default)("mx_SpaceRoomDirectory_roomTile", { mx_SpaceRoomDirectory_subspace: room.room_type === _event.RoomType.Space }), onClick: hasPermissions && onToggleClick ? onToggleClick : onPreviewClick }, content, childToggle), childSection); }; const showRoom = (room /*: ISpaceSummaryRoom*/ , viaServers /*: string[]*/ , autoJoin = false) => { // Don't let the user view a room they won't be able to either peek or join: // fail earlier so they don't have to click back to the directory. if (_MatrixClientPeg.MatrixClientPeg.get().isGuest()) { if (!room.world_readable && !room.guest_can_join) { _dispatcher.default.dispatch({ action: "require_registration" }); return; } } const roomAlias = getDisplayAliasForRoom(room) || undefined; _dispatcher.default.dispatch({ action: "view_room", auto_join: autoJoin, should_peek: true, _type: "room_directory", // instrumentation room_alias: roomAlias, room_id: room.room_id, via_servers: viaServers, oob_data: { avatarUrl: room.avatar_url, // XXX: This logic is duplicated from the JS SDK which would normally decide what the name is. name: room.name || roomAlias || (0, _languageHandler._t)("Unnamed room") } }); }; exports.showRoom = showRoom; const HierarchyLevel = ({ spaceId, rooms, relations, parents, selectedMap, onViewRoomClick, onToggleClick } /*: IHierarchyLevelProps*/ ) => { const cli = _MatrixClientPeg.MatrixClientPeg.get(); const space = cli.getRoom(spaceId); const hasPermissions = space?.currentState.maySendStateEvent(_event.EventType.SpaceChild, cli.getUserId()); const children = Array.from(relations.get(spaceId)?.values() || []); const sortedChildren = (0, _lodash.sortBy)(children, ev => { // XXX: Space Summary API doesn't give the child origin_server_ts but once it does we should use it for sorting return (0, _SpaceStore.getOrder)(ev.content.order, null, ev.state_key); }); const [subspaces, childRooms] = sortedChildren.reduce((result, ev /*: ISpaceSummaryEvent*/ ) => { const roomId = ev.state_key; if (!rooms.has(roomId)) return result; result[rooms.get(roomId).room_type === _event.RoomType.Space ? 0 : 1].push(roomId); return result; }, [[], []]) || [[], []]; const newParents = new Set(parents).add(spaceId); return /*#__PURE__*/_react.default.createElement(_react.default.Fragment, null, childRooms.map(roomId => /*#__PURE__*/_react.default.createElement(Tile, { key: roomId, room: rooms.get(roomId), suggested: relations.get(spaceId)?.get(roomId)?.content.suggested, selected: selectedMap?.get(spaceId)?.has(roomId), onViewRoomClick: autoJoin => { onViewRoomClick(roomId, autoJoin); }, hasPermissions: hasPermissions, onToggleClick: onToggleClick ? () => onToggleClick(spaceId, roomId) : undefined })), subspaces.filter(roomId => !newParents.has(roomId)).map(roomId => /*#__PURE__*/_react.default.createElement(Tile, { key: roomId, room: rooms.get(roomId), numChildRooms: Array.from(relations.get(roomId)?.values() || []).filter(ev => rooms.get(ev.state_key)?.room_type !== _event.RoomType.Space).length, suggested: relations.get(spaceId)?.get(roomId)?.content.suggested, selected: selectedMap?.get(spaceId)?.has(roomId), onViewRoomClick: autoJoin => { onViewRoomClick(roomId, autoJoin); }, hasPermissions: hasPermissions, onToggleClick: onToggleClick ? () => onToggleClick(spaceId, roomId) : undefined }, /*#__PURE__*/_react.default.createElement(HierarchyLevel, { spaceId: roomId, rooms: rooms, relations: relations, parents: newParents, selectedMap: selectedMap, onViewRoomClick: onViewRoomClick, onToggleClick: onToggleClick })))); }; // mutate argument refreshToken to force a reload exports.HierarchyLevel = HierarchyLevel; const useSpaceSummary = (cli /*: MatrixClient*/ , space /*: Room*/ , refreshToken /*: any*/ ) => /*: [ null, ISpaceSummaryRoom[], Map<string, Map<string, ISpaceSummaryEvent>>?, Map<string, Set<string>>?, Map<string, Set<string>>?, ] | [Error]*/ { // TODO pagination return (0, _useAsyncMemo.useAsyncMemo)(async () => { try { const data = await cli.getSpaceSummary(space.roomId); const parentChildRelations = new _maps.EnhancedMap(); const childParentRelations = new _maps.EnhancedMap(); const viaMap = new _maps.EnhancedMap(); data.events.map((ev /*: ISpaceSummaryEvent*/ ) => { if (ev.type === _event.EventType.SpaceChild) { parentChildRelations.getOrCreate(ev.room_id, new Map()).set(ev.state_key, ev); childParentRelations.getOrCreate(ev.state_key, new Set()).add(ev.room_id); } if (Array.isArray(ev.content["via"])) { const set = viaMap.getOrCreate(ev.state_key, new Set()); ev.content["via"].forEach(via => set.add(via)); } }); return [null, data.rooms, parentChildRelations, viaMap, childParentRelations]; } catch (e) { console.error(e); // TODO return [e]; } }, [space, refreshToken], [undefined]); }; exports.useSpaceSummary = useSpaceSummary; const SpaceHierarchy /*: React.FC<IHierarchyProps>*/ = ({ space, initialText = "", showRoom, refreshToken, additionalButtons, children }) => { const cli = _MatrixClientPeg.MatrixClientPeg.get(); const userId = cli.getUserId(); const [query, setQuery] = (0, _react.useState)(initialText); const [selected, setSelected] = (0, _react.useState)(new Map()); // Map<parentId, Set<childId>> const [summaryError, rooms, parentChildMap, viaMap, childParentMap] = useSpaceSummary(cli, space, refreshToken); const roomsMap = (0, _react.useMemo)(() => { if (!rooms) return null; const lcQuery = query.toLowerCase().trim(); const roomsMap = new Map(rooms.map(r => [r.room_id, r])); if (!lcQuery) return roomsMap; const directMatches = rooms.filter(r => { return r.name?.toLowerCase().includes(lcQuery) || r.topic?.toLowerCase().includes(lcQuery); }); // Walk back up the tree to find all parents of the direct matches to show their place in the hierarchy const visited = new Set(); const queue = [...directMatches.map(r => r.room_id)]; while (queue.length) { const roomId = queue.pop(); visited.add(roomId); childParentMap.get(roomId)?.forEach(parentId => { if (!visited.has(parentId)) { queue.push(parentId); } }); } // Remove any mappings for rooms which were not visited in the walk Array.from(roomsMap.keys()).forEach(roomId => { if (!visited.has(roomId)) { roomsMap.delete(roomId); } }); return roomsMap; }, [rooms, childParentMap, query]); const [error, setError] = (0, _react.useState)(""); const [removing, setRemoving] = (0, _react.useState)(false); const [saving, setSaving] = (0, _react.useState)(false); if (summaryError) { return /*#__PURE__*/_react.default.createElement("p", null, (0, _languageHandler._t)("Your server does not support showing space hierarchies.")); } let content; if (roomsMap) { const numRooms = Array.from(roomsMap.values()).filter(r => r.room_type !== _event.RoomType.Space).length; const numSpaces = roomsMap.size - numRooms - 1; // -1 at the end to exclude the space we are looking at let countsStr; if (numSpaces > 1) { countsStr = (0, _languageHandler._t)("%(count)s rooms and %(numSpaces)s spaces", { count: numRooms, numSpaces }); } else if (numSpaces > 0) { countsStr = (0, _languageHandler._t)("%(count)s rooms and 1 space", { count: numRooms, numSpaces }); } else { countsStr = (0, _languageHandler._t)("%(count)s rooms", { count: numRooms, numSpaces }); } let manageButtons; if (space.getMyMembership() === "join" && space.currentState.maySendStateEvent(_event.EventType.SpaceChild, userId)) { const selectedRelations = Array.from(selected.keys()).flatMap(parentId => { return [...selected.get(parentId).values()].map(childId => [parentId, childId]); }); const selectionAllSuggested = selectedRelations.every(([parentId, childId]) => { return parentChildMap.get(parentId)?.get(childId)?.content.suggested; }); const disabled = !selectedRelations.length || removing || saving; let Button /*: React.ComponentType<React.ComponentProps<typeof AccessibleButton>>*/ = _AccessibleButton.default; let props = {}; if (!selectedRelations.length) { Button = _AccessibleTooltipButton.default; props = { tooltip: (0, _languageHandler._t)("Select a room below first"), yOffset: -40 }; } manageButtons = /*#__PURE__*/_react.default.createElement(_react.default.Fragment, null, /*#__PURE__*/_react.default.createElement(Button, (0, _extends2.default)({}, props, { onClick: async () => { setRemoving(true); try { for (const [parentId, childId] of selectedRelations) { await cli.sendStateEvent(parentId, _event.EventType.SpaceChild, {}, childId); parentChildMap.get(parentId).delete(childId); if (parentChildMap.get(parentId).size > 0) { parentChildMap.set(parentId, new Map(parentChildMap.get(parentId))); } else { parentChildMap.delete(parentId); } } } catch (e) { setError((0, _languageHandler._t)("Failed to remove some rooms. Try again later")); } setRemoving(false); }, kind: "danger_outline", disabled: disabled }), removing ? (0, _languageHandler._t)("Removing...") : (0, _languageHandler._t)("Remove")), /*#__PURE__*/_react.default.createElement(Button, (0, _extends2.default)({}, props, { onClick: async () => { setSaving(true); try { for (const [parentId, childId] of selectedRelations) { const suggested = !selectionAllSuggested; const existingContent = parentChildMap.get(parentId)?.get(childId)?.content; if (!existingContent || existingContent.suggested === suggested) continue; const content = _objectSpread(_objectSpread({}, existingContent), {}, { suggested: !selectionAllSuggested }); await cli.sendStateEvent(parentId, _event.EventType.SpaceChild, content, childId); parentChildMap.get(parentId).get(childId).content = content; parentChildMap.set(parentId, new Map(parentChildMap.get(parentId))); } } catch (e) { setError("Failed to update some suggestions. Try again later"); } setSaving(false); }, kind: "primary_outline", disabled: disabled }), saving ? (0, _languageHandler._t)("Saving...") : selectionAllSuggested ? (0, _languageHandler._t)("Mark as not suggested") : (0, _languageHandler._t)("Mark as suggested"))); } let results; if (roomsMap.size) { const hasPermissions = space?.currentState.maySendStateEvent(_event.EventType.SpaceChild, cli.getUserId()); results = /*#__PURE__*/_react.default.createElement(_react.default.Fragment, null, /*#__PURE__*/_react.default.createElement(HierarchyLevel, { spaceId: space.roomId, rooms: roomsMap, relations: parentChildMap, parents: new Set(), selectedMap: selected, onToggleClick: hasPermissions ? (parentId, childId) => { setError(""); if (!selected.has(parentId)) { setSelected(new Map(selected.set(parentId, new Set([childId])))); return; } const parentSet = selected.get(parentId); if (!parentSet.has(childId)) { setSelected(new Map(selected.set(parentId, new Set([...parentSet, childId])))); return; } parentSet.delete(childId); setSelected(new Map(selected.set(parentId, new Set(parentSet)))); } : undefined, onViewRoomClick: (roomId, autoJoin) => { showRoom(roomsMap.get(roomId), Array.from(viaMap.get(roomId) || []), autoJoin); } }), children && /*#__PURE__*/_react.default.createElement("hr", null)); } else { results = /*#__PURE__*/_react.default.createElement("div", { className: "mx_SpaceRoomDirectory_noResults" }, /*#__PURE__*/_react.default.createElement("h3", null, (0, _languageHandler._t)("No results found")), /*#__PURE__*/_react.default.createElement("div", null, (0, _languageHandler._t)("You may want to try a different search or check for typos."))); } content = /*#__PURE__*/_react.default.createElement(_react.default.Fragment, null, /*#__PURE__*/_react.default.createElement("div", { className: "mx_SpaceRoomDirectory_listHeader" }, countsStr, /*#__PURE__*/_react.default.createElement("span", null, additionalButtons, manageButtons)), error && /*#__PURE__*/_react.default.createElement("div", { className: "mx_SpaceRoomDirectory_error" }, error), /*#__PURE__*/_react.default.createElement(_AutoHideScrollbar.default, { className: "mx_SpaceRoomDirectory_list" }, results, children)); } else { content = /*#__PURE__*/_react.default.createElement(_Spinner.default, null); } // TODO loading state/error state return /*#__PURE__*/_react.default.createElement(_react.default.Fragment, null, /*#__PURE__*/_react.default.createElement(_SearchBox.default, { className: "mx_textinput_icon mx_textinput_search", placeholder: (0, _languageHandler._t)("Search names and descriptions"), onSearch: setQuery, autoFocus: true, initialValue: initialText }), content); }; exports.SpaceHierarchy = SpaceHierarchy; const SpaceRoomDirectory /*: React.FC<IProps>*/ = ({ space, onFinished, initialText }) => { const onCreateRoomClick = () => { _dispatcher.default.dispatch({ action: 'view_create_room', public: true }); onFinished(); }; const title = /*#__PURE__*/_react.default.createElement(_react.default.Fragment, null, /*#__PURE__*/_react.default.createElement(_RoomAvatar.default, { room: space, height: 32, width: 32 }), /*#__PURE__*/_react.default.createElement("div", null, /*#__PURE__*/_react.default.createElement("h1", null, (0, _languageHandler._t)("Explore rooms")), /*#__PURE__*/_react.default.createElement("div", null, /*#__PURE__*/_react.default.createElement(_RoomName.default, { room: space })))); return /*#__PURE__*/_react.default.createElement(_BaseDialog.default, { className: "mx_SpaceRoomDirectory", hasCancel: true, onFinished: onFinished, title: title }, /*#__PURE__*/_react.default.createElement("div", { className: "mx_Dialog_content" }, (0, _languageHandler._t)("If you can't find the room you're looking for, ask for an invite or <a>create a new room</a>.", null, { a: sub => { return /*#__PURE__*/_react.default.createElement(_AccessibleButton.default, { kind: "link", onClick: onCreateRoomClick }, sub); } }), /*#__PURE__*/_react.default.createElement(SpaceHierarchy, { space: space, showRoom: (room /*: ISpaceSummaryRoom*/ , viaServers /*: string[]*/ , autoJoin = false) => { showRoom(room, viaServers, autoJoin); onFinished(); }, initialText: initialText }, /*#__PURE__*/_react.default.createElement(_AccessibleButton.default, { onClick: onCreateRoomClick, kind: "primary", className: "mx_SpaceRoomDirectory_createRoom" }, (0, _languageHandler._t)("Create room"))))); }; var _default = SpaceRoomDirectory; // Similar to matrix-react-sdk's MatrixTools.getDisplayAliasForRoom // but works with the objects we get from the public room list exports.default = _default; function getDisplayAliasForRoom(room /*: ISpaceSummaryRoom*/ ) { return room.canonical_alias || (room.aliases ? room.aliases[0] : ""); } //# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIi4uLy4uLy4uL3NyYy9jb21wb25lbnRzL3N0cnVjdHVyZXMvU3BhY2VSb29tRGlyZWN0b3J5LnRzeCJdLCJuYW1lcyI6WyJUaWxlIiwicm9vbSIsInN1Z2dlc3RlZCIsInNlbGVjdGVkIiwiaGFzUGVybWlzc2lvbnMiLCJvblRvZ2dsZUNsaWNrIiwib25WaWV3Um9vbUNsaWNrIiwibnVtQ2hpbGRSb29tcyIsImNoaWxkcmVuIiwibmFtZSIsImNhbm9uaWNhbF9hbGlhcyIsImFsaWFzZXMiLCJyb29tX3R5cGUiLCJSb29tVHlwZSIsIlNwYWNlIiwic2hvd0NoaWxkcmVuIiwidG9nZ2xlU2hvd0NoaWxkcmVuIiwiY2xpIiwiTWF0cml4Q2xpZW50UGVnIiwiZ2V0IiwiY2xpUm9vbSIsImdldFJvb20iLCJyb29tX2lkIiwibXlNZW1iZXJzaGlwIiwiZ2V0TXlNZW1iZXJzaGlwIiwib25QcmV2aWV3Q2xpY2siLCJldiIsInByZXZlbnREZWZhdWx0Iiwic3RvcFByb3BhZ2F0aW9uIiwib25Kb2luQ2xpY2siLCJidXR0b24iLCJjaGVja2JveCIsInVybCIsImF2YXRhcl91cmwiLCJnZXRTcXVhcmVUaHVtYm5haWxIdHRwIiwiZGVzY3JpcHRpb24iLCJjb3VudCIsIm51bV9qb2luZWRfbWVtYmVycyIsInRvcGljIiwic3VnZ2VzdGVkU2VjdGlvbiIsImNvbnRlbnQiLCJlIiwidGFyZ2V0IiwidGFnTmFtZSIsImNoaWxkVG9nZ2xlIiwiY2hpbGRTZWN0aW9uIiwibXhfU3BhY2VSb29tRGlyZWN0b3J5X3N1YnNwYWNlX3RvZ2dsZV9zaG93biIsIm14X1NwYWNlUm9vbURpcmVjdG9yeV9zdWJzcGFjZSIsInNob3dSb29tIiwidmlhU2VydmVycyIsImF1dG9Kb2luIiwiaXNHdWVzdCIsIndvcmxkX3JlYWRhYmxlIiwiZ3Vlc3RfY2FuX2pvaW4iLCJkaXMiLCJkaXNwYXRjaCIsImFjdGlvbiIsInJvb21BbGlhcyIsImdldERpc3BsYXlBbGlhc0ZvclJvb20iLCJ1bmRlZmluZWQiLCJhdXRvX2pvaW4iLCJzaG91bGRfcGVlayIsIl90eXBlIiwicm9vbV9hbGlhcyIsInZpYV9zZXJ2ZXJzIiwib29iX2RhdGEiLCJhdmF0YXJVcmwiLCJIaWVyYXJjaHlMZXZlbCIsInNwYWNlSWQiLCJyb29tcyIsInJlbGF0aW9ucyIsInBhcmVudHMiLCJzZWxlY3RlZE1hcCIsInNwYWNlIiwiY3VycmVudFN0YXRlIiwibWF5U2VuZFN0YXRlRXZlbnQiLCJFdmVudFR5cGUiLCJTcGFjZUNoaWxkIiwiZ2V0VXNlcklkIiwiQXJyYXkiLCJmcm9tIiwidmFsdWVzIiwic29ydGVkQ2hpbGRyZW4iLCJvcmRlciIsInN0YXRlX2tleSIsInN1YnNwYWNlcyIsImNoaWxkUm9vbXMiLCJyZWR1Y2UiLCJyZXN1bHQiLCJyb29tSWQiLCJoYXMiLCJwdXNoIiwibmV3UGFyZW50cyIsIlNldCIsImFkZCIsIm1hcCIsImZpbHRlciIsImxlbmd0aCIsInVzZVNwYWNlU3VtbWFyeSIsInJlZnJlc2hUb2tlbiIsImRhdGEiLCJnZXRTcGFjZVN1bW1hcnkiLCJwYXJlbnRDaGlsZFJlbGF0aW9ucyIsIkVuaGFuY2VkTWFwIiwiY2hpbGRQYXJlbnRSZWxhdGlvbnMiLCJ2aWFNYXAiLCJldmVudHMiLCJ0eXBlIiwiZ2V0T3JDcmVhdGUiLCJNYXAiLCJzZXQiLCJpc0FycmF5IiwiZm9yRWFjaCIsInZpYSIsImNvbnNvbGUiLCJlcnJvciIsIlNwYWNlSGllcmFyY2h5IiwiaW5pdGlhbFRleHQiLCJhZGRpdGlvbmFsQnV0dG9ucyIsInVzZXJJZCIsInF1ZXJ5Iiwic2V0UXVlcnkiLCJzZXRTZWxlY3RlZCIsInN1bW1hcnlFcnJvciIsInBhcmVudENoaWxkTWFwIiwiY2hpbGRQYXJlbnRNYXAiLCJyb29tc01hcCIsImxjUXVlcnkiLCJ0b0xvd2VyQ2FzZSIsInRyaW0iLCJyIiwiZGlyZWN0TWF0Y2hlcyIsImluY2x1ZGVzIiwidmlzaXRlZCIsInF1ZXVlIiwicG9wIiwicGFyZW50SWQiLCJrZXlzIiwiZGVsZXRlIiwic2V0RXJyb3IiLCJyZW1vdmluZyIsInNldFJlbW92aW5nIiwic2F2aW5nIiwic2V0U2F2aW5nIiwibnVtUm9vbXMiLCJudW1TcGFjZXMiLCJzaXplIiwiY291bnRzU3RyIiwibWFuYWdlQnV0dG9ucyIsInNlbGVjdGVkUmVsYXRpb25zIiwiZmxhdE1hcCIsImNoaWxkSWQiLCJzZWxlY3Rpb25BbGxTdWdnZXN0ZWQiLCJldmVyeSIsImRpc2FibGVkIiwiQnV0dG9uIiwiQWNjZXNzaWJsZUJ1dHRvbiIsInByb3BzIiwiQWNjZXNzaWJsZVRvb2x0aXBCdXR0b24iLCJ0b29sdGlwIiwieU9mZnNldCIsInNlbmRTdGF0ZUV2ZW50IiwiZXhpc3RpbmdDb250ZW50IiwicmVzdWx0cyIsInBhcmVudFNldCIsIlNwYWNlUm9vbURpcmVjdG9yeSIsIm9uRmluaXNoZWQiLCJvbkNyZWF0ZVJvb21DbGljayIsInB1YmxpYyIsInRpdGxlIiwiYSIsInN1YiJdLCJtYXBwaW5ncyI6Ijs7Ozs7Ozs7Ozs7Ozs7O0FBZ0JBOztBQUdBOztBQUNBOztBQUNBOztBQUVBOztBQUNBOztBQUNBOztBQUNBOztBQUNBOztBQUNBOztBQUNBOztBQUNBOztBQUNBOztBQUNBOztBQUNBOztBQUNBOztBQUNBOztBQUNBOztBQUNBOztBQUNBOztBQUNBOztBQUNBOztBQUNBOztBQUNBOztBQUNBOzs7Ozs7QUFrREEsTUFBTUE7QUFBMEI7QUFBQSxFQUFHLENBQUM7QUFDaENDLEVBQUFBLElBRGdDO0FBRWhDQyxFQUFBQSxTQUZnQztBQUdoQ0MsRUFBQUEsUUFIZ0M7QUFJaENDLEVBQUFBLGNBSmdDO0FBS2hDQyxFQUFBQSxhQUxnQztBQU1oQ0MsRUFBQUEsZUFOZ0M7QUFPaENDLEVBQUFBLGFBUGdDO0FBUWhDQyxFQUFBQTtBQVJnQyxDQUFELEtBUzdCO0FBQ0YsUUFBTUMsSUFBSSxHQUFHUixJQUFJLENBQUNRLElBQUwsSUFBYVIsSUFBSSxDQUFDUyxlQUFsQixJQUFxQ1QsSUFBSSxDQUFDVSxPQUFMLEdBQWUsQ0FBZixDQUFyQyxLQUNMVixJQUFJ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