UNPKG

matrix-react-sdk

Version:
90 lines (86 loc) 12.9 kB
"use strict"; var _interopRequireDefault = require("@babel/runtime/helpers/interopRequireDefault"); Object.defineProperty(exports, "__esModule", { value: true }); exports.LandmarkNavigation = exports.Landmark = void 0; var _RoomContext = require("../contexts/RoomContext"); var _actions = require("../dispatcher/actions"); var _dispatcher = _interopRequireDefault(require("../dispatcher/dispatcher")); /* * Copyright 2024 New Vector Ltd. * Copyright 2024 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. */ let Landmark = exports.Landmark = /*#__PURE__*/function (Landmark) { Landmark[Landmark["ACTIVE_SPACE_BUTTON"] = 0] = "ACTIVE_SPACE_BUTTON"; Landmark[Landmark["ROOM_SEARCH"] = 1] = "ROOM_SEARCH"; Landmark[Landmark["ROOM_LIST"] = 2] = "ROOM_LIST"; Landmark[Landmark["MESSAGE_COMPOSER_OR_HOME"] = 3] = "MESSAGE_COMPOSER_OR_HOME"; return Landmark; }({}); const ORDERED_LANDMARKS = [Landmark.ACTIVE_SPACE_BUTTON, Landmark.ROOM_SEARCH, Landmark.ROOM_LIST, Landmark.MESSAGE_COMPOSER_OR_HOME]; /** * The landmarks are cycled through in the following order: * ACTIVE_SPACE_BUTTON <-> ROOM_SEARCH <-> ROOM_LIST <-> MESSAGE_COMPOSER/HOME <-> ACTIVE_SPACE_BUTTON */ class LandmarkNavigation { /** * Get the next/previous landmark that must be focused from a given landmark * @param currentLandmark The current landmark * @param backwards If true, the landmark before currentLandmark in ORDERED_LANDMARKS is returned * @returns The next landmark to focus */ static getLandmark(currentLandmark, backwards = false) { const currentIndex = ORDERED_LANDMARKS.findIndex(l => l === currentLandmark); const offset = backwards ? -1 : 1; const newLandmark = ORDERED_LANDMARKS.at((currentIndex + offset) % ORDERED_LANDMARKS.length); return newLandmark; } /** * Focus the next landmark from a given landmark. * This method will skip over any missing landmarks. * @param currentLandmark The current landmark * @param backwards If true, search the next landmark to the left in ORDERED_LANDMARKS */ static findAndFocusNextLandmark(currentLandmark, backwards = false) { let landmark = currentLandmark; let element = null; while (element === null) { landmark = LandmarkNavigation.getLandmark(landmark, backwards); element = landmarkToDomElementMap[landmark](); } element?.focus({ focusVisible: true }); } } /** * The functions return: * - The DOM element of the landmark if it exists * - undefined if the DOM element exists but focus is given through an action * - null if the landmark does not exist */ exports.LandmarkNavigation = LandmarkNavigation; const landmarkToDomElementMap = { [Landmark.ACTIVE_SPACE_BUTTON]: () => document.querySelector(".mx_SpaceButton_active"), [Landmark.ROOM_SEARCH]: () => document.querySelector(".mx_RoomSearch"), [Landmark.ROOM_LIST]: () => document.querySelector(".mx_RoomTile_selected") || document.querySelector(".mx_RoomTile"), [Landmark.MESSAGE_COMPOSER_OR_HOME]: () => { const isComposerOpen = !!document.querySelector(".mx_MessageComposer"); if (isComposerOpen) { const inThread = !!document.activeElement?.closest(".mx_ThreadView"); _dispatcher.default.dispatch({ action: _actions.Action.FocusSendMessageComposer, context: inThread ? _RoomContext.TimelineRenderingType.Thread : _RoomContext.TimelineRenderingType.Room }, true); // Special case where the element does exist but we focus it through an action. return undefined; } else { return document.querySelector(".mx_HomePage"); } } }; //# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJuYW1lcyI6WyJfUm9vbUNvbnRleHQiLCJyZXF1aXJlIiwiX2FjdGlvbnMiLCJfZGlzcGF0Y2hlciIsIl9pbnRlcm9wUmVxdWlyZURlZmF1bHQiLCJMYW5kbWFyayIsImV4cG9ydHMiLCJPUkRFUkVEX0xBTkRNQVJLUyIsIkFDVElWRV9TUEFDRV9CVVRUT04iLCJST09NX1NFQVJDSCIsIlJPT01fTElTVCIsIk1FU1NBR0VfQ09NUE9TRVJfT1JfSE9NRSIsIkxhbmRtYXJrTmF2aWdhdGlvbiIsImdldExhbmRtYXJrIiwiY3VycmVudExhbmRtYXJrIiwiYmFja3dhcmRzIiwiY3VycmVudEluZGV4IiwiZmluZEluZGV4IiwibCIsIm9mZnNldCIsIm5ld0xhbmRtYXJrIiwiYXQiLCJsZW5ndGgiLCJmaW5kQW5kRm9jdXNOZXh0TGFuZG1hcmsiLCJsYW5kbWFyayIsImVsZW1lbnQiLCJsYW5kbWFya1RvRG9tRWxlbWVudE1hcCIsImZvY3VzIiwiZm9jdXNWaXNpYmxlIiwiZG9jdW1lbnQiLCJxdWVyeVNlbGVjdG9yIiwiaXNDb21wb3Nlck9wZW4iLCJpblRocmVhZCIsImFjdGl2ZUVsZW1lbnQiLCJjbG9zZXN0IiwiZGVmYXVsdERpc3BhdGNoZXIiLCJkaXNwYXRjaCIsImFjdGlvbiIsIkFjdGlvbiIsIkZvY3VzU2VuZE1lc3NhZ2VDb21wb3NlciIsImNvbnRleHQiLCJUaW1lbGluZVJlbmRlcmluZ1R5cGUiLCJUaHJlYWQiLCJSb29tIiwidW5kZWZpbmVkIl0sInNvdXJjZXMiOlsiLi4vLi4vc3JjL2FjY2Vzc2liaWxpdHkvTGFuZG1hcmtOYXZpZ2F0aW9uLnRzIl0sInNvdXJjZXNDb250ZW50IjpbIi8qXG4gKiBDb3B5cmlnaHQgMjAyNCBOZXcgVmVjdG9yIEx0ZC5cbiAqIENvcHlyaWdodCAyMDI0IFRoZSBNYXRyaXgub3JnIEZvdW5kYXRpb24gQy5JLkMuXG4gKlxuICogU1BEWC1MaWNlbnNlLUlkZW50aWZpZXI6IEFHUEwtMy4wLW9ubHkgT1IgR1BMLTMuMC1vbmx5XG4gKiBQbGVhc2Ugc2VlIExJQ0VOU0UgZmlsZXMgaW4gdGhlIHJlcG9zaXRvcnkgcm9vdCBmb3IgZnVsbCBkZXRhaWxzLlxuICovXG5cbmltcG9ydCB7IFRpbWVsaW5lUmVuZGVyaW5nVHlwZSB9IGZyb20gXCIuLi9jb250ZXh0cy9Sb29tQ29udGV4dFwiO1xuaW1wb3J0IHsgQWN0aW9uIH0gZnJvbSBcIi4uL2Rpc3BhdGNoZXIvYWN0aW9uc1wiO1xuaW1wb3J0IGRlZmF1bHREaXNwYXRjaGVyIGZyb20gXCIuLi9kaXNwYXRjaGVyL2Rpc3BhdGNoZXJcIjtcblxuZXhwb3J0IGNvbnN0IGVudW0gTGFuZG1hcmsge1xuICAgIC8vIFRoaXMgaXMgdGhlIHNwYWNlL2hvbWUgYnV0dG9uIGluIHRoZSBsZWZ0IHBhbmVsLlxuICAgIEFDVElWRV9TUEFDRV9CVVRUT04sXG4gICAgLy8gVGhpcyBpcyB0aGUgcm9vbSBmaWx0ZXIgaW4gdGhlIGxlZnQgcGFuZWwuXG4gICAgUk9PTV9TRUFSQ0gsXG4gICAgLy8gVGhpcyBpcyB0aGUgY3VycmVudGx5IG9wZW5lZCByb29tL2ZpcnN0IHJvb20gaW4gdGhlIHJvb20gbGlzdCBpbiB0aGUgbGVmdCBwYW5lbC5cbiAgICBST09NX0xJU1QsXG4gICAgLy8gVGhpcyBpcyB0aGUgbWVzc2FnZSBjb21wb3NlciB3aXRoaW4gdGhlIHJvb20gaWYgYXZhaWxhYmxlIG9yIGl0IGlzIHRoZSB3ZWxjb21lIHNjcmVlbiBzaG93biB3aGVuIG5vIHJvb20gaXMgc2VsZWN0ZWRcbiAgICBNRVNTQUdFX0NPTVBPU0VSX09SX0hPTUUsXG59XG5cbmNvbnN0IE9SREVSRURfTEFORE1BUktTID0gW1xuICAgIExhbmRtYXJrLkFDVElWRV9TUEFDRV9CVVRUT04sXG4gICAgTGFuZG1hcmsuUk9PTV9TRUFSQ0gsXG4gICAgTGFuZG1hcmsuUk9PTV9MSVNULFxuICAgIExhbmRtYXJrLk1FU1NBR0VfQ09NUE9TRVJfT1JfSE9NRSxcbl07XG5cbi8qKlxuICogVGhlIGxhbmRtYXJrcyBhcmUgY3ljbGVkIHRocm91Z2ggaW4gdGhlIGZvbGxvd2luZyBvcmRlcjpcbiAqIEFDVElWRV9TUEFDRV9CVVRUT04gPC0+IFJPT01fU0VBUkNIIDwtPiBST09NX0xJU1QgPC0+IE1FU1NBR0VfQ09NUE9TRVIvSE9NRSA8LT4gQUNUSVZFX1NQQUNFX0JVVFRPTlxuICovXG5leHBvcnQgY2xhc3MgTGFuZG1hcmtOYXZpZ2F0aW9uIHtcbiAgICAvKipcbiAgICAgKiBHZXQgdGhlIG5leHQvcHJldmlvdXMgbGFuZG1hcmsgdGhhdCBtdXN0IGJlIGZvY3VzZWQgZnJvbSBhIGdpdmVuIGxhbmRtYXJrXG4gICAgICogQHBhcmFtIGN1cnJlbnRMYW5kbWFyayBUaGUgY3VycmVudCBsYW5kbWFya1xuICAgICAqIEBwYXJhbSBiYWNrd2FyZHMgSWYgdHJ1ZSwgdGhlIGxhbmRtYXJrIGJlZm9yZSBjdXJyZW50TGFuZG1hcmsgaW4gT1JERVJFRF9MQU5ETUFSS1MgaXMgcmV0dXJuZWRcbiAgICAgKiBAcmV0dXJucyBUaGUgbmV4dCBsYW5kbWFyayB0byBmb2N1c1xuICAgICAqL1xuICAgIHByaXZhdGUgc3RhdGljIGdldExhbmRtYXJrKGN1cnJlbnRMYW5kbWFyazogTGFuZG1hcmssIGJhY2t3YXJkcyA9IGZhbHNlKTogTGFuZG1hcmsge1xuICAgICAgICBjb25zdCBjdXJyZW50SW5kZXggPSBPUkRFUkVEX0xBTkRNQVJLUy5maW5kSW5kZXgoKGwpID0+IGwgPT09IGN1cnJlbnRMYW5kbWFyayk7XG4gICAgICAgIGNvbnN0IG9mZnNldCA9IGJhY2t3YXJkcyA/IC0xIDogMTtcbiAgICAgICAgY29uc3QgbmV3TGFuZG1hcmsgPSBPUkRFUkVEX0xBTkRNQVJLUy5hdCgoY3VycmVudEluZGV4ICsgb2Zmc2V0KSAlIE9SREVSRURfTEFORE1BUktTLmxlbmd0aCkhO1xuICAgICAgICByZXR1cm4gbmV3TGFuZG1hcms7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogRm9jdXMgdGhlIG5leHQgbGFuZG1hcmsgZnJvbSBhIGdpdmVuIGxhbmRtYXJrLlxuICAgICAqIFRoaXMgbWV0aG9kIHdpbGwgc2tpcCBvdmVyIGFueSBtaXNzaW5nIGxhbmRtYXJrcy5cbiAgICAgKiBAcGFyYW0gY3VycmVudExhbmRtYXJrIFRoZSBjdXJyZW50IGxhbmRtYXJrXG4gICAgICogQHBhcmFtIGJhY2t3YXJkcyBJZiB0cnVlLCBzZWFyY2ggdGhlIG5leHQgbGFuZG1hcmsgdG8gdGhlIGxlZnQgaW4gT1JERVJFRF9MQU5ETUFSS1NcbiAgICAgKi9cbiAgICBwdWJsaWMgc3RhdGljIGZpbmRBbmRGb2N1c05leHRMYW5kbWFyayhjdXJyZW50TGFuZG1hcms6IExhbmRtYXJrLCBiYWNrd2FyZHMgPSBmYWxzZSk6IHZvaWQge1xuICAgICAgICBsZXQgbGFuZG1hcmsgPSBjdXJyZW50TGFuZG1hcms7XG4gICAgICAgIGxldCBlbGVtZW50OiBIVE1MRWxlbWVudCB8IG51bGwgfCB1bmRlZmluZWQgPSBudWxsO1xuICAgICAgICB3aGlsZSAoZWxlbWVudCA9PT0gbnVsbCkge1xuICAgICAgICAgICAgbGFuZG1hcmsgPSBMYW5kbWFya05hdmlnYXRpb24uZ2V0TGFuZG1hcmsobGFuZG1hcmssIGJhY2t3YXJkcyk7XG4gICAgICAgICAgICBlbGVtZW50ID0gbGFuZG1hcmtUb0RvbUVsZW1lbnRNYXBbbGFuZG1hcmtdKCk7XG4gICAgICAgIH1cbiAgICAgICAgZWxlbWVudD8uZm9jdXMoeyBmb2N1c1Zpc2libGU6IHRydWUgfSk7XG4gICAgfVxufVxuXG4vKipcbiAqIFRoZSBmdW5jdGlvbnMgcmV0dXJuOlxuICogLSBUaGUgRE9NIGVsZW1lbnQgb2YgdGhlIGxhbmRtYXJrIGlmIGl0IGV4aXN0c1xuICogLSB1bmRlZmluZWQgaWYgdGhlIERPTSBlbGVtZW50IGV4aXN0cyBidXQgZm9jdXMgaXMgZ2l2ZW4gdGhyb3VnaCBhbiBhY3Rpb25cbiAqIC0gbnVsbCBpZiB0aGUgbGFuZG1hcmsgZG9lcyBub3QgZXhpc3RcbiAqL1xuY29uc3QgbGFuZG1hcmtUb0RvbUVsZW1lbnRNYXA6IFJlY29yZDxMYW5kbWFyaywgKCkgPT4gSFRNTEVsZW1lbnQgfCBudWxsIHwgdW5kZWZpbmVkPiA9IHtcbiAgICBbTGFuZG1hcmsuQUNUSVZFX1NQQUNFX0JVVFRPTl06ICgpID0+IGRvY3VtZW50LnF1ZXJ5U2VsZWN0b3I8SFRNTEVsZW1lbnQ+KFwiLm14X1NwYWNlQnV0dG9uX2FjdGl2ZVwiKSxcblxuICAgIFtMYW5kbWFyay5ST09NX1NFQVJDSF06ICgpID0+IGRvY3VtZW50LnF1ZXJ5U2VsZWN0b3I8SFRNTEVsZW1lbnQ+KFwiLm14X1Jvb21TZWFyY2hcIiksXG4gICAgW0xhbmRtYXJrLlJPT01fTElTVF06ICgpID0+XG4gICAgICAgIGRvY3VtZW50LnF1ZXJ5U2VsZWN0b3I8SFRNTEVsZW1lbnQ+KFwiLm14X1Jvb21UaWxlX3NlbGVjdGVkXCIpIHx8XG4gICAgICAgIGRvY3VtZW50LnF1ZXJ5U2VsZWN0b3I8SFRNTEVsZW1lbnQ+KFwiLm14X1Jvb21UaWxlXCIpLFxuXG4gICAgW0xhbmRtYXJrLk1FU1NBR0VfQ09NUE9TRVJfT1JfSE9NRV06ICgpID0+IHtcbiAgICAgICAgY29uc3QgaXNDb21wb3Nlck9wZW4gPSAhIWRvY3VtZW50LnF1ZXJ5U2VsZWN0b3IoXCIubXhfTWVzc2FnZUNvbXBvc2VyXCIpO1xuICAgICAgICBpZiAoaXNDb21wb3Nlck9wZW4pIHtcbiAgICAgICAgICAgIGNvbnN0IGluVGhyZWFkID0gISFkb2N1bWVudC5hY3RpdmVFbGVtZW50Py5jbG9zZXN0KFwiLm14X1RocmVhZFZpZXdcIik7XG4gICAgICAgICAgICBkZWZhdWx0RGlzcGF0Y2hlci5kaXNwYXRjaChcbiAgICAgICAgICAgICAgICB7XG4gICAgICAgICAgICAgICAgICAgIGFjdGlvbjogQWN0aW9uLkZvY3VzU2VuZE1lc3NhZ2VDb21wb3NlcixcbiAgICAgICAgICAgICAgICAgICAgY29udGV4dDogaW5UaHJlYWQgPyBUaW1lbGluZVJlbmRlcmluZ1R5cGUuVGhyZWFkIDogVGltZWxpbmVSZW5kZXJpbmdUeXBlLlJvb20sXG4gICAgICAgICAgICAgICAgfSxcbiAgICAgICAgICAgICAgICB0cnVlLFxuICAgICAgICAgICAgKTtcbiAgICAgICAgICAgIC8vIFNwZWNpYWwgY2FzZSB3aGVyZSB0aGUgZWxlbWVudCBkb2VzIGV4aXN0IGJ1dCB3ZSBmb2N1cyBpdCB0aHJvdWdoIGFuIGFjdGlvbi5cbiAgICAgICAgICAgIHJldHVybiB1bmRlZmluZWQ7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICByZXR1cm4gZG9jdW1lbnQucXVlcnlTZWxlY3RvcjxIVE1MRWxlbWVudD4oXCIubXhfSG9tZVBhZ2VcIik7XG4gICAgICAgIH1cbiAgICB9LFxufTtcbiJdLCJtYXBwaW5ncyI6Ijs7Ozs7OztBQVFBLElBQUFBLFlBQUEsR0FBQUMsT0FBQTtBQUNBLElBQUFDLFFBQUEsR0FBQUQsT0FBQTtBQUNBLElBQUFFLFdBQUEsR0FBQUMsc0JBQUEsQ0FBQUgsT0FBQTtBQVZBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBTkEsSUFZa0JJLFFBQVEsR0FBQUMsT0FBQSxDQUFBRCxRQUFBLDBCQUFSQSxRQUFRO0VBQVJBLFFBQVEsQ0FBUkEsUUFBUTtFQUFSQSxRQUFRLENBQVJBLFFBQVE7RUFBUkEsUUFBUSxDQUFSQSxRQUFRO0VBQVJBLFFBQVEsQ0FBUkEsUUFBUTtFQUFBLE9BQVJBLFFBQVE7QUFBQTtBQVcxQixNQUFNRSxpQkFBaUIsR0FBRyxDQUN0QkYsUUFBUSxDQUFDRyxtQkFBbUIsRUFDNUJILFFBQVEsQ0FBQ0ksV0FBVyxFQUNwQkosUUFBUSxDQUFDSyxTQUFTLEVBQ2xCTCxRQUFRLENBQUNNLHdCQUF3QixDQUNwQzs7QUFFRDtBQUNBO0FBQ0E7QUFDQTtBQUNPLE1BQU1DLGtCQUFrQixDQUFDO0VBQzVCO0FBQ0o7QUFDQTtBQUNBO0FBQ0E7QUFDQTtFQUNJLE9BQWVDLFdBQVdBLENBQUNDLGVBQXlCLEVBQUVDLFNBQVMsR0FBRyxLQUFLLEVBQVk7SUFDL0UsTUFBTUMsWUFBWSxHQUFHVCxpQkFBaUIsQ0FBQ1UsU0FBUyxDQUFFQyxDQUFDLElBQUtBLENBQUMsS0FBS0osZUFBZSxDQUFDO0lBQzlFLE1BQU1LLE1BQU0sR0FBR0osU0FBUyxHQUFHLENBQUMsQ0FBQyxHQUFHLENBQUM7SUFDakMsTUFBTUssV0FBVyxHQUFHYixpQkFBaUIsQ0FBQ2MsRUFBRSxDQUFDLENBQUNMLFlBQVksR0FBR0csTUFBTSxJQUFJWixpQkFBaUIsQ0FBQ2UsTUFBTSxDQUFFO0lBQzdGLE9BQU9GLFdBQVc7RUFDdEI7O0VBRUE7QUFDSjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0VBQ0ksT0FBY0csd0JBQXdCQSxDQUFDVCxlQUF5QixFQUFFQyxTQUFTLEdBQUcsS0FBSyxFQUFRO0lBQ3ZGLElBQUlTLFFBQVEsR0FBR1YsZUFBZTtJQUM5QixJQUFJVyxPQUF1QyxHQUFHLElBQUk7SUFDbEQsT0FBT0EsT0FBTyxLQUFLLElBQUksRUFBRTtNQUNyQkQsUUFBUSxHQUFHWixrQkFBa0IsQ0FBQ0MsV0FBVyxDQUFDVyxRQUFRLEVBQUVULFNBQVMsQ0FBQztNQUM5RFUsT0FBTyxHQUFHQyx1QkFBdUIsQ0FBQ0YsUUFBUSxDQUFDLENBQUMsQ0FBQztJQUNqRDtJQUNBQyxPQUFPLEVBQUVFLEtBQUssQ0FBQztNQUFFQyxZQUFZLEVBQUU7SUFBSyxDQUFDLENBQUM7RUFDMUM7QUFDSjs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFMQXRCLE9BQUEsQ0FBQU0sa0JBQUEsR0FBQUEsa0JBQUE7QUFNQSxNQUFNYyx1QkFBK0UsR0FBRztFQUNwRixDQUFDckIsUUFBUSxDQUFDRyxtQkFBbUIsR0FBRyxNQUFNcUIsUUFBUSxDQUFDQyxhQUFhLENBQWMsd0JBQXdCLENBQUM7RUFFbkcsQ0FBQ3pCLFFBQVEsQ0FBQ0ksV0FBVyxHQUFHLE1BQU1vQixRQUFRLENBQUNDLGFBQWEsQ0FBYyxnQkFBZ0IsQ0FBQztFQUNuRixDQUFDekIsUUFBUSxDQUFDSyxTQUFTLEdBQUcsTUFDbEJtQixRQUFRLENBQUNDLGFBQWEsQ0FBYyx1QkFBdUIsQ0FBQyxJQUM1REQsUUFBUSxDQUFDQyxhQUFhLENBQWMsY0FBYyxDQUFDO0VBRXZELENBQUN6QixRQUFRLENBQUNNLHdCQUF3QixHQUFHLE1BQU07SUFDdkMsTUFBTW9CLGNBQWMsR0FBRyxDQUFDLENBQUNGLFFBQVEsQ0FBQ0MsYUFBYSxDQUFDLHFCQUFxQixDQUFDO0lBQ3RFLElBQUlDLGNBQWMsRUFBRTtNQUNoQixNQUFNQyxRQUFRLEdBQUcsQ0FBQyxDQUFDSCxRQUFRLENBQUNJLGFBQWEsRUFBRUMsT0FBTyxDQUFDLGdCQUFnQixDQUFDO01BQ3BFQyxtQkFBaUIsQ0FBQ0MsUUFBUSxDQUN0QjtRQUNJQyxNQUFNLEVBQUVDLGVBQU0sQ0FBQ0Msd0JBQXdCO1FBQ3ZDQyxPQUFPLEVBQUVSLFFBQVEsR0FBR1Msa0NBQXFCLENBQUNDLE1BQU0sR0FBR0Qsa0NBQXFCLENBQUNFO01BQzdFLENBQUMsRUFDRCxJQUNKLENBQUM7TUFDRDtNQUNBLE9BQU9DLFNBQVM7SUFDcEIsQ0FBQyxNQUFNO01BQ0gsT0FBT2YsUUFBUSxDQUFDQyxhQUFhLENBQWMsY0FBYyxDQUFDO0lBQzlEO0VBQ0o7QUFDSixDQUFDIiwiaWdub3JlTGlzdCI6W119