UNPKG

matrix-react-sdk

Version:
685 lines (573 loc) 81.2 kB
"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 _propTypes = _interopRequireDefault(require("prop-types")); var sdk = _interopRequireWildcard(require("../../../index")); var _MatrixClientPeg = require("../../../MatrixClientPeg"); var _dispatcher = _interopRequireDefault(require("../../../dispatcher/dispatcher")); var _classnames = _interopRequireDefault(require("classnames")); var _languageHandler = require("../../../languageHandler"); var _SdkConfig = _interopRequireDefault(require("../../../SdkConfig")); var _IdentityAuthClient = _interopRequireDefault(require("../../../IdentityAuthClient")); var _CommunityPrototypeStore = require("../../../stores/CommunityPrototypeStore"); var _AsyncStore = require("../../../stores/AsyncStore"); var _replaceableComponent = require("../../../utils/replaceableComponent"); var _InviteReason = _interopRequireDefault(require("../elements/InviteReason")); var _dec, _class, _class2, _temp; const MessageCase = Object.freeze({ NotLoggedIn: "NotLoggedIn", Joining: "Joining", Loading: "Loading", Rejecting: "Rejecting", Kicked: "Kicked", Banned: "Banned", OtherThreePIDError: "OtherThreePIDError", InvitedEmailNotFoundInAccount: "InvitedEmailNotFoundInAccount", InvitedEmailNoIdentityServer: "InvitedEmailNoIdentityServer", InvitedEmailMismatch: "InvitedEmailMismatch", Invite: "Invite", ViewingRoom: "ViewingRoom", RoomNotFound: "RoomNotFound", OtherError: "OtherError" }); let RoomPreviewBar = (_dec = (0, _replaceableComponent.replaceableComponent)("views.rooms.RoomPreviewBar"), _dec(_class = (_temp = _class2 = class RoomPreviewBar extends _react.default.Component { constructor(...args) { super(...args); (0, _defineProperty2.default)(this, "state", { busy: false }); (0, _defineProperty2.default)(this, "_onCommunityUpdate", roomId => { if (this.props.room && this.props.room.roomId !== roomId) { return; } this.forceUpdate(); // we have nothing to update }); (0, _defineProperty2.default)(this, "onLoginClick", () => { _dispatcher.default.dispatch({ action: 'start_login', screenAfterLogin: this._makeScreenAfterLogin() }); }); (0, _defineProperty2.default)(this, "onRegisterClick", () => { _dispatcher.default.dispatch({ action: 'start_registration', screenAfterLogin: this._makeScreenAfterLogin() }); }); } componentDidMount() { this._checkInvitedEmail(); _CommunityPrototypeStore.CommunityPrototypeStore.instance.on(_AsyncStore.UPDATE_EVENT, this._onCommunityUpdate); } componentDidUpdate(prevProps, prevState) { if (this.props.invitedEmail !== prevProps.invitedEmail || this.props.inviterName !== prevProps.inviterName) { this._checkInvitedEmail(); } } componentWillUnmount() { _CommunityPrototypeStore.CommunityPrototypeStore.instance.off(_AsyncStore.UPDATE_EVENT, this._onCommunityUpdate); } async _checkInvitedEmail() { // If this is an invite and we've been told what email address was // invited, fetch the user's account emails and discovery bindings so we // can check them against the email that was invited. if (this.props.inviterName && this.props.invitedEmail) { this.setState({ busy: true }); try { // Gather the account 3PIDs const account3pids = await _MatrixClientPeg.MatrixClientPeg.get().getThreePids(); this.setState({ accountEmails: account3pids.threepids.filter(b => b.medium === 'email').map(b => b.address) }); // If we have an IS connected, use that to lookup the email and // check the bound MXID. if (!_MatrixClientPeg.MatrixClientPeg.get().getIdentityServerUrl()) { this.setState({ busy: false }); return; } const authClient = new _IdentityAuthClient.default(); const identityAccessToken = await authClient.getAccessToken(); const result = await _MatrixClientPeg.MatrixClientPeg.get().lookupThreePid('email', this.props.invitedEmail, undefined /* callback */ , identityAccessToken); this.setState({ invitedEmailMxid: result.mxid }); } catch (err) { this.setState({ threePidFetchError: err }); } this.setState({ busy: false }); } } _getMessageCase() { const isGuest = _MatrixClientPeg.MatrixClientPeg.get().isGuest(); if (isGuest) { return MessageCase.NotLoggedIn; } const myMember = this._getMyMember(); if (myMember) { if (myMember.isKicked()) { return MessageCase.Kicked; } else if (myMember.membership === "ban") { return MessageCase.Banned; } } if (this.props.joining) { return MessageCase.Joining; } else if (this.props.rejecting) { return MessageCase.Rejecting; } else if (this.props.loading || this.state.busy) { return MessageCase.Loading; } if (this.props.inviterName) { if (this.props.invitedEmail) { if (this.state.threePidFetchError) { return MessageCase.OtherThreePIDError; } else if (this.state.accountEmails && !this.state.accountEmails.includes(this.props.invitedEmail)) { return MessageCase.InvitedEmailNotFoundInAccount; } else if (!_MatrixClientPeg.MatrixClientPeg.get().getIdentityServerUrl()) { return MessageCase.InvitedEmailNoIdentityServer; } else if (this.state.invitedEmailMxid != _MatrixClientPeg.MatrixClientPeg.get().getUserId()) { return MessageCase.InvitedEmailMismatch; } } return MessageCase.Invite; } else if (this.props.error) { if (this.props.error.errcode == 'M_NOT_FOUND') { return MessageCase.RoomNotFound; } else { return MessageCase.OtherError; } } else { return MessageCase.ViewingRoom; } } _getKickOrBanInfo() { const myMember = this._getMyMember(); if (!myMember) { return {}; } const kickerMember = this.props.room.currentState.getMember(myMember.events.member.getSender()); const memberName = kickerMember ? kickerMember.name : myMember.events.member.getSender(); const reason = myMember.events.member.getContent().reason; return { memberName, reason }; } _joinRule() { const room = this.props.room; if (room) { const joinRules = room.currentState.getStateEvents('m.room.join_rules', ''); if (joinRules) { return joinRules.getContent().join_rule; } } } _communityProfile() { if (this.props.room) return _CommunityPrototypeStore.CommunityPrototypeStore.instance.getInviteProfile(this.props.room.roomId); return { displayName: null, avatarMxc: null }; } _roomName(atStart = false) { let name = this.props.room ? this.props.room.name : this.props.roomAlias; const profile = this._communityProfile(); if (profile.displayName) name = profile.displayName; if (name) { return name; } else if (atStart) { return (0, _languageHandler._t)("This room"); } else { return (0, _languageHandler._t)("this room"); } } _getMyMember() { return this.props.room && this.props.room.getMember(_MatrixClientPeg.MatrixClientPeg.get().getUserId()); } _getInviteMember() { const { room } = this.props; if (!room) { return; } const myUserId = _MatrixClientPeg.MatrixClientPeg.get().getUserId(); const inviteEvent = room.currentState.getMember(myUserId); if (!inviteEvent) { return; } const inviterUserId = inviteEvent.events.member.getSender(); return room.currentState.getMember(inviterUserId); } _isDMInvite() { const myMember = this._getMyMember(); if (!myMember) { return false; } const memberEvent = myMember.events.member; const memberContent = memberEvent.getContent(); return memberContent.membership === "invite" && memberContent.is_direct; } _makeScreenAfterLogin() { return { screen: 'room', params: { email: this.props.invitedEmail, signurl: this.props.signUrl, room_name: this.props.oobData ? this.props.oobData.room_name : null, room_avatar_url: this.props.oobData ? this.props.oobData.avatarUrl : null, inviter_name: this.props.oobData ? this.props.oobData.inviterName : null } }; } render() { const brand = _SdkConfig.default.get().brand; const Spinner = sdk.getComponent('elements.Spinner'); const AccessibleButton = sdk.getComponent('elements.AccessibleButton'); let showSpinner = false; let title; let subTitle; let reasonElement; let primaryActionHandler; let primaryActionLabel; let secondaryActionHandler; let secondaryActionLabel; let footer; const extraComponents = []; const messageCase = this._getMessageCase(); switch (messageCase) { case MessageCase.Joining: { title = (0, _languageHandler._t)("Joining room …"); showSpinner = true; break; } case MessageCase.Loading: { title = (0, _languageHandler._t)("Loading …"); showSpinner = true; break; } case MessageCase.Rejecting: { title = (0, _languageHandler._t)("Rejecting invite …"); showSpinner = true; break; } case MessageCase.NotLoggedIn: { title = (0, _languageHandler._t)("Join the conversation with an account"); primaryActionLabel = (0, _languageHandler._t)("Sign Up"); primaryActionHandler = this.onRegisterClick; secondaryActionLabel = (0, _languageHandler._t)("Sign In"); secondaryActionHandler = this.onLoginClick; if (this.props.previewLoading) { footer = /*#__PURE__*/_react.default.createElement("div", null, /*#__PURE__*/_react.default.createElement(Spinner, { w: 20, h: 20 }), (0, _languageHandler._t)("Loading room preview")); } break; } case MessageCase.Kicked: { const { memberName, reason } = this._getKickOrBanInfo(); title = (0, _languageHandler._t)("You were kicked from %(roomName)s by %(memberName)s", { memberName, roomName: this._roomName() }); subTitle = reason ? (0, _languageHandler._t)("Reason: %(reason)s", { reason }) : null; if (this._joinRule() === "invite") { primaryActionLabel = (0, _languageHandler._t)("Forget this room"); primaryActionHandler = this.props.onForgetClick; } else { primaryActionLabel = (0, _languageHandler._t)("Re-join"); primaryActionHandler = this.props.onJoinClick; secondaryActionLabel = (0, _languageHandler._t)("Forget this room"); secondaryActionHandler = this.props.onForgetClick; } break; } case MessageCase.Banned: { const { memberName, reason } = this._getKickOrBanInfo(); title = (0, _languageHandler._t)("You were banned from %(roomName)s by %(memberName)s", { memberName, roomName: this._roomName() }); subTitle = reason ? (0, _languageHandler._t)("Reason: %(reason)s", { reason }) : null; primaryActionLabel = (0, _languageHandler._t)("Forget this room"); primaryActionHandler = this.props.onForgetClick; break; } case MessageCase.OtherThreePIDError: { title = (0, _languageHandler._t)("Something went wrong with your invite to %(roomName)s", { roomName: this._roomName() }); const joinRule = this._joinRule(); const errCodeMessage = (0, _languageHandler._t)("An error (%(errcode)s) was returned while trying to validate your " + "invite. You could try to pass this information on to a room admin.", { errcode: this.state.threePidFetchError.errcode || (0, _languageHandler._t)("unknown error code") }); switch (joinRule) { case "invite": subTitle = [(0, _languageHandler._t)("You can only join it with a working invite."), errCodeMessage]; primaryActionLabel = (0, _languageHandler._t)("Try to join anyway"); primaryActionHandler = this.props.onJoinClick; break; case "public": subTitle = (0, _languageHandler._t)("You can still join it because this is a public room."); primaryActionLabel = (0, _languageHandler._t)("Join the discussion"); primaryActionHandler = this.props.onJoinClick; break; default: subTitle = errCodeMessage; primaryActionLabel = (0, _languageHandler._t)("Try to join anyway"); primaryActionHandler = this.props.onJoinClick; break; } break; } case MessageCase.InvitedEmailNotFoundInAccount: { title = (0, _languageHandler._t)("This invite to %(roomName)s was sent to %(email)s which is not " + "associated with your account", { roomName: this._roomName(), email: this.props.invitedEmail }); subTitle = (0, _languageHandler._t)("Link this email with your account in Settings to receive invites " + "directly in %(brand)s.", { brand }); primaryActionLabel = (0, _languageHandler._t)("Join the discussion"); primaryActionHandler = this.props.onJoinClick; break; } case MessageCase.InvitedEmailNoIdentityServer: { title = (0, _languageHandler._t)("This invite to %(roomName)s was sent to %(email)s", { roomName: this._roomName(), email: this.props.invitedEmail }); subTitle = (0, _languageHandler._t)("Use an identity server in Settings to receive invites directly in %(brand)s.", { brand }); primaryActionLabel = (0, _languageHandler._t)("Join the discussion"); primaryActionHandler = this.props.onJoinClick; break; } case MessageCase.InvitedEmailMismatch: { title = (0, _languageHandler._t)("This invite to %(roomName)s was sent to %(email)s", { roomName: this._roomName(), email: this.props.invitedEmail }); subTitle = (0, _languageHandler._t)("Share this email in Settings to receive invites directly in %(brand)s.", { brand }); primaryActionLabel = (0, _languageHandler._t)("Join the discussion"); primaryActionHandler = this.props.onJoinClick; break; } case MessageCase.Invite: { const RoomAvatar = sdk.getComponent("views.avatars.RoomAvatar"); const oobData = Object.assign({}, this.props.oobData, { avatarUrl: this._communityProfile().avatarMxc }); const avatar = /*#__PURE__*/_react.default.createElement(RoomAvatar, { room: this.props.room, oobData: oobData }); const inviteMember = this._getInviteMember(); let inviterElement; if (inviteMember) { inviterElement = /*#__PURE__*/_react.default.createElement("span", null, /*#__PURE__*/_react.default.createElement("span", { className: "mx_RoomPreviewBar_inviter" }, inviteMember.rawDisplayName), " (", inviteMember.userId, ")"); } else { inviterElement = /*#__PURE__*/_react.default.createElement("span", { className: "mx_RoomPreviewBar_inviter" }, this.props.inviterName); } const isDM = this._isDMInvite(); if (isDM) { title = (0, _languageHandler._t)("Do you want to chat with %(user)s?", { user: inviteMember.name }); subTitle = [avatar, (0, _languageHandler._t)("<userName/> wants to chat", {}, { userName: () => inviterElement })]; primaryActionLabel = (0, _languageHandler._t)("Start chatting"); } else { title = (0, _languageHandler._t)("Do you want to join %(roomName)s?", { roomName: this._roomName() }); subTitle = [avatar, (0, _languageHandler._t)("<userName/> invited you", {}, { userName: () => inviterElement })]; primaryActionLabel = (0, _languageHandler._t)("Accept"); } const myUserId = _MatrixClientPeg.MatrixClientPeg.get().getUserId(); const reason = this.props.room.currentState.getMember(myUserId).events.member.event.content.reason; if (reason) { reasonElement = /*#__PURE__*/_react.default.createElement(_InviteReason.default, { reason: reason }); } primaryActionHandler = this.props.onJoinClick; secondaryActionLabel = (0, _languageHandler._t)("Reject"); secondaryActionHandler = this.props.onRejectClick; if (this.props.onRejectAndIgnoreClick) { extraComponents.push( /*#__PURE__*/_react.default.createElement(AccessibleButton, { kind: "secondary", onClick: this.props.onRejectAndIgnoreClick, key: "ignore" }, (0, _languageHandler._t)("Reject & Ignore user"))); } break; } case MessageCase.ViewingRoom: { if (this.props.canPreview) { title = (0, _languageHandler._t)("You're previewing %(roomName)s. Want to join it?", { roomName: this._roomName() }); } else { title = (0, _languageHandler._t)("%(roomName)s can't be previewed. Do you want to join it?", { roomName: this._roomName(true) }); } primaryActionLabel = (0, _languageHandler._t)("Join the discussion"); primaryActionHandler = this.props.onJoinClick; break; } case MessageCase.RoomNotFound: { title = (0, _languageHandler._t)("%(roomName)s does not exist.", { roomName: this._roomName(true) }); subTitle = (0, _languageHandler._t)("This room doesn't exist. Are you sure you're at the right place?"); break; } case MessageCase.OtherError: { title = (0, _languageHandler._t)("%(roomName)s is not accessible at this time.", { roomName: this._roomName(true) }); subTitle = [(0, _languageHandler._t)("Try again later, or ask a room admin to check if you have access."), (0, _languageHandler._t)("%(errcode)s was returned while trying to access the room. " + "If you think you're seeing this message in error, please " + "<issueLink>submit a bug report</issueLink>.", { errcode: this.props.error.errcode }, { issueLink: label => /*#__PURE__*/_react.default.createElement("a", { href: "https://github.com/vector-im/element-web/issues/new/choose", target: "_blank", rel: "noreferrer noopener" }, label) })]; break; } } let subTitleElements; if (subTitle) { if (!Array.isArray(subTitle)) { subTitle = [subTitle]; } subTitleElements = subTitle.map((t, i) => /*#__PURE__*/_react.default.createElement("p", { key: `subTitle${i}` }, t)); } let titleElement; if (showSpinner) { titleElement = /*#__PURE__*/_react.default.createElement("h3", { className: "mx_RoomPreviewBar_spinnerTitle" }, /*#__PURE__*/_react.default.createElement(Spinner, null), title); } else { titleElement = /*#__PURE__*/_react.default.createElement("h3", null, title); } let primaryButton; if (primaryActionHandler) { primaryButton = /*#__PURE__*/_react.default.createElement(AccessibleButton, { kind: "primary", onClick: primaryActionHandler }, primaryActionLabel); } let secondaryButton; if (secondaryActionHandler) { secondaryButton = /*#__PURE__*/_react.default.createElement(AccessibleButton, { kind: "secondary", onClick: secondaryActionHandler }, secondaryActionLabel); } const classes = (0, _classnames.default)("mx_RoomPreviewBar", "dark-panel", `mx_RoomPreviewBar_${messageCase}`, { "mx_RoomPreviewBar_panel": this.props.canPreview, "mx_RoomPreviewBar_dialog": !this.props.canPreview }); return /*#__PURE__*/_react.default.createElement("div", { className: classes }, /*#__PURE__*/_react.default.createElement("div", { className: "mx_RoomPreviewBar_message" }, titleElement, subTitleElements), reasonElement, /*#__PURE__*/_react.default.createElement("div", { className: "mx_RoomPreviewBar_actions" }, secondaryButton, extraComponents, primaryButton), /*#__PURE__*/_react.default.createElement("div", { className: "mx_RoomPreviewBar_footer" }, footer)); } }, (0, _defineProperty2.default)(_class2, "propTypes", { onJoinClick: _propTypes.default.func, onRejectClick: _propTypes.default.func, onRejectAndIgnoreClick: _propTypes.default.func, onForgetClick: _propTypes.default.func, // if inviterName is specified, the preview bar will shown an invite to the room. // You should also specify onRejectClick if specifiying inviterName inviterName: _propTypes.default.string, // If invited by 3rd party invite, the email address the invite was sent to invitedEmail: _propTypes.default.string, // For third party invites, information passed about the room out-of-band oobData: _propTypes.default.object, // For third party invites, a URL for a 3pid invite signing service signUrl: _propTypes.default.string, // A standard client/server API error object. If supplied, indicates that the // caller was unable to fetch details about the room for the given reason. error: _propTypes.default.object, canPreview: _propTypes.default.bool, previewLoading: _propTypes.default.bool, room: _propTypes.default.object, // When a spinner is present, a spinnerState can be specified to indicate the // purpose of the spinner. spinner: _propTypes.default.bool, spinnerState: _propTypes.default.oneOf(["joining"]), loading: _propTypes.default.bool, joining: _propTypes.default.bool, rejecting: _propTypes.default.bool, // The alias that was used to access this room, if appropriate // If given, this will be how the room is referred to (eg. // in error messages). roomAlias: _propTypes.default.string }), (0, _defineProperty2.default)(_class2, "defaultProps", { onJoinClick() {} }), _temp)) || _class); exports.default = RoomPreviewBar; //# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uL3NyYy9jb21wb25lbnRzL3ZpZXdzL3Jvb21zL1Jvb21QcmV2aWV3QmFyLmpzIl0sIm5hbWVzIjpbIk1lc3NhZ2VDYXNlIiwiT2JqZWN0IiwiZnJlZXplIiwiTm90TG9nZ2VkSW4iLCJKb2luaW5nIiwiTG9hZGluZyIsIlJlamVjdGluZyIsIktpY2tlZCIsIkJhbm5lZCIsIk90aGVyVGhyZWVQSURFcnJvciIsIkludml0ZWRFbWFpbE5vdEZvdW5kSW5BY2NvdW50IiwiSW52aXRlZEVtYWlsTm9JZGVudGl0eVNlcnZlciIsIkludml0ZWRFbWFpbE1pc21hdGNoIiwiSW52aXRlIiwiVmlld2luZ1Jvb20iLCJSb29tTm90Rm91bmQiLCJPdGhlckVycm9yIiwiUm9vbVByZXZpZXdCYXIiLCJSZWFjdCIsIkNvbXBvbmVudCIsImJ1c3kiLCJyb29tSWQiLCJwcm9wcyIsInJvb20iLCJmb3JjZVVwZGF0ZSIsImRpcyIsImRpc3BhdGNoIiwiYWN0aW9uIiwic2NyZWVuQWZ0ZXJMb2dpbiIsIl9tYWtlU2NyZWVuQWZ0ZXJMb2dpbiIsImNvbXBvbmVudERpZE1vdW50IiwiX2NoZWNrSW52aXRlZEVtYWlsIiwiQ29tbXVuaXR5UHJvdG90eXBlU3RvcmUiLCJpbnN0YW5jZSIsIm9uIiwiVVBEQVRFX0VWRU5UIiwiX29uQ29tbXVuaXR5VXBkYXRlIiwiY29tcG9uZW50RGlkVXBkYXRlIiwicHJldlByb3BzIiwicHJldlN0YXRlIiwiaW52aXRlZEVtYWlsIiwiaW52aXRlck5hbWUiLCJjb21wb25lbnRXaWxsVW5tb3VudCIsIm9mZiIsInNldFN0YXRlIiwiYWNjb3VudDNwaWRzIiwiTWF0cml4Q2xpZW50UGVnIiwiZ2V0IiwiZ2V0VGhyZWVQaWRzIiwiYWNjb3VudEVtYWlscyIsInRocmVlcGlkcyIsImZpbHRlciIsImIiLCJtZWRpdW0iLCJtYXAiLCJhZGRyZXNzIiwiZ2V0SWRlbnRpdHlTZXJ2ZXJVcmwiLCJhdXRoQ2xpZW50IiwiSWRlbnRpdHlBdXRoQ2xpZW50IiwiaWRlbnRpdHlBY2Nlc3NUb2tlbiIsImdldEFjY2Vzc1Rva2VuIiwicmVzdWx0IiwibG9va3VwVGhyZWVQaWQiLCJ1bmRlZmluZWQiLCJpbnZpdGVkRW1haWxNeGlkIiwibXhpZCIsImVyciIsInRocmVlUGlkRmV0Y2hFcnJvciIsIl9nZXRNZXNzYWdlQ2FzZSIsImlzR3Vlc3QiLCJteU1lbWJlciIsIl9nZXRNeU1lbWJlciIsImlzS2lja2VkIiwibWVtYmVyc2hpcCIsImpvaW5pbmciLCJyZWplY3RpbmciLCJsb2FkaW5nIiwic3RhdGUiLCJpbmNsdWRlcyIsImdldFVzZXJJZCIsImVycm9yIiwiZXJyY29kZSIsIl9nZXRLaWNrT3JCYW5JbmZvIiwia2lja2VyTWVtYmVyIiwiY3VycmVudFN0YXRlIiwiZ2V0TWVtYmVyIiwiZXZlbnRzIiwibWVtYmVyIiwiZ2V0U2VuZGVyIiwibWVtYmVyTmFtZSIsIm5hbWUiLCJyZWFzb24iLCJnZXRDb250ZW50IiwiX2pvaW5SdWxlIiwiam9pblJ1bGVzIiwiZ2V0U3RhdGVFdmVudHMiLCJqb2luX3J1bGUiLCJfY29tbXVuaXR5UHJvZmlsZSIsImdldEludml0ZVByb2ZpbGUiLCJkaXNwbGF5TmFtZSIsImF2YXRhck14YyIsIl9yb29tTmFtZSIsImF0U3RhcnQiLCJyb29tQWxpYXMiLCJwcm9maWxlIiwiX2dldEludml0ZU1lbWJlciIsIm15VXNlcklkIiwiaW52aXRlRXZlbnQiLCJpbnZpdGVyVXNlcklkIiwiX2lzRE1JbnZpdGUiLCJtZW1iZXJFdmVudCIsIm1lbWJlckNvbnRlbnQiLCJpc19kaXJlY3QiLCJzY3JlZW4iLCJwYXJhbXMiLCJlbWFpbCIsInNpZ251cmwiLCJzaWduVXJsIiwicm9vbV9uYW1lIiwib29iRGF0YSIsInJvb21fYXZhdGFyX3VybCIsImF2YXRhclVybCIsImludml0ZXJfbmFtZSIsInJlbmRlciIsImJyYW5kIiwiU2RrQ29uZmlnIiwiU3Bpbm5lciIsInNkayIsImdldENvbXBvbmVudCIsIkFjY2Vzc2libGVCdXR0b24iLCJzaG93U3Bpbm5lciIsInRpdGxlIiwic3ViVGl0bGUiLCJyZWFzb25FbGVtZW50IiwicHJpbWFyeUFjdGlvbkhhbmRsZXIiLCJwcmltYXJ5QWN0aW9uTGFiZWwiLCJzZWNvbmRhcnlBY3Rpb25IYW5kbGVyIiwic2Vjb25kYXJ5QWN0aW9uTGFiZWwiLCJmb290ZXIiLCJleHRyYUNvbXBvbmVudHMiLCJtZXNzYWdlQ2FzZSIsIm9uUmVnaXN0ZXJDbGljayIsIm9uTG9naW5DbGljayIsInByZXZpZXdMb2FkaW5nIiwicm9vbU5hbWUiLCJvbkZvcmdldENsaWNrIiwib25Kb2luQ2xpY2siLCJqb2luUnVsZSIsImVyckNvZGVNZXNzYWdlIiwiUm9vbUF2YXRhciIsImFzc2lnbiIsImF2YXRhciIsImludml0ZU1lbWJlciIsImludml0ZXJFbGVtZW50IiwicmF3RGlzcGxheU5hbWUiLCJ1c2VySWQiLCJpc0RNIiwidXNlciIsInVzZXJOYW1lIiwiZXZlbnQiLCJjb250ZW50Iiwib25SZWplY3RDbGljayIsIm9uUmVqZWN0QW5kSWdub3JlQ2xpY2siLCJwdXNoIiwiY2FuUHJldmlldyIsImlzc3VlTGluayIsImxhYmVsIiwic3ViVGl0bGVFbGVtZW50cyIsIkFycmF5IiwiaXNBcnJheSIsInQiLCJpIiwidGl0bGVFbGVtZW50IiwicHJpbWFyeUJ1dHRvbiIsInNlY29uZGFyeUJ1dHRvbiIsImNsYXNzZXMiLCJQcm9wVHlwZXMiLCJmdW5jIiwic3RyaW5nIiwib2JqZWN0IiwiYm9vbCIsInNwaW5uZXIiLCJzcGlubmVyU3RhdGUiLCJvbmVPZiJdLCJtYXBwaW5ncyI6Ijs7Ozs7Ozs7Ozs7OztBQWdCQTs7QUFDQTs7QUFDQTs7QUFDQTs7QUFDQTs7QUFDQTs7QUFDQTs7QUFDQTs7QUFDQTs7QUFDQTs7QUFDQTs7QUFDQTs7QUFDQTs7OztBQUVBLE1BQU1BLFdBQVcsR0FBR0MsTUFBTSxDQUFDQyxNQUFQLENBQWM7QUFDOUJDLEVBQUFBLFdBQVcsRUFBRSxhQURpQjtBQUU5QkMsRUFBQUEsT0FBTyxFQUFFLFNB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SixtQkFBVUcsTUF4QkQ7QUEwQmY7QUFDQTtBQUNBRSxFQUFBQSxPQUFPLEVBQUVMLG1CQUFVSSxJQTVCSjtBQTZCZkUsRUFBQUEsWUFBWSxFQUFFTixtQkFBVU8sS0FBVixDQUFnQixDQUFDLFNBQUQsQ0FBaEIsQ0E3QkM7QUE4QmYzRyxFQUFBQSxPQUFPLEVBQUVvRyxtQkFBVUksSUE5Qko7QUErQmYxRyxFQUFBQSxPQUFPLEVBQUVzRyxtQkFBVUksSUEvQko7QUFnQ2Z6RyxFQUFBQSxTQUFTLEVBQUVxRyxtQkFBVUksSUFoQ047QUFpQ2Y7QUFDQTtBQUNBO0FBQ0E3RSxFQUFBQSxTQUFTLEVBQUV5RSxtQkFBVUU7QUFwQ04sQywwREF1Q0c7QUFDbEJoQyxFQUFBQSxXQUFXLEdBQUcsQ0FBRTs7QUFERSxDIiwic291cmNlc0NvbnRlbnQiOlsiLypcbkNvcHlyaWdodCAyMDE1LTIwMjEgVGhlIE1hdHJpeC5vcmcgRm91bmRhdGlvbiBDLkkuQy5cblxuTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlIFwiTGljZW5zZVwiKTtcbnlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS5cbllvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdFxuXG4gICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wXG5cblVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmVcbmRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuIFwiQVMgSVNcIiBCQVNJUyxcbldJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLlxuU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZFxubGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuXG4qL1xuXG5pbXBvcnQgUmVhY3QgZnJvbSAncmVhY3QnO1xuaW1wb3J0IFByb3BUeXBlcyBmcm9tICdwcm9wLXR5cGVzJztcbmltcG9ydCAqIGFzIHNkayBmcm9tICcuLi8uLi8uLi9pbmRleCc7XG5pbXBvcnQge01hdHJpeENsaWVudFBlZ30gZnJvbSAnLi4vLi4vLi4vTWF0cml4Q2xpZW50UGVnJztcbmltcG9ydCBkaXMgZnJvbSAnLi4vLi4vLi4vZGlzcGF0Y2hlci9kaXNwYXRjaGVyJztcbmltcG9ydCBjbGFzc05hbWVzIGZyb20gJ2NsYXNzbmFtZXMnO1xuaW1wb3J0IHsgX3QgfSBmcm9tICcuLi8uLi8uLi9sYW5ndWFnZUhhbmRsZXInO1xuaW1wb3J0IFNka0NvbmZpZyBmcm9tIFwiLi4vLi4vLi4vU2RrQ29uZmlnXCI7XG5pbXBvcnQgSWRlbnRpdHlBdXRoQ2xpZW50IGZyb20gJy4uLy4uLy4uL0lkZW50aXR5QXV0aENsaWVudCc7XG5pbXBvcnQge0NvbW11bml0eVByb3RvdHlwZVN0b3JlfSBmcm9tIFwiLi4vLi4vLi4vc3RvcmVzL0NvbW11bml0eVByb3RvdHlwZVN0b3JlXCI7XG5pbXBvcnQge1VQREFURV9FVkVOVH0gZnJvbSBcIi4uLy4uLy4uL3N0b3Jlcy9Bc3luY1N0b3JlXCI7XG5pbXBvcnQgeyByZXBsYWNlYWJsZUNvbXBvbmVudCB9IGZyb20gXCIuLi8uLi8uLi91dGlscy9yZXBsYWNlYWJsZUNvbXBvbmVudFwiO1xuaW1wb3J0IEludml0ZVJlYXNvbiBmcm9tIFwiLi4vZWxlbWVudHMvSW52aXRlUmVhc29uXCI7XG5cbmNvbnN0IE1lc3NhZ2VDYXNlID0gT2JqZWN0LmZyZWV6ZSh7XG4gICAgTm90TG9nZ2VkSW46IFwiT