matrix-react-sdk
Version:
SDK for matrix.org using React
729 lines (617 loc) • 95.5 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 _extends2 = _interopRequireDefault(require("@babel/runtime/helpers/extends"));
var _defineProperty2 = _interopRequireDefault(require("@babel/runtime/helpers/defineProperty"));
var _react = _interopRequireWildcard(require("react"));
var _classnames = _interopRequireDefault(require("classnames"));
var _RovingTabIndex = require("../../../accessibility/RovingTabIndex");
var _AccessibleButton = _interopRequireDefault(require("../../views/elements/AccessibleButton"));
var _dispatcher = _interopRequireDefault(require("../../../dispatcher/dispatcher"));
var _Keyboard = require("../../../Keyboard");
var _ActiveRoomObserver = _interopRequireDefault(require("../../../ActiveRoomObserver"));
var _languageHandler = require("../../../languageHandler");
var _ContextMenu = require("../../structures/ContextMenu");
var _models = require("../../../stores/room-list/models");
var _MessagePreviewStore = require("../../../stores/room-list/MessagePreviewStore");
var _DecoratedRoomAvatar = _interopRequireDefault(require("../avatars/DecoratedRoomAvatar"));
var _RoomNotifs = require("../../../RoomNotifs");
var _MatrixClientPeg = require("../../../MatrixClientPeg");
var _NotificationBadge = _interopRequireDefault(require("./NotificationBadge"));
var _RoomListStore = _interopRequireDefault(require("../../../stores/room-list/RoomListStore"));
var _RoomListActions = _interopRequireDefault(require("../../../actions/RoomListActions"));
var _RoomNotificationStateStore = require("../../../stores/notifications/RoomNotificationStateStore");
var _NotificationState = require("../../../stores/notifications/NotificationState");
var _AccessibleTooltipButton = _interopRequireDefault(require("../elements/AccessibleTooltipButton"));
var _EchoChamber = require("../../../stores/local-echo/EchoChamber");
var _RoomEchoChamber = require("../../../stores/local-echo/RoomEchoChamber");
var _GenericEchoChamber = require("../../../stores/local-echo/GenericEchoChamber");
var _IconizedContextMenu = _interopRequireWildcard(require("../context_menus/IconizedContextMenu"));
var _CommunityPrototypeStore = require("../../../stores/CommunityPrototypeStore");
var _replaceableComponent = require("../../../utils/replaceableComponent");
var _RoomStatusBar = require("../../structures/RoomStatusBar");
var _StaticNotificationState = require("../../../stores/notifications/StaticNotificationState");
var _dec, _class, _temp;
const messagePreviewId = (roomId
/*: string*/
) => `mx_RoomTile_messagePreview_${roomId}`;
const contextMenuBelow = (elementRect
/*: PartialDOMRect*/
) => {
// align the context menu's icons with the icon which opened the context menu
const left = elementRect.left + window.pageXOffset - 9;
const top = elementRect.bottom + window.pageYOffset + 17;
const chevronFace = _ContextMenu.ChevronFace.None;
return {
left,
top,
chevronFace
};
};
let RoomTile = (_dec = (0, _replaceableComponent.replaceableComponent)("views.rooms.RoomTile"), _dec(_class = (_temp = class RoomTile extends _react.default.PureComponent
/*:: <IProps, IState>*/
{
constructor(props
/*: IProps*/
) {
super(props);
(0, _defineProperty2.default)(this, "dispatcherRef", void 0);
(0, _defineProperty2.default)(this, "roomTileRef", /*#__PURE__*/(0, _react.createRef)());
(0, _defineProperty2.default)(this, "notificationState", void 0);
(0, _defineProperty2.default)(this, "roomProps", void 0);
(0, _defineProperty2.default)(this, "onRoomNameUpdate", room => {
this.forceUpdate();
});
(0, _defineProperty2.default)(this, "onNotificationUpdate", () => {
this.forceUpdate(); // notification state changed - update
});
(0, _defineProperty2.default)(this, "onResize", () => {
if (this.showMessagePreview && !this.state.messagePreview) {
this.generatePreview();
}
});
(0, _defineProperty2.default)(this, "onLocalEchoUpdated", (ev
/*: MatrixEvent*/
, room
/*: Room*/
) => {
if (!room?.roomId === this.props.room.roomId) return;
this.setState({
hasUnsentEvents: this.countUnsentEvents() > 0
});
});
(0, _defineProperty2.default)(this, "onRoomPropertyUpdate", (property
/*: CachedRoomKey*/
) => {
if (property === _RoomEchoChamber.CachedRoomKey.NotificationVolume) this.onNotificationUpdate(); // else ignore - not important for this tile
});
(0, _defineProperty2.default)(this, "onAction", (payload
/*: ActionPayload*/
) => {
if (payload.action === "view_room" && payload.room_id === this.props.room.roomId && payload.show_room_tile) {
setImmediate(() => {
this.scrollIntoView();
});
}
});
(0, _defineProperty2.default)(this, "onCommunityUpdate", (roomId
/*: string*/
) => {
if (roomId !== this.props.room.roomId) return;
this.forceUpdate(); // we don't have anything to actually update
});
(0, _defineProperty2.default)(this, "onRoomPreviewChanged", (room
/*: Room*/
) => {
if (this.props.room && room.roomId === this.props.room.roomId) {
this.generatePreview();
}
});
(0, _defineProperty2.default)(this, "scrollIntoView", () => {
if (!this.roomTileRef.current) return;
this.roomTileRef.current.scrollIntoView({
block: "nearest",
behavior: "auto"
});
});
(0, _defineProperty2.default)(this, "onTileClick", (ev
/*: React.KeyboardEvent*/
) => {
ev.preventDefault();
ev.stopPropagation();
_dispatcher.default.dispatch({
action: 'view_room',
show_room_tile: true,
// make sure the room is visible in the list
room_id: this.props.room.roomId,
clear_search: ev && (ev.key === _Keyboard.Key.ENTER || ev.key === _Keyboard.Key.SPACE)
});
});
(0, _defineProperty2.default)(this, "onActiveRoomUpdate", (isActive
/*: boolean*/
) => {
this.setState({
selected: isActive
});
});
(0, _defineProperty2.default)(this, "onNotificationsMenuOpenClick", (ev
/*: React.MouseEvent*/
) => {
ev.preventDefault();
ev.stopPropagation();
const target = ev.target;
this.setState({
notificationsMenuPosition: target.getBoundingClientRect()
});
});
(0, _defineProperty2.default)(this, "onCloseNotificationsMenu", () => {
this.setState({
notificationsMenuPosition: null
});
});
(0, _defineProperty2.default)(this, "onGeneralMenuOpenClick", (ev
/*: React.MouseEvent*/
) => {
ev.preventDefault();
ev.stopPropagation();
const target = ev.target;
this.setState({
generalMenuPosition: target.getBoundingClientRect()
});
});
(0, _defineProperty2.default)(this, "onContextMenu", (ev
/*: React.MouseEvent*/
) => {
// If we don't have a context menu to show, ignore the action.
if (!this.showContextMenu) return;
ev.preventDefault();
ev.stopPropagation();
this.setState({
generalMenuPosition: {
left: ev.clientX,
bottom: ev.clientY
}
});
});
(0, _defineProperty2.default)(this, "onCloseGeneralMenu", () => {
this.setState({
generalMenuPosition: null
});
});
(0, _defineProperty2.default)(this, "onTagRoom", (ev
/*: ButtonEvent*/
, tagId
/*: TagID*/
) => {
ev.preventDefault();
ev.stopPropagation();
if (tagId === _models.DefaultTagID.Favourite || tagId === _models.DefaultTagID.LowPriority) {
const inverseTag = tagId === _models.DefaultTagID.Favourite ? _models.DefaultTagID.LowPriority : _models.DefaultTagID.Favourite;
const isApplied = _RoomListStore.default.instance.getTagsForRoom(this.props.room).includes(tagId);
const removeTag = isApplied ? tagId : inverseTag;
const addTag = isApplied ? null : tagId;
_dispatcher.default.dispatch(_RoomListActions.default.tagRoom(_MatrixClientPeg.MatrixClientPeg.get(), this.props.room, removeTag, addTag, undefined, 0));
} else {
console.warn(`Unexpected tag ${tagId} applied to ${this.props.room.room_id}`);
}
if (ev.key === _Keyboard.Key.ENTER) {
// Implements https://www.w3.org/TR/wai-aria-practices/#keyboard-interaction-12
this.setState({
generalMenuPosition: null
}); // hide the menu
}
});
(0, _defineProperty2.default)(this, "onLeaveRoomClick", (ev
/*: ButtonEvent*/
) => {
ev.preventDefault();
ev.stopPropagation();
_dispatcher.default.dispatch({
action: 'leave_room',
room_id: this.props.room.roomId
});
this.setState({
generalMenuPosition: null
}); // hide the menu
});
(0, _defineProperty2.default)(this, "onForgetRoomClick", (ev
/*: ButtonEvent*/
) => {
ev.preventDefault();
ev.stopPropagation();
_dispatcher.default.dispatch({
action: 'forget_room',
room_id: this.props.room.roomId
});
this.setState({
generalMenuPosition: null
}); // hide the menu
});
(0, _defineProperty2.default)(this, "onOpenRoomSettings", (ev
/*: ButtonEvent*/
) => {
ev.preventDefault();
ev.stopPropagation();
_dispatcher.default.dispatch({
action: 'open_room_settings',
room_id: this.props.room.roomId
});
this.setState({
generalMenuPosition: null
}); // hide the menu
});
(0, _defineProperty2.default)(this, "onInviteClick", (ev
/*: ButtonEvent*/
) => {
ev.preventDefault();
ev.stopPropagation();
_dispatcher.default.dispatch({
action: 'view_invite',
roomId: this.props.room.roomId
});
this.setState({
generalMenuPosition: null
}); // hide the menu
});
(0, _defineProperty2.default)(this, "onClickAllNotifs", ev => this.saveNotifState(ev, _RoomNotifs.ALL_MESSAGES));
(0, _defineProperty2.default)(this, "onClickAlertMe", ev => this.saveNotifState(ev, _RoomNotifs.ALL_MESSAGES_LOUD));
(0, _defineProperty2.default)(this, "onClickMentions", ev => this.saveNotifState(ev, _RoomNotifs.MENTIONS_ONLY));
(0, _defineProperty2.default)(this, "onClickMute", ev => this.saveNotifState(ev, _RoomNotifs.MUTE));
this.state = {
selected: _ActiveRoomObserver.default.activeRoomId === this.props.room.roomId,
notificationsMenuPosition: null,
generalMenuPosition: null,
hasUnsentEvents: this.countUnsentEvents() > 0,
// generatePreview() will return nothing if the user has previews disabled
messagePreview: ""
};
this.generatePreview();
this.notificationState = _RoomNotificationStateStore.RoomNotificationStateStore.instance.getRoomState(this.props.room);
this.roomProps = _EchoChamber.EchoChamber.forRoom(this.props.room);
if (this.props.resizeNotifier) {
this.props.resizeNotifier.on("middlePanelResized", this.onResize);
}
}
countUnsentEvents()
/*: number*/
{
return (0, _RoomStatusBar.getUnsentMessages)(this.props.room).length;
}
get showContextMenu()
/*: boolean*/
{
return this.props.tag !== _models.DefaultTagID.Invite;
}
get showMessagePreview()
/*: boolean*/
{
return !this.props.isMinimized && this.props.showMessagePreview;
}
componentDidUpdate(prevProps
/*: Readonly<IProps>*/
, prevState
/*: Readonly<IState>*/
) {
if (prevProps.showMessagePreview !== this.props.showMessagePreview && this.showMessagePreview) {
this.generatePreview();
}
if (prevProps.room?.roomId !== this.props.room?.roomId) {
_MessagePreviewStore.MessagePreviewStore.instance.off(_MessagePreviewStore.MessagePreviewStore.getPreviewChangedEventName(prevProps.room), this.onRoomPreviewChanged);
_MessagePreviewStore.MessagePreviewStore.instance.on(_MessagePreviewStore.MessagePreviewStore.getPreviewChangedEventName(this.props.room), this.onRoomPreviewChanged);
_CommunityPrototypeStore.CommunityPrototypeStore.instance.off(_CommunityPrototypeStore.CommunityPrototypeStore.getUpdateEventName(prevProps.room?.roomId), this.onCommunityUpdate);
_CommunityPrototypeStore.CommunityPrototypeStore.instance.on(_CommunityPrototypeStore.CommunityPrototypeStore.getUpdateEventName(this.props.room?.roomId), this.onCommunityUpdate);
prevProps.room?.off("Room.name", this.onRoomNameUpdate);
this.props.room?.on("Room.name", this.onRoomNameUpdate);
}
}
componentDidMount() {
// when we're first rendered (or our sublist is expanded) make sure we are visible if we're active
if (this.state.selected) {
this.scrollIntoView();
}
_ActiveRoomObserver.default.addListener(this.props.room.roomId, this.onActiveRoomUpdate);
this.dispatcherRef = _dispatcher.default.register(this.onAction);
_MessagePreviewStore.MessagePreviewStore.instance.on(_MessagePreviewStore.MessagePreviewStore.getPreviewChangedEventName(this.props.room), this.onRoomPreviewChanged);
this.notificationState.on(_NotificationState.NOTIFICATION_STATE_UPDATE, this.onNotificationUpdate);
this.roomProps.on(_GenericEchoChamber.PROPERTY_UPDATED, this.onRoomPropertyUpdate);
this.roomProps.on("Room.name", this.onRoomNameUpdate);
_CommunityPrototypeStore.CommunityPrototypeStore.instance.on(_CommunityPrototypeStore.CommunityPrototypeStore.getUpdateEventName(this.props.room.roomId), this.onCommunityUpdate);
_MatrixClientPeg.MatrixClientPeg.get().on("Room.localEchoUpdated", this.onLocalEchoUpdated);
}
componentWillUnmount() {
if (this.props.room) {
_ActiveRoomObserver.default.removeListener(this.props.room.roomId, this.onActiveRoomUpdate);
_MessagePreviewStore.MessagePreviewStore.instance.off(_MessagePreviewStore.MessagePreviewStore.getPreviewChangedEventName(this.props.room), this.onRoomPreviewChanged);
_CommunityPrototypeStore.CommunityPrototypeStore.instance.off(_CommunityPrototypeStore.CommunityPrototypeStore.getUpdateEventName(this.props.room.roomId), this.onCommunityUpdate);
this.props.room.off("Room.name", this.onRoomNameUpdate);
}
if (this.props.resizeNotifier) {
this.props.resizeNotifier.off("middlePanelResized", this.onResize);
}
_ActiveRoomObserver.default.removeListener(this.props.room.roomId, this.onActiveRoomUpdate);
_dispatcher.default.unregister(this.dispatcherRef);
this.notificationState.off(_NotificationState.NOTIFICATION_STATE_UPDATE, this.onNotificationUpdate);
this.roomProps.off(_GenericEchoChamber.PROPERTY_UPDATED, this.onRoomPropertyUpdate);
this.roomProps.off("Room.name", this.onRoomNameUpdate);
_CommunityPrototypeStore.CommunityPrototypeStore.instance.off(_CommunityPrototypeStore.CommunityPrototypeStore.getUpdateEventName(this.props.room.roomId), this.onCommunityUpdate);
_MatrixClientPeg.MatrixClientPeg.get()?.removeListener("Room.localEchoUpdated", this.onLocalEchoUpdated);
}
async generatePreview() {
if (!this.showMessagePreview) {
return null;
}
const messagePreview = await _MessagePreviewStore.MessagePreviewStore.instance.getPreviewForRoom(this.props.room, this.props.tag);
this.setState({
messagePreview
});
}
async saveNotifState(ev
/*: ButtonEvent*/
, newState
/*: Volume*/
) {
ev.preventDefault();
ev.stopPropagation();
if (_MatrixClientPeg.MatrixClientPeg.get().isGuest()) return;
this.roomProps.notificationVolume = newState;
const key = ev.key;
if (key === _Keyboard.Key.ENTER) {
// Implements https://www.w3.org/TR/wai-aria-practices/#keyboard-interaction-12
this.setState({
notificationsMenuPosition: null
}); // hide the menu
}
}
renderNotificationsMenu(isActive
/*: boolean*/
)
/*: React.ReactElement*/
{
if (_MatrixClientPeg.MatrixClientPeg.get().isGuest() || this.props.tag === _models.DefaultTagID.Archived || !this.showContextMenu || this.props.isMinimized) {
// the menu makes no sense in these cases so do not show one
return null;
}
const state = this.roomProps.notificationVolume;
let contextMenu = null;
if (this.state.notificationsMenuPosition) {
contextMenu = /*#__PURE__*/_react.default.createElement(_IconizedContextMenu.default, (0, _extends2.default)({}, contextMenuBelow(this.state.notificationsMenuPosition), {
onFinished: this.onCloseNotificationsMenu,
className: "mx_RoomTile_contextMenu",
compact: true
}), /*#__PURE__*/_react.default.createElement(_IconizedContextMenu.IconizedContextMenuOptionList, {
first: true
}, /*#__PURE__*/_react.default.createElement(_IconizedContextMenu.IconizedContextMenuRadio, {
label: (0, _languageHandler._t)("Use default"),
active: state === _RoomNotifs.ALL_MESSAGES,
iconClassName: "mx_RoomTile_iconBell",
onClick: this.onClickAllNotifs
}), /*#__PURE__*/_react.default.createElement(_IconizedContextMenu.IconizedContextMenuRadio, {
label: (0, _languageHandler._t)("All messages"),
active: state === _RoomNotifs.ALL_MESSAGES_LOUD,
iconClassName: "mx_RoomTile_iconBellDot",
onClick: this.onClickAlertMe
}), /*#__PURE__*/_react.default.createElement(_IconizedContextMenu.IconizedContextMenuRadio, {
label: (0, _languageHandler._t)("Mentions & Keywords"),
active: state === _RoomNotifs.MENTIONS_ONLY,
iconClassName: "mx_RoomTile_iconBellMentions",
onClick: this.onClickMentions
}), /*#__PURE__*/_react.default.createElement(_IconizedContextMenu.IconizedContextMenuRadio, {
label: (0, _languageHandler._t)("None"),
active: state === _RoomNotifs.MUTE,
iconClassName: "mx_RoomTile_iconBellCrossed",
onClick: this.onClickMute
})));
}
const classes = (0, _classnames.default)("mx_RoomTile_notificationsButton", {
// Show bell icon for the default case too.
mx_RoomTile_iconBell: state === _RoomNotifs.ALL_MESSAGES,
mx_RoomTile_iconBellDot: state === _RoomNotifs.ALL_MESSAGES_LOUD,
mx_RoomTile_iconBellMentions: state === _RoomNotifs.MENTIONS_ONLY,
mx_RoomTile_iconBellCrossed: state === _RoomNotifs.MUTE,
// Only show the icon by default if the room is overridden to muted.
// TODO: [FTUE Notifications] Probably need to detect global mute state
mx_RoomTile_notificationsButton_show: state === _RoomNotifs.MUTE
});
return /*#__PURE__*/_react.default.createElement(_react.default.Fragment, null, /*#__PURE__*/_react.default.createElement(_ContextMenu.ContextMenuTooltipButton, {
className: classes,
onClick: this.onNotificationsMenuOpenClick,
title: (0, _languageHandler._t)("Notification options"),
isExpanded: !!this.state.notificationsMenuPosition,
tabIndex: isActive ? 0 : -1
}), contextMenu);
}
renderGeneralMenu()
/*: React.ReactElement*/
{
if (!this.showContextMenu) return null; // no menu to show
let contextMenu = null;
if (this.state.generalMenuPosition && this.props.tag === _models.DefaultTagID.Archived) {
contextMenu = /*#__PURE__*/_react.default.createElement(_IconizedContextMenu.default, (0, _extends2.default)({}, contextMenuBelow(this.state.generalMenuPosition), {
onFinished: this.onCloseGeneralMenu,
className: "mx_RoomTile_contextMenu",
compact: true
}), /*#__PURE__*/_react.default.createElement(_IconizedContextMenu.IconizedContextMenuOptionList, {
red: true
}, /*#__PURE__*/_react.default.createElement(_IconizedContextMenu.IconizedContextMenuOption, {
iconClassName: "mx_RoomTile_iconSignOut",
label: (0, _languageHandler._t)("Forget Room"),
onClick: this.onForgetRoomClick
})));
} else if (this.state.generalMenuPosition) {
const roomTags = _RoomListStore.default.instance.getTagsForRoom(this.props.room);
const isFavorite = roomTags.includes(_models.DefaultTagID.Favourite);
const favouriteLabel = isFavorite ? (0, _languageHandler._t)("Favourited") : (0, _languageHandler._t)("Favourite");
const isLowPriority = roomTags.includes(_models.DefaultTagID.LowPriority);
const lowPriorityLabel = (0, _languageHandler._t)("Low Priority");
const userId = _MatrixClientPeg.MatrixClientPeg.get().getUserId();
const canInvite = this.props.room.canInvite(userId);
contextMenu = /*#__PURE__*/_react.default.createElement(_IconizedContextMenu.default, (0, _extends2.default)({}, contextMenuBelow(this.state.generalMenuPosition), {
onFinished: this.onCloseGeneralMenu,
className: "mx_RoomTile_contextMenu",
compact: true
}), /*#__PURE__*/_react.default.createElement(_IconizedContextMenu.IconizedContextMenuOptionList, null, /*#__PURE__*/_react.default.createElement(_IconizedContextMenu.IconizedContextMenuCheckbox, {
onClick: e => this.onTagRoom(e, _models.DefaultTagID.Favourite),
active: isFavorite,
label: favouriteLabel,
iconClassName: "mx_RoomTile_iconStar"
}), /*#__PURE__*/_react.default.createElement(_IconizedContextMenu.IconizedContextMenuCheckbox, {
onClick: e => this.onTagRoom(e, _models.DefaultTagID.LowPriority),
active: isLowPriority,
label: lowPriorityLabel,
iconClassName: "mx_RoomTile_iconArrowDown"
}), canInvite ? /*#__PURE__*/_react.default.createElement(_IconizedContextMenu.IconizedContextMenuOption, {
onClick: this.onInviteClick,
label: (0, _languageHandler._t)("Invite People"),
iconClassName: "mx_RoomTile_iconInvite"
}) : null, /*#__PURE__*/_react.default.createElement(_IconizedContextMenu.IconizedContextMenuOption, {
onClick: this.onOpenRoomSettings,
label: (0, _languageHandler._t)("Settings"),
iconClassName: "mx_RoomTile_iconSettings"
})), /*#__PURE__*/_react.default.createElement(_IconizedContextMenu.IconizedContextMenuOptionList, {
red: true
}, /*#__PURE__*/_react.default.createElement(_IconizedContextMenu.IconizedContextMenuOption, {
onClick: this.onLeaveRoomClick,
label: (0, _languageHandler._t)("Leave Room"),
iconClassName: "mx_RoomTile_iconSignOut"
})));
}
return /*#__PURE__*/_react.default.createElement(_react.default.Fragment, null, /*#__PURE__*/_react.default.createElement(_ContextMenu.ContextMenuTooltipButton, {
className: "mx_RoomTile_menuButton",
onClick: this.onGeneralMenuOpenClick,
title: (0, _languageHandler._t)("Room options"),
isExpanded: !!this.state.generalMenuPosition
}), contextMenu);
}
render()
/*: React.ReactElement*/
{
const classes = (0, _classnames.default)({
'mx_RoomTile': true,
'mx_RoomTile_selected': this.state.selected,
'mx_RoomTile_hasMenuOpen': !!(this.state.generalMenuPosition || this.state.notificationsMenuPosition),
'mx_RoomTile_minimized': this.props.isMinimized
});
let roomProfile
/*: IRoomProfile*/
= {
displayName: null,
avatarMxc: null
};
if (this.props.tag === _models.DefaultTagID.Invite) {
roomProfile = _CommunityPrototypeStore.CommunityPrototypeStore.instance.getInviteProfile(this.props.room.roomId);
}
let name = roomProfile.displayName || this.props.room.name;
if (typeof name !== 'string') name = '';
name = name.replace(":", ":\u200b"); // add a zero-width space to allow linewrapping after the colon
const roomAvatar = /*#__PURE__*/_react.default.createElement(_DecoratedRoomAvatar.default, {
room: this.props.room,
avatarSize: 32,
displayBadge: this.props.isMinimized,
oobData: {
avatarUrl: roomProfile.avatarMxc
}
});
let badge
/*: React.ReactNode*/
;
if (!this.props.isMinimized) {
// aria-hidden because we summarise the unread count/highlight status in a manual aria-label below
if (this.state.hasUnsentEvents) {
// hardcode the badge to a danger state when there's unsent messages
badge = /*#__PURE__*/_react.default.createElement("div", {
className: "mx_RoomTile_badgeContainer",
"aria-hidden": "true"
}, /*#__PURE__*/_react.default.createElement(_NotificationBadge.default, {
notification: _StaticNotificationState.StaticNotificationState.RED_EXCLAMATION,
forceCount: false,
roomId: this.props.room.roomId
}));
} else if (this.notificationState) {
badge = /*#__PURE__*/_react.default.createElement("div", {
className: "mx_RoomTile_badgeContainer",
"aria-hidden": "true"
}, /*#__PURE__*/_react.default.createElement(_NotificationBadge.default, {
notification: this.notificationState,
forceCount: false,
roomId: this.props.room.roomId
}));
}
}
let messagePreview = null;
if (this.showMessagePreview && this.state.messagePreview) {
messagePreview = /*#__PURE__*/_react.default.createElement("div", {
className: "mx_RoomTile_messagePreview",
id: messagePreviewId(this.props.room.roomId),
title: this.state.messagePreview
}, this.state.messagePreview);
}
const nameClasses = (0, _classnames.default)({
"mx_RoomTile_name": true,
"mx_RoomTile_nameWithPreview": !!messagePreview,
"mx_RoomTile_nameHasUnreadEvents": this.notificationState.isUnread
});
let nameContainer = /*#__PURE__*/_react.default.createElement("div", {
className: "mx_RoomTile_nameContainer"
}, /*#__PURE__*/_react.default.createElement("div", {
title: name,
className: nameClasses,
tabIndex: -1,
dir: "auto"
}, name), messagePreview);
if (this.props.isMinimized) nameContainer = null;
let ariaLabel = name; // The following labels are written in such a fashion to increase screen reader efficiency (speed).
if (this.props.tag === _models.DefaultTagID.Invite) {// append nothing
} else if (this.notificationState.hasMentions) {
ariaLabel += " " + (0, _languageHandler._t)("%(count)s unread messages including mentions.", {
count: this.notificationState.count
});
} else if (this.notificationState.hasUnreadCount) {
ariaLabel += " " + (0, _languageHandler._t)("%(count)s unread messages.", {
count: this.notificationState.count
});
} else if (this.notificationState.isUnread) {
ariaLabel += " " + (0, _languageHandler._t)("Unread messages.");
}
let ariaDescribedBy
/*: string*/
;
if (this.showMessagePreview) {
ariaDescribedBy = messagePreviewId(this.props.room.roomId);
}
const props
/*: Partial<React.ComponentProps<typeof AccessibleTooltipButton>>*/
= {};
let Button
/*: React.ComponentType<React.ComponentProps<typeof AccessibleButton>>*/
= _AccessibleButton.default;
if (this.props.isMinimized) {
Button = _AccessibleTooltipButton.default;
props.title = name; // force the tooltip to hide whilst we are showing the context menu
props.forceHide = !!this.state.generalMenuPosition;
}
return /*#__PURE__*/_react.default.createElement(_react.default.Fragment, null, /*#__PURE__*/_react.default.createElement(_RovingTabIndex.RovingTabIndexWrapper, {
inputRef: this.roomTileRef
}, ({
onFocus,
isActive,
ref
}) => /*#__PURE__*/_react.default.createElement(Button, (0, _extends2.default)({}, props, {
onFocus: onFocus,
tabIndex: isActive ? 0 : -1,
inputRef: ref,
className: classes,
onClick: this.onTileClick,
onContextMenu: this.onContextMenu,
role: "treeitem",
"aria-label": ariaLabel,
"aria-selected": this.state.selected,
"aria-describedby": ariaDescribedBy
}), roomAvatar, nameContainer, badge, this.renderGeneralMenu(), this.renderNotificationsMenu(isActive))));
}
}, _temp)) || _class);
exports.default = RoomTile;
//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uL3NyYy9jb21wb25lbnRzL3ZpZXdzL3Jvb21zL1Jvb21UaWxlLnRzeCJdLCJuYW1lcyI6WyJtZXNzYWdlUHJldmlld0lkIiwicm9vbUlkIiwiY29udGV4dE1lbnVCZWxvdyIsImVsZW1lbnRSZWN0IiwibGVmdCIsIndpbmRvdyIsInBhZ2VYT2Zmc2V0IiwidG9wIiwiYm90dG9tIiwicGFnZVlPZmZzZXQiLCJjaGV2cm9uRmFjZSIsIkNoZXZyb25GYWNlIiwiTm9uZSIsIlJvb21UaWxlIiwiUmVhY3QiLCJQdXJlQ29tcG9uZW50IiwiY29uc3RydWN0b3IiLCJwcm9wcyIsInJvb20iLCJmb3JjZVVwZGF0ZSIsInNob3dNZXNzYWdlUHJldmlldyIsInN0YXRlIiwibWVzc2FnZVByZXZpZXciLCJnZW5lcmF0ZVByZXZpZXciLCJldiIsInNldFN0YXRlIiwiaGFzVW5zZW50RXZlbnRzIiwiY291bnRVbnNlbnRFdmVudHMiLCJwcm9wZXJ0eSIsIkNhY2hlZFJvb21LZXkiLCJOb3RpZmljYXRpb25Wb2x1bWUiLCJvbk5vdGlmaWNhdGlvblVwZGF0ZSIsInBheWxvYWQiLCJhY3Rpb24iLCJyb29tX2lkIiwic2hvd19yb29tX3RpbGUiLCJzZXRJbW1lZGlhdGUiLCJzY3JvbGxJbnRvVmlldyIsInJvb21UaWxlUmVmIiwiY3VycmVudCIsImJsb2NrIiwiYmVoYXZpb3IiLCJwcmV2ZW50RGVmYXVsdCIsInN0b3BQcm9wYWdhdGlvbiIsImRpcyIsImRpc3BhdGNoIiwiY2xlYXJfc2VhcmNoIiwia2V5IiwiS2V5IiwiRU5URVIiLCJTUEFDRSIsImlzQWN0aXZlIiwic2VsZWN0ZWQiLCJ0YXJnZXQiLCJub3RpZmljYXRpb25zTWVudVBvc2l0aW9uIiwiZ2V0Qm91bmRpbmdDbGllbnRSZWN0IiwiZ2VuZXJhbE1lbnVQb3NpdGlvbiIsInNob3dDb250ZXh0TWVudSIsImNsaWVudFgiLCJjbGllbnRZIiwidGFnSWQiLCJEZWZhdWx0VGFnSUQiLCJGYXZvdXJpdGUiLCJMb3dQcmlvcml0eSIsImludmVyc2VUYWciLCJpc0FwcGxpZWQiLCJSb29tTGlzdFN0b3JlIiwiaW5zdGFuY2UiLCJnZXRUYWdzRm9yUm9vbSIsImluY2x1ZGVzIiwicmVtb3ZlVGFnIiwiYWRkVGFnIiwiUm9vbUxpc3RBY3Rpb25zIiwidGFnUm9vbSIsIk1hdHJpeENsaWVudFBlZyIsImdldCIsInVuZGVmaW5lZCIsImNvbnNvbGUiLCJ3YXJuIiwic2F2ZU5vdGlmU3RhdGUiLCJBTExfTUVTU0FHRVMiLCJBTExfTUVTU0FHRVNfTE9VRCIsIk1FTlRJT05TX09OTFkiLCJNVVRFIiwiQWN0aXZlUm9vbU9ic2VydmVyIiwiYWN0aXZlUm9vbUlkIiwibm90aWZpY2F0aW9uU3RhdGUiLCJSb29tTm90aWZpY2F0aW9uU3RhdGVTdG9yZSIsImdldFJvb21TdGF0ZSIsInJvb21Qcm9wcyIsIkVjaG9DaGFtYmVyIiwiZm9yUm9vbSIsInJlc2l6ZU5vdGlmaWVyIiwib24iLCJvblJlc2l6ZSIsImxlbmd0aCIsInRhZyIsIkludml0ZSIsImlzTWluaW1pemVkIiwiY29tcG9uZW50RGlkVXBkYXRlIiwicHJldlByb3BzIiwicHJldlN0YXRlIiwiTWVzc2FnZVByZXZpZXdTdG9yZSIsIm9mZiIsImdldFByZXZpZXdDaGFuZ2VkRXZlbnROYW1lIiwib25Sb29tUHJldmlld0NoYW5nZWQiLCJDb21tdW5pdHlQcm90b3R5cGVTdG9yZSIsImdldFVwZGF0ZUV2ZW50TmFtZSIsIm9uQ29tbXVuaXR5VXBkYXRlIiwib25Sb29tTmFtZVVwZGF0ZSIsImNvbXBvbmVudERpZE1vdW50IiwiYWRkTGlzdGVuZXIiLCJvbkFjdGl2ZVJvb21VcGRhdGUiLCJkaXNwYXRjaGVyUmVmIiwiZGVmYXVsdERpc3BhdGNoZXIiLCJyZWdpc3RlciIsIm9uQWN0aW9uIiwiTk9USUZJQ0FUSU9OX1NUQVRFX1VQREFURSIsIlBST1BFUlRZX1VQREFURUQiLCJvblJvb21Qcm9wZXJ0eVVwZGF0ZSIsIm9uTG9jYWxFY2hvVXBkYXRlZCIsImNvbXBvbmVudFdpbGxVbm1vdW50IiwicmVtb3ZlTGlzdGVuZXIiLCJ1bnJlZ2lzdGVyIiwiZ2V0UHJldmlld0ZvclJvb20iLCJuZXdTdGF0ZSIsImlzR3Vlc3QiLCJub3RpZmljYXRpb25Wb2x1bWUiLCJyZW5kZXJOb3RpZmljYXRpb25zTWVudSIsIkFyY2hpdmVkIiwiY29udGV4dE1lbnUiLCJvbkNsb3NlTm90aWZpY2F0aW9uc01lbnUiLCJvbkNsaWNrQWxsTm90aWZzIiwib25DbGlja0FsZXJ0TWUiLCJvbkNsaWNrTWVudGlvbnMiLCJvbkNsaWNrTXV0ZSIsImNsYXNzZXMiLCJteF9Sb29tVGlsZV9pY29uQmVsbCIsIm14X1Jvb21UaWxlX2ljb25CZWxsRG90IiwibXhfUm9vbVRpbGVfaWNvbkJlbGxNZW50aW9ucyIsIm14X1Jvb21UaWxlX2ljb25CZWxsQ3Jvc3NlZCIsIm14X1Jvb21UaWxlX25vdGlmaWNhdGlvbnNCdXR0b25fc2hvdyIsIm9uTm90aWZpY2F0aW9uc01lbnVPcGVuQ2xpY2siLCJyZW5kZXJHZW5lcmFsTWVudSIsIm9uQ2xvc2VHZW5lcmFsTWVudSIsIm9uRm9yZ2V0Um9vbUNsaWNrIiwicm9vbVRhZ3MiLCJpc0Zhdm9yaXRlIiwiZmF2b3VyaXRlTGFiZWwiLCJpc0xvd1ByaW9yaXR5IiwibG93UHJpb3JpdHlMYWJlbCIsInVzZXJJZCIsImdldFVzZXJJZCIsImNhbkludml0ZSIsImUiLCJvblRhZ1Jvb20iLCJvbkludml0ZUNsaWNrIiwib25PcGVuUm9vbVNldHRpbmdzIiwib25MZWF2ZVJvb21DbGljayIsIm9uR2VuZXJhbE1lbnVPcGVuQ2xpY2siLCJyZW5kZXIiLCJyb29tUHJvZmlsZSIsImRpc3BsYXlOYW1lIiwiYXZhdGFyTXhjIiwiZ2V0SW52aXRlUHJvZmlsZSIsIm5hbWUiLCJyZXBsYWNlIiwicm9vbUF2YXRhciIsImF2YXRhclVybCIsImJhZGdlIiwiU3RhdGljTm90aWZpY2F0aW9uU3RhdGUiLCJSRURfRVhDTEFNQVRJT04iLCJuYW1lQ2xhc3NlcyIsImlzVW5yZWFkIiwibmFtZUNvbnRhaW5lciIsImFyaWFMYWJlbCIsImhhc01lbnRpb25zIiwiY291bnQiLCJoYXNVbnJlYWRDb3VudCIsImFyaWFEZXNjcmliZWRCeSIsIkJ1dHRvbiIsIkFjY2Vzc2libGVCdXR0b24iLCJBY2Nlc3NpYmxlVG9vbHRpcEJ1dHRvbiIsInRpdGxlIiwiZm9yY2VIaWRlIiwib25Gb2N1cyIsInJlZiIsIm9uVGlsZUNsaWNrIiwib25Db250ZXh0TWVudSJdLCJtYXBwaW5ncyI6Ijs7Ozs7Ozs7Ozs7Ozs7O0FBaUJBOztBQUdBOztBQUNBOztBQUNBOztBQUNBOztBQUVBOztBQUNBOztBQUNBOztBQUNBOztBQUNBOztBQUNBOztBQUNBOztBQUNBOztBQUNBOztBQUNBOztBQUVBOztBQUNBOztBQUVBOztBQUNBOztBQUNBOztBQUNBOztBQUNBOztBQUNBOztBQUNBOztBQU1BOztBQUNBOztBQUNBOztBQUNBOzs7O0FBcUJBLE1BQU1BLGdCQUFnQixHQUFHLENBQUNDO0FBQUQ7QUFBQSxLQUFxQiw4QkFBNkJBLE1BQU8sRUFBbEY7O0FBRUEsTUFBTUMsZ0JBQWdCLEdBQUcsQ0FBQ0M7QUFBRDtBQUFBLEtBQWlDO0FBQ3REO0FBQ0EsUUFBTUMsSUFBSSxHQUFHRCxXQUFXLENBQUNDLElBQVosR0FBbUJDLE1BQU0sQ0FBQ0MsV0FBMUIsR0FBd0MsQ0FBckQ7QUFDQSxRQUFNQyxHQUFHLEdBQUdKLFdBQVcsQ0FBQ0ssTUFBWixHQUFxQkgsTUFBTSxDQUFDSSxXQUE1QixHQUEwQyxFQUF0RDtBQUNBLFFBQU1DLFdBQVcsR0FBR0MseUJBQVlDLElBQWhDO0FBQ0EsU0FBTztBQUFDUixJQUFBQSxJQUFEO0FBQU9HLElBQUFBLEdBQVA7QUFBWUcsSUFBQUE7QUFBWixHQUFQO0FBQ0gsQ0FORDs7SUFTcUJHLFEsV0FEcEIsZ0RBQXFCLHNCQUFyQixDLHlCQUFELE1BQ3FCQSxRQURyQixTQUNzQ0MsZUFBTUM7QUFENUM7QUFDMEU7QUFNdEVDLEVBQUFBLFdBQVcsQ0FBQ0M7QUFBRDtBQUFBLElBQWdCO0FBQ3ZCLFVBQU1BLEtBQU47QUFEdUI7QUFBQSxvRUFKTCx1QkFJSztBQUFBO0FBQUE7QUFBQSw0REF5QkNDLElBQUQsSUFBVTtBQUNqQyxXQUFLQyxXQUFMO0FBQ0gsS0EzQjBCO0FBQUEsZ0VBNkJJLE1BQU07QUFDakMsV0FBS0EsV0FBTCxHQURpQyxDQUNiO0FBQ3ZCLEtBL0IwQjtBQUFBLG9EQWlDUixNQUFNO0FBQ3JCLFVBQUksS0FBS0Msa0JBQUwsSUFBMkIsQ0FBQyxLQUFLQyxLQUFMLENBQVdDLGNBQTNDLEVBQTJEO0FBQ3ZELGFBQUtDLGVBQUw7QUFDSDtBQUNKLEtBckMwQjtBQUFBLDhEQXVDRSxDQUFDQztBQUFEO0FBQUEsTUFBa0JOO0FBQWxCO0FBQUEsU0FBaUM7QUFDMUQsVUFBSSxDQUFDQSxJQUFJLEVBQUVqQixNQUFQLEtBQWtCLEtBQUtnQixLQUFMLENBQVdDLElBQVgsQ0FBZ0JqQixNQUF0QyxFQUE4QztBQUM5QyxXQUFLd0IsUUFBTCxDQUFjO0FBQUNDLFFBQUFBLGVBQWUsRUFBRSxLQUFLQyxpQkFBTCxLQUEyQjtBQUE3QyxPQUFkO0FBQ0gsS0ExQzBCO0FBQUEsZ0VBNENJLENBQUNDO0FBQUQ7QUFBQSxTQUE2QjtBQUN4RCxVQUFJQSxRQUFRLEtBQUtDLCtCQUFjQyxrQkFBL0IsRUFBbUQsS0FBS0Msb0JBQUwsR0FESyxDQUV4RDtBQUNILEtBL0MwQjtBQUFBLG9EQXFJUixDQUFDQztBQUFEO0FBQUEsU0FBNEI7QUFDM0MsVUFBSUEsT0FBTyxDQUFDQyxNQUFSLEtBQW1CLFdBQW5CLElBQWtDRCxPQUFPLENBQUNFLE9BQVIsS0FBb0IsS0FBS2pCLEtBQUwsQ0FBV0MsSUFBWCxDQUFnQmpCLE1BQXRFLElBQWdGK0IsT0FBTyxDQUFDRyxjQUE1RixFQUE0RztBQUN4R0MsUUFBQUEsWUFBWSxDQUFDLE1BQU07QUFDZixlQUFLQyxjQUFMO0FBQ0gsU0FGVyxDQUFaO0FBR0g7QUFDSixLQTNJMEI7QUFBQSw2REE2SUMsQ0FBQ3BDO0FBQUQ7QUFBQSxTQUFvQjtBQUM1QyxVQUFJQSxNQUFNLEtBQUssS0FBS2dCLEtBQUwsQ0FBV0MsSUFBWCxDQUFnQmpCLE1BQS9CLEVBQXVDO0FBQ3ZDLFdBQUtrQixXQUFMLEdBRjRDLENBRXhCO0FBQ3ZCLEtBaEowQjtBQUFBLGdFQWtKSSxDQUFDRDtBQUFEO0FBQUEsU0FBZ0I7QUFDM0MsVUFBSSxLQUFLRCxLQUFMLENBQVdDLElBQVgsSUFBbUJBLElBQUksQ0FBQ2pCLE1BQUwsS0FBZ0IsS0FBS2dCLEtBQUwsQ0FBV0MsSUFBWCxDQUFnQmpCLE1BQXZELEVBQStEO0FBQzNELGFBQUtzQixlQUFMO0FBQ0g7QUFDSixLQXRKMEI7QUFBQSwwREFpS0YsTUFBTTtBQUMzQixVQUFJLENBQUMsS0FBS2UsV0FBTCxDQUFpQkMsT0FBdEIsRUFBK0I7QUFDL0IsV0FBS0QsV0FBTCxDQUFpQkMsT0FBakIsQ0FBeUJGLGNBQXpCLENBQXdDO0FBQ3BDRyxRQUFBQSxLQUFLLEVBQUUsU0FENkI7QUFFcENDLFFBQUFBLFFBQVEsRUFBRTtBQUYwQixPQUF4QztBQUlILEtBdkswQjtBQUFBLHVEQXlLTCxDQUFDakI7QUFBRDtBQUFBLFNBQTZCO0FBQy9DQSxNQUFBQSxFQUFFLENBQUNrQixjQUFIO0FBQ0FsQixNQUFBQSxFQUFFLENBQUNtQixlQUFIOztBQUNBQywwQkFBSUMsUUFBSixDQUFhO0FBQ1RaLFFBQUFBLE1BQU0sRUFBRSxXQURDO0FBRVRFLFFBQUFBLGNBQWMsRUFBRSxJQUZQO0FBRWE7QUFDdEJELFFBQUFBLE9BQU8sRUFBRSxLQUFLakIsS0FBTCxDQUFXQyxJQUFYLENBQWdCakIsTUFIaEI7QUFJVDZDLFFBQUFBLFlBQVksRUFBR3RCLEVBQUUsS0FBS0EsRUFBRSxDQUFDdUIsR0FBSCxLQUFXQyxjQUFJQyxLQUFmLElBQXdCekIsRUFBRSxDQUFDdUIsR0FBSCxLQUFXQyxjQUFJRSxLQUE1QztBQUpSLE9BQWI7QUFNSCxLQWxMMEI7QUFBQSw4REFvTEUsQ0FBQ0M7QUFBRDtBQUFBLFNBQXVCO0FBQ2hELFdBQUsxQixRQUFMLENBQWM7QUFBQzJCLFFBQUFBLFFBQVEsRUFBRUQ7QUFBWCxPQUFkO0FBQ0gsS0F0TDBCO0FBQUEsd0VBd0xZLENBQUMzQjtBQUFEO0FBQUEsU0FBMEI7QUFDN0RBLE1BQUFBLEVBQUUsQ0FBQ2tCLGNBQUg7QUFDQWxCLE1BQUFBLEVBQUUsQ0FBQ21CLGVBQUg7QUFDQSxZQUFNVSxNQUFNLEdBQUc3QixFQUFFLENBQUM2QixNQUFsQjtBQUNBLFdBQUs1QixRQUFMLENBQWM7QUFBQzZCLFFBQUFBLHlCQUF5QixFQUFFRCxNQUFNLENBQUNFLHFCQUFQO0FBQTVCLE9BQWQ7QUFDSCxLQTdMMEI7QUFBQSxvRUErTFEsTUFBTTtBQUNyQyxXQUFLOUIsUUFBTCxDQUFjO0FBQUM2QixRQUFBQSx5QkFBeUIsRUFBRTtBQUE1QixPQUFkO0FBQ0gsS0FqTTBCO0FBQUEsa0VBbU1NLENBQUM5QjtBQUFEO0FBQUEsU0FBMEI7QUFDdkRBLE1BQUFBLEVBQUUsQ0FBQ2tCLGNBQUg7QUFDQWxCLE1BQUFBLEVBQUUsQ0FBQ21CLGVBQUg7QUFDQSxZQUFNVSxNQUFNLEdBQUc3QixFQUFFLENBQUM2QixNQUFsQjtBQUNBLFdBQUs1QixRQUFMLENBQWM7QUFBQytCLFFBQUFBLG1CQUFtQixFQUFFSCxNQUFNLENBQUNFLHFCQUFQO0FBQXRCLE9BQWQ7QUFDSCxLQXhNMEI7QUFBQSx5REEwTUgsQ0FBQy9CO0FBQUQ7QUFBQSxTQUEwQjtBQUM5QztBQUNBLFVBQUksQ0FBQyxLQUFLaUMsZUFBVixFQUEyQjtBQUUzQmpDLE1BQUFBLEVBQUUsQ0FBQ2tCLGNBQUg7QUFDQWxCLE1BQUFBLEVBQUUsQ0FBQ21CLGVBQUg7QUFDQSxXQUFLbEIsUUFBTCxDQUFjO0FBQ1YrQixRQUFBQSxtQkFBbUIsRUFBRTtBQUNqQnBELFVBQUFBLElBQUksRUFBRW9CLEVBQUUsQ0FBQ2tDLE9BRFE7QUFFakJsRCxVQUFBQSxNQUFNLEVBQUVnQixFQUFFLENBQUNtQztBQUZNO0FBRFgsT0FBZDtBQU1ILEtBdE4wQjtBQUFBLDhEQXdORSxNQUFNO0FBQy9CLFdBQUtsQyxRQUFMLENBQWM7QUFBQytCLFFBQUFBLG1CQUFtQixFQUFFO0FBQXRCLE9BQWQ7QUFDSCxLQTFOMEI7QUFBQSxxREE0TlAsQ0FBQ2hDO0FBQUQ7QUFBQSxNQUFrQm9DO0FBQWxCO0FBQUEsU0FBbUM7QUFDbkRwQyxNQUFBQSxFQUFFLENBQUNrQixjQUFIO0FBQ0FsQixNQUFBQSxFQUFFLENBQUNtQixlQUFIOztBQUVBLFVBQUlpQixLQUFLLEtBQUtDLHFCQUFhQyxTQUF2QixJQUFvQ0YsS0FBSyxLQUFLQyxxQkFBYUUsV0FBL0QsRUFBNEU7QUFDeEUsY0FBTUMsVUFBVSxHQUFHSixLQUFLLEtBQUtDLHFCQUFhQyxTQUF2QixHQUFtQ0QscUJBQWFFLFdBQWhELEdBQThERixxQkFBYUMsU0FBOUY7O0FBQ0EsY0FBTUcsU0FBUyxHQUFHQyx1QkFBY0MsUUFBZCxDQUF1QkMsY0FBdkIsQ0FBc0MsS0FBS25ELEtBQUwsQ0FBV0MsSUFBakQsRUFBdURtRCxRQUF2RCxDQUFnRVQsS0FBaEUsQ0FBbEI7O0FBQ0EsY0FBTVUsU0FBUyxHQUFHTCxTQUFTLEdBQUdMLEtBQUgsR0FBV0ksVUFBdEM7QUFDQSxjQUFNTyxNQUFNLEdBQUdOLFNBQVMsR0FBRyxJQUFILEdBQVVMLEtBQWxDOztBQUNBaEIsNEJBQUlDLFFBQUosQ0FBYTJCLHlCQUFnQkMsT0FBaEIsQ0FDVEMsaUNBQWdCQyxHQUFoQixFQURTLEVBRVQsS0FBSzFELEtBQUwsQ0FBV0MsSUFGRixFQUdUb0QsU0FIUyxFQUlUQyxNQUpTLEVBS1RLLFNBTFMsRUFNVCxDQU5TLENBQWI7QUFRSCxPQWJELE1BYU87QUFDSEMsUUFBQUEsT0FBTyxDQUFDQyxJQUFSLENBQWMsa0JBQWlCbEIsS0FBTSxlQUFjLEtBQUszQyxLQUFMLENBQVdDLElBQVgsQ0FBZ0JnQixPQUFRLEVBQTNFO0FBQ0g7O0FBRUQsVUFBS1YsRUFBRCxDQUE0QnVCLEdBQTVCLEtBQW9DQyxjQUFJQyxLQUE1QyxFQUFtRDtBQUMvQztBQUNBLGFBQUt4QixRQUFMLENBQWM7QUFBQytCLFVBQUFBLG1CQUFtQixFQUFFO0FBQXRCLFNBQWQsRUFGK0MsQ0FFSDtBQUMvQztBQUNKLEtBclAwQjtBQUFBLDREQXVQQSxDQUFDaEM7QUFBRDtBQUFBLFNBQXFCO0FBQzVDQSxNQUFBQSxFQUFFLENBQUNrQixjQUFIO0FBQ0FsQixNQUFBQSxFQUFFLENBQUNtQixlQUFIOztBQUVBQywwQkFBSUMsUUFBSixDQUFhO0FBQ1RaLFFBQUFBLE1BQU0sRUFBRSxZQURDO0FBRVRDLFFBQUFBLE9BQU8sRUFBRSxLQUFLakIsS0FBTCxDQUFXQyxJQUFYLENBQWdCakI7QUFGaEIsT0FBYjs7QUFJQSxXQUFLd0IsUUFBTCxDQUFjO0FBQUMrQixRQUFBQSxtQkFBbUIsRUFBRTtBQUF0QixPQUFkLEVBUjRDLENBUUE7QUFDL0MsS0FoUTBCO0FBQUEsNkRBa1FDLENBQUNoQztBQUFEO0FBQUEsU0FBcUI7QUFDN0NBLE1BQUFBLEVBQUUsQ0FBQ2tCLGNBQUg7QUFDQWxCLE1BQUFBLEVBQUUsQ0FBQ21CLGVBQUg7O0FBRUFDLDBCQUFJQyxRQUFKLENBQWE7QUFDVFosUUFBQUEsTUFBTSxFQUFFLGFBREM7QUFFVEMsUUFBQUEsT0FBTyxFQUFFLEtBQUtqQixLQUFMLENBQVdDLElBQVgsQ0FBZ0JqQjtBQUZoQixPQUFiOztBQUlBLFdBQUt3QixRQUFMLENBQWM7QUFBQytCLFFBQUFBLG1CQUFtQixFQUFFO0FBQXRCLE9BQWQsRUFSNkMsQ0FRRDtBQUMvQyxLQTNRMEI7QUFBQSw4REE2UUUsQ0FBQ2hDO0FBQUQ7QUFBQSxTQUFxQjtBQUM5Q0EsTUFBQUEsRUFBRSxDQUFDa0IsY0FBSDtBQUNBbEIsTUFBQUEsRUFBRSxDQUFDbUIsZUFBSDs7QUFFQUMsMEJBQUlDLFFBQUosQ0FBYTtBQUNUWixRQUFBQSxNQUFNLEVBQUUsb0JBREM7QUFFVEMsUUFBQUEsT0FBTyxFQUFFLEtBQUtqQixLQUFMLENBQVdDLElBQVgsQ0FBZ0JqQjtBQUZoQixPQUFiOztBQUlBLFdBQUt3QixRQUFMLENBQWM7QUFBQytCLFFBQUFBLG1CQUFtQixFQUFFO0FBQXRCLE9BQWQsRUFSOEMsQ0FRRjtBQUMvQyxLQXRSMEI7QUFBQSx5REF3UkgsQ0FBQ2hDO0FBQUQ7QUFBQSxTQUFxQjtBQUN6Q0EsTUFBQUEsRUFBRSxDQUFDa0IsY0FBSDtBQUNBbEIsTUFBQUEsRUFBRSxDQUFDbUIsZUFBSDs7QUFFQUMsMEJBQUlDLFFBQUosQ0FBYTtBQUNUWixRQUFBQSxNQUFNLEVBQUUsYUFEQztBQUVUaEMsUUFBQUEsTUFBTSxFQUFFLEtBQUtnQixLQUFMLENBQVdDLElBQVgsQ0FBZ0JqQjtBQUZmLE9BQWI7O0FBSUEsV0FBS3dCLFFBQUwsQ0FBYztBQUFDK0IsUUFBQUEsbUJBQW1CLEVBQUU7QUFBdEIsT0FBZCxFQVJ5QyxDQVFHO0FBQy9DLEtBalMwQjtBQUFBLDREQWlUQWhDLEVBQUUsSUFBSSxLQUFLdUQsY0FBTCxDQUFvQnZELEVBQXBCLEVBQXdCd0Qsd0JBQXhCLENBalROO0FBQUEsMERBa1RGeEQsRUFBRSxJQUFJLEtBQUt1RCxjQUFMLENBQW9CdkQsRUFBcEIsRUFBd0J5RCw2QkFBeEIsQ0FsVEo7QUFBQSwyREFtVER6RCxFQUFFLElBQUksS0FBS3VELGNBQUwsQ0FBb0J2RCxFQUFwQixFQUF3QjBELHlCQUF4QixDQW5UTDtBQUFBLHVEQW9UTDFELEVBQUUsSUFBSSxLQUFLdUQsY0FBTCxDQUFvQnZELEVBQXBCLEVBQXdCMkQsZ0JBQXhCLENBcFREO0FBR3ZCLFNBQUs5RCxLQUFMLEdBQWE7QUFDVCtCLE1BQUFBLFFBQVEsRUFBRWdDLDRCQUFtQkMsWUFBbkIsS0FBb0MsS0FBS3BFLEtBQUwsQ0FBV0MsSUFBWCxDQUFnQmpCLE1BRHJEO0FBRVRxRCxNQUFBQSx5QkFBeUIsRUFBRSxJQUZsQjtBQUdURSxNQUFBQSxtQkFBbUIsRUFBRSxJQUhaO0FBSVQ5QixNQUFBQSxlQUFlLEVBQUUsS0FBS0MsaUJBQUwsS0FBMkIsQ0FKbkM7QUFNVDtBQUNBTCxNQUFBQSxjQUFjLEVBQUU7QUFQUCxLQUFiO0FBU0EsU0FBS0MsZUFBTDtBQUVBLFNBQUsrRCxpQkFBTCxHQUF5QkMsdURBQTJCcEIsUUFBM0IsQ0FBb0NxQixZQUFwQyxDQUFpRCxLQUFLdkUsS0FBTCxDQUFXQyxJQUE1RCxDQUF6QjtBQUNBLFNBQUt1RSxTQUFMLEdBQWlCQyx5QkFBWUMsT0FBWixDQUFvQixLQUFLMUUsS0FBTCxDQUFXQyxJQUEvQixDQUFqQjs7QUFDQSxRQUFJLEtBQUtELEtBQUwsQ0FBVzJFLGNBQWYsRUFBK0I7QUFDM0IsV0FBSzNFLEtBQUwsQ0FBVzJFLGNBQVgsQ0FBMEJDLEVBQTFCLENBQTZCLG9CQUE3QixFQUFtRCxLQUFLQyxRQUF4RDtBQUNIO0FBQ0o7O0FBRU9uRSxFQUFBQSxpQkFBUjtBQUFBO0FBQW9DO0FBQ2hDLFdBQU8sc0NBQWtCLEtBQUtWLEtBQUwsQ0FBV0MsSUFBN0IsRUFBbUM2RSxNQUExQztBQUNIOztBQTBCRCxNQUFZdEMsZUFBWjtBQUFBO0FBQXVDO0FBQ25DLFdBQU8sS0FBS3hDLEtBQUwsQ0FBVytFLEdBQVgsS0FBbUJuQyxxQkFBYW9DLE1BQXZDO0FBQ0g7O0FBRUQsTUFBWTdFLGtCQUFaO0FBQUE7QUFBMEM7QUFDdEMsV0FBTyxDQUFDLEtBQUtILEtBQUwsQ0FBV2lGLFdBQVosSUFBMkIsS0FBS2pGLEtBQUwsQ0FBV0csa0JBQTdDO0FBQ0g7O0FBRU0rRSxFQUFBQSxrQkFBUCxDQUEwQkM7QUFBMUI7QUFBQSxJQUF1REM7QUFBdkQ7QUFBQSxJQUFvRjtBQUNoRixRQUFJRCxTQUFTLENBQUNoRixrQkFBVixLQUFpQyxLQUFLSCxLQUFMLENBQVdHLGtCQUE1QyxJQUFrRSxLQUFLQSxrQkFBM0UsRUFBK0Y7QUFDM0YsV0FBS0csZUFBTDtBQUNIOztBQUNELFFBQUk2RSxTQUFTLENBQUNsRixJQUFWLEVBQWdCakIsTUFBaEIsS0FBMkIsS0FBS2dCLEtBQUwsQ0FBV0MsSUFBWCxFQUFpQmpCLE1BQWhELEVBQXdEO0FBQ3BEcUcsK0NBQW9CbkMsUUFBcEIsQ0FBNkJvQyxHQUE3QixDQUNJRCx5Q0FBb0JFLDBCQUFwQixDQUErQ0osU0FBUyxDQUFDbEYsSUFBekQsQ0FESixFQUVJLEtBQUt1RixvQkFGVDs7QUFJQUgsK0NBQW9CbkMsUUFBcEIsQ0FBNkIwQixFQUE3QixDQUNJUyx5Q0FBb0JFLDBCQUFwQixDQUErQyxLQUFLdkYsS0FBTCxDQUFXQyxJQUExRCxDQURKLEVBRUksS0FBS3VGLG9CQUZUOztBQUlBQyx1REFBd0J2QyxRQUF4QixDQUFpQ29DLEdBQWpDLENBQ0lHLGlEQUF3QkMsa0JBQXhCLENBQTJDUCxTQUFTLENBQUNsRixJQUFWLEVBQWdCakIsTUFBM0QsQ0FESixFQUVJLEtBQUsyRyxpQkFGVDs7QUFJQUYsdURBQXdCdkMsUUFBeEIsQ0FBaUMwQixFQUFqQyxDQUNJYSxpREFBd0JDLGtCQUF4QixDQUEyQyxLQUFLMUYsS0FBTCxDQUFXQyxJQUFYLEVBQWlCakIsTUFBNUQsQ0FESixFQUVJLEtBQUsyRyxpQkFGVDs7QUFJQVIsTUFBQUEsU0FBUyxDQUFDbEYsSUFBVixFQUFnQnFGLEdBQWhCLENBQW9CLFdBQXBCLEVBQWlDLEtBQUtNLGdCQUF0QztBQUNBLFdBQUs1RixLQUFMLENBQVdDLElBQVgsRUFBaUIyRSxFQUFqQixDQUFvQixXQUFwQixFQUFpQyxLQUFLZ0IsZ0JBQXRDO0FBQ0g7QUFDSjs7QUFFTUMsRUFBQUEsaUJBQVAsR0FBMkI7QUFDdkI7QUFDQSxRQUFJLEtBQUt6RixLQUFMLENBQVcrQixRQUFmLEVBQXlCO0FBQ3JCLFdBQUtmLGNBQUw7QUFDSDs7QUFFRCtDLGdDQUFtQjJCLFdBQW5CLENBQStCLEtBQUs5RixLQUFMLENBQVdDLElBQVgsQ0FBZ0JqQixNQUEvQyxFQUF1RCxLQUFLK0csa0JBQTVEOztBQUNBLFNBQUtDLGFBQUwsR0FBcUJDLG9CQUFrQkMsUUFBbEIsQ0FBMkIsS0FBS0MsUUFBaEMsQ0FBckI7O0FBQ0FkLDZDQUFvQm5DLFFBQXBCLENBQTZCMEIsRUFBN0IsQ0FDSVMseUNBQW9CRSwwQkFBcEIsQ0FBK0MsS0FBS3ZGLEtBQUwsQ0FBV0MsSUFBMUQsQ0FESixFQUVJLEtBQUt1RixvQkFGVDs7QUFJQSxTQUFLbkIsaUJBQUwsQ0FBdUJPLEVBQXZCLENBQTBCd0IsNENBQTFCLEVBQXFELEtBQUt0RixvQkFBMUQ7QUFDQSxTQUFLMEQsU0FBTCxDQUFlSSxFQUFmLENBQWtCeUIsb0NBQWxCLEVBQW9DLEtBQUtDLG9CQUF6QztBQUNBLFNBQUs5QixTQUFMLENBQWVJLEVBQWYsQ0FBa0IsV0FBbEIsRUFBK0IsS0FBS2dCLGdCQUFwQzs7QUFDQUgscURBQXdCdkMsUUFBeEIsQ0FBaUMwQixFQUFqQyxDQUNJYSxpREFBd0JDLGtCQUF4QixDQUEyQyxLQUFLMUYsS0FBTCxDQUFXQyxJQUFYLENBQWdCakIsTUFBM0QsQ0FESixFQUVJLEtBQUsyRyxpQkFGVDs7QUFJQWxDLHFDQUFnQkMsR0FBaEIsR0FBc0JrQixFQUF0QixDQUF5Qix1QkFBekIsRUFBa0QsS0FBSzJCLGtCQUF2RDtBQUNIOztBQUVNQyxFQUFBQSxvQkFBUCxHQUE4QjtBQUMxQixRQUFJLEtBQUt4RyxLQUFMLENBQVdDLElBQWYsRUFBcUI7QUFDakJrRSxrQ0FBbUJzQyxjQUFuQixDQUFrQyxLQUFLekcsS0FBTCxDQUFXQyxJQUFYLENBQWdCakIsTUFBbEQsRUFBMEQsS0FBSytHLGtCQUEvRDs7QUFDQVYsK0NBQW9CbkMsUUFBcEIsQ0FBNkJvQyxHQUE3QixDQUNJRCx5Q0FBb0JFLDBCQUFwQixDQUErQyxLQUFLdkYsS0FBTCxDQUFXQyxJQUExRCxDQURKLEVBRUksS0FBS3VGLG9CQUZUOztBQUlBQyx1REFBd0J2QyxRQUF4QixDQUFpQ29DLEdBQWpDLENBQ0lHLGlEQUF3QkMsa0JBQXhCLENBQTJDLEtBQUsxRixLQUFMLENBQVdDLElBQVgsQ0FBZ0JqQixNQUEzRCxDQURKLEVBRUksS0FBSzJHLGlCQUZUOztBQUlBLFdBQUszRixLQUFMLENBQVdDLElBQVgsQ0FBZ0JxRixHQUFoQixDQUFvQixXQUFwQixFQUFpQyxLQUFLTSxnQkFBdEM7QUFDSDs7QUFDRCxRQUFJLEtBQUs1RixLQUFMLENBQVcyRSxjQUFmLEVBQStCO0FBQzNCLFdBQUszRSxLQUFMLENBQVcyRSxjQUFYLENBQTBCVyxHQUExQixDQUE4QixvQkFBOUIsRUFBb0QsS0FBS1QsUUFBekQ7QUFDSDs7QUFDRFYsZ0NBQW1Cc0MsY0FBbkIsQ0FBa0MsS0FBS3pHLEtBQUwsQ0FBV0MsSUFBWCxDQUFnQmpCLE1BQWxELEVBQTBELEtBQUsrRyxrQkFBL0Q7O0FBQ0FFLHdCQUFrQlMsVUFBbEIsQ0FBNkIsS0FBS1YsYUFBbEM7O0FBQ0EsU0FBSzNCLGlCQUFMLENBQXVCaUIsR0FBdkIsQ0FBMkJjLDRDQUEzQixFQUFzRCxLQUFLdEYsb0JBQTNEO0FBQ0EsU0FBSzBELFNBQUwsQ0FBZWMsR0FBZixDQUFtQmUsb0NBQW5CLEVBQXFDLEtBQUtDLG9CQUExQztBQUNBLFNBQUs5QixTQUFMLENBQWVjLEdBQWYsQ0FBbUIsV0FBbkIsRUFBZ0MsS0FBS00sZ0JBQXJDOztBQUNBSCxxREFBd0J2QyxRQUF4QixDQUFpQ29DLEdBQWpDLENBQ0lHLGlEQUF3QkMsa0JBQXhCLENBQTJDLEtBQUsxRixLQUFMLENBQVdDLElBQVgsQ0FBZ0JqQixNQUEzRCxDQURKLEVBRUksS0FBSzJHLGlCQUZUOztBQUlBbEMscUNBQWdCQyxHQUFoQixJQUF1QitDLGNBQXZCLENBQXNDLHVCQUF0QyxFQUErRCxLQUFLRixrQkFBcEU7QUFDSDs7QUFxQkQsUUFBY2pHLGVBQWQsR0FBZ0M7QUFDNUIsUUFBSSxDQUFDLEtBQUtILGtCQUFWLEVBQThCO0FBQzFCLGFBQU8sSUFBUDtBQUNIOztBQUVELFVBQU1FLGNBQWMsR0FBRyxNQUFNZ0YseUNBQW9CbkMsUUFBcEIsQ0FBNkJ5RCxpQkFBN0IsQ0FBK0MsS0FBSzNHLEtBQUwsQ0FBV0MsSUFBMUQsRUFBZ0UsS0FBS0QsS0FBTCxDQUFXK0UsR0FBM0UsQ0FBN0I7QUFDQSxTQUFLdkUsUUFBTCxDQUFjO0FBQUVILE1BQUFBO0FBQUYsS0FBZDtBQUNIOztBQW9JRCxRQUFjeUQsY0FBZCxDQUE2QnZEO0FBQTdCO0FBQUEsSUFBOENxRztBQUE5QztBQUFBLElBQWdFO0FBQzVEckcsSUFBQUEsRUFBRSxDQUFDa0IsY0FBSDtBQUNBbEIsSUFBQUEsRUFBRSxDQUFDbUIsZUFBSDtBQUNBLFFBQUkrQixpQ0FBZ0JDLEdBQWhCLEdBQXNCbUQsT0FBdEIsRUFBSixFQUFxQztBQUVyQyxTQUFLckMsU0FBTCxDQUFlc0Msa0JBQWYsR0FBb0NGLFFBQXBDO0FBRUEsVUFBTTlFLEdBQUcsR0FBSXZCLEVBQUQsQ0FBNEJ1QixHQUF4Qzs7QUFDQSxRQUFJQSxHQUFHLEtBQUtDLGNBQUlDLEtBQWhCLEVBQXVCO0FBQ25CO0FBQ0EsV0FBS3hCLFFBQUwsQ0FBYztBQUFDNkIsUUFBQUEseUJBQXlCLEVBQUU7QUFBNUIsT0FBZCxFQUZtQixDQUUrQjtBQUNyRDtBQUNKOztBQU9PMEUsRUFBQUEsdUJBQVIsQ0FBZ0M3RTtBQUFoQztBQUFBO0FBQUE7QUFBdUU7QUFDbkUsUUFBSXVCLGlDQUFnQkMsR0FBaEIsR0FBc0JtRCxPQUF0QixNQUFtQyxLQUFLN0csS0FBTCxDQUFXK0UsR0FBWCxLQUFtQm5DLHFCQUFhb0UsUUFBbkUsSUFDQSxDQUFDLEtBQUt4RSxlQUROLElBQ3lCLEtBQUt4QyxLQUFMLENBQVdpRixXQUR4QyxFQUVFO0FBQ0U7QUFDQSxhQUFPLElBQVA7QUFDSDs7QUFFRCxVQUFNN0UsS0FBSyxHQUFHLEtBQUtvRSxTQUFMLENBQWVzQyxrQkFBN0I7QUFFQSxRQUFJRyxXQUFXLEdBQUcsSUFBbEI7O0FBQ0EsUUFBSSxLQUFLN0csS0FBTCxDQUFXaUMseUJBQWYsRUFBMEM7QUFDdEM0RSxNQUFBQSxXQUFXLGdCQUFHLDZCQUFDLDRCQUFELDZCQUNOaEksZ0JBQWdCLENBQUMsS0FBS21CLEtBQUwsQ0FBV2lDLHlCQUFaLENBRFY7QUFFVixRQUFBLFVBQVUsRUFBRSxLQUFLNkUsd0JBRlA7QUFHVixRQUFBLFNBQVMsRUFBQyx5QkFIQTtBQUlWLFFBQUEsT0FBTztBQUpHLHVCQU1WLDZCQUFDLGtEQUFEO0FBQStCLFFBQUEsS0FBSztBQUFwQyxzQkFDSSw2QkFBQyw2Q0FBRDtBQUNJLFFBQUEsS0FBSyxFQUFFLHlCQUFHLGFBQUgsQ0FEWDtBQUVJLFFBQUEsTUFBTSxFQUFFOUcsS0FBSyxLQUFLMkQsd0JBRnRCO0FBR0ksUUFBQSxhQUFhLEVBQUMsc0JBSGxCO0FBSUksUUFBQSxPQUFPLEVBQUUsS0FBS29EO0FBSmxCLFFBREosZUFPSSw2QkFBQyw2Q0FBRDtBQUNJLFFBQUEsS0FBSyxFQUFFLHlCQUFHLGNBQUgsQ0FEWDtBQUVJLFFBQUEsTUFBTSxFQUFFL0csS0FBSyxLQUFLNEQsNkJBRnRCO0FBR0ksUUFBQSxhQUFhLEVBQUMseUJBSGxCO0FBSUksUUFBQSxPQUFPLEVBQUUsS0FBS29EO0FBSmxCLFFBUEosZUFhSSw2QkFBQyw2Q0FBRDtBQUNJLFFBQUEsS0FBSyxFQUFFLHlCQUFHLHFCQUFILENBRFg7QUFFSSxRQUFBLE1BQU0sRUFBRWhILEtBQUssS0FBSzZELHlCQUZ0QjtBQUdJLFFBQUEsYUFBYSxFQUFDLDhCQUhsQjtBQUlJLFFBQUEsT0FBTyxFQUFFLEtBQUtvRDtBQUpsQixRQWJKLGVBbUJJLDZCQUFDLDZDQUFEO0FBQ0ksUUFBQSxLQUFLLEVBQUUseUJBQUcsTUFBSCxDQURYO0FBRUksUUFBQSxNQUFNLEVBQUVqSCxLQUFLLEtBQUs4RCxnQkFGdEI7QUFHSSxRQUFBLGFBQWEsRUFBQyw2QkFIbEI7QUFJSSxRQUFBLE9BQU8sRUFBRSxLQUFLb0Q7QUFKbEIsUUFuQkosQ0FOVSxDQUFkO0FBaUNIOztBQUVELFVBQU1DLE9BQU8sR0FBRyx5QkFBVyxpQ0FBWCxFQUE4QztBQUMxRDtBQUNBQyxNQUFBQSxvQkFBb0IsRUFBRXBILEtBQUssS0FBSzJELHdCQUYwQjtBQUcxRDBELE1BQUFBLHVCQUF1QixFQUFFckgsS0FBSyxLQUFLNEQsNkJBSHVCO0FBSTFEMEQsTUFBQUEsNEJBQTRCLEVBQUV0SCxLQUFLLEtBQUs2RCx5QkFKa0I7QUFLMUQwRCxNQUFBQSwyQkFBMkIsRUFBRXZILEtBQUssS0FBSzhELGdCQUxtQjtBQU8xRDtBQUNBO0FBQ0EwRCxNQUFBQSxvQ0FBb0MsRUFBRXhILEtBQUssS0FBSzhEO0FBVFUsS0FBOUMsQ0FBaEI7QUFZQSx3QkFDSSw2QkFBQyxjQUFELENBQU8sUUFBUCxxQkFDSSw2QkFBQyxxQ0FBRDtBQUNJLE1BQUEsU0FBUyxFQUFFcUQsT0FEZjtBQUVJLE1BQUEsT0FBTyxFQUFFLEtBQUtNLDRCQUZsQjtBQUdJLE1BQUEsS0FBSyxFQUFFLHlCQUFHLHNCQUFILENBSFg7QUFJSSxNQUFBLFVBQVUsRUFBRSxDQUFDLENBQUMsS0FBS3pILEtBQUwsQ0FBV2lDLHlCQUo3QjtBQUtJLE1BQUEsUUFBUSxFQUFFSCxRQUFRLEdBQUcsQ0FBSCxHQUFPLENBQUM7QUFMOUIsTUFESixFQVFLK0UsV0FSTCxDQURKO0FBWUg7O0FBRU9hLEVBQUFBLGlCQUFSO0FBQUE7QUFBZ0Q7QUFDNUMsUUFBSSxDQUFDLEtBQUt0RixlQUFWLEVBQTJCLE9BQU8sSUFBUCxDQURpQixDQUNKOztBQUV4QyxRQUFJeUUsV0FBVyxHQUFHLElBQWxCOztBQUNBLFFBQUksS0FBSzdHLEtBQUwsQ0FBV21DLG1CQUFYLElBQWtDLEtBQUt2QyxLQUFMLENBQVcrRSxHQUFYLEtBQW1CbkMscUJBQWFvRSxRQUF0RSxFQUFnRjtBQUM1RUMsTUFBQUEsV0FBVyxnQkFBRyw2QkFBQyw0QkFBRCw2QkFDTmhJLGdCQUFnQixDQUFDLEtBQUttQixLQUFMLENBQVdtQyxtQkFBWixDQURWO0FBRVYsUUFBQSxVQUFVLEVBQUUsS0FBS3dGLGtCQUZQO0FBR1YsUUFBQSxTQUFTLEVBQUMseUJBSEE7QUFJVixRQUFBLE9BQU87QUFKRyx1QkFNViw2QkFBQyxrREFBRDtBQUErQixRQUFBLEdBQUc7QUFBbEMsc0JBQ0ksNkJBQUMsOENBQUQ7QUFDSSxRQUFBLGFBQWEsRUFBQyx5QkFEbEI7QUFFSSxRQUFBLEtBQUssRUFBRSx5QkFBRyxhQUFILENBRlg7QUFHSSxRQUFBLE9BQU8sRUFBRSxLQUFLQztBQUhsQixRQURKLENBTlUsQ0FBZDtBQWNILEtBZkQsTUFlTyxJQUFJLEtBQUs1SCxLQUFMLENBQVdtQyxtQkFBZixFQUFvQztBQUN2QyxZQUFNMEYsUUFBUSxHQUFHaEYsdUJBQWNDLFFBQWQsQ0FBdUJDLGNBQXZCLENBQXNDLEtBQUtuRCxLQUFMLENBQVdDLElBQWpELENBQWpCOztBQUVBLFlBQU1pSSxVQUFVLEdBQUdELFFBQVEsQ0FBQzdFLFFBQVQsQ0FBa0JSLHFCQUFhQyxTQUEvQixDQUFuQjtBQUNBLFlBQU1zRixjQUFjLEdBQUdELFVBQVUsR0FBRyx5QkFBRyxZQUFILENBQUgsR0FBc0IseUJBQUcsV0FBSCxDQUF2RDtBQUVBLFlBQU1FLGFBQWEsR0FBR0gsUUFBUSxDQUFDN0UsUUFBVCxDQUFrQlIscUJBQWFFLFdBQS9CLENBQXRCO0FBQ0EsWUFBTXVGLGdCQUFnQixHQUFHLHlCQUFHLGNBQUgsQ0FBekI7O0FBRUEsWUFBTUMsTUFBTSxHQUFHN0UsaUNBQWdCQyxHQUFoQixHQUFzQjZFLFNBQXRCLEVBQWY7O0FBQ0EsWUFBTUMsU0FBUyxHQUFHLEtBQUt4SSxLQUFMLENBQVdDLElBQVgsQ0FBZ0J1SSxTQUFoQixDQUEwQkYsTUFBMUIsQ0FBbEI7QUFDQXJCLE1BQUFBLFdBQVcsZ0JBQUcsNkJBQUMsNEJBQUQsNkJBQ05oSSxnQkFBZ0IsQ0FBQyxLQUFLbUIsS0FBTCxDQUFXbUMsbUJBQVosQ0FEVjtBQUVWLFFBQUEsVUFBVSxFQUFFLEtBQUt3RixrQkFGUDtBQUdWLFFBQUEsU0FBUyxFQUFDLHlCQUhBO0FBSVYsUUFBQSxPQUFPO0FBSkcsdUJBTVYsNkJBQUMsa0RBQUQscUJBQ0ksNkJBQUMsZ0RBQUQ7QUFDSSxRQUFBLE9BQU8sRUFBR1UsQ0FBRCxJQUFPLEtBQUtDLFNBQUwsQ0FBZUQsQ0FBZixFQUFrQjdGLHFCQUFhQyxTQUEvQixDQURwQjtBQUVJLFFBQUEsTUFBTSxFQUFFcUYsVUFGWjtBQUdJLFFBQUEsS0FBSyxFQUFFQyxjQUhYO0FBSUksUUFBQSxhQUFhLEVBQUM7QUFKbEIsUUFESixlQU9JLDZCQUFDLGdEQUFEO0FBQ0ksUUFBQSxPQUFPLEVBQUdNLENBQUQsSUF