matrix-react-sdk
Version:
SDK for matrix.org using React
173 lines (169 loc) • 26.6 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 = _interopRequireDefault(require("react"));
var Roles = _interopRequireWildcard(require("../../../Roles"));
var _languageHandler = require("../../../languageHandler");
var _Field = _interopRequireDefault(require("./Field"));
var _KeyboardShortcuts = require("../../../accessibility/KeyboardShortcuts");
var _KeyBindingsManager = require("../../../KeyBindingsManager");
var _objects = require("../../../utils/objects");
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 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.
*/
const CUSTOM_VALUE = "SELECT_VALUE_CUSTOM";
class PowerSelector extends _react.default.Component {
constructor(props) {
super(props);
(0, _defineProperty2.default)(this, "unmounted", false);
(0, _defineProperty2.default)(this, "onSelectChange", async event => {
const isCustom = event.target.value === CUSTOM_VALUE;
if (isCustom) {
this.setState({
custom: true
});
} else {
const powerLevel = parseInt(event.target.value);
this.setState({
selectValue: powerLevel
});
try {
await this.props.onChange(powerLevel, this.props.powerLevelKey);
} catch {
if (this.unmounted) return;
// If the request failed, roll back the state of the selector.
this.initStateFromProps();
}
}
});
(0, _defineProperty2.default)(this, "onCustomChange", event => {
this.setState({
customValue: parseInt(event.target.value)
});
});
(0, _defineProperty2.default)(this, "onCustomBlur", async event => {
event.preventDefault();
event.stopPropagation();
if (Number.isFinite(this.state.customValue)) {
try {
await this.props.onChange(this.state.customValue, this.props.powerLevelKey);
} catch {
if (this.unmounted) return;
// If the request failed, roll back the state of the selector.
this.initStateFromProps();
}
} else {
this.initStateFromProps(); // reset, invalid input
}
});
(0, _defineProperty2.default)(this, "onCustomKeyDown", event => {
const action = (0, _KeyBindingsManager.getKeyBindingsManager)().getAccessibilityAction(event);
switch (action) {
case _KeyboardShortcuts.KeyBindingAction.Enter:
event.preventDefault();
event.stopPropagation();
// Do not call the onChange handler directly here - it can cause an infinite loop.
// Long story short, a user hits Enter to submit the value which onChange handles as
// raising a dialog which causes a blur which causes a dialog which causes a blur and
// so on. By not causing the onChange to be called here, we avoid the loop because we
// handle the onBlur safely.
event.target.blur();
break;
}
});
this.state = {
levelRoleMap: {},
// List of power levels to show in the drop-down
options: [],
customValue: this.props.value,
selectValue: 0
};
}
componentDidMount() {
this.initStateFromProps();
}
componentDidUpdate(prevProps) {
if ((0, _objects.objectHasDiff)(this.props, prevProps)) {
this.initStateFromProps();
}
}
componentWillUnmount() {
this.unmounted = true;
}
initStateFromProps() {
// This needs to be done now because levelRoleMap has translated strings
const levelRoleMap = Roles.levelRoleMap(this.props.usersDefault);
const options = Object.keys(levelRoleMap).filter(level => {
return level === undefined || parseInt(level) <= this.props.maxValue || parseInt(level) == this.props.value;
}).map(level => parseInt(level));
const isCustom = levelRoleMap[this.props.value] === undefined;
this.setState({
levelRoleMap,
options,
custom: isCustom,
customValue: this.props.value,
selectValue: isCustom ? CUSTOM_VALUE : this.props.value
});
}
render() {
let picker;
const label = typeof this.props.label === "undefined" ? (0, _languageHandler._t)("power_level|label") : this.props.label;
if (this.state.custom) {
picker = /*#__PURE__*/_react.default.createElement(_Field.default, {
type: "number",
label: label,
max: this.props.maxValue,
onBlur: this.onCustomBlur,
onKeyDown: this.onCustomKeyDown,
onChange: this.onCustomChange,
value: String(this.state.customValue),
disabled: this.props.disabled
});
} else {
// Each level must have a definition in this.state.levelRoleMap
const options = this.state.options.map(level => {
return {
value: String(level),
text: Roles.textualPowerLevel(level, this.props.usersDefault)
};
});
options.push({
value: CUSTOM_VALUE,
text: (0, _languageHandler._t)("power_level|custom_level")
});
const optionsElements = options.map(op => {
return /*#__PURE__*/_react.default.createElement("option", {
value: op.value,
key: op.value,
"data-testid": `power-level-option-${op.value}`
}, op.text);
});
picker = /*#__PURE__*/_react.default.createElement(_Field.default, {
element: "select",
label: label,
onChange: this.onSelectChange,
value: String(this.state.selectValue),
disabled: this.props.disabled,
"data-testid": "power-level-select-element"
}, optionsElements);
}
return /*#__PURE__*/_react.default.createElement("div", {
className: "mx_PowerSelector"
}, picker);
}
}
exports.default = PowerSelector;
(0, _defineProperty2.default)(PowerSelector, "defaultProps", {
maxValue: Infinity,
usersDefault: 0
});
//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJuYW1lcyI6WyJfcmVhY3QiLCJfaW50ZXJvcFJlcXVpcmVEZWZhdWx0IiwicmVxdWlyZSIsIlJvbGVzIiwiX2ludGVyb3BSZXF1aXJlV2lsZGNhcmQiLCJfbGFuZ3VhZ2VIYW5kbGVyIiwiX0ZpZWxkIiwiX0tleWJvYXJkU2hvcnRjdXRzIiwiX0tleUJpbmRpbmdzTWFuYWdlciIsIl9vYmplY3RzIiwiX2dldFJlcXVpcmVXaWxkY2FyZENhY2hlIiwiZSIsIldlYWtNYXAiLCJyIiwidCIsIl9fZXNNb2R1bGUiLCJkZWZhdWx0IiwiaGFzIiwiZ2V0IiwibiIsIl9fcHJvdG9fXyIsImEiLCJPYmplY3QiLCJkZWZpbmVQcm9wZXJ0eSIsImdldE93blByb3BlcnR5RGVzY3JpcHRvciIsInUiLCJoYXNPd25Qcm9wZXJ0eSIsImNhbGwiLCJpIiwic2V0IiwiQ1VTVE9NX1ZBTFVFIiwiUG93ZXJTZWxlY3RvciIsIlJlYWN0IiwiQ29tcG9uZW50IiwiY29uc3RydWN0b3IiLCJwcm9wcyIsIl9kZWZpbmVQcm9wZXJ0eTIiLCJldmVudCIsImlzQ3VzdG9tIiwidGFyZ2V0IiwidmFsdWUiLCJzZXRTdGF0ZSIsImN1c3RvbSIsInBvd2VyTGV2ZWwiLCJwYXJzZUludCIsInNlbGVjdFZhbHVlIiwib25DaGFuZ2UiLCJwb3dlckxldmVsS2V5IiwidW5tb3VudGVkIiwiaW5pdFN0YXRlRnJvbVByb3BzIiwiY3VzdG9tVmFsdWUiLCJwcmV2ZW50RGVmYXVsdCIsInN0b3BQcm9wYWdhdGlvbiIsIk51bWJlciIsImlzRmluaXRlIiwic3RhdGUiLCJhY3Rpb24iLCJnZXRLZXlCaW5kaW5nc01hbmFnZXIiLCJnZXRBY2Nlc3NpYmlsaXR5QWN0aW9uIiwiS2V5QmluZGluZ0FjdGlvbiIsIkVudGVyIiwiYmx1ciIsImxldmVsUm9sZU1hcCIsIm9wdGlvbnMiLCJjb21wb25lbnREaWRNb3VudCIsImNvbXBvbmVudERpZFVwZGF0ZSIsInByZXZQcm9wcyIsIm9iamVjdEhhc0RpZmYiLCJjb21wb25lbnRXaWxsVW5tb3VudCIsInVzZXJzRGVmYXVsdCIsImtleXMiLCJmaWx0ZXIiLCJsZXZlbCIsInVuZGVmaW5lZCIsIm1heFZhbHVlIiwibWFwIiwicmVuZGVyIiwicGlja2VyIiwibGFiZWwiLCJfdCIsImNyZWF0ZUVsZW1lbnQiLCJ0eXBlIiwibWF4Iiwib25CbHVyIiwib25DdXN0b21CbHVyIiwib25LZXlEb3duIiwib25DdXN0b21LZXlEb3duIiwib25DdXN0b21DaGFuZ2UiLCJTdHJpbmciLCJkaXNhYmxlZCIsInRleHQiLCJ0ZXh0dWFsUG93ZXJMZXZlbCIsInB1c2giLCJvcHRpb25zRWxlbWVudHMiLCJvcCIsImtleSIsImVsZW1lbnQiLCJvblNlbGVjdENoYW5nZSIsImNsYXNzTmFtZSIsImV4cG9ydHMiLCJJbmZpbml0eSJdLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uL3NyYy9jb21wb25lbnRzL3ZpZXdzL2VsZW1lbnRzL1Bvd2VyU2VsZWN0b3IudHN4Il0sInNvdXJjZXNDb250ZW50IjpbIi8qXG5Db3B5cmlnaHQgMjAyNCBOZXcgVmVjdG9yIEx0ZC5cbkNvcHlyaWdodCAyMDE1LCAyMDE2IE9wZW5NYXJrZXQgTHRkXG5cblNQRFgtTGljZW5zZS1JZGVudGlmaWVyOiBBR1BMLTMuMC1vbmx5IE9SIEdQTC0zLjAtb25seVxuUGxlYXNlIHNlZSBMSUNFTlNFIGZpbGVzIGluIHRoZSByZXBvc2l0b3J5IHJvb3QgZm9yIGZ1bGwgZGV0YWlscy5cbiovXG5cbmltcG9ydCBSZWFjdCBmcm9tIFwicmVhY3RcIjtcblxuaW1wb3J0ICogYXMgUm9sZXMgZnJvbSBcIi4uLy4uLy4uL1JvbGVzXCI7XG5pbXBvcnQgeyBfdCB9IGZyb20gXCIuLi8uLi8uLi9sYW5ndWFnZUhhbmRsZXJcIjtcbmltcG9ydCBGaWVsZCBmcm9tIFwiLi9GaWVsZFwiO1xuaW1wb3J0IHsgS2V5QmluZGluZ0FjdGlvbiB9IGZyb20gXCIuLi8uLi8uLi9hY2Nlc3NpYmlsaXR5L0tleWJvYXJkU2hvcnRjdXRzXCI7XG5pbXBvcnQgeyBnZXRLZXlCaW5kaW5nc01hbmFnZXIgfSBmcm9tIFwiLi4vLi4vLi4vS2V5QmluZGluZ3NNYW5hZ2VyXCI7XG5pbXBvcnQgeyBvYmplY3RIYXNEaWZmIH0gZnJvbSBcIi4uLy4uLy4uL3V0aWxzL29iamVjdHNcIjtcblxuY29uc3QgQ1VTVE9NX1ZBTFVFID0gXCJTRUxFQ1RfVkFMVUVfQ1VTVE9NXCI7XG5cbmludGVyZmFjZSBQcm9wczxLIGV4dGVuZHMgdW5kZWZpbmVkIHwgc3RyaW5nPiB7XG4gICAgdmFsdWU6IG51bWJlcjtcbiAgICAvLyBUaGUgbWF4aW11bSB2YWx1ZSB0aGF0IGNhbiBiZSBzZXQgd2l0aCB0aGUgcG93ZXIgc2VsZWN0b3JcbiAgICBtYXhWYWx1ZTogbnVtYmVyO1xuXG4gICAgLy8gRGVmYXVsdCB1c2VyIHBvd2VyIGxldmVsIGZvciB0aGUgcm9vbVxuICAgIHVzZXJzRGVmYXVsdDogbnVtYmVyO1xuXG4gICAgLy8gc2hvdWxkIHRoZSB1c2VyIGJlIGFibGUgdG8gY2hhbmdlIHRoZSB2YWx1ZT8gZmFsc2UgYnkgZGVmYXVsdC5cbiAgICBkaXNhYmxlZD86IGJvb2xlYW47XG5cbiAgICAvLyBUaGUgbmFtZSB0byBhbm5vdGF0ZSB0aGUgc2VsZWN0b3Igd2l0aFxuICAgIGxhYmVsPzogc3RyaW5nO1xuXG4gICAgb25DaGFuZ2UodmFsdWU6IG51bWJlciwgcG93ZXJMZXZlbEtleTogSyBleHRlbmRzIHVuZGVmaW5lZCA/IHZvaWQgOiBLKTogdm9pZCB8IFByb21pc2U8dm9pZD47XG5cbiAgICAvLyBPcHRpb25hbCBrZXkgdG8gcGFzcyBhcyB0aGUgc2Vjb25kIGFyZ3VtZW50IHRvIGBvbkNoYW5nZWBcbiAgICBwb3dlckxldmVsS2V5OiBLIGV4dGVuZHMgdW5kZWZpbmVkID8gdm9pZCA6IEs7XG59XG5cbmludGVyZmFjZSBJU3RhdGUge1xuICAgIGxldmVsUm9sZU1hcDogUGFydGlhbDxSZWNvcmQ8bnVtYmVyIHwgXCJ1bmRlZmluZWRcIiwgc3RyaW5nPj47XG4gICAgLy8gTGlzdCBvZiBwb3dlciBsZXZlbHMgdG8gc2hvdyBpbiB0aGUgZHJvcC1kb3duXG4gICAgb3B0aW9uczogbnVtYmVyW107XG5cbiAgICBjdXN0b21WYWx1ZTogbnVtYmVyO1xuICAgIHNlbGVjdFZhbHVlOiBudW1iZXIgfCBzdHJpbmc7XG4gICAgY3VzdG9tPzogYm9vbGVhbjtcbn1cblxuZXhwb3J0IGRlZmF1bHQgY2xhc3MgUG93ZXJTZWxlY3RvcjxLIGV4dGVuZHMgdW5kZWZpbmVkIHwgc3RyaW5nPiBleHRlbmRzIFJlYWN0LkNvbXBvbmVudDxQcm9wczxLPiwgSVN0YXRlPiB7XG4gICAgcHVibGljIHN0YXRpYyBkZWZhdWx0UHJvcHM6IFBhcnRpYWw8UHJvcHM8YW55Pj4gPSB7XG4gICAgICAgIG1heFZhbHVlOiBJbmZpbml0eSxcbiAgICAgICAgdXNlcnNEZWZhdWx0OiAwLFxuICAgIH07XG4gICAgcHJpdmF0ZSB1bm1vdW50ZWQgPSBmYWxzZTtcblxuICAgIHB1YmxpYyBjb25zdHJ1Y3Rvcihwcm9wczogUHJvcHM8Sz4pIHtcbiAgICAgICAgc3VwZXIocHJvcHMpO1xuXG4gICAgICAgIHRoaXMuc3RhdGUgPSB7XG4gICAgICAgICAgICBsZXZlbFJvbGVNYXA6IHt9LFxuICAgICAgICAgICAgLy8gTGlzdCBvZiBwb3dlciBsZXZlbHMgdG8gc2hvdyBpbiB0aGUgZHJvcC1kb3duXG4gICAgICAgICAgICBvcHRpb25zOiBbXSxcblxuICAgICAgICAgICAgY3VzdG9tVmFsdWU6IHRoaXMucHJvcHMudmFsdWUsXG4gICAgICAgICAgICBzZWxlY3RWYWx1ZTogMCxcbiAgICAgICAgfTtcbiAgICB9XG5cbiAgICBwdWJsaWMgY29tcG9uZW50RGlkTW91bnQoKTogdm9pZCB7XG4gICAgICAgIHRoaXMuaW5pdFN0YXRlRnJvbVByb3BzKCk7XG4gICAgfVxuXG4gICAgcHVibGljIGNvbXBvbmVudERpZFVwZGF0ZShwcmV2UHJvcHM6IFJlYWRvbmx5PFByb3BzPEs+Pik6IHZvaWQge1xuICAgICAgICBpZiAob2JqZWN0SGFzRGlmZih0aGlzLnByb3BzLCBwcmV2UHJvcHMpKSB7XG4gICAgICAgICAgICB0aGlzLmluaXRTdGF0ZUZyb21Qcm9wcygpO1xuICAgICAgICB9XG4gICAgfVxuXG4gICAgcHVibGljIGNvbXBvbmVudFdpbGxVbm1vdW50KCk6IHZvaWQge1xuICAgICAgICB0aGlzLnVubW91bnRlZCA9IHRydWU7XG4gICAgfVxuXG4gICAgcHJpdmF0ZSBpbml0U3RhdGVGcm9tUHJvcHMoKTogdm9pZCB7XG4gICAgICAgIC8vIFRoaXMgbmVlZHMgdG8gYmUgZG9uZSBub3cgYmVjYXVzZSBsZXZlbFJvbGVNYXAgaGFzIHRyYW5zbGF0ZWQgc3RyaW5nc1xuICAgICAgICBjb25zdCBsZXZlbFJvbGVNYXAgPSBSb2xlcy5sZXZlbFJvbGVNYXAodGhpcy5wcm9wcy51c2Vyc0RlZmF1bHQpO1xuICAgICAgICBjb25zdCBvcHRpb25zID0gT2JqZWN0LmtleXMobGV2ZWxSb2xlTWFwKVxuICAgICAgICAgICAgLmZpbHRlcigobGV2ZWwpID0+IHtcbiAgICAgICAgICAgICAgICByZXR1cm4gKFxuICAgICAgICAgICAgICAgICAgICBsZXZlbCA9PT0gdW5kZWZpbmVkIHx8IHBhcnNlSW50KGxldmVsKSA8PSB0aGlzLnByb3BzLm1heFZhbHVlIHx8IHBhcnNlSW50KGxldmVsKSA9PSB0aGlzLnByb3BzLnZhbHVlXG4gICAgICAgICAgICAgICAgKTtcbiAgICAgICAgICAgIH0pXG4gICAgICAgICAgICAubWFwKChsZXZlbCkgPT4gcGFyc2VJbnQobGV2ZWwpKTtcblxuICAgICAgICBjb25zdCBpc0N1c3RvbSA9IGxldmVsUm9sZU1hcFt0aGlzLnByb3BzLnZhbHVlXSA9PT0gdW5kZWZpbmVkO1xuXG4gICAgICAgIHRoaXMuc2V0U3RhdGUoe1xuICAgICAgICAgICAgbGV2ZWxSb2xlTWFwLFxuICAgICAgICAgICAgb3B0aW9ucyxcbiAgICAgICAgICAgIGN1c3RvbTogaXNDdXN0b20sXG4gICAgICAgICAgICBjdXN0b21WYWx1ZTogdGhpcy5wcm9wcy52YWx1ZSxcbiAgICAgICAgICAgIHNlbGVjdFZhbHVlOiBpc0N1c3RvbSA/IENVU1RPTV9WQUxVRSA6IHRoaXMucHJvcHMudmFsdWUsXG4gICAgICAgIH0pO1xuICAgIH1cblxuICAgIHByaXZhdGUgb25TZWxlY3RDaGFuZ2UgPSBhc3luYyAoZXZlbnQ6IFJlYWN0LkNoYW5nZUV2ZW50PEhUTUxTZWxlY3RFbGVtZW50Pik6IFByb21pc2U8dm9pZD4gPT4ge1xuICAgICAgICBjb25zdCBpc0N1c3RvbSA9IGV2ZW50LnRhcmdldC52YWx1ZSA9PT0gQ1VTVE9NX1ZBTFVFO1xuICAgICAgICBpZiAoaXNDdXN0b20pIHtcbiAgICAgICAgICAgIHRoaXMuc2V0U3RhdGUoeyBjdXN0b206IHRydWUgfSk7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICBjb25zdCBwb3dlckxldmVsID0gcGFyc2VJbnQoZXZlbnQudGFyZ2V0LnZhbHVlKTtcbiAgICAgICAgICAgIHRoaXMuc2V0U3RhdGUoeyBzZWxlY3RWYWx1ZTogcG93ZXJMZXZlbCB9KTtcbiAgICAgICAgICAgIHRyeSB7XG4gICAgICAgICAgICAgICAgYXdhaXQgdGhpcy5wcm9wcy5vbkNoYW5nZShwb3dlckxldmVsLCB0aGlzLnByb3BzLnBvd2VyTGV2ZWxLZXkpO1xuICAgICAgICAgICAgfSBjYXRjaCB7XG4gICAgICAgICAgICAgICAgaWYgKHRoaXMudW5tb3VudGVkKSByZXR1cm47XG4gICAgICAgICAgICAgICAgLy8gSWYgdGhlIHJlcXVlc3QgZmFpbGVkLCByb2xsIGJhY2sgdGhlIHN0YXRlIG9mIHRoZSBzZWxlY3Rvci5cbiAgICAgICAgICAgICAgICB0aGlzLmluaXRTdGF0ZUZyb21Qcm9wcygpO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgfTtcblxuICAgIHByaXZhdGUgb25DdXN0b21DaGFuZ2UgPSAoZXZlbnQ6IFJlYWN0LkNoYW5nZUV2ZW50PEhUTUxJbnB1dEVsZW1lbnQ+KTogdm9pZCA9PiB7XG4gICAgICAgIHRoaXMuc2V0U3RhdGUoeyBjdXN0b21WYWx1ZTogcGFyc2VJbnQoZXZlbnQudGFyZ2V0LnZhbHVlKSB9KTtcbiAgICB9O1xuXG4gICAgcHJpdmF0ZSBvbkN1c3RvbUJsdXIgPSBhc3luYyAoZXZlbnQ6IFJlYWN0LkZvY3VzRXZlbnQpOiBQcm9taXNlPHZvaWQ+ID0+IHtcbiAgICAgICAgZXZlbnQucHJldmVudERlZmF1bHQoKTtcbiAgICAgICAgZXZlbnQuc3RvcFByb3BhZ2F0aW9uKCk7XG5cbiAgICAgICAgaWYgKE51bWJlci5pc0Zpbml0ZSh0aGlzLnN0YXRlLmN1c3RvbVZhbHVlKSkge1xuICAgICAgICAgICAgdHJ5IHtcbiAgICAgICAgICAgICAgICBhd2FpdCB0aGlzLnByb3BzLm9uQ2hhbmdlKHRoaXMuc3RhdGUuY3VzdG9tVmFsdWUsIHRoaXMucHJvcHMucG93ZXJMZXZlbEtleSk7XG4gICAgICAgICAgICB9IGNhdGNoIHtcbiAgICAgICAgICAgICAgICBpZiAodGhpcy51bm1vdW50ZWQpIHJldHVybjtcbiAgICAgICAgICAgICAgICAvLyBJZiB0aGUgcmVxdWVzdCBmYWlsZWQsIHJvbGwgYmFjayB0aGUgc3RhdGUgb2YgdGhlIHNlbGVjdG9yLlxuICAgICAgICAgICAgICAgIHRoaXMuaW5pdFN0YXRlRnJvbVByb3BzKCk7XG4gICAgICAgICAgICB9XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICB0aGlzLmluaXRTdGF0ZUZyb21Qcm9wcygpOyAvLyByZXNldCwgaW52YWxpZCBpbnB1dFxuICAgICAgICB9XG4gICAgfTtcblxuICAgIHByaXZhdGUgb25DdXN0b21LZXlEb3duID0gKGV2ZW50OiBSZWFjdC5LZXlib2FyZEV2ZW50PEhUTUxJbnB1dEVsZW1lbnQ+KTogdm9pZCA9PiB7XG4gICAgICAgIGNvbnN0IGFjdGlvbiA9IGdldEtleUJpbmRpbmdzTWFuYWdlcigpLmdldEFjY2Vzc2liaWxpdHlBY3Rpb24oZXZlbnQpO1xuICAgICAgICBzd2l0Y2ggKGFjdGlvbikge1xuICAgICAgICAgICAgY2FzZSBLZXlCaW5kaW5nQWN0aW9uLkVudGVyOlxuICAgICAgICAgICAgICAgIGV2ZW50LnByZXZlbnREZWZhdWx0KCk7XG4gICAgICAgICAgICAgICAgZXZlbnQuc3RvcFByb3BhZ2F0aW9uKCk7XG5cbiAgICAgICAgICAgICAgICAvLyBEbyBub3QgY2FsbCB0aGUgb25DaGFuZ2UgaGFuZGxlciBkaXJlY3RseSBoZXJlIC0gaXQgY2FuIGNhdXNlIGFuIGluZmluaXRlIGxvb3AuXG4gICAgICAgICAgICAgICAgLy8gTG9uZyBzdG9yeSBzaG9ydCwgYSB1c2VyIGhpdHMgRW50ZXIgdG8gc3VibWl0IHRoZSB2YWx1ZSB3aGljaCBvbkNoYW5nZSBoYW5kbGVzIGFzXG4gICAgICAgICAgICAgICAgLy8gcmFpc2luZyBhIGRpYWxvZyB3aGljaCBjYXVzZXMgYSBibHVyIHdoaWNoIGNhdXNlcyBhIGRpYWxvZyB3aGljaCBjYXVzZXMgYSBibHVyIGFuZFxuICAgICAgICAgICAgICAgIC8vIHNvIG9uLiBCeSBub3QgY2F1c2luZyB0aGUgb25DaGFuZ2UgdG8gYmUgY2FsbGVkIGhlcmUsIHdlIGF2b2lkIHRoZSBsb29wIGJlY2F1c2Ugd2VcbiAgICAgICAgICAgICAgICAvLyBoYW5kbGUgdGhlIG9uQmx1ciBzYWZlbHkuXG4gICAgICAgICAgICAgICAgKGV2ZW50LnRhcmdldCBhcyBIVE1MSW5wdXRFbGVtZW50KS5ibHVyKCk7XG4gICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgIH1cbiAgICB9O1xuXG4gICAgcHVibGljIHJlbmRlcigpOiBSZWFjdC5SZWFjdE5vZGUge1xuICAgICAgICBsZXQgcGlja2VyO1xuICAgICAgICBjb25zdCBsYWJlbCA9IHR5cGVvZiB0aGlzLnByb3BzLmxhYmVsID09PSBcInVuZGVmaW5lZFwiID8gX3QoXCJwb3dlcl9sZXZlbHxsYWJlbFwiKSA6IHRoaXMucHJvcHMubGFiZWw7XG4gICAgICAgIGlmICh0aGlzLnN0YXRlLmN1c3RvbSkge1xuICAgICAgICAgICAgcGlja2VyID0gKFxuICAgICAgICAgICAgICAgIDxGaWVsZFxuICAgICAgICAgICAgICAgICAgICB0eXBlPVwibnVtYmVyXCJcbiAgICAgICAgICAgICAgICAgICAgbGFiZWw9e2xhYmVsfVxuICAgICAgICAgICAgICAgICAgICBtYXg9e3RoaXMucHJvcHMubWF4VmFsdWV9XG4gICAgICAgICAgICAgICAgICAgIG9uQmx1cj17dGhpcy5vbkN1c3RvbUJsdXJ9XG4gICAgICAgICAgICAgICAgICAgIG9uS2V5RG93bj17dGhpcy5vbkN1c3RvbUtleURvd259XG4gICAgICAgICAgICAgICAgICAgIG9uQ2hhbmdlPXt0aGlzLm9uQ3VzdG9tQ2hhbmdlfVxuICAgICAgICAgICAgICAgICAgICB2YWx1ZT17U3RyaW5nKHRoaXMuc3RhdGUuY3VzdG9tVmFsdWUpfVxuICAgICAgICAgICAgICAgICAgICBkaXNhYmxlZD17dGhpcy5wcm9wcy5kaXNhYmxlZH1cbiAgICAgICAgICAgICAgICAvPlxuICAgICAgICAgICAgKTtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIC8vIEVhY2ggbGV2ZWwgbXVzdCBoYXZlIGEgZGVmaW5pdGlvbiBpbiB0aGlzLnN0YXRlLmxldmVsUm9sZU1hcFxuICAgICAgICAgICAgY29uc3Qgb3B0aW9ucyA9IHRoaXMuc3RhdGUub3B0aW9ucy5tYXAoKGxldmVsKSA9PiB7XG4gICAgICAgICAgICAgICAgcmV0dXJuIHtcbiAgICAgICAgICAgICAgICAgICAgdmFsdWU6IFN0cmluZyhsZXZlbCksXG4gICAgICAgICAgICAgICAgICAgIHRleHQ6IFJvbGVzLnRleHR1YWxQb3dlckxldmVsKGxldmVsLCB0aGlzLnByb3BzLnVzZXJzRGVmYXVsdCksXG4gICAgICAgICAgICAgICAgfTtcbiAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgb3B0aW9ucy5wdXNoKHsgdmFsdWU6IENVU1RPTV9WQUxVRSwgdGV4dDogX3QoXCJwb3dlcl9sZXZlbHxjdXN0b21fbGV2ZWxcIikgfSk7XG4gICAgICAgICAgICBjb25zdCBvcHRpb25zRWxlbWVudHMgPSBvcHRpb25zLm1hcCgob3ApID0+IHtcbiAgICAgICAgICAgICAgICByZXR1cm4gKFxuICAgICAgICAgICAgICAgICAgICA8b3B0aW9uIHZhbHVlPXtvcC52YWx1ZX0ga2V5PXtvcC52YWx1ZX0gZGF0YS10ZXN0aWQ9e2Bwb3dlci1sZXZlbC1vcHRpb24tJHtvcC52YWx1ZX1gfT5cbiAgICAgICAgICAgICAgICAgICAgICAgIHtvcC50ZXh0fVxuICAgICAgICAgICAgICAgICAgICA8L29wdGlvbj5cbiAgICAgICAgICAgICAgICApO1xuICAgICAgICAgICAgfSk7XG5cbiAgICAgICAgICAgIHBpY2tlciA9IChcbiAgICAgICAgICAgICAgICA8RmllbGRcbiAgICAgICAgICAgICAgICAgICAgZWxlbWVudD1cInNlbGVjdFwiXG4gICAgICAgICAgICAgICAgICAgIGxhYmVsPXtsYWJlbH1cbiAgICAgICAgICAgICAgICAgICAgb25DaGFuZ2U9e3RoaXMub25TZWxlY3RDaGFuZ2V9XG4gICAgICAgICAgICAgICAgICAgIHZhbHVlPXtTdHJpbmcodGhpcy5zdGF0ZS5zZWxlY3RWYWx1ZSl9XG4gICAgICAgICAgICAgICAgICAgIGRpc2FibGVkPXt0aGlzLnByb3BzLmRpc2FibGVkfVxuICAgICAgICAgICAgICAgICAgICBkYXRhLXRlc3RpZD1cInBvd2VyLWxldmVsLXNlbGVjdC1lbGVtZW50XCJcbiAgICAgICAgICAgICAgICA+XG4gICAgICAgICAgICAgICAgICAgIHtvcHRpb25zRWxlbWVudHN9XG4gICAgICAgICAgICAgICAgPC9GaWVsZD5cbiAgICAgICAgICAgICk7XG4gICAgICAgIH1cblxuICAgICAgICByZXR1cm4gPGRpdiBjbGFzc05hbWU9XCJteF9Qb3dlclNlbGVjdG9yXCI+e3BpY2tlcn08L2Rpdj47XG4gICAgfVxufVxuIl0sIm1hcHBpbmdzIjoiOzs7Ozs7OztBQVFBLElBQUFBLE1BQUEsR0FBQUMsc0JBQUEsQ0FB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