matrix-react-sdk
Version:
SDK for matrix.org using React
349 lines (298 loc) • 46.2 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 = exports.AddExistingToSpace = void 0;
var _react = _interopRequireWildcard(require("react"));
var _classnames = _interopRequireDefault(require("classnames"));
var _languageHandler = require("../../../languageHandler");
var _BaseDialog = _interopRequireDefault(require("./BaseDialog"));
var _Dropdown = _interopRequireDefault(require("../elements/Dropdown"));
var _SearchBox = _interopRequireDefault(require("../../structures/SearchBox"));
var _SpaceStore = _interopRequireDefault(require("../../../stores/SpaceStore"));
var _RoomAvatar = _interopRequireDefault(require("../avatars/RoomAvatar"));
var _Rooms = require("../../../Rooms");
var _AccessibleButton = _interopRequireDefault(require("../elements/AccessibleButton"));
var _AutoHideScrollbar = _interopRequireDefault(require("../../structures/AutoHideScrollbar"));
var _promise = require("../../../utils/promise");
var _DMRoomMap = _interopRequireDefault(require("../../../utils/DMRoomMap"));
var _Permalinks = require("../../../utils/permalinks/Permalinks");
var _StyledCheckbox = _interopRequireDefault(require("../elements/StyledCheckbox"));
var _MatrixClientContext = _interopRequireDefault(require("../../../contexts/MatrixClientContext"));
var _RecentAlgorithm = require("../../../stores/room-list/algorithms/tag-sorting/RecentAlgorithm");
var _ProgressBar = _interopRequireDefault(require("../elements/ProgressBar"));
var _SpaceRoomView = require("../../structures/SpaceRoomView");
var _DecoratedRoomAvatar = _interopRequireDefault(require("../avatars/DecoratedRoomAvatar"));
var _QueryMatcher = _interopRequireDefault(require("../../../autocomplete/QueryMatcher"));
/*
Copyright 2021 The Matrix.org Foundation C.I.C.
Licensed under the Apache License, Version 2.0 (the "License");
you may not use this file except in compliance with the License.
You may obtain a copy of the License at
http://www.apache.org/licenses/LICENSE-2.0
Unless required by applicable law or agreed to in writing, software
distributed under the License is distributed on an "AS IS" BASIS,
WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
See the License for the specific language governing permissions and
limitations under the License.
*/
const Entry = ({
room,
checked,
onChange
}) => {
return /*#__PURE__*/_react.default.createElement("label", {
className: "mx_AddExistingToSpace_entry"
}, room?.isSpaceRoom() ? /*#__PURE__*/_react.default.createElement(_RoomAvatar.default, {
room: room,
height: 32,
width: 32
}) : /*#__PURE__*/_react.default.createElement(_DecoratedRoomAvatar.default, {
room: room,
avatarSize: 32
}), /*#__PURE__*/_react.default.createElement("span", {
className: "mx_AddExistingToSpace_entry_name"
}, room.name), /*#__PURE__*/_react.default.createElement(_StyledCheckbox.default, {
onChange: onChange ? e => onChange(e.target.checked) : null,
checked: checked,
disabled: !onChange
}));
};
const AddExistingToSpace
/*: React.FC<IAddExistingToSpaceProps>*/
= ({
space,
footerPrompt,
emptySelectionButton,
onFinished
}) => {
const cli = (0, _react.useContext)(_MatrixClientContext.default);
const visibleRooms = (0, _react.useMemo)(() => cli.getVisibleRooms().filter(r => r.getMyMembership() === "join"), [cli]);
const [selectedToAdd, setSelectedToAdd] = (0, _react.useState)(new Set());
const [progress, setProgress] = (0, _react.useState)(null);
const [error, setError] = (0, _react.useState)(null);
const [query, setQuery] = (0, _react.useState)("");
const lcQuery = query.toLowerCase().trim();
const existingSubspacesSet = (0, _react.useMemo)(() => new Set(_SpaceStore.default.instance.getChildSpaces(space.roomId)), [space]);
const existingRoomsSet = (0, _react.useMemo)(() => new Set(_SpaceStore.default.instance.getChildRooms(space.roomId)), [space]);
const [spaces, rooms, dms] = (0, _react.useMemo)(() => {
let rooms = visibleRooms;
if (lcQuery) {
const matcher = new _QueryMatcher.default(visibleRooms, {
keys: ["name"],
funcs: [r => [r.getCanonicalAlias(), ...r.getAltAliases()].filter(Boolean)],
shouldMatchWordsOnly: false
});
rooms = matcher.match(lcQuery);
}
const joinRule = space.getJoinRule();
return (0, _RecentAlgorithm.sortRooms)(rooms).reduce((arr, room) => {
if (room.isSpaceRoom()) {
if (room !== space && !existingSubspacesSet.has(room)) {
arr[0].push(room);
}
} else if (!existingRoomsSet.has(room)) {
if (!_DMRoomMap.default.shared().getUserIdForRoomId(room.roomId)) {
arr[1].push(room);
} else if (joinRule !== "public") {
// Only show DMs for non-public spaces as they make very little sense in spaces other than "Just Me" ones.
arr[2].push(room);
}
}
return arr;
}, [[], [], []]);
}, [visibleRooms, space, lcQuery, existingRoomsSet, existingSubspacesSet]);
const addRooms = async () => {
setError(null);
setProgress(0);
let error;
for (const room of selectedToAdd) {
const via = (0, _Permalinks.calculateRoomVia)(room);
try {
await _SpaceStore.default.instance.addRoomToSpace(space, room.roomId, via).catch(async e => {
if (e.errcode === "M_LIMIT_EXCEEDED") {
await (0, _promise.sleep)(e.data.retry_after_ms);
return _SpaceStore.default.instance.addRoomToSpace(space, room.roomId, via); // retry
}
throw e;
});
setProgress(i => i + 1);
} catch (e) {
console.error("Failed to add rooms to space", e);
setError(error = e);
break;
}
}
if (!error) {
onFinished(true);
}
};
const busy = progress !== null;
let footer;
if (error) {
footer = /*#__PURE__*/_react.default.createElement(_react.default.Fragment, null, /*#__PURE__*/_react.default.createElement("img", {
src: require("../../../../res/img/element-icons/warning-badge.svg"),
height: "24",
width: "24",
alt: ""
}), /*#__PURE__*/_react.default.createElement("span", {
className: "mx_AddExistingToSpaceDialog_error"
}, /*#__PURE__*/_react.default.createElement("div", {
className: "mx_AddExistingToSpaceDialog_errorHeading"
}, (0, _languageHandler._t)("Not all selected were added")), /*#__PURE__*/_react.default.createElement("div", {
className: "mx_AddExistingToSpaceDialog_errorCaption"
}, (0, _languageHandler._t)("Try again"))), /*#__PURE__*/_react.default.createElement(_AccessibleButton.default, {
className: "mx_AddExistingToSpaceDialog_retryButton",
onClick: addRooms
}, (0, _languageHandler._t)("Retry")));
} else if (busy) {
footer = /*#__PURE__*/_react.default.createElement("span", null, /*#__PURE__*/_react.default.createElement(_ProgressBar.default, {
value: progress,
max: selectedToAdd.size
}), /*#__PURE__*/_react.default.createElement("div", {
className: "mx_AddExistingToSpaceDialog_progressText"
}, (0, _languageHandler._t)("Adding rooms... (%(progress)s out of %(count)s)", {
count: selectedToAdd.size,
progress
})));
} else {
let button = emptySelectionButton;
if (!button || selectedToAdd.size > 0) {
button = /*#__PURE__*/_react.default.createElement(_AccessibleButton.default, {
kind: "primary",
disabled: selectedToAdd.size < 1,
onClick: addRooms
}, (0, _languageHandler._t)("Add"));
}
footer = /*#__PURE__*/_react.default.createElement(_react.default.Fragment, null, /*#__PURE__*/_react.default.createElement("span", null, footerPrompt), button);
}
const onChange = !busy && !error ? (checked, room) => {
if (checked) {
selectedToAdd.add(room);
} else {
selectedToAdd.delete(room);
}
setSelectedToAdd(new Set(selectedToAdd));
} : null;
return /*#__PURE__*/_react.default.createElement("div", {
className: "mx_AddExistingToSpace"
}, /*#__PURE__*/_react.default.createElement(_SearchBox.default, {
className: "mx_textinput_icon mx_textinput_search",
placeholder: (0, _languageHandler._t)("Filter your rooms and spaces"),
onSearch: setQuery,
autoComplete: true,
autoFocus: true
}), /*#__PURE__*/_react.default.createElement(_AutoHideScrollbar.default, {
className: "mx_AddExistingToSpace_content",
id: "mx_AddExistingToSpace"
}, rooms.length > 0 ? /*#__PURE__*/_react.default.createElement("div", {
className: "mx_AddExistingToSpace_section"
}, /*#__PURE__*/_react.default.createElement("h3", null, (0, _languageHandler._t)("Rooms")), rooms.map(room => {
return /*#__PURE__*/_react.default.createElement(Entry, {
key: room.roomId,
room: room,
checked: selectedToAdd.has(room),
onChange: onChange ? checked => {
onChange(checked, room);
} : null
});
})) : undefined, spaces.length > 0 ? /*#__PURE__*/_react.default.createElement("div", {
className: "mx_AddExistingToSpace_section mx_AddExistingToSpace_section_spaces"
}, /*#__PURE__*/_react.default.createElement("h3", null, (0, _languageHandler._t)("Spaces")), /*#__PURE__*/_react.default.createElement("div", {
className: "mx_AddExistingToSpace_section_experimental"
}, /*#__PURE__*/_react.default.createElement("div", null, (0, _languageHandler._t)("Feeling experimental?")), /*#__PURE__*/_react.default.createElement("div", null, (0, _languageHandler._t)("You can add existing spaces to a space."))), spaces.map(space => {
return /*#__PURE__*/_react.default.createElement(Entry, {
key: space.roomId,
room: space,
checked: selectedToAdd.has(space),
onChange: onChange ? checked => {
onChange(checked, space);
} : null
});
})) : null, dms.length > 0 ? /*#__PURE__*/_react.default.createElement("div", {
className: "mx_AddExistingToSpace_section"
}, /*#__PURE__*/_react.default.createElement("h3", null, (0, _languageHandler._t)("Direct Messages")), dms.map(room => {
return /*#__PURE__*/_react.default.createElement(Entry, {
key: room.roomId,
room: room,
checked: selectedToAdd.has(room),
onChange: onChange ? checked => {
onChange(checked, room);
} : null
});
})) : null, spaces.length + rooms.length + dms.length < 1 ? /*#__PURE__*/_react.default.createElement("span", {
className: "mx_AddExistingToSpace_noResults"
}, (0, _languageHandler._t)("No results")) : undefined), /*#__PURE__*/_react.default.createElement("div", {
className: "mx_AddExistingToSpace_footer"
}, footer));
};
exports.AddExistingToSpace = AddExistingToSpace;
const AddExistingToSpaceDialog
/*: React.FC<IProps>*/
= ({
matrixClient: cli,
space,
onCreateRoomClick,
onFinished
}) => {
const [selectedSpace, setSelectedSpace] = (0, _react.useState)(space);
const existingSubspaces = _SpaceStore.default.instance.getChildSpaces(space.roomId);
let spaceOptionSection;
if (existingSubspaces.length > 0) {
const options = [space, ...existingSubspaces].map(space => {
const classes = (0, _classnames.default)("mx_AddExistingToSpaceDialog_dropdownOption", {
mx_AddExistingToSpaceDialog_dropdownOptionActive: space === selectedSpace
});
return /*#__PURE__*/_react.default.createElement("div", {
key: space.roomId,
className: classes
}, /*#__PURE__*/_react.default.createElement(_RoomAvatar.default, {
room: space,
width: 24,
height: 24
}), space.name || (0, _Rooms.getDisplayAliasForRoom)(space) || space.roomId);
});
spaceOptionSection = /*#__PURE__*/_react.default.createElement(_Dropdown.default, {
id: "mx_SpaceSelectDropdown",
onOptionChange: (key
/*: string*/
) => {
setSelectedSpace(existingSubspaces.find(space => space.roomId === key) || space);
},
value: selectedSpace.roomId,
label: (0, _languageHandler._t)("Space selection")
}, options);
} else {
spaceOptionSection = /*#__PURE__*/_react.default.createElement("div", {
className: "mx_AddExistingToSpaceDialog_onlySpace"
}, space.name || (0, _Rooms.getDisplayAliasForRoom)(space) || space.roomId);
}
const title = /*#__PURE__*/_react.default.createElement(_react.default.Fragment, null, /*#__PURE__*/_react.default.createElement(_RoomAvatar.default, {
room: selectedSpace,
height: 40,
width: 40
}), /*#__PURE__*/_react.default.createElement("div", null, /*#__PURE__*/_react.default.createElement("h1", null, (0, _languageHandler._t)("Add existing rooms")), spaceOptionSection));
return /*#__PURE__*/_react.default.createElement(_BaseDialog.default, {
title: title,
className: "mx_AddExistingToSpaceDialog",
contentId: "mx_AddExistingToSpace",
onFinished: onFinished,
fixedWidth: false
}, /*#__PURE__*/_react.default.createElement(_MatrixClientContext.default.Provider, {
value: cli
}, /*#__PURE__*/_react.default.createElement(AddExistingToSpace, {
space: space,
onFinished: onFinished,
footerPrompt: /*#__PURE__*/_react.default.createElement(_react.default.Fragment, null, /*#__PURE__*/_react.default.createElement("div", null, (0, _languageHandler._t)("Want to add a new room instead?")), /*#__PURE__*/_react.default.createElement(_AccessibleButton.default, {
onClick: () => onCreateRoomClick(cli, space),
kind: "link"
}, (0, _languageHandler._t)("Create a new room")))
})), /*#__PURE__*/_react.default.createElement(_SpaceRoomView.SpaceFeedbackPrompt, {
onClick: () => onFinished(false)
}));
};
var _default = AddExistingToSpaceDialog;
exports.default = _default;
//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uL3NyYy9jb21wb25lbnRzL3ZpZXdzL2RpYWxvZ3MvQWRkRXhpc3RpbmdUb1NwYWNlRGlhbG9nLnRzeCJdLCJuYW1lcyI6WyJFbnRyeSIsInJvb20iLCJjaGVja2VkIiwib25DaGFuZ2UiLCJpc1NwYWNlUm9vbSIsIm5hbWUiLCJlIiwidGFyZ2V0IiwiQWRkRXhpc3RpbmdUb1NwYWNlIiwic3BhY2UiLCJmb290ZXJQcm9tcHQiLCJlbXB0eVNlbGVjdGlvbkJ1dHRvbiIsIm9uRmluaXNoZWQiLCJjbGkiLCJNYXRyaXhDbGllbnRDb250ZXh0IiwidmlzaWJsZVJvb21zIiwiZ2V0VmlzaWJsZVJvb21zIiwiZmlsdGVyIiwiciIsImdldE15TWVtYmVyc2hpcCIsInNlbGVjdGVkVG9BZGQiLCJzZXRTZWxlY3RlZFRvQWRkIiwiU2V0IiwicHJvZ3Jlc3MiLCJzZXRQcm9ncmVzcyIsImVycm9yIiwic2V0RXJyb3IiLCJxdWVyeSIsInNldFF1ZXJ5IiwibGNRdWVyeSIsInRvTG93ZXJDYXNlIiwidHJpbSIsImV4aXN0aW5nU3Vic3BhY2VzU2V0IiwiU3BhY2VTdG9yZSIsImluc3RhbmNlIiwiZ2V0Q2hpbGRTcGFjZXMiLCJyb29tSWQiLCJleGlzdGluZ1Jvb21zU2V0IiwiZ2V0Q2hpbGRSb29tcyIsInNwYWNlcyIsInJvb21zIiwiZG1zIiwibWF0Y2hlciIsIlF1ZXJ5TWF0Y2hlciIsImtleXMiLCJmdW5jcyIsImdldENhbm9uaWNhbEFsaWFzIiwiZ2V0QWx0QWxpYXNlcyIsIkJvb2xlYW4iLCJzaG91bGRNYXRjaFdvcmRzT25seSIsIm1hdGNoIiwiam9pblJ1bGUiLCJnZXRKb2luUnVsZSIsInJlZHVjZSIsImFyciIsImhhcyIsInB1c2giLCJETVJvb21NYXAiLCJzaGFyZWQiLCJnZXRVc2VySWRGb3JSb29tSWQiLCJhZGRSb29tcyIsInZpYSIsImFkZFJvb21Ub1NwYWNlIiwiY2F0Y2giLCJlcnJjb2RlIiwiZGF0YSIsInJldHJ5X2FmdGVyX21zIiwiaSIsImNvbnNvbGUiLCJidXN5IiwiZm9vdGVyIiwicmVxdWlyZSIsInNpemUiLCJjb3VudCIsImJ1dHRvbiIsImFkZCIsImRlbGV0ZSIsImxlbmd0aCIsIm1hcCIsInVuZGVmaW5lZCIsIkFkZEV4aXN0aW5nVG9TcGFjZURpYWxvZyIsIm1hdHJpeENsaWVudCIsIm9uQ3JlYXRlUm9vbUNsaWNrIiwic2VsZWN0ZWRTcGFjZSIsInNldFNlbGVjdGVkU3BhY2UiLCJleGlzdGluZ1N1YnNwYWNlcyIsInNwYWNlT3B0aW9uU2VjdGlvbiIsIm9wdGlvbnMiLCJjbGFzc2VzIiwibXhfQWRkRXhpc3RpbmdUb1NwYWNlRGlhbG9nX2Ryb3Bkb3duT3B0aW9uQWN0aXZlIiwia2V5IiwiZmluZCIsInRpdGxlIl0sIm1hcHBpbmdzIjoiOzs7Ozs7Ozs7OztBQWdCQTs7QUFDQTs7QUFJQTs7QUFFQTs7QUFDQTs7QUFDQTs7QUFDQTs7QUFDQTs7QUFDQTs7QUFDQTs7QUFDQTs7QUFDQTs7QUFDQTs7QUFDQTs7QUFDQTs7QUFDQTs7QUFDQTs7QUFDQTs7QUFDQTs7QUFDQTs7QUFDQTs7QUF4Q0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBa0NBLE1BQU1BLEtBQUssR0FBRyxDQUFDO0FBQUVDLEVBQUFBLElBQUY7QUFBUUMsRUFBQUEsT0FBUjtBQUFpQkMsRUFBQUE7QUFBakIsQ0FBRCxLQUFpQztBQUMzQyxzQkFBTztBQUFPLElBQUEsU0FBUyxFQUFDO0FBQWpCLEtBQ0RGLElBQUksRUFBRUcsV0FBTixrQkFDSSw2QkFBQyxtQkFBRDtBQUFZLElBQUEsSUFBSSxFQUFFSCxJQUFsQjtBQUF3QixJQUFBLE1BQU0sRUFBRSxFQUFoQztBQUFvQyxJQUFBLEtBQUssRUFBRTtBQUEzQyxJQURKLGdCQUVJLDZCQUFDLDRCQUFEO0FBQXFCLElBQUEsSUFBSSxFQUFFQSxJQUEzQjtBQUFpQyxJQUFBLFVBQVUsRUFBRTtBQUE3QyxJQUhILGVB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SCxJQUFBLEtBQUssRUFBRU0sS0FESjtBQUVILElBQUEsU0FBUyxFQUFDLDZCQUZQO0FBR0gsSUFBQSxTQUFTLEVBQUMsdUJBSFA7QUFJSCxJQUFBLFVBQVUsRUFBRWhGLFVBSlQ7QUFLSCxJQUFBLFVBQVUsRUFBRTtBQUxULGtCQU9ILDZCQUFDLDRCQUFELENBQXFCLFFBQXJCO0FBQThCLElBQUEsS0FBSyxFQUFFQztBQUFyQyxrQkFDSSw2QkFBQyxrQkFBRDtBQUNJLElBQUEsS0FBSyxFQUFFSixLQURYO0FBRUksSUFBQSxVQUFVLEVBQUVHLFVBRmhCO0FBR0ksSUFBQSxZQUFZLGVBQUUseUVBQ1YsMENBQU8seUJBQUcsaUNBQUgsQ0FBUCxDQURVLGVBRVYsNkJBQUMseUJBQUQ7QUFBa0IsTUFBQSxPQUFPLEVBQUUsTUFBTXNFLGlCQUFpQixDQUFDckUsR0FBRCxFQUFNSixLQUFOLENBQWxEO0FBQWdFLE1BQUEsSUFBSSxFQUFDO0FBQXJFLE9BQ00seUJBQUcsbUJBQUgsQ0FETixDQUZVO0FBSGxCLElBREosQ0FQRyxlQW9CSCw2QkFBQyxrQ0FBRDtBQUFxQixJQUFBLE9BQU8sRUFBRSxNQUFNRyxVQUFVLENBQUMsS0FBRDtBQUE5QyxJQXBCRyxDQUFQO0FBc0JILENBaEVEOztlQWtFZW9FLHdCIiwic291cmNlc0NvbnRlbnQiOlsiLypcbkNvcHlyaWdodCAyMDIxIFRoZSBNYXRyaXgub3JnIEZvdW5kYXRpb24gQy5JLkMuXG5cbkxpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSBcIkxpY2Vuc2VcIik7XG55b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuXG5Zb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXRcblxuICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMFxuXG5Vbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlXG5kaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiBcIkFTIElTXCIgQkFTSVMsXG5XSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC5cblNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmRcbmxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLlxuKi9cblxuaW1wb3J0IFJlYWN0LCB7UmVhY3ROb2RlLCB1c2VDb250ZXh0LCB1c2VNZW1vLCB1c2VTdGF0ZX0gZnJvbSBcInJlYWN0XCI7XG5pbXBvcnQgY2xhc3NOYW1lcyBmcm9tIFwiY2xhc3NuYW1lc1wiO1xuaW1wb3J0IHtSb29tfSBmcm9tIFwibWF0cml4LWpzLXNkay9zcmMvbW9kZWxzL3Jvb21cIjtcbmltcG9ydCB7TWF0cml4Q2xpZW50fSBmcm9tIFwibWF0cml4LWpzLXNkay9zcmMvY2xpZW50XCI7XG5cbmltcG9ydCB7X3R9IGZyb20gJy4uLy4uLy4uL2xhbmd1YWdlSGFuZGxlcic7XG5pbXBvcnQge0lEaWFsb2dQcm9wc30gZnJvbSBcIi4vSURpYWxvZ1Byb3BzXCI7XG5pbXBvcnQgQmFzZURpYWxvZyBmcm9tIFwiLi9CYXNlRGlhbG9nXCI7XG5pbXBvcnQgRHJvcGRvd24gZnJvbSBcIi4uL2VsZW1lbnRzL0Ryb3Bkb3duXCI7XG5pbXBvcnQgU2VhcmNoQm94IGZyb20gXCIuLi8uLi9zdHJ1Y3R1cmVzL1NlYXJjaEJveFwiO1xuaW1wb3J0IFNwYWNlU3RvcmUgZnJvbSBcIi4uLy4uLy4uL3N0b3Jlcy9TcGFjZVN0b3JlXCI7XG5pbXBvcnQgUm9vbUF2YXRhciBmcm9tIFwiLi4vYXZhdGFycy9Sb29tQXZhdGFyXCI7XG5pbXBvcnQge2dldERpc3BsYXlBbGlhc0ZvclJvb219IGZyb20gXCIuLi8uLi8uLi9Sb29tc1wiO1xuaW1wb3J0IEFjY2Vzc2libGVCdXR0b24gZnJvbSBcIi4uL2VsZW1lbnRzL0FjY2Vzc2libGVCdXR0b25cIjtcbmltcG9ydCBBdXRvSGlkZVNjcm9sbGJhciBmcm9tIFwiLi4vLi4vc3RydWN0dXJlcy9BdXRvSGlkZVNjcm9sbGJhclwiO1xuaW1wb3J0IHtzbGVlcH0gZnJvbSBcIi4uLy4uLy4uL3V0aWxzL3Byb21pc2VcIjtcbmltcG9ydCBETVJvb21NYXAgZnJvbSBcIi4uLy4uLy4uL3V0aWxzL0RNUm9vbU1hcFwiO1xuaW1wb3J0IHtjYWxjdWxhdGVSb29tVmlhfSBmcm9tIFwiLi4vLi4vLi4vdXRpbHMvcGVybWFsaW5rcy9QZXJtYWxpbmtzXCI7XG5pbXBvcnQgU3R5bGVkQ2hlY2tib3ggZnJvbSBcIi4uL2VsZW1lbnRzL1N0eWxlZENoZWNrYm94XCI7XG5pbXBvcnQgTWF0cml4Q2xpZW50Q29udGV4dCBmcm9tIFwiLi4vLi4vLi4vY29udGV4dHMvTWF0cml4Q2xpZW50Q29udGV4dFwiO1xuaW1wb3J0IHtzb3J0Um9vbXN9IGZyb20gXCIuLi8uLi8uLi9zdG9yZXMvcm9vbS1saXN0L2FsZ29yaXRobXMvdGFnLXNvcnRpbmcvUmVjZW50QWxnb3JpdGhtXCI7XG5pbXBvcnQgUHJvZ3Jlc3NCYXIgZnJvbSBcIi4uL2VsZW1lbnRzL1Byb2dyZXNzQmFyXCI7XG5pbXBvcnQge1NwYWNlRmVlZGJhY2tQcm9tcHR9IGZyb20gXCIuLi8uLi9zdHJ1Y3R1cmVzL1NwYWNlUm9vbVZpZXdcIjtcbmltcG9ydCBEZWNvcmF0ZWRSb29tQXZhdGFyIGZyb20gXCIuLi9hdmF0YXJzL0RlY29yYXRlZFJvb21BdmF0YXJcIjtcbmltcG9ydCBRdWVyeU1hdGNoZXIgZnJvbSBcIi4uLy4uLy4uL2F1dG9jb21wbGV0ZS9RdWVyeU1hdGNoZXJcIjtcblxuaW50ZXJmYWNlIElQcm9wcyBleHRlbmRzIElEaWFsb2dQcm9wcyB7XG4gICAgbWF0cml4Q2xpZW50OiBNYXRyaXhDbGllbnQ7XG4gICAgc3BhY2U6IFJvb207XG4gICAgb25DcmVhdGVSb29tQ2xpY2soY2xpOiBNYXRyaXhDbGllbnQsIHNwYWNlOiBSb29tKTogdm9pZDtcbn1cblxuY29uc3QgRW50cnkgPSAoeyByb29tLCBjaGVja2VkLCBvbkNoYW5nZSB9KSA9PiB7XG4gICAgcmV0dXJuIDxsYWJlbCBjbGFzc05hbWU9XCJteF9BZGRFeGlzdGluZ1RvU3BhY2VfZW50cnlcIj5cbiAgICAgICAgeyByb29tPy5pc1NwYWNlUm9vbSgpXG4gICAgICAgICAgICA/IDxSb29tQXZhdGFyIHJvb209e3Jvb219IGhlaWdodD17MzJ9IHdpZHRoPXszMn0gLz5cbiAgICAgICAgICAgIDogPERlY29yYXRlZFJvb21BdmF0YXIgcm9vbT17cm9vbX0gYXZhdGFyU2l6ZT17MzJ9IC8+XG4gICAgICAgIH1cbiAgICAgICAgPHNwYW4gY2xhc3NOYW1lPVwibXhfQWRkRXhpc3RpbmdUb1NwYWNlX2VudHJ5X25hbWVcIj57IHJvb20ubmFtZSB9PC9zcGFuPlxuICAgICAgICA8U3R5bGVkQ2hlY2tib3hcbiAgICAgICAgICAgIG9uQ2hhbmdlPXtvbkNoYW5nZSA/IChlKSA9PiBvbkNoYW5nZShlLnRhcmdldC5jaGVja2VkKSA6IG51bGx9XG4gICAgICAgICAgICBjaGVja2VkPXtjaGVja2VkfVxuICAgICAgICAgICAgZGlzYWJsZWQ9eyFvbkNoYW5nZX1cbiAgICAgICAgLz5cbiAgICA8L2xhYmVsPjtcbn07XG5cbmludGVyZmFjZSBJQWRkRXhpc3RpbmdUb1NwYWNlUHJvcHMge1xuICAgIHNwYWNlOiBSb29tO1xuICAgIGZvb3RlclByb21wdD86IFJlYWN0Tm9kZTtcbiAgICBlbXB0eVNlbGVjdGlvbkJ1dHRvbj86IFJlYWN0Tm9kZTtcbiAgICBvbkZpbmlzaGVkKGFkZGVkOiBib29sZWFuKTogdm9pZDtcbn1cblxuZXhwb3J0IGNvbnN0IEFkZEV4aXN0aW5nVG9TcGFjZTogUmVhY3QuRkM8SUFkZEV4aXN0aW5nVG9TcGFjZVByb3BzPiA9ICh7XG4gICAgc3BhY2UsXG4gICAgZm9vdGVyUHJvbXB0LFxuICAgIGVtcHR5U2VsZWN0aW9uQnV0dG9uLFxuICAgIG9uRmluaXNoZWQsXG59KSA9PiB7XG4gICAgY29uc3QgY2xpID0gdXNlQ29udGV4dChNYXRyaXhDbGllbnRDb250ZXh0KTtcbiAgICBjb25zdCB2aXNpYmxlUm9vbXMgPSB1c2VNZW1vKCgpID0+IGNsaS5nZXRWaXNpYmxlUm9vbXMoKS5maWx0ZXIociA9PiByLmdldE15TWVtYmVyc2hpcCgpID09PSBcImpvaW5cIiksIFtjbGldKTtcblxuICAgIGNvbnN0IFtzZWxlY3RlZFRvQWRkLCBzZXRTZWxlY3RlZFRvQWRkXSA9IHVzZVN0YXRlKG5ldyBTZXQ8Um9vbT4oKSk7XG4gICAgY29uc3QgW3Byb2dyZXNzLCBzZXRQcm9ncmVzc10gPSB1c2VTdGF0ZTxudW1iZXI+KG51bGwpO1xuICAgIGNvbnN0IFtlcnJvciwgc2V0RXJyb3JdID0gdXNlU3RhdGU8RXJyb3I+KG51bGwpO1xuICAgIGNvbnN0IFtxdWVyeSwgc2V0UXVlcnldID0gdXNlU3RhdGUoXCJcIik7XG4gICAgY29uc3QgbGNRdWVyeSA9IHF1ZXJ5LnRvTG93ZXJDYXNlKCkudHJpbSgpO1xuXG4gICAgY29uc3QgZXhpc3RpbmdTdWJzcGFjZXNTZXQgPSB1c2VNZW1vKCgpID0+IG5ldyBTZXQoU3BhY2VTdG9yZS5pbnN0YW5jZS5nZXRDaGlsZFNwYWNlcyhzcGFjZS5yb29tSWQpKSwgW3NwYWNlXSk7XG4gICAgY29uc3QgZXhpc3RpbmdSb29tc1NldCA9IHVzZU1lbW8oKCkgPT4gbmV3IFNldChTcGFjZVN0b3JlLmluc3RhbmNlLmdldENoaWxkUm9vbXMoc3BhY2Uucm9vbUlkKSksIFtzcGFjZV0pO1xuXG4gICAgY29uc3QgW3NwYWNlcywgcm9vbXMsIGRtc10gPSB1c2VNZW1vKCgpID0+IHtcbiAgICAgICAgbGV0IHJvb21zID0gdmlzaWJsZVJvb21zO1xuXG4gICAgICAgIGlmIChsY1F1ZXJ5KSB7XG4gICAgICAgICAgICBjb25zdCBtYXRjaGVyID0gbmV3IFF1ZXJ5TWF0Y2hlcjxSb29tPih2aXNpYmxlUm9vbXMsIHtcbiAgICAgICAgICAgICAgICBrZXlzOiBbXCJuYW1lXCJdLFxuICAgICAgICAgICAgICAgIGZ1bmNzOiBbciA9PiBbci5nZXRDYW5vbmljYWxBbGlhcygpLCAuLi5yLmdldEFsdEFsaWFzZXMoKV0uZmlsdGVyKEJvb2xlYW4pXSxcbiAgICAgICAgICAgICAgICBzaG91bGRNYXRjaFdvcmRzT25seTogZmFsc2UsXG4gICAgICAgICAgICB9KTtcblxuICAgICAgICAgICAgcm9vbXMgPSBtYXRjaGVyLm1hdGNoKGxjUXVlcnkpO1xuICAgICAgICB9XG5cbiAgICAgICAgY29uc3Qgam9pblJ1bGUgPSBzcGFjZS5nZXRKb2luUnVsZSgpO1xuICAgICAgICByZXR1cm4gc29ydFJvb21zKHJvb21zKS5yZWR1Y2UoKGFyciwgcm9vbSkgPT4ge1xuICAgICAgICAgICAgaWYgKHJvb20uaXNTcGFjZVJvb20oKSkge1xuICAgICAgICAgICAgICAgIGlmIChyb29tICE9PSBzcGFjZSAmJiAhZXhpc3RpbmdTdWJzcGFjZXNTZXQuaGFzKHJvb20pKSB7XG4gICAgICAgICAgICAgICAgICAgIGFyclswXS5wdXNoKHJvb20pO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH0gZWxzZSBpZiAoIWV4aXN0aW5nUm9vbXNTZXQuaGFzKHJvb20pKSB7XG4gICAgICAgICAgICAgICAgaWYgKCFETVJvb21NYXAuc2hhcmVkKCkuZ2V0VXNlcklkRm9yUm9vbUlkKHJvb20ucm9vbUlkKSkge1xuICAgICAgICAgICAgICAgICAgICBhcnJbMV0ucHVzaChyb29tKTtcbiAgICAgICAgICAgICAgICB9IGVsc2UgaWYgKGpvaW5SdWxlICE9PSBcInB1YmxpY1wiKSB7XG4gICAgICAgICAgICAgICAgICAgIC8vIE9ubHkgc2hvdyBETXMgZm9yIG5vbi1wdWJsaWMgc3BhY2VzIGFzIHRoZXkgbWFrZSB2ZXJ5IGxpdHRsZSBzZW5zZSBpbiBzcGFjZXMgb3RoZXIgdGhhbiBcIkp1c3QgTWVcIiBvbmVzLlxuICAgICAgICAgICAgICAgICAgICBhcnJbMl0ucHVzaChyb29tKTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICByZXR1cm4gYXJyO1xuICAgICAgICB9LCBbW10sIFtdLCBbXV0pO1xuICAgIH0sIFt2aXNpYmxlUm9vbXMsIHNwYWNlLCBsY1F1ZXJ5LCBleGlzdGluZ1Jvb21zU2V0LCBleGlzdGluZ1N1YnNwYWNlc1NldF0pO1xuXG4gICAgY29uc3QgYWRkUm9vbXMgPSBhc3luYyAoKSA9PiB7XG4gICAgICAgIHNldEVycm9yKG51bGwpO1xuICAgICAgICBzZXRQcm9ncmVzcygwKTtcblxuICAgICAgICBsZXQgZXJyb3I7XG5cbiAgICAgICAgZm9yIChjb25zdCByb29tIG9mIHNlbGVjdGVkVG9BZGQpIHtcbiAgICAgICAgICAgIGNvbnN0IHZpYSA9IGNhbGN1bGF0ZVJvb21WaWEocm9vbSk7XG4gICAgICAgICAgICB0cnkge1xuICAgICAgICAgICAgICAgIGF3YWl0IFNwYWNlU3RvcmUuaW5zdGFuY2UuYWRkUm9vbVRvU3BhY2Uoc3BhY2UsIHJvb20ucm9vbUlkLCB2aWEpLmNhdGNoKGFzeW5jIGUgPT4ge1xuICAgICAgICAgICAgICAgICAgICBpZiAoZS5lcnJjb2RlID09PSBcIk1fTElNSVRfRVhDRUVERURcIikge1xuICAgICAgICAgICAgICAgICAgICAgICAgYXdhaXQgc2xlZXAoZS5kYXRhLnJldHJ5X2FmdGVyX21zKTtcbiAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBTcGFjZVN0b3JlLmluc3RhbmNlLmFkZFJvb21Ub1NwYWNlKHNwYWNlLCByb29tLnJvb21JZCwgdmlhKTsgLy8gcmV0cnlcbiAgICAgICAgICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICAgICAgICAgIHRocm93IGU7XG4gICAgICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICAgICAgc2V0UHJvZ3Jlc3MoaSA9PiBpICsgMSk7XG4gICAgICAgICAgICB9IGNhdGNoIChlKSB7XG4gICAgICAgICAgICAgICAgY29uc29sZS5lcnJvcihcIkZhaWxlZCB0byBhZGQgcm9vbXMgdG8gc3BhY2VcIiwgZSk7XG4gICAgICAgICAgICAgICAgc2V0RXJyb3IoZXJyb3IgPSBlKTtcbiAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuXG4gICAgICAgIGlmICghZXJyb3IpIHtcbiAgICAgICAgICAgIG9uRmluaXNoZWQodHJ1ZSk7XG4gICAgICAgIH1cbiAgICB9O1xuXG4gICAgY29uc3QgYnVzeSA9IHByb2dyZXNzICE9PSBudWxsO1xuXG4gICAgbGV0IGZvb3RlcjtcbiAgICBpZiAoZXJyb3IpIHtcbiAgICAgICAgZm9vdGVyID0gPD5cbiAgICAgICAgICAgIDxpbWdcbiAgICAgICAgICAgICAgICBzcmM9e3JlcXVpcmUoXCIuLi8uLi8uLi8uLi9yZXMvaW1nL2VsZW1lbnQtaWNvbnMvd2FybmluZy1iYWRnZS5zdmdcIil9XG4gICAgICAgICAgICAgICAgaGVpZ2h0PVwiMjRcIlxuICAgICAgICAgICAgICAgIHdpZHRoPVwiMjRcIlxuICAgICAgICAgICAgICAgIGFsdD1cIlwiXG4gICAgICAgICAgICAvPlxuXG4gICAgICAgICAgICA8c3BhbiBjbGFzc05hbWU9XCJteF9BZGRFeGlzdGluZ1RvU3BhY2VEaWFsb2dfZXJyb3JcIj5cbiAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzTmFtZT1cIm14X0FkZEV4aXN0aW5nVG9TcGFjZURpYWxvZ19lcnJvckhlYWRpbmdcIj57IF90KFwiTm90IGFsbCBzZWxlY3RlZCB3ZXJlIGFkZGVkXCIpIH08L2Rpdj5cbiAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzTmFtZT1cIm14X0FkZEV4aXN0aW5nVG9TcGFjZURpYWxvZ19lcnJvckNhcHRpb25cIj57IF90KFwiVHJ5IGFnYWluXCIpIH08L2Rpdj5cbiAgICAgICAgICAgIDwvc3Bhbj5cblxuICAgICAgICAgICAgPEFjY2Vzc2libGVCdXR0b24gY2xhc3NOYW1lPVwibXhfQWRkRXhpc3RpbmdUb1NwYWNlRGlhbG9nX3JldHJ5QnV0dG9uXCIgb25DbGljaz17YWRkUm9vbXN9PlxuICAgICAgICAgICAgICAgIHsgX3QoXCJSZXRyeVwiKSB9XG4gICAgICAgICAgICA8L0FjY2Vzc2libGVCdXR0b24+XG4gICAgICAgIDwvPjtcbiAgICB9IGVsc2UgaWYgKGJ1c3kpIHtcbiAgICAgICAgZm9vdGVyID0gPHNwYW4+XG4gICAgICAgICAgICA8UHJvZ3Jlc3NCYXIgdmFsdWU9e3Byb2dyZXNzfSBtYXg9e3NlbGVjdGVkVG9BZGQuc2l6ZX0gLz5cbiAgICAgICAgICAgIDxkaXYgY2xhc3NOYW1lPVwibXhfQWRkRXhpc3RpbmdUb1NwYWNlRGlhbG9nX3Byb2dyZXNzVGV4dFwiPlxuICAgICAgICAgICAgICAgIHsgX3QoXCJBZGRpbmcgcm9vbXMuLi4gKCUocHJvZ3Jlc3MpcyBvdXQgb2YgJShjb3VudClzKVwiLCB7XG4gICAgICAgICAgICAgICAgICAgIGNvdW50OiBzZWxlY3RlZFRvQWRkLnNpemUsXG4gICAgICAgICAgICAgICAgICAgIHByb2dyZXNzLFxuICAgICAgICAgICAgICAgIH0pIH1cbiAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICA8L3NwYW4+O1xuICAgIH0gZWxzZSB7XG4gICAgICAgIGxldCBidXR0b24gPSBlbXB0eVNlbGVjdGlvbkJ1dHRvbjtcbiAgICAgICAgaWYgKCFidXR0b24gfHwgc2VsZWN0ZWRUb0FkZC5zaXplID4gMCkge1xuICAgICAgICAgICAgYnV0dG9uID0gPEFjY2Vzc2libGVCdXR0b24ga2luZD1cInByaW1hcnlcIiBkaXNhYmxlZD17c2VsZWN0ZWRUb0FkZC5zaXplIDwgMX0gb25DbGljaz17YWRkUm9vbXN9PlxuICAgICAgICAgICAgICAgIHsgX3QoXCJBZGRcIikgfVxuICAgICAgICAgICAgPC9BY2Nlc3NpYmxlQnV0dG9uPjtcbiAgICAgICAgfVxuXG4gICAgICAgIGZvb3RlciA9IDw+XG4gICAgICAgICAgICA8c3Bhbj5cbiAgICAgICAgICAgICAgICB7IGZvb3RlclByb21wdCB9XG4gICAgICAgICAgICA8L3NwYW4+XG5cbiAgICAgICAgICAgIHsgYnV0dG9uIH1cbiAgICAgICAgPC8+O1xuICAgIH1cblxuICAgIGNvbnN0IG9uQ2hhbmdlID0gIWJ1c3kgJiYgIWVycm9yID8gKGNoZWNrZWQsIHJvb20pID0+IHtcbiAgICAgICAgaWYgKGNoZWNrZWQpIHtcbiAgICAgICAgICAgIHNlbGVjdGVkVG9BZGQuYWRkKHJvb20pO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgc2VsZWN0ZWRUb0FkZC5kZWxldGUocm9vbSk7XG4gICAgICAgIH1cbiAgICAgICAgc2V0U2VsZWN0ZWRUb0FkZChuZXcgU2V0KHNlbGVjdGVkVG9BZGQpKTtcbiAgICB9IDogbnVsbDtcblxuICAgIHJldHVybiA8ZGl2IGNsYXNzTmFtZT1cIm14X0FkZEV4aXN0aW5nVG9TcGFjZVwiPlxuICAgICAgICA8U2VhcmNoQm94XG4gICAgICAgICAgICBjbGFzc05hbWU9XCJteF90ZXh0aW5wdXRfaWNvbiBteF90ZXh0aW5wdXRfc2VhcmNoXCJcbiAgICAgICAgICAgIHBsYWNlaG9sZGVyPXsgX3QoXCJGaWx0ZXIgeW91ciByb29tcyBhbmQgc3BhY2VzXCIpIH1cbiAgICAgICAgICAgIG9uU2VhcmNoPXtzZXRRdWVyeX1cbiAgICAgICAgICAgIGF1dG9Db21wbGV0ZT17dHJ1ZX1cbiAgICAgICAgICAgIGF1dG9Gb2N1cz17dHJ1ZX1cbiAgICAgICAgLz5cbiAgICAgICAgPEF1dG9IaWRlU2Nyb2xsYmFyIGNsYXNzTmFtZT1cIm14X0FkZEV4aXN0aW5nVG9TcGFjZV9jb250ZW50XCIgaWQ9XCJteF9BZGRFeGlzdGluZ1RvU3BhY2VcIj5cbiAgICAgICAgICAgIHsgcm9vbXMubGVuZ3RoID4gMCA/IChcbiAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzTmFtZT1cIm14X0FkZEV4aXN0aW5nVG9TcGFjZV9zZWN0aW9uXCI+XG4gICAgICAgICAgICAgICAgICAgIDxoMz57IF90KFwiUm9vbXNcIikgfTwvaDM+XG4gICAgICAgICAgICAgICAgICAgIHsgcm9vbXMubWFwKHJvb20gPT4ge1xuICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIDxFbnRyeVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGtleT17cm9vbS5yb29tSWR9XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgcm9vbT17cm9vbX1cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBjaGVja2VkPXtzZWxlY3RlZFRvQWRkLmhhcyhyb29tKX1cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBvbkNoYW5nZT17b25DaGFuZ2UgPyAoY2hlY2tlZCkgPT4ge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBvbkNoYW5nZShjaGVja2VkLCByb29tKTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9IDogbnVsbH1cbiAgICAgICAgICAgICAgICAgICAgICAgIC8+O1xuICAgICAgICAgICAgICAgICAgICB9KSB9XG4gICAgICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgICApIDogdW5kZWZpbmVkIH1cblxuICAgICAgICAgICAgeyBzcGFjZXMubGVuZ3RoID4gMCA/IChcbiAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzTmFtZT1cIm14X0FkZEV4aXN0aW5nVG9TcGFjZV9zZWN0aW9uIG14X0FkZEV4aXN0aW5nVG9TcGFjZV9zZWN0aW9uX3NwYWNlc1wiPlxuICAgICAgICAgICAgICAgICAgICA8aDM+eyBfdChcIlNwYWNlc1wiKSB9PC9oMz5cbiAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzc05hbWU9XCJteF9BZGRFeGlzdGluZ1RvU3BhY2Vfc2VjdGlvbl9leHBlcmltZW50YWxcIj5cbiAgICAgICAgICAgICAgICAgICAgICAgIDxkaXY+eyBfdChcIkZlZWxpbmcgZXhwZXJpbWVudGFsP1wiKSB9PC9kaXY+XG4gICAgICAgICAgICAgICAgICAgICAgICA8ZGl2PnsgX3QoXCJZb3UgY2FuIGFkZCBleGlzdGluZyBzcGFjZXMgdG8gYSBzcGFjZS5cIikgfTwvZGl2PlxuICAgICAgICAgICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICAgICAgICAgICAgeyBzcGFjZXMubWFwKHNwYWNlID0+IHtcbiAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiA8RW50cnlcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBrZXk9e3NwYWNlLnJvb21JZH1cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICByb29tPXtzcGFjZX1cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBjaGVja2VkPXtzZWxlY3RlZFRvQWRkLmhhcyhzcGFjZSl9XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgb25DaGFuZ2U9e29uQ2hhbmdlID8gKGNoZWNrZWQpID0+IHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgb25DaGFuZ2UoY2hlY2tlZCwgc3BhY2UpO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0gOiBudWxsfVxuICAgICAgICAgICAgICAgICAgICAgICAgLz47XG4gICAgICAgICAgICAgICAgICAgIH0pIH1cbiAgICAgICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICAgICkgOiBudWxsIH1cblxuICAgICAgICAgICAgeyBkbXMubGVuZ3RoID4gMCA/IChcbiAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzTmFtZT1cIm14X0FkZEV4aXN0aW5nVG9TcGFjZV9zZWN0aW9uXCI+XG4gICAgICAgICAgICAgICAgICAgIDxoMz57IF90KFwiRGlyZWN0IE1lc3NhZ2VzXCIpIH08L2gzPlxuICAgICAgICAgICAgICAgICAgICB7IGRtcy5tYXAocm9vbSA9PiB7XG4gICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gPEVudHJ5XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAga2V5PXtyb29tLnJvb21JZH1cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICByb29tPXtyb29tfVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNoZWNrZWQ9e3NlbGVjdGVkVG9BZGQuaGFzKHJvb20pfVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIG9uQ2hhbmdlPXtvbkNoYW5nZSA/IChjaGVja2VkKSA9PiB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG9uQ2hhbmdlKGNoZWNrZWQsIHJvb20pO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0gOiBudWxsfVxuICAgICAgICAgICAgICAgICAgICAgICAgLz47XG4gICAgICAgICAgICAgICAgICAgIH0pIH1cbiAgICAgICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICAgICkgOiBudWxsIH1cblxuICAgICAgICAgICAgeyBzcGFjZXMubGVuZ3RoICsgcm9vbXMubGVuZ3RoICsgZG1zLmxlbmd0aCA8IDEgPyA8c3BhbiBjbGFzc05hbWU9XCJteF9BZGRFeGlzdGluZ1RvU3BhY2Vfbm9SZXN1bHRzXCI+XG4gICAgICAgICAgICAgICAgeyBfdChcIk5vIHJlc3VsdHNcIikgfVxuICAgICAgICAgICAgPC9zcGFuPiA6IHVuZGVmaW5lZCB9XG4gICAgICAgIDwvQXV0b0hpZGVTY3JvbGxiYXI+XG5cbiAgICAgICAgPGRpdiBjbGFzc05hbWU9XCJteF9BZGRFeGlzdGluZ1RvU3BhY2VfZm9vdGVyXCI+XG4gICAgICAgICAgICB7IGZvb3RlciB9XG4gICAgICAgIDwvZGl2PlxuICAgIDwvZGl2Pjtcbn07XG5cbmNvbnN0IEFkZEV4aXN0aW5nVG9TcGFjZURpYWxvZzogUmVhY3QuRkM8SVByb3BzPiA9ICh7IG1hdHJpeENsaWVudDogY2xpLCBzcGFjZSwgb25DcmVhdGVSb29tQ2xpY2ssIG9uRmluaXNoZWQgfSkgPT4ge1xuICAgIGNvbnN0IFtzZWxlY3RlZFNwYWNlLCBzZXRTZWxlY3RlZFNwYWNlXSA9IHVzZVN0YXRlKHNwYWNlKTtcbiAgICBjb25zdCBleGlzdGluZ1N1YnNwYWNlcyA9IFNwYWNlU3RvcmUuaW5zdGFuY2UuZ2V0Q2hpbGRTcGFjZXMoc3BhY2Uucm9vbUlkKTtcblxuICAgIGxldCBzcGFjZU9wdGlvblNlY3Rpb247XG4gICAgaWYgKGV4aXN0aW5nU3Vic3BhY2VzLmxlbmd0aCA+IDApIHtcbiAgICAgICAgY29uc3Qgb3B0aW9ucyA9IFtzcGFjZSwgLi4uZXhpc3RpbmdTdWJzcGFjZXNdLm1hcCgoc3BhY2UpID0+IHtcbiAgICAgICAgICAgIGNvbnN0IGNsYXNzZXMgPSBjbGFzc05hbWVzKFwibXhfQWRkRXhpc3RpbmdUb1NwYWNlRGlhbG9nX2Ryb3Bkb3duT3B0aW9uXCIsIHtcbiAgICAgICAgICAgICAgICBteF9BZGRFeGlzdGluZ1RvU3BhY2VEaWFsb2dfZHJvcGRvd25PcHRpb25BY3RpdmU6IHNwYWNlID09PSBzZWxlY3RlZFNwYWNlLFxuICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICByZXR1cm4gPGRpdiBrZXk9e3NwYWNlLnJvb21JZH0gY2xhc3NOYW1lPXtjbGFzc2VzfT5cbiAgICAgICAgICAgICAgICA8Um9vbUF2YXRhciByb29tPXtzcGFjZX0gd2lkdGg9ezI0fSBoZWlnaHQ9ezI0fSAvPlxuICAgICAgICAgICAgICAgIHsgc3BhY2UubmFtZSB8fCBnZXREaXNwbGF5QWxpYXNGb3JSb29tKHNwYWNlKSB8fCBzcGFjZS5yb29tSWQgfVxuICAgICAgICAgICAgPC9kaXY+O1xuICAgICAgICB9KTtcblxuICAgICAgICBzcGFjZU9wdGlvblNlY3Rpb24gPSAoXG4gICAgICAgICAgICA8RHJvcGRvd25cbiAgICAgICAgICAgICAgICBpZD1cIm14X1NwYWNlU2VsZWN0RHJvcGRvd25cIlxuICAgICAgICAgICAgICAgIG9uT3B0aW9uQ2hhbmdlPXsoa2V5OiBzdHJpbmcpID0+IHtcbiAgICAgICAgICAgICAgICAgICAgc2V0U2VsZWN0ZWRTcGFjZShleGlzdGluZ1N1YnNwYWNlcy5maW5kKHNwYWNlID0+IHNwYWNlLnJvb21JZCA9PT0ga2V5KSB8fCBzcGFjZSk7XG4gICAgICAgICAgICAgICAgfX1cbiAgICAgICAgICAgICAgICB2YWx1ZT17c2VsZWN0ZWRTcGFjZS5yb29tSWR9XG4gICAgICAgICAgICAgICAgbGFiZWw9e190KFwiU3BhY2Ugc2VsZWN0aW9uXCIpfVxuICAgICAgICAgICAgPlxuICAgICAgICAgICAgICAgIHsgb3B0aW9ucyB9XG4gICAgICAgICAgICA8L0Ryb3Bkb3duPlxuICAgICAgICApO1xuICAgIH0gZWxzZSB7XG4gICAgICAgIHNwYWNlT3B0aW9uU2VjdGlvbiA9IDxkaXYgY2xhc3NOYW1lPVwibXhfQWRkRXhpc3RpbmdUb1NwYWNlRGlhbG9nX29ubHlTcGFjZVwiPlxuICAgICAgICAgICAgeyBzcGFjZS5uYW1lIHx8IGdldERpc3BsYXlBbGlhc0ZvclJvb20oc3BhY2UpIHx8IHNwYWNlLnJvb21JZCB9XG4gICAgICAgIDwvZGl2PjtcbiAgICB9XG5cbiAgICBjb25zdCB0aXRsZSA9IDxSZWFjdC5GcmFnbWVudD5cbiAgICAgICAgPFJvb21BdmF0YXIgcm9vbT17c2VsZWN0ZWRTcGFjZX0gaGVpZ2h0PXs0MH0gd2lkdGg9ezQwfSAvPlxuICAgICAgICA8ZGl2PlxuICAgICAgICAgICAgPGgxPnsgX3QoXCJBZGQgZXhpc3Rpbmcgcm9vbXNcIikgfTwvaDE+XG4gICAgICAgICAgICB7IHNwYWNlT3B0aW9uU2VjdGlvbiB9XG4gICAgICAgIDwvZGl2PlxuICAgIDwvUmVhY3QuRnJhZ21lbnQ+O1xuXG4gICAgcmV0dXJuIDxCYXNlRGlhbG9nXG4gICAgICAgIHRpdGxlPXt0aXRsZX1cbiAgICAgICAgY2xhc3NOYW1lPVwibXhfQWRkRXhpc3RpbmdUb1NwYWNlRGlhbG9nXCJcbiAgICAgICAgY29udGVudElkPVwibXhfQWRkRXhpc3RpbmdUb1NwYWNlXCJcbiAgICAgICAgb25GaW5pc2hlZD17b25GaW5pc2hlZH1cbiAgICAgICAgZml4ZWRXaWR0aD17ZmFsc2V9XG4gICAgPlxuICAgICAgICA8TWF0cml4Q2xpZW50Q29udGV4dC5Qcm92aWRlciB2YWx1ZT17Y2xpfT5cbiAgICAgICAgICAgIDxBZGRFeGlzdGluZ1RvU3BhY2VcbiAgICAgICAgICAgICAgICBzcGFjZT17c3BhY2V9XG4gICAgICAgICAgICAgICAgb25GaW5pc2hlZD17b25GaW5pc2hlZH1cbiAgICAgICAgICAgICAgICBmb290ZXJQcm9tcHQ9ezw+XG4gICAgICAgICAgICAgICAgICAgIDxkaXY+eyBfdChcIldhbnQgdG8gYWRkIGEgbmV3IHJvb20gaW5zdGVhZD9cIikgfTwvZGl2PlxuICAgICAgICAgICAgICAgICAgICA8QWNjZXNzaWJsZUJ1dHRvbiBvbkNsaWNrPXsoKSA9PiBvbkNyZWF0ZVJvb21DbGljayhjbGksIHNwYWNlKX0ga2luZD1cImxpbmtcIj5cbiAgICAgICAgICAgICAgICAgICAgICAgIHsgX3QoXCJDcmVhdGUgYSBuZXcgcm9vbVwiKSB9XG4gICAgICAgICAgICAgICAgICAgIDwvQWNjZXNzaWJsZUJ1dHRvbj5cbiAgICAgICAgICAgICAgICA8Lz59XG4gICAgICAgICAgICAvPlxuICAgICAgICA8L01hdHJpeENsaWVudENvbnRleHQuUHJvdmlkZXI+XG5cbiAgICAgICAgPFNwYWNlRmVlZGJhY2tQcm9tcHQgb25DbGljaz17KCkgPT4gb25GaW5pc2hlZChmYWxzZSl9IC8+XG4gICAgPC9CYXNlRGlhbG9nPjtcbn07XG5cbmV4cG9ydCBkZWZhdWx0IEFkZEV4aXN0aW5nVG9TcGFjZURpYWxvZztcblxuIl19