UNPKG

matrix-react-sdk

Version:
137 lines (126 loc) 19 kB
"use strict"; var _interopRequireDefault = require("@babel/runtime/helpers/interopRequireDefault"); Object.defineProperty(exports, "__esModule", { value: true }); exports.default = void 0; var _defineProperty2 = _interopRequireDefault(require("@babel/runtime/helpers/defineProperty")); var _matrix = require("matrix-js-sdk/src/matrix"); var _EventUtils = require("./EventUtils"); var _types = require("../components/views/right_panel/types"); /* Copyright 2024 New Vector Ltd. Copyright 2017 Travis Ralston SPDX-License-Identifier: AGPL-3.0-only OR GPL-3.0-only Please see LICENSE files in the repository root for full details. */ class PinningUtils { /** * Determines if the given event can be pinned. * This is a simple check to see if the event is of a type that can be pinned. * @param {MatrixEvent} event The event to check. * @return {boolean} True if the event may be pinned, false otherwise. */ static isPinnable(event) { if (event.isRedacted()) return false; return PinningUtils.isUnpinnable(event); } /** * Determines if the given event may be unpinned. * @param {MatrixEvent} event The event to check. * @return {boolean} True if the event may be unpinned, false otherwise. */ static isUnpinnable(event) { if (!event) return false; if (event.isRedacted()) return true; return this.PINNABLE_EVENT_TYPES.includes(event.getType()); } /** * Determines if the given event is pinned. * @param matrixClient * @param mxEvent */ static isPinned(matrixClient, mxEvent) { const room = matrixClient.getRoom(mxEvent.getRoomId()); if (!room) return false; const pinnedEvent = room.getLiveTimeline().getState(_matrix.EventTimeline.FORWARDS)?.getStateEvents(_matrix.EventType.RoomPinnedEvents, ""); if (!pinnedEvent) return false; const content = pinnedEvent.getContent(); return content.pinned && Array.isArray(content.pinned) && content.pinned.includes(mxEvent.getId()); } /** * Determines if the given event may be pinned by the current user. * This checks if the user has the necessary permissions to pin or unpin the event, and if the event is pinnable. * @param matrixClient * @param mxEvent */ static canPin(matrixClient, mxEvent) { if (!(0, _EventUtils.isContentActionable)(mxEvent)) return false; const room = matrixClient.getRoom(mxEvent.getRoomId()); if (!room) return false; return PinningUtils.userHasPinOrUnpinPermission(matrixClient, room) && PinningUtils.isPinnable(mxEvent); } /** * Determines if the given event may be unpinned by the current user. * This checks if the user has the necessary permissions to pin or unpin the event, and if the event is unpinnable. * @param matrixClient * @param mxEvent */ static canUnpin(matrixClient, mxEvent) { const room = matrixClient.getRoom(mxEvent.getRoomId()); if (!room) return false; return PinningUtils.userHasPinOrUnpinPermission(matrixClient, room) && PinningUtils.isUnpinnable(mxEvent); } /** * Determines if the current user has permission to pin or unpin events in the given room. * @param matrixClient * @param room */ static userHasPinOrUnpinPermission(matrixClient, room) { return Boolean(room.getLiveTimeline().getState(_matrix.EventTimeline.FORWARDS)?.mayClientSendStateEvent(_matrix.EventType.RoomPinnedEvents, matrixClient)); } /** * Pin or unpin the given event. * @param matrixClient * @param mxEvent */ static async pinOrUnpinEvent(matrixClient, mxEvent) { const room = matrixClient.getRoom(mxEvent.getRoomId()); if (!room) return; const eventId = mxEvent.getId(); if (!eventId) return; // Get the current pinned events of the room const pinnedIds = room.getLiveTimeline().getState(_matrix.EventTimeline.FORWARDS)?.getStateEvents(_matrix.EventType.RoomPinnedEvents, "")?.getContent().pinned || []; let roomAccountDataPromise = Promise.resolve(); // If the event is already pinned, unpin it if (pinnedIds.includes(eventId)) { pinnedIds.splice(pinnedIds.indexOf(eventId), 1); } else { // Otherwise, pin it pinnedIds.push(eventId); // We don't want to wait for the roomAccountDataPromise to resolve before sending the state event roomAccountDataPromise = matrixClient.setRoomAccountData(room.roomId, _types.ReadPinsEventId, { event_ids: [...(room.getAccountData(_types.ReadPinsEventId)?.getContent()?.event_ids || []), eventId] }); } await Promise.all([matrixClient.sendStateEvent(room.roomId, _matrix.EventType.RoomPinnedEvents, { pinned: pinnedIds }, ""), roomAccountDataPromise]); } /** * Unpin all events in the given room. * @param matrixClient * @param roomId */ static async unpinAllEvents(matrixClient, roomId) { await matrixClient.sendStateEvent(roomId, _matrix.EventType.RoomPinnedEvents, { pinned: [] }, ""); } } exports.default = PinningUtils; /** * Event types that may be pinned. */ (0, _defineProperty2.default)(PinningUtils, "PINNABLE_EVENT_TYPES", [_matrix.EventType.RoomMessage, _matrix.M_POLL_START.name, _matrix.M_POLL_START.altName]); //# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJuYW1lcyI6WyJfbWF0cml4IiwicmVxdWlyZSIsIl9FdmVudFV0aWxzIiwiX3R5cGVzIiwiUGlubmluZ1V0aWxzIiwiaXNQaW5uYWJsZSIsImV2ZW50IiwiaXNSZWRhY3RlZCIsImlzVW5waW5uYWJsZSIsIlBJTk5BQkxFX0VWRU5UX1RZUEVTIiwiaW5jbHVkZXMiLCJnZXRUeXBlIiwiaXNQaW5uZWQiLCJtYXRyaXhDbGllbnQiLCJteEV2ZW50Iiwicm9vbSIsImdldFJvb20iLCJnZXRSb29tSWQiLCJwaW5uZWRFdmVudCIsImdldExpdmVUaW1lbGluZSIsImdldFN0YXRlIiwiRXZlbnRUaW1lbGluZSIsIkZPUldBUkRTIiwiZ2V0U3RhdGVFdmVudHMiLCJFdmVudFR5cGUiLCJSb29tUGlubmVkRXZlbnRzIiwiY29udGVudCIsImdldENvbnRlbnQiLCJwaW5uZWQiLCJBcnJheSIsImlzQXJyYXkiLCJnZXRJZCIsImNhblBpbiIsImlzQ29udGVudEFjdGlvbmFibGUiLCJ1c2VySGFzUGluT3JVbnBpblBlcm1pc3Npb24iLCJjYW5VbnBpbiIsIkJvb2xlYW4iLCJtYXlDbGllbnRTZW5kU3RhdGVFdmVudCIsInBpbk9yVW5waW5FdmVudCIsImV2ZW50SWQiLCJwaW5uZWRJZHMiLCJyb29tQWNjb3VudERhdGFQcm9taXNlIiwiUHJvbWlzZSIsInJlc29sdmUiLCJzcGxpY2UiLCJpbmRleE9mIiwicHVzaCIsInNldFJvb21BY2NvdW50RGF0YSIsInJvb21JZCIsIlJlYWRQaW5zRXZlbnRJZCIsImV2ZW50X2lkcyIsImdldEFjY291bnREYXRhIiwiYWxsIiwic2VuZFN0YXRlRXZlbnQiLCJ1bnBpbkFsbEV2ZW50cyIsImV4cG9ydHMiLCJkZWZhdWx0IiwiX2RlZmluZVByb3BlcnR5MiIsIlJvb21NZXNzYWdlIiwiTV9QT0xMX1NUQVJUIiwibmFtZSIsImFsdE5hbWUiXSwic291cmNlcyI6WyIuLi8uLi9zcmMvdXRpbHMvUGlubmluZ1V0aWxzLnRzIl0sInNvdXJjZXNDb250ZW50IjpbIi8qXG5Db3B5cmlnaHQgMjAyNCBOZXcgVmVjdG9yIEx0ZC5cbkNvcHlyaWdodCAyMDE3IFRyYXZpcyBSYWxzdG9uXG5cblNQRFgtTGljZW5zZS1JZGVudGlmaWVyOiBBR1BMLTMuMC1vbmx5IE9SIEdQTC0zLjAtb25seVxuUGxlYXNlIHNlZSBMSUNFTlNFIGZpbGVzIGluIHRoZSByZXBvc2l0b3J5IHJvb3QgZm9yIGZ1bGwgZGV0YWlscy5cbiovXG5cbmltcG9ydCB7IE1hdHJpeEV2ZW50LCBFdmVudFR5cGUsIE1fUE9MTF9TVEFSVCwgTWF0cml4Q2xpZW50LCBFdmVudFRpbWVsaW5lLCBSb29tIH0gZnJvbSBcIm1hdHJpeC1qcy1zZGsvc3JjL21hdHJpeFwiO1xuXG5pbXBvcnQgeyBpc0NvbnRlbnRBY3Rpb25hYmxlIH0gZnJvbSBcIi4vRXZlbnRVdGlsc1wiO1xuaW1wb3J0IHsgUmVhZFBpbnNFdmVudElkIH0gZnJvbSBcIi4uL2NvbXBvbmVudHMvdmlld3MvcmlnaHRfcGFuZWwvdHlwZXNcIjtcblxuZXhwb3J0IGRlZmF1bHQgY2xhc3MgUGlubmluZ1V0aWxzIHtcbiAgICAvKipcbiAgICAgKiBFdmVudCB0eXBlcyB0aGF0IG1heSBiZSBwaW5uZWQuXG4gICAgICovXG4gICAgcHVibGljIHN0YXRpYyByZWFkb25seSBQSU5OQUJMRV9FVkVOVF9UWVBFUzogKEV2ZW50VHlwZSB8IHN0cmluZylbXSA9IFtcbiAgICAgICAgRXZlbnRUeXBlLlJvb21NZXNzYWdlLFxuICAgICAgICBNX1BPTExfU1RBUlQubmFtZSxcbiAgICAgICAgTV9QT0xMX1NUQVJULmFsdE5hbWUsXG4gICAgXTtcblxuICAgIC8qKlxuICAgICAqIERldGVybWluZXMgaWYgdGhlIGdpdmVuIGV2ZW50IGNhbiBiZSBwaW5uZWQuXG4gICAgICogVGhpcyBpcyBhIHNpbXBsZSBjaGVjayB0byBzZWUgaWYgdGhlIGV2ZW50IGlzIG9mIGEgdHlwZSB0aGF0IGNhbiBiZSBwaW5uZWQuXG4gICAgICogQHBhcmFtIHtNYXRyaXhFdmVudH0gZXZlbnQgVGhlIGV2ZW50IHRvIGNoZWNrLlxuICAgICAqIEByZXR1cm4ge2Jvb2xlYW59IFRydWUgaWYgdGhlIGV2ZW50IG1heSBiZSBwaW5uZWQsIGZhbHNlIG90aGVyd2lzZS5cbiAgICAgKi9cbiAgICBwdWJsaWMgc3RhdGljIGlzUGlubmFibGUoZXZlbnQ6IE1hdHJpeEV2ZW50KTogYm9vbGVhbiB7XG4gICAgICAgIGlmIChldmVudC5pc1JlZGFjdGVkKCkpIHJldHVybiBmYWxzZTtcbiAgICAgICAgcmV0dXJuIFBpbm5pbmdVdGlscy5pc1VucGlubmFibGUoZXZlbnQpO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIERldGVybWluZXMgaWYgdGhlIGdpdmVuIGV2ZW50IG1heSBiZSB1bnBpbm5lZC5cbiAgICAgKiBAcGFyYW0ge01hdHJpeEV2ZW50fSBldmVudCBUaGUgZXZlbnQgdG8gY2hlY2suXG4gICAgICogQHJldHVybiB7Ym9vbGVhbn0gVHJ1ZSBpZiB0aGUgZXZlbnQgbWF5IGJlIHVucGlubmVkLCBmYWxzZSBvdGhlcndpc2UuXG4gICAgICovXG4gICAgcHVibGljIHN0YXRpYyBpc1VucGlubmFibGUoZXZlbnQ6IE1hdHJpeEV2ZW50KTogYm9vbGVhbiB7XG4gICAgICAgIGlmICghZXZlbnQpIHJldHVybiBmYWxzZTtcbiAgICAgICAgaWYgKGV2ZW50LmlzUmVkYWN0ZWQoKSkgcmV0dXJuIHRydWU7XG4gICAgICAgIHJldHVybiB0aGlzLlBJTk5BQkxFX0VWRU5UX1RZUEVTLmluY2x1ZGVzKGV2ZW50LmdldFR5cGUoKSk7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogRGV0ZXJtaW5lcyBpZiB0aGUgZ2l2ZW4gZXZlbnQgaXMgcGlubmVkLlxuICAgICAqIEBwYXJhbSBtYXRyaXhDbGllbnRcbiAgICAgKiBAcGFyYW0gbXhFdmVudFxuICAgICAqL1xuICAgIHB1YmxpYyBzdGF0aWMgaXNQaW5uZWQobWF0cml4Q2xpZW50OiBNYXRyaXhDbGllbnQsIG14RXZlbnQ6IE1hdHJpeEV2ZW50KTogYm9vbGVhbiB7XG4gICAgICAgIGNvbnN0IHJvb20gPSBtYXRyaXhDbGllbnQuZ2V0Um9vbShteEV2ZW50LmdldFJvb21JZCgpKTtcbiAgICAgICAgaWYgKCFyb29tKSByZXR1cm4gZmFsc2U7XG5cbiAgICAgICAgY29uc3QgcGlubmVkRXZlbnQgPSByb29tXG4gICAgICAgICAgICAuZ2V0TGl2ZVRpbWVsaW5lKClcbiAgICAgICAgICAgIC5nZXRTdGF0ZShFdmVudFRpbWVsaW5lLkZPUldBUkRTKVxuICAgICAgICAgICAgPy5nZXRTdGF0ZUV2ZW50cyhFdmVudFR5cGUuUm9vbVBpbm5lZEV2ZW50cywgXCJcIik7XG4gICAgICAgIGlmICghcGlubmVkRXZlbnQpIHJldHVybiBmYWxzZTtcbiAgICAgICAgY29uc3QgY29udGVudCA9IHBpbm5lZEV2ZW50LmdldENvbnRlbnQoKTtcbiAgICAgICAgcmV0dXJuIGNvbnRlbnQucGlubmVkICYmIEFycmF5LmlzQXJyYXkoY29udGVudC5waW5uZWQpICYmIGNvbnRlbnQucGlubmVkLmluY2x1ZGVzKG14RXZlbnQuZ2V0SWQoKSk7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogRGV0ZXJtaW5lcyBpZiB0aGUgZ2l2ZW4gZXZlbnQgbWF5IGJlIHBpbm5lZCBieSB0aGUgY3VycmVudCB1c2VyLlxuICAgICAqIFRoaXMgY2hlY2tzIGlmIHRoZSB1c2VyIGhhcyB0aGUgbmVjZXNzYXJ5IHBlcm1pc3Npb25zIHRvIHBpbiBvciB1bnBpbiB0aGUgZXZlbnQsIGFuZCBpZiB0aGUgZXZlbnQgaXMgcGlubmFibGUuXG4gICAgICogQHBhcmFtIG1hdHJpeENsaWVudFxuICAgICAqIEBwYXJhbSBteEV2ZW50XG4gICAgICovXG4gICAgcHVibGljIHN0YXRpYyBjYW5QaW4obWF0cml4Q2xpZW50OiBNYXRyaXhDbGllbnQsIG14RXZlbnQ6IE1hdHJpeEV2ZW50KTogYm9vbGVhbiB7XG4gICAgICAgIGlmICghaXNDb250ZW50QWN0aW9uYWJsZShteEV2ZW50KSkgcmV0dXJuIGZhbHNlO1xuXG4gICAgICAgIGNvbnN0IHJvb20gPSBtYXRyaXhDbGllbnQuZ2V0Um9vbShteEV2ZW50LmdldFJvb21JZCgpKTtcbiAgICAgICAgaWYgKCFyb29tKSByZXR1cm4gZmFsc2U7XG5cbiAgICAgICAgcmV0dXJuIFBpbm5pbmdVdGlscy51c2VySGFzUGluT3JVbnBpblBlcm1pc3Npb24obWF0cml4Q2xpZW50LCByb29tKSAmJiBQaW5uaW5nVXRpbHMuaXNQaW5uYWJsZShteEV2ZW50KTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBEZXRlcm1pbmVzIGlmIHRoZSBnaXZlbiBldmVudCBtYXkgYmUgdW5waW5uZWQgYnkgdGhlIGN1cnJlbnQgdXNlci5cbiAgICAgKiBUaGlzIGNoZWNrcyBpZiB0aGUgdXNlciBoYXMgdGhlIG5lY2Vzc2FyeSBwZXJtaXNzaW9ucyB0byBwaW4gb3IgdW5waW4gdGhlIGV2ZW50LCBhbmQgaWYgdGhlIGV2ZW50IGlzIHVucGlubmFibGUuXG4gICAgICogQHBhcmFtIG1hdHJpeENsaWVudFxuICAgICAqIEBwYXJhbSBteEV2ZW50XG4gICAgICovXG4gICAgcHVibGljIHN0YXRpYyBjYW5VbnBpbihtYXRyaXhDbGllbnQ6IE1hdHJpeENsaWVudCwgbXhFdmVudDogTWF0cml4RXZlbnQpOiBib29sZWFuIHtcbiAgICAgICAgY29uc3Qgcm9vbSA9IG1hdHJpeENsaWVudC5nZXRSb29tKG14RXZlbnQuZ2V0Um9vbUlkKCkpO1xuICAgICAgICBpZiAoIXJvb20pIHJldHVybiBmYWxzZTtcblxuICAgICAgICByZXR1cm4gUGlubmluZ1V0aWxzLnVzZXJIYXNQaW5PclVucGluUGVybWlzc2lvbihtYXRyaXhDbGllbnQsIHJvb20pICYmIFBpbm5pbmdVdGlscy5pc1VucGlubmFibGUobXhFdmVudCk7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogRGV0ZXJtaW5lcyBpZiB0aGUgY3VycmVudCB1c2VyIGhhcyBwZXJtaXNzaW9uIHRvIHBpbiBvciB1bnBpbiBldmVudHMgaW4gdGhlIGdpdmVuIHJvb20uXG4gICAgICogQHBhcmFtIG1hdHJpeENsaWVudFxuICAgICAqIEBwYXJhbSByb29tXG4gICAgICovXG4gICAgcHVibGljIHN0YXRpYyB1c2VySGFzUGluT3JVbnBpblBlcm1pc3Npb24obWF0cml4Q2xpZW50OiBNYXRyaXhDbGllbnQsIHJvb206IFJvb20pOiBib29sZWFuIHtcbiAgICAgICAgcmV0dXJuIEJvb2xlYW4oXG4gICAgICAgICAgICByb29tXG4gICAgICAgICAgICAgICAgLmdldExpdmVUaW1lbGluZSgpXG4gICAgICAgICAgICAgICAgLmdldFN0YXRlKEV2ZW50VGltZWxpbmUuRk9SV0FSRFMpXG4gICAgICAgICAgICAgICAgPy5tYXlDbGllbnRTZW5kU3RhdGVFdmVudChFdmVudFR5cGUuUm9vbVBpbm5lZEV2ZW50cywgbWF0cml4Q2xpZW50KSxcbiAgICAgICAgKTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBQaW4gb3IgdW5waW4gdGhlIGdpdmVuIGV2ZW50LlxuICAgICAqIEBwYXJhbSBtYXRyaXhDbGllbnRcbiAgICAgKiBAcGFyYW0gbXhFdmVudFxuICAgICAqL1xuICAgIHB1YmxpYyBzdGF0aWMgYXN5bmMgcGluT3JVbnBpbkV2ZW50KG1hdHJpeENsaWVudDogTWF0cml4Q2xpZW50LCBteEV2ZW50OiBNYXRyaXhFdmVudCk6IFByb21pc2U8dm9pZD4ge1xuICAgICAgICBjb25zdCByb29tID0gbWF0cml4Q2xpZW50LmdldFJvb20obXhFdmVudC5nZXRSb29tSWQoKSk7XG4gICAgICAgIGlmICghcm9vbSkgcmV0dXJuO1xuXG4gICAgICAgIGNvbnN0IGV2ZW50SWQgPSBteEV2ZW50LmdldElkKCk7XG4gICAgICAgIGlmICghZXZlbnRJZCkgcmV0dXJuO1xuXG4gICAgICAgIC8vIEdldCB0aGUgY3VycmVudCBwaW5uZWQgZXZlbnRzIG9mIHRoZSByb29tXG4gICAgICAgIGNvbnN0IHBpbm5lZElkczogQXJyYXk8c3RyaW5nPiA9XG4gICAgICAgICAgICByb29tXG4gICAgICAgICAgICAgICAgLmdldExpdmVUaW1lbGluZSgpXG4gICAgICAgICAgICAgICAgLmdldFN0YXRlKEV2ZW50VGltZWxpbmUuRk9SV0FSRFMpXG4gICAgICAgICAgICAgICAgPy5nZXRTdGF0ZUV2ZW50cyhFdmVudFR5cGUuUm9vbVBpbm5lZEV2ZW50cywgXCJcIilcbiAgICAgICAgICAgICAgICA/LmdldENvbnRlbnQoKS5waW5uZWQgfHwgW107XG5cbiAgICAgICAgbGV0IHJvb21BY2NvdW50RGF0YVByb21pc2U6IFByb21pc2U8e30gfCB2b2lkPiA9IFByb21pc2UucmVzb2x2ZSgpO1xuICAgICAgICAvLyBJZiB0aGUgZXZlbnQgaXMgYWxyZWFkeSBwaW5uZWQsIHVucGluIGl0XG4gICAgICAgIGlmIChwaW5uZWRJZHMuaW5jbHVkZXMoZXZlbnRJZCkpIHtcbiAgICAgICAgICAgIHBpbm5lZElkcy5zcGxpY2UocGlubmVkSWRzLmluZGV4T2YoZXZlbnRJZCksIDEpO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgLy8gT3RoZXJ3aXNlLCBwaW4gaXRcbiAgICAgICAgICAgIHBpbm5lZElkcy5wdXNoKGV2ZW50SWQpO1xuICAgICAgICAgICAgLy8gV2UgZG9uJ3Qgd2FudCB0byB3YWl0IGZvciB0aGUgcm9vbUFjY291bnREYXRhUHJvbWlzZSB0byByZXNvbHZlIGJlZm9yZSBzZW5kaW5nIHRoZSBzdGF0ZSBldmVudFxuICAgICAgICAgICAgcm9vbUFjY291bnREYXRhUHJvbWlzZSA9IG1hdHJpeENsaWVudC5zZXRSb29tQWNjb3VudERhdGEocm9vbS5yb29tSWQsIFJlYWRQaW5zRXZlbnRJZCwge1xuICAgICAgICAgICAgICAgIGV2ZW50X2lkczogWy4uLihyb29tLmdldEFjY291bnREYXRhKFJlYWRQaW5zRXZlbnRJZCk/LmdldENvbnRlbnQoKT8uZXZlbnRfaWRzIHx8IFtdKSwgZXZlbnRJZF0sXG4gICAgICAgICAgICB9KTtcbiAgICAgICAgfVxuICAgICAgICBhd2FpdCBQcm9taXNlLmFsbChbXG4gICAgICAgICAgICBtYXRyaXhDbGllbnQuc2VuZFN0YXRlRXZlbnQocm9vbS5yb29tSWQsIEV2ZW50VHlwZS5Sb29tUGlubmVkRXZlbnRzLCB7IHBpbm5lZDogcGlubmVkSWRzIH0sIFwiXCIpLFxuICAgICAgICAgICAgcm9vbUFjY291bnREYXRhUHJvbWlzZSxcbiAgICAgICAgXSk7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogVW5waW4gYWxsIGV2ZW50cyBpbiB0aGUgZ2l2ZW4gcm9vbS5cbiAgICAgKiBAcGFyYW0gbWF0cml4Q2xpZW50XG4gICAgICogQHBhcmFtIHJvb21JZFxuICAgICAqL1xuICAgIHB1YmxpYyBzdGF0aWMgYXN5bmMgdW5waW5BbGxFdmVudHMobWF0cml4Q2xpZW50OiBNYXRyaXhDbGllbnQsIHJvb21JZDogc3RyaW5nKTogUHJvbWlzZTx2b2lkPiB7XG4gICAgICAgIGF3YWl0IG1hdHJpeENsaWVudC5zZW5kU3RhdGVFdmVudChyb29tSWQsIEV2ZW50VHlwZS5Sb29tUGlubmVkRXZlbnRzLCB7IHBpbm5lZDogW10gfSwgXCJcIik7XG4gICAgfVxufVxuIl0sIm1hcHBpbmdzIjoiOzs7Ozs7OztBQVFBLElBQUFBLE9BQUEsR0FBQUMsT0FBQTtBQUVBLElBQUFDLFdBQUEsR0FBQUQsT0FBQTtBQUNBLElBQUFFLE1BQUEsR0FBQUYsT0FBQTtBQVhBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQU9lLE1BQU1HLFlBQVksQ0FBQztFQVU5QjtBQUNKO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7RUFDSSxPQUFjQyxVQUFVQSxDQUFDQyxLQUFrQixFQUFXO0lBQ2xELElBQUlBLEtBQUssQ0FBQ0MsVUFBVSxDQUFDLENBQUMsRUFBRSxPQUFPLEtBQUs7SUFDcEMsT0FBT0gsWUFBWSxDQUFDSSxZQUFZLENBQUNGLEtBQUssQ0FBQztFQUMzQzs7RUFFQTtBQUNKO0FBQ0E7QUFDQTtBQUNBO0VBQ0ksT0FBY0UsWUFBWUEsQ0FBQ0YsS0FB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