matrix-react-sdk
Version:
SDK for matrix.org using React
423 lines • 73.9 kB
JavaScript
"use strict";
var _interopRequireDefault = require("@babel/runtime/helpers/interopRequireDefault");
Object.defineProperty(exports, "__esModule", {
value: true
});
exports.default = exports.BannedUser = void 0;
var _defineProperty2 = _interopRequireDefault(require("@babel/runtime/helpers/defineProperty"));
var _react = _interopRequireDefault(require("react"));
var _matrix = require("matrix-js-sdk/src/matrix");
var _logger = require("matrix-js-sdk/src/logger");
var _lodash = require("lodash");
var _types = require("matrix-js-sdk/src/types");
var _languageHandler = require("../../../../../languageHandler");
var _AccessibleButton = _interopRequireDefault(require("../../../elements/AccessibleButton"));
var _Modal = _interopRequireDefault(require("../../../../../Modal"));
var _ErrorDialog = _interopRequireDefault(require("../../../dialogs/ErrorDialog"));
var _PowerSelector = _interopRequireDefault(require("../../../elements/PowerSelector"));
var _SettingsFieldset = _interopRequireDefault(require("../../SettingsFieldset"));
var _SettingsStore = _interopRequireDefault(require("../../../../../settings/SettingsStore"));
var _voiceBroadcast = require("../../../../../voice-broadcast");
var _Call = require("../../../../../models/Call");
var _SdkConfig = _interopRequireWildcard(require("../../../../../SdkConfig"));
var _AddPrivilegedUsers = require("../../AddPrivilegedUsers");
var _SettingsTab = _interopRequireDefault(require("../SettingsTab"));
var _SettingsSection = require("../../shared/SettingsSection");
var _MatrixClientContext = _interopRequireDefault(require("../../../../../contexts/MatrixClientContext"));
var _PowerLevelSelector = require("../../PowerLevelSelector");
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 2019-2021 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 plEventsToShow = {
// If an event is listed here, it will be shown in the PL settings. Defaults will be calculated.
[_matrix.EventType.RoomAvatar]: {
isState: true
},
[_matrix.EventType.RoomName]: {
isState: true
},
[_matrix.EventType.RoomCanonicalAlias]: {
isState: true
},
[_matrix.EventType.SpaceChild]: {
isState: true,
hideForRoom: true
},
[_matrix.EventType.RoomHistoryVisibility]: {
isState: true,
hideForSpace: true
},
[_matrix.EventType.RoomPowerLevels]: {
isState: true
},
[_matrix.EventType.RoomTopic]: {
isState: true
},
[_matrix.EventType.RoomTombstone]: {
isState: true,
hideForSpace: true
},
[_matrix.EventType.RoomEncryption]: {
isState: true,
hideForSpace: true
},
[_matrix.EventType.RoomServerAcl]: {
isState: true,
hideForSpace: true
},
[_matrix.EventType.RoomPinnedEvents]: {
isState: true,
hideForSpace: true
},
[_matrix.EventType.Reaction]: {
isState: false,
hideForSpace: true
},
[_matrix.EventType.RoomRedaction]: {
isState: false,
hideForSpace: true
},
// MSC3401: Native Group VoIP signaling
[_Call.ElementCall.CALL_EVENT_TYPE.name]: {
isState: true,
hideForSpace: true
},
[_Call.ElementCall.MEMBER_EVENT_TYPE.name]: {
isState: true,
hideForSpace: true
},
// TODO: Enable support for m.widget event type (https://github.com/vector-im/element-web/issues/13111)
"im.vector.modular.widgets": {
isState: true,
hideForSpace: true
},
[_voiceBroadcast.VoiceBroadcastInfoEventType]: {
isState: true,
hideForSpace: true
}
};
// parse a string as an integer; if the input is undefined, or cannot be parsed
// as an integer, return a default.
function parseIntWithDefault(val, def) {
const res = parseInt(val);
return isNaN(res) ? def : res;
}
class BannedUser extends _react.default.Component {
constructor(...args) {
super(...args);
(0, _defineProperty2.default)(this, "onUnbanClick", () => {
this.context.unban(this.props.member.roomId, this.props.member.userId).catch(err => {
_logger.logger.error("Failed to unban: " + err);
_Modal.default.createDialog(_ErrorDialog.default, {
title: (0, _languageHandler._t)("common|error"),
description: (0, _languageHandler._t)("room_settings|permissions|error_unbanning")
});
});
});
}
render() {
let unbanButton;
if (this.props.canUnban) {
unbanButton = /*#__PURE__*/_react.default.createElement(_AccessibleButton.default, {
className: "mx_RolesRoomSettingsTab_unbanBtn",
kind: "danger_sm",
onClick: this.onUnbanClick
}, (0, _languageHandler._t)("action|unban"));
}
const userId = this.props.member.name === this.props.member.userId ? null : this.props.member.userId;
return /*#__PURE__*/_react.default.createElement("li", null, unbanButton, /*#__PURE__*/_react.default.createElement("span", {
title: (0, _languageHandler._t)("room_settings|permissions|banned_by", {
displayName: this.props.by
})
}, /*#__PURE__*/_react.default.createElement("strong", null, this.props.member.name), " ", userId, this.props.reason ? " " + (0, _languageHandler._t)("room_settings|permissions|ban_reason") + ": " + this.props.reason : ""));
}
}
exports.BannedUser = BannedUser;
(0, _defineProperty2.default)(BannedUser, "contextType", _MatrixClientContext.default);
class RolesRoomSettingsTab extends _react.default.Component {
constructor(...args) {
super(...args);
(0, _defineProperty2.default)(this, "onRoomStateUpdate", state => {
if (state.roomId !== this.props.room.roomId) return;
this.onThisRoomMembership();
});
(0, _defineProperty2.default)(this, "onThisRoomMembership", (0, _lodash.throttle)(() => {
this.forceUpdate();
}, 200, {
leading: true,
trailing: true
}));
(0, _defineProperty2.default)(this, "onPowerLevelsChanged", async (value, powerLevelKey) => {
const client = this.context;
const room = this.props.room;
const plEvent = room.currentState.getStateEvents(_matrix.EventType.RoomPowerLevels, "");
let plContent = plEvent?.getContent() ?? {};
// Clone the power levels just in case
plContent = Object.assign({}, plContent);
const eventsLevelPrefix = "event_levels_";
if (powerLevelKey.startsWith(eventsLevelPrefix)) {
// deep copy "events" object, Object.assign itself won't deep copy
plContent["events"] = Object.assign({}, plContent["events"] || {});
plContent["events"][powerLevelKey.slice(eventsLevelPrefix.length)] = value;
} else {
const keyPath = powerLevelKey.split(".");
let parentObj = {};
let currentObj = plContent;
for (const key of keyPath) {
if (!currentObj[key]) {
currentObj[key] = {};
}
parentObj = currentObj;
currentObj = currentObj[key];
}
parentObj[keyPath[keyPath.length - 1]] = value;
}
try {
await client.sendStateEvent(this.props.room.roomId, _matrix.EventType.RoomPowerLevels, plContent);
} catch (e) {
_logger.logger.error(e);
_Modal.default.createDialog(_ErrorDialog.default, {
title: (0, _languageHandler._t)("room_settings|permissions|error_changing_pl_reqs_title"),
description: (0, _languageHandler._t)("room_settings|permissions|error_changing_pl_reqs_description")
});
// Rethrow so that the PowerSelector can roll back
throw e;
}
});
(0, _defineProperty2.default)(this, "onUserPowerLevelChanged", async (value, powerLevelKey) => {
const client = this.context;
const room = this.props.room;
const plEvent = room.currentState.getStateEvents(_matrix.EventType.RoomPowerLevels, "");
let plContent = plEvent?.getContent() ?? {};
// Clone the power levels just in case
plContent = Object.assign({}, plContent);
// powerLevelKey should be a user ID
if (!plContent["users"]) plContent["users"] = {};
plContent["users"][powerLevelKey] = value;
try {
await client.sendStateEvent(this.props.room.roomId, _matrix.EventType.RoomPowerLevels, plContent);
} catch (e) {
_logger.logger.error(e);
_Modal.default.createDialog(_ErrorDialog.default, {
title: (0, _languageHandler._t)("room_settings|permissions|error_changing_pl_title"),
description: (0, _languageHandler._t)("room_settings|permissions|error_changing_pl_description")
});
}
});
}
componentDidMount() {
this.context.on(_matrix.RoomStateEvent.Update, this.onRoomStateUpdate);
}
componentWillUnmount() {
const client = this.context;
if (client) {
client.removeListener(_matrix.RoomStateEvent.Update, this.onRoomStateUpdate);
}
}
populateDefaultPlEvents(eventsSection, stateLevel, eventsLevel) {
for (const desiredEvent of Object.keys(plEventsToShow)) {
if (!(desiredEvent in eventsSection)) {
eventsSection[desiredEvent] = plEventsToShow[desiredEvent].isState ? stateLevel : eventsLevel;
}
}
}
render() {
const client = this.context;
const room = this.props.room;
const isSpaceRoom = room.isSpaceRoom();
const plEvent = room.currentState.getStateEvents(_matrix.EventType.RoomPowerLevels, "");
const plContent = plEvent ? plEvent.getContent() || {} : {};
const canChangeLevels = room.currentState.mayClientSendStateEvent(_matrix.EventType.RoomPowerLevels, client);
const plEventsToLabels = {
// These will be translated for us later.
[_matrix.EventType.RoomAvatar]: isSpaceRoom ? (0, _languageHandler._td)("room_settings|permissions|m.room.avatar_space") : (0, _languageHandler._td)("room_settings|permissions|m.room.avatar"),
[_matrix.EventType.RoomName]: isSpaceRoom ? (0, _languageHandler._td)("room_settings|permissions|m.room.name_space") : (0, _languageHandler._td)("room_settings|permissions|m.room.name"),
[_matrix.EventType.RoomCanonicalAlias]: isSpaceRoom ? (0, _languageHandler._td)("room_settings|permissions|m.room.canonical_alias_space") : (0, _languageHandler._td)("room_settings|permissions|m.room.canonical_alias"),
[_matrix.EventType.SpaceChild]: (0, _languageHandler._td)("room_settings|permissions|m.space.child"),
[_matrix.EventType.RoomHistoryVisibility]: (0, _languageHandler._td)("room_settings|permissions|m.room.history_visibility"),
[_matrix.EventType.RoomPowerLevels]: (0, _languageHandler._td)("room_settings|permissions|m.room.power_levels"),
[_matrix.EventType.RoomTopic]: isSpaceRoom ? (0, _languageHandler._td)("room_settings|permissions|m.room.topic_space") : (0, _languageHandler._td)("room_settings|permissions|m.room.topic"),
[_matrix.EventType.RoomTombstone]: (0, _languageHandler._td)("room_settings|permissions|m.room.tombstone"),
[_matrix.EventType.RoomEncryption]: (0, _languageHandler._td)("room_settings|permissions|m.room.encryption"),
[_matrix.EventType.RoomServerAcl]: (0, _languageHandler._td)("room_settings|permissions|m.room.server_acl"),
[_matrix.EventType.Reaction]: (0, _languageHandler._td)("room_settings|permissions|m.reaction"),
[_matrix.EventType.RoomRedaction]: (0, _languageHandler._td)("room_settings|permissions|m.room.redaction"),
[_matrix.EventType.RoomPinnedEvents]: (0, _languageHandler._td)("room_settings|permissions|m.room.pinned_events"),
// TODO: Enable support for m.widget event type (https://github.com/vector-im/element-web/issues/13111)
"im.vector.modular.widgets": isSpaceRoom ? null : (0, _languageHandler._td)("room_settings|permissions|m.widget"),
[_voiceBroadcast.VoiceBroadcastInfoEventType]: (0, _languageHandler._td)("room_settings|permissions|io.element.voice_broadcast_info")
};
// MSC3401: Native Group VoIP signaling
if (_SettingsStore.default.getValue("feature_group_calls")) {
plEventsToLabels[_Call.ElementCall.CALL_EVENT_TYPE.name] = (0, _languageHandler._td)("room_settings|permissions|m.call");
plEventsToLabels[_Call.ElementCall.MEMBER_EVENT_TYPE.name] = (0, _languageHandler._td)("room_settings|permissions|m.call.member");
}
const powerLevelDescriptors = {
"users_default": {
desc: (0, _languageHandler._t)("room_settings|permissions|users_default"),
defaultValue: 0
},
"events_default": {
desc: (0, _languageHandler._t)("room_settings|permissions|events_default"),
defaultValue: 0,
hideForSpace: true
},
"invite": {
desc: (0, _languageHandler._t)("room_settings|permissions|invite"),
defaultValue: 0
},
"state_default": {
desc: (0, _languageHandler._t)("room_settings|permissions|state_default"),
defaultValue: 50
},
"kick": {
desc: (0, _languageHandler._t)("room_settings|permissions|kick"),
defaultValue: 50
},
"ban": {
desc: (0, _languageHandler._t)("room_settings|permissions|ban"),
defaultValue: 50
},
"redact": {
desc: (0, _languageHandler._t)("room_settings|permissions|redact"),
defaultValue: 50,
hideForSpace: true
},
"notifications.room": {
desc: (0, _languageHandler._t)("room_settings|permissions|notifications.room"),
defaultValue: 50,
hideForSpace: true
}
};
const eventsLevels = plContent.events || {};
const userLevels = plContent.users || {};
const banLevel = parseIntWithDefault(plContent.ban, powerLevelDescriptors.ban.defaultValue);
const defaultUserLevel = parseIntWithDefault(plContent.users_default, powerLevelDescriptors.users_default.defaultValue);
let currentUserLevel = userLevels[client.getUserId()];
if (currentUserLevel === undefined) {
currentUserLevel = defaultUserLevel;
}
this.populateDefaultPlEvents(eventsLevels, parseIntWithDefault(plContent.state_default, powerLevelDescriptors.state_default.defaultValue), parseIntWithDefault(plContent.events_default, powerLevelDescriptors.events_default.defaultValue));
let privilegedUsersSection = /*#__PURE__*/_react.default.createElement("div", null, (0, _languageHandler._t)("room_settings|permissions|no_privileged_users"));
let mutedUsersSection;
if (Object.keys(userLevels).length) {
privilegedUsersSection = /*#__PURE__*/_react.default.createElement(_PowerLevelSelector.PowerLevelSelector, {
title: (0, _languageHandler._t)("room_settings|permissions|privileged_users_section"),
userLevels: userLevels,
canChangeLevels: canChangeLevels,
currentUserLevel: currentUserLevel,
onClick: this.onUserPowerLevelChanged,
filter: user => userLevels[user] > defaultUserLevel
}, /*#__PURE__*/_react.default.createElement("div", null, (0, _languageHandler._t)("room_settings|permissions|no_privileged_users")));
mutedUsersSection = /*#__PURE__*/_react.default.createElement(_PowerLevelSelector.PowerLevelSelector, {
title: (0, _languageHandler._t)("room_settings|permissions|muted_users_section"),
userLevels: userLevels,
canChangeLevels: canChangeLevels,
currentUserLevel: currentUserLevel,
onClick: this.onUserPowerLevelChanged,
filter: user => userLevels[user] < defaultUserLevel
});
}
const banned = room.getMembersWithMembership(_types.KnownMembership.Ban);
let bannedUsersSection;
if (banned?.length) {
const canBanUsers = currentUserLevel >= banLevel;
bannedUsersSection = /*#__PURE__*/_react.default.createElement(_SettingsFieldset.default, {
legend: (0, _languageHandler._t)("room_settings|permissions|banned_users_section")
}, /*#__PURE__*/_react.default.createElement("ul", {
className: "mx_RolesRoomSettingsTab_bannedList"
}, banned.map(member => {
const banEvent = member.events.member?.getContent();
const bannedById = member.events.member?.getSender();
const sender = bannedById ? room.getMember(bannedById) : undefined;
const bannedBy = sender?.name || bannedById; // fallback to mxid
return /*#__PURE__*/_react.default.createElement(BannedUser, {
key: member.userId,
canUnban: canBanUsers,
member: member,
reason: banEvent?.reason,
by: bannedBy
});
})));
}
const powerSelectors = Object.keys(powerLevelDescriptors).map((key, index) => {
const descriptor = powerLevelDescriptors[key];
if (isSpaceRoom && descriptor.hideForSpace) {
return null;
}
const value = parseIntWithDefault((0, _lodash.get)(plContent, key), descriptor.defaultValue);
return /*#__PURE__*/_react.default.createElement("div", {
key: index,
className: ""
}, /*#__PURE__*/_react.default.createElement(_PowerSelector.default, {
label: descriptor.desc,
value: value,
usersDefault: defaultUserLevel,
disabled: !canChangeLevels || currentUserLevel < value,
powerLevelKey: key // Will be sent as the second parameter to `onChange`
,
onChange: this.onPowerLevelsChanged
}));
}).filter(Boolean);
// hide the power level selector for enabling E2EE if it the room is already encrypted
if (client.isRoomEncrypted(this.props.room.roomId)) {
delete eventsLevels[_matrix.EventType.RoomEncryption];
}
const eventPowerSelectors = Object.keys(eventsLevels).map((eventType, i) => {
if (isSpaceRoom && plEventsToShow[eventType]?.hideForSpace) {
return null;
} else if (!isSpaceRoom && plEventsToShow[eventType]?.hideForRoom) {
return null;
}
const translationKeyForEvent = plEventsToLabels[eventType];
let label;
if (translationKeyForEvent) {
const brand = _SdkConfig.default.get("element_call").brand ?? _SdkConfig.DEFAULTS.element_call.brand;
label = (0, _languageHandler._t)(translationKeyForEvent, {
brand
});
} else {
label = (0, _languageHandler._t)("room_settings|permissions|send_event_type", {
eventType
});
}
return /*#__PURE__*/_react.default.createElement("div", {
key: eventType
}, /*#__PURE__*/_react.default.createElement(_PowerSelector.default, {
label: label,
value: eventsLevels[eventType],
usersDefault: defaultUserLevel,
disabled: !canChangeLevels || currentUserLevel < eventsLevels[eventType],
powerLevelKey: "event_levels_" + eventType,
onChange: this.onPowerLevelsChanged
}));
}).filter(Boolean);
return /*#__PURE__*/_react.default.createElement(_SettingsTab.default, null, /*#__PURE__*/_react.default.createElement(_SettingsSection.SettingsSection, {
heading: (0, _languageHandler._t)("room_settings|permissions|title")
}, privilegedUsersSection, canChangeLevels && /*#__PURE__*/_react.default.createElement(_AddPrivilegedUsers.AddPrivilegedUsers, {
room: room,
defaultUserLevel: defaultUserLevel
}), mutedUsersSection, bannedUsersSection, /*#__PURE__*/_react.default.createElement(_SettingsFieldset.default, {
legend: (0, _languageHandler._t)("room_settings|permissions|permissions_section"),
description: isSpaceRoom ? (0, _languageHandler._t)("room_settings|permissions|permissions_section_description_space") : (0, _languageHandler._t)("room_settings|permissions|permissions_section_description_room")
}, powerSelectors, eventPowerSelectors)));
}
}
exports.default = RolesRoomSettingsTab;
(0, _defineProperty2.default)(RolesRoomSettingsTab, "contextType", _MatrixClientContext.default);
//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJuYW1lcyI6WyJfcmVhY3QiLCJfaW50ZXJvcFJlcXVpcmVEZWZhdWx0IiwicmVxdWlyZSIsIl9tYXRyaXgiLCJfbG9nZ2VyIiwiX2xvZGFzaCIsIl90eXBlcyIsIl9sYW5ndWFnZUhhbmRsZXIiLCJfQWNjZXNzaWJsZUJ1dHRvbiIsIl9Nb2RhbCIsIl9FcnJvckRpYWxvZyIsIl9Qb3dlclNlbGVjdG9yIiwiX1NldHRpbmdzRmllbGRzZXQiLCJfU2V0dGluZ3NTdG9yZSIsIl92b2ljZUJyb2FkY2FzdCIsIl9DYWxsIiwiX1Nka0NvbmZpZyIsIl9pbnRlcm9wUmVxdWlyZVdpbGRjYXJkIiwiX0FkZFByaXZpbGVnZWRVc2VycyIsIl9TZXR0aW5nc1RhYiIsIl9TZXR0aW5nc1NlY3Rpb24iLCJfTWF0cml4Q2xpZW50Q29udGV4dCIsIl9Qb3dlckxldmVsU2VsZWN0b3IiLCJfZ2V0UmVxdWlyZVdpbGRjYXJkQ2FjaGUiLCJlIiwiV2Vha01hcCIsInIiLCJ0IiwiX19lc01vZHVsZSIsImRlZmF1bHQiLCJoYXMiLCJnZXQiLCJuIiwiX19wcm90b19fIiwiYSIsIk9iamVjdCIsImRlZmluZVByb3BlcnR5IiwiZ2V0T3duUHJvcGVydHlEZXNjcmlwdG9yIiwidSIsImhhc093blByb3BlcnR5IiwiY2FsbCIsImkiLCJzZXQiLCJwbEV2ZW50c1RvU2hvdyIsIkV2ZW50VHlwZSIsIlJvb21BdmF0YXIiLCJpc1N0YXRlIiwiUm9vbU5hbWUiLCJSb29tQ2Fub25pY2FsQWxpYXMiLCJTcGFjZUNoaWxkIiwiaGlkZUZvclJvb20iLCJSb29tSGlzdG9yeVZpc2liaWxpdHkiLCJoaWRlRm9yU3BhY2UiLCJSb29tUG93ZXJMZXZlbHMiLCJSb29tVG9waWMiLCJSb29tVG9tYnN0b25lIiwiUm9vbUVuY3J5cHRpb24iLCJSb29tU2VydmVyQWNsIiwiUm9vbVBpbm5lZEV2ZW50cyIsIlJlYWN0aW9uIiwiUm9vbVJlZGFjdGlvbiIsIkVsZW1lbnRDYWxsIiwiQ0FMTF9FVkVOVF9UWVBFIiwibmFtZSIsIk1FTUJFUl9FVkVOVF9UWVBFIiwiVm9pY2VCcm9hZGNhc3RJbmZvRXZlbnRUeXBlIiwicGFyc2VJbnRXaXRoRGVmYXVsdCIsInZhbCIsImRlZiIsInJlcyIsInBhcnNlSW50IiwiaXNOYU4iLCJCYW5uZWRVc2VyIiwiUmVhY3QiLCJDb21wb25lbnQiLCJjb25zdHJ1Y3RvciIsImFyZ3MiLCJfZGVmaW5lUHJvcGVydHkyIiwiY29udGV4dCIsInVuYmFuIiwicHJvcHMiLCJtZW1iZXIiLCJyb29tSWQiLCJ1c2VySWQiLCJjYXRjaCIsImVyciIsImxvZ2dlciIsImVycm9yIiwiTW9kYWwiLCJjcmVhdGVEaWFsb2ciLCJFcnJvckRpYWxvZyIsInRpdGxlIiwiX3QiLCJkZXNjcmlwdGlvbiIsInJlbmRlciIsInVuYmFuQnV0dG9uIiwiY2FuVW5iYW4iLCJjcmVhdGVFbGVtZW50IiwiY2xhc3NOYW1lIiwia2luZCIsIm9uQ2xpY2siLCJvblVuYmFuQ2xpY2siLCJkaXNwbGF5TmFtZSIsImJ5IiwicmVhc29uIiwiZXhwb3J0cyIsIk1hdHJpeENsaWVudENvbnRleHQiLCJSb2xlc1Jvb21TZXR0aW5nc1RhYiIsInN0YXRlIiwicm9vbSIsIm9uVGhpc1Jvb21NZW1iZXJzaGlwIiwidGhyb3R0bGUiLCJmb3JjZVVwZGF0ZSIsImxlYWRpbmciLCJ0cmFpbGluZyIsInZhbHVlIiwicG93ZXJMZXZlbEtleSIsImNsaWVudCIsInBsRXZlbnQiLCJjdXJyZW50U3RhdGUiLCJnZXRTdGF0ZUV2ZW50cyIsInBsQ29udGVudCIsImdldENvbnRlbnQiLCJhc3NpZ24iLCJldmVudHNMZXZlbFByZWZpeCIsInN0YXJ0c1dpdGgiLCJzbGljZSIsImxlbmd0aCIsImtleVBhdGgiLCJzcGxpdCIsInBhcmVudE9iaiIsImN1cnJlbnRPYmoiLCJrZXkiLCJzZW5kU3RhdGVFdmVudCIsImNvbXBvbmVudERpZE1vdW50Iiwib24iLCJSb29tU3RhdGVFdmVudCIsIlVwZGF0ZSIsIm9uUm9vbVN0YXRlVXBkYXRlIiwiY29tcG9uZW50V2lsbFVubW91bnQiLCJyZW1vdmVMaXN0ZW5lciIsInBvcHVsYXRlRGVmYXVsdFBsRXZlbnRzIiwiZXZlbnRzU2VjdGlvbiIsInN0YXRlTGV2ZWwiLCJldmVudHNMZXZlbCIsImRlc2lyZWRFdmVudCIsImtleXMiLCJpc1NwYWNlUm9vbSIsImNhbkNoYW5nZUxldmVscyIsIm1heUNsaWVudFNlbmRTdGF0ZUV2ZW50IiwicGxFdmVudHNUb0xhYmVscyIsIl90ZCIsIlNldHRpbmdzU3RvcmUiLCJnZXRWYWx1ZSIsInBvd2VyTGV2ZWxEZXNjcmlwdG9ycyIsImRlc2MiLCJkZWZhdWx0VmFsdWUiLCJldmVudHNMZXZlbHMiLCJldmVudHMiLCJ1c2VyTGV2ZWxzIiwidXNlcnMiLCJiYW5MZXZlbCIsImJhbiIsImRlZmF1bHRVc2VyTGV2ZWwiLCJ1c2Vyc19kZWZhdWx0IiwiY3VycmVudFVzZXJMZXZlbCIsImdldFVzZXJJZCIsInVuZGVmaW5lZCIsInN0YXRlX2RlZmF1bHQiLCJldmVudHNfZGVmYXVsdCIsInByaXZpbGVnZWRVc2Vyc1NlY3Rpb24iLCJtdXRlZFVzZXJzU2VjdGlvbiIsIlBvd2VyTGV2ZWxTZWxlY3RvciIsIm9uVXNlclBvd2VyTGV2ZWxDaGFuZ2VkIiwiZmlsdGVyIiwidXNlciIsImJhbm5lZCIsImdldE1lbWJlcnNXaXRoTWVtYmVyc2hpcCIsIktub3duTWVtYmVyc2hpcCIsIkJhbiIsImJhbm5lZFVzZXJzU2VjdGlvbiIsImNhbkJhblVzZXJzIiwibGVnZW5kIiwibWFwIiwiYmFuRXZlbnQiLCJiYW5uZWRCeUlkIiwiZ2V0U2VuZGVyIiwic2VuZGVyIiwiZ2V0TWVtYmVyIiwiYmFubmVkQnkiLCJwb3dlclNlbGVjdG9ycyIsImluZGV4IiwiZGVzY3JpcHRvciIsImxhYmVsIiwidXNlcnNEZWZhdWx0IiwiZGlzYWJsZWQiLCJvbkNoYW5nZSIsIm9uUG93ZXJMZXZlbHNDaGFuZ2VkIiwiQm9vbGVhbiIsImlzUm9vbUVuY3J5cHRlZCIsImV2ZW50UG93ZXJTZWxlY3RvcnMiLCJldmVudFR5cGUiLCJ0cmFuc2xhdGlvbktleUZvckV2ZW50IiwiYnJhbmQiLCJTZGtDb25maWciLCJERUZBVUxUUyIsImVsZW1lbnRfY2FsbCIsIlNldHRpbmdzU2VjdGlvbiIsImhlYWRpbmciLCJBZGRQcml2aWxlZ2VkVXNlcnMiXSwic291cmNlcyI6WyIuLi8uLi8uLi8uLi8uLi8uLi9zcmMvY29tcG9uZW50cy92aWV3cy9zZXR0aW5ncy90YWJzL3Jvb20vUm9sZXNSb29tU2V0dGluZ3NUYWIudHN4Il0sInNvdXJjZXNDb250ZW50IjpbIi8qXG5Db3B5cmlnaHQgMjAyNCBOZXcgVmVjdG9yIEx0ZC5cbkNvcHlyaWdodCAyMDE5LTIwMjEgVGhlIE1hdHJpeC5vcmcgRm91bmRhdGlvbiBDLkkuQy5cblxuU1BEWC1MaWNlbnNlLUlkZW50aWZpZXI6IEFHUEwtMy4wLW9ubHkgT1IgR1BMLTMuMC1vbmx5XG5QbGVhc2Ugc2VlIExJQ0VOU0UgZmlsZXMgaW4gdGhlIHJlcG9zaXRvcnkgcm9vdCBmb3IgZnVsbCBkZXRhaWxzLlxuKi9cblxuaW1wb3J0IFJlYWN0IGZyb20gXCJyZWFjdFwiO1xuaW1wb3J0IHsgRXZlbnRUeXBlLCBSb29tTWVtYmVyLCBSb29tU3RhdGUsIFJvb21TdGF0ZUV2ZW50LCBSb29tLCBJQ29udGVudCB9IGZyb20gXCJtYXRyaXgtanMtc2RrL3NyYy9tYXRyaXhcIjtcbmltcG9ydCB7IGxvZ2dlciB9IGZyb20gXCJtYXRyaXgtanMtc2RrL3NyYy9sb2dnZXJcIjtcbmltcG9ydCB7IHRocm90dGxlLCBnZXQgfSBmcm9tIFwibG9kYXNoXCI7XG5pbXBvcnQgeyBLbm93bk1lbWJlcnNoaXAsIFJvb21Qb3dlckxldmVsc0V2ZW50Q29udGVudCB9IGZyb20gXCJtYXRyaXgtanMtc2RrL3NyYy90eXBlc1wiO1xuXG5pbXBvcnQgeyBfdCwgX3RkLCBUcmFuc2xhdGlvbktleSB9IGZyb20gXCIuLi8uLi8uLi8uLi8uLi9sYW5ndWFnZUhhbmRsZXJcIjtcbmltcG9ydCBBY2Nlc3NpYmxlQnV0dG9uIGZyb20gXCIuLi8uLi8uLi9lbGVtZW50cy9BY2Nlc3NpYmxlQnV0dG9uXCI7XG5pbXBvcnQgTW9kYWwgZnJvbSBcIi4uLy4uLy4uLy4uLy4uL01vZGFsXCI7XG5pbXBvcnQgRXJyb3JEaWFsb2cgZnJvbSBcIi4uLy4uLy4uL2RpYWxvZ3MvRXJyb3JEaWFsb2dcIjtcbmltcG9ydCBQb3dlclNlbGVjdG9yIGZyb20gXCIuLi8uLi8uLi9lbGVtZW50cy9Qb3dlclNlbGVjdG9yXCI7XG5pbXBvcnQgU2V0dGluZ3NGaWVsZHNldCBmcm9tIFwiLi4vLi4vU2V0dGluZ3NGaWVsZHNldFwiO1xuaW1wb3J0IFNldHRpbmdzU3RvcmUgZnJvbSBcIi4uLy4uLy4uLy4uLy4uL3NldHRpbmdzL1NldHRpbmdzU3RvcmVcIjtcbmltcG9ydCB7IFZvaWNlQnJvYWRjYXN0SW5mb0V2ZW50VHlwZSB9IGZyb20gXCIuLi8uLi8uLi8uLi8uLi92b2ljZS1icm9hZGNhc3RcIjtcbmltcG9ydCB7IEVsZW1lbnRDYWxsIH0gZnJvbSBcIi4uLy4uLy4uLy4uLy4uL21vZGVscy9DYWxsXCI7XG5pbXBvcnQgU2RrQ29uZmlnLCB7IERFRkFVTFRTIH0gZnJvbSBcIi4uLy4uLy4uLy4uLy4uL1Nka0NvbmZpZ1wiO1xuaW1wb3J0IHsgQWRkUHJpdmlsZWdlZFVzZXJzIH0gZnJvbSBcIi4uLy4uL0FkZFByaXZpbGVnZWRVc2Vyc1wiO1xuaW1wb3J0IFNldHRpbmdzVGFiIGZyb20gXCIuLi9TZXR0aW5nc1RhYlwiO1xuaW1wb3J0IHsgU2V0dGluZ3NTZWN0aW9uIH0gZnJvbSBcIi4uLy4uL3NoYXJlZC9TZXR0aW5nc1NlY3Rpb25cIjtcbmltcG9ydCBNYXRyaXhDbGllbnRDb250ZXh0IGZyb20gXCIuLi8uLi8uLi8uLi8uLi9jb250ZXh0cy9NYXRyaXhDbGllbnRDb250ZXh0XCI7XG5pbXBvcnQgeyBQb3dlckxldmVsU2VsZWN0b3IgfSBmcm9tIFwiLi4vLi4vUG93ZXJMZXZlbFNlbGVjdG9yXCI7XG5cbmludGVyZmFjZSBJRXZlbnRTaG93T3B0cyB7XG4gICAgaXNTdGF0ZT86IGJvb2xlYW47XG4gICAgaGlkZUZvclNwYWNlPzogYm9vbGVhbjtcbiAgICBoaWRlRm9yUm9vbT86IGJvb2xlYW47XG59XG5cbmludGVyZmFjZSBJUG93ZXJMZXZlbERlc2NyaXB0b3Ige1xuICAgIGRlc2M6IHN0cmluZztcbiAgICBkZWZhdWx0VmFsdWU6IG51bWJlcjtcbiAgICBoaWRlRm9yU3BhY2U/OiBib29sZWFuO1xufVxuXG5jb25zdCBwbEV2ZW50c1RvU2hvdzogUmVjb3JkPHN0cmluZywgSUV2ZW50U2hvd09wdHM+ID0ge1xuICAgIC8vIElmIGFuIGV2ZW50IGlzIGxpc3RlZCBoZXJlLCBpdCB3aWxsIGJlIHNob3duIGluIHRoZSBQTCBzZXR0aW5ncy4gRGVmYXVsdHMgd2lsbCBiZSBjYWxjdWxhdGVkLlxuICAgIFtFdmVudFR5cGUuUm9vbUF2YXRhcl06IHsgaXNTdGF0ZTogdHJ1ZSB9LFxuICAgIFtFdmVudFR5cGUuUm9vbU5hbWVdOiB7IGlzU3RhdGU6IHRydWUgfSxcbiAgICBbRXZlbnRUeXBlLlJvb21DYW5vbmljYWxBbGlhc106IHsgaXNTdGF0ZTogdHJ1ZSB9LFxuICAgIFtFdmVudFR5cGUuU3BhY2VDaGlsZF06IHsgaXNTdGF0ZTogdHJ1ZSwgaGlkZUZvclJvb206IHRydWUgfSxcbiAgICBbRXZlbnRUeXBlLlJvb21IaXN0b3J5VmlzaWJpbGl0eV06IHsgaXNTdGF0ZTogdHJ1ZSwgaGlkZUZvclNwYWNlOiB0cnVlIH0sXG4gICAgW0V2ZW50VHlwZS5Sb29tUG93ZXJMZXZlbHNdOiB7IGlzU3RhdGU6IHRydWUgfSxcbiAgICBbRXZlbnRUeXBlLlJvb21Ub3BpY106IHsgaXNTdGF0ZTogdHJ1ZSB9LFxuICAgIFtFdmVudFR5cGUuUm9vbVRvbWJzdG9uZV06IHsgaXNTdGF0ZTogdHJ1ZSwgaGlkZUZvclNwYWNlOiB0cnVlIH0sXG4gICAgW0V2ZW50VHlwZS5Sb29tRW5jcnlwdGlvbl06IHsgaXNTdGF0ZTogdHJ1ZSwgaGlkZUZvclNwYWNlOiB0cnVlIH0sXG4gICAgW0V2ZW50VHlwZS5Sb29tU2VydmVyQWNsXTogeyBpc1N0YXRlOiB0cnVlLCBoaWRlRm9yU3BhY2U6IHRydWUgfSxcbiAgICBbRXZlbnRUeXBlLlJvb21QaW5uZWRFdmVudHNdOiB7IGlzU3RhdGU6IHRydWUsIGhpZGVGb3JTcGFjZTogdHJ1ZSB9LFxuICAgIFtFdmVudFR5cGUuUmVhY3Rpb25dOiB7IGlzU3RhdGU6IGZhbHNlLCBoaWRlRm9yU3BhY2U6IHRydWUgfSxcbiAgICBbRXZlbnRUeXBlLlJvb21SZWRhY3Rpb25dOiB7IGlzU3RhdGU6IGZhbHNlLCBoaWRlRm9yU3BhY2U6IHRydWUgfSxcblxuICAgIC8vIE1TQzM0MDE6IE5hdGl2ZSBHcm91cCBWb0lQIHNpZ25hbGluZ1xuICAgIFtFbGVtZW50Q2FsbC5DQUxMX0VWRU5UX1RZUEUubmFtZV06IHsgaXNTdGF0ZTogdHJ1ZSwgaGlkZUZvclNwYWNlOiB0cnVlIH0sXG4gICAgW0VsZW1lbnRDYWxsLk1FTUJFUl9FVkVOVF9UWVBFLm5hbWVdOiB7IGlzU3RhdGU6IHRydWUsIGhpZGVGb3JTcGFjZTogdHJ1ZSB9LFxuXG4gICAgLy8gVE9ETzogRW5hYmxlIHN1cHBvcnQgZm9yIG0ud2lkZ2V0IGV2ZW50IHR5cGUgKGh0dHBzOi8vZ2l0aHViLmNvbS92ZWN0b3ItaW0vZWxlbWVudC13ZWIvaXNzdWVzLzEzMTExKVxuICAgIFwiaW0udmVjdG9yLm1vZHVsYXIud2lkZ2V0c1wiOiB7IGlzU3RhdGU6IHRydWUsIGhpZGVGb3JTcGFjZTogdHJ1ZSB9LFxuICAgIFtWb2ljZUJyb2FkY2FzdEluZm9FdmVudFR5cGVdOiB7IGlzU3RhdGU6IHRydWUsIGhpZGVGb3JTcGFjZTogdHJ1ZSB9LFxufTtcblxuLy8gcGFyc2UgYSBzdHJpbmcgYXMgYW4gaW50ZWdlcjsgaWYgdGhlIGlucHV0IGlzIHVuZGVmaW5lZCwgb3IgY2Fubm90IGJlIHBhcnNlZFxuLy8gYXMgYW4gaW50ZWdlciwgcmV0dXJuIGEgZGVmYXVsdC5cbmZ1bmN0aW9uIHBhcnNlSW50V2l0aERlZmF1bHQodmFsOiBzdHJpbmcsIGRlZjogbnVtYmVyKTogbnVtYmVyIHtcbiAgICBjb25zdCByZXMgPSBwYXJzZUludCh2YWwpO1xuICAgIHJldHVybiBpc05hTihyZXMpID8gZGVmIDogcmVzO1xufVxuXG5pbnRlcmZhY2UgSUJhbm5lZFVzZXJQcm9wcyB7XG4gICAgY2FuVW5iYW4/OiBib29sZWFuO1xuICAgIG1lbWJlcjogUm9vbU1lbWJlcjtcbiAgICBieTogc3RyaW5nO1xuICAgIHJlYXNvbj86IHN0cmluZztcbn1cblxuZXhwb3J0IGNsYXNzIEJhbm5lZFVzZXIgZXh0ZW5kcyBSZWFjdC5Db21wb25lbnQ8SUJhbm5lZFVzZXJQcm9wcz4ge1xuICAgIHB1YmxpYyBzdGF0aWMgY29udGV4dFR5cGUgPSBNYXRyaXhDbGllbnRDb250ZXh0O1xuICAgIHB1YmxpYyBkZWNsYXJlIGNvbnRleHQ6IFJlYWN0LkNvbnRleHRUeXBlPHR5cGVvZiBNYXRyaXhDbGllbnRDb250ZXh0PjtcblxuICAgIHByaXZhdGUgb25VbmJhbkNsaWNrID0gKCk6IHZvaWQgPT4ge1xuICAgICAgICB0aGlzLmNvbnRleHQudW5iYW4odGhpcy5wcm9wcy5tZW1iZXIucm9vbUlkLCB0aGlzLnByb3BzLm1lbWJlci51c2VySWQpLmNhdGNoKChlcnIpID0+IHtcbiAgICAgICAgICAgIGxvZ2dlci5lcnJvcihcIkZhaWxlZCB0byB1bmJhbjogXCIgKyBlcnIpO1xuICAgICAgICAgICAgTW9kYWwuY3JlYXRlRGlhbG9nKEVycm9yRGlhbG9nLCB7XG4gICAgICAgICAgICAgICAgdGl0bGU6IF90KFwiY29tbW9ufGVycm9yXCIpLFxuICAgICAgICAgICAgICAgIGRlc2NyaXB0aW9uOiBfdChcInJvb21fc2V0dGluZ3N8cGVybWlzc2lvbnN8ZXJyb3JfdW5iYW5uaW5nXCIpLFxuICAgICAgICAgICAgfSk7XG4gICAgICAgIH0pO1xuICAgIH07XG5cbiAgICBwdWJsaWMgcmVuZGVyKCk6IFJlYWN0LlJlYWN0Tm9kZSB7XG4gICAgICAgIGxldCB1bmJhbkJ1dHRvbjtcblxuICAgICAgICBpZiAodGhpcy5wcm9wcy5jYW5VbmJhbikge1xuICAgICAgICAgICAgdW5iYW5CdXR0b24gPSAoXG4gICAgICAgICAgICAgICAgPEFjY2Vzc2libGVCdXR0b25cbiAgICAgICAgICAgICAgICAgICAgY2xhc3NOYW1lPVwibXhfUm9sZXNSb29tU2V0dGluZ3NUYWJfdW5iYW5CdG5cIlxuICAgICAgICAgICAgICAgICAgICBraW5kPVwiZGFuZ2VyX3NtXCJcbiAgICAgICAgICAgICAgICAgICAgb25DbGljaz17dGhpcy5vblVuYmFuQ2xpY2t9XG4gICAgICAgICAgICAgICAgPlxuICAgICAgICAgICAgICAgICAgICB7X3QoXCJhY3Rpb258dW5iYW5cIil9XG4gICAgICAgICAgICAgICAgPC9BY2Nlc3NpYmxlQnV0dG9uPlxuICAgICAgICAgICAgKTtcbiAgICAgICAgfVxuXG4gICAgICAgIGNvbnN0IHVzZXJJZCA9IHRoaXMucHJvcHMubWVtYmVyLm5hbWUgPT09IHRoaXMucHJvcHMubWVtYmVyLnVzZXJJZCA/IG51bGwgOiB0aGlzLnByb3BzLm1lbWJlci51c2VySWQ7XG4gICAgICAgIHJldHVybiAoXG4gICAgICAgICAgICA8bGk+XG4gICAgICAgICAgICAgICAge3VuYmFuQnV0dG9ufVxuICAgICAgICAgICAgICAgIDxzcGFuIHRpdGxlPXtfdChcInJvb21fc2V0dGluZ3N8cGVybWlzc2lvbnN8YmFubmVkX2J5XCIsIHsgZGlzcGxheU5hbWU6IHRoaXMucHJvcHMuYnkgfSl9PlxuICAgICAgICAgICAgICAgICAgICA8c3Ryb25nPnt0aGlzLnByb3BzLm1lbWJlci5uYW1lfTwvc3Ryb25nPiB7dXNlcklkfVxuICAgICAgICAgICAgICAgICAgICB7dGhpcy5wcm9wcy5yZWFzb25cbiAgICAgICAgICAgICAgICAgICAgICAgID8gXCIgXCIgKyBfdChcInJvb21fc2V0dGluZ3N8cGVybWlzc2lvbnN8YmFuX3JlYXNvblwiKSArIFwiOiBcIiArIHRoaXMucHJvcHMucmVhc29uXG4gICAgICAgICAgICAgICAgICAgICAgICA6IFwiXCJ9XG4gICAgICAgICAgICAgICAgPC9zcGFuPlxuICAgICAgICAgICAgPC9saT5cbiAgICAgICAgKTtcbiAgICB9XG59XG5cbmludGVyZmFjZSBJUHJvcHMge1xuICAgIHJvb206IFJvb207XG59XG5cbmV4cG9ydCBkZWZhdWx0IGNsYXNzIFJvbGVzUm9vbVNldHRpbmdzVGFiIGV4dGVuZHMgUmVhY3QuQ29tcG9uZW50PElQcm9wcz4ge1xuICAgIHB1YmxpYyBzdGF0aWMgY29udGV4dFR5cGUgPSBNYXRyaXhDbGllbnRDb250ZXh0O1xuICAgIHB1YmxpYyBkZWNsYXJlIGNvbnRleHQ6IFJlYWN0LkNvbnRleHRUeXBlPHR5cGVvZiBNYXRyaXhDbGllbnRDb250ZXh0PjtcblxuICAgIHB1YmxpYyBjb21wb25lbnREaWRNb3VudCgpOiB2b2lkIHtcbiAgICAgICAgdGhpcy5jb250ZXh0Lm9uKFJvb21TdGF0ZUV2ZW50LlVwZGF0ZSwgdGhpcy5vblJvb21TdGF0ZVVwZGF0ZSk7XG4gICAgfVxuXG4gICAgcHVibGljIGNvbXBvbmVudFdpbGxVbm1vdW50KCk6IHZvaWQge1xuICAgICAgICBjb25zdCBjbGllbnQgPSB0aGlzLmNvbnRleHQ7XG4gICAgICAgIGlmIChjbGllbnQpIHtcbiAgICAgICAgICAgIGNsaWVudC5yZW1vdmVMaXN0ZW5lcihSb29tU3RhdGVFdmVudC5VcGRhdGUsIHRoaXMub25Sb29tU3RhdGVVcGRhdGUpO1xuICAgICAgICB9XG4gICAgfVxuXG4gICAgcHJpdmF0ZSBvblJvb21TdGF0ZVVwZGF0ZSA9IChzdGF0ZTogUm9vbVN0YXRlKTogdm9pZCA9PiB7XG4gICAgICAgIGlmIChzdGF0ZS5yb29tSWQgIT09IHRoaXMucHJvcHMucm9vbS5yb29tSWQpIHJldHVybjtcbiAgICAgICAgdGhpcy5vblRoaXNSb29tTWVtYmVyc2hpcCgpO1xuICAgIH07XG5cbiAgICBwcml2YXRlIG9uVGhpc1Jvb21NZW1iZXJzaGlwID0gdGhyb3R0bGUoXG4gICAgICAgICgpID0+IHtcbiAgICAgICAgICAgIHRoaXMuZm9yY2VVcGRhdGUoKTtcbiAgICAgICAgfSxcbiAgICAgICAgMjAwLFxuICAgICAgICB7IGxlYWRpbmc6IHRydWUsIHRyYWlsaW5nOiB0cnVlIH0sXG4gICAgKTtcblxuICAgIHByaXZhdGUgcG9wdWxhdGVEZWZhdWx0UGxFdmVudHMoXG4gICAgICAgIGV2ZW50c1NlY3Rpb246IFJlY29yZDxzdHJpbmcsIG51bWJlcj4sXG4gICAgICAgIHN0YXRlTGV2ZWw6IG51bWJlcixcbiAgICAgICAgZXZlbnRzTGV2ZWw6IG51bWJlcixcbiAgICApOiB2b2lkIHtcbiAgICAgICAgZm9yIChjb25zdCBkZXNpcmVkRXZlbnQgb2YgT2JqZWN0LmtleXMocGxFdmVudHNUb1Nob3cpKSB7XG4gICAgICAgICAgICBpZiAoIShkZXNpcmVkRXZlbnQgaW4gZXZlbnRzU2VjdGlvbikpIHtcbiAgICAgICAgICAgICAgICBldmVudHNTZWN0aW9uW2Rlc2lyZWRFdmVudF0gPSBwbEV2ZW50c1RvU2hvd1tkZXNpcmVkRXZlbnRdLmlzU3RhdGUgPyBzdGF0ZUxldmVsIDogZXZlbnRzTGV2ZWw7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICB9XG5cbiAgICBwcml2YXRlIG9uUG93ZXJMZXZlbHNDaGFuZ2VkID0gYXN5bmMgKHZhbHVlOiBudW1iZXIsIHBvd2VyTGV2ZWxLZXk6IHN0cmluZyk6IFByb21pc2U8dm9pZD4gPT4ge1xuICAgICAgICBjb25zdCBjbGllbnQgPSB0aGlzLmNvbnRleHQ7XG4gICAgICAgIGNvbnN0IHJvb20gPSB0aGlzLnByb3BzLnJvb207XG4gICAgICAgIGNvbnN0IHBsRXZlbnQgPSByb29tLmN1cnJlbnRTdGF0ZS5nZXRTdGF0ZUV2ZW50cyhFdmVudFR5cGUuUm9vbVBvd2VyTGV2ZWxzLCBcIlwiKTtcbiAgICAgICAgbGV0IHBsQ29udGVudCA9IHBsRXZlbnQ/LmdldENvbnRlbnQ8Um9vbVBvd2VyTGV2ZWxzRXZlbnRDb250ZW50PigpID8/IHt9O1xuXG4gICAgICAgIC8vIENsb25lIHRoZSBwb3dlciBsZXZlbHMganVzdCBpbiBjYXNlXG4gICAgICAgIHBsQ29udGVudCA9IE9iamVjdC5hc3NpZ24oe30sIHBsQ29udGVudCk7XG5cbiAgICAgICAgY29uc3QgZXZlbnRzTGV2ZWxQcmVmaXggPSBcImV2ZW50X2xldmVsc19cIjtcblxuICAgICAgICBpZiAocG93ZXJMZXZlbEtleS5zdGFydHNXaXRoKGV2ZW50c0xldmVsUHJlZml4KSkge1xuICAgICAgICAgICAgLy8gZGVlcCBjb3B5IFwiZXZlbnRzXCIgb2JqZWN0LCBPYmplY3QuYXNzaWduIGl0c2VsZiB3b24ndCBkZWVwIGNvcHlcbiAgICAgICAgICAgIHBsQ29udGVudFtcImV2ZW50c1wiXSA9IE9iamVjdC5hc3NpZ24oe30sIHBsQ29udGVudFtcImV2ZW50c1wiXSB8fCB7fSk7XG4gICAgICAgICAgICBwbENvbnRlbnRbXCJldmVudHNcIl1bcG93ZXJMZXZlbEtleS5zbGljZShldmVudHNMZXZlbFByZWZpeC5sZW5ndGgpXSA9IHZhbHVlO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgY29uc3Qga2V5UGF0aCA9IHBvd2VyTGV2ZWxLZXkuc3BsaXQoXCIuXCIpO1xuICAgICAgICAgICAgbGV0IHBhcmVudE9iajogSUNvbnRlbnQgPSB7fTtcbiAgICAgICAgICAgIGxldCBjdXJyZW50T2JqOiBJQ29udGVudCA9IHBsQ29udGVudDtcbiAgICAgICAgICAgIGZvciAoY29uc3Qga2V5IG9mIGtleVBhdGgpIHtcbiAgICAgICAgICAgICAgICBpZiAoIWN1cnJlbnRPYmpba2V5XSkge1xuICAgICAgICAgICAgICAgICAgICBjdXJyZW50T2JqW2tleV0gPSB7fTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgcGFyZW50T2JqID0gY3VycmVudE9iajtcbiAgICAgICAgICAgICAgICBjdXJyZW50T2JqID0gY3VycmVudE9ialtrZXldO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgcGFyZW50T2JqW2tleVBhdGhba2V5UGF0aC5sZW5ndGggLSAxXV0gPSB2YWx1ZTtcbiAgICAgICAgfVxuXG4gICAgICAgIHRyeSB7XG4gICAgICAgICAgICBhd2FpdCBjbGllbnQuc2VuZFN0YXRlRXZlbnQodGhpcy5wcm9wcy5yb29tLnJvb21JZCwgRXZlbnRUeXBlLlJvb21Qb3dlckxldmVscywgcGxDb250ZW50KTtcbiAgICAgICAgfSBjYXRjaCAoZSkge1xuICAgICAgICAgICAgbG9nZ2VyLmVycm9yKGUpO1xuXG4gICAgICAgICAgICBNb2RhbC5jcmVhdGVEaWFsb2coRXJyb3JEaWFsb2csIHtcbiAgICAgICAgICAgICAgICB0aXRsZTogX3QoXCJyb29tX3NldHRpbmdzfHBlcm1pc3Npb25zfGVycm9yX2NoYW5naW5nX3BsX3JlcXNfdGl0bGVcIiksXG4gICAgICAgICAgICAgICAgZGVzY3JpcHRpb246IF90KFwicm9vbV9zZXR0aW5nc3xwZXJtaXNzaW9uc3xlcnJvcl9jaGFuZ2luZ19wbF9yZXFzX2Rlc2NyaXB0aW9uXCIpLFxuICAgICAgICAgICAgfSk7XG5cbiAgICAgICAgICAgIC8vIFJldGhyb3cgc28gdGhhdCB0aGUgUG93ZXJTZWxlY3RvciBjYW4gcm9sbCBiYWNrXG4gICAgICAgICAgICB0aHJvdyBlO1xuICAgICAgICB9XG4gICAgfTtcblxuICAgIHByaXZhdGUgb25Vc2VyUG93ZXJMZXZlbENoYW5nZWQgPSBhc3luYyAodmFsdWU6IG51bWJlciwgcG93ZXJMZXZlbEtleTogc3RyaW5nKTogUHJvbWlzZTx2b2lkPiA9PiB7XG4gICAgICAgIGNvbnN0IGNsaWVudCA9IHRoaXMuY29udGV4dDtcbiAgICAgICAgY29uc3Qgcm9vbSA9IHRoaXMucHJvcHMucm9vbTtcbiAgICAgICAgY29uc3QgcGxFdmVudCA9IHJvb20uY3VycmVudFN0YXRlLmdldFN0YXRlRXZlbnRzKEV2ZW50VHlwZS5Sb29tUG93ZXJMZXZlbHMsIFwiXCIpO1xuICAgICAgICBsZXQgcGxDb250ZW50ID0gcGxFdmVudD8uZ2V0Q29udGVudDxSb29tUG93ZXJMZXZlbHNFdmVudENvbnRlbnQ+KCkgPz8ge307XG5cbiAgICAgICAgLy8gQ2xvbmUgdGhlIHBvd2VyIGxldmVscyBqdXN0IGluIGNhc2VcbiAgICAgICAgcGxDb250ZW50ID0gT2JqZWN0LmFzc2lnbih7fSwgcGxDb250ZW50KTtcblxuICAgICAgICAvLyBwb3dlckxldmVsS2V5IHNob3VsZCBiZSBhIHVzZXIgSURcbiAgICAgICAgaWYgKCFwbENvbnRlbnRbXCJ1c2Vyc1wiXSkgcGxDb250ZW50W1widXNlcnNcIl0gPSB7fTtcbiAgICAgICAgcGxDb250ZW50W1widXNlcnNcIl1bcG93ZXJMZXZlbEtleV0gPSB2YWx1ZTtcblxuICAgICAgICB0cnkge1xuICAgICAgICAgICAgYXdhaXQgY2xpZW50LnNlbmRTdGF0ZUV2ZW50KHRoaXMucHJvcHMucm9vbS5yb29tSWQsIEV2ZW50VHlwZS5Sb29tUG93ZXJMZXZlbHMsIHBsQ29udGVudCk7XG4gICAgICAgIH0gY2F0Y2ggKGUpIHtcbiAgICAgICAgICAgIGxvZ2dlci5lcnJvcihlKTtcblxuICAgICAgICAgICAgTW9kYWwuY3JlYXRlRGlhbG9nKEVycm9yRGlhbG9nLCB7XG4gICAgICAgICAgICAgICAgdGl0bGU6IF90KFwicm9vbV9zZXR0aW5nc3xwZXJtaXNzaW9uc3xlcnJvcl9jaGFuZ2luZ19wbF90aXRsZVwiKSxcbiAgICAgICAgICAgICAgICBkZXNjcmlwdGlvbjogX3QoXCJyb29tX3NldHRpbmdzfHBlcm1pc3Npb25zfGVycm9yX2NoYW5naW5nX3BsX2Rlc2NyaXB0aW9uXCIpLFxuICAgICAgICAgICAgfSk7XG4gICAgICAgIH1cbiAgICB9O1xuXG4gICAgcHVibGljIHJlbmRlcigpOiBSZWFjdC5SZWFjdE5vZGUge1xuICAgICAgICBjb25zdCBjbGllbnQgPSB0aGlzLmNvbnRleHQ7XG4gICAgICAgIGNvbnN0IHJvb20gPSB0aGlzLnByb3BzLnJvb207XG4gICAgICAgIGNvbnN0IGlzU3BhY2VSb29tID0gcm9vbS5pc1NwYWNlUm9vbSgpO1xuXG4gICAgICAgIGNvbnN0IHBsRXZlbnQgPSByb29tLmN1cnJlbnRTdGF0ZS5nZXRTdGF0ZUV2ZW50cyhFdmVudFR5cGUuUm9vbVBvd2VyTGV2ZWxzLCBcIlwiKTtcbiAgICAgICAgY29uc3QgcGxDb250ZW50ID0gcGxFdmVudCA/IHBsRXZlbnQuZ2V0Q29udGVudCgpIHx8IHt9IDoge307XG4gICAgICAgIGNvbnN0IGNhbkNoYW5nZUxldmVscyA9IHJvb20uY3VycmVudFN0YXRlLm1heUNsaWVudFNlbmRTdGF0ZUV2ZW50KEV2ZW50VHlwZS5Sb29tUG93ZXJMZXZlbHMsIGNsaWVudCk7XG5cbiAgICAgICAgY29uc3QgcGxFdmVudHNUb0xhYmVsczogUmVjb3JkPEV2ZW50VHlwZSB8IHN0cmluZywgVHJhbnNsYXRpb25LZXkgfCBudWxsPiA9IHtcbiAgICAgICAgICAgIC8vIFRoZXNlIHdpbGwgYmUgdHJhbnNsYXRlZCBmb3IgdXMgbGF0ZXIuXG4gICAgICAgICAgICBbRXZlbnRUeXBlLlJvb21BdmF0YXJdOiBpc1NwYWNlUm9vbVxuICAgICAgICAgICAgICAgID8gX3RkKFwicm9vbV9zZXR0aW5nc3xwZXJtaXNzaW9uc3xtLnJvb20uYXZhdGFyX3NwYWNlXCIpXG4gICAgICAgICAgICAgICAgOiBfdGQoXCJyb29tX3NldHRpbmdzfHBlcm1pc3Npb25zfG0ucm9vbS5hdmF0YXJcIiksXG4gICAgICAgICAgICBbRXZlbnRUeXBlLlJvb21OYW1lXTogaXNTcGFjZVJvb21cbiAgICAgICAgICAgICAgICA/IF90ZChcInJvb21fc2V0dGluZ3N8cGVybWlzc2lvbnN8bS5yb29tLm5hbWVfc3BhY2VcIilcbiAgICAgICAgICAgICAgICA6IF90ZChcInJvb21fc2V0dGluZ3N8cGVybWlzc2lvbnN8bS5yb29tLm5hbWVcIiksXG4gICAgICAgICAgICBbRXZlbnRUeXBlLlJvb21DYW5vbmljYWxBbGlhc106IGlzU3BhY2VSb29tXG4gICAgICAgICAgICAgICAgPyBfdGQoXCJyb29tX3NldHRpbmdzfHBlcm1pc3Npb25zfG0ucm9vbS5jYW5vbmljYWxfYWxpYXNfc3BhY2VcIilcbiAgICAgICAgICAgICAgICA6IF90ZChcInJvb21fc2V0dGluZ3N8cGVybWlzc2lvbnN8bS5yb29tLmNhbm9uaWNhbF9hbGlhc1wiKSxcbiAgICAgICAgICAgIFtFdmVudFR5cGUuU3BhY2VDaGlsZF06IF90ZChcInJvb21fc2V0dGluZ3N8cGVybWlzc2lvbnN8bS5zcGFjZS5jaGlsZFwiKSxcbiAgICAgICAgICAgIFtFdmVudFR5cGUuUm9vbUhpc3RvcnlWaXNpYmlsaXR5XTogX3RkKFwicm9vbV9zZXR0aW5nc3xwZXJtaXNzaW9uc3xtLnJvb20uaGlzdG9yeV92aXNpYmlsaXR5XCIpLFxuICAgICAgICAgICAgW0V2ZW50VHlwZS5Sb29tUG93ZXJMZXZlbHNdOiBfdGQoXCJyb29tX3NldHRpbmdzfHBlcm1pc3Npb25zfG0ucm9vbS5wb3dlcl9sZXZlbHNcIiksXG4gICAgICAgICAgICBbRXZlbnRUeXBlLlJvb21Ub3BpY106IGlzU3BhY2VSb29tXG4gICAgICAgICAgICAgICAgPyBfdGQoXCJyb29tX3NldHRpbmdzfHBlcm1pc3Npb25zfG0ucm9vbS50b3BpY19zcGFjZVwiKVxuICAgICAgICAgICAgICAgIDogX3RkKFwicm9vbV9zZXR0aW5nc3xwZXJtaXNzaW9uc3xtLnJvb20udG9waWNcIiksXG4gICAgICAgICAgICBbRXZlbnRUeXBlLlJvb21Ub21ic3RvbmVdOiBfdGQoXCJyb29tX3NldHRpbmdzfHBlcm1pc3Npb25zfG0ucm9vbS50b21ic3RvbmVcIiksXG4gICAgICAgICAgICBbRXZlbnRUeXBlLlJvb21FbmNyeXB0aW9uXTogX3RkKFwicm9vbV9zZXR0aW5nc3xwZXJtaXNzaW9uc3xtLnJvb20uZW5jcnlwdGlvblwiKSxcbiAgICAgICAgICAgIFtFdmVudFR5cGUuUm9vbVNlcnZlckFjbF06IF90ZChcInJvb21fc2V0dGluZ3N8cGVybWlzc2lvbnN8bS5yb29tLnNlcnZlcl9hY2xcIiksXG4gICAgICAgICAgICBbRXZlbnRUeXBlLlJlYWN0aW9uXTogX3RkKFwicm9vbV9zZXR0aW5nc3xwZXJtaXNzaW9uc3xtLnJlYWN0aW9uXCIpLFxuICAgICAgICAgICAgW0V2ZW50VHlwZS5Sb29tUmVkYWN0aW9uXTogX3RkKFwicm9vbV9zZXR0aW5nc3xwZXJtaXNzaW9uc3xtLnJvb20ucmVkYWN0aW9uXCIpLFxuICAgICAgICAgICAgW0V2ZW50VHlwZS5Sb29tUGlubmVkRXZlbnRzXTogX3RkKFwicm9vbV9zZXR0aW5nc3xwZXJtaXNzaW9uc3xtLnJvb20ucGlubmVkX2V2ZW50c1wiKSxcblxuICAgICAgICAgICAgLy8gVE9ETzogRW5hYmxlIHN1cHBvcnQgZm9yIG0ud2lkZ2V0IGV2ZW50IHR5cGUgKGh0dHBzOi8vZ2l0aHViLmNvbS92ZWN0b3ItaW0vZWxlbWVudC13ZWIvaXNzdWVzLzEzMTExKVxuICAgICAgICAgICAgXCJpbS52ZWN0b3IubW9kdWxhci53aWRnZXRzXCI6IGlzU3BhY2VSb29tID8gbnVsbCA6IF90ZChcInJvb21fc2V0dGluZ3N8cGVybWlzc2lvbnN8bS53aWRnZXRcIiksXG4gICAgICAgICAgICBbVm9pY2VCcm9hZGNhc3RJbmZvRXZlbnRUeXBlXTogX3RkKFwicm9vbV9zZXR0aW5nc3xwZXJtaXNzaW9uc3xpby5lbGVtZW50LnZvaWNlX2Jyb2FkY2FzdF9pbmZvXCIpLFxuICAgICAgICB9O1xuXG4gICAgICAgIC8vIE1TQzM0MDE6IE5hdGl2ZSBHcm91cCBWb0lQIHNpZ25hbGluZ1xuICAgICAgICBpZiAoU2V0dGluZ3NTdG9yZS5nZXRWYWx1ZShcImZlYXR1cmVfZ3JvdXBfY2FsbHNcIikpIHtcbiAgICAgICAgICAgIHBsRXZlbnRzVG9MYWJlbHNbRWxlbWVudENhbGwuQ0FMTF9FVkVOVF9UWVBFLm5hbWVdID0gX3RkKFwicm9vbV9zZXR0aW5nc3xwZXJtaXNzaW9uc3xtLmNhbGxcIik7XG4gICAgICAgICAgICBwbEV2ZW50c1RvTGFiZWxzW0VsZW1lbnRDYWxsLk1FTUJFUl9FVkVOVF9UWVBFLm5hbWVdID0gX3RkKFwicm9vbV9zZXR0aW5nc3xwZXJtaXNzaW9uc3xtLmNhbGwubWVtYmVyXCIpO1xuICAgICAgICB9XG5cbiAgICAgICAgY29uc3QgcG93ZXJMZXZlbERlc2NyaXB0b3JzOiBSZWNvcmQ8c3RyaW5nLCBJUG93ZXJMZXZlbERlc2NyaXB0b3I+ID0ge1xuICAgICAgICAgICAgXCJ1c2Vyc19kZWZhdWx0XCI6IHtcbiAgICAgICAgICAgICAgICBkZXNjOiBfdChcInJvb21fc2V0dGluZ3N8cGVybWlzc2lvbnN8dXNlcnNfZGVmYXVsdFwiKSxcbiAgICAgICAgICAgICAgICBkZWZhdWx0VmFsdWU6IDAsXG4gICAgICAgICAgICB9LFxuICAgICAgICAgICAgXCJldmVudHNfZGVmYXVsdFwiOiB7XG4gICAgICAgICAgICAgICAgZGVzYzogX3QoXCJyb29tX3NldHRpbmdzfHBlcm1pc3Npb25zfGV2ZW50c19kZWZhdWx0XCIpLFxuICAgICAgICAgICAgICAgIGRlZmF1bHRWYWx1ZTogMCxcbiAgICAgICAgICAgICAgICBoaWRlRm9yU3BhY2U6IHRydWUsXG4gICAgICAgICAgICB9LFxuICAgICAgICAgICAgXCJpbnZpdGVcIjoge1xuICAgICAgICAgICAgICAgIGRlc2M6IF90KFwicm9vbV9zZXR0aW5nc3xwZXJtaXNzaW9uc3xpbnZpdGVcIiksXG4gICAgICAgICAgICAgICAgZGVmYXVsdFZhbHVlOiAwLFxuICAgICAgICAgICAgfSxcbiAgICAgICAgICAgIFwic3RhdGVfZGVmYXVsdFwiOiB7XG4gICAgICAgICAgICAgICAgZGVzYzogX3QoXCJyb29tX3NldHRpbmdzfHBlcm1pc3Npb25zfHN0YXRlX2RlZmF1bHRcIiksXG4gICAgICAgICAgICAgICAgZGVmYXVsdFZhbHVlOiA1MCxcbiAgICAgICAgICAgIH0sXG4gICAgICAgICAgICBcImtpY2tcIjoge1xuICAgICAgICAgICAgICAgIGRlc2M6IF90KFwicm9vbV9zZXR0aW5nc3xwZXJtaXNzaW9uc3xraWNrXCIpLFxuICAgICAgICAgICAgICAgIGRlZmF1bHRWYWx1ZTogNTAsXG4gICAgICAgICAgICB9LFxuICAgICAgICAgICAgXCJiYW5cIjoge1xuICAgICAgICAgICAgICAgIGRlc2M6IF90KFwicm9vbV9zZXR0aW5nc3xwZXJtaXNzaW9uc3xiYW5cIiksXG4gICAgICAgICAgICAgICAgZGVmYXVsdFZhbHVlOiA1MCxcbiAgICAgICAgICAgIH0sXG4gICAgICAgICAgICBcInJlZGFjdFwiOiB7XG4gICAgICAgICAgICAgICAgZGVzYzogX3QoXCJyb29tX3NldHRpbmdzfHBlcm1pc3Npb25zfHJlZGFjdFwiKSxcbiAgICAgICAgICAgICAgICBkZWZhdWx0VmFsdWU6IDUwLFxuICAgICAgICAgICAgICAgIGhpZGVGb3JTcGFjZTogdHJ1ZSxcbiAgICAgICAgICAgIH0sXG4gICAgICAgICAgICBcIm5vdGlmaWNhdGlvbnMucm9vbVwiOiB7XG4gICAgICAgICAgICAgICAgZGVzYzogX3QoXCJyb29tX3NldHRpbmdzfHBlcm1pc3Npb25zfG5vdGlmaWNhdGlvbnMucm9vbVwiKSxcbiAgICAgICAgICAgICAgICBkZWZhdWx0VmFsdWU6IDUwLFxuICAgICAgICAgICAgICAgIGhpZGVGb3JTcGFjZTogdHJ1ZSxcbiAgICAgICAgICAgIH0sXG4gICAgICAgIH07XG5cbiAgICAgICAgY29uc3QgZXZlbnRzTGV2ZWxzID0gcGxDb250ZW50LmV2ZW50cyB8fCB7fTtcbiAgICAgICAgY29uc3QgdXNlckxldmVscyA9IHBsQ29udGVudC51c2VycyB8fCB7fTtcbiAgICAgICAgY29uc3QgYmFuTGV2ZWwgPSBwYXJzZUludFdpdGhEZWZhdWx0KHBsQ29udGVudC5iYW4sIHBvd2VyTGV2ZWxEZXNjcmlwdG9ycy5iYW4uZGVmYXVsdFZhbHVlKTtcbiAgICAgICAgY29uc3QgZGVmYXVsdFVzZXJMZXZlbCA9IHBhcnNlSW50V2l0aERlZmF1bHQoXG4gICAgICAgICAgICBwbENvbnRlbnQudXNlcnNfZGVmYXVsdCxcbiAgICAgICAgICAgIHBvd2VyTGV2ZWxEZXNjcmlwdG9ycy51c2Vyc19kZWZhdWx0LmRlZmF1bHRWYWx1ZSxcbiAgICAgICAgKTtcblxuICAgICAgICBsZXQgY3VycmVudFVzZXJMZXZlbCA9IHVzZXJMZXZlbHNbY2xpZW50LmdldFVzZXJJZCgpIV07XG4gICAgICAgIGlmIChjdXJyZW50VXNlckxldmVsID09PSB1bmRlZmluZWQpIHtcbiAgICAgICAgICAgIGN1cnJlbnRVc2VyTGV2ZWwgPSBkZWZhdWx0VXNlckxldmVsO1xuICAgICAgICB9XG5cbiAgICAgICAgdGhpcy5wb3B1bGF0ZURlZmF1bHRQbEV2ZW50cyhcbiAgICAgICAgICAgIGV2ZW50c0xldmVscyxcbiAgICAgICAgICAgIHBhcnNlSW50V2l0aERlZmF1bHQocGxDb250ZW50LnN0YXRlX2RlZmF1bHQsIHBvd2VyTGV2ZWxEZXNjcmlwdG9ycy5zdGF0ZV9kZWZhdWx0LmRlZmF1bHRWYWx1ZSksXG4gICAgICAgICAgICBwYXJzZUludFdpdGhEZWZhdWx0KHBsQ29udGVudC5ldmVudHNfZGVmYXVsdCwgcG93ZXJMZXZlbERlc2NyaXB0b3JzLmV2ZW50c19kZWZhdWx0LmRlZmF1bHRWYWx1ZSksXG4gICAgICAgICk7XG5cbiAgICAgICAgbGV0IHByaXZpbGVnZWRVc2Vyc1NlY3Rpb24gPSA8ZGl2PntfdChcInJvb21fc2V0dGluZ3N8cGVybWlzc2lvbnN8bm9fcHJpdmlsZWdlZF91c2Vyc1wiKX08L2Rpdj47XG4gICAgICAgIGxldCBtdXRlZFVzZXJzU2VjdGlvbjtcbiAgICAgICAgaWYgKE9iamVjdC5rZXlzKHVzZXJMZXZlbHMpLmxlbmd0aCkge1xuICAgICAgICAgICAgcHJpdmlsZWdlZFVzZXJzU2VjdGlvbiA9IChcbiAgICAgICAgICAgICAgICA8UG93ZXJMZXZlbFNlbGVjdG9yXG4gICAgICAgICAgICAgICAgICAgIHRpdGxlPXtfdChcInJvb21fc2V0dGluZ3N8cGVybWlzc2lvbnN8cHJpdmlsZWdlZF91c2Vyc19zZWN0aW9uXCIpfVxuICAgICAgICAgICAgICAgICAgICB1c2VyTGV2ZWxzPXt1c2VyTGV2ZWxzfVxuICAgICAgICAgICAgICAgICAgICBjYW5DaGFuZ2VMZXZlbHM9e2NhbkNoYW5nZUxldmVsc31cbiAgICAgICAgICAgICAgICAgICAgY3VycmVudFVzZXJMZXZlbD17Y3VycmVudFVzZXJMZXZlbH1cbiAgICAgICAgICAgICAgICAgICAgb25DbGljaz17dGhpcy5vblVzZXJQb3dlckxldmVsQ2hhbmdlZH1cbiAgICAgICAgICAgICAgICAgICAgZmlsdGVyPXsodXNlcikgPT4gdXNlckxldmVsc1t1c2VyXSA+IGRlZmF1bHRVc2VyTGV2ZWx9XG4gICAgICAgICAgICAgICAgPlxuICAgICAgICAgICAgICAgICAgICA8ZGl2PntfdChcInJvb21fc2V0dGluZ3N8cGVybWlzc2lvbnN8bm9fcHJpdmlsZWdlZF91c2Vyc1wiKX08L2Rpdj5cbiAgICAgICAgICAgICAgICA8L1Bvd2VyTGV2ZWxTZWxlY3Rvcj5cbiAgICAgICAgICAgICk7XG5cbiAgICAgICAgICAgIG11dGVkVXNlcnNTZWN0aW9uID0gKFxuICAgICAgICAgICAgICAgIDxQb3dlckxldmVsU2VsZWN0b3JcbiAgICAgICAgICAgICAgICAgICAgdGl0bGU9e190KFwicm9vbV9zZXR0aW5nc3xwZXJtaXNzaW9uc3xtdXRlZF91c2Vyc19zZWN0aW9uXCIpfVxuICAgICAgICAgICAgICAgICAgICB1c2VyTGV2ZWxzPXt1c2VyTGV2ZWxzfVxuICAgICAgICAgICAgICAgICAgICBjYW5DaGFuZ2VMZXZlbHM9e2NhbkNoYW5nZUxldmVsc31cbiAgICAgICAgICAgICAgICAgICAgY3VycmVudFVzZXJMZXZlbD17Y3VycmVudFVzZXJMZXZlbH1cbiAgICAgICAgICAgICAgICAgICAgb25DbGljaz17dGhpcy5vblVzZXJQb3dlckxldmVsQ2hhbmdlZH1cbiAgICAgICAgICAgICAgICAgICAgZmlsdGVyPXsodXNlcikgPT4gdXNlckxldmVsc1t1c2VyXSA8IGRlZmF1bHRVc2VyTGV2ZWx9XG4gICAgICAgICAgICAgICAgLz5cbiAgICAgICAgICAgICk7XG4gICAgICAgIH1cblxuICAgICAgICBjb25zdCBiYW5uZWQgPSByb29tLmdldE1lbWJlcnNXaXRoTWVtYmVyc2hpcChLbm93bk1lbWJlcnNoaXAuQmFuKTtcbiAgICAgICAgbGV0IGJhbm5lZFVzZXJzU2VjdGlvbjogSlNYLkVsZW1lbnQgfCB1bmRlZmluZWQ7XG4gICAgICAgIGlmIChiYW5uZWQ/Lmxlbmd0aCkge1xuICAgICAgICAgICAgY29uc3QgY2FuQmFuVXNlcnMgPSBjdXJyZW50VXNlckxldmVsID49IGJhbkxldmVsO1xuICAgICAgICAgICAgYmFubmVkVXNlcnNTZWN0aW9uID0gKFxuICAgICAgICAgICAgICAgIDxTZXR0aW5nc0ZpZWxkc2V0IGxlZ2VuZD17X3QoXCJyb29tX3NldHRpbmdzfHBlcm1pc3Npb25zfGJhbm5lZF91c2Vyc19zZWN0aW9uXCIpfT5cbiAgICAgICAgICAgICAgICAgICAgPHVsIGNsYXNzTmFtZT1cIm14X1JvbGVzUm9vbVNldHRpbmdzVGFiX2Jhbm5lZExpc3RcIj5cbiAgICAgICAgICAgICAgICAgICAgICAgIHtiYW5uZWQubWFwKChtZW1iZXIpID0+IHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBiYW5FdmVudCA9IG1lbWJlci5ldmVudHMubWVtYmVyPy5nZXRDb250ZW50KCk7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgYmFubmVkQnlJZCA9IG1lbWJlci5ldmVudHMubWVtYmVyPy5nZXRTZW5kZXIoKTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBzZW5kZXIgPSBiYW5uZWRCeUlkID8gcm9vbS5nZXRNZW1iZXIoYmFubmVkQnlJZCkgOiB1bmRlZmluZWQ7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgYmFubmVkQnkgPSBzZW5kZXI/Lm5hbWUgfHwgYmFubmVkQnlJZDsgLy8gZmFsbGJhY2sgdG8gbXhpZFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiAoXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxCYW5uZWRVc2VyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBrZXk9e21lbWJlci51c2VySWR9XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjYW5VbmJhbj17Y2FuQmFuVXNlcnN9XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtZW1iZXI9e21lbWJlcn1cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJlYXNvbj17YmFuRXZlbnQ/LnJlYXNvbn1cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJ5PXtiYW5uZWRCeSF9XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgKTtcbiAgICAgICAgICAgICAgICAgICAgICAgIH0pfVxuICAgICAgICAgICAgICAgICAgICA8L3VsPlxuICAgICAgICAgICAgICAgIDwvU2V0dGluZ3NGaWVsZHNldD5cbiAgICAgICAgICAgICk7XG4gICAgICAgIH1cblxuICAgICAgICBjb25zdCBwb3dlclNlbGVjdG9ycyA9IE9iamVjdC5rZXlzKHBvd2VyTGV2ZWxEZXNjcmlwdG9ycylcbiAgICAgICAgICAgIC5tYXAoKGtleSwgaW5kZXgpID0+IHtcbiAgICAgICAgICAgICAgICBjb25zdCBkZXNjcmlwdG9yID0gcG93ZXJMZXZlbERlc2NyaXB0b3JzW2tleV07XG4gICAgICAgICAgICAgICAgaWYgKGlzU3BhY2VSb29tICYmIGRlc2NyaXB0b3IuaGlkZUZvclNwYWNlKSB7XG4gICAgICAgICAgICAgICAgICAgIHJldHVybiBudWxsO1xuICAgICAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgICAgIGNvbnN0IHZhbHVlID0gcGFyc2VJbnRXaXRoRGVmYXVsdChnZXQocGxDb250ZW50LCBrZXkpLCBkZXNjcmlwdG9yLmRlZmF1bHRWYWx1ZSk7XG4gICAgICAgICAgICAgICAgcmV0dXJuIChcbiAgICAgICAgICAgICAgICAgICAgPGRpdiBrZXk9e2luZGV4fSBjbGFzc05hbWU9XCJcIj5cbiAgICAgICAgICAgICAgICAgICAgICAgIDxQb3dlclNlbGVjdG9yXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgbGFiZWw9e2Rlc2NyaXB0b3IuZGVzY31cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB2YWx1ZT17dmFsdWV9XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgdXNlcnNEZWZhdWx0PXtkZWZhdWx0VXNlckxldmVsfVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRpc2FibGVkPXshY2FuQ2hhbmdlTGV2ZWxzIHx8IGN1cnJlbnRVc2VyTGV2ZWwgPCB2YWx1ZX1cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBwb3dlckxldmVsS2V5PXtrZXl9IC8vIFdpbGwgYmUgc2VudCBhcyB0aGUgc2Vjb25kIHBhcmFtZXRlciB0byBgb25DaGFuZ2VgXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgb25DaGFuZ2U9e3RoaXMub25Qb3dlckxldmVsc0NoYW5nZWR9XG4gICAgICAgICAgICAgICAgICAgICAgICAvPlxuICAgICAgICAgICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICAgICAgICApO1xuICAgICAgICAgICAgfSlcbiAgICAgICAgICAgIC5maWx0ZXIoQm9vbGVhbik7XG5cbiAgICAgICAgLy8gaGlkZSB0aGUgcG93ZXIgbGV2ZWwgc2VsZWN0b3IgZm9yIGVuYWJsaW5nIEUyRUUgaWYgaXQgdGhlIHJvb20gaXMgYWxyZWFkeSBlbmNyeXB0ZWRcbiAgICAgICAgaWYgKGNsaWVudC5pc1Jvb21FbmNyeXB0ZWQodGhpcy5wcm9wcy5yb29tLnJvb21JZCkpIHtcbiAgICAgICAgICAgIGRlbGV0ZSBldmVudHNMZXZlbHNbRXZlbnRUeXBlLlJvb21FbmNyeXB0aW9uXTtcbiAgICAgICAgfVxuXG4gICAgICAgIGNvbnN0IGV2ZW50UG93ZXJTZWxlY3RvcnMgPSBPYmplY3Qua2V5cyhldmVudHNMZXZlbHMpXG4gICAgICAgICAgICAubWFwKChldmVudFR5cGUsIGkpID0+IHtcbiAgICAgICAgICAgICAgICBpZiAoaXNTcGFjZVJvb20gJiYgcGxFdmVudHNUb1Nob3dbZXZlbnRUeXBlXT8uaGlkZUZvclNwYWNlKSB7XG4gICAgICAgICAgICAgICAgICAgIHJldHVybiBudWxsO1xuICAgICAgICAgICAgICAgIH0gZWxzZSBpZiAoIWlzU3BhY2VSb29tICYmIHBsRXZlbnRzVG9TaG93W2V2ZW50VHlwZV0/LmhpZGVGb3JSb29tKSB7XG4gICAgICAgICAgICAgICAgICAgIHJldHVybiBudWxsO1xuICAgICAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgICAgIGNvbnN0IHRyYW5zbGF0aW9uS2V5Rm9yRXZlbnQgPSBwbEV2ZW50c1RvTGFiZWxzW2V2ZW50VHlwZV07XG4gICAgICAgICAgICAgICAgbGV0IGxhYmVsOiBzdHJpbmc7XG4gICAgICAgICAgICAgICAgaWYgKHRyYW5zbGF0aW9uS2V5Rm9yRXZlbnQpIHtcbiAgICAgICAgICAgICAgICAgICAgY29uc3QgYnJhbmQgPSBTZGtDb25maWcuZ2V0KFwiZWxlbWVudF9jYWxsXCIpLmJyYW5kID8/IERFRkFVTFRTLmVsZW1lbnRfY2FsbC5icmFuZDtcbiAgICAgICAgICAgICAgICAgICAgbGFiZWwgPSBfdCh0cmFuc2xhdGlvbktleUZvckV2ZW50LCB7IGJyYW5kIH0pO1xuICAgICAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgICAgIGxhYmVsID0gX3QoXCJyb29tX3NldHRpbmdzfHBlcm1pc3Npb25zfHNlbmRfZXZlbnRfdHlwZVwiLCB7IGV2ZW50VHlwZSB9KTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgcmV0dXJuIChcbiAgICAgICAgICAgICAgICAgICAgPGRpdiBrZXk9e2V2ZW50VHlwZX0+XG4gICAgICAgICAgICAgICAgICAgICAgICA8UG93ZXJTZWxlY3RvclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxhYmVsPXtsYWJlbH1cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB2YWx1ZT17ZXZlbnRzTGV2ZWxzW2V2ZW50VHlwZV19XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgdXNlcnNEZWZhdWx0PXtkZWZhdWx0VXNlckxldmVsfVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRpc2FibGVkPXshY2FuQ2hhbmdlTGV2ZWxzIHx8IGN1cnJlbnRVc2VyTGV2ZWwgPCBldmVudHNMZXZlbHNbZXZlbnRUeXBlXX1cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBwb3dlckxldmVsS2V5PXtcImV2ZW50X2xldmVsc19cIiArIGV2ZW50VHlwZX1cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBvbkNoYW5nZT17dGhpcy5vblBvd2VyTGV2ZWxzQ2hhbmdlZH1cbiAgICAgICAgICAgICAgICAgICAgICAgIC8+XG4gICAgICAgICAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgICAgICAgICk7XG4gICAgICAgICAgICB9KVxuICAgICAgICAgICAgLmZpbHRlcihCb29sZWFuKTtcblxuICAgICAgICByZXR1cm4gKFxuICAgICAgICAgICAgPFNldHRpbmdzVGFiPlxuICAgICAgICAgICAgICAgIDxTZXR0aW5nc1NlY3Rpb24gaGVhZGluZz17X3QoXCJyb29tX3NldHRpbmdzfHBlcm1pc3Npb25zfHRpdGxlXCIpfT5cbiAgICAgICAgICAgICAgICAgICAge3ByaXZpbGVnZWRVc2Vyc1NlY3Rpb259XG4gICAgICAgICAgICAgICAgICAgIHtjYW5DaGFuZ2VMZXZlbHMgJiYgPEFkZFByaXZpbGVnZWRVc2VycyByb29tPXtyb29tfSBkZWZhdWx0VXNlckxldmVsPXtkZWZhdWx0VXNlckxldmVsfSAvPn1cbiAgICAgICAgICAgICAgICAgICAge211dGVkVXNlcnNTZWN0aW9ufVxuICAgICAgICAgICAgICAgICAgICB7YmFubmVkVXNlcnNTZWN0aW9ufVxuICAgICAgICAgICAgICAgICAgICA8U2V0dGluZ3NGaWVsZHNldFxuICAgICAgICAgICAgICAgICAgICAgICAgbGVnZW5kPXtfdChcInJvb21fc2V0dGluZ3N8cGVybWlzc2lvbnN8cGVybWlzc2lvbnNfc2VjdGlvblwiKX1cbiAgICAgICAgICAgICAgICAgICAgICAgIGRlc2NyaXB0aW9uPXtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBpc1NwYWNlUm9vbVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA/IF90KFwicm9vbV9zZXR0aW5nc3xwZXJtaXNzaW9uc3xwZXJtaXNzaW9uc19zZWN0aW9uX2Rlc2NyaXB0aW9uX3NwYWNlXCIpXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDogX3QoXCJyb29tX3NldHRpbmdzfHBlcm1pc3Npb25zfHBlcm1pc3Npb25zX3NlY3Rpb25fZGVzY3JpcHRpb25fcm9vbVwiKVxuICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICA+XG4gICAgICAgICAgICAgICAgICAgICAgICB7cG93ZXJTZWxlY3RvcnN9XG4gICAgICAgICAgICAgICAgICAgICAgICB7ZXZlbnRQb3dlclNlbGVjdG9yc31cbiAgICAgICAgICAgICAgICAgICAgPC9TZXR0aW5nc0ZpZWxkc2V0PlxuICAgICAgICAgICAgICAgIDwvU2V0dGluZ3NTZWN0aW9uPlxuICAgICAgICAgICAgPC9TZXR0aW5nc1RhYj5cbiAgICAgICAgKTtcbiAgICB9XG59XG4iXSwibWFwcGluZ3MiOiI7Ozs7Ozs7O0FBUUEsSUFBQUEsTUFBQSxHQUFBQyxzQkFBQSxDQUFBQyxPQUFBO0FBQ0EsSUFBQUMsT0FBQSxHQUFBRCxPQUFBO0FBQ0EsSUFBQUUsT0FBQSxHQUFBRixPQUFBO0FBQ0EsSUFB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