matrix-react-sdk
Version:
SDK for matrix.org using React
186 lines (184 loc) • 27.1 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 _react = _interopRequireWildcard(require("react"));
var _KeyboardShortcuts = require("../../../accessibility/KeyboardShortcuts");
var _KeyBindingsManager = require("../../../KeyBindingsManager");
function _getRequireWildcardCache(e) { if ("function" != typeof WeakMap) return null; var r = new WeakMap(), t = new WeakMap(); return (_getRequireWildcardCache = function (e) { return e ? t : r; })(e); }
function _interopRequireWildcard(e, r) { if (!r && e && e.__esModule) return e; if (null === e || "object" != typeof e && "function" != typeof e) return { default: e }; var t = _getRequireWildcardCache(r); if (t && t.has(e)) return t.get(e); var n = { __proto__: null }, a = Object.defineProperty && Object.getOwnPropertyDescriptor; for (var u in e) if ("default" !== u && {}.hasOwnProperty.call(e, u)) { var i = a ? Object.getOwnPropertyDescriptor(e, u) : null; i && (i.get || i.set) ? Object.defineProperty(n, u, i) : n[u] = e[u]; } return n.default = e, t && t.set(e, n), n; }
/*
Copyright 2018-2024 New Vector Ltd.
Copyright 2015, 2016 OpenMarket Ltd
SPDX-License-Identifier: AGPL-3.0-only OR GPL-3.0-only
Please see LICENSE files in the repository root for full details.
*/
var Phases = /*#__PURE__*/function (Phases) {
Phases["Display"] = "display";
Phases["Edit"] = "edit";
return Phases;
}(Phases || {});
class EditableText extends _react.default.Component {
constructor(props) {
super(props);
// we track value as an JS object field rather than in React state
// as React doesn't play nice with contentEditable.
(0, _defineProperty2.default)(this, "value", "");
(0, _defineProperty2.default)(this, "placeholder", false);
(0, _defineProperty2.default)(this, "editableDiv", /*#__PURE__*/(0, _react.createRef)());
(0, _defineProperty2.default)(this, "showPlaceholder", show => {
if (!this.editableDiv.current) return;
if (show) {
this.editableDiv.current.textContent = this.props.placeholder;
this.editableDiv.current.setAttribute("class", this.props.className + " " + this.props.placeholderClassName);
this.placeholder = true;
this.value = "";
} else {
this.editableDiv.current.textContent = this.value;
this.editableDiv.current.setAttribute("class", this.props.className);
this.placeholder = false;
}
});
(0, _defineProperty2.default)(this, "cancelEdit", () => {
this.setState({
phase: Phases.Display
});
this.value = this.props.initialValue;
this.showPlaceholder(!this.value);
this.onValueChanged(false);
this.editableDiv.current?.blur();
});
(0, _defineProperty2.default)(this, "onValueChanged", shouldSubmit => {
this.props.onValueChanged?.(this.value, shouldSubmit);
});
(0, _defineProperty2.default)(this, "onKeyDown", ev => {
if (this.placeholder) {
this.showPlaceholder(false);
}
const action = (0, _KeyBindingsManager.getKeyBindingsManager)().getAccessibilityAction(ev);
switch (action) {
case _KeyboardShortcuts.KeyBindingAction.Enter:
ev.stopPropagation();
ev.preventDefault();
break;
}
});
(0, _defineProperty2.default)(this, "onKeyUp", ev => {
if (!ev.target.textContent) {
this.showPlaceholder(true);
} else if (!this.placeholder) {
this.value = ev.target.textContent ?? "";
}
const action = (0, _KeyBindingsManager.getKeyBindingsManager)().getAccessibilityAction(ev);
switch (action) {
case _KeyboardShortcuts.KeyBindingAction.Escape:
this.cancelEdit();
break;
case _KeyboardShortcuts.KeyBindingAction.Enter:
this.onFinish(ev);
break;
}
});
(0, _defineProperty2.default)(this, "onClickDiv", () => {
if (!this.props.editable) return;
this.setState({
phase: Phases.Edit
});
});
(0, _defineProperty2.default)(this, "onFocus", ev => {
const node = ev.target.childNodes[0];
if (node) {
const range = document.createRange();
range.setStart(node, 0);
range.setEnd(node, ev.target.childNodes.length);
const sel = window.getSelection();
sel.removeAllRanges();
sel.addRange(range);
}
});
(0, _defineProperty2.default)(this, "onFinish", (ev, shouldSubmit = false) => {
// eslint-disable-next-line @typescript-eslint/no-this-alias
const self = this;
const action = (0, _KeyBindingsManager.getKeyBindingsManager)().getAccessibilityAction(ev);
const submit = action === _KeyboardShortcuts.KeyBindingAction.Enter || shouldSubmit;
this.setState({
phase: Phases.Display
}, () => {
if (this.value !== this.props.initialValue) {
self.onValueChanged(submit);
}
});
});
(0, _defineProperty2.default)(this, "onBlur", ev => {
const sel = window.getSelection();
sel.removeAllRanges();
if (this.props.blurToCancel) {
this.cancelEdit();
} else {
this.onFinish(ev, this.props.blurToSubmit);
}
this.showPlaceholder(!this.value);
});
this.state = {
phase: Phases.Display
};
}
componentDidUpdate(prevProps) {
if (prevProps.initialValue !== this.props.initialValue) {
this.value = this.props.initialValue;
if (this.editableDiv.current) {
this.showPlaceholder(!this.value);
}
}
}
componentDidMount() {
this.value = this.props.initialValue;
if (this.editableDiv.current) {
this.showPlaceholder(!this.value);
}
}
render() {
const {
className,
editable,
initialValue,
label,
labelClassName
} = this.props;
let editableEl;
if (!editable || this.state.phase === Phases.Display && (label || labelClassName) && !this.value) {
// show the label
editableEl = /*#__PURE__*/_react.default.createElement("div", {
className: className + " " + labelClassName,
onClick: this.onClickDiv
}, label || initialValue);
} else {
// show the content editable div, but manually manage its contents as react and contentEditable don't play nice together
editableEl = /*#__PURE__*/_react.default.createElement("div", {
ref: this.editableDiv,
contentEditable: true,
className: className,
onKeyDown: this.onKeyDown,
onKeyUp: this.onKeyUp,
onFocus: this.onFocus,
onBlur: this.onBlur
});
}
return editableEl;
}
}
exports.default = EditableText;
(0, _defineProperty2.default)(EditableText, "defaultProps", {
onValueChanged() {},
initialValue: "",
label: "",
placeholder: "",
editable: true,
className: "mx_EditableText",
placeholderClassName: "mx_EditableText_placeholder",
blurToSubmit: false
});
//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJuYW1lcyI6WyJfcmVhY3QiLCJfaW50ZXJvcFJlcXVpcmVXaWxkY2FyZCIsInJlcXVpcmUiLCJfS2V5Ym9hcmRTaG9ydGN1dHMiLCJfS2V5QmluZGluZ3NNYW5hZ2VyIiwiX2dldFJlcXVpcmVXaWxkY2FyZENhY2hlIiwiZSIsIldlYWtNYXAiLCJyIiwidCIsIl9fZXNNb2R1bGUiLCJkZWZhdWx0IiwiaGFzIiwiZ2V0IiwibiIsIl9fcHJvdG9fXyIsImEiLCJPYmplY3QiLCJkZWZpbmVQcm9wZXJ0eSIsImdldE93blByb3BlcnR5RGVzY3JpcHRvciIsInUiLCJoYXNPd25Qcm9wZXJ0eSIsImNhbGwiLCJpIiwic2V0IiwiUGhhc2VzIiwiRWRpdGFibGVUZXh0IiwiUmVhY3QiLCJDb21wb25lbnQiLCJjb25zdHJ1Y3RvciIsInByb3BzIiwiX2RlZmluZVByb3BlcnR5MiIsImNyZWF0ZVJlZiIsInNob3ciLCJlZGl0YWJsZURpdiIsImN1cnJlbnQiLCJ0ZXh0Q29udGVudCIsInBsYWNlaG9sZGVyIiwic2V0QXR0cmlidXRlIiwiY2xhc3NOYW1lIiwicGxhY2Vob2xkZXJDbGFzc05hbWUiLCJ2YWx1ZSIsInNldFN0YXRlIiwicGhhc2UiLCJEaXNwbGF5IiwiaW5pdGlhbFZhbHVlIiwic2hvd1BsYWNlaG9sZGVyIiwib25WYWx1ZUNoYW5nZWQiLCJibHVyIiwic2hvdWxkU3VibWl0IiwiZXYiLCJhY3Rpb24iLCJnZXRLZXlCaW5kaW5nc01hbmFnZXIiLCJnZXRBY2Nlc3NpYmlsaXR5QWN0aW9uIiwiS2V5QmluZGluZ0FjdGlvbiIsIkVudGVyIiwic3RvcFByb3BhZ2F0aW9uIiwicHJldmVudERlZmF1bHQiLCJ0YXJnZXQiLCJFc2NhcGUiLCJjYW5jZWxFZGl0Iiwib25GaW5pc2giLCJlZGl0YWJsZSIsIkVkaXQiLCJub2RlIiwiY2hpbGROb2RlcyIsInJhbmdlIiwiZG9jdW1lbnQiLCJjcmVhdGVSYW5nZSIsInNldFN0YXJ0Iiwic2V0RW5kIiwibGVuZ3RoIiwic2VsIiwid2luZG93IiwiZ2V0U2VsZWN0aW9uIiwicmVtb3ZlQWxsUmFuZ2VzIiwiYWRkUmFuZ2UiLCJzZWxmIiwic3VibWl0IiwiYmx1clRvQ2FuY2VsIiwiYmx1clRvU3VibWl0Iiwic3RhdGUiLCJjb21wb25lbnREaWRVcGRhdGUiLCJwcmV2UHJvcHMiLCJjb21wb25lbnREaWRNb3VudCIsInJlbmRlciIsImxhYmVsIiwibGFiZWxDbGFzc05hbWUiLCJlZGl0YWJsZUVsIiwiY3JlYXRlRWxlbWVudCIsIm9uQ2xpY2siLCJvbkNsaWNrRGl2IiwicmVmIiwiY29udGVudEVkaXRhYmxlIiwib25LZXlEb3duIiwib25LZXlVcCIsIm9uRm9jdXMiLCJvbkJsdXIiLCJleHBvcnRzIl0sInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vc3JjL2NvbXBvbmVudHMvdmlld3MvZWxlbWVudHMvRWRpdGFibGVUZXh0LnRzeCJdLCJzb3VyY2VzQ29udGVudCI6WyIvKlxuQ29weXJpZ2h0IDIwMTgtMjAyNCBOZXcgVmVjdG9yIEx0ZC5cbkNvcHlyaWdodCAyMDE1LCAyMDE2IE9wZW5NYXJrZXQgTHRkXG5cblNQRFgtTGljZW5zZS1JZGVudGlmaWVyOiBBR1BMLTMuMC1vbmx5IE9SIEdQTC0zLjAtb25seVxuUGxlYXNlIHNlZSBMSUNFTlNFIGZpbGVzIGluIHRoZSByZXBvc2l0b3J5IHJvb3QgZm9yIGZ1bGwgZGV0YWlscy5cbiovXG5cbmltcG9ydCBSZWFjdCwgeyBjcmVhdGVSZWYgfSBmcm9tIFwicmVhY3RcIjtcblxuaW1wb3J0IHsgS2V5QmluZGluZ0FjdGlvbiB9IGZyb20gXCIuLi8uLi8uLi9hY2Nlc3NpYmlsaXR5L0tleWJvYXJkU2hvcnRjdXRzXCI7XG5pbXBvcnQgeyBnZXRLZXlCaW5kaW5nc01hbmFnZXIgfSBmcm9tIFwiLi4vLi4vLi4vS2V5QmluZGluZ3NNYW5hZ2VyXCI7XG5cbmVudW0gUGhhc2VzIHtcbiAgICBEaXNwbGF5ID0gXCJkaXNwbGF5XCIsXG4gICAgRWRpdCA9IFwiZWRpdFwiLFxufVxuXG5pbnRlcmZhY2UgSVByb3BzIHtcbiAgICBvblZhbHVlQ2hhbmdlZD86ICh2YWx1ZTogc3RyaW5nLCBzaG91bGRTdWJtaXQ6IGJvb2xlYW4pID0+IHZvaWQ7XG4gICAgaW5pdGlhbFZhbHVlOiBzdHJpbmc7XG4gICAgbGFiZWw6IHN0cmluZztcbiAgICBwbGFjZWhvbGRlcjogc3RyaW5nO1xuICAgIGNsYXNzTmFtZTogc3RyaW5nO1xuICAgIGxhYmVsQ2xhc3NOYW1lPzogc3RyaW5nO1xuICAgIHBsYWNlaG9sZGVyQ2xhc3NOYW1lOiBzdHJpbmc7XG4gICAgLy8gT3ZlcnJpZGVzIGJsdXJUb1N1Ym1pdCBpZiB0cnVlXG4gICAgYmx1clRvQ2FuY2VsPzogYm9vbGVhbjtcbiAgICAvLyBXaWxsIGNhdXNlIG9uVmFsdWVDaGFuZ2VkKHZhbHVlLCB0cnVlKSB0byBmaXJlIG9uIGJsdXJcbiAgICBibHVyVG9TdWJtaXQ6IGJvb2xlYW47XG4gICAgZWRpdGFibGU6IGJvb2xlYW47XG59XG5cbmludGVyZmFjZSBJU3RhdGUge1xuICAgIHBoYXNlOiBQaGFzZXM7XG59XG5cbmV4cG9ydCBkZWZhdWx0IGNsYXNzIEVkaXRhYmxlVGV4dCBleHRlbmRzIFJlYWN0LkNvbXBvbmVudDxJUHJvcHMsIElTdGF0ZT4ge1xuICAgIC8vIHdlIHRyYWNrIHZhbHVlIGFzIGFuIEpTIG9iamVjdCBmaWVsZCByYXRoZXIgdGhhbiBpbiBSZWFjdCBzdGF0ZVxuICAgIC8vIGFzIFJlYWN0IGRvZXNuJ3QgcGxheSBuaWNlIHdpdGggY29udGVudEVkaXRhYmxlLlxuICAgIHB1YmxpYyB2YWx1ZSA9IFwiXCI7XG4gICAgcHJpdmF0ZSBwbGFjZWhvbGRlciA9IGZhbHNlO1xuICAgIHByaXZhdGUgZWRpdGFibGVEaXYgPSBjcmVhdGVSZWY8SFRNTERpdkVsZW1lbnQ+KCk7XG5cbiAgICBwdWJsaWMgc3RhdGljIGRlZmF1bHRQcm9wczogUGFydGlhbDxJUHJvcHM+ID0ge1xuICAgICAgICBvblZhbHVlQ2hhbmdlZCgpIHt9LFxuICAgICAgICBpbml0aWFsVmFsdWU6IFwiXCIsXG4gICAgICAgIGxhYmVsOiBcIlwiLFxuICAgICAgICBwbGFjZWhvbGRlcjogXCJcIixcbiAgICAgICAgZWRpdGFibGU6IHRydWUsXG4gICAgICAgIGNsYXNzTmFtZTogXCJteF9FZGl0YWJsZVRleHRcIixcbiAgICAgICAgcGxhY2Vob2xkZXJDbGFzc05hbWU6IFwibXhfRWRpdGFibGVUZXh0X3BsYWNlaG9sZGVyXCIsXG4gICAgICAgIGJsdXJUb1N1Ym1pdDogZmFsc2UsXG4gICAgfTtcblxuICAgIHB1YmxpYyBjb25zdHJ1Y3Rvcihwcm9wczogSVByb3BzKSB7XG4gICAgICAgIHN1cGVyKHByb3BzKTtcblxuICAgICAgICB0aGlzLnN0YXRlID0ge1xuICAgICAgICAgICAgcGhhc2U6IFBoYXNlcy5EaXNwbGF5LFxuICAgICAgICB9O1xuICAgIH1cblxuICAgIHB1YmxpYyBjb21wb25lbnREaWRVcGRhdGUocHJldlByb3BzOiBSZWFkb25seTxJUHJvcHM+KTogdm9pZCB7XG4gICAgICAgIGlmIChwcmV2UHJvcHMuaW5pdGlhbFZhbHVlICE9PSB0aGlzLnByb3BzLmluaXRpYWxWYWx1ZSkge1xuICAgICAgICAgICAgdGhpcy52YWx1ZSA9IHRoaXMucHJvcHMuaW5pdGlhbFZhbHVlO1xuICAgICAgICAgICAgaWYgKHRoaXMuZWRpdGFibGVEaXYuY3VycmVudCkge1xuICAgICAgICAgICAgICAgIHRoaXMuc2hvd1BsYWNlaG9sZGVyKCF0aGlzLnZhbHVlKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgIH1cblxuICAgIHB1YmxpYyBjb21wb25lbnREaWRNb3VudCgpOiB2b2lkIHtcbiAgICAgICAgdGhpcy52YWx1ZSA9IHRoaXMucHJvcHMuaW5pdGlhbFZhbHVlO1xuICAgICAgICBpZiAodGhpcy5lZGl0YWJsZURpdi5jdXJyZW50KSB7XG4gICAgICAgICAgICB0aGlzLnNob3dQbGFjZWhvbGRlcighdGhpcy52YWx1ZSk7XG4gICAgICAgIH1cbiAgICB9XG5cbiAgICBwcml2YXRlIHNob3dQbGFjZWhvbGRlciA9IChzaG93OiBib29sZWFuKTogdm9pZCA9PiB7XG4gICAgICAgIGlmICghdGhpcy5lZGl0YWJsZURpdi5jdXJyZW50KSByZXR1cm47XG4gICAgICAgIGlmIChzaG93KSB7XG4gICAgICAgICAgICB0aGlzLmVkaXRhYmxlRGl2LmN1cnJlbnQudGV4dENvbnRlbnQgPSB0aGlzLnByb3BzLnBsYWNlaG9sZGVyO1xuICAgICAgICAgICAgdGhpcy5lZGl0YWJsZURpdi5jdXJyZW50LnNldEF0dHJpYnV0ZShcbiAgICAgICAgICAgICAgICBcImNsYXNzXCIsXG4gICAgICAgICAgICAgICAgdGhpcy5wcm9wcy5jbGFzc05hbWUgKyBcIiBcIiArIHRoaXMucHJvcHMucGxhY2Vob2xkZXJDbGFzc05hbWUsXG4gICAgICAgICAgICApO1xuICAgICAgICAgICAgdGhpcy5wbGFjZWhvbGRlciA9IHRydWU7XG4gICAgICAgICAgICB0aGlzLnZhbHVlID0gXCJcIjtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIHRoaXMuZWRpdGFibGVEaXYuY3VycmVudC50ZXh0Q29udGVudCA9IHRoaXMudmFsdWU7XG4gICAgICAgICAgICB0aGlzLmVkaXRhYmxlRGl2LmN1cnJlbnQuc2V0QXR0cmlidXRlKFwiY2xhc3NcIiwgdGhpcy5wcm9wcy5jbGFzc05hbWUpO1xuICAgICAgICAgICAgdGhpcy5wbGFjZWhvbGRlciA9IGZhbHNlO1xuICAgICAgICB9XG4gICAgfTtcblxuICAgIHByaXZhdGUgY2FuY2VsRWRpdCA9ICgpOiB2b2lkID0+IHtcbiAgICAgICAgdGhpcy5zZXRTdGF0ZSh7XG4gICAgICAgICAgICBwaGFzZTogUGhhc2VzLkRpc3BsYXksXG4gICAgICAgIH0pO1xuICAgICAgICB0aGlzLnZhbHVlID0gdGhpcy5wcm9wcy5pbml0aWFsVmFsdWU7XG4gICAgICAgIHRoaXMuc2hvd1BsYWNlaG9sZGVyKCF0aGlzLnZhbHVlKTtcbiAgICAgICAgdGhpcy5vblZhbHVlQ2hhbmdlZChmYWxzZSk7XG4gICAgICAgIHRoaXMuZWRpdGFibGVEaXYuY3VycmVudD8uYmx1cigpO1xuICAgIH07XG5cbiAgICBwcml2YXRlIG9uVmFsdWVDaGFuZ2VkID0gKHNob3VsZFN1Ym1pdDogYm9vbGVhbik6IHZvaWQgPT4ge1xuICAgICAgICB0aGlzLnByb3BzLm9uVmFsdWVDaGFuZ2VkPy4odGhpcy52YWx1ZSwgc2hvdWxkU3VibWl0KTtcbiAgICB9O1xuXG4gICAgcHJpdmF0ZSBvbktleURvd24gPSAoZXY6IFJlYWN0LktleWJvYXJkRXZlbnQ8SFRNTERpdkVsZW1lbnQ+KTogdm9pZCA9PiB7XG4gICAgICAgIGlmICh0aGlzLnBsYWNlaG9sZGVyKSB7XG4gICAgICAgICAgICB0aGlzLnNob3dQbGFjZWhvbGRlcihmYWxzZSk7XG4gICAgICAgIH1cblxuICAgICAgICBjb25zdCBhY3Rpb24gPSBnZXRLZXlCaW5kaW5nc01hbmFnZXIoKS5nZXRBY2Nlc3NpYmlsaXR5QWN0aW9uKGV2KTtcbiAgICAgICAgc3dpdGNoIChhY3Rpb24pIHtcbiAgICAgICAgICAgIGNhc2UgS2V5QmluZGluZ0FjdGlvbi5FbnRlcjpcbiAgICAgICAgICAgICAgICBldi5zdG9wUHJvcGFnYXRpb24oKTtcbiAgICAgICAgICAgICAgICBldi5wcmV2ZW50RGVmYXVsdCgpO1xuICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICB9XG4gICAgfTtcblxuICAgIHByaXZhdGUgb25LZXlVcCA9IChldjogUmVhY3QuS2V5Ym9hcmRFdmVudDxIVE1MRGl2RWxlbWVudD4pOiB2b2lkID0+IHtcbiAgICAgICAgaWYgKCEoZXYudGFyZ2V0IGFzIEhUTUxEaXZFbGVtZW50KS50ZXh0Q29udGVudCkge1xuICAgICAgICAgICAgdGhpcy5zaG93UGxhY2Vob2xkZXIodHJ1ZSk7XG4gICAgICAgIH0gZWxzZSBpZiAoIXRoaXMucGxhY2Vob2xkZXIpIHtcbiAgICAgICAgICAgIHRoaXMudmFsdWUgPSAoZXYudGFyZ2V0IGFzIEhUTUxEaXZFbGVtZW50KS50ZXh0Q29udGVudCA/PyBcIlwiO1xuICAgICAgICB9XG5cbiAgICAgICAgY29uc3QgYWN0aW9uID0gZ2V0S2V5QmluZGluZ3NNYW5hZ2VyKCkuZ2V0QWNjZXNzaWJpbGl0eUFjdGlvbihldik7XG4gICAgICAgIHN3aXRjaCAoYWN0aW9uKSB7XG4gICAgICAgICAgICBjYXNlIEtleUJpbmRpbmdBY3Rpb24uRXNjYXBlOlxuICAgICAgICAgICAgICAgIHRoaXMuY2FuY2VsRWRpdCgpO1xuICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgY2FzZSBLZXlCaW5kaW5nQWN0aW9uLkVudGVyOlxuICAgICAgICAgICAgICAgIHRoaXMub25GaW5pc2goZXYpO1xuICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICB9XG4gICAgfTtcblxuICAgIHByaXZhdGUgb25DbGlja0RpdiA9ICgpOiB2b2lkID0+IHtcbiAgICAgICAgaWYgKCF0aGlzLnByb3BzLmVkaXRhYmxlKSByZXR1cm47XG5cbiAgICAgICAgdGhpcy5zZXRTdGF0ZSh7XG4gICAgICAgICAgICBwaGFzZTogUGhhc2VzLkVkaXQsXG4gICAgICAgIH0pO1xuICAgIH07XG5cbiAgICBwcml2YXRlIG9uRm9jdXMgPSAoZXY6IFJlYWN0LkZvY3VzRXZlbnQ8SFRNTERpdkVsZW1lbnQ+KTogdm9pZCA9PiB7XG4gICAgICAgIGNvbnN0IG5vZGUgPSBldi50YXJnZXQuY2hpbGROb2Rlc1swXTtcbiAgICAgICAgaWYgKG5vZGUpIHtcbiAgICAgICAgICAgIGNvbnN0IHJhbmdlID0gZG9jdW1lbnQuY3JlYXRlUmFuZ2UoKTtcbiAgICAgICAgICAgIHJhbmdlLnNldFN0YXJ0KG5vZGUsIDApO1xuICAgICAgICAgICAgcmFuZ2Uuc2V0RW5kKG5vZGUsIGV2LnRhcmdldC5jaGlsZE5vZGVzLmxlbmd0aCk7XG5cbiAgICAgICAgICAgIGNvbnN0IHNlbCA9IHdpbmRvdy5nZXRTZWxlY3Rpb24oKSE7XG4gICAgICAgICAgICBzZWwucmVtb3ZlQWxsUmFuZ2VzKCk7XG4gICAgICAgICAgICBzZWwuYWRkUmFuZ2UocmFuZ2UpO1xuICAgICAgICB9XG4gICAgfTtcblxuICAgIHByaXZhdGUgb25GaW5pc2ggPSAoXG4gICAgICAgIGV2OiBSZWFjdC5LZXlib2FyZEV2ZW50PEhUTUxEaXZFbGVtZW50PiB8IFJlYWN0LkZvY3VzRXZlbnQ8SFRNTERpdkVsZW1lbnQ+LFxuICAgICAgICBzaG91bGRTdWJtaXQgPSBmYWxzZSxcbiAgICApOiB2b2lkID0+IHtcbiAgICAgICAgLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIEB0eXBlc2NyaXB0LWVzbGludC9uby10aGlzLWFsaWFzXG4gICAgICAgIGNvbnN0IHNlbGYgPSB0aGlzO1xuICAgICAgICBjb25zdCBhY3Rpb24gPSBnZXRLZXlCaW5kaW5nc01hbmFnZXIoKS5nZXRBY2Nlc3NpYmlsaXR5QWN0aW9uKGV2IGFzIFJlYWN0LktleWJvYXJkRXZlbnQpO1xuICAgICAgICBjb25zdCBzdWJtaXQgPSBhY3Rpb24gPT09IEtleUJpbmRpbmdBY3Rpb24uRW50ZXIgfHwgc2hvdWxkU3VibWl0O1xuICAgICAgICB0aGlzLnNldFN0YXRlKFxuICAgICAgICAgICAge1xuICAgICAgICAgICAgICAgIHBoYXNlOiBQaGFzZXMuRGlzcGxheSxcbiAgICAgICAgICAgIH0sXG4gICAgICAgICAgICAoKSA9PiB7XG4gICAgICAgICAgICAgICAgaWYgKHRoaXMudmFsdWUgIT09IHRoaXMucHJvcHMuaW5pdGlhbFZhbHVlKSB7XG4gICAgICAgICAgICAgICAgICAgIHNlbGYub25WYWx1ZUNoYW5nZWQoc3VibWl0KTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9LFxuICAgICAgICApO1xuICAgIH07XG5cbiAgICBwcml2YXRlIG9uQmx1ciA9IChldjogUmVhY3QuRm9jdXNFdmVudDxIVE1MRGl2RWxlbWVudD4pOiB2b2lkID0+IHtcbiAgICAgICAgY29uc3Qgc2VsID0gd2luZG93LmdldFNlbGVjdGlvbigpITtcbiAgICAgICAgc2VsLnJlbW92ZUFsbFJhbmdlcygpO1xuXG4gICAgICAgIGlmICh0aGlzLnByb3BzLmJsdXJUb0NhbmNlbCkge1xuICAgICAgICAgICAgdGhpcy5jYW5jZWxFZGl0KCk7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICB0aGlzLm9uRmluaXNoKGV2LCB0aGlzLnByb3BzLmJsdXJUb1N1Ym1pdCk7XG4gICAgICAgIH1cblxuICAgICAgICB0aGlzLnNob3dQbGFjZWhvbGRlcighdGhpcy52YWx1ZSk7XG4gICAgfTtcblxuICAgIHB1YmxpYyByZW5kZXIoKTogUmVhY3QuUmVhY3ROb2RlIHtcbiAgICAgICAgY29uc3QgeyBjbGFzc05hbWUsIGVkaXRhYmxlLCBpbml0aWFsVmFsdWUsIGxhYmVsLCBsYWJlbENsYXNzTmFtZSB9ID0gdGhpcy5wcm9wcztcbiAgICAgICAgbGV0IGVkaXRhYmxlRWw7XG5cbiAgICAgICAgaWYgKCFlZGl0YWJsZSB8fCAodGhpcy5zdGF0ZS5waGFzZSA9PT0gUGhhc2VzLkRpc3BsYXkgJiYgKGxhYmVsIHx8IGxhYmVsQ2xhc3NOYW1lKSAmJiAhdGhpcy52YWx1ZSkpIHtcbiAgICAgICAgICAgIC8vIHNob3cgdGhlIGxhYmVsXG4gICAgICAgICAgICBlZGl0YWJsZUVsID0gKFxuICAgICAgICAgICAgICAgIDxkaXYgY2xhc3NOYW1lPXtjbGFzc05hbWUgKyBcIiBcIiArIGxhYmVsQ2xhc3NOYW1lfSBvbkNsaWNrPXt0aGlzLm9uQ2xpY2tEaXZ9PlxuICAgICAgICAgICAgICAgICAgICB7bGFiZWwgfHwgaW5pdGlhbFZhbHVlfVxuICAgICAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgICAgKTtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIC8vIHNob3cgdGhlIGNvbnRlbnQgZWRpdGFibGUgZGl2LCBidXQgbWFudWFsbHkgbWFuYWdlIGl0cyBjb250ZW50cyBhcyByZWFjdCBhbmQgY29udGVudEVkaXRhYmxlIGRvbid0IHBsYXkgbmljZSB0b2dldGhlclxuICAgICAgICAgICAgZWRpdGFibGVFbCA9IChcbiAgICAgICAgICAgICAgICA8ZGl2XG4gICAgICAgICAgICAgICAgICAgIHJlZj17dGhpcy5lZGl0YWJsZURpdn1cbiAgICAgICAgICAgICAgICAgICAgY29udGVudEVkaXRhYmxlPXt0cnVlfVxuICAgICAgICAgICAgICAgICAgICBjbGFzc05hbWU9e2NsYXNzTmFtZX1cbiAgICAgICAgICAgICAgICAgICAgb25LZXlEb3duPXt0aGlzLm9uS2V5RG93bn1cbiAgICAgICAgICAgICAgICAgICAgb25LZXlVcD17dGhpcy5vbktleVVwfVxuICAgICAgICAgICAgICAgICAgICBvbkZvY3VzPXt0aGlzLm9uRm9jdXN9XG4gICAgICAgICAgICAgICAgICAgIG9uQmx1cj17dGhpcy5vbkJsdXJ9XG4gICAgICAgICAgICAgICAgLz5cbiAgICAgICAgICAgICk7XG4gICAgICAgIH1cblxuICAgICAgICByZXR1cm4gZWRpdGFibGVFbDtcbiAgICB9XG59XG4iXSwibWFwcGluZ3MiOiI7Ozs7Ozs7O0FBUUEsSUFBQUEsTUFBQSxHQUFBQyx1QkFBQSxDQUFBQyxPQUFBO0FBRUEsSUFBQUMsa0JBQUEsR0FBQUQsT0FBQTtBQUNBLElBQUFFLG1CQUFBLEdBQUFGLE9BQUE7QUFBb0UsU0FBQUcseUJBQUFDLENBQUEsNkJBQUFDLE9BQUEsbUJBQUFDLENBQUEsT0FBQUQsT0FBQSxJQUFBRSxDQUFBLE9BQUFGLE9BQUEsWUFBQUYsd0JBQUEsWUFBQUEsQ0FBQUMsQ0FBQSxXQUFBQSxDQUFBLEdBQUFHLENBQUEsR0FBQUQsQ0FBQSxLQUFBRixDQUFBO0FBQUEsU0FBQUwsd0JBQUFLLENBQUEsRUFBQUUsQ0FBQSxTQUFBQSxDQUFBLElBQUFGLENBQUEsSUFBQUEsQ0FBQSxDQUFBSSxVQUFBLFNBQUFKLENBQUEsZUFBQUEsQ0FBQSx1QkFBQUEsQ0FBQSx5QkFBQUEsQ0FBQSxXQUFBSyxPQUFBLEVBQUFMLENBQUEsUUFBQUcsQ0FBQSxHQUFBSix3QkFBQSxDQUFBRyxDQUFBLE9BQUFDLENBQUEsSUFBQUEsQ0FBQSxDQUFBRyxHQUFBLENBQUFOLENBQUEsVUFBQUcsQ0FBQSxDQUFBSSxHQUFBLENBQUFQLENBQUEsT0FBQVEsQ0FBQSxLQUFBQyxTQUFBLFVBQUFDLENBQUEsR0FBQUMsTUFBQSxDQUFBQyxjQUFBLElBQUFELE1BQUEsQ0FBQUUsd0JBQUEsV0FBQUMsQ0FBQSxJQUFBZCxDQUFBLG9CQUFBYyxDQUFBLE9BQUFDLGNBQUEsQ0FBQUMsSUFBQSxDQUFBaEIsQ0FBQSxFQUFBYyxDQUFBLFNBQUFHLENBQUEsR0FBQVAsQ0FBQSxHQUFBQyxNQUFBLENBQUFFLHdCQUFBLENBQUFiLENBQUEsRUFBQWMsQ0FBQSxVQUFBRyxDQUFBLEtBQUFBLENBQUEsQ0FBQVYsR0FBQSxJQUFBVSxDQUFBLENBQUFDLEdBQUEsSUFBQVAsTUFBQSxDQUFBQyxjQUFBLENBQUFKLENBQUEsRUFBQU0sQ0FBQSxFQUFBRyxDQUFBLElBQUFULENBQUEsQ0FBQU0sQ0FBQSxJQUFBZCxDQUFBLENBQUFjLENBQUEsWUFBQU4sQ0FBQSxDQUFBSCxPQUFBLEdBQUFMLENBQUEsRUFBQUcsQ0FBQSxJQUFBQSxDQUFBLENBQUFlLEdBQUEsQ0FBQWxCLENBQUEsRUFBQVEsQ0FBQSxHQUFBQSxDQUFBO0FBWHBFO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBTkEsSUFhS1csTUFBTSwwQkFBTkEsTUFBTTtFQUFOQSxNQUFNO0VBQU5BLE1BQU07RUFBQSxPQUFOQSxNQUFNO0FBQUEsRUFBTkEsTUFBTTtBQXdCSSxNQUFNQyxZQUFZLFNBQVNDLGNBQUssQ0FBQ0MsU0FBUyxDQUFpQjtFQWtCL0RDLFdBQVdBLENBQUNDLEtBQWEsRUFBRTtJQUM5QixLQUFLLENBQUNBLEtBQUssQ0FBQztJQWxCaEI7SUFDQTtJQUFBLElBQUFDLGdCQUFBLENBQUFwQixPQUFBLGlCQUNlLEVBQUU7SUFBQSxJQUFBb0IsZ0JBQUEsQ0FBQXBCLE9BQUEsdUJBQ0ssS0FBSztJQUFBLElBQUFvQixnQkFBQSxDQUFBcEIsT0FBQSxvQ0FDTCxJQUFBcUIsZ0JBQVMsRUFBaUIsQ0FBQztJQUFBLElBQUFELGdCQUFBLENBQUFwQixPQUFBLDJCQXFDdEJzQixJQUFhLElBQVc7TUFDL0MsSUFBSSxDQUFDLElBQUksQ0FBQ0MsV0FBVyxDQUFDQyxPQUFPLEVBQUU7TUFDL0IsSUFBSUYsSUFBSSxFQUFFO1FBQ04sSUFBSSxDQUFDQyxXQUFXLENBQUNDLE9BQU8sQ0FBQ0MsV0FBVyxHQUFHLElBQUksQ0FBQ04sS0FBSyxDQUFDTyxXQUFXO1FBQzdELElBQUksQ0FBQ0gsV0FBVyxDQUFDQyxPQUFPLENBQUNHLFlBQVksQ0FDakMsT0FBTyxFQUNQLElBQUksQ0FBQ1IsS0FBSyxDQUFDUyxTQUFTLEdBQUcsR0FBRyxHQUFHLElBQUksQ0FBQ1QsS0FBSyxDQUFDVSxvQkFDNUMsQ0FBQztRQUNELElBQUksQ0FBQ0gsV0FBVyxHQUFHLElBQUk7UUFDdkIsSUFBSSxDQUFDSSxLQUFLLEdBQUcsRUFBRTtNQUNuQixDQUFDLE1BQU07UUFDSCxJQUFJLENBQUNQLFdBQVcsQ0FBQ0MsT0FBTyxDQUFDQyxXQUFXLEdBQUcsSUFBSSxDQUFDSyxLQUFLO1FBQ2pELElBQUksQ0FBQ1AsV0FBVyxDQUFDQyxPQUFPLENBQUNHLFlBQVksQ0FBQyxPQUFPLEVBQUUsSUFBSSxDQUFDUixLQUFLLENBQUNTLFNBQVMsQ0FBQztRQUNwRSxJQUFJLENBQUNGLFdBQVcsR0FBRyxLQUFLO01BQzVCO0lBQ0osQ0FBQztJQUFBLElBQUFOLGdCQUFBLENBQUFwQixPQUFBLHNCQUVvQixNQUFZO01BQzdCLElBQUksQ0FBQytCLFFBQVEsQ0FBQztRQUNWQyxLQUFLLEVBQUVsQixNQUFNLENBQUNtQjtNQUNsQixDQUFDLENBQUM7TUFDRixJQUFJLENBQUNILEtBQUssR0FBRyxJQUFJLENBQUNYLEtBQUssQ0FBQ2UsWUFBWTtNQUNwQyxJQUFJLENBQUNDLGVBQWUsQ0FBQyxDQUFDLElBQUksQ0FBQ0wsS0FBSyxDQUFDO01BQ2pDLElBQUksQ0FBQ00sY0FBYyxDQUFDLEtBQUssQ0FBQztNQUMxQixJQUFJLENBQUNiLFdBQVcsQ0FBQ0MsT0FBTyxFQUFFYSxJQUFJLENBQUMsQ0FBQztJQUNwQyxDQUFDO0lBQUEsSUFBQWpCLGdCQUFBLENBQUFwQixPQUFBLDBCQUV5QnNDLFlBQXFCLElBQVc7TUFDdEQsSUFBSSxDQUFDbkIsS0FBSyxDQUFDaUIsY0FBYyxHQUFHLElBQUksQ0FBQ04sS0FBSyxFQUFFUSxZQUFZLENBQUM7SUFDekQsQ0FBQztJQUFBLElBQUFsQixnQkFBQSxDQUFBcEIsT0FBQSxxQkFFb0J1QyxFQUF1QyxJQUFXO01BQ25FLElBQUksSUFBSSxDQUFDYixXQUFXLEVBQUU7UUFDbEIsSUFBSSxDQUFDUyxlQUFlLENBQUMsS0FBSyxDQUFDO01BQy9CO01BRUEsTUFBTUssTUFBTSxHQUFHLElBQUFDLHlDQUFxQixFQUFDLENBQUMsQ0FBQ0Msc0JBQXNCLENBQUNILEVBQUUsQ0FBQztNQUNqRSxRQUFRQyxNQUFNO1FBQ1YsS0FBS0csbUNBQWdCLENBQUNDLEtBQUs7VUFDdkJMLEVBQUUsQ0FBQ00sZUFBZSxDQUFDLENBQUM7VUFDcEJOLEVBQUUsQ0FBQ08sY0FBYyxDQUFDLENBQUM7VUFDbkI7TUFDUjtJQUNKLENBQUM7SUFBQSxJQUFBMUIsZ0JBQUEsQ0FBQXBCLE9BQUEsbUJBRWtCdUMsRUFBdUMsSUFBVztNQUNqRSxJQUFJLENBQUVBLEVBQUUsQ0FBQ1EsTUFBTSxDQUFvQnRCLFdBQVcsRUFBRTtRQUM1QyxJQUFJLENBQUNVLGVBQWUsQ0FBQyxJQUFJLENBQUM7TUFDOUIsQ0FBQyxNQUFNLElBQUksQ0FBQyxJQUFJLENBQUNULFdBQVcsRUFBRTtRQUMxQixJQUFJLENBQUNJLEtBQUssR0FBSVMsRUFBRSxDQUFDUSxNQUFNLENBQW9CdEIsV0FBVyxJQUFJLEVBQUU7TUFDaEU7TUFFQSxNQUFNZSxNQUFNLEdBQUcsSUFBQUMseUNBQXFCLEVBQUMsQ0FBQyxDQUFDQyxzQkFBc0IsQ0FBQ0gsRUFBRSxDQUFDO01BQ2pFLFFBQVFDLE1BQU07UUFDVixLQUFLRyxtQ0FBZ0IsQ0FBQ0ssTUFBTTtVQUN4QixJQUFJLENBQUNDLFVBQVUsQ0FBQyxDQUFDO1VBQ2pCO1FBQ0osS0FBS04sbUNBQWdCLENBQUNDLEtBQUs7VUFDdkIsSUFBSSxDQUFDTSxRQUFRLENBQUNYLEVBQUUsQ0FBQztVQUNqQjtNQUNSO0lBQ0osQ0FBQztJQUFBLElBQUFuQixnQkFBQSxDQUFBcEIsT0FBQSxzQkFFb0IsTUFBWTtNQUM3QixJQUFJLENBQUMsSUFBSSxDQUFDbUIsS0FBSyxDQUFDZ0MsUUFBUSxFQUFFO01BRTFCLElBQUksQ0FBQ3BCLFFBQVEsQ0FBQztRQUNWQyxLQUFLLEVBQUVsQixNQUFNLENBQUNzQztNQUNsQixDQUFDLENBQUM7SUFDTixDQUFDO0lBQUEsSUFBQWhDLGdCQUFBLENBQUFwQixPQUFBLG1CQUVrQnVDLEVBQW9DLElBQVc7TUFDOUQsTUFBTWMsSUFBSSxHQUFHZCxFQUFFLENBQUNRLE1BQU0sQ0FBQ08sVUFBVSxDQUFDLENBQUMsQ0FBQztNQUNwQyxJQUFJRCxJQUFJLEVBQUU7UUFDTixNQUFNRSxLQUFLLEdBQUdDLFFBQVEsQ0FBQ0MsV0FBVyxDQUFDLENBQUM7UUFDcENGLEtBQUssQ0FBQ0csUUFBUSxDQUFDTCxJQUFJLEVBQUUsQ0FBQyxDQUFDO1FBQ3ZCRSxLQUFLLENBQUNJLE1BQU0sQ0FBQ04sSUFBSSxFQUFFZCxFQUFFLENBQUNRLE1BQU0sQ0FBQ08sVUFBVSxDQUFDTSxNQUFNLENBQUM7UUFFL0MsTUFBTUMsR0FBRyxHQUFHQyxNQUFNLENBQUNDLFlBQVksQ0FBQyxDQUFFO1FBQ2xDRixHQUFHLENBQUNHLGVBQWUsQ0FBQyxDQUFDO1FBQ3JCSCxHQUFHLENBQUNJLFFBQVEsQ0FBQ1YsS0FBSyxDQUFDO01BQ3ZCO0lBQ0osQ0FBQztJQUFBLElBQUFuQyxnQkFBQSxDQUFBcEIsT0FBQSxvQkFFa0IsQ0FDZnVDLEVBQTBFLEVBQzFFRCxZQUFZLEdBQUcsS0FBSyxLQUNiO01BQ1A7TUFDQSxNQUFNNEIsSUFBSSxHQUFHLElBQUk7TUFDakIsTUFBTTFCLE1BQU0sR0FBRyxJQUFBQyx5Q0FBcUIsRUFBQyxDQUFDLENBQUNDLHNCQUFzQixDQUFDSCxFQUF5QixDQUFDO01BQ3hGLE1BQU00QixNQUFNLEdBQUczQixNQUFNLEtBQUtHLG1DQUFnQixDQUFDQyxLQUFLLElBQUlOLFlBQVk7TUFDaEUsSUFBSSxDQUFDUCxRQUFRLENBQ1Q7UUFDSUMsS0FBSyxFQUFFbEIsTUFBTSxDQUFDbUI7TUFDbEIsQ0FBQyxFQUNELE1BQU07UUFDRixJQUFJLElBQUksQ0FBQ0gsS0FBSyxLQUFLLElBQUksQ0FBQ1gsS0FBSyxDQUFDZSxZQUFZLEVBQUU7VUFDeENnQyxJQUFJLENBQUM5QixjQUFjLENBQUMrQixNQUFNLENBQUM7UUFDL0I7TUFDSixDQUNKLENBQUM7SUFDTCxDQUFDO0lBQUEsSUFBQS9DLGdCQUFBLENBQUFwQixPQUFBLGtCQUVpQnVDLEVBQW9DLElBQVc7TUFDN0QsTUFBTXNCLEdBQUcsR0FBR0MsTUFBTSxDQUFDQyxZQUFZLENBQUMsQ0FBRTtNQUNsQ0YsR0FBRyxDQUFDRyxlQUFlLENBQUMsQ0FBQztNQUVyQixJQUFJLElBQUksQ0FBQzdDLEtBQUssQ0FBQ2lELFlBQVksRUFBRTtRQUN6QixJQUFJLENBQUNuQixVQUFVLENBQUMsQ0FBQztNQUNyQixDQUFDLE1BQU07UUFDSCxJQUFJLENBQUNDLFFBQVEsQ0FBQ1gsRUFBRSxFQUFFLElBQUksQ0FBQ3BCLEtBQUssQ0FBQ2tELFlBQVksQ0FBQztNQUM5QztNQUVBLElBQUksQ0FBQ2xDLGVBQWUsQ0FBQyxDQUFDLElBQUksQ0FBQ0wsS0FBSyxDQUFDO0lBQ3JDLENBQUM7SUF4SUcsSUFBSSxDQUFDd0MsS0FBSyxHQUFHO01BQ1R0QyxLQUFLLEVBQUVsQixNQUFNLENBQUNtQjtJQUNsQixDQUFDO0VBQ0w7RUFFT3NDLGtCQUFrQkEsQ0FBQ0MsU0FBMkIsRUFBUTtJQUN6RCxJQUFJQSxTQUFTLENBQUN0QyxZQUFZLEtBQUssSUFBSSxDQUFDZixLQUFLLENBQUNlLFlBQVksRUFBRTtNQUNwRCxJQUFJLENBQUNKLEtBQUssR0FBRyxJQUFJLENBQUNYLEtBQUssQ0FBQ2UsWUFBWTtNQUNwQyxJQUFJLElBQUksQ0FBQ1gsV0FBVyxDQUFDQyxPQUFPLEVBQUU7UUFDMUIsSUFBSSxDQUFDVyxlQUFlLENBQUMsQ0FBQyxJQUFJLENBQUNMLEtBQUssQ0FBQztNQUNyQztJQUNKO0VBQ0o7RUFFTzJDLGlCQUFpQkEsQ0FBQSxFQUFTO0lBQzdCLElBQUksQ0FBQzNDLEtBQUssR0FBRyxJQUFJLENBQUNYLEtBQUssQ0FBQ2UsWUFBWTtJQUNwQyxJQUFJLElBQUksQ0FBQ1gsV0FBVyxDQUFDQyxPQUFPLEVBQUU7TUFDMUIsSUFBSSxDQUFDVyxlQUFlLENBQUMsQ0FBQyxJQUFJLENBQUNMLEtBQUssQ0FBQztJQUNyQztFQUNKO0VBdUhPNEMsTUFBTUEsQ0FBQSxFQUFvQjtJQUM3QixNQUFNO01BQUU5QyxTQUFTO01BQUV1QixRQUFRO01BQUVqQixZQUFZO01BQUV5QyxLQUFLO01BQUVDO0lBQWUsQ0FBQyxHQUFHLElBQUksQ0FBQ3pELEtBQUs7SUFDL0UsSUFBSTBELFVBQVU7SUFFZCxJQUFJLENBQUMxQixRQUFRLElBQUssSUFBSSxDQUFDbUIsS0FBSyxDQUFDdEMsS0FBSyxLQUFLbEIsTUFBTSxDQUFDbUIsT0FBTyxLQUFLMEMsS0FBSyxJQUFJQyxjQUFjLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQzlDLEtBQU0sRUFBRTtNQUNoRztNQUNBK0MsVUFBVSxnQkFDTnhGLE1BQUEsQ0FBQVcsT0FBQSxDQUFBOEUsYUFBQTtRQUFLbEQsU0FBUyxFQUFFQSxTQUFTLEdBQUcsR0FBRyxHQUFHZ0QsY0FBZTtRQUFDRyxPQUFPLEVBQUUsSUFBSSxDQUFDQztNQUFXLEdBQ3RFTCxLQUFLLElBQUl6QyxZQUNULENBQ1I7SUFDTCxDQUFDLE1BQU07TUFDSDtNQUNBMkMsVUFBVSxnQkFDTnhGLE1BQUEsQ0FBQVcsT0FBQSxDQUFBOEUsYUFBQTtRQUNJRyxHQUFHLEVBQUUsSUFBSSxDQUFDMUQsV0FBWTtRQUN0QjJELGVBQWUsRUFBRSxJQUFLO1FBQ3RCdEQsU0FBUyxFQUFFQSxTQUFVO1FBQ3JCdUQsU0FBUyxFQUFFLElBQUksQ0FBQ0EsU0FBVTtRQUMxQkMsT0FBTyxFQUFFLElBQUksQ0FBQ0EsT0FBUTtRQUN0QkMsT0FBTyxFQUFFLElBQUksQ0FBQ0EsT0FBUTtRQUN0QkMsTUFBTSxFQUFFLElBQUksQ0FBQ0E7TUFBTyxDQUN2QixDQUNKO0lBQ0w7SUFFQSxPQUFPVCxVQUFVO0VBQ3JCO0FBQ0o7QUFBQ1UsT0FBQSxDQUFBdkYsT0FBQSxHQUFBZSxZQUFBO0FBQUEsSUFBQUssZ0JBQUEsQ0FBQXBCLE9BQUEsRUEzTG9CZSxZQUFZLGtCQU9pQjtFQUMxQ3FCLGNBQWNBLENBQUEsRUFBRyxDQUFDLENBQUM7RUFDbkJGLFlBQVksRUFBRSxFQUFFO0VBQ2hCeUMsS0FBSyxFQUFFLEVBQUU7RUFDVGpELFdBQVcsRUFBRSxFQUFFO0VBQ2Z5QixRQUFRLEVBQUUsSUFBSTtFQUNkdkIsU0FBUyxFQUFFLGlCQUFpQjtFQUM1QkMsb0JBQW9CLEVBQUUsNkJBQTZCO0VBQ25Ed0MsWUFBWSxFQUFFO0FBQ2xCLENBQUMiLCJpZ25vcmVMaXN0IjpbXX0=