matrix-react-sdk
Version:
SDK for matrix.org using React
229 lines (187 loc) • 24.3 kB
JavaScript
"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 _AsyncStoreWithClient = require("./AsyncStoreWithClient");
var _dispatcher = _interopRequireDefault(require("../dispatcher/dispatcher"));
var _WidgetEchoStore = _interopRequireDefault(require("../stores/WidgetEchoStore"));
var _ActiveWidgetStore = _interopRequireDefault(require("../stores/ActiveWidgetStore"));
var _WidgetUtils = _interopRequireDefault(require("../utils/WidgetUtils"));
var _WidgetType = require("../widgets/WidgetType");
var _AsyncStore = require("./AsyncStore");
var _MatrixClientPeg = require("../MatrixClientPeg");
/*
Copyright 2020 The Matrix.org Foundation C.I.C.
Licensed under the Apache License, Version 2.0 (the "License");
you may not use this file except in compliance with the License.
You may obtain a copy of the License at
http://www.apache.org/licenses/LICENSE-2.0
Unless required by applicable law or agreed to in writing, software
distributed under the License is distributed on an "AS IS" BASIS,
WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
See the License for the specific language governing permissions and
limitations under the License.
*/
function widgetUid(app
/*: IApp*/
)
/*: string*/
{
return `${app.roomId ?? _MatrixClientPeg.MatrixClientPeg.get().getUserId()}::${app.id}`;
} // TODO consolidate WidgetEchoStore into this
// TODO consolidate ActiveWidgetStore into this
class WidgetStore extends _AsyncStoreWithClient.AsyncStoreWithClient
/*:: <IState>*/
{
// Key is widget Unique ID (UID)
// Key is room ID
constructor() {
super(_dispatcher.default, {});
(0, _defineProperty2.default)(this, "widgetMap", new Map());
(0, _defineProperty2.default)(this, "roomMap", new Map());
(0, _defineProperty2.default)(this, "onWidgetEchoStoreUpdate", (roomId
/*: string*/
, widgetId
/*: string*/
) => {
this.initRoom(roomId);
this.loadRoomWidgets(this.matrixClient.getRoom(roomId));
this.emit(_AsyncStore.UPDATE_EVENT, roomId);
});
(0, _defineProperty2.default)(this, "onRoom", (room
/*: Room*/
) => {
this.initRoom(room.roomId);
this.loadRoomWidgets(room);
this.emit(_AsyncStore.UPDATE_EVENT, room.roomId);
});
(0, _defineProperty2.default)(this, "onRoomStateEvents", (ev
/*: MatrixEvent*/
) => {
if (ev.getType() !== "im.vector.modular.widgets") return; // TODO: Support m.widget too
const roomId = ev.getRoomId();
this.initRoom(roomId);
this.loadRoomWidgets(this.matrixClient.getRoom(roomId));
this.emit(_AsyncStore.UPDATE_EVENT, roomId);
});
(0, _defineProperty2.default)(this, "getRoom", (roomId
/*: string*/
, initIfNeeded = false) => {
if (initIfNeeded) this.initRoom(roomId); // internally handles "if needed"
return this.roomMap.get(roomId);
});
_WidgetEchoStore.default.on("update", this.onWidgetEchoStoreUpdate);
}
static get instance()
/*: WidgetStore*/
{
return WidgetStore.internalInstance;
}
initRoom(roomId
/*: string*/
) {
if (!this.roomMap.has(roomId)) {
this.roomMap.set(roomId, {
widgets: []
});
}
}
async onReady()
/*: Promise<any>*/
{
this.matrixClient.on("Room", this.onRoom);
this.matrixClient.on("RoomState.events", this.onRoomStateEvents);
this.matrixClient.getRooms().forEach((room
/*: Room*/
) => {
this.loadRoomWidgets(room);
});
this.emit(_AsyncStore.UPDATE_EVENT, null); // emit for all rooms
}
async onNotReady()
/*: Promise<any>*/
{
this.matrixClient.off("Room", this.onRoom);
this.matrixClient.off("RoomState.events", this.onRoomStateEvents);
this.widgetMap = new Map();
this.roomMap = new Map();
await this.reset({});
} // We don't need this, but our contract says we do.
async onAction(payload
/*: ActionPayload*/
) {
return;
}
generateApps(room
/*: Room*/
)
/*: IApp[]*/
{
return _WidgetEchoStore.default.getEchoedRoomWidgets(room.roomId, _WidgetUtils.default.getRoomWidgets(room)).map(ev => {
return _WidgetUtils.default.makeAppConfig(ev.getStateKey(), ev.getContent(), ev.getSender(), ev.getRoomId(), ev.getId());
});
}
loadRoomWidgets(room
/*: Room*/
) {
if (!room) return;
const roomInfo = this.roomMap.get(room.roomId) || {};
roomInfo.widgets = []; // first clean out old widgets from the map which originate from this room
// otherwise we are out of sync with the rest of the app with stale widget events during removal
Array.from(this.widgetMap.values()).forEach(app => {
if (app.roomId !== room.roomId) return; // skip - wrong room
this.widgetMap.delete(widgetUid(app));
});
let edited = false;
this.generateApps(room).forEach(app => {
// Sanity check for https://github.com/vector-im/element-web/issues/15705
const existingApp = this.widgetMap.get(widgetUid(app));
if (existingApp) {
console.warn(`Possible widget ID conflict for ${app.id} - wants to store in room ${app.roomId} ` + `but is currently stored as ${existingApp.roomId} - letting the want win`);
}
this.widgetMap.set(widgetUid(app), app);
roomInfo.widgets.push(app);
edited = true;
});
if (edited && !this.roomMap.has(room.roomId)) {
this.roomMap.set(room.roomId, roomInfo);
}
this.emit(room.roomId);
}
getApps(roomId
/*: string*/
)
/*: IApp[]*/
{
const roomInfo = this.getRoom(roomId);
return roomInfo?.widgets || [];
}
doesRoomHaveConference(room
/*: Room*/
)
/*: boolean*/
{
const roomInfo = this.getRoom(room.roomId);
if (!roomInfo) return false;
const currentWidgets = roomInfo.widgets.filter(w => _WidgetType.WidgetType.JITSI.matches(w.type));
const hasPendingWidgets = _WidgetEchoStore.default.roomHasPendingWidgetsOfType(room.roomId, [], _WidgetType.WidgetType.JITSI);
return currentWidgets.length > 0 || hasPendingWidgets;
}
isJoinedToConferenceIn(room
/*: Room*/
)
/*: boolean*/
{
const roomInfo = this.getRoom(room.roomId);
if (!roomInfo) return false; // A persistent conference widget indicates that we're participating
const widgets = roomInfo.widgets.filter(w => _WidgetType.WidgetType.JITSI.matches(w.type));
return widgets.some(w => _ActiveWidgetStore.default.getWidgetPersistence(w.id));
}
}
exports.default = WidgetStore;
(0, _defineProperty2.default)(WidgetStore, "internalInstance", new WidgetStore());
window.mxWidgetStore = WidgetStore.instance;
//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIi4uLy4uL3NyYy9zdG9yZXMvV2lkZ2V0U3RvcmUudHMiXSwibmFtZXMiOlsid2lkZ2V0VWlkIiwiYXBwIiwicm9vbUlkIiwiTWF0cml4Q2xpZW50UGVnIiwiZ2V0IiwiZ2V0VXNlcklkIiwiaWQiLCJXaWRnZXRTdG9yZSIsIkFzeW5jU3RvcmVXaXRoQ2xpZW50IiwiY29uc3RydWN0b3IiLCJkZWZhdWx0RGlzcGF0Y2hlciIsIk1hcCIsIndpZGdldElkIiwiaW5pdFJvb20iLCJsb2FkUm9vbVdpZGdldHMiLCJtYXRyaXhDbGllbnQiLCJnZXRSb29tIiwiZW1pdCIsIlVQREFURV9FVkVOVCIsInJvb20iLCJldiIsImdldFR5cGUiLCJnZXRSb29tSWQiLCJpbml0SWZOZWVkZWQiLCJyb29tTWFwIiwiV2lkZ2V0RWNob1N0b3JlIiwib24iLCJvbldpZGdldEVjaG9TdG9yZVVwZGF0ZSIsImluc3RhbmNlIiwiaW50ZXJuYWxJbnN0YW5jZSIsImhhcyIsInNldCIsIndpZGdldHMiLCJvblJlYWR5Iiwib25Sb29tIiwib25Sb29tU3RhdGVFdmVudHMiLCJnZXRSb29tcyIsImZvckVhY2giLCJvbk5vdFJlYWR5Iiwib2ZmIiwid2lkZ2V0TWFwIiwicmVzZXQiLCJvbkFjdGlvbiIsInBheWxvYWQiLCJnZW5lcmF0ZUFwcHMiLCJnZXRFY2hvZWRSb29tV2lkZ2V0cyIsIldpZGdldFV0aWxzIiwiZ2V0Um9vbVdpZGdldHMiLCJtYXAiLCJtYWtlQXBwQ29uZmlnIiwiZ2V0U3RhdGVLZXkiLCJnZXRDb250ZW50IiwiZ2V0U2VuZGVyIiwiZ2V0SWQiLCJyb29tSW5mbyIsIkFycmF5IiwiZnJvbSIsInZhbHVlcyIsImRlbGV0ZSIsImVkaXRlZCIsImV4aXN0aW5nQXBwIiwiY29uc29sZSIsIndhcm4iLCJwdXNoIiwiZ2V0QXBwcyIsImRvZXNSb29tSGF2ZUNvbmZlcmVuY2UiLCJjdXJyZW50V2lkZ2V0cyIsImZpbHRlciIsInciLCJXaWRnZXRUeXBlIiwiSklUU0kiLCJtYXRjaGVzIiwidHlwZSIsImhhc1BlbmRpbmdXaWRnZXRzIiwicm9vbUhhc1BlbmRpbmdXaWRnZXRzT2ZUeXBlIiwibGVuZ3RoIiwiaXNKb2luZWRUb0NvbmZlcmVuY2VJbiIsInNvbWUiLCJBY3RpdmVXaWRnZXRTdG9yZSIsImdldFdpZGdldFBlcnNpc3RlbmNlIiwid2luZG93IiwibXhXaWRnZXRTdG9yZSJdLCJtYXBwaW5ncyI6Ijs7Ozs7Ozs7Ozs7QUFxQkE7O0FBQ0E7O0FBQ0E7O0FBQ0E7O0FBQ0E7O0FBQ0E7O0FBQ0E7O0FBQ0E7O0FBNUJBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQTZCQSxTQUFTQSxTQUFULENBQW1CQztBQUFuQjtBQUFBO0FBQUE7QUFBc0M7QUFDbEMsU0FBUSxHQUFFQSxHQUFHLENBQUNDLE1BQUosSUFBY0MsaUNBQWdCQyxHQUFoQixHQUFzQkMsU0FBdEIsRUFBa0MsS0FBSUosR0FBRyxDQUFDSyxFQUFHLEVBQXJFO0FBQ0gsQyxDQUVEO0FBQ0E7OztBQUNlLE1BQU1DLFdBQU4sU0FBMEJDO0FBQTFCO0FBQXVEO0FBR3JCO0FBQ007QUFFM0NDLEVBQUFBLFdBQVIsR0FBc0I7QUFDbEIsVUFBTUMsbUJBQU4sRUFBeUIsRUFBekI7QUFEa0IscURBSEYsSUFBSUMsR0FBSixFQUdFO0FBQUEsbURBRkosSUFBSUEsR0FBSixFQUVJO0FBQUEsbUVBd0NZLENBQUNUO0FBQUQ7QUFBQSxNQUFpQlU7QUFBakI7QUFBQSxTQUFzQztBQUNwRSxXQUFLQyxRQUFMLENBQWNYLE1BQWQ7QUFDQSxXQUFLWSxlQUFMLENBQXFCLEtBQUtDLFlBQUwsQ0FBa0JDLE9BQWxCLENBQTBCZCxNQUExQixDQUFyQjtBQUNBLFdBQUtlLElBQUwsQ0FBVUMsd0JBQVYsRUFBd0JoQixNQUF4QjtBQUNILEtBNUNxQjtBQUFBLGtEQXVGTCxDQUFDaUI7QUFBRDtBQUFBLFNBQWdCO0FBQzdCLFdBQUtOLFFBQUwsQ0FBY00sSUFB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ekQsRUFBNkRtRSx1QkFBV0MsS0FBeEUsQ0FBMUI7O0FBQ0EsV0FBT0osY0FBYyxDQUFDUyxNQUFmLEdBQXdCLENBQXhCLElBQTZCRixpQkFBcEM7QUFDSDs7QUFFTUcsRUFBQUEsc0JBQVAsQ0FBOEJ6RDtBQUE5QjtBQUFBO0FBQUE7QUFBbUQ7QUFDL0MsVUFBTW1DLFFBQVEsR0FBRyxLQUFLdEMsT0FBTCxDQUFhRyxJQUFJLENBQUNqQixNQUFsQixDQUFqQjtBQUNBLFFBQUksQ0FBQ29ELFFBQUwsRUFBZSxPQUFPLEtBQVAsQ0FGZ0MsQ0FJL0M7O0FBQ0EsVUFBTXRCLE9BQU8sR0FBR3NCLFFBQVEsQ0FBQ3RCLE9BQVQsQ0FBaUJtQyxNQUFqQixDQUF3QkMsQ0FBQyxJQUFJQyx1QkFBV0MsS0FBWCxDQUFpQkMsT0FBakIsQ0FBeUJILENBQUMsQ0FBQ0ksSUFBM0IsQ0FBN0IsQ0FBaEI7QUFDQSxXQUFPeEMsT0FBTyxDQUFDNkMsSUFBUixDQUFhVCxDQUFDLElBQUlVLDJCQUFrQkMsb0JBQWxCLENBQXVDWCxDQUFDLENBQUM5RCxFQUF6QyxDQUFsQixDQUFQO0FBQ0g7O0FBcklpRTs7OzhCQUFqREMsVyxzQkFDaUIsSUFBSUEsV0FBSixFO0FBdUl0Q3lFLE1BQU0sQ0FBQ0MsYUFBUCxHQUF1QjFFLFdBQVcsQ0FBQ3FCLFFBQW5DIiwic291cmNlc0NvbnRlbnQiOlsiLypcbkNvcHlyaWdodCAyMDIwIFRoZSBNYXRyaXgub3JnIEZvdW5kYXRpb24gQy5JLkMuXG5cbkxpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSBcIkxpY2Vuc2VcIik7XG55b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuXG5Zb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXRcblxuICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMFxuXG5Vbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlXG5kaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiBcIkFTIElTXCIgQkFTSVMsXG5XSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC5cblNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmRcbmxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLlxuKi9cblxuaW1wb3J0IHsgUm9vbSB9IGZyb20gXCJtYXRyaXgtanMtc2RrL3NyYy9tb2RlbHMvcm9vbVwiO1xuaW1wb3J0IHsgTWF0cml4RXZlbnQgfSBmcm9tIFwibWF0cml4LWpzLXNkay9zcmMvbW9kZWxzL2V2ZW50XCI7XG5pbXBvcnQgeyBJV2lkZ2V0IH0gZnJvbSBcIm1hdHJpeC13aWRnZXQtYXBpXCI7XG5cbmltcG9ydCB7IEFjdGlvblBheWxvYWQgfSBmcm9tIFwiLi4vZGlzcGF0Y2hlci9wYXlsb2Fkc1wiO1xuaW1wb3J0IHsgQXN5bmNTdG9yZVdpdGhDbGllbnQgfSBmcm9tIFwiLi9Bc3luY1N0b3JlV2l0aENsaWVudFwiO1xuaW1wb3J0IGRlZmF1bHREaXNwYXRjaGVyIGZyb20gXCIuLi9kaXNwYXRjaGVyL2Rpc3BhdGNoZXJcIjtcbmltcG9ydCBXaWRnZXRFY2hvU3RvcmUgZnJvbSBcIi4uL3N0b3Jlcy9XaWRnZXRFY2hvU3RvcmVcIjtcbmltcG9ydCBBY3RpdmVXaWRnZXRTdG9yZSBmcm9tIFwiLi4vc3RvcmVzL0FjdGl2ZVdpZGdldFN0b3JlXCI7XG5pbXBvcnQgV2lkZ2V0VXRpbHMgZnJvbSBcIi4uL3V0aWxzL1dpZGdldFV0aWxzXCI7XG5pbXBvcnQge1dpZGdldFR5cGV9IGZyb20gXCIuLi93aWRnZXRzL1dpZGdldFR5cGVcIjtcbmltcG9ydCB7VVBEQVRFX0VWRU5UfSBmcm9tIFwiLi9Bc3luY1N0b3JlXCI7XG5pbXBvcnQgeyBNYXRyaXhDbGllbnRQZWcgfSBmcm9tIFwiLi4vTWF0cml4Q2xpZW50UGVnXCI7XG5cbmludGVyZmFjZSBJU3RhdGUge31cblxuZXhwb3J0IGludGVyZmFjZSBJQXBwIGV4dGVuZHMgSVdpZGdldCB7XG4gICAgcm9vbUlkOiBzdHJpbmc7XG4gICAgZXZlbnRJZDogc3RyaW5nO1xuICAgIC8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBjYW1lbGNhc2VcbiAgICBhdmF0YXJfdXJsOiBzdHJpbmc7IC8vIE1TQzI3NjUgaHR0cHM6Ly9naXRodWIuY29tL21hdHJpeC1vcmcvbWF0cml4LWRvYy9wdWxsLzI3NjVcbn1cblxuaW50ZXJmYWNlIElSb29tV2lkZ2V0cyB7XG4gICAgd2lkZ2V0czogSUFwcFtdO1xufVxuXG5mdW5jdGlvbiB3aWRnZXRVaWQoYXBwOiBJQXBwKTogc3RyaW5nIHtcbiAgICByZXR1cm4gYCR7YXBwLnJvb21JZCA/PyBNYXRyaXhDbGllbnRQZWcuZ2V0KCkuZ2V0VXNlcklkKCl9Ojoke2FwcC5pZH1gO1xufVxuXG4vLyBUT0RPIGNvbnNvbGlkYXRlIFdpZGdldEVjaG9TdG9yZSBpbnRvIHRoaXNcbi8vIFRPRE8gY29uc29saWRhdGUgQWN0aXZlV2lkZ2V0U3RvcmUgaW50byB0aGlzXG5leHBvcnQgZGVmYXVsdCBjbGFzcyBXaWRnZXRTdG9yZSBleHRlbmRzIEFzeW5jU3RvcmVXaXRoQ2xpZW50PElTdGF0ZT4ge1xuICAgIHByaXZhdGUgc3RhdGljIGludGVybmFsSW5zdGFuY2UgPSBuZXcgV2lkZ2V0U3RvcmUoKTtcblxuICAgIHByaXZhdGUgd2lkZ2V0TWFwID0gbmV3IE1hcDxzdHJpbmcsIElBcHA+KCk7IC8vIEtleSBpcyB3aWRnZXQgVW5pcXVlIElEIChVSUQpXG4gICAgcHJpdmF0ZSByb29tTWFwID0gbmV3IE1hcDxzdHJpbmcsIElSb29tV2lkZ2V0cz4oKTsgLy8gS2V5IGlzIHJvb20gSURcblxuICAgIHByaXZhdGUgY29uc3RydWN0b3IoKSB7XG4gICAgICAgIHN1cGVyKGRlZmF1bHREaXNwYXRjaGVyLCB7fSk7XG5cbiAgICAgICAgV2lkZ2V0RWNob1N0b3JlLm9uKFwidXBkYXRlXCIsIHRoaXMub25XaWRnZXRFY2hvU3RvcmVVcGRhdGUpO1xuICAgIH1cblxuICAgIHB1YmxpYyBzdGF0aWMgZ2V0IGluc3RhbmNlKCk6IFdpZGdldFN0b3JlIHtcbiAgICAgICAgcmV0dXJuIFdpZGdldFN0b3JlLmludGVybmFsSW5zdGFuY2U7XG4gICAgfVxuXG4gICAgcHJpdmF0ZSBpbml0Um9vbShyb29tSWQ6IHN0cmluZykge1xuICAgICAgICBpZiAoIXRoaXMucm9vbU1hcC5oYXMocm9vbUlkKSkge1xuICAgICAgICAgICAgdGhpcy5yb29tTWFwLnNldChyb29tSWQsIHtcbiAgICAgICAgICAgICAgICB3aWRnZXRzOiBbXSxcbiAgICAgICAgICAgIH0pO1xuICAgICAgICB9XG4gICAgfVxuXG4gICAgcHJvdGVjdGVkIGFzeW5jIG9uUmVhZHkoKTogUHJvbWlzZTxhbnk+IHtcbiAgICAgICAgdGhpcy5tYXRyaXhDbGllbnQub24oXCJSb29tXCIsIHRoaXMub25Sb29tKTtcbiAgICAgICAgdGhpcy5tYXRyaXhDbGllbnQub24oXCJSb29tU3RhdGUuZXZlbnRzXCIsIHRoaXMub25Sb29tU3RhdGVFdmVudHMpO1xuICAgICAgICB0aGlzLm1hdHJpeENsaWVudC5nZXRSb29tcygpLmZvckVhY2goKHJvb206IFJvb20pID0+IHtcbiAgICAgICAgICAgIHRoaXMubG9hZFJvb21XaWRnZXRzKHJvb20pO1xuICAgICAgICB9KTtcbiAgICAgICAgdGhpcy5lbWl0KFVQREFURV9FVkVOVCwgbnVsbCk7IC8vIGVtaXQgZm9yIGFsbCByb29tc1xuICAgIH1cblxuICAgIHByb3RlY3RlZCBhc3luYyBvbk5vdFJlYWR5KCk6IFByb21pc2U8YW55PiB7XG4gICAgICAgIHRoaXMubWF0cml4Q2xpZW50Lm9mZihcIlJvb21cIiwgdGhpcy5vblJvb20pO1xuICAgICAgICB0aGlzLm1hdHJpeENsaWVudC5vZmYoXCJSb29tU3RhdGUuZXZlbnRzXCIsIHRoaXMub25Sb29tU3RhdGVFdmVudHMpO1xuICAgICAgICB0aGlzLndpZGdldE1hcCA9IG5ldyBNYXAoKTtcbiAgICAgICAgdGhpcy5yb29tTWFwID0gbmV3IE1hcCgpO1xuICAgICAgICBhd2FpdCB0aGlzLnJlc2V0KHt9KTtcbiAgICB9XG5cbiAgICAvLyBXZSBkb24ndCBuZWVkIHRoaXMsIGJ1dCBvdXIgY29udHJhY3Qgc2F5cyB3ZSBkby5cbiAgICBwcm90ZWN0ZWQgYXN5bmMgb25BY3Rpb24ocGF5bG9hZDogQWN0aW9uUGF5bG9hZCkge1xuICAgICAgICByZXR1cm47XG4gICAgfVxuXG4gICAgcHJpdmF0ZSBvbldpZGdldEVjaG9TdG9yZVVwZGF0ZSA9IChyb29tSWQ6IHN0cmluZywgd2lkZ2V0SWQ6IHN0cmluZykgPT4ge1xuICAgICAgICB0aGlzLmluaXRSb29tKHJvb21JZCk7XG4gICAgICAgIHRoaXMubG9hZFJvb21XaWRnZXRzKHRoaXMubWF0cml4Q2xpZW50LmdldFJvb20ocm9vbUlkKSk7XG4gICAgICAgIHRoaXMuZW1pdChVUERBVEVfRVZFTlQsIHJvb21JZCk7XG4gICAgfTtcblxuICAgIHByaXZhdGUgZ2VuZXJhdGVBcHBzKHJvb206IFJvb20pOiBJQXBwW10ge1xuICAgICAgICByZXR1cm4gV2lkZ2V0RWNob1N0b3JlLmdldEVjaG9lZFJvb21XaWRnZXRzKHJvb20ucm9vbUlkLCBXaWRnZXRVdGlscy5nZXRSb29tV2lkZ2V0cyhyb29tKSkubWFwKChldikgPT4ge1xuICAgICAgICAgICAgcmV0dXJuIFdpZGdldFV0aWxzLm1ha2VBcHBDb25maWcoXG4gICAgICAgICAgICAgICAgZXYuZ2V0U3RhdGVLZXkoKSwgZXYuZ2V0Q29udGVudCgpLCBldi5nZXRTZW5kZXIoKSwgZXYuZ2V0Um9vbUlkKCksIGV2LmdldElkKCksXG4gICAgICAgICAgICApO1xuICAgICAgICB9KTtcbiAgICB9XG5cbiAgICBwcml2YXRlIGxvYWRSb29tV2lkZ2V0cyhyb29tOiBSb29tKSB7XG4gICAgICAgIGlmICghcm9vbSkgcmV0dXJuO1xuICAgICAgICBjb25zdCByb29tSW5mbyA9IHRoaXMucm9vbU1hcC5nZXQocm9vbS5yb29tSWQpIHx8IDxJUm9vbVdpZGdldHM+e307XG4gICAgICAgIHJvb21JbmZvLndpZGdldHMgPSBbXTtcblxuICAgICAgICAvLyBmaXJzdCBjbGVhbiBvdXQgb2xkIHdpZGdldHMgZnJvbSB0aGUgbWFwIHdoaWNoIG9yaWdpbmF0ZSBmcm9tIHRoaXMgcm9vbVxuICAgICAgICAvLyBvdGhlcndpc2Ugd2UgYXJlIG91dCBvZiBzeW5jIHdpdGggdGhlIHJlc3Qgb2YgdGhlIGFwcCB3aXRoIHN0YWxlIHdpZGdldCBldmVudHMgZHVyaW5nIHJlbW92YWxcbiAgICAgICAgQXJyYXkuZnJvbSh0aGlzLndpZGdldE1hcC52YWx1ZXMoKSkuZm9yRWFjaChhcHAgPT4ge1xuICAgICAgICAgICAgaWYgKGFwcC5yb29tSWQgIT09IHJvb20ucm9vbUlkKSByZXR1cm47IC8vIHNraXAgLSB3cm9uZyByb29tXG4gICAgICAgICAgICB0aGlzLndpZGdldE1hcC5kZWxldGUod2lkZ2V0VWlkKGFwcCkpO1xuICAgICAgICB9KTtcblxuICAgICAgICBsZXQgZWRpdGVkID0gZmFsc2U7XG4gICAgICAgIHRoaXMuZ2VuZXJhdGVBcHBzKHJvb20pLmZvckVhY2goYXBwID0+IHtcbiAgICAgICAgICAgIC8vIFNhbml0eSBjaGVjayBmb3IgaHR0cHM6Ly9naXRodWIuY29tL3ZlY3Rvci1pbS9lbGVtZW50LXdlYi9pc3N1ZXMvMTU3MDVcbiAgICAgICAgICAgIGNvbnN0IGV4aXN0aW5nQXBwID0gdGhpcy53aWRnZXRNYXAuZ2V0KHdpZGdldFVpZChhcHApKTtcbiAgICAgICAgICAgIGlmIChleGlzdGluZ0FwcCkge1xuICAgICAgICAgICAgICAgIGNvbnNvbGUud2FybihcbiAgICAgICAgICAgICAgICAgICAgYFBvc3NpYmxlIHdpZGdldCBJRCBjb25mbGljdCBmb3IgJHthcHAuaWR9IC0gd2FudHMgdG8gc3RvcmUgaW4gcm9vbSAke2FwcC5yb29tSWR9IGAgK1xuICAgICAgICAgICAgICAgICAgICBgYnV0IGlzIGN1cnJlbnRseSBzdG9yZWQgYXMgJHtleGlzdGluZ0FwcC5yb29tSWR9IC0gbGV0dGluZyB0aGUgd2FudCB3aW5gLFxuICAgICAgICAgICAgICAgICk7XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIHRoaXMud2lkZ2V0TWFwLnNldCh3aWRnZXRVaWQoYXBwKSwgYXBwKTtcbiAgICAgICAgICAgIHJvb21JbmZvLndpZGdldHMucHVzaChhcHApO1xuICAgICAgICAgICAgZWRpdGVkID0gdHJ1ZTtcbiAgICAgICAgfSk7XG4gICAgICAgIGlmIChlZGl0ZWQgJiYgIXRoaXMucm9vbU1hcC5oYXMocm9vbS5yb29tSWQpKSB7XG4gICAgICAgICAgICB0aGlzLnJvb21NYXAuc2V0KHJvb20ucm9vbUlkLCByb29tSW5mbyk7XG4gICAgICAgIH1cbiAgICAgICAgdGhpcy5lbWl0KHJvb20ucm9vbUlkKTtcbiAgICB9XG5cbiAgICBwcml2YXRlIG9uUm9vbSA9IChyb29tOiBSb29tKSA9PiB7XG4gICAgICAgIHRoaXMuaW5pdFJvb20ocm9vbS5yb29tSWQpO1xuICAgICAgICB0aGlzLmxvYWRSb29tV2lkZ2V0cyhyb29tKTtcbiAgICAgICAgdGhpcy5lbWl0KFVQREFURV9FVkVOVCwgcm9vbS5yb29tSWQpO1xuICAgIH07XG5cbiAgICBwcml2YXRlIG9uUm9vbVN0YXRlRXZlbnRzID0gKGV2OiBNYXRyaXhFdmVudCkgPT4ge1xuICAgICAgICBpZiAoZXYuZ2V0VHlwZSgpICE9PSBcImltLnZlY3Rvci5tb2R1bGFyLndpZGdldHNcIikgcmV0dXJuOyAvLyBUT0RPOiBTdXBwb3J0IG0ud2lkZ2V0IHRvb1xuICAgICAgICBjb25zdCByb29tSWQgPSBldi5nZXRSb29tSWQoKTtcbiAgICAgICAgdGhpcy5pbml0Um9vbShyb29tSWQpO1xuICAgICAgICB0aGlzLmxvYWRSb29tV2lkZ2V0cyh0aGlzLm1hdHJpeENsaWVudC5nZXRSb29tKHJvb21JZCkpO1xuICAgICAgICB0aGlzLmVtaXQoVVBEQVRFX0VWRU5ULCByb29tSWQpO1xuICAgIH07XG5cbiAgICBwdWJsaWMgZ2V0Um9vbSA9IChyb29tSWQ6IHN0cmluZywgaW5pdElmTmVlZGVkID0gZmFsc2UpID0+IHtcbiAgICAgICAgaWYgKGluaXRJZk5lZWRlZCkgdGhpcy5pbml0Um9vbShyb29tSWQpOyAvLyBpbnRlcm5hbGx5IGhhbmRsZXMgXCJpZiBuZWVkZWRcIlxuICAgICAgICByZXR1cm4gdGhpcy5yb29tTWFwLmdldChyb29tSWQpO1xuICAgIH07XG5cbiAgICBwdWJsaWMgZ2V0QXBwcyhyb29tSWQ6IHN0cmluZyk6IElBcHBbXSB7XG4gICAgICAgIGNvbnN0IHJvb21JbmZvID0gdGhpcy5nZXRSb29tKHJvb21JZCk7XG4gICAgICAgIHJldHVybiByb29tSW5mbz8ud2lkZ2V0cyB8fCBbXTtcbiAgICB9XG5cbiAgICBwdWJsaWMgZG9lc1Jvb21IYXZlQ29uZmVyZW5jZShyb29tOiBSb29tKTogYm9vbGVhbiB7XG4gICAgICAgIGNvbnN0IHJvb21JbmZvID0gdGhpcy5nZXRSb29tKHJvb20ucm9vbUlkKTtcbiAgICAgICAgaWYgKCFyb29tSW5mbykgcmV0dXJuIGZhbHNlO1xuXG4gICAgICAgIGNvbnN0IGN1cnJlbnRXaWRnZXRzID0gcm9vbUluZm8ud2lkZ2V0cy5maWx0ZXIodyA9PiBXaWRnZXRUeXBlLkpJVFNJLm1hdGNoZXMody50eXBlKSk7XG4gICAgICAgIGNvbnN0IGhhc1BlbmRpbmdXaWRnZXRzID0gV2lkZ2V0RWNob1N0b3JlLnJvb21IYXNQZW5kaW5nV2lkZ2V0c09mVHlwZShyb29tLnJvb21JZCwgW10sIFdpZGdldFR5cGUuSklUU0kpO1xuICAgICAgICByZXR1cm4gY3VycmVudFdpZGdldHMubGVuZ3RoID4gMCB8fCBoYXNQZW5kaW5nV2lkZ2V0cztcbiAgICB9XG5cbiAgICBwdWJsaWMgaXNKb2luZWRUb0NvbmZlcmVuY2VJbihyb29tOiBSb29tKTogYm9vbGVhbiB7XG4gICAgICAgIGNvbnN0IHJvb21JbmZvID0gdGhpcy5nZXRSb29tKHJvb20ucm9vbUlkKTtcbiAgICAgICAgaWYgKCFyb29tSW5mbykgcmV0dXJuIGZhbHNlO1xuXG4gICAgICAgIC8vIEEgcGVyc2lzdGVudCBjb25mZXJlbmNlIHdpZGdldCBpbmRpY2F0ZXMgdGhhdCB3ZSdyZSBwYXJ0aWNpcGF0aW5nXG4gICAgICAgIGNvbnN0IHdpZGdldHMgPSByb29tSW5mby53aWRnZXRzLmZpbHRlcih3ID0+IFdpZGdldFR5cGUuSklUU0kubWF0Y2hlcyh3LnR5cGUpKTtcbiAgICAgICAgcmV0dXJuIHdpZGdldHMuc29tZSh3ID0+IEFjdGl2ZVdpZGdldFN0b3JlLmdldFdpZGdldFBlcnNpc3RlbmNlKHcuaWQpKTtcbiAgICB9XG59XG5cbndpbmRvdy5teFdpZGdldFN0b3JlID0gV2lkZ2V0U3RvcmUuaW5zdGFuY2U7XG4iXX0=