matrix-react-sdk
Version:
SDK for matrix.org using React
636 lines (542 loc) • 85.4 kB
JavaScript
"use strict";
var _interopRequireDefault = require("@babel/runtime/helpers/interopRequireDefault");
var _interopRequireWildcard = require("@babel/runtime/helpers/interopRequireWildcard");
Object.defineProperty(exports, "__esModule", {
value: true
});
exports.default = void 0;
var _defineProperty2 = _interopRequireDefault(require("@babel/runtime/helpers/defineProperty"));
var _react = _interopRequireDefault(require("react"));
var _event = require("matrix-js-sdk/src/@types/event");
var _languageHandler = require("../../../languageHandler");
var _RovingTabIndex = require("../../../accessibility/RovingTabIndex");
var _RoomListStore = _interopRequireWildcard(require("../../../stores/room-list/RoomListStore"));
var _RoomViewStore = _interopRequireDefault(require("../../../stores/RoomViewStore"));
var _models = require("../../../stores/room-list/models");
var _dispatcher = _interopRequireDefault(require("../../../dispatcher/dispatcher"));
var _RoomSublist = _interopRequireDefault(require("./RoomSublist"));
var _MatrixClientPeg = require("../../../MatrixClientPeg");
var _GroupAvatar = _interopRequireDefault(require("../avatars/GroupAvatar"));
var _ExtraTile = _interopRequireDefault(require("./ExtraTile"));
var _StaticNotificationState = require("../../../stores/notifications/StaticNotificationState");
var _actions = require("../../../dispatcher/actions");
var _RoomNotificationStateStore = require("../../../stores/notifications/RoomNotificationStateStore");
var _SettingsStore = _interopRequireDefault(require("../../../settings/SettingsStore"));
var _CustomRoomTagStore = _interopRequireDefault(require("../../../stores/CustomRoomTagStore"));
var _arrays = require("../../../utils/arrays");
var _objects = require("../../../utils/objects");
var _IconizedContextMenu = require("../context_menus/IconizedContextMenu");
var _AccessibleButton = _interopRequireDefault(require("../elements/AccessibleButton"));
var _CommunityPrototypeStore = require("../../../stores/CommunityPrototypeStore");
var _CallHandler = _interopRequireDefault(require("../../../CallHandler"));
var _SpaceStore = _interopRequireWildcard(require("../../../stores/SpaceStore"));
var _space = require("../../../utils/space");
var _replaceableComponent = require("../../../utils/replaceableComponent");
var _RoomAvatar = _interopRequireDefault(require("../avatars/RoomAvatar"));
var _dec, _class, _temp;
const TAG_ORDER
/*: TagID[]*/
= [_models.DefaultTagID.Invite, _models.DefaultTagID.Favourite, _models.DefaultTagID.DM, _models.DefaultTagID.Untagged, // -- Custom Tags Placeholder --
_models.DefaultTagID.LowPriority, _models.DefaultTagID.ServerNotice, _models.DefaultTagID.Suggested, _models.DefaultTagID.Archived];
const CUSTOM_TAGS_BEFORE_TAG = _models.DefaultTagID.LowPriority;
const ALWAYS_VISIBLE_TAGS
/*: TagID[]*/
= [_models.DefaultTagID.DM, _models.DefaultTagID.Untagged];
// If we have no dialer support, we just show the create chat dialog
const dmOnAddRoom = (dispatcher
/*: Dispatcher<ActionPayload>*/
) => {
(dispatcher || _dispatcher.default).dispatch({
action: 'view_create_chat'
});
}; // If we have dialer support, show a context menu so the user can pick between
// the dialer and the create chat dialog
const dmAddRoomContextMenu = (onFinished
/*: () => void*/
) => {
return /*#__PURE__*/_react.default.createElement(_IconizedContextMenu.IconizedContextMenuOptionList, {
first: true
}, /*#__PURE__*/_react.default.createElement(_IconizedContextMenu.IconizedContextMenuOption, {
label: (0, _languageHandler._t)("Start a Conversation"),
iconClassName: "mx_RoomList_iconPlus",
onClick: e => {
e.preventDefault();
e.stopPropagation();
onFinished();
_dispatcher.default.dispatch({
action: "view_create_chat"
});
}
}), /*#__PURE__*/_react.default.createElement(_IconizedContextMenu.IconizedContextMenuOption, {
label: (0, _languageHandler._t)("Open dial pad"),
iconClassName: "mx_RoomList_iconDialpad",
onClick: e => {
e.preventDefault();
e.stopPropagation();
onFinished();
_dispatcher.default.fire(_actions.Action.OpenDialPad);
}
}));
};
const TAG_AESTHETICS
/*: ITagAestheticsMap*/
= {
[_models.DefaultTagID.Invite]: {
sectionLabel: (0, _languageHandler._td)("Invites"),
isInvite: true,
defaultHidden: false
},
[_models.DefaultTagID.Favourite]: {
sectionLabel: (0, _languageHandler._td)("Favourites"),
isInvite: false,
defaultHidden: false
},
[_models.DefaultTagID.DM]: {
sectionLabel: (0, _languageHandler._td)("People"),
isInvite: false,
defaultHidden: false,
addRoomLabel: (0, _languageHandler._td)("Start chat") // Either onAddRoom or addRoomContextMenu are set depending on whether we
// have dialer support.
},
[_models.DefaultTagID.Untagged]: {
sectionLabel: (0, _languageHandler._td)("Rooms"),
isInvite: false,
defaultHidden: false,
addRoomLabel: (0, _languageHandler._td)("Add room"),
addRoomContextMenu: (onFinished
/*: () => void*/
) => {
if (_SpaceStore.default.instance.activeSpace) {
const canAddRooms = _SpaceStore.default.instance.activeSpace.currentState.maySendStateEvent(_event.EventType.SpaceChild, _MatrixClientPeg.MatrixClientPeg.get().getUserId());
return /*#__PURE__*/_react.default.createElement(_IconizedContextMenu.IconizedContextMenuOptionList, {
first: true
}, /*#__PURE__*/_react.default.createElement(_IconizedContextMenu.IconizedContextMenuOption, {
label: (0, _languageHandler._t)("Create new room"),
iconClassName: "mx_RoomList_iconPlus",
onClick: e => {
e.preventDefault();
e.stopPropagation();
onFinished();
(0, _space.showCreateNewRoom)(_MatrixClientPeg.MatrixClientPeg.get(), _SpaceStore.default.instance.activeSpace);
},
disabled: !canAddRooms,
tooltip: canAddRooms ? undefined : (0, _languageHandler._t)("You do not have permissions to create new rooms in this space")
}), /*#__PURE__*/_react.default.createElement(_IconizedContextMenu.IconizedContextMenuOption, {
label: (0, _languageHandler._t)("Add existing room"),
iconClassName: "mx_RoomList_iconHash",
onClick: e => {
e.preventDefault();
e.stopPropagation();
onFinished();
(0, _space.showAddExistingRooms)(_MatrixClientPeg.MatrixClientPeg.get(), _SpaceStore.default.instance.activeSpace);
},
disabled: !canAddRooms,
tooltip: canAddRooms ? undefined : (0, _languageHandler._t)("You do not have permissions to add rooms to this space")
}), /*#__PURE__*/_react.default.createElement(_IconizedContextMenu.IconizedContextMenuOption, {
label: (0, _languageHandler._t)("Explore rooms"),
iconClassName: "mx_RoomList_iconBrowse",
onClick: e => {
e.preventDefault();
e.stopPropagation();
onFinished();
_dispatcher.default.fire(_actions.Action.ViewRoomDirectory);
}
}));
}
return /*#__PURE__*/_react.default.createElement(_IconizedContextMenu.IconizedContextMenuOptionList, {
first: true
}, /*#__PURE__*/_react.default.createElement(_IconizedContextMenu.IconizedContextMenuOption, {
label: (0, _languageHandler._t)("Create new room"),
iconClassName: "mx_RoomList_iconPlus",
onClick: e => {
e.preventDefault();
e.stopPropagation();
onFinished();
_dispatcher.default.dispatch({
action: "view_create_room"
});
}
}), /*#__PURE__*/_react.default.createElement(_IconizedContextMenu.IconizedContextMenuOption, {
label: _CommunityPrototypeStore.CommunityPrototypeStore.instance.getSelectedCommunityId() ? (0, _languageHandler._t)("Explore community rooms") : (0, _languageHandler._t)("Explore public rooms"),
iconClassName: "mx_RoomList_iconExplore",
onClick: e => {
e.preventDefault();
e.stopPropagation();
onFinished();
_dispatcher.default.fire(_actions.Action.ViewRoomDirectory);
}
}));
}
},
[_models.DefaultTagID.LowPriority]: {
sectionLabel: (0, _languageHandler._td)("Low priority"),
isInvite: false,
defaultHidden: false
},
[_models.DefaultTagID.ServerNotice]: {
sectionLabel: (0, _languageHandler._td)("System Alerts"),
isInvite: false,
defaultHidden: false
},
// TODO: Replace with archived view: https://github.com/vector-im/element-web/issues/14038
[_models.DefaultTagID.Archived]: {
sectionLabel: (0, _languageHandler._td)("Historical"),
isInvite: false,
defaultHidden: true
},
[_models.DefaultTagID.Suggested]: {
sectionLabel: (0, _languageHandler._td)("Suggested Rooms"),
isInvite: false,
defaultHidden: false
}
};
function customTagAesthetics(tagId
/*: TagID*/
)
/*: ITagAesthetics*/
{
if (tagId.startsWith("u.")) {
tagId = tagId.substring(2);
}
return {
sectionLabel: (0, _languageHandler._td)("Custom Tag"),
sectionLabelRaw: tagId,
isInvite: false,
defaultHidden: false
};
}
let RoomList = (_dec = (0, _replaceableComponent.replaceableComponent)("views.rooms.RoomList"), _dec(_class = (_temp = class RoomList extends _react.default.PureComponent
/*:: <IProps, IState>*/
{
constructor(props
/*: IProps*/
) {
super(props);
(0, _defineProperty2.default)(this, "dispatcherRef", void 0);
(0, _defineProperty2.default)(this, "customTagStoreRef", void 0);
(0, _defineProperty2.default)(this, "tagAesthetics", void 0);
(0, _defineProperty2.default)(this, "roomStoreToken", void 0);
(0, _defineProperty2.default)(this, "onRoomViewStoreUpdate", () => {
this.setState({
currentRoomId: _RoomViewStore.default.getRoomId()
});
});
(0, _defineProperty2.default)(this, "onAction", (payload
/*: ActionPayload*/
) => {
if (payload.action === _actions.Action.ViewRoomDelta) {
const viewRoomDeltaPayload = payload;
const currentRoomId = _RoomViewStore.default.getRoomId();
const room = this.getRoomDelta(currentRoomId, viewRoomDeltaPayload.delta, viewRoomDeltaPayload.unread);
if (room) {
_dispatcher.default.dispatch({
action: 'view_room',
room_id: room.roomId,
show_room_tile: true // to make sure the room gets scrolled into view
});
}
} else if (payload.action === _actions.Action.PstnSupportUpdated) {
this.updateDmAddRoomAction();
this.updateLists();
}
});
(0, _defineProperty2.default)(this, "getRoomDelta", (roomId
/*: string*/
, delta
/*: number*/
, unread = false) => {
const lists = _RoomListStore.default.instance.orderedLists;
const rooms
/*: Room[]*/
= [];
TAG_ORDER.forEach(t => {
let listRooms = lists[t];
if (unread) {
// filter to only notification rooms (and our current active room so we can index properly)
listRooms = listRooms.filter(r => {
const state = _RoomNotificationStateStore.RoomNotificationStateStore.instance.getRoomState(r);
return state.room.roomId === roomId || state.isUnread;
});
}
rooms.push(...listRooms);
});
const currentIndex = rooms.findIndex(r => r.roomId === roomId); // use slice to account for looping around the start
const [room] = rooms.slice((currentIndex + delta) % rooms.length);
return room;
});
(0, _defineProperty2.default)(this, "updateSuggestedRooms", (suggestedRooms
/*: ISpaceSummaryRoom[]*/
) => {
this.setState({
suggestedRooms
});
});
(0, _defineProperty2.default)(this, "updateLists", () => {
const newLists = _RoomListStore.default.instance.orderedLists;
if (_SettingsStore.default.getValue("advancedRoomListLogging")) {
// TODO: Remove debug: https://github.com/vector-im/element-web/issues/14602
console.log("new lists", newLists);
}
const previousListIds = Object.keys(this.state.sublists);
const newListIds = Object.keys(newLists).filter(t => {
if (!(0, _models.isCustomTag)(t)) return true; // always include non-custom tags
// if the tag is custom though, only include it if it is enabled
return _CustomRoomTagStore.default.getTags()[t];
});
const isNameFiltering = !!_RoomListStore.default.instance.getFirstNameFilterCondition();
let doUpdate = this.state.isNameFiltering !== isNameFiltering || (0, _arrays.arrayHasDiff)(previousListIds, newListIds);
if (!doUpdate) {
// so we didn't have the visible sublists change, but did the contents of those
// sublists change significantly enough to break the sticky headers? Probably, so
// let's check the length of each.
for (const tagId of newListIds) {
const oldRooms = this.state.sublists[tagId];
const newRooms = newLists[tagId];
if (oldRooms.length !== newRooms.length) {
doUpdate = true;
break;
}
}
}
if (doUpdate) {
// We have to break our reference to the room list store if we want to be able to
// diff the object for changes, so do that.
// @ts-ignore - ITagMap is ts-ignored so this will have to be too
const newSublists = (0, _objects.objectWithOnly)(newLists, newListIds);
const sublists = (0, _objects.objectShallowClone)(newSublists, (k, v) => (0, _arrays.arrayFastClone)(v));
this.setState({
sublists,
isNameFiltering
}, () => {
this.props.onResize();
});
}
});
(0, _defineProperty2.default)(this, "onStartChat", () => {
const initialText = _RoomListStore.default.instance.getFirstNameFilterCondition()?.search;
_dispatcher.default.dispatch({
action: "view_create_chat",
initialText
});
});
(0, _defineProperty2.default)(this, "onExplore", () => {
const initialText = _RoomListStore.default.instance.getFirstNameFilterCondition()?.search;
_dispatcher.default.dispatch({
action: _actions.Action.ViewRoomDirectory,
initialText
});
});
(0, _defineProperty2.default)(this, "onSpaceInviteClick", () => {
const initialText = _RoomListStore.default.instance.getFirstNameFilterCondition()?.search;
(0, _space.showSpaceInvite)(this.props.activeSpace, initialText);
});
this.state = {
sublists: {},
isNameFiltering: !!_RoomListStore.default.instance.getFirstNameFilterCondition(),
suggestedRooms: _SpaceStore.default.instance.suggestedRooms
}; // shallow-copy from the template as we need to make modifications to it
this.tagAesthetics = (0, _objects.objectShallowClone)(TAG_AESTHETICS);
this.updateDmAddRoomAction();
}
componentDidMount()
/*: void*/
{
this.dispatcherRef = _dispatcher.default.register(this.onAction);
this.roomStoreToken = _RoomViewStore.default.addListener(this.onRoomViewStoreUpdate);
_SpaceStore.default.instance.on(_SpaceStore.SUGGESTED_ROOMS, this.updateSuggestedRooms);
_RoomListStore.default.instance.on(_RoomListStore.LISTS_UPDATE_EVENT, this.updateLists);
this.customTagStoreRef = _CustomRoomTagStore.default.addListener(this.updateLists);
this.updateLists(); // trigger the first update
}
componentWillUnmount() {
_SpaceStore.default.instance.off(_SpaceStore.SUGGESTED_ROOMS, this.updateSuggestedRooms);
_RoomListStore.default.instance.off(_RoomListStore.LISTS_UPDATE_EVENT, this.updateLists);
_dispatcher.default.unregister(this.dispatcherRef);
if (this.customTagStoreRef) this.customTagStoreRef.remove();
if (this.roomStoreToken) this.roomStoreToken.remove();
}
updateDmAddRoomAction() {
const dmTagAesthetics = (0, _objects.objectShallowClone)(TAG_AESTHETICS[_models.DefaultTagID.DM]);
if (_CallHandler.default.sharedInstance().getSupportsPstnProtocol()) {
dmTagAesthetics.addRoomContextMenu = dmAddRoomContextMenu;
} else {
dmTagAesthetics.onAddRoom = dmOnAddRoom;
}
this.tagAesthetics[_models.DefaultTagID.DM] = dmTagAesthetics;
}
renderSuggestedRooms()
/*: ReactComponentElement<typeof ExtraTile>[]*/
{
return this.state.suggestedRooms.map(room => {
const name = room.name || room.canonical_alias || room.aliases?.[0] || (0, _languageHandler._t)("Empty room");
const avatar = /*#__PURE__*/_react.default.createElement(_RoomAvatar.default, {
oobData: {
name,
avatarUrl: room.avatar_url
},
width: 32,
height: 32,
resizeMethod: "crop"
});
const viewRoom = () => {
_dispatcher.default.dispatch({
action: "view_room",
room_id: room.room_id,
oobData: {
avatarUrl: room.avatar_url,
name
}
});
};
return /*#__PURE__*/_react.default.createElement(_ExtraTile.default, {
isMinimized: this.props.isMinimized,
isSelected: this.state.currentRoomId === room.room_id,
displayName: name,
avatar: avatar,
onClick: viewRoom,
key: `suggestedRoomTile_${room.room_id}`
});
});
}
renderCommunityInvites()
/*: ReactComponentElement<typeof ExtraTile>[]*/
{
// TODO: Put community invites in a more sensible place (not in the room list)
// See https://github.com/vector-im/element-web/issues/14456
return _MatrixClientPeg.MatrixClientPeg.get().getGroups().filter(g => {
return g.myMembership === 'invite';
}).map(g => {
const avatar = /*#__PURE__*/_react.default.createElement(_GroupAvatar.default, {
groupId: g.groupId,
groupName: g.name,
groupAvatarUrl: g.avatarUrl,
width: 32,
height: 32,
resizeMethod: "crop"
});
const openGroup = () => {
_dispatcher.default.dispatch({
action: 'view_group',
group_id: g.groupId
});
};
return /*#__PURE__*/_react.default.createElement(_ExtraTile.default, {
isMinimized: this.props.isMinimized,
isSelected: false,
displayName: g.name,
avatar: avatar,
notificationState: _StaticNotificationState.StaticNotificationState.RED_EXCLAMATION,
onClick: openGroup,
key: `temporaryGroupTile_${g.groupId}`
});
});
}
renderSublists()
/*: React.ReactElement[]*/
{
// show a skeleton UI if the user is in no rooms and they are not filtering
const showSkeleton = !this.state.isNameFiltering && Object.values(_RoomListStore.default.instance.unfilteredLists).every(list => !list?.length);
return TAG_ORDER.reduce((tags, tagId) => {
if (tagId === CUSTOM_TAGS_BEFORE_TAG) {
const customTags = Object.keys(this.state.sublists).filter(tagId => (0, _models.isCustomTag)(tagId));
tags.push(...customTags);
}
tags.push(tagId);
return tags;
}, []).map(orderedTagId => {
let extraTiles = null;
if (orderedTagId === _models.DefaultTagID.Invite) {
extraTiles = this.renderCommunityInvites();
} else if (orderedTagId === _models.DefaultTagID.Suggested) {
extraTiles = this.renderSuggestedRooms();
}
const aesthetics
/*: ITagAesthetics*/
= (0, _models.isCustomTag)(orderedTagId) ? customTagAesthetics(orderedTagId) : this.tagAesthetics[orderedTagId];
if (!aesthetics) throw new Error(`Tag ${orderedTagId} does not have aesthetics`); // The cost of mounting/unmounting this component offsets the cost
// of keeping it in the DOM and hiding it when it is not required
return /*#__PURE__*/_react.default.createElement(_RoomSublist.default, {
key: `sublist-${orderedTagId}`,
tagId: orderedTagId,
forRooms: true,
startAsHidden: aesthetics.defaultHidden,
label: aesthetics.sectionLabelRaw ? aesthetics.sectionLabelRaw : (0, _languageHandler._t)(aesthetics.sectionLabel),
onAddRoom: aesthetics.onAddRoom,
addRoomLabel: aesthetics.addRoomLabel ? (0, _languageHandler._t)(aesthetics.addRoomLabel) : aesthetics.addRoomLabel,
addRoomContextMenu: aesthetics.addRoomContextMenu,
isMinimized: this.props.isMinimized,
onResize: this.props.onResize,
showSkeleton: showSkeleton,
extraTiles: extraTiles,
resizeNotifier: this.props.resizeNotifier,
alwaysVisible: ALWAYS_VISIBLE_TAGS.includes(orderedTagId)
});
});
}
render() {
const cli = _MatrixClientPeg.MatrixClientPeg.get();
const userId = cli.getUserId();
let explorePrompt
/*: JSX.Element*/
;
if (!this.props.isMinimized) {
if (this.state.isNameFiltering) {
explorePrompt = /*#__PURE__*/_react.default.createElement("div", {
className: "mx_RoomList_explorePrompt"
}, /*#__PURE__*/_react.default.createElement("div", null, (0, _languageHandler._t)("Can't see what you’re looking for?")), /*#__PURE__*/_react.default.createElement(_AccessibleButton.default, {
className: "mx_RoomList_explorePrompt_startChat",
kind: "link",
onClick: this.onStartChat
}, (0, _languageHandler._t)("Start a new chat")), /*#__PURE__*/_react.default.createElement(_AccessibleButton.default, {
className: "mx_RoomList_explorePrompt_explore",
kind: "link",
onClick: this.onExplore
}, this.props.activeSpace ? (0, _languageHandler._t)("Explore rooms") : (0, _languageHandler._t)("Explore all public rooms")));
} else if (this.props.activeSpace?.canInvite(userId) || this.props.activeSpace?.getMyMembership() === "join") {
explorePrompt = /*#__PURE__*/_react.default.createElement("div", {
className: "mx_RoomList_explorePrompt"
}, /*#__PURE__*/_react.default.createElement("div", null, (0, _languageHandler._t)("Quick actions")), this.props.activeSpace.canInvite(userId) && /*#__PURE__*/_react.default.createElement(_AccessibleButton.default, {
className: "mx_RoomList_explorePrompt_spaceInvite",
onClick: this.onSpaceInviteClick
}, (0, _languageHandler._t)("Invite people")), this.props.activeSpace.getMyMembership() === "join" && /*#__PURE__*/_react.default.createElement(_AccessibleButton.default, {
className: "mx_RoomList_explorePrompt_spaceExplore",
onClick: this.onExplore
}, (0, _languageHandler._t)("Explore rooms")));
} else if (Object.values(this.state.sublists).some(list => list.length > 0)) {
const unfilteredLists = _RoomListStore.default.instance.unfilteredLists;
const unfilteredRooms = unfilteredLists[_models.DefaultTagID.Untagged] || [];
const unfilteredHistorical = unfilteredLists[_models.DefaultTagID.Archived] || [];
const unfilteredFavourite = unfilteredLists[_models.DefaultTagID.Favourite] || []; // show a prompt to join/create rooms if the user is in 0 rooms and no historical
if (unfilteredRooms.length < 1 && unfilteredHistorical < 1 && unfilteredFavourite < 1) {
explorePrompt = /*#__PURE__*/_react.default.createElement("div", {
className: "mx_RoomList_explorePrompt"
}, /*#__PURE__*/_react.default.createElement("div", null, (0, _languageHandler._t)("Use the + to make a new room or explore existing ones below")), /*#__PURE__*/_react.default.createElement(_AccessibleButton.default, {
className: "mx_RoomList_explorePrompt_startChat",
kind: "link",
onClick: this.onStartChat
}, (0, _languageHandler._t)("Start a new chat")), /*#__PURE__*/_react.default.createElement(_AccessibleButton.default, {
className: "mx_RoomList_explorePrompt_explore",
kind: "link",
onClick: this.onExplore
}, (0, _languageHandler._t)("Explore all public rooms")));
}
}
}
const sublists = this.renderSublists();
return /*#__PURE__*/_react.default.createElement(_RovingTabIndex.RovingTabIndexProvider, {
handleHomeEnd: true,
onKeyDown: this.props.onKeyDown
}, ({
onKeyDownHandler
}) => /*#__PURE__*/_react.default.createElement("div", {
onFocus: this.props.onFocus,
onBlur: this.props.onBlur,
onKeyDown: onKeyDownHandler,
className: "mx_RoomList",
role: "tree",
"aria-label": (0, _languageHandler._t)("Rooms")
}, sublists, explorePrompt));
}
}, _temp)) || _class);
exports.default = RoomList;
//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uL3NyYy9jb21wb25lbnRzL3ZpZXdzL3Jvb21zL1Jvb21MaXN0LnRzeCJdLCJuYW1lcyI6WyJUQUdfT1JERVIiLCJEZWZhdWx0VGFnSUQiLCJJbnZpdGUiLCJGYXZvdXJpdGUiLCJETSIsIlVudGFnZ2VkIiwiTG93UHJpb3JpdHkiLCJTZXJ2ZXJOb3RpY2UiLCJTdWdnZXN0ZWQiLCJBcmNoaXZlZCIsIkNVU1RPTV9UQUdTX0JFRk9SRV9UQUciLCJBTFdBWVNfVklTSUJMRV9UQUdTIiwiZG1PbkFkZFJvb20iLCJkaXNwYXRjaGVyIiwiZGVmYXVsdERpc3BhdGNoZXIiLCJkaXNwYXRjaCIsImFjdGlvbiIsImRtQWRkUm9vbUNvbnRleHRNZW51Iiwib25GaW5pc2hlZCIsImUiLCJwcmV2ZW50RGVmYXVsdCIsInN0b3BQcm9wYWdhdGlvbiIsImZpcmUiLCJBY3Rpb24iLCJPcGVuRGlhbFBhZCIsIlRBR19BRVNUSEVUSUNTIiwic2VjdGlvbkxhYmVsIiwiaXNJbnZpdGUiLCJkZWZhdWx0SGlkZGVuIiwiYWRkUm9vbUxhYmVsIiwiYWRkUm9vbUNvbnRleHRNZW51IiwiU3BhY2VTdG9yZSIsImluc3RhbmNlIiwiYWN0aXZlU3BhY2UiLCJjYW5BZGRSb29tcyIsImN1cnJlbnRTdGF0ZSIsIm1heVNlbmRTdGF0ZUV2ZW50IiwiRXZlbnRUeXBlIiwiU3BhY2VDaGlsZCIsIk1hdHJpeENsaWVudFBlZyIsImdldCIsImdldFVzZXJJZCIsInVuZGVmaW5lZCIsIlZpZXdSb29tRGlyZWN0b3J5IiwiQ29tbXVuaXR5UHJvdG90eXBlU3RvcmUiLCJnZXRTZWxlY3RlZENvbW11bml0eUlkIiwiY3VzdG9tVGFnQWVzdGhldGljcyIsInRhZ0lkIiwic3RhcnRzV2l0aCIsInN1YnN0cmluZyIsInNlY3Rpb25MYWJlbFJhdyIsIlJvb21MaXN0IiwiUmVhY3QiLCJQdXJlQ29tcG9uZW50IiwiY29uc3RydWN0b3IiLCJwcm9wcyIsInNldFN0YXRlIiwiY3VycmVudFJvb21JZCIsIlJvb21WaWV3U3RvcmUiLCJnZXRSb29tSWQiLCJwYXlsb2FkIiwiVmlld1Jvb21EZWx0YSIsInZpZXdSb29tRGVsdGFQYXlsb2FkIiwicm9vbSIsImdldFJvb21EZWx0YSIsImRlbHRhIiwidW5yZWFkIiwiZGlzIiwicm9vbV9pZCIsInJvb21JZCIsInNob3dfcm9vbV90aWxlIiwiUHN0blN1cHBvcnRVcGRhdGVkIiwidXBkYXRlRG1BZGRSb29tQWN0aW9uIiwidXBkYXRlTGlzdHMiLCJsaXN0cyIsIlJvb21MaXN0U3RvcmUiLCJvcmRlcmVkTGlzdHMiLCJyb29tcyIsImZvckVhY2giLCJ0IiwibGlzdFJvb21zIiwiZmlsdGVyIiwiciIsInN0YXRlIiwiUm9vbU5vdGlmaWNhdGlvblN0YXRlU3RvcmUiLCJnZXRSb29tU3RhdGUiLCJpc1VucmVhZCIsInB1c2giLCJjdXJyZW50SW5kZXgiLCJmaW5kSW5kZXgiLCJzbGljZSIsImxlbmd0aCIsInN1Z2dlc3RlZFJvb21zIiwibmV3TGlzdHMiLCJTZXR0aW5nc1N0b3JlIiwiZ2V0VmFsdWUiLCJjb25zb2xlIiwibG9nIiwicHJldmlvdXNMaXN0SWRzIiwiT2JqZWN0Iiwia2V5cyIsInN1Ymxpc3RzIiwibmV3TGlzdElkcyIsIkN1c3RvbVJvb21UYWdTdG9yZSIsImdldFRhZ3MiLCJpc05hbWVGaWx0ZXJpbmciLCJnZXRGaXJzdE5hbWVGaWx0ZXJDb25kaXRpb24iLCJkb1VwZGF0ZSIsIm9sZFJvb21zIiwibmV3Um9vbXMiLCJuZXdTdWJsaXN0cyIsImsiLCJ2Iiwib25SZXNpemUiLCJpbml0aWFsVGV4dCIsInNlYXJjaCIsInRhZ0Flc3RoZXRpY3MiLCJjb21wb25lbnREaWRNb3VudCIsImRpc3BhdGNoZXJSZWYiLCJyZWdpc3RlciIsIm9uQWN0aW9uIiwicm9vbVN0b3JlVG9rZW4iLCJhZGRMaXN0ZW5lciIsIm9uUm9vbVZpZXdTdG9yZVVwZGF0ZSIsIm9uIiwiU1VHR0VTVEVEX1JPT01TIiwidXBkYXRlU3VnZ2VzdGVkUm9vbXMiLCJMSVNUU19VUERBVEVfRVZFTlQiLCJjdXN0b21UYWdTdG9yZVJlZiIsImNvbXBvbmVudFdpbGxVbm1vdW50Iiwib2ZmIiwidW5yZWdpc3RlciIsInJlbW92ZSIsImRtVGFnQWVzdGhldGljcyIsIkNhbGxIYW5kbGVyIiwic2hhcmVkSW5zdGFuY2UiLCJnZXRTdXBwb3J0c1BzdG5Qcm90b2NvbCIsIm9uQWRkUm9vbSIsInJlbmRlclN1Z2dlc3RlZFJvb21zIiwibWFwIiwibmFtZSIsImNhbm9uaWNhbF9hbGlhcyIsImFsaWFzZXMiLCJhdmF0YXIiLCJhdmF0YXJVcmwiLCJhdmF0YXJfdXJsIiwidmlld1Jvb20iLCJvb2JEYXRhIiwiaXNNaW5pbWl6ZWQiLCJyZW5kZXJDb21tdW5pdHlJbnZpdGVzIiwiZ2V0R3JvdXBzIiwiZyIsIm15TWVtYmVyc2hpcCIsImdyb3VwSWQiLCJvcGVuR3JvdXAiLCJncm91cF9pZCIsIlN0YXRpY05vdGlmaWNhdGlvblN0YXRlIiwiUkVEX0VYQ0xBTUFUSU9OIiwicmVuZGVyU3VibGlzdHMiLCJzaG93U2tlbGV0b24iLCJ2YWx1ZXMiLCJ1bmZpbHRlcmVkTGlzdHMiLCJldmVyeSIsImxpc3QiLCJyZWR1Y2UiLCJ0YWdzIiwiY3VzdG9tVGFncyIsIm9yZGVyZWRUYWdJZCIsImV4dHJhVGlsZXMiLCJhZXN0aGV0aWNzIiwiRXJyb3IiLCJyZXNpemVOb3RpZmllciIsImluY2x1ZGVzIiwicmVuZGVyIiwiY2xpIiwidXNlcklkIiwiZXhwbG9yZVByb21wdCIsIm9uU3RhcnRDaGF0Iiwib25FeHBsb3JlIiwiY2FuSW52aXRlIiwiZ2V0TXlNZW1iZXJzaGlwIiwib25TcGFjZUludml0ZUNsaWNrIiwic29tZSIsInVuZmlsdGVyZWRSb29tcyIsInVuZmlsdGVyZWRIaXN0b3JpY2FsIiwidW5maWx0ZXJlZEZhdm91cml0ZSIsIm9uS2V5RG93biIsIm9uS2V5RG93bkhhbmRsZXIiLCJvbkZvY3VzIiwib25CbHVyIl0sIm1hcHBpbmdzIjoiOzs7Ozs7Ozs7Ozs7O0FBZ0JBOztBQUlBOztBQUVB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MDE1LTIwMTgsIDIwMjAsIDIwMjEgVGhlIE1hdHJpeC5vcmcgRm91bmRhdGlvbiBDLkkuQy5cblxuTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlIFwiTGljZW5zZVwiKTtcbnlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS5cbllvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdFxuXG4gICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wXG5cblVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmVcbmRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuIFwiQVMgSVNcIiBCQVNJUyxcbldJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLlxuU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZFxubGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuXG4qL1xuXG5pbXBvcnQgUmVhY3QsIHsgUmVhY3RDb21wb25lbnRFbGVtZW50IH0gZnJvbSBcInJlYWN0XCI7XG5pbXBvcnQgeyBEaXNwYXRjaGVyIH0gZnJvbSBcImZsdXhcIjtcbmltcG9ydCB7IFJvb20gfSBmcm9tIFwibWF0cml4LWpzLXNkay9zcmMvbW9kZWxzL3Jvb21cIjtcbmltcG9ydCAqIGFzIGZiRW1pdHRlciBmcm9tIFwiZmJlbWl0dGVyXCI7XG5pbXBvcnQgeyBFdmVudFR5cGUgf