matrix-react-sdk
Version:
SDK for matrix.org using React
271 lines (265 loc) • 47.8 kB
JavaScript
"use strict";
var _interopRequireDefault = require("@babel/runtime/helpers/interopRequireDefault");
Object.defineProperty(exports, "__esModule", {
value: true
});
exports.default = exports.UploadButtonContext = exports.OverflowMenuContext = void 0;
var _defineProperty2 = _interopRequireDefault(require("@babel/runtime/helpers/defineProperty"));
var _extends2 = _interopRequireDefault(require("@babel/runtime/helpers/extends"));
var _classnames = _interopRequireDefault(require("classnames"));
var _matrix = require("matrix-js-sdk/src/matrix");
var _react = _interopRequireWildcard(require("react"));
var _languageHandler = require("../../../languageHandler");
var _CollapsibleButton = require("./CollapsibleButton");
var _dispatcher = _interopRequireDefault(require("../../../dispatcher/dispatcher"));
var _ErrorDialog = _interopRequireDefault(require("../dialogs/ErrorDialog"));
var _location = require("../location");
var _Modal = _interopRequireDefault(require("../../../Modal"));
var _PollCreateDialog = _interopRequireDefault(require("../elements/PollCreateDialog"));
var _MatrixClientPeg = require("../../../MatrixClientPeg");
var _ContentMessages = _interopRequireDefault(require("../../../ContentMessages"));
var _MatrixClientContext = _interopRequireDefault(require("../../../contexts/MatrixClientContext"));
var _RoomContext = _interopRequireDefault(require("../../../contexts/RoomContext"));
var _useDispatcher = require("../../../hooks/useDispatcher");
var _BrowserWorkarounds = require("../../../utils/BrowserWorkarounds");
var _IconizedContextMenu = _interopRequireWildcard(require("../context_menus/IconizedContextMenu"));
var _EmojiButton = require("./EmojiButton");
var _arrays = require("../../../utils/arrays");
var _useSettings = require("../../../hooks/useSettings");
var _AccessibleButton = _interopRequireDefault(require("../elements/AccessibleButton"));
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 2022 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.
*/
const OverflowMenuContext = exports.OverflowMenuContext = /*#__PURE__*/(0, _react.createContext)(null);
const MessageComposerButtons = props => {
const matrixClient = (0, _react.useContext)(_MatrixClientContext.default);
const {
room,
narrow
} = (0, _react.useContext)(_RoomContext.default);
const isWysiwygLabEnabled = (0, _useSettings.useSettingValue)("feature_wysiwyg_composer");
if (!matrixClient || !room || props.haveRecording) {
return null;
}
let mainButtons;
let moreButtons;
if (narrow) {
mainButtons = [isWysiwygLabEnabled ? /*#__PURE__*/_react.default.createElement(ComposerModeButton, {
key: "composerModeButton",
isRichTextEnabled: props.isRichTextEnabled,
onClick: props.onComposerModeClick
}) : emojiButton(props)];
moreButtons = [uploadButton(),
// props passed via UploadButtonContext
showStickersButton(props), voiceRecordingButton(props, narrow), startVoiceBroadcastButton(props), props.showPollsButton ? pollButton(room, props.relation) : null, showLocationButton(props, room, matrixClient)];
} else {
mainButtons = [isWysiwygLabEnabled ? /*#__PURE__*/_react.default.createElement(ComposerModeButton, {
key: "composerModeButton",
isRichTextEnabled: props.isRichTextEnabled,
onClick: props.onComposerModeClick
}) : emojiButton(props), uploadButton() // props passed via UploadButtonContext
];
moreButtons = [showStickersButton(props), voiceRecordingButton(props, narrow), startVoiceBroadcastButton(props), props.showPollsButton ? pollButton(room, props.relation) : null, showLocationButton(props, room, matrixClient)];
}
mainButtons = (0, _arrays.filterBoolean)(mainButtons);
moreButtons = (0, _arrays.filterBoolean)(moreButtons);
const moreOptionsClasses = (0, _classnames.default)({
mx_MessageComposer_button: true,
mx_MessageComposer_buttonMenu: true,
mx_MessageComposer_closeButtonMenu: props.isMenuOpen
});
return /*#__PURE__*/_react.default.createElement(UploadButtonContextProvider, {
roomId: room.roomId,
relation: props.relation
}, mainButtons, moreButtons.length > 0 && /*#__PURE__*/_react.default.createElement(_AccessibleButton.default, {
className: moreOptionsClasses,
onClick: props.toggleButtonMenu,
title: (0, _languageHandler._t)("quick_settings|sidebar_settings")
}), props.isMenuOpen && /*#__PURE__*/_react.default.createElement(_IconizedContextMenu.default, (0, _extends2.default)({
onFinished: props.toggleButtonMenu
}, props.menuPosition, {
wrapperClassName: "mx_MessageComposer_Menu",
compact: true
}), /*#__PURE__*/_react.default.createElement(OverflowMenuContext.Provider, {
value: props.toggleButtonMenu
}, /*#__PURE__*/_react.default.createElement(_IconizedContextMenu.IconizedContextMenuOptionList, null, moreButtons))));
};
function emojiButton(props) {
return /*#__PURE__*/_react.default.createElement(_EmojiButton.EmojiButton, {
key: "emoji_button",
addEmoji: props.addEmoji,
menuPosition: props.menuPosition,
className: "mx_MessageComposer_button"
});
}
function uploadButton() {
return /*#__PURE__*/_react.default.createElement(UploadButton, {
key: "controls_upload"
});
}
const UploadButtonContext = exports.UploadButtonContext = /*#__PURE__*/(0, _react.createContext)(null);
// We put the file input outside the UploadButton component so that it doesn't get killed when the context menu closes.
const UploadButtonContextProvider = ({
roomId,
relation,
children
}) => {
const cli = (0, _react.useContext)(_MatrixClientContext.default);
const roomContext = (0, _react.useContext)(_RoomContext.default);
const uploadInput = (0, _react.useRef)(null);
const onUploadClick = () => {
if (cli?.isGuest()) {
_dispatcher.default.dispatch({
action: "require_registration"
});
return;
}
uploadInput.current?.click();
};
(0, _useDispatcher.useDispatcher)(_dispatcher.default, payload => {
if (roomContext.timelineRenderingType === payload.context && payload.action === "upload_file") {
onUploadClick();
}
});
const onUploadFileInputChange = ev => {
if (ev.target.files?.length === 0) return;
// Take a copy, so we can safely reset the value of the form control
_ContentMessages.default.sharedInstance().sendContentListToRoom(Array.from(ev.target.files), roomId, relation, cli, roomContext.timelineRenderingType);
// This is the onChange handler for a file form control, but we're
// not keeping any state, so reset the value of the form control
// to empty.
// NB. we need to set 'value': the 'files' property is immutable.
ev.target.value = "";
};
const uploadInputStyle = {
display: "none"
};
return /*#__PURE__*/_react.default.createElement(UploadButtonContext.Provider, {
value: onUploadClick
}, children, /*#__PURE__*/_react.default.createElement("input", {
ref: uploadInput,
type: "file",
style: uploadInputStyle,
multiple: true,
onClick: _BrowserWorkarounds.chromeFileInputFix,
onChange: onUploadFileInputChange
}));
};
// Must be rendered within an UploadButtonContextProvider
const UploadButton = () => {
const overflowMenuCloser = (0, _react.useContext)(OverflowMenuContext);
const uploadButtonFn = (0, _react.useContext)(UploadButtonContext);
const onClick = () => {
uploadButtonFn?.();
overflowMenuCloser?.(); // close overflow menu
};
return /*#__PURE__*/_react.default.createElement(_CollapsibleButton.CollapsibleButton, {
className: "mx_MessageComposer_button",
iconClassName: "mx_MessageComposer_upload",
onClick: onClick,
title: (0, _languageHandler._t)("common|attachment")
});
};
function showStickersButton(props) {
return props.showStickersButton ? /*#__PURE__*/_react.default.createElement(_CollapsibleButton.CollapsibleButton, {
id: "stickersButton",
key: "controls_stickers",
className: "mx_MessageComposer_button",
iconClassName: "mx_MessageComposer_stickers",
onClick: () => props.setStickerPickerOpen(!props.isStickerPickerOpen),
title: props.isStickerPickerOpen ? (0, _languageHandler._t)("composer|close_sticker_picker") : (0, _languageHandler._t)("common|sticker")
}) : null;
}
const startVoiceBroadcastButton = props => {
return props.showVoiceBroadcastButton ? /*#__PURE__*/_react.default.createElement(_CollapsibleButton.CollapsibleButton, {
key: "start_voice_broadcast",
className: "mx_MessageComposer_button",
iconClassName: "mx_MessageComposer_voiceBroadcast",
onClick: props.onStartVoiceBroadcastClick,
title: (0, _languageHandler._t)("voice_broadcast|action")
}) : null;
};
function voiceRecordingButton(props, narrow) {
// XXX: recording UI does not work well in narrow mode, so hide for now
return narrow ? null : /*#__PURE__*/_react.default.createElement(_CollapsibleButton.CollapsibleButton, {
key: "voice_message_send",
className: "mx_MessageComposer_button",
iconClassName: "mx_MessageComposer_voiceMessage",
onClick: props.onRecordStartEndClick,
title: (0, _languageHandler._t)("composer|voice_message_button")
});
}
function pollButton(room, relation) {
return /*#__PURE__*/_react.default.createElement(PollButton, {
key: "polls",
room: room,
relation: relation
});
}
class PollButton extends _react.default.PureComponent {
constructor(...args) {
super(...args);
(0, _defineProperty2.default)(this, "onCreateClick", () => {
this.context?.(); // close overflow menu
const canSend = this.props.room.currentState.maySendEvent(_matrix.M_POLL_START.name, _MatrixClientPeg.MatrixClientPeg.safeGet().getSafeUserId());
if (!canSend) {
_Modal.default.createDialog(_ErrorDialog.default, {
title: (0, _languageHandler._t)("composer|poll_button_no_perms_title"),
description: (0, _languageHandler._t)("composer|poll_button_no_perms_description")
});
} else {
const threadId = this.props.relation?.rel_type === _matrix.THREAD_RELATION_TYPE.name ? this.props.relation.event_id : undefined;
_Modal.default.createDialog(_PollCreateDialog.default, {
room: this.props.room,
threadId
}, "mx_CompoundDialog", false,
// isPriorityModal
true // isStaticModal
);
}
});
}
render() {
// do not allow sending polls within threads at this time
if (this.props.relation?.rel_type === _matrix.THREAD_RELATION_TYPE.name) return null;
return /*#__PURE__*/_react.default.createElement(_CollapsibleButton.CollapsibleButton, {
className: "mx_MessageComposer_button",
iconClassName: "mx_MessageComposer_poll",
onClick: this.onCreateClick,
title: (0, _languageHandler._t)("composer|poll_button")
});
}
}
(0, _defineProperty2.default)(PollButton, "contextType", OverflowMenuContext);
function showLocationButton(props, room, matrixClient) {
const sender = room.getMember(matrixClient.getSafeUserId());
return props.showLocationButton && sender ? /*#__PURE__*/_react.default.createElement(_location.LocationButton, {
key: "location",
roomId: room.roomId,
relation: props.relation,
sender: sender,
menuPosition: props.menuPosition
}) : null;
}
function ComposerModeButton({
isRichTextEnabled,
onClick
}) {
const title = isRichTextEnabled ? (0, _languageHandler._t)("composer|mode_plain") : (0, _languageHandler._t)("composer|mode_rich_text");
return /*#__PURE__*/_react.default.createElement(_CollapsibleButton.CollapsibleButton, {
className: "mx_MessageComposer_button",
iconClassName: (0, _classnames.default)({
mx_MessageComposer_plain_text: !isRichTextEnabled,
mx_MessageComposer_rich_text: isRichTextEnabled
}),
onClick: onClick,
title: title
});
}
var _default = exports.default = MessageComposerButtons;
//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJuYW1lcyI6WyJfY2xhc3NuYW1lcyIsIl9pbnRlcm9wUmVxdWlyZURlZmF1bHQiLCJyZXF1aXJlIiwiX21hdHJpeCIsIl9yZWFjdCIsIl9pbnRlcm9wUmVxdWlyZVdpbGRjYXJkIiwiX2xhbmd1YWdlSGFuZGxlciIsIl9Db2xsYXBzaWJsZUJ1dHRvbiIsIl9kaXNwYXRjaGVyIiwiX0Vycm9yRGlhbG9nIiwiX2xvY2F0aW9uIiwiX01vZGFsIiwiX1BvbGxDcmVhdGVEaWFsb2ciLCJfTWF0cml4Q2xpZW50UGVnIiwiX0NvbnRlbnRNZXNzYWdlcyIsIl9NYXRyaXhDbGllbnRDb250ZXh0IiwiX1Jvb21Db250ZXh0IiwiX3VzZURpc3BhdGNoZXIiLCJfQnJvd3Nlcldvcmthcm91bmRzIiwiX0ljb25pemVkQ29udGV4dE1lbnUiLCJfRW1vamlCdXR0b24iLCJfYXJyYXlzIiwiX3VzZVNldHRpbmdzIiwiX0FjY2Vzc2libGVCdXR0b24iLCJfZ2V0UmVxdWlyZVdpbGRjYXJkQ2FjaGUiLCJlIiwiV2Vha01hcCIsInIiLCJ0IiwiX19lc01vZHVsZSIsImRlZmF1bHQiLCJoYXMiLCJnZXQiLCJuIiwiX19wcm90b19fIiwiYSIsIk9iamVjdCIsImRlZmluZVByb3BlcnR5IiwiZ2V0T3duUHJvcGVydHlEZXNjcmlwdG9yIiwidSIsImhhc093blByb3BlcnR5IiwiY2FsbCIsImkiLCJzZXQiLCJPdmVyZmxvd01lbnVDb250ZXh0IiwiZXhwb3J0cyIsImNyZWF0ZUNvbnRleHQiLCJNZXNzYWdlQ29tcG9zZXJCdXR0b25zIiwicHJvcHMiLCJtYXRyaXhDbGllbnQiLCJ1c2VDb250ZXh0IiwiTWF0cml4Q2xpZW50Q29udGV4dCIsInJvb20iLCJuYXJyb3ciLCJSb29tQ29udGV4dCIsImlzV3lzaXd5Z0xhYkVuYWJsZWQiLCJ1c2VTZXR0aW5nVmFsdWUiLCJoYXZlUmVjb3JkaW5nIiwibWFpbkJ1dHRvbnMiLCJtb3JlQnV0dG9ucyIsImNyZWF0ZUVsZW1lbnQiLCJDb21wb3Nlck1vZGVCdXR0b24iLCJrZXkiLCJpc1JpY2hUZXh0RW5hYmxlZCIsIm9uQ2xpY2siLCJvbkNvbXBvc2VyTW9kZUNsaWNrIiwiZW1vamlCdXR0b24iLCJ1cGxvYWRCdXR0b24iLCJzaG93U3RpY2tlcnNCdXR0b24iLCJ2b2ljZVJlY29yZGluZ0J1dHRvbiIsInN0YXJ0Vm9pY2VCcm9hZGNhc3RCdXR0b24iLCJzaG93UG9sbHNCdXR0b24iLCJwb2xsQnV0dG9uIiwicmVsYXRpb24iLCJzaG93TG9jYXRpb25CdXR0b24iLCJmaWx0ZXJCb29sZWFuIiwibW9yZU9wdGlvbnNDbGFzc2VzIiwiY2xhc3NOYW1lcyIsIm14X01lc3NhZ2VDb21wb3Nlcl9idXR0b24iLCJteF9NZXNzYWdlQ29tcG9zZXJfYnV0dG9uTWVudSIsIm14X01lc3NhZ2VDb21wb3Nlcl9jbG9zZUJ1dHRvbk1lbnUiLCJpc01lbnVPcGVuIiwiVXBsb2FkQnV0dG9uQ29udGV4dFByb3ZpZGVyIiwicm9vbUlkIiwibGVuZ3RoIiwiY2xhc3NOYW1lIiwidG9nZ2xlQnV0dG9uTWVudSIsInRpdGxlIiwiX3QiLCJfZXh0ZW5kczIiLCJvbkZpbmlzaGVkIiwibWVudVBvc2l0aW9uIiwid3JhcHBlckNsYXNzTmFtZSIsImNvbXBhY3QiLCJQcm92aWRlciIsInZhbHVlIiwiSWNvbml6ZWRDb250ZXh0TWVudU9wdGlvbkxpc3QiLCJFbW9qaUJ1dHRvbiIsImFkZEVtb2ppIiwiVXBsb2FkQnV0dG9uIiwiVXBsb2FkQnV0dG9uQ29udGV4dCIsImNoaWxkcmVuIiwiY2xpIiwicm9vbUNvbnRleHQiLCJ1cGxvYWRJbnB1dCIsInVzZVJlZiIsIm9uVXBsb2FkQ2xpY2siLCJpc0d1ZXN0IiwiZGlzIiwiZGlzcGF0Y2giLCJhY3Rpb24iLCJjdXJyZW50IiwiY2xpY2siLCJ1c2VEaXNwYXRjaGVyIiwicGF5bG9hZCIsInRpbWVsaW5lUmVuZGVyaW5nVHlwZSIsImNvbnRleHQiLCJvblVwbG9hZEZpbGVJbnB1dENoYW5nZSIsImV2IiwidGFyZ2V0IiwiZmlsZXMiLCJDb250ZW50TWVzc2FnZXMiLCJzaGFyZWRJbnN0YW5jZSIsInNlbmRDb250ZW50TGlzdFRvUm9vbSIsIkFycmF5IiwiZnJvbSIsInVwbG9hZElucHV0U3R5bGUiLCJkaXNwbGF5IiwicmVmIiwidHlwZSIsInN0eWxlIiwibXVsdGlwbGUiLCJjaHJvbWVGaWxlSW5wdXRGaXgiLCJvbkNoYW5nZSIsIm92ZXJmbG93TWVudUNsb3NlciIsInVwbG9hZEJ1dHRvbkZuIiwiQ29sbGFwc2libGVCdXR0b24iLCJpY29uQ2xhc3NOYW1lIiwiaWQiLCJzZXRTdGlja2VyUGlja2VyT3BlbiIsImlzU3RpY2tlclBpY2tlck9wZW4iLCJzaG93Vm9pY2VCcm9hZGNhc3RCdXR0b24iLCJvblN0YXJ0Vm9pY2VCcm9hZGNhc3RDbGljayIsIm9uUmVjb3JkU3RhcnRFbmRDbGljayIsIlBvbGxCdXR0b24iLCJSZWFjdCIsIlB1cmVDb21wb25lbnQiLCJjb25zdHJ1Y3RvciIsImFyZ3MiLCJfZGVmaW5lUHJvcGVydHkyIiwiY2FuU2VuZCIsImN1cnJlbnRTdGF0ZSIsIm1heVNlbmRFdmVudCIsIk1fUE9MTF9TVEFSVCIsIm5hbWUiLCJNYXRyaXhDbGllbnRQZWciLCJzYWZlR2V0IiwiZ2V0U2FmZVVzZXJJZCIsIk1vZGFsIiwiY3JlYXRlRGlhbG9nIiwiRXJyb3JEaWFsb2ciLCJkZXNjcmlwdGlvbiIsInRocmVhZElkIiwicmVsX3R5cGUiLCJUSFJFQURfUkVMQVRJT05fVFlQRSIsImV2ZW50X2lkIiwidW5kZWZpbmVkIiwiUG9sbENyZWF0ZURpYWxvZyIsInJlbmRlciIsIm9uQ3JlYXRlQ2xpY2siLCJzZW5kZXIiLCJnZXRNZW1iZXIiLCJMb2NhdGlvbkJ1dHRvbiIsIm14X01lc3NhZ2VDb21wb3Nlcl9wbGFpbl90ZXh0IiwibXhfTWVzc2FnZUNvbXBvc2VyX3JpY2hfdGV4dCIsIl9kZWZhdWx0Il0sInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vc3JjL2NvbXBvbmVudHMvdmlld3Mvcm9vbXMvTWVzc2FnZUNvbXBvc2VyQnV0dG9ucy50c3giXSwic291cmNlc0NvbnRlbnQiOlsiLypcbkNvcHlyaWdodCAyMDI0IE5ldyBWZWN0b3IgTHRkLlxuQ29weXJpZ2h0IDIwMjIgVGhlIE1hdHJpeC5vcmcgRm91bmRhdGlvbiBDLkkuQy5cblxuU1BEWC1MaWNlbnNlLUlkZW50aWZpZXI6IEFHUEwtMy4wLW9ubHkgT1IgR1BMLTMuMC1vbmx5XG5QbGVhc2Ugc2VlIExJQ0VOU0UgZmlsZXMgaW4gdGhlIHJlcG9zaXRvcnkgcm9vdCBmb3IgZnVsbCBkZXRhaWxzLlxuKi9cblxuaW1wb3J0IGNsYXNzTmFtZXMgZnJvbSBcImNsYXNzbmFtZXNcIjtcbmltcG9ydCB7IElFdmVudFJlbGF0aW9uLCBSb29tLCBNYXRyaXhDbGllbnQsIFRIUkVBRF9SRUxBVElPTl9UWVBFLCBNX1BPTExfU1RBUlQgfSBmcm9tIFwibWF0cml4LWpzLXNkay9zcmMvbWF0cml4XCI7XG5pbXBvcnQgUmVhY3QsIHsgY3JlYXRlQ29udGV4dCwgUmVhY3RFbGVtZW50LCBSZWFjdE5vZGUsIHVzZUNvbnRleHQsIHVzZVJlZiB9IGZyb20gXCJyZWFjdFwiO1xuXG5pbXBvcnQgeyBfdCB9IGZyb20gXCIuLi8uLi8uLi9sYW5ndWFnZUhhbmRsZXJcIjtcbmltcG9ydCB7IENvbGxhcHNpYmxlQnV0dG9uIH0gZnJvbSBcIi4vQ29sbGFwc2libGVCdXR0b25cIjtcbmltcG9ydCB7IE1lbnVQcm9wcyB9IGZyb20gXCIuLi8uLi9zdHJ1Y3R1cmVzL0NvbnRleHRNZW51XCI7XG5pbXBvcnQgZGlzIGZyb20gXCIuLi8uLi8uLi9kaXNwYXRjaGVyL2Rpc3BhdGNoZXJcIjtcbmltcG9ydCBFcnJvckRpYWxvZyBmcm9tIFwiLi4vZGlhbG9ncy9FcnJvckRpYWxvZ1wiO1xuaW1wb3J0IHsgTG9jYXRpb25CdXR0b24gfSBmcm9tIFwiLi4vbG9jYXRpb25cIjtcbmltcG9ydCBNb2RhbCBmcm9tIFwiLi4vLi4vLi4vTW9kYWxcIjtcbmltcG9ydCBQb2xsQ3JlYXRlRGlhbG9nIGZyb20gXCIuLi9lbGVtZW50cy9Qb2xsQ3JlYXRlRGlhbG9nXCI7XG5pbXBvcnQgeyBNYXRyaXhDbGllbnRQZWcgfSBmcm9tIFwiLi4vLi4vLi4vTWF0cml4Q2xpZW50UGVnXCI7XG5pbXBvcnQgQ29udGVudE1lc3NhZ2VzIGZyb20gXCIuLi8uLi8uLi9Db250ZW50TWVzc2FnZXNcIjtcbmltcG9ydCBNYXRyaXhDbGllbnRDb250ZXh0IGZyb20gXCIuLi8uLi8uLi9jb250ZXh0cy9NYXRyaXhDbGllbnRDb250ZXh0XCI7XG5pbXBvcnQgUm9vbUNvbnRleHQgZnJvbSBcIi4uLy4uLy4uL2NvbnRleHRzL1Jvb21Db250ZXh0XCI7XG5pbXBvcnQgeyB1c2VEaXNwYXRjaGVyIH0gZnJvbSBcIi4uLy4uLy4uL2hvb2tzL3VzZURpc3BhdGNoZXJcIjtcbmltcG9ydCB7IGNocm9tZUZpbGVJbnB1dEZpeCB9IGZyb20gXCIuLi8uLi8uLi91dGlscy9Ccm93c2VyV29ya2Fyb3VuZHNcIjtcbmltcG9ydCBJY29uaXplZENvbnRleHRNZW51LCB7IEljb25pemVkQ29udGV4dE1lbnVPcHRpb25MaXN0IH0gZnJvbSBcIi4uL2NvbnRleHRfbWVudXMvSWNvbml6ZWRDb250ZXh0TWVudVwiO1xuaW1wb3J0IHsgRW1vamlCdXR0b24gfSBmcm9tIFwiLi9FbW9qaUJ1dHRvblwiO1xuaW1wb3J0IHsgZmlsdGVyQm9vbGVhbiB9IGZyb20gXCIuLi8uLi8uLi91dGlscy9hcnJheXNcIjtcbmltcG9ydCB7IHVzZVNldHRpbmdWYWx1ZSB9IGZyb20gXCIuLi8uLi8uLi9ob29rcy91c2VTZXR0aW5nc1wiO1xuaW1wb3J0IEFjY2Vzc2libGVCdXR0b24sIHsgQnV0dG9uRXZlbnQgfSBmcm9tIFwiLi4vZWxlbWVudHMvQWNjZXNzaWJsZUJ1dHRvblwiO1xuXG5pbnRlcmZhY2UgSVByb3BzIHtcbiAgICBhZGRFbW9qaTogKGVtb2ppOiBzdHJpbmcpID0+IGJvb2xlYW47XG4gICAgaGF2ZVJlY29yZGluZzogYm9vbGVhbjtcbiAgICBpc01lbnVPcGVuOiBib29sZWFuO1xuICAgIGlzU3RpY2tlclBpY2tlck9wZW46IGJvb2xlYW47XG4gICAgbWVudVBvc2l0aW9uPzogTWVudVByb3BzO1xuICAgIG9uUmVjb3JkU3RhcnRFbmRDbGljazogKCkgPT4gdm9pZDtcbiAgICByZWxhdGlvbj86IElFdmVudFJlbGF0aW9uO1xuICAgIHNldFN0aWNrZXJQaWNrZXJPcGVuOiAoaXNTdGlja2VyUGlja2VyT3BlbjogYm9vbGVhbikgPT4gdm9pZDtcbiAgICBzaG93TG9jYXRpb25CdXR0b246IGJvb2xlYW47XG4gICAgc2hvd1BvbGxzQnV0dG9uOiBib29sZWFuO1xuICAgIHNob3dTdGlja2Vyc0J1dHRvbjogYm9vbGVhbjtcbiAgICB0b2dnbGVCdXR0b25NZW51OiAoKSA9PiB2b2lkO1xuICAgIHNob3dWb2ljZUJyb2FkY2FzdEJ1dHRvbjogYm9vbGVhbjtcbiAgICBvblN0YXJ0Vm9pY2VCcm9hZGNhc3RDbGljazogKCkgPT4gdm9pZDtcbiAgICBpc1JpY2hUZXh0RW5hYmxlZDogYm9vbGVhbjtcbiAgICBvbkNvbXBvc2VyTW9kZUNsaWNrOiAoKSA9PiB2b2lkO1xufVxuXG50eXBlIE92ZXJmbG93TWVudUNsb3NlciA9ICgpID0+IHZvaWQ7XG5leHBvcnQgY29uc3QgT3ZlcmZsb3dNZW51Q29udGV4dCA9IGNyZWF0ZUNvbnRleHQ8T3ZlcmZsb3dNZW51Q2xvc2VyIHwgbnVsbD4obnVsbCk7XG5cbmNvbnN0IE1lc3NhZ2VDb21wb3NlckJ1dHRvbnM6IFJlYWN0LkZDPElQcm9wcz4gPSAocHJvcHM6IElQcm9wcykgPT4ge1xuICAgIGNvbnN0IG1hdHJpeENsaWVudCA9IHVzZUNvbnRleHQoTWF0cml4Q2xpZW50Q29udGV4dCk7XG4gICAgY29uc3QgeyByb29tLCBuYXJyb3cgfSA9IHVzZUNvbnRleHQoUm9vbUNvbnRleHQpO1xuXG4gICAgY29uc3QgaXNXeXNpd3lnTGFiRW5hYmxlZCA9IHVzZVNldHRpbmdWYWx1ZTxib29sZWFuPihcImZlYXR1cmVfd3lzaXd5Z19jb21wb3NlclwiKTtcblxuICAgIGlmICghbWF0cml4Q2xpZW50IHx8ICFyb29tIHx8IHByb3BzLmhhdmVSZWNvcmRpbmcpIHtcbiAgICAgICAgcmV0dXJuIG51bGw7XG4gICAgfVxuXG4gICAgbGV0IG1haW5CdXR0b25zOiBSZWFjdE5vZGVbXTtcbiAgICBsZXQgbW9yZUJ1dHRvbnM6IFJlYWN0Tm9kZVtdO1xuICAgIGlmIChuYXJyb3cpIHtcbiAgICAgICAgbWFpbkJ1dHRvbnMgPSBbXG4gICAgICAgICAgICBpc1d5c2l3eWdMYWJFbmFibGVkID8gKFxuICAgICAgICAgICAgICAgIDxDb21wb3Nlck1vZGVCdXR0b25cbiAgICAgICAgICAgICAgICAgICAga2V5PVwiY29tcG9zZXJNb2RlQnV0dG9uXCJcbiAgICAgICAgICAgICAgICAgICAgaXNSaWNoVGV4dEVuYWJsZWQ9e3Byb3BzLmlzUmljaFRleHRFbmFibGVkfVxuICAgICAgICAgICAgICAgICAgICBvbkNsaWNrPXtwcm9wcy5vbkNvbXBvc2VyTW9kZUNsaWNrfVxuICAgICAgICAgICAgICAgIC8+XG4gICAgICAgICAgICApIDogKFxuICAgICAgICAgICAgICAgIGVtb2ppQnV0dG9uKHByb3BzKVxuICAgICAgICAgICAgKSxcbiAgICAgICAgXTtcbiAgICAgICAgbW9yZUJ1dHRvbnMgPSBbXG4gICAgICAgICAgICB1cGxvYWRCdXR0b24oKSwgLy8gcHJvcHMgcGFzc2VkIHZpYSBVcGxvYWRCdXR0b25Db250ZXh0XG4gICAgICAgICAgICBzaG93U3RpY2tlcnNCdXR0b24ocHJvcHMpLFxuICAgICAgICAgICAgdm9pY2VSZWNvcmRpbmdCdXR0b24ocHJvcHMsIG5hcnJvdyksXG4gICAgICAgICAgICBzdGFydFZvaWNlQnJvYWRjYXN0QnV0dG9uKHByb3BzKSxcbiAgICAgICAgICAgIHByb3BzLnNob3dQb2xsc0J1dHRvbiA/IHBvbGxCdXR0b24ocm9vbSwgcHJvcHMucmVsYXRpb24pIDogbnVsbCxcbiAgICAgICAgICAgIHNob3dMb2NhdGlvbkJ1dHRvbihwcm9wcywgcm9vbSwgbWF0cml4Q2xpZW50KSxcbiAgICAgICAgXTtcbiAgICB9IGVsc2Uge1xuICAgICAgICBtYWluQnV0dG9ucyA9IFtcbiAgICAgICAgICAgIGlzV3lzaXd5Z0xhYkVuYWJsZWQgPyAoXG4gICAgICAgICAgICAgICAgPENvbXBvc2VyTW9kZUJ1dHRvblxuICAgICAgICAgICAgICAgICAgICBrZXk9XCJjb21wb3Nlck1vZGVCdXR0b25cIlxuICAgICAgICAgICAgICAgICAgICBpc1JpY2hUZXh0RW5hYmxlZD17cHJvcHMuaXNSaWNoVGV4dEVuYWJsZWR9XG4gICAgICAgICAgICAgICAgICAgIG9uQ2xpY2s9e3Byb3BzLm9uQ29tcG9zZXJNb2RlQ2xpY2t9XG4gICAgICAgICAgICAgICAgLz5cbiAgICAgICAgICAgICkgOiAoXG4gICAgICAgICAgICAgICAgZW1vamlCdXR0b24ocHJvcHMpXG4gICAgICAgICAgICApLFxuICAgICAgICAgICAgdXBsb2FkQnV0dG9uKCksIC8vIHByb3BzIHBhc3NlZCB2aWEgVXBsb2FkQnV0dG9uQ29udGV4dFxuICAgICAgICBdO1xuICAgICAgICBtb3JlQnV0dG9ucyA9IFtcbiAgICAgICAgICAgIHNob3dTdGlja2Vyc0J1dHRvbihwcm9wcyksXG4gICAgICAgICAgICB2b2ljZVJlY29yZGluZ0J1dHRvbihwcm9wcywgbmFycm93KSxcbiAgICAgICAgICAgIHN0YXJ0Vm9pY2VCcm9hZGNhc3RCdXR0b24ocHJvcHMpLFxuICAgICAgICAgICAgcHJvcHMuc2hvd1BvbGxzQnV0dG9uID8gcG9sbEJ1dHRvbihyb29tLCBwcm9wcy5yZWxhdGlvbikgOiBudWxsLFxuICAgICAgICAgICAgc2hvd0xvY2F0aW9uQnV0dG9uKHByb3BzLCByb29tLCBtYXRyaXhDbGllbnQpLFxuICAgICAgICBdO1xuICAgIH1cblxuICAgIG1haW5CdXR0b25zID0gZmlsdGVyQm9vbGVhbihtYWluQnV0dG9ucyk7XG4gICAgbW9yZUJ1dHRvbnMgPSBmaWx0ZXJCb29sZWFuKG1vcmVCdXR0b25zKTtcblxuICAgIGNvbnN0IG1vcmVPcHRpb25zQ2xhc3NlcyA9IGNsYXNzTmFtZXMoe1xuICAgICAgICBteF9NZXNzYWdlQ29tcG9zZXJfYnV0dG9uOiB0cnVlLFxuICAgICAgICBteF9NZXNzYWdlQ29tcG9zZXJfYnV0dG9uTWVudTogdHJ1ZSxcbiAgICAgICAgbXhfTWVzc2FnZUNvbXBvc2VyX2Nsb3NlQnV0dG9uTWVudTogcHJvcHMuaXNNZW51T3BlbixcbiAgICB9KTtcblxuICAgIHJldHVybiAoXG4gICAgICAgIDxVcGxvYWRCdXR0b25Db250ZXh0UHJvdmlkZXIgcm9vbUlkPXtyb29tLnJvb21JZH0gcmVsYXRpb249e3Byb3BzLnJlbGF0aW9ufT5cbiAgICAgICAgICAgIHttYWluQnV0dG9uc31cbiAgICAgICAgICAgIHttb3JlQnV0dG9ucy5sZW5ndGggPiAwICYmIChcbiAgICAgICAgICAgICAgICA8QWNjZXNzaWJsZUJ1dHRvblxuICAgICAgICAgICAgICAgICAgICBjbGFzc05hbWU9e21vcmVPcHRpb25zQ2xhc3Nlc31cbiAgICAgICAgICAgICAgICAgICAgb25DbGljaz17cHJvcHMudG9nZ2xlQnV0dG9uTWVudX1cbiAgICAgICAgICAgICAgICAgICAgdGl0bGU9e190KFwicXVpY2tfc2V0dGluZ3N8c2lkZWJhcl9zZXR0aW5nc1wiKX1cbiAgICAgICAgICAgICAgICAvPlxuICAgICAgICAgICAgKX1cbiAgICAgICAgICAgIHtwcm9wcy5pc01lbnVPcGVuICYmIChcbiAgICAgICAgICAgICAgICA8SWNvbml6ZWRDb250ZXh0TWVudVxuICAgICAgICAgICAgICAgICAgICBvbkZpbmlzaGVkPXtwcm9wcy50b2dnbGVCdXR0b25NZW51fVxuICAgICAgICAgICAgICAgICAgICB7Li4ucHJvcHMubWVudVBvc2l0aW9ufVxuICAgICAgICAgICAgICAgICAgICB3cmFwcGVyQ2xhc3NOYW1lPVwibXhfTWVzc2FnZUNvbXBvc2VyX01lbnVcIlxuICAgICAgICAgICAgICAgICAgICBjb21wYWN0PXt0cnVlfVxuICAgICAgICAgICAgICAgID5cbiAgICAgICAgICAgICAgICAgICAgPE92ZXJmbG93TWVudUNvbnRleHQuUHJvdmlkZXIgdmFsdWU9e3Byb3BzLnRvZ2dsZUJ1dHRvbk1lbnV9PlxuICAgICAgICAgICAgICAgICAgICAgICAgPEljb25pemVkQ29udGV4dE1lbnVPcHRpb25MaXN0Pnttb3JlQnV0dG9uc308L0ljb25pemVkQ29udGV4dE1lbnVPcHRpb25MaXN0PlxuICAgICAgICAgICAgICAgICAgICA8L092ZXJmbG93TWVudUNvbnRleHQuUHJvdmlkZXI+XG4gICAgICAgICAgICAgICAgPC9JY29uaXplZENvbnRleHRNZW51PlxuICAgICAgICAgICAgKX1cbiAgICAgICAgPC9VcGxvYWRCdXR0b25Db250ZXh0UHJvdmlkZXI+XG4gICAgKTtcbn07XG5cbmZ1bmN0aW9uIGVtb2ppQnV0dG9uKHByb3BzOiBJUHJvcHMpOiBSZWFjdEVsZW1lbnQge1xuICAgIHJldHVybiAoXG4gICAgICAgIDxFbW9qaUJ1dHRvblxuICAgICAgICAgICAga2V5PVwiZW1vamlfYnV0dG9uXCJcbiAgICAgICAgICAgIGFkZEVtb2ppPXtwcm9wcy5hZGRFbW9qaX1cbiAgICAgICAgICAgIG1lbnVQb3NpdGlvbj17cHJvcHMubWVudVBvc2l0aW9ufVxuICAgICAgICAgICAgY2xhc3NOYW1lPVwibXhfTWVzc2FnZUNvbXBvc2VyX2J1dHRvblwiXG4gICAgICAgIC8+XG4gICAgKTtcbn1cblxuZnVuY3Rpb24gdXBsb2FkQnV0dG9uKCk6IFJlYWN0RWxlbWVudCB7XG4gICAgcmV0dXJuIDxVcGxvYWRCdXR0b24ga2V5PVwiY29udHJvbHNfdXBsb2FkXCIgLz47XG59XG5cbnR5cGUgVXBsb2FkQnV0dG9uRm4gPSAoKSA9PiB2b2lkO1xuZXhwb3J0IGNvbnN0IFVwbG9hZEJ1dHRvbkNvbnRleHQgPSBjcmVhdGVDb250ZXh0PFVwbG9hZEJ1dHRvbkZuIHwgbnVsbD4obnVsbCk7XG5cbmludGVyZmFjZSBJVXBsb2FkQnV0dG9uUHJvcHMge1xuICAgIHJvb21JZDogc3RyaW5nO1xuICAgIHJlbGF0aW9uPzogSUV2ZW50UmVsYXRpb247XG4gICAgY2hpbGRyZW46IFJlYWN0Tm9kZTtcbn1cblxuLy8gV2UgcHV0IHRoZSBmaWxlIGlucHV0IG91dHNpZGUgdGhlIFVwbG9hZEJ1dHRvbiBjb21wb25lbnQgc28gdGhhdCBpdCBkb2Vzbid0IGdldCBraWxsZWQgd2hlbiB0aGUgY29udGV4dCBtZW51IGNsb3Nlcy5cbmNvbnN0IFVwbG9hZEJ1dHRvbkNvbnRleHRQcm92aWRlcjogUmVhY3QuRkM8SVVwbG9hZEJ1dHRvblByb3BzPiA9ICh7IHJvb21JZCwgcmVsYXRpb24sIGNoaWxkcmVuIH0pID0+IHtcbiAgICBjb25zdCBjbGkgPSB1c2VDb250ZXh0KE1hdHJpeENsaWVudENvbnRleHQpO1xuICAgIGNvbnN0IHJvb21Db250ZXh0ID0gdXNlQ29udGV4dChSb29tQ29udGV4dCk7XG4gICAgY29uc3QgdXBsb2FkSW5wdXQgPSB1c2VSZWY8SFRNTElucHV0RWxlbWVudD4obnVsbCk7XG5cbiAgICBjb25zdCBvblVwbG9hZENsaWNrID0gKCk6IHZvaWQgPT4ge1xuICAgICAgICBpZiAoY2xpPy5pc0d1ZXN0KCkpIHtcbiAgICAgICAgICAgIGRpcy5kaXNwYXRjaCh7IGFjdGlvbjogXCJyZXF1aXJlX3JlZ2lzdHJhdGlvblwiIH0pO1xuICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICB9XG4gICAgICAgIHVwbG9hZElucHV0LmN1cnJlbnQ/LmNsaWNrKCk7XG4gICAgfTtcblxuICAgIHVzZURpc3BhdGNoZXIoZGlzLCAocGF5bG9hZCkgPT4ge1xuICAgICAgICBpZiAocm9vbUNvbnRleHQudGltZWxpbmVSZW5kZXJpbmdUeXBlID09PSBwYXlsb2FkLmNvbnRleHQgJiYgcGF5bG9hZC5hY3Rpb24gPT09IFwidXBsb2FkX2ZpbGVcIikge1xuICAgICAgICAgICAgb25VcGxvYWRDbGljaygpO1xuICAgICAgICB9XG4gICAgfSk7XG5cbiAgICBjb25zdCBvblVwbG9hZEZpbGVJbnB1dENoYW5nZSA9IChldjogUmVhY3QuQ2hhbmdlRXZlbnQ8SFRNTElucHV0RWxlbWVudD4pOiB2b2lkID0+IHtcbiAgICAgICAgaWYgKGV2LnRhcmdldC5maWxlcz8ubGVuZ3RoID09PSAwKSByZXR1cm47XG5cbiAgICAgICAgLy8gVGFrZSBhIGNvcHksIHNvIHdlIGNhbiBzYWZlbHkgcmVzZXQgdGhlIHZhbHVlIG9mIHRoZSBmb3JtIGNvbnRyb2xcbiAgICAgICAgQ29udGVudE1lc3NhZ2VzLnNoYXJlZEluc3RhbmNlKCkuc2VuZENvbnRlbnRMaXN0VG9Sb29tKFxuICAgICAgICAgICAgQXJyYXkuZnJvbShldi50YXJnZXQuZmlsZXMhKSxcbiAgICAgICAgICAgIHJvb21JZCxcbiAgICAgICAgICAgIHJlbGF0aW9uLFxuICAgICAgICAgICAgY2xpLFxuICAgICAgICAgICAgcm9vbUNvbnRleHQudGltZWxpbmVSZW5kZXJpbmdUeXBlLFxuICAgICAgICApO1xuXG4gICAgICAgIC8vIFRoaXMgaXMgdGhlIG9uQ2hhbmdlIGhhbmRsZXIgZm9yIGEgZmlsZSBmb3JtIGNvbnRyb2wsIGJ1dCB3ZSdyZVxuICAgICAgICAvLyBub3Qga2VlcGluZyBhbnkgc3RhdGUsIHNvIHJlc2V0IHRoZSB2YWx1ZSBvZiB0aGUgZm9ybSBjb250cm9sXG4gICAgICAgIC8vIHRvIGVtcHR5LlxuICAgICAgICAvLyBOQi4gd2UgbmVlZCB0byBzZXQgJ3ZhbHVlJzogdGhlICdmaWxlcycgcHJvcGVydHkgaXMgaW1tdXRhYmxlLlxuICAgICAgICBldi50YXJnZXQudmFsdWUgPSBcIlwiO1xuICAgIH07XG5cbiAgICBjb25zdCB1cGxvYWRJbnB1dFN0eWxlID0geyBkaXNwbGF5OiBcIm5vbmVcIiB9O1xuICAgIHJldHVybiAoXG4gICAgICAgIDxVcGxvYWRCdXR0b25Db250ZXh0LlByb3ZpZGVyIHZhbHVlPXtvblVwbG9hZENsaWNrfT5cbiAgICAgICAgICAgIHtjaGlsZHJlbn1cblxuICAgICAgICAgICAgPGlucHV0XG4gICAgICAgICAgICAgICAgcmVmPXt1cGxvYWRJbnB1dH1cbiAgICAgICAgICAgICAgICB0eXBlPVwiZmlsZVwiXG4gICAgICAgICAgICAgICAgc3R5bGU9e3VwbG9hZElucHV0U3R5bGV9XG4gICAgICAgICAgICAgICAgbXVsdGlwbGVcbiAgICAgICAgICAgICAgICBvbkNsaWNrPXtjaHJvbWVGaWxlSW5wdXRGaXh9XG4gICAgICAgICAgICAgICAgb25DaGFuZ2U9e29uVXBsb2FkRmlsZUlucHV0Q2hhbmdlfVxuICAgICAgICAgICAgLz5cbiAgICAgICAgPC9VcGxvYWRCdXR0b25Db250ZXh0LlByb3ZpZGVyPlxuICAgICk7XG59O1xuXG4vLyBNdXN0IGJlIHJlbmRlcmVkIHdpdGhpbiBhbiBVcGxvYWRCdXR0b25Db250ZXh0UHJvdmlkZXJcbmNvbnN0IFVwbG9hZEJ1dHRvbjogUmVhY3QuRkMgPSAoKSA9PiB7XG4gICAgY29uc3Qgb3ZlcmZsb3dNZW51Q2xvc2VyID0gdXNlQ29udGV4dChPdmVyZmxvd01lbnVDb250ZXh0KTtcbiAgICBjb25zdCB1cGxvYWRCdXR0b25GbiA9IHVzZUNvbnRleHQoVXBsb2FkQnV0dG9uQ29udGV4dCk7XG5cbiAgICBjb25zdCBvbkNsaWNrID0gKCk6IHZvaWQgPT4ge1xuICAgICAgICB1cGxvYWRCdXR0b25Gbj8uKCk7XG4gICAgICAgIG92ZXJmbG93TWVudUNsb3Nlcj8uKCk7IC8vIGNsb3NlIG92ZXJmbG93IG1lbnVcbiAgICB9O1xuXG4gICAgcmV0dXJuIChcbiAgICAgICAgPENvbGxhcHNpYmxlQnV0dG9uXG4gICAgICAgICAgICBjbGFzc05hbWU9XCJteF9NZXNzYWdlQ29tcG9zZXJfYnV0dG9uXCJcbiAgICAgICAgICAgIGljb25DbGFzc05hbWU9XCJteF9NZXNzYWdlQ29tcG9zZXJfdXBsb2FkXCJcbiAgICAgICAgICAgIG9uQ2xpY2s9e29uQ2xpY2t9XG4gICAgICAgICAgICB0aXRsZT17X3QoXCJjb21tb258YXR0YWNobWVudFwiKX1cbiAgICAgICAgLz5cbiAgICApO1xufTtcblxuZnVuY3Rpb24gc2hvd1N0aWNrZXJzQnV0dG9uKHByb3BzOiBJUHJvcHMpOiBSZWFjdEVsZW1lbnQgfCBudWxsIHtcbiAgICByZXR1cm4gcHJvcHMuc2hvd1N0aWNrZXJzQnV0dG9uID8gKFxuICAgICAgICA8Q29sbGFwc2libGVCdXR0b25cbiAgICAgICAgICAgIGlkPVwic3RpY2tlcnNCdXR0b25cIlxuICAgICAgICAgICAga2V5PVwiY29udHJvbHNfc3RpY2tlcnNcIlxuICAgICAgICAgICAgY2xhc3NOYW1lPVwibXhfTWVzc2FnZUNvbXBvc2VyX2J1dHRvblwiXG4gICAgICAgICAgICBpY29uQ2xhc3NOYW1lPVwibXhfTWVzc2FnZUNvbXBvc2VyX3N0aWNrZXJzXCJcbiAgICAgICAgICAgIG9uQ2xpY2s9eygpID0+IHByb3BzLnNldFN0aWNrZXJQaWNrZXJPcGVuKCFwcm9wcy5pc1N0aWNrZXJQaWNrZXJPcGVuKX1cbiAgICAgICAgICAgIHRpdGxlPXtwcm9wcy5pc1N0aWNrZXJQaWNrZXJPcGVuID8gX3QoXCJjb21wb3NlcnxjbG9zZV9zdGlja2VyX3BpY2tlclwiKSA6IF90KFwiY29tbW9ufHN0aWNrZXJcIil9XG4gICAgICAgIC8+XG4gICAgKSA6IG51bGw7XG59XG5cbmNvbnN0IHN0YXJ0Vm9pY2VCcm9hZGNhc3RCdXR0b246IFJlYWN0LkZDPElQcm9wcz4gPSAocHJvcHM6IElQcm9wcyk6IFJlYWN0RWxlbWVudCB8IG51bGwgPT4ge1xuICAgIHJldHVybiBwcm9wcy5zaG93Vm9pY2VCcm9hZGNhc3RCdXR0b24gPyAoXG4gICAgICAgIDxDb2xsYXBzaWJsZUJ1dHRvblxuICAgICAgICAgICAga2V5PVwic3RhcnRfdm9pY2VfYnJvYWRjYXN0XCJcbiAgICAgICAgICAgIGNsYXNzTmFtZT1cIm14X01lc3NhZ2VDb21wb3Nlcl9idXR0b25cIlxuICAgICAgICAgICAgaWNvbkNsYXNzTmFtZT1cIm14X01lc3NhZ2VDb21wb3Nlcl92b2ljZUJyb2FkY2FzdFwiXG4gICAgICAgICAgICBvbkNsaWNrPXtwcm9wcy5vblN0YXJ0Vm9pY2VCcm9hZGNhc3RDbGlja31cbiAgICAgICAgICAgIHRpdGxlPXtfdChcInZvaWNlX2Jyb2FkY2FzdHxhY3Rpb25cIil9XG4gICAgICAgIC8+XG4gICAgKSA6IG51bGw7XG59O1xuXG5mdW5jdGlvbiB2b2ljZVJlY29yZGluZ0J1dHRvbihwcm9wczogSVByb3BzLCBuYXJyb3c6IGJvb2xlYW4pOiBSZWFjdEVsZW1lbnQgfCBudWxsIHtcbiAgICAvLyBYWFg6IHJlY29yZGluZyBVSSBkb2VzIG5vdCB3b3JrIHdlbGwgaW4gbmFycm93IG1vZGUsIHNvIGhpZGUgZm9yIG5vd1xuICAgIHJldHVybiBuYXJyb3cgPyBudWxsIDogKFxuICAgICAgICA8Q29sbGFwc2libGVCdXR0b25cbiAgICAgICAgICAgIGtleT1cInZvaWNlX21lc3NhZ2Vfc2VuZFwiXG4gICAgICAgICAgICBjbGFzc05hbWU9XCJteF9NZXNzYWdlQ29tcG9zZXJfYnV0dG9uXCJcbiAgICAgICAgICAgIGljb25DbGFzc05hbWU9XCJteF9NZXNzYWdlQ29tcG9zZXJfdm9pY2VNZXNzYWdlXCJcbiAgICAgICAgICAgIG9uQ2xpY2s9e3Byb3BzLm9uUmVjb3JkU3RhcnRFbmRDbGlja31cbiAgICAgICAgICAgIHRpdGxlPXtfdChcImNvbXBvc2VyfHZvaWNlX21lc3NhZ2VfYnV0dG9uXCIpfVxuICAgICAgICAvPlxuICAgICk7XG59XG5cbmZ1bmN0aW9uIHBvbGxCdXR0b24ocm9vbTogUm9vbSwgcmVsYXRpb24/OiBJRXZlbnRSZWxhdGlvbik6IFJlYWN0RWxlbWVudCB7XG4gICAgcmV0dXJuIDxQb2xsQnV0dG9uIGtleT1cInBvbGxzXCIgcm9vbT17cm9vbX0gcmVsYXRpb249e3JlbGF0aW9ufSAvPjtcbn1cblxuaW50ZXJmYWNlIElQb2xsQnV0dG9uUHJvcHMge1xuICAgIHJvb206IFJvb207XG4gICAgcmVsYXRpb24/OiBJRXZlbnRSZWxhdGlvbjtcbn1cblxuY2xhc3MgUG9sbEJ1dHRvbiBleHRlbmRzIFJlYWN0LlB1cmVDb21wb25lbnQ8SVBvbGxCdXR0b25Qcm9wcz4ge1xuICAgIHB1YmxpYyBzdGF0aWMgY29udGV4dFR5cGUgPSBPdmVyZmxvd01lbnVDb250ZXh0O1xuICAgIHB1YmxpYyBkZWNsYXJlIGNvbnRleHQ6IFJlYWN0LkNvbnRleHRUeXBlPHR5cGVvZiBPdmVyZmxvd01lbnVDb250ZXh0PjtcblxuICAgIHByaXZhdGUgb25DcmVhdGVDbGljayA9ICgpOiB2b2lkID0+IHtcbiAgICAgICAgdGhpcy5jb250ZXh0Py4oKTsgLy8gY2xvc2Ugb3ZlcmZsb3cgbWVudVxuICAgICAgICBjb25zdCBjYW5TZW5kID0gdGhpcy5wcm9wcy5yb29tLmN1cnJlbnRTdGF0ZS5tYXlTZW5kRXZlbnQoXG4gICAgICAgICAgICBNX1BPTExfU1RBUlQubmFtZSxcbiAgICAgICAgICAgIE1hdHJpeENsaWVudFBlZy5zYWZlR2V0KCkuZ2V0U2FmZVVzZXJJZCgpLFxuICAgICAgICApO1xuICAgICAgICBpZiAoIWNhblNlbmQpIHtcbiAgICAgICAgICAgIE1vZGFsLmNyZWF0ZURpYWxvZyhFcnJvckRpYWxvZywge1xuICAgICAgICAgICAgICAgIHRpdGxlOiBfdChcImNvbXBvc2VyfHBvbGxfYnV0dG9uX25vX3Blcm1zX3RpdGxlXCIpLFxuICAgICAgICAgICAgICAgIGRlc2NyaXB0aW9uOiBfdChcImNvbXBvc2VyfHBvbGxfYnV0dG9uX25vX3Blcm1zX2Rlc2NyaXB0aW9uXCIpLFxuICAgICAgICAgICAgfSk7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICBjb25zdCB0aHJlYWRJZCA9XG4gICAgICAgICAgICAgICAgdGhpcy5wcm9wcy5yZWxhdGlvbj8ucmVsX3R5cGUgPT09IFRIUkVBRF9SRUxBVElPTl9UWVBFLm5hbWUgPyB0aGlzLnByb3BzLnJlbGF0aW9uLmV2ZW50X2lkIDogdW5kZWZpbmVkO1xuXG4gICAgICAgICAgICBNb2RhbC5jcmVhdGVEaWFsb2coXG4gICAgICAgICAgICAgICAgUG9sbENyZWF0ZURpYWxvZyxcbiAgICAgICAgICAgICAgICB7XG4gICAgICAgICAgICAgICAgICAgIHJvb206IHRoaXMucHJvcHMucm9vbSxcbiAgICAgICAgICAgICAgICAgICAgdGhyZWFkSWQsXG4gICAgICAgICAgICAgICAgfSxcbiAgICAgICAgICAgICAgICBcIm14X0NvbXBvdW5kRGlhbG9nXCIsXG4gICAgICAgICAgICAgICAgZmFsc2UsIC8vIGlzUHJpb3JpdHlNb2RhbFxuICAgICAgICAgICAgICAgIHRydWUsIC8vIGlzU3RhdGljTW9kYWxcbiAgICAgICAgICAgICk7XG4gICAgICAgIH1cbiAgICB9O1xuXG4gICAgcHVibGljIHJlbmRlcigpOiBSZWFjdC5SZWFjdE5vZGUge1xuICAgICAgICAvLyBkbyBub3QgYWxsb3cgc2VuZGluZyBwb2xscyB3aXRoaW4gdGhyZWFkcyBhdCB0aGlzIHRpbWVcbiAgICAgICAgaWYgKHRoaXMucHJvcHMucmVsYXRpb24/LnJlbF90eXBlID09PSBUSFJFQURfUkVMQVRJT05fVFlQRS5uYW1lKSByZXR1cm4gbnVsbDtcblxuICAgICAgICByZXR1cm4gKFxuICAgICAgICAgICAgPENvbGxhcHNpYmxlQnV0dG9uXG4gICAgICAgICAgICAgICAgY2xhc3NOYW1lPVwibXhfTWVzc2FnZUNvbXBvc2VyX2J1dHRvblwiXG4gICAgICAgICAgICAgICAgaWNvbkNsYXNzTmFtZT1cIm14X01lc3NhZ2VDb21wb3Nlcl9wb2xsXCJcbiAgICAgICAgICAgICAgICBvbkNsaWNrPXt0aGlzLm9uQ3JlYXRlQ2xpY2t9XG4gICAgICAgICAgICAgICAgdGl0bGU9e190KFwiY29tcG9zZXJ8cG9sbF9idXR0b25cIil9XG4gICAgICAgICAgICAvPlxuICAgICAgICApO1xuICAgIH1cbn1cblxuZnVuY3Rpb24gc2hvd0xvY2F0aW9uQnV0dG9uKHByb3BzOiBJUHJvcHMsIHJvb206IFJvb20sIG1hdHJpeENsaWVudDogTWF0cml4Q2xpZW50KTogUmVhY3RFbGVtZW50IHwgbnVsbCB7XG4gICAgY29uc3Qgc2VuZGVyID0gcm9vbS5nZXRNZW1iZXIobWF0cml4Q2xpZW50LmdldFNhZmVVc2VySWQoKSk7XG5cbiAgICByZXR1cm4gcHJvcHMuc2hvd0xvY2F0aW9uQnV0dG9uICYmIHNlbmRlciA/IChcbiAgICAgICAgPExvY2F0aW9uQnV0dG9uXG4gICAgICAgICAgICBrZXk9XCJsb2NhdGlvblwiXG4gICAgICAgICAgICByb29tSWQ9e3Jvb20ucm9vbUlkfVxuICAgICAgICAgICAgcmVsYXRpb249e3Byb3BzLnJlbGF0aW9ufVxuICAgICAgICAgICAgc2VuZGVyPXtzZW5kZXJ9XG4gICAgICAgICAgICBtZW51UG9zaXRpb249e3Byb3BzLm1lbnVQb3NpdGlvbn1cbiAgICAgICAgLz5cbiAgICApIDogbnVsbDtcbn1cblxuaW50ZXJmYWNlIFd5c2l3eWdUb2dnbGVCdXR0b25Qcm9wcyB7XG4gICAgaXNSaWNoVGV4dEVuYWJsZWQ6IGJvb2xlYW47XG4gICAgb25DbGljazogKGV2OiBCdXR0b25FdmVudCkgPT4gdm9pZDtcbn1cblxuZnVuY3Rpb24gQ29tcG9zZXJNb2RlQnV0dG9uKHsgaXNSaWNoVGV4dEVuYWJsZWQsIG9uQ2xpY2sgfTogV3lzaXd5Z1RvZ2dsZUJ1dHRvblByb3BzKTogSlNYLkVsZW1lbnQge1xuICAgIGNvbnN0IHRpdGxlID0gaXNSaWNoVGV4dEVuYWJsZWQgPyBfdChcImNvbXBvc2VyfG1vZGVfcGxhaW5cIikgOiBfdChcImNvbXBvc2VyfG1vZGVfcmljaF90ZXh0XCIpO1xuXG4gICAgcmV0dXJuIChcbiAgICAgICAgPENvbGxhcHNpYmxlQnV0dG9uXG4gICAgICAgICAgICBjbGFzc05hbWU9XCJteF9NZXNzYWdlQ29tcG9zZXJfYnV0dG9uXCJcbiAgICAgICAgICAgIGljb25DbGFzc05hbWU9e2NsYXNzTmFtZXMoe1xuICAgICAgICAgICAgICAgIG14X01lc3NhZ2VDb21wb3Nlcl9wbGFpbl90ZXh0OiAhaXNSaWNoVGV4dEVuYWJsZWQsXG4gICAgICAgICAgICAgICAgbXhfTWVzc2FnZUNvbXBvc2VyX3JpY2hfdGV4dDogaXNSaWNoVGV4dEVuYWJsZWQsXG4gICAgICAgICAgICB9KX1cbiAgICAgICAgICAgIG9uQ2xpY2s9e29uQ2xpY2t9XG4gICAgICAgICAgICB0aXRsZT17dGl0bGV9XG4gICAgICAgIC8+XG4gICAgKTtcbn1cblxuZXhwb3J0IGRlZmF1bHQgTWVzc2FnZUNvbXBvc2VyQnV0dG9ucztcbiJdLCJtYXBwaW5ncyI6Ijs7Ozs7Ozs7O0FBUUEsSUFBQUEsV0FBQSxHQUFBQyxzQkFBQSxDQUFBQyxPQUFBO0FBQ0EsSUFBQUMsT0FBQSxHQUFBRCxPQUFBO0FBQ0EsSUFBQUUsTUFBQSxHQUFBQyx1QkFBQSxDQUFBSCxPQUFBO0FBRUEsSUFBQUksZ0JBQUEsR0FBQUosT0FBQTtBQUNBLElBQUFLLGtCQUFBLEdBQUFMLE9BQUE7QUFFQSxJQUFBTSxXQUFBLEdBQUFQLHNCQUFBLENBQUFDLE9BQUE7QUFDQSxJQUFBTyxZQUFBLEdBQUFSLHNCQUFBLENBQUFDLE9BQUE7QUFDQSxJQUFBUSxTQUFBLEdBQUFSLE9BQUE7QUFDQSxJQUFBUyxNQUFBLEdBQUFWLHNCQUFBLENBQUFDLE9BQUE7QUFDQSxJQUFBVSxpQkFBQSxHQUFBWCxzQkFBQSxDQUFBQyxPQUFBO0FBQ0EsSUFBQVcsZ0JBQUEsR0FBQVgsT0FBQTtBQUNBLElBQUFZLGdCQUFBLEdBQUFiLHNCQUFBLENBQUFDLE9BQUE7QUFDQSxJQUFBYSxvQkFBQSxHQUFBZCxzQkFBQSxDQUFBQyxPQUFBO0FBQ0EsSUFBQWMsWUFBQSxHQUFBZixzQkFBQSxDQUFBQyxPQUFBO0FBQ0EsSUFBQWUsY0FBQSxHQUFBZixPQUFBO0FBQ0EsSUFBQWdCLG1CQUFBLEdBQUFoQixPQUFBO0FBQ0EsSUFBQWlCLG9CQUFBLEdBQUFkLHVCQUFBLENBQUFILE9BQUE7QUFDQSxJQUFBa0IsWUFBQSxHQUFBbEIsT0FBQTtBQUNBLElBQUFtQixPQUFBLEdBQUFuQixPQUFBO0FBQ0EsSUFBQW9CLFlBQUEsR0FB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