matrix-react-sdk
Version:
SDK for matrix.org using React
204 lines (166 loc) • 28.8 kB
JavaScript
"use strict";
var _interopRequireDefault = require("@babel/runtime/helpers/interopRequireDefault");
var _interopRequireWildcard = require("@babel/runtime/helpers/interopRequireWildcard");
Object.defineProperty(exports, "__esModule", {
value: true
});
exports.default = void 0;
var _defineProperty2 = _interopRequireDefault(require("@babel/runtime/helpers/defineProperty"));
var React = _interopRequireWildcard(require("react"));
var _BaseDialog = _interopRequireDefault(require("./BaseDialog"));
var _languageHandler = require("../../../languageHandler");
var _AccessibleButton = _interopRequireDefault(require("../elements/AccessibleButton"));
var _matrixWidgetApi = require("matrix-widget-api");
var _StopGapWidgetDriver = require("../../../stores/widgets/StopGapWidgetDriver");
var _MatrixClientPeg = require("../../../MatrixClientPeg");
var _OwnProfileStore = require("../../../stores/OwnProfileStore");
var _arrays = require("../../../utils/arrays");
var _StopGapWidget = require("../../../stores/widgets/StopGapWidget");
var _replaceableComponent = require("../../../utils/replaceableComponent");
var _identifiers = require("../../../identifiers");
var _SettingsStore = _interopRequireDefault(require("../../../settings/SettingsStore"));
var _dec, _class, _temp;
function ownKeys(object, enumerableOnly) { var keys = Object.keys(object); if (Object.getOwnPropertySymbols) { var symbols = Object.getOwnPropertySymbols(object); if (enumerableOnly) symbols = symbols.filter(function (sym) { return Object.getOwnPropertyDescriptor(object, sym).enumerable; }); keys.push.apply(keys, symbols); } return keys; }
function _objectSpread(target) { for (var i = 1; i < arguments.length; i++) { var source = arguments[i] != null ? arguments[i] : {}; if (i % 2) { ownKeys(Object(source), true).forEach(function (key) { (0, _defineProperty2.default)(target, key, source[key]); }); } else if (Object.getOwnPropertyDescriptors) { Object.defineProperties(target, Object.getOwnPropertyDescriptors(source)); } else { ownKeys(Object(source)).forEach(function (key) { Object.defineProperty(target, key, Object.getOwnPropertyDescriptor(source, key)); }); } } return target; }
const MAX_BUTTONS = 3;
let ModalWidgetDialog = (_dec = (0, _replaceableComponent.replaceableComponent)("views.dialogs.ModalWidgetDialog"), _dec(_class = (_temp = class ModalWidgetDialog extends React.PureComponent
/*:: <IProps, IState>*/
{
constructor(props) {
super(props);
(0, _defineProperty2.default)(this, "widget", void 0);
(0, _defineProperty2.default)(this, "possibleButtons", void 0);
(0, _defineProperty2.default)(this, "appFrame", /*#__PURE__*/React.createRef());
(0, _defineProperty2.default)(this, "state", {
disabledButtonIds: []
});
(0, _defineProperty2.default)(this, "onReady", () => {
this.state.messaging.sendWidgetConfig(this.props.widgetDefinition);
});
(0, _defineProperty2.default)(this, "onLoad", () => {
this.state.messaging.once("ready", this.onReady);
this.state.messaging.on(`action:${_matrixWidgetApi.WidgetApiFromWidgetAction.CloseModalWidget}`, this.onWidgetClose);
this.state.messaging.on(`action:${_matrixWidgetApi.WidgetApiFromWidgetAction.SetModalButtonEnabled}`, this.onButtonEnableToggle);
});
(0, _defineProperty2.default)(this, "onWidgetClose", (ev
/*: CustomEvent<IModalWidgetCloseRequest>*/
) => {
this.props.onFinished(true, ev.detail.data);
});
(0, _defineProperty2.default)(this, "onButtonEnableToggle", (ev
/*: CustomEvent<ISetModalButtonEnabledActionRequest>*/
) => {
ev.preventDefault();
const isClose = ev.detail.data.button === _matrixWidgetApi.BuiltInModalButtonID.Close;
if (isClose || !this.possibleButtons.includes(ev.detail.data.button)) {
return this.state.messaging.transport.reply(ev.detail, {
error: {
message: "Invalid button"
}
});
}
let buttonIds
/*: ModalButtonID[]*/
;
if (ev.detail.data.enabled) {
buttonIds = (0, _arrays.arrayFastClone)(this.state.disabledButtonIds).filter(i => i !== ev.detail.data.button);
} else {
// use a set to swap the operation to avoid memory leaky arrays.
const tempSet = new Set(this.state.disabledButtonIds);
tempSet.add(ev.detail.data.button);
buttonIds = Array.from(tempSet);
}
this.setState({
disabledButtonIds: buttonIds
});
this.state.messaging.transport.reply(ev.detail, {});
});
this.widget = new _StopGapWidget.ElementWidget(_objectSpread(_objectSpread({}, this.props.widgetDefinition), {}, {
creatorUserId: _MatrixClientPeg.MatrixClientPeg.get().getUserId(),
id: `modal_${this.props.sourceWidgetId}`
}));
this.possibleButtons = (this.props.widgetDefinition.buttons || []).map(b => b.id);
}
componentDidMount() {
const driver = new _StopGapWidgetDriver.StopGapWidgetDriver([], this.widget, _matrixWidgetApi.WidgetKind.Modal);
const messaging = new _matrixWidgetApi.ClientWidgetApi(this.widget, this.appFrame.current, driver);
this.setState({
messaging
});
}
componentWillUnmount() {
this.state.messaging.off("ready", this.onReady);
this.state.messaging.off(`action:${_matrixWidgetApi.WidgetApiFromWidgetAction.CloseModalWidget}`, this.onWidgetClose);
this.state.messaging.stop();
}
render() {
const templated = this.widget.getCompleteUrl({
widgetRoomId: this.props.widgetRoomId,
currentUserId: _MatrixClientPeg.MatrixClientPeg.get().getUserId(),
userDisplayName: _OwnProfileStore.OwnProfileStore.instance.displayName,
userHttpAvatarUrl: _OwnProfileStore.OwnProfileStore.instance.getHttpAvatarUrl(),
clientId: _identifiers.ELEMENT_CLIENT_ID,
clientTheme: _SettingsStore.default.getValue("theme"),
clientLanguage: (0, _languageHandler.getUserLanguage)()
});
const parsed = new URL(templated); // Add in some legacy support sprinkles (for non-popout widgets)
// TODO: Replace these with proper widget params
// See https://github.com/matrix-org/matrix-doc/pull/1958/files#r405714833
parsed.searchParams.set('widgetId', this.widget.id);
parsed.searchParams.set('parentUrl', window.location.href.split('#', 2)[0]); // Replace the encoded dollar signs back to dollar signs. They have no special meaning
// in HTTP, but URL parsers encode them anyways.
const widgetUrl = parsed.toString().replace(/%24/g, '$');
let buttons;
if (this.props.widgetDefinition.buttons) {
// show first button rightmost for a more natural specification
buttons = this.props.widgetDefinition.buttons.slice(0, MAX_BUTTONS).reverse().map(def => {
let kind = "secondary";
switch (def.kind) {
case _matrixWidgetApi.ModalButtonKind.Primary:
kind = "primary";
break;
case _matrixWidgetApi.ModalButtonKind.Secondary:
kind = "primary_outline";
break;
case _matrixWidgetApi.ModalButtonKind.Danger:
kind = "danger";
break;
}
const onClick = () => {
this.state.messaging.notifyModalWidgetButtonClicked(def.id);
};
const isDisabled = this.state.disabledButtonIds.includes(def.id);
return /*#__PURE__*/React.createElement(_AccessibleButton.default, {
key: def.id,
kind: kind,
onClick: onClick,
disabled: isDisabled
}, def.label);
});
}
return /*#__PURE__*/React.createElement(_BaseDialog.default, {
title: this.props.widgetDefinition.name || (0, _languageHandler._t)("Modal Widget"),
className: "mx_ModalWidgetDialog",
contentId: "mx_Dialog_content",
onFinished: this.props.onFinished
}, /*#__PURE__*/React.createElement("div", {
className: "mx_ModalWidgetDialog_warning"
}, /*#__PURE__*/React.createElement("img", {
src: require("../../../../res/img/element-icons/warning-badge.svg"),
height: "16",
width: "16",
alt: ""
}), (0, _languageHandler._t)("Data on this screen is shared with %(widgetDomain)s", {
widgetDomain: parsed.hostname
})), /*#__PURE__*/React.createElement("div", null, /*#__PURE__*/React.createElement("iframe", {
ref: this.appFrame,
sandbox: "allow-forms allow-scripts allow-same-origin",
src: widgetUrl,
onLoad: this.onLoad
})), /*#__PURE__*/React.createElement("div", {
className: "mx_ModalWidgetDialog_buttons"
}, buttons));
}
}, _temp)) || _class);
exports.default = ModalWidgetDialog;
//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uL3NyYy9jb21wb25lbnRzL3ZpZXdzL2RpYWxvZ3MvTW9kYWxXaWRnZXREaWFsb2cudHN4Il0sIm5hbWVzIjpbIk1BWF9CVVRUT05TIiwiTW9kYWxXaWRnZXREaWFsb2ciLCJSZWFjdCIsIlB1cmVDb21wb25lbnQiLCJjb25zdHJ1Y3RvciIsInByb3BzIiwiY3JlYXRlUmVmIiwiZGlzYWJsZWRCdXR0b25JZHMiLCJzdGF0ZSIsIm1lc3NhZ2luZyIsInNlbmRXaWRnZXRDb25maWciLCJ3aWRnZXREZWZpbml0aW9uIiwib25jZSIsIm9uUmVhZHkiLCJvbiIsIldpZGdldEFwaUZyb21XaWRnZXRBY3Rpb24iLCJDbG9zZU1vZGFsV2lkZ2V0Iiwib25XaWRnZXRDbG9zZSIsIlNldE1vZGFsQnV0dG9uRW5hYmxlZCIsIm9uQnV0dG9uRW5hYmxlVG9nZ2xlIiwiZXYiLCJvbkZpbmlzaGVkIiwiZGV0YWlsIiwiZGF0YSIsInByZXZlbnREZWZhdWx0IiwiaXNDbG9zZSIsImJ1dHRvbiIsIkJ1aWx0SW5Nb2RhbEJ1dHRvbklEIiwiQ2xvc2UiLCJwb3NzaWJsZUJ1dHRvbnMiLCJpbmNsdWRlcyIsInRyYW5zcG9ydCIsInJlcGx5IiwiZXJyb3IiLCJtZXNzYWdlIiwiYnV0dG9uSWRzIiwiZW5hYmxlZCIsImZpbHRlciIsImkiLCJ0ZW1wU2V0IiwiU2V0IiwiYWRkIiwiQXJyYXkiLCJmcm9tIiwic2V0U3RhdGUiLCJ3aWRnZXQiLCJFbGVtZW50V2lkZ2V0IiwiY3JlYXRvclVzZXJJZCIsIk1hdHJpeENsaWVudFBlZyIsImdldCIsImdldFVzZXJJZCIsImlkIiwic291cmNlV2lkZ2V0SWQiLCJidXR0b25zIiwibWFwIiwiYiIsImNvbXBvbmVudERpZE1vdW50IiwiZHJpdmVyIiwiU3RvcEdhcFdpZGdldERyaXZlciIsIldpZGdldEtpbmQiLCJNb2RhbCIsIkNsaWVudFdpZGdldEFwaSIsImFwcEZyYW1lIiwiY3VycmVudCIsImNvbXBvbmVudFdpbGxVbm1vdW50Iiwib2ZmIiwic3RvcCIsInJlbmRlciIsInRlbXBsYXRlZCIsImdldENvbXBsZXRlVXJsIiwid2lkZ2V0Um9vbUlkIiwiY3VycmVudFVzZXJJZCIsInVzZXJEaXNwbGF5TmFtZSIsIk93blByb2ZpbGVTdG9yZSIsImluc3RhbmNlIiwiZGlzcGxheU5hbWUiLCJ1c2VySHR0cEF2YXRhclVybCIsImdldEh0dHBBdmF0YXJVcmwiLCJjbGllbnRJZCIsIkVMRU1FTlRfQ0xJRU5UX0lEIiwiY2xpZW50VGhlbWUiLCJTZXR0aW5nc1N0b3JlIiwiZ2V0VmFsdWUiLCJjbGllbnRMYW5ndWFnZSIsInBhcnNlZCIsIlVSTCIsInNlYXJjaFBhcmFtcyIsInNldCIsIndpbmRvdyIsImxvY2F0aW9uIiwiaHJlZiIsInNwbGl0Iiwid2lkZ2V0VXJsIiwidG9TdHJpbmciLCJyZXBsYWNlIiwic2xpY2UiLCJyZXZlcnNlIiwiZGVmIiwia2luZCIsIk1vZGFsQnV0dG9uS2luZCIsIlByaW1hcnkiLCJTZWNvbmRhcnkiLCJEYW5nZXIiLCJvbkNsaWNrIiwibm90aWZ5TW9kYWxXaWRnZXRCdXR0b25DbGlja2VkIiwiaXNEaXNhYmxlZCIsImxhYmVsIiwibmFtZSIsInJlcXVpcmUiLCJ3aWRnZXREb21haW4iLCJob3N0bmFtZSIsIm9uTG9hZCJdLCJtYXBwaW5ncyI6Ijs7Ozs7Ozs7Ozs7OztBQWdCQTs7QUFDQTs7QUFDQTs7QUFDQTs7QUFDQTs7QUFlQTs7QUFDQTs7QUFDQTs7QUFDQTs7QUFDQTs7QUFDQTs7QUFDQTs7QUFDQTs7Ozs7Ozs7QUFjQSxNQUFNQSxXQUFXLEdBQUcsQ0FBcEI7SUFHcUJDLGlCLFdBRHBCLGdEQUFxQixpQ0FBckIsQyx5QkFBRCxNQUNxQkEsaUJBRHJCLFNBQytDQyxLQUFLLENBQUNDO0FBRHJEO0FBQ21GO0FBUy9FQyxFQUFBQSxXQUFXLENBQUNDLEtBQUQsRUFBUTtBQUNmLFVBQU1BLEtBQU47QUFEZTtBQUFBO0FBQUEsaUVBTm9DSCxLQUFLLENBQUNJLFNBQU4sRUFNcEM7QUFBQSxpREFK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QVBMLENBTkcsZUFpQkgsOENBQ0k7QUFDSSxNQUFBLEdBQUcsRUFBRSxLQUFLaEQsUUFEZDtBQUVJLE1BQUEsT0FBTyxFQUFDLDZDQUZaO0FBR0ksTUFBQSxHQUFHLEVBQUU4QixTQUhUO0FBSUksTUFBQSxNQUFNLEVBQUUsS0FBS21CO0FBSmpCLE1BREosQ0FqQkcsZUF5Qkg7QUFBSyxNQUFBLFNBQVMsRUFBQztBQUFmLE9BQ00xRCxPQUROLENBekJHLENBQVA7QUE2Qkg7O0FBcko4RSxDIiwic291cmNlc0NvbnRlbnQiOlsiLypcbkNvcHlyaWdodCAyMDIwLCAyMDIxIFRoZSBNYXRyaXgub3JnIEZvdW5kYXRpb24gQy5JLkMuXG5cbkxpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSBcIkxpY2Vuc2VcIik7XG55b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuXG5Zb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXRcblxuICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMFxuXG5Vbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlXG5kaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiBcIkFTIElTXCIgQkFTSVMsXG5XSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC5cblNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmRcbmxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLlxuKi9cblxuaW1wb3J0ICogYXMgUmVhY3QgZnJvbSAncmVhY3QnO1xuaW1wb3J0IEJhc2VEaWFsb2cgZnJvbSAnLi9CYXNlRGlhbG9nJztcbmltcG9ydCB7IF90LCBnZXRVc2VyTGFuZ3VhZ2UgfSBmcm9tICcuLi8uLi8uLi9sYW5ndWFnZUhhbmRsZXInO1xuaW1wb3J0IEFjY2Vzc2libGVCdXR0b24gZnJvbSBcIi4uL2VsZW1lbnRzL0FjY2Vzc2libGVCdXR0b25cIjtcbmltcG9ydCB7XG4gICAgQ2xpZW50V2lkZ2V0QXBpLFxuICAgIElNb2RhbFdpZGdldENsb3NlUmVxdWVzdCxcbiAgICBJTW9kYWxXaWRnZXRPcGVuUmVxdWVzdERhdGEsXG4gICAgSU1vZGFsV2lkZ2V0UmV0dXJuRGF0YSxcbiAgICBJU2V0TW9kYWxCdXR0b25FbmFibGVkQWN0aW9uUmVxdWVzdCxcbiAgICBJV2lkZ2V0QXBpQWNrbm93bGVkZ2VSZXNwb25zZURhdGEsXG4gICAgSVdpZGdldEFwaUVycm9yUmVzcG9uc2VEYXRhLFxuICAgIEJ1aWx0SW5Nb2RhbEJ1dHRvbklELFxuICAgIE1vZGFsQnV0dG9uSUQsXG4gICAgTW9kYWxCdXR0b25LaW5kLFxuICAgIFdpZGdldCxcbiAgICBXaWRnZXRBcGlGcm9tV2lkZ2V0QWN0aW9uLFxuICAgIFdpZGdldEtpbmQsXG59IGZyb20gXCJtYXRyaXgtd2lkZ2V0LWFwaVwiO1xuaW1wb3J0IHtTdG9wR2FwV2lkZ2V0RHJpdmVyfSBmcm9tIFwiLi4vLi4vLi4vc3RvcmVzL3dpZGdldHMvU3RvcEdhcFdpZGdldERyaXZlclwiO1xuaW1wb3J0IHtNYXRyaXhDbGllbnRQZWd9IGZyb20gXCIuLi8uLi8uLi9NYXRyaXhDbGllbnRQZWdcIjtcbmltcG9ydCB7T3duUHJvZmlsZVN0b3JlfSBmcm9tIFwiLi4vLi4vLi4vc3RvcmVzL093blByb2ZpbGVTdG9yZVwiO1xuaW1wb3J0IHsgYXJyYXlGYXN0Q2xvbmUgfSBmcm9tIFwiLi4vLi4vLi4vdXRpbHMvYXJyYXlzXCI7XG5pbXBvcnQgeyBFbGVtZW50V2lkZ2V0IH0gZnJvbSBcIi4uLy4uLy4uL3N0b3Jlcy93aWRnZXRzL1N0b3BHYXBXaWRnZXRcIjtcbmltcG9ydCB7cmVwbGFjZWFibGVDb21wb25lbnR9IGZyb20gXCIuLi8uLi8uLi91dGlscy9yZXBsYWNlYWJsZUNvbXBvbmVudFwiO1xuaW1wb3J0IHtFTEVNRU5UX0NMSUVOVF9JRH0gZnJvbSBcIi4uLy4uLy4uL2lkZW50aWZpZXJzXCI7XG5pbXBvcnQgU2V0dGluZ3NTdG9yZSBmcm9tIFwiLi4vLi4vLi4vc2V0dGluZ3MvU2V0dGluZ3NTdG9yZVwiO1xuXG5pbnRlcmZhY2UgSVByb3BzIHtcbiAgICB3aWRnZXREZWZpbml0aW9uOiBJTW9kYWxXaWRnZXRPcGVuUmVxdWVzdERhdGE7XG4gICAgd2lkZ2V0Um9vbUlkPzogc3RyaW5nO1xuICAgIHNvdXJjZVdpZGdldElkOiBzdHJpbmc7XG4gICAgb25GaW5pc2hlZChzdWNjZXNzOiBib29sZWFuLCBkYXRhPzogSU1vZGFsV2lkZ2V0UmV0dXJuRGF0YSk6IHZvaWQ7XG59XG5cbmludGVyZmFjZSBJU3RhdGUge1xuICAgIG1lc3NhZ2luZz86IENsaWVudFdpZGdldEFwaTtcbiAgICBkaXNhYmxlZEJ1dHRvbklkczogTW9kYWxCdXR0b25JRFtdO1xufVxuXG5jb25zdCBNQVhfQlVUVE9OUyA9IDM7XG5cbkByZXBsYWNlYWJsZUNvbXBvbmVudChcInZpZXdzLmRpYWxvZ3MuTW9kYWxXaWRnZXREaWFsb2dcIilcbmV4cG9ydCBkZWZhdWx0IGNsYXNzIE1vZGFsV2lkZ2V0RGlhbG9nIGV4dGVuZHMgUmVhY3QuUHVyZUNvbXBvbmVudDxJUHJvcHMsIElTdGF0ZT4ge1xuICAgIHByaXZhdGUgcmVhZG9ubHkgd2lkZ2V0OiBXaWRnZXQ7XG4gICAgcHJpdmF0ZSByZWFkb25seSBwb3NzaWJsZUJ1dHRvbnM6IE1vZGFsQnV0dG9uSURbXTtcbiAgICBwcml2YXRlIGFwcEZyYW1lOiBSZWFjdC5SZWZPYmplY3Q8SFRNTElGcmFtZUVsZW1lbnQ+ID0gUmVhY3QuY3JlYXRlUmVmKCk7XG5cbiAgICBzdGF0ZTogSVN0YXRlID0ge1xuICAgICAgICBkaXNhYmxlZEJ1dHRvbklkczogW10sXG4gICAgfTtcblxuICAgIGNvbnN0cnVjdG9yKHByb3BzKSB7XG4gICAgICAgIHN1cGVyKHByb3BzKTtcblxuICAgICAgICB0aGlzLndpZGdldCA9IG5ldyBFbGVtZW50V2lkZ2V0KHtcbiAgICAgICAgICAgIC4uLnRoaXMucHJvcHMud2lkZ2V0RGVmaW5pdGlvbixcbiAgICAgICAgICAgIGNyZWF0b3JVc2VySWQ6IE1hdHJpeENsaWVudFBlZy5nZXQoKS5nZXRVc2VySWQoKSxcbiAgICAgICAgICAgIGlkOiBgbW9kYWxfJHt0aGlzLnByb3BzLnNvdXJjZVdpZGdldElkfWAsXG4gICAgICAgIH0pO1xuICAgICAgICB0aGlzLnBvc3NpYmxlQnV0dG9ucyA9ICh0aGlzLnByb3BzLndpZGdldERlZmluaXRpb24uYnV0dG9ucyB8fCBbXSkubWFwKGIgPT4gYi5pZCk7XG4gICAgfVxuXG4gICAgcHVibGljIGNvbXBvbmVudERpZE1vdW50KCkge1xuICAgICAgICBjb25zdCBkcml2ZXIgPSBuZXcgU3RvcEdhcFdpZGdldERyaXZlciggW10sIHRoaXMud2lkZ2V0LCBXaWRnZXRLaW5kLk1vZGFsKTtcbiAgICAgICAgY29uc3QgbWVzc2FnaW5nID0gbmV3IENsaWVudFdpZGdldEFwaSh0aGlzLndpZGdldCwgdGhpcy5hcHBGcmFtZS5jdXJyZW50LCBkcml2ZXIpO1xuICAgICAgICB0aGlzLnNldFN0YXRlKHttZXNzYWdpbmd9KTtcbiAgICB9XG5cbiAgICBwdWJsaWMgY29tcG9uZW50V2lsbFVubW91bnQoKSB7XG4gICAgICAgIHRoaXMuc3RhdGUubWVzc2FnaW5nLm9mZihcInJlYWR5XCIsIHRoaXMub25SZWFkeSk7XG4gICAgICAgIHRoaXMuc3RhdGUubWVzc2FnaW5nLm9mZihgYWN0aW9uOiR7V2lkZ2V0QXBpRnJvbVdpZGdldEFjdGlvbi5DbG9zZU1vZGFsV2lkZ2V0fWAsIHRoaXMub25XaWRnZXRDbG9zZSk7XG4gICAgICAgIHRoaXMuc3RhdGUubWVzc2FnaW5nLnN0b3AoKTtcbiAgICB9XG5cbiAgICBwcml2YXRlIG9uUmVhZHkgPSAoKSA9PiB7XG4gICAgICAgIHRoaXMuc3RhdGUubWVzc2FnaW5nLnNlbmRXaWRnZXRDb25maWcodGhpcy5wcm9wcy53aWRnZXREZWZpbml0aW9uKTtcbiAgICB9O1xuXG4gICAgcHJpdmF0ZSBvbkxvYWQgPSAoKSA9PiB7XG4gICAgICAgIHRoaXMuc3RhdGUubWVzc2FnaW5nLm9uY2UoXCJyZWFkeVwiLCB0aGlzLm9uUmVhZHkpO1xuICAgICAgICB0aGlzLnN0YXRlLm1lc3NhZ2luZy5vbihgYWN0aW9uOiR7V2lkZ2V0QXBpRnJvbVdpZGdldEFjdGlvbi5DbG9zZU1vZGFsV2lkZ2V0fWAsIHRoaXMub25XaWRnZXRDbG9zZSk7XG4gICAgICAgIHRoaXMuc3RhdGUubWVzc2FnaW5nLm9uKGBhY3Rpb246JHtXaWRnZXRBcGlGcm9tV2lkZ2V0QWN0aW9uLlNldE1vZGFsQnV0dG9uRW5hYmxlZH1gLCB0aGlzLm9uQnV0dG9uRW5hYmxlVG9nZ2xlKTtcbiAgICB9O1xuXG4gICAgcHJpdmF0ZSBvbldpZGdldENsb3NlID0gKGV2OiBDdXN0b21FdmVudDxJTW9kYWxXaWRnZXRDbG9zZVJlcXVlc3Q+KSA9PiB7XG4gICAgICAgIHRoaXMucHJvcHMub25GaW5pc2hlZCh0cnVlLCBldi5kZXRhaWwuZGF0YSk7XG4gICAgfVxuXG4gICAgcHJpdmF0ZSBvbkJ1dHRvbkVuYWJsZVRvZ2dsZSA9IChldjogQ3VzdG9tRXZlbnQ8SVNldE1vZGFsQnV0dG9uRW5hYmxlZEFjdGlvblJlcXVlc3Q+KSA9PiB7XG4gICAgICAgIGV2LnByZXZlbnREZWZhdWx0KCk7XG4gICAgICAgIGNvbnN0IGlzQ2xvc2UgPSBldi5kZXRhaWwuZGF0YS5idXR0b24gPT09IEJ1aWx0SW5Nb2RhbEJ1dHRvbklELkNsb3NlO1xuICAgICAgICBpZiAoaXNDbG9zZSB8fCAhdGhpcy5wb3NzaWJsZUJ1dHRvbnMuaW5jbHVkZXMoZXYuZGV0YWlsLmRhdGEuYnV0dG9uKSkge1xuICAgICAgICAgICAgcmV0dXJuIHRoaXMuc3RhdGUubWVzc2FnaW5nLnRyYW5zcG9ydC5yZXBseShldi5kZXRhaWwsIHtcbiAgICAgICAgICAgICAgICBlcnJvcjoge21lc3NhZ2U6IFwiSW52YWxpZCBidXR0b25cIn0sXG4gICAgICAgICAgICB9IGFzIElXaWRnZXRBcGlFcnJvclJlc3BvbnNlRGF0YSk7XG4gICAgICAgIH1cblxuICAgICAgICBsZXQgYnV0dG9uSWRzOiBNb2RhbEJ1dHRvbklEW107XG4gICAgICAgIGlmIChldi5kZXRhaWwuZGF0YS5lbmFibGVkKSB7XG4gICAgICAgICAgICBidXR0b25JZHMgPSBhcnJheUZhc3RDbG9uZSh0aGlzLnN0YXRlLmRpc2FibGVkQnV0dG9uSWRzKS5maWx0ZXIoaSA9PiBpICE9PSBldi5kZXRhaWwuZGF0YS5idXR0b24pO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgLy8gdXNlIGEgc2V0IHRvIHN3YXAgdGhlIG9wZXJhdGlvbiB0byBhdm9pZCBtZW1vcnkgbGVha3kgYXJyYXlzLlxuICAgICAgICAgICAgY29uc3QgdGVtcFNldCA9IG5ldyBTZXQodGhpcy5zdGF0ZS5kaXNhYmxlZEJ1dHRvbklkcyk7XG4gICAgICAgICAgICB0ZW1wU2V0LmFkZChldi5kZXRhaWwuZGF0YS5idXR0b24pO1xuICAgICAgICAgICAgYnV0dG9uSWRzID0gQXJyYXkuZnJvbSh0ZW1wU2V0KTtcbiAgICAgICAgfVxuICAgICAgICB0aGlzLnNldFN0YXRlKHtkaXNhYmxlZEJ1dHRvbklkczogYnV0dG9uSWRzfSk7XG4gICAgICAgIHRoaXMuc3RhdGUubWVzc2FnaW5nLnRyYW5zcG9ydC5yZXBseShldi5kZXRhaWwsIHt9IGFzIElXaWRnZXRBcGlBY2tub3dsZWRnZVJlc3BvbnNlRGF0YSk7XG4gICAgfTtcblxuICAgIHB1YmxpYyByZW5kZXIoKSB7XG4gICAgICAgIGNvbnN0IHRlbXBsYXRlZCA9IHRoaXMud2lkZ2V0LmdldENvbXBsZXRlVXJsKHtcbiAgICAgICAgICAgIHdpZGdldFJvb21JZDogdGhpcy5wcm9wcy53aWRnZXRSb29tSWQsXG4gICAgICAgICAgICBjdXJyZW50VXNlcklkOiBNYXRyaXhDbGllbnRQZWcuZ2V0KCkuZ2V0VXNlcklkKCksXG4gICAgICAgICAgICB1c2VyRGlzcGxheU5hbWU6IE93blByb2ZpbGVTdG9yZS5pbnN0YW5jZS5kaXNwbGF5TmFtZSxcbiAgICAgICAgICAgIHVzZXJIdHRwQXZhdGFyVXJsOiBPd25Qcm9maWxlU3RvcmUuaW5zdGFuY2UuZ2V0SHR0cEF2YXRhclVybCgpLFxuICAgICAgICAgICAgY2xpZW50SWQ6IEVMRU1FTlRfQ0xJRU5UX0lELFxuICAgICAgICAgICAgY2xpZW50VGhlbWU6IFNldHRpbmdzU3RvcmUuZ2V0VmFsdWUoXCJ0aGVtZVwiKSxcbiAgICAgICAgICAgIGNsaWVudExhbmd1YWdlOiBnZXRVc2VyTGFuZ3VhZ2UoKSxcbiAgICAgICAgfSk7XG5cbiAgICAgICAgY29uc3QgcGFyc2VkID0gbmV3IFVSTCh0ZW1wbGF0ZWQpO1xuXG4gICAgICAgIC8vIEFkZCBpbiBzb21lIGxlZ2FjeSBzdXBwb3J0IHNwcmlua2xlcyAoZm9yIG5vbi1wb3BvdXQgd2lkZ2V0cylcbiAgICAgICAgLy8gVE9ETzogUmVwbGFjZSB0aGVzZSB3aXRoIHByb3BlciB3aWRnZXQgcGFyYW1zXG4gICAgICAgIC8vIFNlZSBodHRwczovL2dpdGh1Yi5jb20vbWF0cml4LW9yZy9tYXRyaXgtZG9jL3B1bGwvMTk1OC9maWxlcyNyNDA1NzE0ODMzXG4gICAgICAgIHBhcnNlZC5zZWFyY2hQYXJhbXMuc2V0KCd3aWRnZXRJZCcsIHRoaXMud2lkZ2V0LmlkKTtcbiAgICAgICAgcGFyc2VkLnNlYXJjaFBhcmFtcy5zZXQoJ3BhcmVudFVybCcsIHdpbmRvdy5sb2NhdGlvbi5ocmVmLnNwbGl0KCcjJywgMilbMF0pO1xuXG4gICAgICAgIC8vIFJlcGxhY2UgdGhlIGVuY29kZWQgZG9sbGFyIHNpZ25zIGJhY2sgdG8gZG9sbGFyIHNpZ25zLiBUaGV5IGhhdmUgbm8gc3BlY2lhbCBtZWFuaW5nXG4gICAgICAgIC8vIGluIEhUVFAsIGJ1dCBVUkwgcGFyc2VycyBlbmNvZGUgdGhlbSBhbnl3YXlzLlxuICAgICAgICBjb25zdCB3aWRnZXRVcmwgPSBwYXJzZWQudG9TdHJpbmcoKS5yZXBsYWNlKC8lMjQvZywgJyQnKTtcblxuICAgICAgICBsZXQgYnV0dG9ucztcbiAgICAgICAgaWYgKHRoaXMucHJvcHMud2lkZ2V0RGVmaW5pdGlvbi5idXR0b25zKSB7XG4gICAgICAgICAgICAvLyBzaG93IGZpcnN0IGJ1dHRvbiByaWdodG1vc3QgZm9yIGEgbW9yZSBuYXR1cmFsIHNwZWNpZmljYXRpb25cbiAgICAgICAgICAgIGJ1dHRvbnMgPSB0aGlzLnByb3BzLndpZGdldERlZmluaXRpb24uYnV0dG9ucy5zbGljZSgwLCBNQVhfQlVUVE9OUykucmV2ZXJzZSgpLm1hcChkZWYgPT4ge1xuICAgICAgICAgICAgICAgIGxldCBraW5kID0gXCJzZWNvbmRhcnlcIjtcbiAgICAgICAgICAgICAgICBzd2l0Y2ggKGRlZi5raW5kKSB7XG4gICAgICAgICAgICAgICAgICAgIGNhc2UgTW9kYWxCdXR0b25LaW5kLlByaW1hcnk6XG4gICAgICAgICAgICAgICAgICAgICAgICBraW5kID0gXCJwcmltYXJ5XCI7XG4gICAgICAgICAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgICAgICAgICAgY2FzZSBNb2RhbEJ1dHRvbktpbmQuU2Vjb25kYXJ5OlxuICAgICAgICAgICAgICAgICAgICAgICAga2luZCA9IFwicHJpbWFyeV9vdXRsaW5lXCI7XG4gICAgICAgICAgICAgICAgICAgICAgICBicmVha1xuICAgICAgICAgICAgICAgICAgICBjYXNlIE1vZGFsQnV0dG9uS2luZC5EYW5nZXI6XG4gICAgICAgICAgICAgICAgICAgICAgICBraW5kID0gXCJkYW5nZXJcIjtcbiAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgICAgIGNvbnN0IG9uQ2xpY2sgPSAoKSA9PiB7XG4gICAgICAgICAgICAgICAgICAgIHRoaXMuc3RhdGUubWVzc2FnaW5nLm5vdGlmeU1vZGFsV2lkZ2V0QnV0dG9uQ2xpY2tlZChkZWYuaWQpO1xuICAgICAgICAgICAgICAgIH07XG5cbiAgICAgICAgICAgICAgICBjb25zdCBpc0Rpc2FibGVkID0gdGhpcy5zdGF0ZS5kaXNhYmxlZEJ1dHRvbklkcy5pbmNsdWRlcyhkZWYuaWQpO1xuXG4gICAgICAgICAgICAgICAgcmV0dXJuIDxBY2Nlc3NpYmxlQnV0dG9uIGtleT17ZGVmLmlkfSBraW5kPXtraW5kfSBvbkNsaWNrPXtvbkNsaWNrfSBkaXNhYmxlZD17aXNEaXNhYmxlZH0+XG4gICAgICAgICAgICAgICAgICAgIHsgZGVmLmxhYmVsIH1cbiAgICAgICAgICAgICAgICA8L0FjY2Vzc2libGVCdXR0b24+O1xuICAgICAgICAgICAgfSk7XG4gICAgICAgIH1cblxuICAgICAgICByZXR1cm4gPEJhc2VEaWFsb2dcbiAgICAgICAgICAgIHRpdGxlPXt0aGlzLnByb3BzLndpZGdldERlZmluaXRpb24ubmFtZSB8fCBfdChcIk1vZGFsIFdpZGdldFwiKX1cbiAgICAgICAgICAgIGNsYXNzTmFtZT1cIm14X01vZGFsV2lkZ2V0RGlhbG9nXCJcbiAgICAgICAgICAgIGNvbnRlbnRJZD1cIm14X0RpYWxvZ19jb250ZW50XCJcbiAgICAgICAgICAgIG9uRmluaXNoZWQ9e3RoaXMucHJvcHMub25GaW5pc2hlZH1cbiAgICAgICAgPlxuICAgICAgICAgICAgPGRpdiBjbGFzc05hbWU9XCJteF9Nb2RhbFdpZGdldERpYWxvZ193YXJuaW5nXCI+XG4gICAgICAgICAgICAgICAgPGltZ1xuICAgICAgICAgICAgICAgICAgICBzcmM9e3JlcXVpcmUoXCIuLi8uLi8uLi8uLi9yZXMvaW1nL2VsZW1lbnQtaWNvbnMvd2FybmluZy1iYWRnZS5zdmdcIil9XG4gICAgICAgICAgICAgICAgICAgIGhlaWdodD1cIjE2XCJcbiAgICAgICAgICAgICAgICAgICAgd2lkdGg9XCIxNlwiXG4gICAgICAgICAgICAgICAgICAgIGFsdD1cIlwiXG4gICAgICAgICAgICAgICAgLz5cbiAgICAgICAgICAgICAgICB7X3QoXCJEYXRhIG9uIHRoaXMgc2NyZWVuIGlzIHNoYXJlZCB3aXRoICUod2lkZ2V0RG9tYWluKXNcIiwge1xuICAgICAgICAgICAgICAgICAgICB3aWRnZXREb21haW46IHBhcnNlZC5ob3N0bmFtZSxcbiAgICAgICAgICAgICAgICB9KX1cbiAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgICAgPGRpdj5cbiAgICAgICAgICAgICAgICA8aWZyYW1lXG4gICAgICAgICAgICAgICAgICAgIHJlZj17dGhpcy5hcHBGcmFtZX1cbiAgICAgICAgICAgICAgICAgICAgc2FuZGJveD1cImFsbG93LWZvcm1zIGFsbG93LXNjcmlwdHMgYWxsb3ctc2FtZS1vcmlnaW5cIlxuICAgICAgICAgICAgICAgICAgICBzcmM9e3dpZGdldFVybH1cbiAgICAgICAgICAgICAgICAgICAgb25Mb2FkPXt0aGlzLm9uTG9hZH1cbiAgICAgICAgICAgICAgICAvPlxuICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgICA8ZGl2IGNsYXNzTmFtZT1cIm14X01vZGFsV2lkZ2V0RGlhbG9nX2J1dHRvbnNcIj5cbiAgICAgICAgICAgICAgICB7IGJ1dHRvbnMgfVxuICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgIDwvQmFzZURpYWxvZz47XG4gICAgfVxufVxuIl19