UNPKG

matrix-react-sdk

Version:
167 lines (161 loc) 25.8 kB
"use strict"; var _interopRequireDefault = require("@babel/runtime/helpers/interopRequireDefault"); Object.defineProperty(exports, "__esModule", { value: true }); exports.MainGrouper = void 0; var _defineProperty2 = _interopRequireDefault(require("@babel/runtime/helpers/defineProperty")); var _react = _interopRequireDefault(require("react")); var _matrix = require("matrix-js-sdk/src/matrix"); var _BaseGrouper = require("./BaseGrouper"); var _TextForEvent = require("../../../TextForEvent"); var _MatrixClientPeg = require("../../../MatrixClientPeg"); var _DateSeparator = _interopRequireDefault(require("../../views/messages/DateSeparator")); var _HistoryTile = _interopRequireDefault(require("../../views/rooms/HistoryTile")); var _EventListSummary = _interopRequireDefault(require("../../views/elements/EventListSummary")); var _TimelineSeparator = require("../../views/messages/TimelineSeparator"); /* Copyright 2024 New Vector Ltd. Copyright 2023 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 groupedStateEvents = [_matrix.EventType.RoomMember, _matrix.EventType.RoomThirdPartyInvite, _matrix.EventType.RoomServerAcl, _matrix.EventType.RoomPinnedEvents]; // Wrap consecutive grouped events in a ListSummary class MainGrouper extends _BaseGrouper.BaseGrouper { constructor(panel, firstEventAndShouldShow, prevEvent, lastShownEvent, nextEvent, nextEventTile) { super(panel, firstEventAndShouldShow, prevEvent, lastShownEvent, nextEvent, nextEventTile); this.panel = panel; this.firstEventAndShouldShow = firstEventAndShouldShow; this.prevEvent = prevEvent; this.lastShownEvent = lastShownEvent; this.events = [firstEventAndShouldShow]; } shouldGroup({ event: ev, shouldShow }) { if (!shouldShow) { // absorb hidden events so that they do not break up streams of messages & redaction events being grouped return true; } if (this.panel.wantsSeparator(this.events[0].event, ev) === _TimelineSeparator.SeparatorKind.Date) { return false; } if (ev.isState() && groupedStateEvents.includes(ev.getType())) { return true; } if (ev.isRedacted()) { return true; } if (this.panel.showHiddenEvents && !this.panel.shouldShowEvent(ev, true)) { return true; } return false; } add(wrappedEvent) { const { event: ev, shouldShow } = wrappedEvent; if (ev.getType() === _matrix.EventType.RoomMember) { // We can ignore any events that don't actually have a message to display if (!(0, _TextForEvent.hasText)(ev, _MatrixClientPeg.MatrixClientPeg.safeGet(), this.panel.showHiddenEvents)) return; } this.readMarker = this.readMarker || this.panel.readMarkerForEvent(ev.getId(), ev === this.lastShownEvent); if (!this.panel.showHiddenEvents && !shouldShow) { // absorb hidden events to not split the summary return; } if (ev.getType() === _matrix.EventType.RoomPinnedEvents) { // If pinned messages are disabled, don't show the summary return; } this.events.push(wrappedEvent); } generateKey() { return "eventlistsummary-" + this.events[0].event.getId(); } getTiles() { // If we don't have any events to group, don't even try to group them. The logic // below assumes that we have a group of events to deal with, but we might not if // the events we were supposed to group were redacted. if (!this.events?.length) return []; const isGrouped = true; const panel = this.panel; const lastShownEvent = this.lastShownEvent; const ret = []; if (panel.wantsSeparator(this.prevEvent, this.events[0].event) === _TimelineSeparator.SeparatorKind.Date) { const ts = this.events[0].event.getTs(); ret.push( /*#__PURE__*/_react.default.createElement("li", { key: ts + "~" }, /*#__PURE__*/_react.default.createElement(_DateSeparator.default, { roomId: this.events[0].event.getRoomId(), ts: ts }))); } // Ensure that the key of the EventListSummary does not change with new events in either direction. // This will prevent it from being re-created unnecessarily, and instead will allow new props to be provided. // In turn, the shouldComponentUpdate method on ELS can be used to prevent unnecessary renderings. const keyEvent = this.events.find(e => this.panel.grouperKeyMap.get(e.event)); const key = keyEvent && this.panel.grouperKeyMap.has(keyEvent.event) ? this.panel.grouperKeyMap.get(keyEvent.event) : this.generateKey(); if (!keyEvent) { // Populate the weak map with the key. // Note that we only set the key on the specific event it refers to, since this group might get // split up in the future by other intervening events. If we were to set the key on all events // currently in the group, we would risk later giving the same key to multiple groups. this.panel.grouperKeyMap.set(this.events[0].event, key); } let highlightInSummary = false; let eventTiles = this.events.map((e, i) => { if (e.event.getId() === panel.props.highlightedEventId) { highlightInSummary = true; } return panel.getTilesForEvent(i === 0 ? this.prevEvent : this.events[i - 1].event, e, e.event === lastShownEvent, isGrouped, this.nextEvent, this.nextEventTile); }).reduce((a, b) => a.concat(b), []); if (eventTiles.length === 0) { eventTiles = null; } // If a membership event is the start of visible history, tell the user // why they can't see earlier messages if (!this.panel.props.canBackPaginate && !this.prevEvent) { ret.push( /*#__PURE__*/_react.default.createElement(_HistoryTile.default, { key: "historytile" })); } ret.push( /*#__PURE__*/_react.default.createElement(_EventListSummary.default, { key: key, "data-testid": key, events: this.events.map(e => e.event), onToggle: panel.onHeightChanged // Update scroll state , startExpanded: highlightInSummary, layout: this.panel.props.layout }, eventTiles)); if (this.readMarker) { ret.push(this.readMarker); } return ret; } getNewPrevEvent() { return this.events[this.events.length - 1].event; } } exports.MainGrouper = MainGrouper; (0, _defineProperty2.default)(MainGrouper, "canStartGroup", function (panel, { event: ev, shouldShow }) { if (!shouldShow) return false; if (ev.isState() && groupedStateEvents.includes(ev.getType())) { return true; } if (ev.isRedacted()) { return true; } if (panel.showHiddenEvents && !panel.shouldShowEvent(ev, true)) { return true; } return false; }); //# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJuYW1lcyI6WyJfcmVhY3QiLCJfaW50ZXJvcFJlcXVpcmVEZWZhdWx0IiwicmVxdWlyZSIsIl9tYXRyaXgiLCJfQmFzZUdyb3VwZXIiLCJfVGV4dEZvckV2ZW50IiwiX01hdHJpeENsaWVudFBlZyIsIl9EYXRlU2VwYXJhdG9yIiwiX0hpc3RvcnlUaWxlIiwiX0V2ZW50TGlzdFN1bW1hcnkiLCJfVGltZWxpbmVTZXBhcmF0b3IiLCJncm91cGVkU3RhdGVFdmVudHMiLCJFdmVudFR5cGUiLCJSb29tTWVtYmVyIiwiUm9vbVRoaXJkUGFydHlJbnZpdGUiLCJSb29tU2VydmVyQWNsIiwiUm9vbVBpbm5lZEV2ZW50cyIsIk1haW5Hcm91cGVyIiwiQmFzZUdyb3VwZXIiLCJjb25zdHJ1Y3RvciIsInBhbmVsIiwiZmlyc3RFdmVudEFuZFNob3VsZFNob3ciLCJwcmV2RXZlbnQiLCJsYXN0U2hvd25FdmVudCIsIm5leHRFdmVudCIsIm5leHRFdmVudFRpbGUiLCJldmVudHMiLCJzaG91bGRHcm91cCIsImV2ZW50IiwiZXYiLCJzaG91bGRTaG93Iiwid2FudHNTZXBhcmF0b3IiLCJTZXBhcmF0b3JLaW5kIiwiRGF0ZSIsImlzU3RhdGUiLCJpbmNsdWRlcyIsImdldFR5cGUiLCJpc1JlZGFjdGVkIiwic2hvd0hpZGRlbkV2ZW50cyIsInNob3VsZFNob3dFdmVudCIsImFkZCIsIndyYXBwZWRFdmVudCIsImhhc1RleHQiLCJNYXRyaXhDbGllbnRQZWciLCJzYWZlR2V0IiwicmVhZE1hcmtlciIsInJlYWRNYXJrZXJGb3JFdmVudCIsImdldElkIiwicHVzaCIsImdlbmVyYXRlS2V5IiwiZ2V0VGlsZXMiLCJsZW5ndGgiLCJpc0dyb3VwZWQiLCJyZXQiLCJ0cyIsImdldFRzIiwiZGVmYXVsdCIsImNyZWF0ZUVsZW1lbnQiLCJrZXkiLCJyb29tSWQiLCJnZXRSb29tSWQiLCJrZXlFdmVudCIsImZpbmQiLCJlIiwiZ3JvdXBlcktleU1hcCIsImdldCIsImhhcyIsInNldCIsImhpZ2hsaWdodEluU3VtbWFyeSIsImV2ZW50VGlsZXMiLCJtYXAiLCJpIiwicHJvcHMiLCJoaWdobGlnaHRlZEV2ZW50SWQiLCJnZXRUaWxlc0ZvckV2ZW50IiwicmVkdWNlIiwiYSIsImIiLCJjb25jYXQiLCJjYW5CYWNrUGFnaW5hdGUiLCJvblRvZ2dsZSIsIm9uSGVpZ2h0Q2hhbmdlZCIsInN0YXJ0RXhwYW5kZWQiLCJsYXlvdXQiLCJnZXROZXdQcmV2RXZlbnQiLCJleHBvcnRzIiwiX2RlZmluZVByb3BlcnR5MiJdLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uL3NyYy9jb21wb25lbnRzL3N0cnVjdHVyZXMvZ3JvdXBlci9NYWluR3JvdXBlci50c3giXSwic291cmNlc0NvbnRlbnQiOlsiLypcbkNvcHlyaWdodCAyMDI0IE5ldyBWZWN0b3IgTHRkLlxuQ29weXJpZ2h0IDIwMjMgVGhlIE1hdHJpeC5vcmcgRm91bmRhdGlvbiBDLkkuQy5cblxuU1BEWC1MaWNlbnNlLUlkZW50aWZpZXI6IEFHUEwtMy4wLW9ubHkgT1IgR1BMLTMuMC1vbmx5XG5QbGVhc2Ugc2VlIExJQ0VOU0UgZmlsZXMgaW4gdGhlIHJlcG9zaXRvcnkgcm9vdCBmb3IgZnVsbCBkZXRhaWxzLlxuKi9cblxuaW1wb3J0IFJlYWN0LCB7IFJlYWN0Tm9kZSB9IGZyb20gXCJyZWFjdFwiO1xuaW1wb3J0IHsgRXZlbnRUeXBlLCBNYXRyaXhFdmVudCB9IGZyb20gXCJtYXRyaXgtanMtc2RrL3NyYy9tYXRyaXhcIjtcblxuaW1wb3J0IHR5cGUgTWVzc2FnZVBhbmVsIGZyb20gXCIuLi9NZXNzYWdlUGFuZWxcIjtcbmltcG9ydCB0eXBlIHsgV3JhcHBlZEV2ZW50IH0gZnJvbSBcIi4uL01lc3NhZ2VQYW5lbFwiO1xuaW1wb3J0IHsgQmFzZUdyb3VwZXIgfSBmcm9tIFwiLi9CYXNlR3JvdXBlclwiO1xuaW1wb3J0IHsgaGFzVGV4dCB9IGZyb20gXCIuLi8uLi8uLi9UZXh0Rm9yRXZlbnRcIjtcbmltcG9ydCB7IE1hdHJpeENsaWVudFBlZyB9IGZyb20gXCIuLi8uLi8uLi9NYXRyaXhDbGllbnRQZWdcIjtcbmltcG9ydCBEYXRlU2VwYXJhdG9yIGZyb20gXCIuLi8uLi92aWV3cy9tZXNzYWdlcy9EYXRlU2VwYXJhdG9yXCI7XG5pbXBvcnQgSGlzdG9yeVRpbGUgZnJvbSBcIi4uLy4uL3ZpZXdzL3Jvb21zL0hpc3RvcnlUaWxlXCI7XG5pbXBvcnQgRXZlbnRMaXN0U3VtbWFyeSBmcm9tIFwiLi4vLi4vdmlld3MvZWxlbWVudHMvRXZlbnRMaXN0U3VtbWFyeVwiO1xuaW1wb3J0IHsgU2VwYXJhdG9yS2luZCB9IGZyb20gXCIuLi8uLi92aWV3cy9tZXNzYWdlcy9UaW1lbGluZVNlcGFyYXRvclwiO1xuXG5jb25zdCBncm91cGVkU3RhdGVFdmVudHMgPSBbXG4gICAgRXZlbnRUeXBlLlJvb21NZW1iZXIsXG4gICAgRXZlbnRUeXBlLlJvb21UaGlyZFBhcnR5SW52aXRlLFxuICAgIEV2ZW50VHlwZS5Sb29tU2VydmVyQWNsLFxuICAgIEV2ZW50VHlwZS5Sb29tUGlubmVkRXZlbnRzLFxuXTtcblxuLy8gV3JhcCBjb25zZWN1dGl2ZSBncm91cGVkIGV2ZW50cyBpbiBhIExpc3RTdW1tYXJ5XG5leHBvcnQgY2xhc3MgTWFpbkdyb3VwZXIgZXh0ZW5kcyBCYXNlR3JvdXBlciB7XG4gICAgcHVibGljIHN0YXRpYyBjYW5TdGFydEdyb3VwID0gZnVuY3Rpb24gKHBhbmVsOiBNZXNzYWdlUGFuZWwsIHsgZXZlbnQ6IGV2LCBzaG91bGRTaG93IH06IFdyYXBwZWRFdmVudCk6IGJvb2xlYW4ge1xuICAgICAgICBpZiAoIXNob3VsZFNob3cpIHJldHVybiBmYWxzZTtcblxuICAgICAgICBpZiAoZXYuaXNTdGF0ZSgpICYmIGdyb3VwZWRTdGF0ZUV2ZW50cy5pbmNsdWRlcyhldi5nZXRUeXBlKCkgYXMgRXZlbnRUeXBlKSkge1xuICAgICAgICAgICAgcmV0dXJuIHRydWU7XG4gICAgICAgIH1cblxuICAgICAgICBpZiAoZXYuaXNSZWRhY3RlZCgpKSB7XG4gICAgICAgICAgICByZXR1cm4gdHJ1ZTtcbiAgICAgICAgfVxuXG4gICAgICAgIGlmIChwYW5lbC5zaG93SGlkZGVuRXZlbnRzICYmICFwYW5lbC5zaG91bGRTaG93RXZlbnQoZXYsIHRydWUpKSB7XG4gICAgICAgICAgICByZXR1cm4gdHJ1ZTtcbiAgICAgICAgfVxuXG4gICAgICAgIHJldHVybiBmYWxzZTtcbiAgICB9O1xuXG4gICAgcHVibGljIGNvbnN0cnVjdG9yKFxuICAgICAgICBwdWJsaWMgcmVhZG9ubHkgcGFuZWw6IE1lc3NhZ2VQYW5lbCxcbiAgICAgICAgcHVibGljIHJlYWRvbmx5IGZpcnN0RXZlbnRBbmRTaG91bGRTaG93OiBXcmFwcGVkRXZlbnQsXG4gICAgICAgIHB1YmxpYyByZWFkb25seSBwcmV2RXZlbnQ6IE1hdHJpeEV2ZW50IHwgbnVsbCxcbiAgICAgICAgcHVibGljIHJlYWRvbmx5IGxhc3RTaG93bkV2ZW50OiBNYXRyaXhFdmVudCB8IHVuZGVmaW5lZCxcbiAgICAgICAgbmV4dEV2ZW50OiBXcmFwcGVkRXZlbnQgfCBudWxsLFxuICAgICAgICBuZXh0RXZlbnRUaWxlOiBNYXRyaXhFdmVudCB8IG51bGwsXG4gICAgKSB7XG4gICAgICAgIHN1cGVyKHBhbmVsLCBmaXJzdEV2ZW50QW5kU2hvdWxkU2hvdywgcHJldkV2ZW50LCBsYXN0U2hvd25FdmVudCwgbmV4dEV2ZW50LCBuZXh0RXZlbnRUaWxlKTtcbiAgICAgICAgdGhpcy5ldmVudHMgPSBbZmlyc3RFdmVudEFuZFNob3VsZFNob3ddO1xuICAgIH1cblxuICAgIHB1YmxpYyBzaG91bGRHcm91cCh7IGV2ZW50OiBldiwgc2hvdWxkU2hvdyB9OiBXcmFwcGVkRXZlbnQpOiBib29sZWFuIHtcbiAgICAgICAgaWYgKCFzaG91bGRTaG93KSB7XG4gICAgICAgICAgICAvLyBhYnNvcmIgaGlkZGVuIGV2ZW50cyBzbyB0aGF0IHRoZXkgZG8gbm90IGJyZWFrIHVwIHN0cmVhbXMgb2YgbWVzc2FnZXMgJiByZWRhY3Rpb24gZXZlbnRzIGJlaW5nIGdyb3VwZWRcbiAgICAgICAgICAgIHJldHVybiB0cnVlO1xuICAgICAgICB9XG4gICAgICAgIGlmICh0aGlzLnBhbmVsLndhbnRzU2VwYXJhdG9yKHRoaXMuZXZlbnRzWzBdLmV2ZW50LCBldikgPT09IFNlcGFyYXRvcktpbmQuRGF0ZSkge1xuICAgICAgICAgICAgcmV0dXJuIGZhbHNlO1xuICAgICAgICB9XG4gICAgICAgIGlmIChldi5pc1N0YXRlKCkgJiYgZ3JvdXBlZFN0YXRlRXZlbnRzLmluY2x1ZGVzKGV2LmdldFR5cGUoKSBhcyBFdmVudFR5cGUpKSB7XG4gICAgICAgICAgICByZXR1cm4gdHJ1ZTtcbiAgICAgICAgfVxuICAgICAgICBpZiAoZXYuaXNSZWRhY3RlZCgpKSB7XG4gICAgICAgICAgICByZXR1cm4gdHJ1ZTtcbiAgICAgICAgfVxuICAgICAgICBpZiAodGhpcy5wYW5lbC5zaG93SGlkZGVuRXZlbnRzICYmICF0aGlzLnBhbmVsLnNob3VsZFNob3dFdmVudChldiwgdHJ1ZSkpIHtcbiAgICAgICAgICAgIHJldHVybiB0cnVlO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiBmYWxzZTtcbiAgICB9XG5cbiAgICBwdWJsaWMgYWRkKHdyYXBwZWRFdmVudDogV3JhcHBlZEV2ZW50KTogdm9pZCB7XG4gICAgICAgIGNvbnN0IHsgZXZlbnQ6IGV2LCBzaG91bGRTaG93IH0gPSB3cmFwcGVkRXZlbnQ7XG4gICAgICAgIGlmIChldi5nZXRUeXBlKCkgPT09IEV2ZW50VHlwZS5Sb29tTWVtYmVyKSB7XG4gICAgICAgICAgICAvLyBXZSBjYW4gaWdub3JlIGFueSBldmVudHMgdGhhdCBkb24ndCBhY3R1YWxseSBoYXZlIGEgbWVzc2FnZSB0byBkaXNwbGF5XG4gICAgICAgICAgICBpZiAoIWhhc1RleHQoZXYsIE1hdHJpeENsaWVudFBlZy5zYWZlR2V0KCksIHRoaXMucGFuZWwuc2hvd0hpZGRlbkV2ZW50cykpIHJldHVybjtcbiAgICAgICAgfVxuICAgICAgICB0aGlzLnJlYWRNYXJrZXIgPSB0aGlzLnJlYWRNYXJrZXIgfHwgdGhpcy5wYW5lbC5yZWFkTWFya2VyRm9yRXZlbnQoZXYuZ2V0SWQoKSEsIGV2ID09PSB0aGlzLmxhc3RTaG93bkV2ZW50KTtcbiAgICAgICAgaWYgKCF0aGlzLnBhbmVsLnNob3dIaWRkZW5FdmVudHMgJiYgIXNob3VsZFNob3cpIHtcbiAgICAgICAgICAgIC8vIGFic29yYiBoaWRkZW4gZXZlbnRzIHRvIG5vdCBzcGxpdCB0aGUgc3VtbWFyeVxuICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICB9XG5cbiAgICAgICAgaWYgKGV2LmdldFR5cGUoKSA9PT0gRXZlbnRUeXBlLlJvb21QaW5uZWRFdmVudHMpIHtcbiAgICAgICAgICAgIC8vIElmIHBpbm5lZCBtZXNzYWdlcyBhcmUgZGlzYWJsZWQsIGRvbid0IHNob3cgdGhlIHN1bW1hcnlcbiAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgfVxuXG4gICAgICAgIHRoaXMuZXZlbnRzLnB1c2god3JhcHBlZEV2ZW50KTtcbiAgICB9XG5cbiAgICBwcml2YXRlIGdlbmVyYXRlS2V5KCk6IHN0cmluZyB7XG4gICAgICAgIHJldHVybiBcImV2ZW50bGlzdHN1bW1hcnktXCIgKyB0aGlzLmV2ZW50c1swXS5ldmVudC5nZXRJZCgpO1xuICAgIH1cblxuICAgIHB1YmxpYyBnZXRUaWxlcygpOiBSZWFjdE5vZGVbXSB7XG4gICAgICAgIC8vIElmIHdlIGRvbid0IGhhdmUgYW55IGV2ZW50cyB0byBncm91cCwgZG9uJ3QgZXZlbiB0cnkgdG8gZ3JvdXAgdGhlbS4gVGhlIGxvZ2ljXG4gICAgICAgIC8vIGJlbG93IGFzc3VtZXMgdGhhdCB3ZSBoYXZlIGEgZ3JvdXAgb2YgZXZlbnRzIHRvIGRlYWwgd2l0aCwgYnV0IHdlIG1pZ2h0IG5vdCBpZlxuICAgICAgICAvLyB0aGUgZXZlbnRzIHdlIHdlcmUgc3VwcG9zZWQgdG8gZ3JvdXAgd2VyZSByZWRhY3RlZC5cbiAgICAgICAgaWYgKCF0aGlzLmV2ZW50cz8ubGVuZ3RoKSByZXR1cm4gW107XG5cbiAgICAgICAgY29uc3QgaXNHcm91cGVkID0gdHJ1ZTtcbiAgICAgICAgY29uc3QgcGFuZWwgPSB0aGlzLnBhbmVsO1xuICAgICAgICBjb25zdCBsYXN0U2hvd25FdmVudCA9IHRoaXMubGFzdFNob3duRXZlbnQ7XG4gICAgICAgIGNvbnN0IHJldDogUmVhY3ROb2RlW10gPSBbXTtcblxuICAgICAgICBpZiAocGFuZWwud2FudHNTZXBhcmF0b3IodGhpcy5wcmV2RXZlbnQsIHRoaXMuZXZlbnRzWzBdLmV2ZW50KSA9PT0gU2VwYXJhdG9yS2luZC5EYXRlKSB7XG4gICAgICAgICAgICBjb25zdCB0cyA9IHRoaXMuZXZlbnRzWzBdLmV2ZW50LmdldFRzKCk7XG4gICAgICAgICAgICByZXQucHVzaChcbiAgICAgICAgICAgICAgICA8bGkga2V5PXt0cyArIFwiflwifT5cbiAgICAgICAgICAgICAgICAgICAgPERhdGVTZXBhcmF0b3Igcm9vbUlkPXt0aGlzLmV2ZW50c1swXS5ldmVudC5nZXRSb29tSWQoKSF9IHRzPXt0c30gLz5cbiAgICAgICAgICAgICAgICA8L2xpPixcbiAgICAgICAgICAgICk7XG4gICAgICAgIH1cblxuICAgICAgICAvLyBFbnN1cmUgdGhhdCB0aGUga2V5IG9mIHRoZSBFdmVudExpc3RTdW1tYXJ5IGRvZXMgbm90IGNoYW5nZSB3aXRoIG5ldyBldmVudHMgaW4gZWl0aGVyIGRpcmVjdGlvbi5cbiAgICAgICAgLy8gVGhpcyB3aWxsIHByZXZlbnQgaXQgZnJvbSBiZWluZyByZS1jcmVhdGVkIHVubmVjZXNzYXJpbHksIGFuZCBpbnN0ZWFkIHdpbGwgYWxsb3cgbmV3IHByb3BzIHRvIGJlIHByb3ZpZGVkLlxuICAgICAgICAvLyBJbiB0dXJuLCB0aGUgc2hvdWxkQ29tcG9uZW50VXBkYXRlIG1ldGhvZCBvbiBFTFMgY2FuIGJlIHVzZWQgdG8gcHJldmVudCB1bm5lY2Vzc2FyeSByZW5kZXJpbmdzLlxuICAgICAgICBjb25zdCBrZXlFdmVudCA9IHRoaXMuZXZlbnRzLmZpbmQoKGUpID0+IHRoaXMucGFuZWwuZ3JvdXBlcktleU1hcC5nZXQoZS5ldmVudCkpO1xuICAgICAgICBjb25zdCBrZXkgPVxuICAgICAgICAgICAga2V5RXZlbnQgJiYgdGhpcy5wYW5lbC5ncm91cGVyS2V5TWFwLmhhcyhrZXlFdmVudC5ldmVudClcbiAgICAgICAgICAgICAgICA/IHRoaXMucGFuZWwuZ3JvdXBlcktleU1hcC5nZXQoa2V5RXZlbnQuZXZlbnQpIVxuICAgICAgICAgICAgICAgIDogdGhpcy5nZW5lcmF0ZUtleSgpO1xuICAgICAgICBpZiAoIWtleUV2ZW50KSB7XG4gICAgICAgICAgICAvLyBQb3B1bGF0ZSB0aGUgd2VhayBtYXAgd2l0aCB0aGUga2V5LlxuICAgICAgICAgICAgLy8gTm90ZSB0aGF0IHdlIG9ubHkgc2V0IHRoZSBrZXkgb24gdGhlIHNwZWNpZmljIGV2ZW50IGl0IHJlZmVycyB0bywgc2luY2UgdGhpcyBncm91cCBtaWdodCBnZXRcbiAgICAgICAgICAgIC8vIHNwbGl0IHVwIGluIHRoZSBmdXR1cmUgYnkgb3RoZXIgaW50ZXJ2ZW5pbmcgZXZlbnRzLiBJZiB3ZSB3ZXJlIHRvIHNldCB0aGUga2V5IG9uIGFsbCBldmVudHNcbiAgICAgICAgICAgIC8vIGN1cnJlbnRseSBpbiB0aGUgZ3JvdXAsIHdlIHdvdWxkIHJpc2sgbGF0ZXIgZ2l2aW5nIHRoZSBzYW1lIGtleSB0byBtdWx0aXBsZSBncm91cHMuXG4gICAgICAgICAgICB0aGlzLnBhbmVsLmdyb3VwZXJLZXlNYXAuc2V0KHRoaXMuZXZlbnRzWzBdLmV2ZW50LCBrZXkpO1xuICAgICAgICB9XG5cbiAgICAgICAgbGV0IGhpZ2hsaWdodEluU3VtbWFyeSA9IGZhbHNlO1xuICAgICAgICBsZXQgZXZlbnRUaWxlczogUmVhY3ROb2RlW10gfCBudWxsID0gdGhpcy5ldmVudHNcbiAgICAgICAgICAgIC5tYXAoKGUsIGkpID0+IHtcbiAgICAgICAgICAgICAgICBpZiAoZS5ldmVudC5nZXRJZCgpID09PSBwYW5lbC5wcm9wcy5oaWdobGlnaHRlZEV2ZW50SWQpIHtcbiAgICAgICAgICAgICAgICAgICAgaGlnaGxpZ2h0SW5TdW1tYXJ5ID0gdHJ1ZTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgcmV0dXJuIHBhbmVsLmdldFRpbGVzRm9yRXZlbnQoXG4gICAgICAgICAgICAgICAgICAgIGkgPT09IDAgPyB0aGlzLnByZXZFdmVudCA6IHRoaXMuZXZlbnRzW2kgLSAxXS5ldmVudCxcbiAgICAgICAgICAgICAgICAgICAgZSxcbiAgICAgICAgICAgICAgICAgICAgZS5ldmVudCA9PT0gbGFzdFNob3duRXZlbnQsXG4gICAgICAgICAgICAgICAgICAgIGlzR3JvdXBlZCxcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5uZXh0RXZlbnQsXG4gICAgICAgICAgICAgICAgICAgIHRoaXMubmV4dEV2ZW50VGlsZSxcbiAgICAgICAgICAgICAgICApO1xuICAgICAgICAgICAgfSlcbiAgICAgICAgICAgIC5yZWR1Y2UoKGEsIGIpID0+IGEuY29uY2F0KGIpLCBbXSk7XG5cbiAgICAgICAgaWYgKGV2ZW50VGlsZXMubGVuZ3RoID09PSAwKSB7XG4gICAgICAgICAgICBldmVudFRpbGVzID0gbnVsbDtcbiAgICAgICAgfVxuXG4gICAgICAgIC8vIElmIGEgbWVtYmVyc2hpcCBldmVudCBpcyB0aGUgc3RhcnQgb2YgdmlzaWJsZSBoaXN0b3J5LCB0ZWxsIHRoZSB1c2VyXG4gICAgICAgIC8vIHdoeSB0aGV5IGNhbid0IHNlZSBlYXJsaWVyIG1lc3NhZ2VzXG4gICAgICAgIGlmICghdGhpcy5wYW5lbC5wcm9wcy5jYW5CYWNrUGFnaW5hdGUgJiYgIXRoaXMucHJldkV2ZW50KSB7XG4gICAgICAgICAgICByZXQucHVzaCg8SGlzdG9yeVRpbGUga2V5PVwiaGlzdG9yeXRpbGVcIiAvPik7XG4gICAgICAgIH1cblxuICAgICAgICByZXQucHVzaChcbiAgICAgICAgICAgIDxFdmVudExpc3RTdW1tYXJ5XG4gICAgICAgICAgICAgICAga2V5PXtrZXl9XG4gICAgICAgICAgICAgICAgZGF0YS10ZXN0aWQ9e2tleX1cbiAgICAgICAgICAgICAgICBldmVudHM9e3RoaXMuZXZlbnRzLm1hcCgoZSkgPT4gZS5ldmVudCl9XG4gICAgICAgICAgICAgICAgb25Ub2dnbGU9e3BhbmVsLm9uSGVpZ2h0Q2hhbmdlZH0gLy8gVXBkYXRlIHNjcm9sbCBzdGF0ZVxuICAgICAgICAgICAgICAgIHN0YXJ0RXhwYW5kZWQ9e2hpZ2hsaWdodEluU3VtbWFyeX1cbiAgICAgICAgICAgICAgICBsYXlvdXQ9e3RoaXMucGFuZWwucHJvcHMubGF5b3V0fVxuICAgICAgICAgICAgPlxuICAgICAgICAgICAgICAgIHtldmVudFRpbGVzfVxuICAgICAgICAgICAgPC9FdmVudExpc3RTdW1tYXJ5PixcbiAgICAgICAgKTtcblxuICAgICAgICBpZiAodGhpcy5yZWFkTWFya2VyKSB7XG4gICAgICAgICAgICByZXQucHVzaCh0aGlzLnJlYWRNYXJrZXIpO1xuICAgICAgICB9XG5cbiAgICAgICAgcmV0dXJuIHJldDtcbiAgICB9XG5cbiAgICBwdWJsaWMgZ2V0TmV3UHJldkV2ZW50KCk6IE1hdHJpeEV2ZW50IHtcbiAgICAgICAgcmV0dXJuIHRoaXMuZXZlbnRzW3RoaXMuZXZlbnRzLmxlbmd0aCAtIDFdLmV2ZW50O1xuICAgIH1cbn1cbiJdLCJtYXBwaW5ncyI6Ijs7Ozs7Ozs7QUFRQSxJQUFBQSxNQUFBLEdBQUFDLHNCQUFBLENBQUFDLE9BQUE7QUFDQSxJQUFBQyxPQUFBLEdBQUFELE9BQUE7QUFJQSxJQUFBRSxZQUFBLEdBQUFGLE9BQUE7QUFDQSxJQUFBRyxhQUFBLEdBQUFILE9BQUE7QUFDQSxJQUFBSSxnQkFBQSxHQUFBSixPQUFBO0FBQ0EsSUFBQUssY0FBQSxHQUFBTixzQkFBQSxDQUFBQyxPQUFBO0FBQ0EsSUFBQU0sWUFBQSxHQUFBUCxzQkFBQSxDQUFBQyxPQUFBO0FBQ0EsSUFBQU8saUJBQUEsR0FBQVIsc0JBQUEsQ0FBQUMsT0FB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