matrix-react-sdk
Version:
SDK for matrix.org using React
108 lines (105 loc) • 15.7 kB
JavaScript
;
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 _react = _interopRequireDefault(require("react"));
var _classnames = _interopRequireDefault(require("classnames"));
var _lodash = require("lodash");
var _languageHandler = require("../../../languageHandler");
var _KeyBindingsManager = require("../../../KeyBindingsManager");
var _KeyboardShortcuts = require("../../../accessibility/KeyboardShortcuts");
/*
Copyright 2024 New Vector Ltd.
Copyright 2020 The Matrix.org Foundation C.I.C.
Copyright 2019 Tulir Asokan <tulir@maunium.net>
SPDX-License-Identifier: AGPL-3.0-only OR GPL-3.0-only
Please see LICENSE files in the repository root for full details.
*/
class Header extends _react.default.PureComponent {
constructor(...args) {
super(...args);
// Implements ARIA Tabs with Automatic Activation pattern
// https://www.w3.org/TR/wai-aria-practices/examples/tabs/tabs-1/tabs.html
(0, _defineProperty2.default)(this, "onKeyDown", ev => {
let handled = true;
const action = (0, _KeyBindingsManager.getKeyBindingsManager)().getAccessibilityAction(ev);
switch (action) {
case _KeyboardShortcuts.KeyBindingAction.ArrowLeft:
this.changeCategoryRelative(-1);
break;
case _KeyboardShortcuts.KeyBindingAction.ArrowRight:
this.changeCategoryRelative(1);
break;
case _KeyboardShortcuts.KeyBindingAction.Home:
this.changeCategoryAbsolute(0);
break;
case _KeyboardShortcuts.KeyBindingAction.End:
this.changeCategoryAbsolute(this.props.categories.length - 1, -1);
break;
default:
handled = false;
}
if (handled) {
ev.preventDefault();
ev.stopPropagation();
}
});
}
findNearestEnabled(index, delta) {
index += this.props.categories.length;
const cats = [...this.props.categories, ...this.props.categories, ...this.props.categories];
while (index < cats.length && index >= 0) {
if (cats[index].enabled) return index % this.props.categories.length;
index += delta > 0 ? 1 : -1;
}
}
changeCategoryRelative(delta) {
let current;
// As multiple categories may be visible at once, we want to find the one closest to the relative direction
if (delta < 0) {
current = this.props.categories.findIndex(c => c.visible);
} else {
// XXX: Switch to Array::findLastIndex once we enable ES2023
current = (0, _lodash.findLastIndex)(this.props.categories, c => c.visible);
}
this.changeCategoryAbsolute(current + delta, delta);
}
changeCategoryAbsolute(index, delta = 1) {
const category = this.props.categories[this.findNearestEnabled(index, delta)];
if (category) {
this.props.onAnchorClick(category.id);
category.ref.current?.focus();
}
}
render() {
return /*#__PURE__*/_react.default.createElement("nav", {
className: "mx_EmojiPicker_header",
role: "tablist",
"aria-label": (0, _languageHandler._t)("emoji|categories"),
onKeyDown: this.onKeyDown
}, this.props.categories.map(category => {
const classes = (0, _classnames.default)(`mx_EmojiPicker_anchor mx_EmojiPicker_anchor_${category.id}`, {
mx_EmojiPicker_anchor_visible: category.visible
});
// Properties of this button are also modified by EmojiPicker's updateVisibility in DOM.
return /*#__PURE__*/_react.default.createElement("button", {
disabled: !category.enabled,
key: category.id,
ref: category.ref,
className: classes,
onClick: () => this.props.onAnchorClick(category.id),
title: category.name,
role: "tab",
tabIndex: category.visible ? 0 : -1 // roving
,
"aria-selected": category.visible,
"aria-controls": `mx_EmojiPicker_category_${category.id}`
});
}));
}
}
var _default = exports.default = Header;
//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJuYW1lcyI6WyJfcmVhY3QiLCJfaW50ZXJvcFJlcXVpcmVEZWZhdWx0IiwicmVxdWlyZSIsIl9jbGFzc25hbWVzIiwiX2xvZGFzaCIsIl9sYW5ndWFnZUhhbmRsZXIiLCJfS2V5QmluZGluZ3NNYW5hZ2VyIiwiX0tleWJvYXJkU2hvcnRjdXRzIiwiSGVhZGVyIiwiUmVhY3QiLCJQdXJlQ29tcG9uZW50IiwiY29uc3RydWN0b3IiLCJhcmdzIiwiX2RlZmluZVByb3BlcnR5MiIsImRlZmF1bHQiLCJldiIsImhhbmRsZWQiLCJhY3Rpb24iLCJnZXRLZXlCaW5kaW5nc01hbmFnZXIiLCJnZXRBY2Nlc3NpYmlsaXR5QWN0aW9uIiwiS2V5QmluZGluZ0FjdGlvbiIsIkFycm93TGVmdCIsImNoYW5nZUNhdGVnb3J5UmVsYXRpdmUiLCJBcnJvd1JpZ2h0IiwiSG9tZSIsImNoYW5nZUNhdGVnb3J5QWJzb2x1dGUiLCJFbmQiLCJwcm9wcyIsImNhdGVnb3JpZXMiLCJsZW5ndGgiLCJwcmV2ZW50RGVmYXVsdCIsInN0b3BQcm9wYWdhdGlvbiIsImZpbmROZWFyZXN0RW5hYmxlZCIsImluZGV4IiwiZGVsdGEiLCJjYXRzIiwiZW5hYmxlZCIsImN1cnJlbnQiLCJmaW5kSW5kZXgiLCJjIiwidmlzaWJsZSIsImZpbmRMYXN0SW5kZXgiLCJjYXRlZ29yeSIsIm9uQW5jaG9yQ2xpY2siLCJpZCIsInJlZiIsImZvY3VzIiwicmVuZGVyIiwiY3JlYXRlRWxlbWVudCIsImNsYXNzTmFtZSIsInJvbGUiLCJfdCIsIm9uS2V5RG93biIsIm1hcCIsImNsYXNzZXMiLCJjbGFzc05hbWVzIiwibXhfRW1vamlQaWNrZXJfYW5jaG9yX3Zpc2libGUiLCJkaXNhYmxlZCIsImtleSIsIm9uQ2xpY2siLCJ0aXRsZSIsIm5hbWUiLCJ0YWJJbmRleCIsIl9kZWZhdWx0IiwiZXhwb3J0cyJdLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uL3NyYy9jb21wb25lbnRzL3ZpZXdzL2Vtb2ppcGlja2VyL0hlYWRlci50c3giXSwic291cmNlc0NvbnRlbnQiOlsiLypcbkNvcHlyaWdodCAyMDI0IE5ldyBWZWN0b3IgTHRkLlxuQ29weXJpZ2h0IDIwMjAgVGhlIE1hdHJpeC5vcmcgRm91bmRhdGlvbiBDLkkuQy5cbkNvcHlyaWdodCAyMDE5IFR1bGlyIEFzb2thbiA8dHVsaXJAbWF1bml1bS5uZXQ+XG5cblNQRFgtTGljZW5zZS1JZGVudGlmaWVyOiBBR1BMLTMuMC1vbmx5IE9SIEdQTC0zLjAtb25seVxuUGxlYXNlIHNlZSBMSUNFTlNFIGZpbGVzIGluIHRoZSByZXBvc2l0b3J5IHJvb3QgZm9yIGZ1bGwgZGV0YWlscy5cbiovXG5cbmltcG9ydCBSZWFjdCBmcm9tIFwicmVhY3RcIjtcbmltcG9ydCBjbGFzc05hbWVzIGZyb20gXCJjbGFzc25hbWVzXCI7XG5pbXBvcnQgeyBmaW5kTGFzdEluZGV4IH0gZnJvbSBcImxvZGFzaFwiO1xuXG5pbXBvcnQgeyBfdCB9IGZyb20gXCIuLi8uLi8uLi9sYW5ndWFnZUhhbmRsZXJcIjtcbmltcG9ydCB7IENhdGVnb3J5S2V5LCBJQ2F0ZWdvcnkgfSBmcm9tIFwiLi9DYXRlZ29yeVwiO1xuaW1wb3J0IHsgZ2V0S2V5QmluZGluZ3NNYW5hZ2VyIH0gZnJvbSBcIi4uLy4uLy4uL0tleUJpbmRpbmdzTWFuYWdlclwiO1xuaW1wb3J0IHsgS2V5QmluZGluZ0FjdGlvbiB9IGZyb20gXCIuLi8uLi8uLi9hY2Nlc3NpYmlsaXR5L0tleWJvYXJkU2hvcnRjdXRzXCI7XG5cbmludGVyZmFjZSBJUHJvcHMge1xuICAgIGNhdGVnb3JpZXM6IElDYXRlZ29yeVtdO1xuICAgIG9uQW5jaG9yQ2xpY2soaWQ6IENhdGVnb3J5S2V5KTogdm9pZDtcbn1cblxuY2xhc3MgSGVhZGVyIGV4dGVuZHMgUmVhY3QuUHVyZUNvbXBvbmVudDxJUHJvcHM+IHtcbiAgICBwcml2YXRlIGZpbmROZWFyZXN0RW5hYmxlZChpbmRleDogbnVtYmVyLCBkZWx0YTogbnVtYmVyKTogbnVtYmVyIHwgdW5kZWZpbmVkIHtcbiAgICAgICAgaW5kZXggKz0gdGhpcy5wcm9wcy5jYXRlZ29yaWVzLmxlbmd0aDtcbiAgICAgICAgY29uc3QgY2F0cyA9IFsuLi50aGlzLnByb3BzLmNhdGVnb3JpZXMsIC4uLnRoaXMucHJvcHMuY2F0ZWdvcmllcywgLi4udGhpcy5wcm9wcy5jYXRlZ29yaWVzXTtcblxuICAgICAgICB3aGlsZSAoaW5kZXggPCBjYXRzLmxlbmd0aCAmJiBpbmRleCA+PSAwKSB7XG4gICAgICAgICAgICBpZiAoY2F0c1tpbmRleF0uZW5hYmxlZCkgcmV0dXJuIGluZGV4ICUgdGhpcy5wcm9wcy5jYXRlZ29yaWVzLmxlbmd0aDtcbiAgICAgICAgICAgIGluZGV4ICs9IGRlbHRhID4gMCA/IDEgOiAtMTtcbiAgICAgICAgfVxuICAgIH1cblxuICAgIHByaXZhdGUgY2hhbmdlQ2F0ZWdvcnlSZWxhdGl2ZShkZWx0YTogbnVtYmVyKTogdm9pZCB7XG4gICAgICAgIGxldCBjdXJyZW50OiBudW1iZXI7XG4gICAgICAgIC8vIEFzIG11bHRpcGxlIGNhdGVnb3JpZXMgbWF5IGJlIHZpc2libGUgYXQgb25jZSwgd2Ugd2FudCB0byBmaW5kIHRoZSBvbmUgY2xvc2VzdCB0byB0aGUgcmVsYXRpdmUgZGlyZWN0aW9uXG4gICAgICAgIGlmIChkZWx0YSA8IDApIHtcbiAgICAgICAgICAgIGN1cnJlbnQgPSB0aGlzLnByb3BzLmNhdGVnb3JpZXMuZmluZEluZGV4KChjKSA9PiBjLnZpc2libGUpO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgLy8gWFhYOiBTd2l0Y2ggdG8gQXJyYXk6OmZpbmRMYXN0SW5kZXggb25jZSB3ZSBlbmFibGUgRVMyMDIzXG4gICAgICAgICAgICBjdXJyZW50ID0gZmluZExhc3RJbmRleCh0aGlzLnByb3BzLmNhdGVnb3JpZXMsIChjKSA9PiBjLnZpc2libGUpO1xuICAgICAgICB9XG4gICAgICAgIHRoaXMuY2hhbmdlQ2F0ZWdvcnlBYnNvbHV0ZShjdXJyZW50ICsgZGVsdGEsIGRlbHRhKTtcbiAgICB9XG5cbiAgICBwcml2YXRlIGNoYW5nZUNhdGVnb3J5QWJzb2x1dGUoaW5kZXg6IG51bWJlciwgZGVsdGEgPSAxKTogdm9pZCB7XG4gICAgICAgIGNvbnN0IGNhdGVnb3J5ID0gdGhpcy5wcm9wcy5jYXRlZ29yaWVzW3RoaXMuZmluZE5lYXJlc3RFbmFibGVkKGluZGV4LCBkZWx0YSkhXTtcbiAgICAgICAgaWYgKGNhdGVnb3J5KSB7XG4gICAgICAgICAgICB0aGlzLnByb3BzLm9uQW5jaG9yQ2xpY2soY2F0ZWdvcnkuaWQpO1xuICAgICAgICAgICAgY2F0ZWdvcnkucmVmLmN1cnJlbnQ/LmZvY3VzKCk7XG4gICAgICAgIH1cbiAgICB9XG5cbiAgICAvLyBJbXBsZW1lbnRzIEFSSUEgVGFicyB3aXRoIEF1dG9tYXRpYyBBY3RpdmF0aW9uIHBhdHRlcm5cbiAgICAvLyBodHRwczovL3d3dy53My5vcmcvVFIvd2FpLWFyaWEtcHJhY3RpY2VzL2V4YW1wbGVzL3RhYnMvdGFicy0xL3RhYnMuaHRtbFxuICAgIHByaXZhdGUgb25LZXlEb3duID0gKGV2OiBSZWFjdC5LZXlib2FyZEV2ZW50KTogdm9pZCA9PiB7XG4gICAgICAgIGxldCBoYW5kbGVkID0gdHJ1ZTtcblxuICAgICAgICBjb25zdCBhY3Rpb24gPSBnZXRLZXlCaW5kaW5nc01hbmFnZXIoKS5nZXRBY2Nlc3NpYmlsaXR5QWN0aW9uKGV2KTtcbiAgICAgICAgc3dpdGNoIChhY3Rpb24pIHtcbiAgICAgICAgICAgIGNhc2UgS2V5QmluZGluZ0FjdGlvbi5BcnJvd0xlZnQ6XG4gICAgICAgICAgICAgICAgdGhpcy5jaGFuZ2VDYXRlZ29yeVJlbGF0aXZlKC0xKTtcbiAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgIGNhc2UgS2V5QmluZGluZ0FjdGlvbi5BcnJvd1JpZ2h0OlxuICAgICAgICAgICAgICAgIHRoaXMuY2hhbmdlQ2F0ZWdvcnlSZWxhdGl2ZSgxKTtcbiAgICAgICAgICAgICAgICBicmVhaztcblxuICAgICAgICAgICAgY2FzZSBLZXlCaW5kaW5nQWN0aW9uLkhvbWU6XG4gICAgICAgICAgICAgICAgdGhpcy5jaGFuZ2VDYXRlZ29yeUFic29sdXRlKDApO1xuICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgY2FzZSBLZXlCaW5kaW5nQWN0aW9uLkVuZDpcbiAgICAgICAgICAgICAgICB0aGlzLmNoYW5nZUNhdGVnb3J5QWJzb2x1dGUodGhpcy5wcm9wcy5jYXRlZ29yaWVzLmxlbmd0aCAtIDEsIC0xKTtcbiAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgIGRlZmF1bHQ6XG4gICAgICAgICAgICAgICAgaGFuZGxlZCA9IGZhbHNlO1xuICAgICAgICB9XG5cbiAgICAgICAgaWYgKGhhbmRsZWQpIHtcbiAgICAgICAgICAgIGV2LnByZXZlbnREZWZhdWx0KCk7XG4gICAgICAgICAgICBldi5zdG9wUHJvcGFnYXRpb24oKTtcbiAgICAgICAgfVxuICAgIH07XG5cbiAgICBwdWJsaWMgcmVuZGVyKCk6IFJlYWN0LlJlYWN0Tm9kZSB7XG4gICAgICAgIHJldHVybiAoXG4gICAgICAgICAgICA8bmF2XG4gICAgICAgICAgICAgICAgY2xhc3NOYW1lPVwibXhfRW1vamlQaWNrZXJfaGVhZGVyXCJcbiAgICAgICAgICAgICAgICByb2xlPVwidGFibGlzdFwiXG4gICAgICAgICAgICAgICAgYXJpYS1sYWJlbD17X3QoXCJlbW9qaXxjYXRlZ29yaWVzXCIpfVxuICAgICAgICAgICAgICAgIG9uS2V5RG93bj17dGhpcy5vbktleURvd259XG4gICAgICAgICAgICA+XG4gICAgICAgICAgICAgICAge3RoaXMucHJvcHMuY2F0ZWdvcmllcy5tYXAoKGNhdGVnb3J5KSA9PiB7XG4gICAgICAgICAgICAgICAgICAgIGNvbnN0IGNsYXNzZXMgPSBjbGFzc05hbWVzKGBteF9FbW9qaVBpY2tlcl9hbmNob3IgbXhfRW1vamlQaWNrZXJfYW5jaG9yXyR7Y2F0ZWdvcnkuaWR9YCwge1xuICAgICAgICAgICAgICAgICAgICAgICAgbXhfRW1vamlQaWNrZXJfYW5jaG9yX3Zpc2libGU6IGNhdGVnb3J5LnZpc2libGUsXG4gICAgICAgICAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgICAgICAgICAvLyBQcm9wZXJ0aWVzIG9mIHRoaXMgYnV0dG9uIGFyZSBhbHNvIG1vZGlmaWVkIGJ5IEVtb2ppUGlja2VyJ3MgdXBkYXRlVmlzaWJpbGl0eSBpbiBET00uXG4gICAgICAgICAgICAgICAgICAgIHJldHVybiAoXG4gICAgICAgICAgICAgICAgICAgICAgICA8YnV0dG9uXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgZGlzYWJsZWQ9eyFjYXRlZ29yeS5lbmFibGVkfVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGtleT17Y2F0ZWdvcnkuaWR9XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgcmVmPXtjYXRlZ29yeS5yZWZ9XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgY2xhc3NOYW1lPXtjbGFzc2VzfVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIG9uQ2xpY2s9eygpID0+IHRoaXMucHJvcHMub25BbmNob3JDbGljayhjYXRlZ29yeS5pZCl9XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgdGl0bGU9e2NhdGVnb3J5Lm5hbWV9XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgcm9sZT1cInRhYlwiXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgdGFiSW5kZXg9e2NhdGVnb3J5LnZpc2libGUgPyAwIDogLTF9IC8vIHJvdmluZ1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGFyaWEtc2VsZWN0ZWQ9e2NhdGVnb3J5LnZpc2libGV9XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgYXJpYS1jb250cm9scz17YG14X0Vtb2ppUGlja2VyX2NhdGVnb3J5XyR7Y2F0ZWdvcnkuaWR9YH1cbiAgICAgICAgICAgICAgICAgICAgICAgIC8+XG4gICAgICAgICAgICAgICAgICAgICk7XG4gICAgICAgICAgICAgICAgfSl9XG4gICAgICAgICAgICA8L25hdj5cbiAgICAgICAgKTtcbiAgICB9XG59XG5cbmV4cG9ydCBkZWZhdWx0IEhlYWRlcjtcbiJdLCJtYXBwaW5ncyI6Ijs7Ozs7Ozs7QUFTQSxJQUFBQSxNQUFBLEdBQUFDLHNCQUFBLENBQUFDLE9BQUE7QUFDQSxJQUFBQyxXQUFBLEdBQUFGLHNCQUFBLENBQUFDLE9BQUE7QUFDQSxJQUFBRSxPQUFBLEdBQUFGLE9BQUE7QUFFQSxJQUFBRyxnQkFBQSxHQUFBSCxPQUFBO0FBRUEsSUFBQUksbUJBQUEsR0FBQUosT0FBQTtBQUNBLElBQUFLLGtCQUFBLEdBQUFMLE9BQUE7QUFoQkE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFnQkEsTUFBTU0sTUFBTSxTQUFTQyxjQUFLLENBQUNDLGFBQWEsQ0FBUztFQUFBQyxZQUFBLEdBQUFDLElBQUE7SUFBQSxTQUFBQSxJQUFBO0lBK0I3QztJQUNBO0lBQUEsSUFBQUMsZ0JBQUEsQ0FBQUMsT0FBQSxxQkFDcUJDLEVBQXVCLElBQVc7TUFDbkQsSUFBSUMsT0FBTyxHQUFHLElBQUk7TUFFbEIsTUFBTUMsTUFBTSxHQUFHLElBQUFDLHlDQUFxQixFQUFDLENBQUMsQ0FBQ0Msc0JBQXNCLENBQUNKLEVBQUUsQ0FBQztNQUNqRSxRQUFRRSxNQUFNO1FBQ1YsS0FBS0csbUNBQWdCLENBQUNDLFNBQVM7VUFDM0IsSUFBSSxDQUFDQyxzQkFBc0IsQ0FBQyxDQUFDLENBQUMsQ0FBQztVQUMvQjtRQUNKLEtBQUtGLG1DQUFnQixDQUFDRyxVQUFVO1VBQzVCLElBQUksQ0FBQ0Qsc0JBQXNCLENBQUMsQ0FBQyxDQUFDO1VBQzlCO1FBRUosS0FBS0YsbUNBQWdCLENBQUNJLElBQUk7VUFDdEIsSUFBSSxDQUFDQyxzQkFBc0IsQ0FBQyxDQUFDLENBQUM7VUFDOUI7UUFDSixLQUFLTCxtQ0FBZ0IsQ0FBQ00sR0FBRztVQUNyQixJQUFJLENBQUNELHNCQUFzQixDQUFDLElBQUksQ0FBQ0UsS0FBSyxDQUFDQyxVQUFVLENBQUNDLE1BQU0sR0FBRyxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUM7VUFDakU7UUFDSjtVQUNJYixPQUFPLEdBQUcsS0FBSztNQUN2QjtNQUVBLElBQUlBLE9BQU8sRUFBRTtRQUNURCxFQUFFLENBQUNlLGNBQWMsQ0FBQyxDQUFDO1FBQ25CZixFQUFFLENBQUNnQixlQUFlLENBQUMsQ0FBQztNQUN4QjtJQUNKLENBQUM7RUFBQTtFQTFET0Msa0JBQWtCQSxDQUFDQyxLQUFhLEVBQUVDLEtBQWEsRUFBc0I7SUFDekVELEtBQUssSUFBSSxJQUFJLENBQUNOLEtBQUssQ0FBQ0MsVUFBVSxDQUFDQyxNQUFNO0lBQ3JDLE1BQU1NLElBQUksR0FBRyxDQUFDLEdBQUcsSUFBSSxDQUFDUixLQUFLLENBQUNDLFVBQVUsRUFBRSxHQUFHLElBQUksQ0FBQ0QsS0FBSyxDQUFDQyxVQUFVLEVBQUUsR0FBRyxJQUFJLENBQUNELEtBQUssQ0FBQ0MsVUFBVSxDQUFDO0lBRTNGLE9BQU9LLEtBQUssR0FBR0UsSUFBSSxDQUFDTixNQUFNLElBQUlJLEtBQUssSUFBSSxDQUFDLEVBQUU7TUFDdEMsSUFBSUUsSUFBSSxDQUFDRixLQUFLLENBQUMsQ0FBQ0csT0FBTyxFQUFFLE9BQU9ILEtBQUssR0FBRyxJQUFJLENBQUNOLEtBQUssQ0FBQ0MsVUFBVSxDQUFDQyxNQUFNO01BQ3BFSSxLQUFLLElBQUlDLEtBQUssR0FBRyxDQUFDLEdBQUcsQ0FBQyxHQUFHLENBQUMsQ0FBQztJQUMvQjtFQUNKO0VBRVFaLHNCQUFzQkEsQ0FBQ1ksS0FBYSxFQUFRO0lBQ2hELElBQUlHLE9BQWU7SUFDbkI7SUFDQSxJQUFJSCxLQUFLLEdBQUcsQ0FBQyxFQUFFO01BQ1hHLE9BQU8sR0FBRyxJQUFJLENBQUNWLEtBQUssQ0FBQ0MsVUFBVSxDQUFDVSxTQUFTLENBQUVDLENBQUMsSUFBS0EsQ0FBQyxDQUFDQyxPQUFPLENBQUM7SUFDL0QsQ0FBQyxNQUFNO01BQ0g7TUFDQUgsT0FBTyxHQUFHLElBQUFJLHFCQUFhLEVBQUMsSUFBSSxDQUFDZCxLQUFLLENBQUNDLFVBQVUsRUFBR1csQ0FBQyxJQUFLQSxDQUFDLENBQUNDLE9BQU8sQ0FBQztJQUNwRTtJQUNBLElBQUksQ0FBQ2Ysc0JBQXNCLENBQUNZLE9BQU8sR0FBR0gsS0FBSyxFQUFFQSxLQUFLLENBQUM7RUFDdkQ7RUFFUVQsc0JBQXNCQSxDQUFDUSxLQUFhLEVBQUVDLEtBQUssR0FBRyxDQUFDLEVBQVE7SUFDM0QsTUFBTVEsUUFBUSxHQUFHLElBQUksQ0FBQ2YsS0FBSyxDQUFDQyxVQUFVLENBQUMsSUFBSSxDQUFDSSxrQkFBa0IsQ0FBQ0MsS0FBSyxFQUFFQyxLQUFLLENBQUMsQ0FBRTtJQUM5RSxJQUFJUSxRQUFRLEVBQUU7TUFDVixJQUFJLENBQUNmLEtBQUssQ0FBQ2dCLGFBQWEsQ0FBQ0QsUUFBUSxDQUFDRSxFQUFFLENBQUM7TUFDckNGLFFBQVEsQ0FBQ0csR0FBRyxDQUFDUixPQUFPLEVBQUVTLEtBQUssQ0FBQyxDQUFDO0lBQ2pDO0VBQ0o7RUFnQ09DLE1BQU1BLENBQUEsRUFBb0I7SUFDN0Isb0JBQ0kvQyxNQUFBLENBQUFjLE9BQUEsQ0FBQWtDLGFBQUE7TUFDSUMsU0FBUyxFQUFDLHVCQUF1QjtNQUNqQ0MsSUFBSSxFQUFDLFNBQVM7TUFDZCxjQUFZLElBQUFDLG1CQUFFLEVBQUMsa0JBQWtCLENBQUU7TUFDbkNDLFNBQVMsRUFBRSxJQUFJLENBQUNBO0lBQVUsR0FFekIsSUFBSSxDQUFDekIsS0FBSyxDQUFDQyxVQUFVLENBQUN5QixHQUFHLENBQUVYLFFBQVEsSUFBSztNQUNyQyxNQUFNWSxPQUFPLEdBQUcsSUFBQUMsbUJBQVUsRUFBQywrQ0FBK0NiLFFBQVEsQ0FBQ0UsRUFBRSxFQUFFLEVBQUU7UUFDckZZLDZCQUE2QixFQUFFZCxRQUFRLENBQUNGO01BQzVDLENBQUMsQ0FBQztNQUNGO01BQ0Esb0JBQ0l4QyxNQUFBLENBQUFjLE9BQUEsQ0FBQWtDLGFBQUE7UUFDSVMsUUFBUSxFQUFFLENBQUNmLFFBQVEsQ0FBQ04sT0FBUTtRQUM1QnNCLEdBQUcsRUFBRWhCLFFBQVEsQ0FBQ0UsRUFBRztRQUNqQkMsR0FBRyxFQUFFSCxRQUFRLENBQUNHLEdBQUk7UUFDbEJJLFNBQVMsRUFBRUssT0FBUTtRQUNuQkssT0FBTyxFQUFFQSxDQUFBLEtBQU0sSUFBSSxDQUFDaEMsS0FBSyxDQUFDZ0IsYUFBYSxDQUFDRCxRQUFRLENBQUNFLEVBQUUsQ0FBRTtRQUNyRGdCLEtBQUssRUFBRWxCLFFBQVEsQ0FBQ21CLElBQUs7UUFDckJYLElBQUksRUFBQyxLQUFLO1FBQ1ZZLFFBQVEsRUFBRXBCLFFBQVEsQ0FBQ0YsT0FBTyxHQUFHLENBQUMsR0FBRyxDQUFDLENBQUUsQ0FBQztRQUFBO1FBQ3JDLGlCQUFlRSxRQUFRLENBQUNGLE9BQVE7UUFDaEMsaUJBQWUsMkJBQTJCRSxRQUFRLENBQUNFLEVBQUU7TUFBRyxDQUMzRCxDQUFDO0lBRVYsQ0FBQyxDQUNBLENBQUM7RUFFZDtBQUNKO0FBQUMsSUFBQW1CLFFBQUEsR0FBQUMsT0FBQSxDQUFBbEQsT0FBQSxHQUVjTixNQUFNIiwiaWdub3JlTGlzdCI6W119