UNPKG

matrix-react-sdk

Version:
190 lines (187 loc) 28.8 kB
"use strict"; var _interopRequireDefault = require("@babel/runtime/helpers/interopRequireDefault"); Object.defineProperty(exports, "__esModule", { value: true }); exports.default = void 0; var _extends2 = _interopRequireDefault(require("@babel/runtime/helpers/extends")); var _objectWithoutProperties2 = _interopRequireDefault(require("@babel/runtime/helpers/objectWithoutProperties")); var _defineProperty2 = _interopRequireDefault(require("@babel/runtime/helpers/defineProperty")); var _react = _interopRequireDefault(require("react")); var _classnames = _interopRequireDefault(require("classnames")); var _matrix = require("matrix-js-sdk/src/matrix"); var _NamespacedValue = require("matrix-js-sdk/src/NamespacedValue"); var _compoundWeb = require("@vector-im/compound-web"); var _RoomAvatar = _interopRequireDefault(require("./RoomAvatar")); var _NotificationBadge = _interopRequireDefault(require("../rooms/NotificationBadge")); var _RoomNotificationStateStore = require("../../../stores/notifications/RoomNotificationStateStore"); var _presence = require("../../../utils/presence"); var _MatrixClientPeg = require("../../../MatrixClientPeg"); var _languageHandler = require("../../../languageHandler"); var _DMRoomMap = _interopRequireDefault(require("../../../utils/DMRoomMap")); var _getJoinedNonFunctionalMembers = require("../../../utils/room/getJoinedNonFunctionalMembers"); const _excluded = ["room", "size", "displayBadge", "hideIfDot", "oobData", "viewAvatarOnClick", "tooltipProps"]; /* Copyright 2024 New Vector Ltd. Copyright 2020 The Matrix.org Foundation C.I.C. SPDX-License-Identifier: AGPL-3.0-only OR GPL-3.0-only Please see LICENSE files in the repository root for full details. */ const BUSY_PRESENCE_NAME = new _NamespacedValue.UnstableValue("busy", "org.matrix.msc3026.busy"); var Icon = /*#__PURE__*/function (Icon) { Icon["None"] = "NONE"; Icon["Globe"] = "GLOBE"; Icon["PresenceOnline"] = "ONLINE"; Icon["PresenceAway"] = "AWAY"; Icon["PresenceOffline"] = "OFFLINE"; Icon["PresenceBusy"] = "BUSY"; return Icon; }(Icon || {}); function tooltipText(variant) { switch (variant) { case Icon.Globe: return (0, _languageHandler._t)("room|header|room_is_public"); case Icon.PresenceOnline: return (0, _languageHandler._t)("presence|online"); case Icon.PresenceAway: return (0, _languageHandler._t)("presence|away"); case Icon.PresenceOffline: return (0, _languageHandler._t)("presence|offline"); case Icon.PresenceBusy: return (0, _languageHandler._t)("presence|busy"); } } class DecoratedRoomAvatar extends _react.default.PureComponent { constructor(props) { super(props); (0, _defineProperty2.default)(this, "_dmUser", null); (0, _defineProperty2.default)(this, "isUnmounted", false); (0, _defineProperty2.default)(this, "isWatchingTimeline", false); (0, _defineProperty2.default)(this, "onRoomTimeline", (ev, room) => { if (this.isUnmounted) return; if (this.props.room.roomId !== room?.roomId) return; if (ev.getType() === _matrix.EventType.RoomJoinRules || ev.getType() === _matrix.EventType.RoomMember) { const newIcon = this.calculateIcon(); if (newIcon !== this.state.icon) { this.setState({ icon: newIcon }); } } }); (0, _defineProperty2.default)(this, "onPresenceUpdate", () => { if (this.isUnmounted) return; const newIcon = this.getPresenceIcon(); if (newIcon !== this.state.icon) this.setState({ icon: newIcon }); }); this.state = { notificationState: _RoomNotificationStateStore.RoomNotificationStateStore.instance.getRoomState(this.props.room), icon: this.calculateIcon() }; } componentWillUnmount() { this.isUnmounted = true; if (this.isWatchingTimeline) this.props.room.off(_matrix.RoomEvent.Timeline, this.onRoomTimeline); this.dmUser = null; // clear listeners, if any } get isPublicRoom() { return this.props.room.getJoinRule() === _matrix.JoinRule.Public; } get dmUser() { return this._dmUser; } set dmUser(val) { const oldUser = this._dmUser; this._dmUser = val; if (oldUser && oldUser !== this._dmUser) { oldUser.off(_matrix.UserEvent.CurrentlyActive, this.onPresenceUpdate); oldUser.off(_matrix.UserEvent.Presence, this.onPresenceUpdate); } if (this._dmUser && oldUser !== this._dmUser) { this._dmUser.on(_matrix.UserEvent.CurrentlyActive, this.onPresenceUpdate); this._dmUser.on(_matrix.UserEvent.Presence, this.onPresenceUpdate); } } getPresenceIcon() { if (!this.dmUser) return Icon.None; let icon = Icon.None; const isOnline = this.dmUser.currentlyActive || this.dmUser.presence === "online"; if (BUSY_PRESENCE_NAME.matches(this.dmUser.presence)) { icon = Icon.PresenceBusy; } else if (isOnline) { icon = Icon.PresenceOnline; } else if (this.dmUser.presence === "offline") { icon = Icon.PresenceOffline; } else if (this.dmUser.presence === "unavailable") { icon = Icon.PresenceAway; } return icon; } calculateIcon() { let icon = Icon.None; // We look at the DMRoomMap and not the tag here so that we don't exclude DMs in Favourites const otherUserId = _DMRoomMap.default.shared().getUserIdForRoomId(this.props.room.roomId); if (otherUserId && (0, _getJoinedNonFunctionalMembers.getJoinedNonFunctionalMembers)(this.props.room).length === 2) { // Track presence, if available if ((0, _presence.isPresenceEnabled)(this.props.room.client)) { this.dmUser = _MatrixClientPeg.MatrixClientPeg.safeGet().getUser(otherUserId); icon = this.getPresenceIcon(); } } else { // Track publicity icon = this.isPublicRoom ? Icon.Globe : Icon.None; if (!this.isWatchingTimeline) { this.props.room.on(_matrix.RoomEvent.Timeline, this.onRoomTimeline); this.isWatchingTimeline = true; } } return icon; } render() { // Spread the remaining props to make it work with compound component const _this$props = this.props, { room, size, displayBadge, hideIfDot, oobData, viewAvatarOnClick, tooltipProps } = _this$props, props = (0, _objectWithoutProperties2.default)(_this$props, _excluded); let badge; if (this.props.displayBadge && this.state.notificationState) { badge = /*#__PURE__*/_react.default.createElement(_NotificationBadge.default, { notification: this.state.notificationState, hideIfDot: this.props.hideIfDot, roomId: this.props.room.roomId }); } let icon; if (this.state.icon !== Icon.None) { icon = /*#__PURE__*/_react.default.createElement("div", { tabIndex: this.props.tooltipProps?.tabIndex ?? 0, className: `mx_DecoratedRoomAvatar_icon mx_DecoratedRoomAvatar_icon_${this.state.icon.toLowerCase()}` }); } const classes = (0, _classnames.default)("mx_DecoratedRoomAvatar", { mx_DecoratedRoomAvatar_cutout: icon }); return /*#__PURE__*/_react.default.createElement("div", (0, _extends2.default)({ className: classes }, props), /*#__PURE__*/_react.default.createElement(_RoomAvatar.default, { room: this.props.room, size: this.props.size, oobData: this.props.oobData, viewAvatarOnClick: this.props.viewAvatarOnClick }), icon && /*#__PURE__*/_react.default.createElement(_compoundWeb.Tooltip, { label: tooltipText(this.state.icon), placement: "bottom" }, icon), badge); } } exports.default = DecoratedRoomAvatar; //# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJuYW1lcyI6WyJfcmVhY3QiLCJfaW50ZXJvcFJlcXVpcmVEZWZhdWx0IiwicmVxdWlyZSIsIl9jbGFzc25hbWVzIiwiX21hdHJpeCIsIl9OYW1lc3BhY2VkVmFsdWUiLCJfY29tcG91bmRXZWIiLCJfUm9vbUF2YXRhciIsIl9Ob3RpZmljYXRpb25CYWRnZSIsIl9Sb29tTm90aWZpY2F0aW9uU3RhdGVTdG9yZSIsIl9wcmVzZW5jZSIsIl9NYXRyaXhDbGllbnRQZWciLCJfbGFuZ3VhZ2VIYW5kbGVyIiwiX0RNUm9vbU1hcCIsIl9nZXRKb2luZWROb25GdW5jdGlvbmFsTWVtYmVycyIsIl9leGNsdWRlZCIsIkJVU1lfUFJFU0VOQ0VfTkFNRSIsIlVuc3RhYmxlVmFsdWUiLCJJY29uIiwidG9vbHRpcFRleHQiLCJ2YXJpYW50IiwiR2xvYmUiLCJfdCIsIlByZXNlbmNlT25saW5lIiwiUHJlc2VuY2VBd2F5IiwiUHJlc2VuY2VPZmZsaW5lIiwiUHJlc2VuY2VCdXN5IiwiRGVjb3JhdGVkUm9vbUF2YXRhciIsIlJlYWN0IiwiUHVyZUNvbXBvbmVudCIsImNvbnN0cnVjdG9yIiwicHJvcHMiLCJfZGVmaW5lUHJvcGVydHkyIiwiZGVmYXVsdCIsImV2Iiwicm9vbSIsImlzVW5tb3VudGVkIiwicm9vbUlkIiwiZ2V0VHlwZSIsIkV2ZW50VHlwZSIsIlJvb21Kb2luUnVsZXMiLCJSb29tTWVtYmVyIiwibmV3SWNvbiIsImNhbGN1bGF0ZUljb24iLCJzdGF0ZSIsImljb24iLCJzZXRTdGF0ZSIsImdldFByZXNlbmNlSWNvbiIsIm5vdGlmaWNhdGlvblN0YXRlIiwiUm9vbU5vdGlmaWNhdGlvblN0YXRlU3RvcmUiLCJpbnN0YW5jZSIsImdldFJvb21TdGF0ZSIsImNvbXBvbmVudFdpbGxVbm1vdW50IiwiaXNXYXRjaGluZ1RpbWVsaW5lIiwib2ZmIiwiUm9vbUV2ZW50IiwiVGltZWxpbmUiLCJvblJvb21UaW1lbGluZSIsImRtVXNlciIsImlzUHVibGljUm9vbSIsImdldEpvaW5SdWxlIiwiSm9pblJ1bGUiLCJQdWJsaWMiLCJfZG1Vc2VyIiwidmFsIiwib2xkVXNlciIsIlVzZXJFdmVudCIsIkN1cnJlbnRseUFjdGl2ZSIsIm9uUHJlc2VuY2VVcGRhdGUiLCJQcmVzZW5jZSIsIm9uIiwiTm9uZSIsImlzT25saW5lIiwiY3VycmVudGx5QWN0aXZlIiwicHJlc2VuY2UiLCJtYXRjaGVzIiwib3RoZXJVc2VySWQiLCJETVJvb21NYXAiLCJzaGFyZWQiLCJnZXRVc2VySWRGb3JSb29tSWQiLCJnZXRKb2luZWROb25GdW5jdGlvbmFsTWVtYmVycyIsImxlbmd0aCIsImlzUHJlc2VuY2VFbmFibGVkIiwiY2xpZW50IiwiTWF0cml4Q2xpZW50UGVnIiwic2FmZUdldCIsImdldFVzZXIiLCJyZW5kZXIiLCJfdGhpcyRwcm9wcyIsInNpemUiLCJkaXNwbGF5QmFkZ2UiLCJoaWRlSWZEb3QiLCJvb2JEYXRhIiwidmlld0F2YXRhck9uQ2xpY2siLCJ0b29sdGlwUHJvcHMiLCJfb2JqZWN0V2l0aG91dFByb3BlcnRpZXMyIiwiYmFkZ2UiLCJjcmVhdGVFbGVtZW50Iiwibm90aWZpY2F0aW9uIiwidGFiSW5kZXgiLCJjbGFzc05hbWUiLCJ0b0xvd2VyQ2FzZSIsImNsYXNzZXMiLCJjbGFzc05hbWVzIiwibXhfRGVjb3JhdGVkUm9vbUF2YXRhcl9jdXRvdXQiLCJfZXh0ZW5kczIiLCJUb29sdGlwIiwibGFiZWwiLCJwbGFjZW1lbnQiLCJleHBvcnRzIl0sInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vc3JjL2NvbXBvbmVudHMvdmlld3MvYXZhdGFycy9EZWNvcmF0ZWRSb29tQXZhdGFyLnRzeCJdLCJzb3VyY2VzQ29udGVudCI6WyIvKlxuQ29weXJpZ2h0IDIwMjQgTmV3IFZlY3RvciBMdGQuXG5Db3B5cmlnaHQgMjAyMCBUaGUgTWF0cml4Lm9yZyBGb3VuZGF0aW9uIEMuSS5DLlxuXG5TUERYLUxpY2Vuc2UtSWRlbnRpZmllcjogQUdQTC0zLjAtb25seSBPUiBHUEwtMy4wLW9ubHlcblBsZWFzZSBzZWUgTElDRU5TRSBmaWxlcyBpbiB0aGUgcmVwb3NpdG9yeSByb290IGZvciBmdWxsIGRldGFpbHMuXG4qL1xuXG5pbXBvcnQgUmVhY3QgZnJvbSBcInJlYWN0XCI7XG5pbXBvcnQgY2xhc3NOYW1lcyBmcm9tIFwiY2xhc3NuYW1lc1wiO1xuaW1wb3J0IHsgRXZlbnRUeXBlLCBKb2luUnVsZSwgTWF0cml4RXZlbnQsIFJvb20sIFJvb21FdmVudCwgVXNlciwgVXNlckV2ZW50IH0gZnJvbSBcIm1hdHJpeC1qcy1zZGsvc3JjL21hdHJpeFwiO1xuaW1wb3J0IHsgVW5zdGFibGVWYWx1ZSB9IGZyb20gXCJtYXRyaXgtanMtc2RrL3NyYy9OYW1lc3BhY2VkVmFsdWVcIjtcbmltcG9ydCB7IFRvb2x0aXAgfSBmcm9tIFwiQHZlY3Rvci1pbS9jb21wb3VuZC13ZWJcIjtcblxuaW1wb3J0IFJvb21BdmF0YXIgZnJvbSBcIi4vUm9vbUF2YXRhclwiO1xuaW1wb3J0IE5vdGlmaWNhdGlvbkJhZGdlIGZyb20gXCIuLi9yb29tcy9Ob3RpZmljYXRpb25CYWRnZVwiO1xuaW1wb3J0IHsgUm9vbU5vdGlmaWNhdGlvblN0YXRlU3RvcmUgfSBmcm9tIFwiLi4vLi4vLi4vc3RvcmVzL25vdGlmaWNhdGlvbnMvUm9vbU5vdGlmaWNhdGlvblN0YXRlU3RvcmVcIjtcbmltcG9ydCB7IE5vdGlmaWNhdGlvblN0YXRlIH0gZnJvbSBcIi4uLy4uLy4uL3N0b3Jlcy9ub3RpZmljYXRpb25zL05vdGlmaWNhdGlvblN0YXRlXCI7XG5pbXBvcnQgeyBpc1ByZXNlbmNlRW5hYmxlZCB9IGZyb20gXCIuLi8uLi8uLi91dGlscy9wcmVzZW5jZVwiO1xuaW1wb3J0IHsgTWF0cml4Q2xpZW50UGVnIH0gZnJvbSBcIi4uLy4uLy4uL01hdHJpeENsaWVudFBlZ1wiO1xuaW1wb3J0IHsgX3QgfSBmcm9tIFwiLi4vLi4vLi4vbGFuZ3VhZ2VIYW5kbGVyXCI7XG5pbXBvcnQgRE1Sb29tTWFwIGZyb20gXCIuLi8uLi8uLi91dGlscy9ETVJvb21NYXBcIjtcbmltcG9ydCB7IElPT0JEYXRhIH0gZnJvbSBcIi4uLy4uLy4uL3N0b3Jlcy9UaHJlZXBpZEludml0ZVN0b3JlXCI7XG5pbXBvcnQgeyBnZXRKb2luZWROb25GdW5jdGlvbmFsTWVtYmVycyB9IGZyb20gXCIuLi8uLi8uLi91dGlscy9yb29tL2dldEpvaW5lZE5vbkZ1bmN0aW9uYWxNZW1iZXJzXCI7XG5cbmludGVyZmFjZSBJUHJvcHMge1xuICAgIHJvb206IFJvb207XG4gICAgc2l6ZTogc3RyaW5nO1xuICAgIGRpc3BsYXlCYWRnZT86IGJvb2xlYW47XG4gICAgLyoqXG4gICAgICogSWYgdHJ1ZSwgc2hvdyBub3RoaW5nIGlmIHRoZSBub3RpZmljYXRpb24gd291bGQgb25seSBjYXVzZSBhIGRvdCB0byBiZSBzaG93biByYXRoZXIgdGhhblxuICAgICAqIGEgYmFkZ2UuIFRoYXQgaXM6IG9ubHkgZGlzcGxheSBiYWRnZXMgYW5kIG5vdCBkb3RzLiBEZWZhdWx0OiBmYWxzZS5cbiAgICAgKi9cbiAgICBoaWRlSWZEb3Q/OiBib29sZWFuO1xuICAgIG9vYkRhdGE/OiBJT09CRGF0YTtcbiAgICB2aWV3QXZhdGFyT25DbGljaz86IGJvb2xlYW47XG4gICAgdG9vbHRpcFByb3BzPzoge1xuICAgICAgICB0YWJJbmRleD86IG51bWJlcjtcbiAgICB9O1xufVxuXG5pbnRlcmZhY2UgSVN0YXRlIHtcbiAgICBub3RpZmljYXRpb25TdGF0ZT86IE5vdGlmaWNhdGlvblN0YXRlO1xuICAgIGljb246IEljb247XG59XG5cbmNvbnN0IEJVU1lfUFJFU0VOQ0VfTkFNRSA9IG5ldyBVbnN0YWJsZVZhbHVlKFwiYnVzeVwiLCBcIm9yZy5tYXRyaXgubXNjMzAyNi5idXN5XCIpO1xuXG5lbnVtIEljb24ge1xuICAgIC8vIE5vdGU6IHRoZSBuYW1lcyBoZXJlIGFyZSB1c2VkIGluIENTUyBjbGFzcyBuYW1lc1xuICAgIE5vbmUgPSBcIk5PTkVcIiwgLy8gLi4uIGV4Y2VwdCB0aGlzIG9uZVxuICAgIEdsb2JlID0gXCJHTE9CRVwiLFxuICAgIFByZXNlbmNlT25saW5lID0gXCJPTkxJTkVcIixcbiAgICBQcmVzZW5jZUF3YXkgPSBcIkFXQVlcIixcbiAgICBQcmVzZW5jZU9mZmxpbmUgPSBcIk9GRkxJTkVcIixcbiAgICBQcmVzZW5jZUJ1c3kgPSBcIkJVU1lcIixcbn1cblxuZnVuY3Rpb24gdG9vbHRpcFRleHQodmFyaWFudDogSWNvbik6IHN0cmluZyB8IHVuZGVmaW5lZCB7XG4gICAgc3dpdGNoICh2YXJpYW50KSB7XG4gICAgICAgIGNhc2UgSWNvbi5HbG9iZTpcbiAgICAgICAgICAgIHJldHVybiBfdChcInJvb218aGVhZGVyfHJvb21faXNfcHVibGljXCIpO1xuICAgICAgICBjYXNlIEljb24uUHJlc2VuY2VPbmxpbmU6XG4gICAgICAgICAgICByZXR1cm4gX3QoXCJwcmVzZW5jZXxvbmxpbmVcIik7XG4gICAgICAgIGNhc2UgSWNvbi5QcmVzZW5jZUF3YXk6XG4gICAgICAgICAgICByZXR1cm4gX3QoXCJwcmVzZW5jZXxhd2F5XCIpO1xuICAgICAgICBjYXNlIEljb24uUHJlc2VuY2VPZmZsaW5lOlxuICAgICAgICAgICAgcmV0dXJuIF90KFwicHJlc2VuY2V8b2ZmbGluZVwiKTtcbiAgICAgICAgY2FzZSBJY29uLlByZXNlbmNlQnVzeTpcbiAgICAgICAgICAgIHJldHVybiBfdChcInByZXNlbmNlfGJ1c3lcIik7XG4gICAgfVxufVxuXG5leHBvcnQgZGVmYXVsdCBjbGFzcyBEZWNvcmF0ZWRSb29tQXZhdGFyIGV4dGVuZHMgUmVhY3QuUHVyZUNvbXBvbmVudDxJUHJvcHMsIElTdGF0ZT4ge1xuICAgIHByaXZhdGUgX2RtVXNlcjogVXNlciB8IG51bGwgPSBudWxsO1xuICAgIHByaXZhdGUgaXNVbm1vdW50ZWQgPSBmYWxzZTtcbiAgICBwcml2YXRlIGlzV2F0Y2hpbmdUaW1lbGluZSA9IGZhbHNlO1xuXG4gICAgcHVibGljIGNvbnN0cnVjdG9yKHByb3BzOiBJUHJvcHMpIHtcbiAgICAgICAgc3VwZXIocHJvcHMpO1xuXG4gICAgICAgIHRoaXMuc3RhdGUgPSB7XG4gICAgICAgICAgICBub3RpZmljYXRpb25TdGF0ZTogUm9vbU5vdGlmaWNhdGlvblN0YXRlU3RvcmUuaW5zdGFuY2UuZ2V0Um9vbVN0YXRlKHRoaXMucHJvcHMucm9vbSksXG4gICAgICAgICAgICBpY29uOiB0aGlzLmNhbGN1bGF0ZUljb24oKSxcbiAgICAgICAgfTtcbiAgICB9XG5cbiAgICBwdWJsaWMgY29tcG9uZW50V2lsbFVubW91bnQoKTogdm9pZCB7XG4gICAgICAgIHRoaXMuaXNVbm1vdW50ZWQgPSB0cnVlO1xuICAgICAgICBpZiAodGhpcy5pc1dhdGNoaW5nVGltZWxpbmUpIHRoaXMucHJvcHMucm9vbS5vZmYoUm9vbUV2ZW50LlRpbWVsaW5lLCB0aGlzLm9uUm9vbVRpbWVsaW5lKTtcbiAgICAgICAgdGhpcy5kbVVzZXIgPSBudWxsOyAvLyBjbGVhciBsaXN0ZW5lcnMsIGlmIGFueVxuICAgIH1cblxuICAgIHByaXZhdGUgZ2V0IGlzUHVibGljUm9vbSgpOiBib29sZWFuIHtcbiAgICAgICAgcmV0dXJuIHRoaXMucHJvcHMucm9vbS5nZXRKb2luUnVsZSgpID09PSBKb2luUnVsZS5QdWJsaWM7XG4gICAgfVxuXG4gICAgcHJpdmF0ZSBnZXQgZG1Vc2VyKCk6IFVzZXIgfCBudWxsIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuX2RtVXNlcjtcbiAgICB9XG5cbiAgICBwcml2YXRlIHNldCBkbVVzZXIodmFsOiBVc2VyIHwgbnVsbCkge1xuICAgICAgICBjb25zdCBvbGRVc2VyID0gdGhpcy5fZG1Vc2VyO1xuICAgICAgICB0aGlzLl9kbVVzZXIgPSB2YWw7XG4gICAgICAgIGlmIChvbGRVc2VyICYmIG9sZFVzZXIgIT09IHRoaXMuX2RtVXNlcikge1xuICAgICAgICAgICAgb2xkVXNlci5vZmYoVXNlckV2ZW50LkN1cnJlbnRseUFjdGl2ZSwgdGhpcy5vblByZXNlbmNlVXBkYXRlKTtcbiAgICAgICAgICAgIG9sZFVzZXIub2ZmKFVzZXJFdmVudC5QcmVzZW5jZSwgdGhpcy5vblByZXNlbmNlVXBkYXRlKTtcbiAgICAgICAgfVxuICAgICAgICBpZiAodGhpcy5fZG1Vc2VyICYmIG9sZFVzZXIgIT09IHRoaXMuX2RtVXNlcikge1xuICAgICAgICAgICAgdGhpcy5fZG1Vc2VyLm9uKFVzZXJFdmVudC5DdXJyZW50bHlBY3RpdmUsIHRoaXMub25QcmVzZW5jZVVwZGF0ZSk7XG4gICAgICAgICAgICB0aGlzLl9kbVVzZXIub24oVXNlckV2ZW50LlByZXNlbmNlLCB0aGlzLm9uUHJlc2VuY2VVcGRhdGUpO1xuICAgICAgICB9XG4gICAgfVxuXG4gICAgcHJpdmF0ZSBvblJvb21UaW1lbGluZSA9IChldjogTWF0cml4RXZlbnQsIHJvb20/OiBSb29tKTogdm9pZCA9PiB7XG4gICAgICAgIGlmICh0aGlzLmlzVW5tb3VudGVkKSByZXR1cm47XG4gICAgICAgIGlmICh0aGlzLnByb3BzLnJvb20ucm9vbUlkICE9PSByb29tPy5yb29tSWQpIHJldHVybjtcblxuICAgICAgICBpZiAoZXYuZ2V0VHlwZSgpID09PSBFdmVudFR5cGUuUm9vbUpvaW5SdWxlcyB8fCBldi5nZXRUeXBlKCkgPT09IEV2ZW50VHlwZS5Sb29tTWVtYmVyKSB7XG4gICAgICAgICAgICBjb25zdCBuZXdJY29uID0gdGhpcy5jYWxjdWxhdGVJY29uKCk7XG4gICAgICAgICAgICBpZiAobmV3SWNvbiAhPT0gdGhpcy5zdGF0ZS5pY29uKSB7XG4gICAgICAgICAgICAgICAgdGhpcy5zZXRTdGF0ZSh7IGljb246IG5ld0ljb24gfSk7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICB9O1xuXG4gICAgcHJpdmF0ZSBvblByZXNlbmNlVXBkYXRlID0gKCk6IHZvaWQgPT4ge1xuICAgICAgICBpZiAodGhpcy5pc1VubW91bnRlZCkgcmV0dXJuO1xuXG4gICAgICAgIGNvbnN0IG5ld0ljb24gPSB0aGlzLmdldFByZXNlbmNlSWNvbigpO1xuICAgICAgICBpZiAobmV3SWNvbiAhPT0gdGhpcy5zdGF0ZS5pY29uKSB0aGlzLnNldFN0YXRlKHsgaWNvbjogbmV3SWNvbiB9KTtcbiAgICB9O1xuXG4gICAgcHJpdmF0ZSBnZXRQcmVzZW5jZUljb24oKTogSWNvbiB7XG4gICAgICAgIGlmICghdGhpcy5kbVVzZXIpIHJldHVybiBJY29uLk5vbmU7XG5cbiAgICAgICAgbGV0IGljb24gPSBJY29uLk5vbmU7XG5cbiAgICAgICAgY29uc3QgaXNPbmxpbmUgPSB0aGlzLmRtVXNlci5jdXJyZW50bHlBY3RpdmUgfHwgdGhpcy5kbVVzZXIucHJlc2VuY2UgPT09IFwib25saW5lXCI7XG4gICAgICAgIGlmIChCVVNZX1BSRVNFTkNFX05BTUUubWF0Y2hlcyh0aGlzLmRtVXNlci5wcmVzZW5jZSkpIHtcbiAgICAgICAgICAgIGljb24gPSBJY29uLlByZXNlbmNlQnVzeTtcbiAgICAgICAgfSBlbHNlIGlmIChpc09ubGluZSkge1xuICAgICAgICAgICAgaWNvbiA9IEljb24uUHJlc2VuY2VPbmxpbmU7XG4gICAgICAgIH0gZWxzZSBpZiAodGhpcy5kbVVzZXIucHJlc2VuY2UgPT09IFwib2ZmbGluZVwiKSB7XG4gICAgICAgICAgICBpY29uID0gSWNvbi5QcmVzZW5jZU9mZmxpbmU7XG4gICAgICAgIH0gZWxzZSBpZiAodGhpcy5kbVVzZXIucHJlc2VuY2UgPT09IFwidW5hdmFpbGFibGVcIikge1xuICAgICAgICAgICAgaWNvbiA9IEljb24uUHJlc2VuY2VBd2F5O1xuICAgICAgICB9XG5cbiAgICAgICAgcmV0dXJuIGljb247XG4gICAgfVxuXG4gICAgcHJpdmF0ZSBjYWxjdWxhdGVJY29uKCk6IEljb24ge1xuICAgICAgICBsZXQgaWNvbiA9IEljb24uTm9uZTtcblxuICAgICAgICAvLyBXZSBsb29rIGF0IHRoZSBETVJvb21NYXAgYW5kIG5vdCB0aGUgdGFnIGhlcmUgc28gdGhhdCB3ZSBkb24ndCBleGNsdWRlIERNcyBpbiBGYXZvdXJpdGVzXG4gICAgICAgIGNvbnN0IG90aGVyVXNlcklkID0gRE1Sb29tTWFwLnNoYXJlZCgpLmdldFVzZXJJZEZvclJvb21JZCh0aGlzLnByb3BzLnJvb20ucm9vbUlkKTtcbiAgICAgICAgaWYgKG90aGVyVXNlcklkICYmIGdldEpvaW5lZE5vbkZ1bmN0aW9uYWxNZW1iZXJzKHRoaXMucHJvcHMucm9vbSkubGVuZ3RoID09PSAyKSB7XG4gICAgICAgICAgICAvLyBUcmFjayBwcmVzZW5jZSwgaWYgYXZhaWxhYmxlXG4gICAgICAgICAgICBpZiAoaXNQcmVzZW5jZUVuYWJsZWQodGhpcy5wcm9wcy5yb29tLmNsaWVudCkpIHtcbiAgICAgICAgICAgICAgICB0aGlzLmRtVXNlciA9IE1hdHJpeENsaWVudFBlZy5zYWZlR2V0KCkuZ2V0VXNlcihvdGhlclVzZXJJZCk7XG4gICAgICAgICAgICAgICAgaWNvbiA9IHRoaXMuZ2V0UHJlc2VuY2VJY29uKCk7XG4gICAgICAgICAgICB9XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAvLyBUcmFjayBwdWJsaWNpdHlcbiAgICAgICAgICAgIGljb24gPSB0aGlzLmlzUHVibGljUm9vbSA/IEljb24uR2xvYmUgOiBJY29uLk5vbmU7XG4gICAgICAgICAgICBpZiAoIXRoaXMuaXNXYXRjaGluZ1RpbWVsaW5lKSB7XG4gICAgICAgICAgICAgICAgdGhpcy5wcm9wcy5yb29tLm9uKFJvb21FdmVudC5UaW1lbGluZSwgdGhpcy5vblJvb21UaW1lbGluZSk7XG4gICAgICAgICAgICAgICAgdGhpcy5pc1dhdGNoaW5nVGltZWxpbmUgPSB0cnVlO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIHJldHVybiBpY29uO1xuICAgIH1cblxuICAgIHB1YmxpYyByZW5kZXIoKTogUmVhY3QuUmVhY3ROb2RlIHtcbiAgICAgICAgLy8gU3ByZWFkIHRoZSByZW1haW5pbmcgcHJvcHMgdG8gbWFrZSBpdCB3b3JrIHdpdGggY29tcG91bmQgY29tcG9uZW50XG4gICAgICAgIGNvbnN0IHsgcm9vbSwgc2l6ZSwgZGlzcGxheUJhZGdlLCBoaWRlSWZEb3QsIG9vYkRhdGEsIHZpZXdBdmF0YXJPbkNsaWNrLCB0b29sdGlwUHJvcHMsIC4uLnByb3BzIH0gPSB0aGlzLnByb3BzO1xuXG4gICAgICAgIGxldCBiYWRnZTogUmVhY3QuUmVhY3ROb2RlO1xuICAgICAgICBpZiAodGhpcy5wcm9wcy5kaXNwbGF5QmFkZ2UgJiYgdGhpcy5zdGF0ZS5ub3RpZmljYXRpb25TdGF0ZSkge1xuICAgICAgICAgICAgYmFkZ2UgPSAoXG4gICAgICAgICAgICAgICAgPE5vdGlmaWNhdGlvbkJhZGdlXG4gICAgICAgICAgICAgICAgICAgIG5vdGlmaWNhdGlvbj17dGhpcy5zdGF0ZS5ub3RpZmljYXRpb25TdGF0ZX1cbiAgICAgICAgICAgICAgICAgICAgaGlkZUlmRG90PXt0aGlzLnByb3BzLmhpZGVJZkRvdH1cbiAgICAgICAgICAgICAgICAgICAgcm9vbUlkPXt0aGlzLnByb3BzLnJvb20ucm9vbUlkfVxuICAgICAgICAgICAgICAgIC8+XG4gICAgICAgICAgICApO1xuICAgICAgICB9XG5cbiAgICAgICAgbGV0IGljb246IEpTWC5FbGVtZW50IHwgdW5kZWZpbmVkO1xuICAgICAgICBpZiAodGhpcy5zdGF0ZS5pY29uICE9PSBJY29uLk5vbmUpIHtcbiAgICAgICAgICAgIGljb24gPSAoXG4gICAgICAgICAgICAgICAgPGRpdlxuICAgICAgICAgICAgICAgICAgICB0YWJJbmRleD17dGhpcy5wcm9wcy50b29sdGlwUHJvcHM/LnRhYkluZGV4ID8/IDB9XG4gICAgICAgICAgICAgICAgICAgIGNsYXNzTmFtZT17YG14X0RlY29yYXRlZFJvb21BdmF0YXJfaWNvbiBteF9EZWNvcmF0ZWRSb29tQXZhdGFyX2ljb25fJHt0aGlzLnN0YXRlLmljb24udG9Mb3dlckNhc2UoKX1gfVxuICAgICAgICAgICAgICAgIC8+XG4gICAgICAgICAgICApO1xuICAgICAgICB9XG5cbiAgICAgICAgY29uc3QgY2xhc3NlcyA9IGNsYXNzTmFtZXMoXCJteF9EZWNvcmF0ZWRSb29tQXZhdGFyXCIsIHtcbiAgICAgICAgICAgIG14X0RlY29yYXRlZFJvb21BdmF0YXJfY3V0b3V0OiBpY29uLFxuICAgICAgICB9KTtcblxuICAgICAgICByZXR1cm4gKFxuICAgICAgICAgICAgPGRpdiBjbGFzc05hbWU9e2NsYXNzZXN9IHsuLi5wcm9wc30+XG4gICAgICAgICAgICAgICAgPFJvb21BdmF0YXJcbiAgICAgICAgICAgICAgICAgICAgcm9vbT17dGhpcy5wcm9wcy5yb29tfVxuICAgICAgICAgICAgICAgICAgICBzaXplPXt0aGlzLnByb3BzLnNpemV9XG4gICAgICAgICAgICAgICAgICAgIG9vYkRhdGE9e3RoaXMucHJvcHMub29iRGF0YX1cbiAgICAgICAgICAgICAgICAgICAgdmlld0F2YXRhck9uQ2xpY2s9e3RoaXMucHJvcHMudmlld0F2YXRhck9uQ2xpY2t9XG4gICAgICAgICAgICAgICAgLz5cbiAgICAgICAgICAgICAgICB7aWNvbiAmJiAoXG4gICAgICAgICAgICAgICAgICAgIDxUb29sdGlwIGxhYmVsPXt0b29sdGlwVGV4dCh0aGlzLnN0YXRlLmljb24pIX0gcGxhY2VtZW50PVwiYm90dG9tXCI+XG4gICAgICAgICAgICAgICAgICAgICAgICB7aWNvbn1cbiAgICAgICAgICAgICAgICAgICAgPC9Ub29sdGlwPlxuICAgICAgICAgICAgICAgICl9XG4gICAgICAgICAgICAgICAge2JhZGdlfVxuICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICk7XG4gICAgfVxufVxuIl0sIm1hcHBpbmdzIjoiOzs7Ozs7Ozs7O0FBUUEsSUFBQUEsTUFBQSxHQUFBQyxzQkFBQSxDQUFBQyxPQUFBO0FBQ0EsSUFBQUMsV0FBQSxHQUFBRixzQkFBQSxDQUFBQyxPQUFBO0FBQ0EsSUFBQUUsT0FBQSxHQUFBRixPQUFBO0FBQ0EsSUFBQUcsZ0JBQUEsR0FBQUgsT0FBQTtBQUNBLElBQUFJLFlBQUEsR0FBQUosT0FBQTtBQUVBLElBQUFLLFdBQUEsR0FBQU4sc0JBQUEsQ0FBQUMs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