matrix-react-sdk
Version:
SDK for matrix.org using React
367 lines (328 loc) • 49.9 kB
JavaScript
"use strict";
var _interopRequireDefault = require("@babel/runtime/helpers/interopRequireDefault");
Object.defineProperty(exports, "__esModule", {
value: true
});
exports.CapabilityText = void 0;
var _defineProperty2 = _interopRequireDefault(require("@babel/runtime/helpers/defineProperty"));
var _matrixWidgetApi = require("matrix-widget-api");
var _languageHandler = require("../languageHandler");
var _event = require("matrix-js-sdk/src/@types/event");
var _ElementWidgetCapabilities = require("../stores/widgets/ElementWidgetCapabilities");
var _react = _interopRequireDefault(require("react"));
/*
Copyright 2020 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 GENERIC_WIDGET_KIND
/*: GENERIC_WIDGET_KIND*/
= "generic";
/*:: export interface TranslatedCapabilityText {
primary: TranslatedString;
byline?: TranslatedString;
}*/
class CapabilityText {
static bylineFor(eventCap
/*: WidgetEventCapability*/
)
/*: TranslatedString*/
{
if (eventCap.isState) {
return !eventCap.keyStr ? (0, _languageHandler._t)("with an empty state key") : (0, _languageHandler._t)("with state key %(stateKey)s", {
stateKey: eventCap.keyStr
});
}
return null; // room messages are handled specially
}
static for(capability
/*: Capability*/
, kind
/*: WidgetKind*/
)
/*: TranslatedCapabilityText*/
{
// First see if we have a super simple line of text to provide back
if (CapabilityText.simpleCaps[capability]) {
const textForKind = CapabilityText.simpleCaps[capability];
if (textForKind[kind]) return {
primary: (0, _languageHandler._t)(textForKind[kind])
};
if (textForKind[GENERIC_WIDGET_KIND]) return {
primary: (0, _languageHandler._t)(textForKind[GENERIC_WIDGET_KIND])
}; // ... we'll fall through to the generic capability processing at the end of this
// function if we fail to locate a simple string and the capability isn't for an
// event.
} // We didn't have a super simple line of text, so try processing the capability as the
// more complex event send/receive permission type.
const [eventCap] = _matrixWidgetApi.WidgetEventCapability.findEventCapabilities([capability]);
if (eventCap) {
// Special case room messages so they show up a bit cleaner to the user. Result is
// effectively "Send images" instead of "Send messages... of type images" if we were
// to handle the msgtype nuances in this function.
if (!eventCap.isState && eventCap.eventType === _event.EventType.RoomMessage) {
return CapabilityText.forRoomMessageCap(eventCap, kind);
} // See if we have a static line of text to provide for the given event type and
// direction. The hope is that we do for common event types for friendlier copy.
const evSendRecv = eventCap.isState ? CapabilityText.stateSendRecvCaps : CapabilityText.nonStateSendRecvCaps;
if (evSendRecv[eventCap.eventType]) {
const textForKind = evSendRecv[eventCap.eventType];
const textForDirection = textForKind[kind] || textForKind[GENERIC_WIDGET_KIND];
if (textForDirection && textForDirection[eventCap.direction]) {
return {
primary: (0, _languageHandler._t)(textForDirection[eventCap.direction]) // no byline because we would have already represented the event properly
};
}
} // We don't have anything simple, so just return a generic string for the event cap
if (kind === _matrixWidgetApi.WidgetKind.Room) {
if (eventCap.direction === _matrixWidgetApi.EventDirection.Send) {
return {
primary: (0, _languageHandler._t)("Send <b>%(eventType)s</b> events as you in this room", {
eventType: eventCap.eventType
}, {
b: sub => /*#__PURE__*/_react.default.createElement("b", null, sub)
}),
byline: CapabilityText.bylineFor(eventCap)
};
} else {
return {
primary: (0, _languageHandler._t)("See <b>%(eventType)s</b> events posted to this room", {
eventType: eventCap.eventType
}, {
b: sub => /*#__PURE__*/_react.default.createElement("b", null, sub)
}),
byline: CapabilityText.bylineFor(eventCap)
};
}
} else {
// assume generic
if (eventCap.direction === _matrixWidgetApi.EventDirection.Send) {
return {
primary: (0, _languageHandler._t)("Send <b>%(eventType)s</b> events as you in your active room", {
eventType: eventCap.eventType
}, {
b: sub => /*#__PURE__*/_react.default.createElement("b", null, sub)
}),
byline: CapabilityText.bylineFor(eventCap)
};
} else {
return {
primary: (0, _languageHandler._t)("See <b>%(eventType)s</b> events posted to your active room", {
eventType: eventCap.eventType
}, {
b: sub => /*#__PURE__*/_react.default.createElement("b", null, sub)
}),
byline: CapabilityText.bylineFor(eventCap)
};
}
}
} // We don't have enough context to render this capability specially, so we'll present it as-is
return {
primary: (0, _languageHandler._t)("The <b>%(capability)s</b> capability", {
capability
}, {
b: sub => /*#__PURE__*/_react.default.createElement("b", null, sub)
})
};
}
static forRoomMessageCap(eventCap
/*: WidgetEventCapability*/
, kind
/*: WidgetKind*/
)
/*: TranslatedCapabilityText*/
{
// First handle the case of "all messages" to make the switch later on a bit clearer
if (!eventCap.keyStr) {
if (eventCap.direction === _matrixWidgetApi.EventDirection.Send) {
return {
primary: kind === _matrixWidgetApi.WidgetKind.Room ? (0, _languageHandler._t)("Send messages as you in this room") : (0, _languageHandler._t)("Send messages as you in your active room")
};
} else {
return {
primary: kind === _matrixWidgetApi.WidgetKind.Room ? (0, _languageHandler._t)("See messages posted to this room") : (0, _languageHandler._t)("See messages posted to your active room")
};
}
} // Now handle all the message types we care about. There are more message types available, however
// they are not as common so we don't bother rendering them. They'll fall into the generic case.
switch (eventCap.keyStr) {
case _event.MsgType.Text:
{
if (eventCap.direction === _matrixWidgetApi.EventDirection.Send) {
return {
primary: kind === _matrixWidgetApi.WidgetKind.Room ? (0, _languageHandler._t)("Send text messages as you in this room") : (0, _languageHandler._t)("Send text messages as you in your active room")
};
} else {
return {
primary: kind === _matrixWidgetApi.WidgetKind.Room ? (0, _languageHandler._t)("See text messages posted to this room") : (0, _languageHandler._t)("See text messages posted to your active room")
};
}
}
case _event.MsgType.Emote:
{
if (eventCap.direction === _matrixWidgetApi.EventDirection.Send) {
return {
primary: kind === _matrixWidgetApi.WidgetKind.Room ? (0, _languageHandler._t)("Send emotes as you in this room") : (0, _languageHandler._t)("Send emotes as you in your active room")
};
} else {
return {
primary: kind === _matrixWidgetApi.WidgetKind.Room ? (0, _languageHandler._t)("See emotes posted to this room") : (0, _languageHandler._t)("See emotes posted to your active room")
};
}
}
case _event.MsgType.Image:
{
if (eventCap.direction === _matrixWidgetApi.EventDirection.Send) {
return {
primary: kind === _matrixWidgetApi.WidgetKind.Room ? (0, _languageHandler._t)("Send images as you in this room") : (0, _languageHandler._t)("Send images as you in your active room")
};
} else {
return {
primary: kind === _matrixWidgetApi.WidgetKind.Room ? (0, _languageHandler._t)("See images posted to this room") : (0, _languageHandler._t)("See images posted to your active room")
};
}
}
case _event.MsgType.Video:
{
if (eventCap.direction === _matrixWidgetApi.EventDirection.Send) {
return {
primary: kind === _matrixWidgetApi.WidgetKind.Room ? (0, _languageHandler._t)("Send videos as you in this room") : (0, _languageHandler._t)("Send videos as you in your active room")
};
} else {
return {
primary: kind === _matrixWidgetApi.WidgetKind.Room ? (0, _languageHandler._t)("See videos posted to this room") : (0, _languageHandler._t)("See videos posted to your active room")
};
}
}
case _event.MsgType.File:
{
if (eventCap.direction === _matrixWidgetApi.EventDirection.Send) {
return {
primary: kind === _matrixWidgetApi.WidgetKind.Room ? (0, _languageHandler._t)("Send general files as you in this room") : (0, _languageHandler._t)("Send general files as you in your active room")
};
} else {
return {
primary: kind === _matrixWidgetApi.WidgetKind.Room ? (0, _languageHandler._t)("See general files posted to this room") : (0, _languageHandler._t)("See general files posted to your active room")
};
}
}
default:
{
let primary
/*: TranslatedString*/
;
if (eventCap.direction === _matrixWidgetApi.EventDirection.Send) {
if (kind === _matrixWidgetApi.WidgetKind.Room) {
primary = (0, _languageHandler._t)("Send <b>%(msgtype)s</b> messages as you in this room", {
msgtype: eventCap.keyStr
}, {
b: sub => /*#__PURE__*/_react.default.createElement("b", null, sub)
});
} else {
primary = (0, _languageHandler._t)("Send <b>%(msgtype)s</b> messages as you in your active room", {
msgtype: eventCap.keyStr
}, {
b: sub => /*#__PURE__*/_react.default.createElement("b", null, sub)
});
}
} else {
if (kind === _matrixWidgetApi.WidgetKind.Room) {
primary = (0, _languageHandler._t)("See <b>%(msgtype)s</b> messages posted to this room", {
msgtype: eventCap.keyStr
}, {
b: sub => /*#__PURE__*/_react.default.createElement("b", null, sub)
});
} else {
primary = (0, _languageHandler._t)("See <b>%(msgtype)s</b> messages posted to your active room", {
msgtype: eventCap.keyStr
}, {
b: sub => /*#__PURE__*/_react.default.createElement("b", null, sub)
});
}
}
return {
primary
};
}
}
}
}
exports.CapabilityText = CapabilityText;
(0, _defineProperty2.default)(CapabilityText, "simpleCaps", {
[]: {
[]: (0, _languageHandler._td)("Remain on your screen when viewing another room, when running"),
[]: (0, _languageHandler._td)("Remain on your screen while running")
},
[]: {
[]: (0, _languageHandler._td)("Send stickers into this room"),
[]: (0, _languageHandler._td)("Send stickers into your active room")
},
[]: {
[]: (0, _languageHandler._td)("Change which room you're viewing")
},
[]: {
[]: (0, _languageHandler._td)("Change which room, message, or user you're viewing")
}
});
(0, _defineProperty2.default)(CapabilityText, "stateSendRecvCaps", {
[]: {
[]: {
[]: (0, _languageHandler._td)("Change the topic of this room"),
[]: (0, _languageHandler._td)("See when the topic changes in this room")
},
[]: {
[]: (0, _languageHandler._td)("Change the topic of your active room"),
[]: (0, _languageHandler._td)("See when the topic changes in your active room")
}
},
[]: {
[]: {
[]: (0, _languageHandler._td)("Change the name of this room"),
[]: (0, _languageHandler._td)("See when the name changes in this room")
},
[]: {
[]: (0, _languageHandler._td)("Change the name of your active room"),
[]: (0, _languageHandler._td)("See when the name changes in your active room")
}
},
[]: {
[]: {
[]: (0, _languageHandler._td)("Change the avatar of this room"),
[]: (0, _languageHandler._td)("See when the avatar changes in this room")
},
[]: {
[]: (0, _languageHandler._td)("Change the avatar of your active room"),
[]: (0, _languageHandler._td)("See when the avatar changes in your active room")
}
},
[]: {
[]: {
[]: (0, _languageHandler._td)("Kick, ban, or invite people to this room, and make you leave"),
[]: (0, _languageHandler._td)("See when people join, leave, or are invited to this room")
},
[]: {
[]: (0, _languageHandler._td)("Kick, ban, or invite people to your active room, and make you leave"),
[]: (0, _languageHandler._td)("See when people join, leave, or are invited to your active room")
}
}
});
(0, _defineProperty2.default)(CapabilityText, "nonStateSendRecvCaps", {
[]: {
[]: {
[]: (0, _languageHandler._td)("Send stickers to this room as you"),
[]: (0, _languageHandler._td)("See when a sticker is posted in this room")
},
[]: {
[]: (0, _languageHandler._td)("Send stickers to your active room as you"),
[]: (0, _languageHandler._td)("See when anyone posts a sticker to your active room")
}
}
});
//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIi4uLy4uL3NyYy93aWRnZXRzL0NhcGFiaWxpdHlUZXh0LnRzeCJdLCJuYW1lcyI6WyJHRU5FUklDX1dJREdFVF9LSU5EIiwiQ2FwYWJpbGl0eVRleHQiLCJieWxpbmVGb3IiLCJldmVudENhcCIsImlzU3RhdGUiLCJrZXlTdHIiLCJzdGF0ZUtleSIsImZvciIsImNhcGFiaWxpdHkiLCJraW5kIiwic2ltcGxlQ2FwcyIsInRleHRGb3JLaW5kIiwicHJpbWFyeSIsIldpZGdldEV2ZW50Q2FwYWJpbGl0eSIsImZpbmRFdmVudENhcGFiaWxpdGllcyIsImV2ZW50VHlwZSIsIkV2ZW50VHlwZSIsIlJvb21NZXNzYWdlIiwiZm9yUm9vbU1lc3NhZ2VDYXAiLCJldlNlbmRSZWN2Iiwic3RhdGVTZW5kUmVjdkNhcHMiLCJub25TdGF0ZVNlbmRSZWN2Q2FwcyIsInRleHRGb3JEaXJlY3Rpb24iLCJkaXJlY3Rpb24iLCJXaWRnZXRLaW5kIiwiUm9vbSIsIkV2ZW50RGlyZWN0aW9uIiwiU2VuZCIsImIiLCJzdWIiLCJieWxpbmUiLCJNc2dUeXBlIiwiVGV4dCIsIkVtb3RlIiwiSW1hZ2UiLCJWaWRlbyIsIkZpbGUiLCJtc2d0eXBlIiwiTWF0cml4Q2FwYWJpbGl0aWVzIiwiQWx3YXlzT25TY3JlZW4iLCJTdGlja2VyU2VuZGluZyIsIkVsZW1lbnRXaWRnZXRDYXBhYmlsaXRpZXMiLCJDYW5DaGFuZ2VWaWV3ZWRSb29tIiwiTVNDMjkzMU5hdmlnYXRlIiwiUm9vbVRvcGljIiwiUmVjZWl2ZSIsIlJvb21OYW1lIiwiUm9vbUF2YXRhciIsIlJvb21NZW1iZXIiLCJTdGlja2VyIl0sIm1hcHBpbmdzIjoiOzs7Ozs7Ozs7OztBQWdCQTs7QUFDQTs7QUFDQTs7QUFDQTs7QUFDQTs7QUFwQkE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBU0EsTUFBTUE7QUFBd0M7QUFBQSxFQUFHLFNBQWpEOztBQXZCQTtBQUNBO0FBQ0E7O0FBK0NPLE1BQU1DLGNBQU4sQ0FBcUI7QUEwRXhCLFNBQWVDLFNBQWYsQ0FBeUJDO0FBQXpCO0FBQUE7QUFBQTtBQUE0RTtBQUN4RSxRQUFJQSxRQUFRLENBQUNDLE9BQWIsRUFBc0I7QUFDbEIsYUFBTyxDQUFDRCxRQUFRLENBQUNFLE1BQVYsR0FDRCx5QkFBRyx5QkFBSCxDQURDLEdBRUQseUJBQUcsNkJBQUgsRUFBa0M7QUFBQ0MsUUFBQUEsUUFBUSxFQUFFSCxRQUFRLENBQUNFO0FBQXBCLE9BQWxDLENBRk47QUFHSDs7QUFDRCxXQUFPLElBQVAsQ0FOd0UsQ0FNM0Q7QUFDaEI7O0FBRUQsU0FBY0UsR0FBZCxDQUFrQkM7QUFBbEI7QUFBQSxJQUEwQ0M7QUFBMUM7QUFBQTtBQUFBO0FBQXNGO0FBQ2xGO0FBQ0EsUUFBSVIsY0FBYyxDQUFDUyxVQUFmLENBQTBCRixVQUExQixDQUFKLEVBQTJDO0FBQ3ZDLFlBQU1HLFdBQVcsR0FBR1YsY0FBYyxDQUFDUyxVQUFmLENBQTBCRixVQUExQixDQUFwQjtBQUNBLFVBQUlHLFdBQVcsQ0FBQ0YsSUFBRCxDQUFmLEVBQXVCLE9BQU87QUFBQ0csUUFBQUEsT0FBTyxFQUFFLHlCQUFHRCxXQUFXLENBQUNGLElBQUQsQ0FBZDtBQUFWLE9BQVA7QUFDdkIsVUFBSUUsV0FBVyxDQUFDWCxtQkFBRCxDQUFmLEVBQXNDLE9BQU87QUFBQ1ksUUFBQUEsT0FBTyxFQUFFLHlCQUFHRCxXQUFXLENBQUNYLG1CQUFELENBQWQ7QUFBVixPQUFQLENBSEMsQ0FLdkM7QUFDQTtBQUNBO0FBQ0gsS0FWaUYsQ0FZbEY7QUFDQTs7O0FBQ0EsVUFBTSxDQUFDRyxRQUFELElBQWFVLHVDQUFzQkMscUJBQXRCLENBQTRDLENBQUNOLFVBQUQsQ0FBNUMsQ0FBbkI7O0FBQ0EsUUFBSUwsUUFBSixFQUFjO0FBQ1Y7QUFDQTtBQUNBO0FBQ0EsVUFBSSxDQUFDQSxRQUFRLENBQUNDLE9BQVYsSUFBcUJELFFBQVEsQ0FBQ1ksU0FBVCxLQUF1QkMsaUJBQVVDLFdBQTFELEVBQXVFO0FBQ25FLGVBQU9oQixjQUFjLENBQUNpQixpQkFBZixDQUFpQ2YsUUFBakMsRUFBMkNNLElBQTNDLENBQVA7QUFDSCxPQU5TLENBUVY7QUFDQTs7O0FBQ0EsWUFBTVUsVUFBVSxHQUFHaEIsUUFBUSxDQUFDQyxPQUFULEdBQ2JILGNBQWMsQ0FBQ21CLGlCQURGLEdBRWJuQixjQUFjLENBQUNvQixvQkFGckI7O0FBR0EsVUFBSUYsVUFBVSxDQUFDaEIsUUFBUSxDQUFDWSxTQUFWLENBQWQsRUFBb0M7QUFDaEMsY0FBTUosV0FBVyxHQUFHUSxVQUFVLENBQUNoQixRQUFRLENBQUNZLFNBQVYsQ0FBOUI7QUFDQSxjQUFNTyxnQkFBZ0IsR0FBR1gsV0FBVyxDQUFDRixJQUFELENBQVgsSUFBcUJFLFdBQVcsQ0FBQ1gsbUJBQUQsQ0FBekQ7O0FBQ0EsWUFBSXNCLGdCQUFnQixJQUFJQSxnQkFBZ0IsQ0FBQ25CLFFBQVEsQ0FBQ29CLFNBQVYsQ0FBeEMsRUFBOEQ7QUFDMUQsaUJBQU87QUFDSFgsWUFBQUEsT0FBTyxFQUFFLHlCQUFHVSxnQkFBZ0IsQ0FBQ25CLFFBQVEsQ0FBQ29CLFNBQVYsQ0FBbkIsQ0FETixDQUVIOztBQUZHLFdBQVA7QUFJSDtBQUNKLE9BdEJTLENBd0JWOzs7QUFDQSxVQUFJZCxJQUFJLEtBQUtlLDRCQUFXQyxJQUF4QixFQUE4QjtBQUMxQixZQUFJdEIsUUFBUSxDQUFDb0IsU0FBVCxLQUF1QkcsZ0NBQWVDLElBQTFDLEVBQWdEO0FBQzVDLGlCQUFPO0FBQ0hmLFlBQUFBLE9BQU8sRUFBRSx5QkFBRyxzREFBSCxFQUEyRDtBQUNoRUcsY0FBQUEsU0FBUyxFQUFFWixRQUFRLENBQUNZO0FBRDRDLGFBQTNELEVBRU47QUFDQ2EsY0FBQUEsQ0FBQyxFQUFFQyxHQUFHLGlCQUFJLHdDQUFJQSxHQUFKO0FBRFgsYUFGTSxDQUROO0FBTUhDLFlBQUFBLE1BQU0sRUFBRTdCLGNBQWMsQ0FBQ0MsU0FBZixDQUF5QkMsUUFBekI7QUFOTCxXQUFQO0FBUUgsU0FURCxNQVNPO0FBQ0gsaUJBQU87QUFDSFMsWUFBQUEsT0FBTyxFQUFFLHlCQUFHLHFEQUFILEVBQTBEO0FBQy9ERyxjQUFBQSxTQUFTLEVBQUVaLFFBQVEsQ0FBQ1k7QUFEMkMsYUFBMUQsRUFFTjtBQUNDYSxjQUFBQSxDQUFDLEVBQUVDLEdBQUcsaUJBQUksd0NBQUlBLEdBQUo7QUFEWCxhQUZNLENBRE47QUFNSEMsWUFBQUEsTUFBTSxFQUFFN0IsY0FBYyxDQUFDQyxTQUFmLENBQXlCQyxRQUF6QjtBQU5MLFdBQVA7QUFRSDtBQUNKLE9BcEJELE1Bb0JPO0FBQUU7QUFDTCxZQUFJQSxRQUFRLENBQUNvQixTQUFULEtBQXVCRyxnQ0FBZUMsSUFBMUMsRUFBZ0Q7QUFDNUMsaUJBQU87QUFDSGYsWUFBQUEsT0FBTyxFQUFFLHlCQUFHLDZEQUFILEVBQWtFO0FBQ3ZFRyxjQUFBQSxTQUFTLEVBQUVaLFFBQVEsQ0FBQ1k7QUFEbUQsYUFBbEUsRUFFTjtBQUNDYSxjQUFBQSxDQUFDLEVBQUVDLEdBQUcsaUJBQUksd0NBQUlBLEdBQUo7QUFEWCxhQUZNLENBRE47QUFNSEMsWUFBQUEsTUFBTSxFQUFFN0IsY0FBYyxDQUFDQyxTQUFmLENBQXlCQyxRQUF6QjtBQU5MLFdBQVA7QUFRSCxTQVRELE1BU087QUFDSCxpQkFBTztBQUNIUyxZQUFBQSxPQUFPLEVBQUUseUJBQUcsNERBQUgsRUFBaUU7QUFDdEVHLGNBQUFBLFNBQVMsRUFBRVosUUFBUSxDQUFDWTtBQURrRCxhQUFqRSxFQUVOO0FBQ0NhLGNBQUFBLENBQUMsRUFBRUMsR0FBRyxpQkFBSSx3Q0FBSUEsR0FBSjtBQURYLGFBRk0sQ0FETjtBQU1IQyxZQUFBQSxNQUFNLEVBQUU3QixjQUFjLENBQUNDLFNBQWYsQ0FBeUJDLFFBQXpCO0FBTkwsV0FBUDtBQVFIO0FBQ0o7QUFDSixLQWpGaUYsQ0FtRmxGOzs7QUFDQSxXQUFPO0FBQ0hTLE1BQUFBLE9BQU8sRUFBRSx5QkFBRyxzQ0FBSCxFQUEyQztBQUFDSixRQUFBQTtBQUFELE9BQTNDLEVBQXlEO0FBQzlEb0IsUUFBQUEsQ0FBQyxFQUFFQyxHQUFHLGlCQUFJLHdDQUFJQSxHQUFKO0FBRG9ELE9BQXpEO0FBRE4sS0FBUDtBQUtIOztBQUVELFNBQWVYLGlCQUFmLENBQWlDZjtBQUFqQztBQUFBLElBQWtFTTtBQUFsRTtBQUFBO0FBQUE7QUFBOEc7QUFDMUc7QUFDQSxRQUFJLENBQUNOLFFBQVEsQ0FBQ0UsTUFBZCxFQUFzQjtBQUNsQixVQUFJRixRQUFRLENBQUNvQixTQUFULEtBQXVCRyxnQ0FBZUMsSUFBMUMsRUFBZ0Q7QUFDNUMsZUFBTztBQUNIZixVQUFBQSxPQUFPLEVBQUVILElBQUksS0FBS2UsNEJBQVdDLElBQXBCLEdBQ0gseUJBQUcsbUNBQUgsQ0FERyxHQUVILHlCQUFHLDBDQUFIO0FBSEgsU0FBUDtBQUtILE9BTkQsTUFNTztBQUNILGVBQU87QUFDSGIsVUFBQUEsT0FBTyxFQUFFSCxJQUFJLEtBQUtlLDRCQUFXQyxJQUFwQixHQUNILHlCQUFHLGtDQUFILENBREcsR0FFSCx5QkFBRyx5Q0FBSDtBQUhILFNBQVA7QUFLSDtBQUNKLEtBaEJ5RyxDQWtCMUc7QUFDQTs7O0FBQ0EsWUFBUXRCLFFBQVEsQ0FBQ0UsTUFBakI7QUFDSSxXQUFLMEIsZUFBUUMsSUFBYjtBQUFtQjtBQUNmLGNBQUk3QixRQUFRLENBQUNvQixTQUFULEtBQXVCRyxnQ0FBZUMsSUFBMUMsRUFBZ0Q7QUFDNUMsbUJBQU87QUFDSGYsY0FBQUEsT0FBTyxFQUFFSCxJQUFJLEtBQUtlLDRCQUFXQyxJQUFwQixHQUNILHlCQUFHLHdDQUFILENBREcsR0FFSCx5QkFBRywrQ0FBSDtBQUhILGFBQVA7QUFLSCxXQU5ELE1BTU87QUFDSCxtQkFBTztBQUNIYixjQUFBQSxPQUFPLEVBQUVILElBQUksS0FBS2UsNEJBQVdDLElBQXBCLEdBQ0gseUJBQUcsdUNBQUgsQ0FERyxHQUVILHlCQUFHLDhDQUFIO0FBSEgsYUFBUDtBQUtIO0FBQ0o7O0FBQ0QsV0FBS00sZUFBUUUsS0FBYjtBQUFvQjtBQUNoQixjQUFJOUIsUUFBUSxDQUFDb0IsU0FBVCxLQUF1QkcsZ0NBQWVDLElBQTFDLEVBQWdEO0FBQzVDLG1CQUFPO0FBQ0hmLGNBQUFBLE9BQU8sRUFBRUgsSUFBSSxLQUFLZSw0QkFBV0MsSUFBcEIsR0FDSCx5QkFBRyxpQ0FBSCxDQURHLEdBRUgseUJBQUcsd0NBQUg7QUFISCxhQUFQO0FBS0gsV0FORCxNQU1PO0FBQ0gsbUJBQU87QUFDSGIsY0FBQUEsT0FBTyxFQUFFSCxJQUFJLEtBQUtlLDRCQUFXQyxJQUFwQixHQUNILHlCQUFHLGdDQUFILENBREcsR0FFSCx5QkFBRyx1Q0FBSDtBQUhILGFBQVA7QUFLSDtBQUNKOztBQUNELFdBQUtNLGVBQVFHLEtBQWI7QUFBb0I7QUFDaEIsY0FBSS9CLFFBQVEsQ0FBQ29CLFNBQVQsS0FBdUJHLGdDQUFlQyxJQUExQyxFQUFnRDtBQUM1QyxtQkFBTztBQUNIZixjQUFBQSxPQUFPLEVBQUVILElBQUksS0FBS2UsNEJBQVdDLElBQXBCLEdBQ0gseUJBQUcsaUNBQUgsQ0FERyxHQUVILHlCQUFHLHdDQUFIO0FBSEgsYUFBUDtBQUtILFdBTkQsTUFNTztBQUNILG1CQUFPO0FBQ0hiLGNBQUFBLE9BQU8sRUFBRUgsSUFBSSxLQUFLZSw0QkFBV0MsSUFBcEIsR0FDSCx5QkFBRyxnQ0FBSCxDQURHLEdBRUgseUJBQUcsdUNBQUg7QUFISCxhQUFQO0FBS0g7QUFDSjs7QUFDRCxXQUFLTSxlQUFRSSxLQUFiO0FBQW9CO0FBQ2hCLGNBQUloQyxRQUFRLENBQUNvQixTQUFULEtBQXVCRyxnQ0FBZUMsSUFBMUMsRUFBZ0Q7QUFDNUMsbUJBQU87QUFDSGYsY0FBQUEsT0FBTyxFQUFFSCxJQUFJLEtBQUtlLDRCQUFXQyxJQUFwQixHQUNILHlCQUFHLGlDQUFILENBREcsR0FFSCx5QkFBRyx3Q0FBSDtBQUhILGFBQVA7QUFLSCxXQU5ELE1BTU87QUFDSCxtQkFBTztBQUNIYixjQUFBQSxPQUFPLEVBQUVILElBQUksS0FBS2UsNEJBQVdDLElBQXBCLEdBQ0gseUJBQUcsZ0NBQUgsQ0FERyxHQUVILHlCQUFHLHVDQUFIO0FBSEgsYUFBUDtBQUtIO0FBQ0o7O0FBQ0QsV0FBS00sZUFBUUssSUFBYjtBQUFtQjtBQUNmLGNBQUlqQyxRQUFRLENBQUNvQixTQUFULEtBQXVCRyxnQ0FBZUMsSUFBMUMsRUFBZ0Q7QUFDNUMsbUJBQU87QUFDSGYsY0FBQUEsT0FBTyxFQUFFSCxJQUFJLEtBQUtlLDRCQUFXQyxJQUFwQixHQUNILHlCQUFHLHdDQUFILENBREcsR0FFSCx5QkFBRywrQ0FBSDtBQUhILGFBQVA7QUFLSCxXQU5ELE1BTU87QUFDSCxtQkFBTztBQUNIYixjQUFBQSxPQUFPLEVBQUVILElBQUksS0FBS2UsNEJBQVdDLElBQXBCLEdBQ0gseUJBQUcsdUNBQUgsQ0FERyxHQUVILHlCQUFHLDhDQUFIO0FBSEgsYUFBUDtBQUtIO0FBQ0o7O0FBQ0Q7QUFBUztBQUNMLGNBQUliO0FBQXlCO0FBQTdCOztBQUNBLGNBQUlULFFBQVEsQ0FBQ29CLFNBQVQsS0FBdUJHLGdDQUFlQyxJQUExQyxFQUFnRDtBQUM1QyxnQkFBSWxCLElBQUksS0FBS2UsNEJBQVdDLElBQXhCLEVBQThCO0FBQzFCYixjQUFBQSxPQUFPLEdBQUcseUJBQUcsc0RBQUgsRUFBMkQ7QUFDakV5QixnQkFBQUEsT0FBTyxFQUFFbEMsUUFBUSxDQUFDRTtBQUQrQyxlQUEzRCxFQUVQO0FBQ0N1QixnQkFBQUEsQ0FBQyxFQUFFQyxHQUFHLGlCQUFJLHdDQUFJQSxHQUFKO0FBRFgsZUFGTyxDQUFWO0FBS0gsYUFORCxNQU1PO0FBQ0hqQixjQUFBQSxPQUFPLEdBQUcseUJBQUcsNkRBQUgsRUFBa0U7QUFDeEV5QixnQkFBQUEsT0FBTyxFQUFFbEMsUUFBUSxDQUFDRTtBQURzRCxlQUFsRSxFQUVQO0FBQ0N1QixnQkFBQUEsQ0FBQyxFQUFFQyxHQUFHLGlCQUFJLHdDQUFJQSxHQUFKO0FBRFgsZUFGTyxDQUFWO0FBS0g7QUFDSixXQWRELE1BY087QUFDSCxnQkFBSXBCLElBQUksS0FBS2UsNEJBQVdDLElBQXhCLEVBQThCO0FBQzFCYixjQUFBQSxPQUFPLEdBQUcseUJBQUcscURBQUgsRUFBMEQ7QUFDaEV5QixnQkFBQUEsT0FBTyxFQUFFbEMsUUFBUSxDQUFDRTtBQUQ4QyxlQUExRCxFQUVQO0FBQ0N1QixnQkFBQUEsQ0FBQyxFQUFFQyxHQUFHLGlCQUFJLHdDQUFJQSxHQUFKO0FBRFgsZUFGTyxDQUFWO0FBS0gsYUFORCxNQU1PO0FBQ0hqQixjQUFBQSxPQUFPLEdBQUcseUJBQUcsNERBQUgsRUFBaUU7QUFDdkV5QixnQkFBQUEsT0FBTyxFQUFFbEMsUUFBUSxDQUFDRTtBQURxRCxlQUFqRSxFQUVQO0FBQ0N1QixnQkFBQUEsQ0FBQyxFQUFFQyxHQUFHLGlCQUFJLHdDQUFJQSxHQUFKO0FBRFgsZUFGTyxDQUFWO0FBS0g7QUFDSjs7QUFDRCxpQkFBTztBQUFDakIsWUFBQUE7QUFBRCxXQUFQO0FBQ0g7QUE1R0w7QUE4R0g7O0FBaFR1Qjs7OzhCQUFmWCxjLGdCQUNtQztBQUN4QyxHQUFDcUMsb0NBQW1CQyxjQUFwQixHQUFxQztBQUNqQyxLQUFDZiw0QkFBV0MsSUFBWixHQUFtQiwwQkFBSSwrREFBSixDQURjO0FBRWpDLEtBQUN6QixtQkFBRCxHQUF1QiwwQkFBSSxxQ0FBSjtBQUZVLEdBREc7QUFLeEMsR0FBQ3NDLG9DQUFtQkUsY0FBcEIsR0FBcUM7QUFDakMsS0FBQ2hCLDRCQUFXQyxJQUFaLEdBQW1CLDBCQUFJLDhCQUFKLENBRGM7QUFFakMsS0FBQ3pCLG1CQUFELEdBQXVCLDBCQUFJLHFDQUFKO0FBRlUsR0FMRztBQVN4QyxHQUFDeUMscURBQTBCQyxtQkFBM0IsR0FBaUQ7QUFDN0MsS0FBQzFDLG1CQUFELEdBQXVCLDBCQUFJLGtDQUFKO0FBRHNCLEdBVFQ7QUFZeEMsR0FBQ3NDLG9DQUFtQkssZUFBcEIsR0FBc0M7QUFDbEMsS0FBQzNDLG1CQUFELEdBQXVCLDBCQUFJLG9EQUFKO0FBRFc7QUFaRSxDOzhCQURuQ0MsYyx1QkFrQmtEO0FBQ3ZELEdBQUNlLGlCQUFVNEIsU0FBWCxHQUF1QjtBQUNuQixLQUFDcEIsNEJBQVdDLElBQVosR0FBbUI7QUFDZixPQUFDQyxnQ0FBZUMsSUFBaEIsR0FBdUIsMEJBQUksK0JBQUosQ0FEUjtBQUVmLE9BQUNELGdDQUFlbUIsT0FBaEIsR0FBMEIsMEJBQUkseUNBQUo7QUFGWCxLQURBO0FBS25CLEtBQUM3QyxtQkFBRCxHQUF1QjtBQUNuQixPQUFDMEIsZ0NBQWVDLElBQWhCLEdBQXVCLDBCQUFJLHNDQUFKLENBREo7QUFFbkIsT0FBQ0QsZ0NBQWVtQixPQUFoQixHQUEwQiwwQkFBSSxnREFBSjtBQUZQO0FBTEosR0FEZ0M7QUFXdkQsR0FBQzdCLGlCQUFVOEIsUUFBWCxHQUFzQjtBQUNsQixLQUFDdEIsNEJBQVdDLElBQVosR0FBbUI7QUFDZixPQUFDQyxnQ0FBZUMsSUFBaEIsR0FBdUIsMEJBQUksOEJBQUosQ0FEUjtBQUVmLE9BQUNELGdDQUFlbUIsT0FBaEIsR0FBMEIsMEJBQUksd0NBQUo7QUFGWCxLQUREO0FBS2xCLEtBQUM3QyxtQkFBRCxHQUF1QjtBQUNuQixPQUFDMEIsZ0NBQWVDLElBQWhCLEdBQXVCLDBCQUFJLHFDQUFKLENBREo7QUFFbkIsT0FBQ0QsZ0NBQWVtQixPQUFoQixHQUEwQiwwQkFBSSwrQ0FBSjtBQUZQO0FBTEwsR0FYaUM7QUFxQnZELEdBQUM3QixpQkFBVStCLFVBQVgsR0FBd0I7QUFDcEIsS0FBQ3ZCLDRCQUFXQyxJQUFaLEdBQW1CO0FBQ2YsT0FBQ0MsZ0NBQWVDLElBQWhCLEdBQXVCLDBCQUFJLGdDQUFKLENBRFI7QUFFZixPQUFDRCxnQ0FBZW1CLE9BQWhCLEdBQTBCLDBCQUFJLDBDQUFKO0FBRlgsS0FEQztBQUtwQixLQUFDN0MsbUJBQUQsR0FBdUI7QUFDbkIsT0FBQzBCLGdDQUFlQyxJQUFoQixHQUF1QiwwQkFBSSx1Q0FBSixDQURKO0FBRW5CLE9BQUNELGdDQUFlbUIsT0FBaEIsR0FBMEIsMEJBQUksaURBQUo7QUFGUDtBQUxILEdBckIrQjtBQStCdkQsR0FBQzdCLGlCQUFVZ0MsVUFBWCxHQUF3QjtBQUNwQixLQUFDeEIsNEJBQVdDLElBQVosR0FBbUI7QUFDZixPQUFDQyxnQ0FBZUMsSUFBaEIsR0FBdUIsMEJBQUksOERBQUosQ0FEUjtBQUVmLE9BQUNELGdDQUFlbUIsT0FBaEIsR0FBMEIsMEJBQUksMERBQUo7QUFGWCxLQURDO0FBS3BCLEtBQUM3QyxtQkFBRCxHQUF1QjtBQUNuQixPQUFDMEIsZ0NBQWVDLElBQWhCLEdBQXVCLDBCQUFJLHFFQUFKLENBREo7QUFFbkIsT0FBQ0QsZ0NBQWVtQixPQUFoQixHQUEwQiwwQkFBSSxpRUFBSjtBQUZQO0FBTEg7QUEvQitCLEM7OEJBbEJsRDVDLGMsMEJBNkRxRDtBQUMxRCxHQUFDZSxpQkFBVWlDLE9BQVgsR0FBcUI7QUFDakIsS0FBQ3pCLDRCQUFXQyxJQUFaLEdBQW1CO0FBQ2YsT0FBQ0MsZ0NBQWVDLElBQWhCLEdBQXVCLDBCQUFJLG1DQUFKLENBRFI7QUFFZixPQUFDRCxnQ0FBZW1CLE9BQWhCLEdBQTBCLDBCQUFJLDJDQUFKO0FBRlgsS0FERjtBQUtqQixLQUFDN0MsbUJBQUQsR0FBdUI7QUFDbkIsT0FBQzBCLGdDQUFlQyxJQUFoQixHQUF1QiwwQkFBSSwwQ0FBSixDQURKO0FBRW5CLE9BQUNELGdDQUFlbUIsT0FBaEIsR0FBMEIsMEJBQUkscURBQUo7QUFGUDtBQUxOO0FBRHFDLEMiLCJzb3VyY2VzQ29udGVudCI6WyIvKlxuQ29weXJpZ2h0IDIwMjAgVGhlIE1hdHJpeC5vcmcgRm91bmRhdGlvbiBDLkkuQy5cblxuTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlIFwiTGljZW5zZVwiKTtcbnlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS5cbllvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdFxuXG4gICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wXG5cblVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmVcbmRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuIFwiQVMgSVNcIiBCQVNJUyxcbldJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLlxuU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZFxubGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuXG4qL1xuXG5pbXBvcnQgeyBDYXBhYmlsaXR5LCBFdmVudERpcmVjdGlvbiwgTWF0cml4Q2FwYWJpbGl0aWVzLCBXaWRnZXRFdmVudENhcGFiaWxpdHksIFdpZGdldEtpbmQgfSBmcm9tIFwibWF0cml4LXdpZGdldC1hcGlcIjtcbmltcG9ydCB7IF90LCBfdGQsIFRyYW5zbGF0ZWRTdHJpbmcgfSBmcm9tIFwiLi4vbGFuZ3VhZ2VIYW5kbGVyXCI7XG5pbXBvcnQgeyBFdmVudFR5cGUsIE1zZ1R5cGUgfSBmcm9tIFwibWF0cml4LWpzLXNkay9zcmMvQHR5cGVzL2V2ZW50XCI7XG5pbXBvcnQgeyBFbGVtZW50V2lkZ2V0Q2FwYWJpbGl0aWVzIH0gZnJvbSBcIi4uL3N0b3Jlcy93aWRnZXRzL0VsZW1lbnRXaWRnZXRDYXBhYmlsaXRpZXNcIjtcbmltcG9ydCBSZWFjdCBmcm9tIFwicmVhY3RcIjtcblxudHlwZSBHRU5FUklDX1dJREdFVF9LSU5EID0gXCJnZW5lcmljXCI7XG5jb25zdCBHRU5FUklDX1dJREdFVF9LSU5EOiBHRU5FUklDX1dJREdFVF9LSU5EID0gXCJnZW5lcmljXCI7XG5cbmludGVyZmFjZSBJU2VuZFJlY3ZTdGF0aWNDYXBUZXh0IHtcbiAgICAvLyBAdHMtaWdub3JlIC0gVFMgd2FudHMgdGhlIGtleSB0byBiZSBhIHN0cmluZywgYnV0IHdlIGtub3cgYmV0dGVyXG4gICAgW2V2ZW50VHlwZTogRXZlbnRUeXBlXToge1xuICAgICAgICAvLyBAdHMtaWdub3JlIC0gVFMgd2FudHMgdGhlIGtleSB0byBiZSBhIHN0cmluZywgYnV0IHdlIGtub3cgYmV0dGVyXG4gICAgICAgIFt3aWRnZXRLaW5kOiBXaWRnZXRLaW5kIHwgR0VORVJJQ19XSURHRVRfS0lORF06IHtcbiAgICAgICAgICAgIC8vIEB0cy1pZ25vcmUgLSBUUyB3YW50cyB0aGUga2V5IHRvIGJlIGEgc3RyaW5nLCBidXQgd2Uga25vdyBiZXR0ZXJcbiAgICAgICAgICAgIFtkaXJlY3Rpb246IEV2ZW50RGlyZWN0aW9uXTogc3RyaW5nO1xuICAgICAgICB9O1xuICAgIH07XG59XG5cbmludGVyZmFjZSBJU3RhdGljQ2FwVGV4dCB7XG4gICAgLy8gQHRzLWlnbm9yZSAtIFRTIHdhbnRzIHRoZSBrZXkgdG8gYmUgYSBzdHJpbmcsIGJ1dCB3ZSBrbm93IGJldHRlclxuICAgIFtjYXBhYmlsaXR5OiBDYXBhYmlsaXR5XToge1xuICAgICAgICAvLyBAdHMtaWdub3JlIC0gVFMgd2FudHMgdGhlIGtleSB0byBiZSBhIHN0cmluZywgYnV0IHdlIGtub3cgYmV0dGVyXG4gICAgICAgIFt3aWRnZXRLaW5kOiBXaWRnZXRLaW5kIHwgR0VORVJJQ19XSURHRVRfS0lORF06IHN0cmluZztcbiAgICB9O1xufVxuXG5leHBvcnQgaW50ZXJmYWNlIFRyYW5zbGF0ZWRDYXBhYmlsaXR5VGV4dCB7XG4gICAgcHJpbWFyeTogVHJhbnNsYXRlZFN0cmluZztcbiAgICBieWxpbmU/OiBUcmFuc2xhdGVkU3RyaW5nO1xufVxuXG5leHBvcnQgY2xhc3MgQ2FwYWJpbGl0eVRleHQge1xuICAgIHByaXZhdGUgc3RhdGljIHNpbXBsZUNhcHM6IElTdGF0aWNDYXBUZXh0ID0ge1xuICAgICAgICBbTWF0cml4Q2FwYWJpbGl0aWVzLkFsd2F5c09uU2NyZWVuXToge1xuICAgICAgICAgICAgW1dpZGdldEtpbmQuUm9vbV06IF90ZChcIlJlbWFpbiBvbiB5b3VyIHNjcmVlbiB3aGVuIHZpZXdpbmcgYW5vdGhlciByb29tLCB3aGVuIHJ1bm5pbmdcIiksXG4gICAgICAgICAgICBbR0VORVJJQ19XSURHRVRfS0lORF06IF90ZChcIlJlbWFpbiBvbiB5b3VyIHNjcmVlbiB3aGlsZSBydW5uaW5nXCIpLFxuICAgICAgICB9LFxuICAgICAgICBbTWF0cml4Q2FwYWJpbGl0aWVzLlN0aWNrZXJTZW5kaW5nXToge1xuICAgICAgICAgICAgW1dpZGdldEtpbmQuUm9vbV06IF90ZChcIlNlbmQgc3RpY2tlcnMgaW50byB0aGlzIHJvb21cIiksXG4gICAgICAgICAgICBbR0VORVJJQ19XSURHRVRfS0lORF06IF90ZChcIlNlbmQgc3RpY2tlcnMgaW50byB5b3VyIGFjdGl2ZSByb29tXCIpLFxuICAgICAgICB9LFxuICAgICAgICBbRWxlbWVudFdpZGdldENhcGFiaWxpdGllcy5DYW5DaGFuZ2VWaWV3ZWRSb29tXToge1xuICAgICAgICAgICAgW0dFTkVSSUNfV0lER0VUX0tJTkRdOiBfdGQoXCJDaGFuZ2Ugd2hpY2ggcm9vbSB5b3UncmUgdmlld2luZ1wiKSxcbiAgICAgICAgfSxcbiAgICAgICAgW01hdHJpeENhcGFiaWxpdGllcy5NU0MyOTMxTmF2aWdhdGVdOiB7XG4gICAgICAgICAgICBbR0VORVJJQ19XSURHRVRfS0lORF06IF90ZChcIkNoYW5nZSB3aGljaCByb29tLCBtZXNzYWdlLCBvciB1c2VyIHlvdSdyZSB2aWV3aW5nXCIpLFxuICAgICAgICB9LFxuICAgIH07XG5cbiAgICBwcml2YXRlIHN0YXRpYyBzdGF0ZVNlbmRSZWN2Q2FwczogSVNlbmRSZWN2U3RhdGljQ2FwVGV4dCA9IHtcbiAgICAgICAgW0V2ZW50VHlwZS5Sb29tVG9waWNdOiB7XG4gICAgICAgICAgICBbV2lkZ2V0S2luZC5Sb29tXToge1xuICAgICAgICAgICAgICAgIFtFdmVudERpcmVjdGlvbi5TZW5kXTogX3RkKFwiQ2hhbmdlIHRoZSB0b3BpYyBvZiB0aGlzIHJvb21cIiksXG4gICAgICAgICAgICAgICAgW0V2ZW50RGlyZWN0aW9uLlJlY2VpdmVdOiBfdGQoXCJTZWUgd2hlbiB0aGUgdG9waWMgY2hhbmdlcyBpbiB0aGlzIHJvb21cIiksXG4gICAgICAgICAgICB9LFxuICAgICAgICAgICAgW0dFTkVSSUNfV0lER0VUX0tJTkRdOiB7XG4gICAgICAgICAgICAgICAgW0V2ZW50RGlyZWN0aW9uLlNlbmRdOiBfdGQoXCJDaGFuZ2UgdGhlIHRvcGljIG9mIHlvdXIgYWN0aXZlIHJvb21cIiksXG4gICAgICAgICAgICAgICAgW0V2ZW50RGlyZWN0aW9uLlJlY2VpdmVdOiBfdGQoXCJTZWUgd2hlbiB0aGUgdG9waWMgY2hhbmdlcyBpbiB5b3VyIGFjdGl2ZSByb29tXCIpLFxuICAgICAgICAgICAgfSxcbiAgICAgICAgfSxcbiAgICAgICAgW0V2ZW50VHlwZS5Sb29tTmFtZV06IHtcbiAgICAgICAgICAgIFtXaWRnZXRLaW5kLlJvb21dOiB7XG4gICAgICAgICAgICAgICAgW0V2ZW50RGlyZWN0aW9uLlNlbmRdOiBfdGQoXCJDaGFuZ2UgdGhlIG5hbWUgb2YgdGhpcyByb29tXCIpLFxuICAgICAgICAgICAgICAgIFtFdmVudERpcmVjdGlvbi5SZWNlaXZlXTogX3RkKFwiU2VlIHdoZW4gdGhlIG5hbWUgY2hhbmdlcyBpbiB0aGlzIHJvb21cIiksXG4gICAgICAgICAgICB9LFxuICAgICAgICAgICAgW0dFTkVSSUNfV0lER0VUX0tJTkRdOiB7XG4gICAgICAgICAgICAgICAgW0V2ZW50RGlyZWN0aW9uLlNlbmRdOiBfdGQoXCJDaGFuZ2UgdGhlIG5hbWUgb2YgeW91ciBhY3RpdmUgcm9vbVwiKSxcbiAgICAgICAgICAgICAgICBbRXZlbnREaXJlY3Rpb24uUmVjZWl2ZV06IF90ZChcIlNlZSB3aGVuIHRoZSBuYW1lIGNoYW5nZXMgaW4geW91ciBhY3RpdmUgcm9vbVwiKSxcbiAgICAgICAgICAgIH0sXG4gICAgICAgIH0sXG4gICAgICAgIFtFdmVudFR5cGUuUm9vbUF2YXRhcl06IHtcbiAgICAgICAgICAgIFtXaWRnZXRLaW5kLlJvb21dOiB7XG4gICAgICAgICAgICAgICAgW0V2ZW50RGlyZWN0aW9uLlNlbmRdOiBfdGQoXCJDaGFuZ2UgdGhlIGF2YXRhciBvZiB0aGlzIHJvb21cIiksXG4gICAgICAgICAgICAgICAgW0V2ZW50RGlyZWN0aW9uLlJlY2VpdmVdOiBfdGQoXCJTZWUgd2hlbiB0aGUgYXZhdGFyIGNoYW5nZXMgaW4gdGhpcyByb29tXCIpLFxuICAgICAgICAgICAgfSxcbiAgICAgICAgICAgIFtHRU5FUklDX1dJREdFVF9LSU5EXToge1xuICAgICAgICAgICAgICAgIFtFdmVudERpcmVjdGlvbi5TZW5kXTogX3RkKFwiQ2hhbmdlIHRoZSBhdmF0YXIgb2YgeW91ciBhY3RpdmUgcm9vbVwiKSxcbiAgICAgICAgICAgICAgICBbRXZlbnREaXJlY3Rpb24uUmVjZWl2ZV06IF90ZChcIlNlZSB3aGVuIHRoZSBhdmF0YXIgY2hhbmdlcyBpbiB5b3VyIGFjdGl2ZSByb29tXCIpLFxuICAgICAgICAgICAgfSxcbiAgICAgICAgfSxcbiAgICAgICAgW0V2ZW50VHlwZS5Sb29tTWVtYmVyXToge1xuICAgICAgICAgICAgW1dpZGdldEtpbmQuUm9vbV06IHtcbiAgICAgICAgICAgICAgICBbRXZlbnREaXJlY3Rpb24uU2VuZF06IF90ZChcIktpY2ssIGJhbiwgb3IgaW52aXRlIHBlb3BsZSB0byB0aGlzIHJvb20sIGFuZCBtYWtlIHlvdSBsZWF2ZVwiKSxcbiAgICAgICAgICAgICAgICBbRXZlbnREaXJlY3Rpb24uUmVjZWl2ZV06IF90ZChcIlNlZSB3aGVuIHBlb3BsZSBqb2luLCBsZWF2ZSwgb3IgYXJlIGludml0ZWQgdG8gdGhpcyByb29tXCIpLFxuICAgICAgICAgICAgfSxcbiAgICAgICAgICAgIFtHRU5FUklDX1dJREdFVF9LSU5EXToge1xuICAgICAgICAgICAgICAgIFtFdmVudERpcmVjdGlvbi5TZW5kXTogX3RkKFwiS2ljaywgYmFuLCBvciBpbnZpdGUgcGVvcGxlIHRvIHlvdXIgYWN0aXZlIHJvb20sIGFuZCBtYWtlIHlvdSBsZWF2ZVwiKSxcbiAgICAgICAgICAgICAgICBbRXZlbnREaXJlY3Rpb24uUmVjZWl2ZV06IF90ZChcIlNlZSB3aGVuIHBlb3BsZSBqb2luLCBsZWF2ZSwgb3IgYXJlIGludml0ZWQgdG8geW91ciBhY3RpdmUgcm9vbVwiKSxcbiAgICAgICAgICAgIH0sXG4gICAgICAgIH0sXG4gICAgfTtcblxuICAgIHByaXZhdGUgc3RhdGljIG5vblN0YXRlU2VuZFJlY3ZDYXBzOiBJU2VuZFJlY3ZTdGF0aWNDYXBUZXh0ID0ge1xuICAgICAgICBbRXZlbnRUeXBlLlN0aWNrZXJdOiB7XG4gICAgICAgICAgICBbV2lkZ2V0S2luZC5Sb29tXToge1xuICAgICAgICAgICAgICAgIFtFdmVudERpcmVjdGlvbi5TZW5kXTogX3RkKFwiU2VuZCBzdGlja2VycyB0byB0aGlzIHJvb20gYXMgeW91XCIpLFxuICAgICAgICAgICAgICAgIFtFdmVudERpcmVjdGlvbi5SZWNlaXZlXTogX3RkKFwiU2VlIHdoZW4gYSBzdGlja2VyIGlzIHBvc3RlZCBpbiB0aGlzIHJvb21cIiksXG4gICAgICAgICAgICB9LFxuICAgICAgICAgICAgW0dFTkVSSUNfV0lER0VUX0tJTkRdOiB7XG4gICAgICAgICAgICAgICAgW0V2ZW50RGlyZWN0aW9uLlNlbmRdOiBfdGQoXCJTZW5kIHN0aWNrZXJzIHRvIHlvdXIgYWN0aXZlIHJvb20gYXMgeW91XCIpLFxuICAgICAgICAgICAgICAgIFtFdmVudERpcmVjdGlvbi5SZWNlaXZlXTogX3RkKFwiU2VlIHdoZW4gYW55b25lIHBvc3RzIGEgc3RpY2tlciB0byB5b3VyIGFjdGl2ZSByb29tXCIpLFxuICAgICAgICAgICAgfSxcbiAgICAgICAgfSxcbiAgICB9O1xuXG4gICAgcHJpdmF0ZSBzdGF0aWMgYnlsaW5lRm9yKGV2ZW50Q2FwOiBXaWRnZXRFdmVudENhcGFiaWxpdHkpOiBUcmFuc2xhdGVkU3RyaW5nIHtcbiAgICAgICAgaWYgKGV2ZW50Q2FwLmlzU3RhdGUpIHtcbiAgICAgICAgICAgIHJldHVybiAhZXZlbnRDYXAua2V5U3RyXG4gICAgICAgICAgICAgICAgPyBfdChcIndpdGggYW4gZW1wdHkgc3RhdGUga2V5XCIpXG4gICAgICAgICAgICAgICAgOiBfdChcIndpdGggc3RhdGUga2V5ICUoc3RhdGVLZXkpc1wiLCB7c3RhdGVLZXk6IGV2ZW50Q2FwLmtleVN0cn0pO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiBudWxsOyAvLyByb29tIG1lc3NhZ2VzIGFyZSBoYW5kbGVkIHNwZWNpYWxseVxuICAgIH1cblxuICAgIHB1YmxpYyBzdGF0aWMgZm9yKGNhcGFiaWxpdHk6IENhcGFiaWxpdHksIGtpbmQ6IFdpZGdldEtpbmQpOiBUcmFuc2xhdGVkQ2FwYWJpbGl0eVRleHQge1xuICAgICAgICAvLyBGaXJzdCBzZWUgaWYgd2UgaGF2ZSBhIHN1cGVyIHNpbXBsZSBsaW5lIG9mIHRleHQgdG8gcHJvdmlkZSBiYWNrXG4gICAgICAgIGlmIChDYXBhYmlsaXR5VGV4dC5zaW1wbGVDYXBzW2NhcGFiaWxpdHldKSB7XG4gICAgICAgICAgICBjb25zdCB0ZXh0Rm9yS2luZCA9IENhcGFiaWxpdHlUZXh0LnNpbXBsZUNhcHNbY2FwYWJpbGl0eV07XG4gICAgICAgICAgICBpZiAodGV4dEZvcktpbmRba2luZF0pIHJldHVybiB7cHJpbWFyeTogX3QodGV4dEZvcktpbmRba2luZF0pfTtcbiAgICAgICAgICAgIGlmICh0ZXh0Rm9yS2luZFtHRU5FUklDX1dJREdFVF9LSU5EXSkgcmV0dXJuIHtwcmltYXJ5OiBfdCh0ZXh0Rm9yS2luZFtHRU5FUklDX1dJREdFVF9LSU5EXSl9O1xuXG4gICAgICAgICAgICAvLyAuLi4gd2UnbGwgZmFsbCB0aHJvdWdoIHRvIHRoZSBnZW5lcmljIGNhcGFiaWxpdHkgcHJvY2Vzc2luZyBhdCB0aGUgZW5kIG9mIHRoaXNcbiAgICAgICAgICAgIC8vIGZ1bmN0aW9uIGlmIHdlIGZhaWwgdG8gbG9jYXRlIGEgc2ltcGxlIHN0cmluZyBhbmQgdGhlIGNhcGFiaWxpdHkgaXNuJ3QgZm9yIGFuXG4gICAgICAgICAgICAvLyBldmVudC5cbiAgICAgICAgfVxuXG4gICAgICAgIC8vIFdlIGRpZG4ndCBoYXZlIGEgc3VwZXIgc2ltcGxlIGxpbmUgb2YgdGV4dCwgc28gdHJ5IHByb2Nlc3NpbmcgdGhlIGNhcGFiaWxpdHkgYXMgdGhlXG4gICAgICAgIC8vIG1vcmUgY29tcGxleCBldmVudCBzZW5kL3JlY2VpdmUgcGVybWlzc2lvbiB0eXBlLlxuICAgICAgICBjb25zdCBbZXZlbnRDYXBdID0gV2lkZ2V0RXZlbnRDYXBhYmlsaXR5LmZpbmRFdmVudENhcGFiaWxpdGllcyhbY2FwYWJpbGl0eV0pO1xuICAgICAgICBpZiAoZXZlbnRDYXApIHtcbiAgICAgICAgICAgIC8vIFNwZWNpYWwgY2FzZSByb29tIG1lc3NhZ2VzIHNvIHRoZXkgc2hvdyB1cCBhIGJpdCBjbGVhbmVyIHRvIHRoZSB1c2VyLiBSZXN1bHQgaXNcbiAgICAgICAgICAgIC8vIGVmZmVjdGl2ZWx5IFwiU2VuZCBpbWFnZXNcIiBpbnN0ZWFkIG9mIFwiU2VuZCBtZXNzYWdlcy4uLiBvZiB0eXBlIGltYWdlc1wiIGlmIHdlIHdlcmVcbiAgICAgICAgICAgIC8vIHRvIGhhbmRsZSB0aGUgbXNndHlwZSBudWFuY2VzIGluIHRoaXMgZnVuY3Rpb24uXG4gICAgICAgICAgICBpZiAoIWV2ZW50Q2FwLmlzU3RhdGUgJiYgZXZlbnRDYXAuZXZlbnRUeXBlID09PSBFdmVudFR5cGUuUm9vbU1lc3NhZ2UpIHtcbiAgICAgICAgICAgICAgICByZXR1cm4gQ2FwYWJpbGl0eVRleHQuZm9yUm9vbU1lc3NhZ2VDYXAoZXZlbnRDYXAsIGtpbmQpO1xuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICAvLyBTZWUgaWYgd2UgaGF2ZSBhIHN0YXRpYyBsaW5lIG9mIHRleHQgdG8gcHJvdmlkZSBmb3IgdGhlIGdpdmVuIGV2ZW50IHR5cGUgYW5kXG4gICAgICAgICAgICAvLyBkaXJlY3Rpb24uIFRoZSBob3BlIGlzIHRoYXQgd2UgZG8gZm9yIGNvbW1vbiBldmVudCB0eXBlcyBmb3IgZnJpZW5kbGllciBjb3B5LlxuICAgICAgICAgICAgY29uc3QgZXZTZW5kUmVjdiA9IGV2ZW50Q2FwLmlzU3RhdGVcbiAgICAgICAgICAgICAgICA/IENhcGFiaWxpdHlUZXh0LnN0YXRlU2VuZFJlY3ZDYXBzXG4gICAgICAgICAgICAgICAgOiBDYXBhYmlsaXR5VGV4dC5ub25TdGF0ZVNlbmRSZWN2Q2FwcztcbiAgICAgICAgICAgIGlmIChldlNlbmRSZWN2W2V2ZW50Q2FwLmV2ZW50VHlwZV0pIHtcbiAgICAgICAgICAgICAgICBjb25zdCB0ZXh0Rm9yS2luZCA9IGV2U2VuZFJlY3ZbZXZlbnRDYXAuZXZlbnRUeXBlXTtcbiAgICAgICAgICAgICAgICBjb25zdCB0ZXh0Rm9yRGlyZWN0aW9uID0gdGV4dEZvcktpbmRba2luZF0gfHwgdGV4dEZvcktpbmRbR0VORVJJQ19XSURHRVRfS0lORF07XG4gICAgICAgICAgICAgICAgaWYgKHRleHRGb3JEaXJlY3Rpb24gJiYgdGV4dEZvckRpcmVjdGlvbltldmVudENhcC5kaXJlY3Rpb25dKSB7XG4gICAgICAgICAgICAgICAgICAgIHJldHVybiB7XG4gICAgICAgICAgICAgICAgICAgICAgICBwcmltYXJ5OiBfdCh0ZXh0Rm9yRGlyZWN0aW9uW2V2ZW50Q2FwLmRpcmVjdGlvbl0pLFxuICAgICAgICAgICAgICAgICAgICAgICAgLy8gbm8gYnlsaW5lIGJlY2F1c2Ugd2Ugd291bGQgaGF2ZSBhbHJlYWR5IHJlcHJlc2VudGVkIHRoZSBldmVudCBwcm9wZXJseVxuICAgICAgICAgICAgICAgICAgICB9O1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgLy8gV2UgZG9uJ3QgaGF2ZSBhbnl0aGluZyBzaW1wbGUsIHNvIGp1c3QgcmV0dXJuIGEgZ2VuZXJpYyBzdHJpbmcgZm9yIHRoZSBldmVudCBjYXBcbiAgICAgICAgICAgIGlmIChraW5kID09PSBXaWRnZXRLaW5kLlJvb20pIHtcbiAgICAgICAgICAgICAgICBpZiAoZXZlbnRDYXAuZGlyZWN0aW9uID09PSBFdmVudERpcmVjdGlvbi5TZW5kKSB7XG4gICAgICAgICAgICAgICAgICAgIHJldHVybiB7XG4gICAgICAgICAgICAgICAgICAgICAgICBwcmltYXJ5OiBfdChcIlNlbmQgPGI+JShldmVudFR5cGUpczwvYj4gZXZlbnRzIGFzIHlvdSBpbiB0aGlzIHJvb21cIiwge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGV2ZW50VHlwZTogZXZlbnRDYXAuZXZlbnRUeXBlLFxuICAgICAgICAgICAgICAgICAgICAgICAgfSwge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGI6IHN1YiA9PiA8Yj57c3VifTwvYj4sXG4gICAgICAgICAgICAgICAgICAgICAgICB9KSxcbiAgICAgICAgICAgICAgICAgICAgICAgIGJ5bGluZTogQ2FwYWJpbGl0eVRleHQuYnlsaW5lRm9yKGV2ZW50Q2FwKSxcbiAgICAgICAgICAgICAgICAgICAgfTtcbiAgICAgICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgICAgICByZXR1cm4ge1xuICAgICAgICAgICAgICAgICAgICAgICAgcHJpbWFyeTogX3QoXCJTZWUgPGI+JShldmVudFR5cGUpczwvYj4gZXZlbnRzIHBvc3RlZCB0byB0aGlzIHJvb21cIiwge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGV2ZW50VHlwZTogZXZlbnRDYXAuZXZlbnRUeXBlLFxuICAgICAgICAgICAgICAgICAgICAgICAgfSwge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGI6IHN1YiA9PiA8Yj57c3VifTwvYj4sXG4gICAgICAgICAgICAgICAgICAgICAgICB9KSxcbiAgICAgICAgICAgICAgICAgICAgICAgIGJ5bGluZTogQ2FwYWJpbGl0eVRleHQuYnlsaW5lRm9yKGV2ZW50Q2FwKSxcbiAgICAgICAgICAgICAgICAgICAgfTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9IGVsc2UgeyAvLyBhc3N1bWUgZ2VuZXJpY1xuICAgICAgICAgICAgICAgIGlmIChldmVudENhcC5kaXJlY3Rpb24gPT09IEV2ZW50RGlyZWN0aW9uLlNlbmQpIHtcbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIHByaW1hcnk6IF90KFwiU2VuZCA8Yj4lKGV2ZW50VHlwZSlzPC9iPiBldmVudHMgYXMgeW91IGluIHlvdXIgYWN0aXZlIHJvb21cIiwge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGV2ZW50VHlwZTogZXZlbnRDYXAuZXZlbnRUeXBlLFxuICAgICAgICAgICAgICAgICAgICAgICAgfSwge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGI6IHN1YiA9PiA8Yj57c3VifTwvYj4sXG4gICAgICAgICAgICAgICAgICAgICAgICB9KSxcbiAgICAgICAgICAgICAgICAgICAgICAgIGJ5bGluZTogQ2FwYWJpbGl0eVRleHQuYnlsaW5lRm9yKGV2ZW50Q2FwKSxcbiAgICAgICAgICAgICAgICAgICAgfTtcbiAgICAgICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgICAgICByZXR1cm4ge1xuICAgICAgICAgICAgICAgICAgICAgICAgcHJpbWFyeTogX3QoXCJTZWUgPGI+JShldmVudFR5cGUpczwvYj4gZXZlbnRzIHBvc3RlZCB0byB5b3VyIGFjdGl2ZSByb29tXCIsIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBldmVudFR5cGU6IGV2ZW50Q2FwLmV2ZW50VHlwZSxcbiAgICAgICAgICAgICAgICAgICAgICAgIH0sIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBiOiBzdWIgPT4gPGI+e3N1Yn08L2I+LFxuICAgICAgICAgICAgICAgICAgICAgICAgfSksXG4gICAgICAgICAgICAgICAgICAgICAgICBieWxpbmU6IENhcGFiaWxpdHlUZXh0LmJ5bGluZUZvcihldmVudENhcCksXG4gICAgICAgICAgICAgICAgICAgIH07XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuICAgICAgICB9XG5cbiAgICAgICAgLy8gV2UgZG9uJ3QgaGF2ZSBlbm91Z2ggY29udGV4dCB0byByZW5kZXIgdGhpcyBjYXBhYmlsaXR5IHNwZWNpYWxseSwgc28gd2UnbGwgcHJlc2VudCBpdCBhcy1pc1xuICAgICAgICByZXR1cm4ge1xuICAgICAgICAgICAgcHJpbWFyeTogX3QoXCJUaGUgPGI+JShjYXBhYmlsaXR5KXM8L2I+IGNhcGFiaWxpdHlcIiwge2NhcGFiaWxpdHl9LCB7XG4gICAgICAgICAgICAgICAgYjogc3ViID0+IDxiPntzdWJ9PC9iPixcbiAgICAgICAgICAgIH0pLFxuICAgICAgICB9O1xuICAgIH1cblxuICAgIHByaXZhdGUgc3RhdGljIGZvclJvb21NZXNzYWdlQ2FwKGV2ZW50Q2FwOiBXaWRnZXRFdmVudENhcGFiaWxpdHksIGtpbmQ6IFdpZGdldEtpbmQpOiBUcmFuc2xhdGVkQ2FwYWJpbGl0eVRleHQge1xuICAgICAgICAvLyBGaXJzdCBoYW5kbGUgdGhlIGNhc2Ugb2YgXCJhbGwgbWVzc2FnZXNcIiB0byBtYWtlIHRoZSBzd2l0Y2ggbGF0ZXIgb24gYSBiaXQgY2xlYXJlclxuICAgICAgICBpZiAoIWV2ZW50Q2FwLmtleVN0cikge1xuICAgICAgICAgICAgaWYgKGV2ZW50Q2FwLmRpcmVjdGlvbiA9PT0gRXZlbnREaXJlY3Rpb24uU2VuZCkge1xuICAgICAgICAgICAgICAgIHJldHVybiB7XG4gICAgICAgICAgICAgICAgICAgIHByaW1hcnk6IGtpbmQgPT09IFdpZGdldEtpbmQuUm9vbVxuICAgICAgICAgICAgICAgICAgICAgICAgPyBfdChcIlNlbmQgbWVzc2FnZXMgYXMgeW91IGluIHRoaXMgcm9vbVwiKVxuICAgICAgICAgICAgICAgICAgICAgICAgOiBfdChcIlNlbmQgbWVzc2FnZXMgYXMgeW91IGluIHlvdXIgYWN0aXZlIHJvb21cIiksXG4gICAgICAgICAgICAgICAgfTtcbiAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgcmV0dXJuIHtcbiAgICAgICAgICAgICAgICAgICAgcHJpbWFyeToga2luZCA9PT0gV2lkZ2V0S2luZC5Sb29tXG4gICAgICAgICAgICAgICAgICAgICAgICA/IF90KFwiU2VlIG1lc3NhZ2VzIHBvc3RlZCB0byB0aGlzIHJvb21cIilcbiAgICAgICAgICAgICAgICAgICAgICAgIDogX3QoXCJTZWUgbWVzc2FnZXMgcG9zdGVkIHRvIHlvdXIgYWN0aXZlIHJvb21cIiksXG4gICAgICAgICAgICAgICAgfTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuXG4gICAgICAgIC8vIE5vdyBoYW5kbGUgYWxsIHRoZSBtZXNzYWdlIHR5cGVzIHdlIGNhcmUgYWJvdXQuIFRoZXJlIGFyZSBtb3JlIG1lc3NhZ2UgdHlwZXMgYXZhaWxhYmxlLCBob3dldmVyXG4gICAgICAgIC8vIHRoZXkgYXJlIG5vdCBhcyBjb21tb24gc28gd2UgZG9uJ3QgYm90aGVyIHJlbmRlcmluZyB0aGVtLiBUaGV5J2xsIGZhbGwgaW50byB0aGUgZ2VuZXJpYyBjYXNlLlxuICAgICAgICBzd2l0Y2ggKGV2ZW50Q2FwLmtleVN0cikge1xuICAgICAgICAgICAgY2FzZSBNc2dUeXBlLlRleHQ6IHtcbiAgICAgICAgICAgICAgICBpZiAoZXZlbnRDYXAuZGlyZWN0aW9uID09PSBFdmVudERpcmVjdGlvbi5TZW5kKSB7XG4gICAgICAgICAgICAgICAgICAgIHJldHVybiB7XG4gICAgICAgICAgICAgICAgICAgICAgICBwcmltYXJ5OiBraW5kID09PSBXaWRnZXRLaW5kLlJvb21cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA/IF90KFwiU2VuZCB0ZXh0IG1lc3NhZ2VzIGFzIHlvdSBpbiB0aGlzIHJvb21cIilcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA6IF90KFwiU2VuZCB0ZXh0IG1lc3NhZ2VzIGFzIHlvdSBpbiB5b3VyIGFjdGl2ZSByb29tXCIpLFxuICAgICAgICAgICAgICAgICAgICB9O1xuICAgICAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgICAgIHJldHVybiB7XG4gICAgICAgICAgICAgICAgICAgICAgICBwcmltYXJ5OiBraW5kID09PSBXaWRnZXRLaW5kLlJvb21cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA/IF90KFwiU2VlIHRleHQgbWVzc2FnZXMgcG9zdGVkIHRvIHRoaXMgcm9vbVwiKVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIDogX3QoXCJTZWUgdGV4dCBtZXNzYWdlcyBwb3N0ZWQgdG8geW91ciBhY3RpdmUgcm9vbVwiKSxcbiAgICAgICAgICAgICAgICAgICAgfTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBjYXNlIE1zZ1R5cGUuRW1vdGU6IHtcbiAgICAgICAgICAgICAgICBpZiAoZXZlbnRDYXAuZGlyZWN0aW9uID09PSBFdmVudERpcmVjdGlvbi5TZW5kKSB7XG4gICAgICAgICAgICAgICAgICAgIHJldHVybiB7XG4gICAgICAgICAgICAgICAgICAgICAgICBwcmltYXJ5OiBraW5kID09PSBXaWRnZXRLaW5kLlJvb21cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA/IF90KFwiU2VuZCBlbW90ZXMgYXMgeW91IGluIHRoaXMgcm9vbVwiKVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIDogX3QoXCJTZW5kIGVtb3RlcyBhcyB5b3UgaW4geW91ciBhY3RpdmUgcm9vbVwiKSxcbiAgICAgICAgICAgICAgICAgICAgfTtcbiAgICAgICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgICAgICByZXR1cm4ge1xuICAgICAgICAgICAgICAgICAgICAgICAgcHJpbWFyeToga2luZCA9PT0gV2lkZ2V0S2luZC5Sb29tXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgPyBfdChcIlNlZSBlbW90ZXMgcG9zdGVkIHRvIHRoaXMgcm9vbVwiKVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIDogX3QoXCJTZWUgZW1vdGVzIHBvc3RlZCB0byB5b3VyIGFjdGl2ZSByb29tXCIpLFxuICAgICAgICAgICAgICAgICAgICB9O1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGNhc2UgTXNnVHlwZS5JbWFnZToge1xuICAgICAgICAgICAgICAgIGlmIChldmVudENhcC5kaXJlY3Rpb24gPT09IEV2ZW50RGlyZWN0aW9uLlNlbmQpIHtcbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIHByaW1hcnk6IGtpbmQgPT09IFdpZGdldEtpbmQuUm9vbVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgID8gX3QoXCJTZW5kIGltYWdlcyBhcyB5b3UgaW4gdGhpcyByb29tXCIpXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgOiBfdChcIlNlbmQgaW1hZ2VzIGFzIHlvdSBpbiB5b3VyIGFjdGl2ZSByb29tXCIpLFxuICAgICAgICAgICAgICAgICAgICB9O1xuICAgICAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgICAgIHJldHVybiB7XG4gICAgICAgICAgICAgICAgICAgICAgICBwcmltYXJ5OiBraW5kID09PSBXaWRnZXRLaW5kLlJvb21cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA/IF90KFwiU2VlIGltYWdlcyBwb3N0ZWQgdG8gdGhpcyByb29tXCIpXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgOiBfdChcIlNlZSBpbWFnZXMgcG9zdGVkIHRvIHlvdXIgYWN0aXZlIHJvb21cIiksXG4gICAgICAgICAgICAgICAgICAgIH07XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuICAgICAgICAgICAgY2FzZSBNc2dUeXBlLlZpZGVvOiB7XG4gICAgICAgICAgICAgICAgaWYgKGV2ZW50Q2FwLmRpcmVjdGlvbiA9PT0gRXZlbnREaXJlY3Rpb24uU2VuZCkge1xuICAgICAgICAgICAgICAgICAgICByZXR1cm4ge1xuICAgICAgICAgICAgICAgICAgICAgICAgcHJpbWFyeToga2luZCA9PT0gV2lkZ2V0S2luZC5Sb29tXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgPyBfdChcIlNlbmQgdmlkZW9zIGFzIHlvdSBpbiB0aGlzIHJvb21cIilcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA6IF90KFwiU2VuZCB2aWRlb3MgYXMgeW91IGluIHlvdXIgYWN0aXZlIHJvb21cIiksXG4gICAgICAgICAgICAgICAgICAgIH07XG4gICAgICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIHByaW1hcnk6IGtpbmQgPT09IFdpZGdldEtpbmQuUm9vbVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgID8gX3QoXCJTZWUgdmlkZW9zIHBvc3RlZCB0byB0aGlzIHJvb21cIilcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA6IF90KFwiU2VlIHZpZGVvcyBwb3N0ZWQgdG8geW91ciBhY3RpdmUgcm9vbVwiKSxcbiAgICAgICAgICAgICAgICAgICAgfTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBjYXNlIE1zZ1R5cGUuRmlsZToge1xuICAgICAgICAgICAgICAgIGlmIChldmVudENhcC5kaXJlY3Rpb24gPT09IEV2ZW50RGlyZWN0aW9uLlNlbmQpIHtcbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIHByaW1hcnk6IGtpbmQgPT09IFdpZGdldEtpbmQuUm9vbVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgID8gX3QoXCJTZW5kIGdlbmVyYWwgZmlsZXMgYXMgeW91IGluIHRoaXMgcm9vbVwiKVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIDogX3QoXCJTZW5kIGdlbmVyYWwgZmlsZXMgYXMgeW91IGluIHlvdXIgYWN0aXZlIHJvb21cIiksXG4gICAgICAgICAgICAgICAgICAgIH07XG4gICAgICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIHByaW1hcnk6IGtpbmQgPT09IFdpZGdldEtpbmQuUm9vbVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgID8gX3QoXCJTZWUgZ2VuZXJhbCBmaWxlcyBwb3N0ZWQgdG8gdGhpcyByb29tXCIpXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgOiBfdChcIlNlZSBnZW5lcmFsIGZpbGVzIHBvc3RlZCB0byB5b3VyIGFjdGl2ZSByb29tXCIpLFxuICAgICAgICAgICAgICAgICAgICB9O1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGRlZmF1bHQ6IHtcbiAgICAgICAgICAgICAgICBsZXQgcHJpbWFyeTogVHJhbnNsYXRlZFN0cmluZztcbiAgICAgICAgICAgICAgICBpZiAoZXZlbnRDYXAuZGlyZWN0aW9uID09PSBFdmVudERpcmVjdGlvbi5TZW5kKSB7XG4gICAgICAgICAgICAgICAgICAgIGlmIChraW5kID09PSBXaWRnZXRLaW5kLlJvb20pIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIHByaW1hcnkgPSBfdChcIlNlbmQgPGI+JShtc2d0eXBlKXM8L2I+IG1lc3NhZ2VzIGFzIHlvdSBpbiB0aGlzIHJvb21cIiwge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1zZ3R5cGU6IGV2ZW50Q2FwLmtleVN0cixcbiAgICAgICAgICAgICAgICAgICAgICAgIH0sIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBiOiBzdWIgPT4gPGI+e3N1Yn08L2I+LFxuICAgICAgICAgICAgICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgICAgICAgICBwcmltYXJ5ID0gX3QoXCJTZW5kIDxiPiUobXNndHlwZSlzPC9iPiBtZXNzYWdlcyBhcyB5b3UgaW4geW91ciBhY3RpdmUgcm9vbVwiLCB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgbXNndHlwZTogZXZlbnRDYXAua2V5U3RyLFxuICAgICAgICAgICAgICAgICAgICAgICAgfSwge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGI6IHN1YiA9PiA8Yj57c3VifTwvYj4sXG4gICAgICAgICAgICAgICAgICAgICAgICB9KTtcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgICAgIGlmIChraW5kID09PSBXaWRnZXRLaW5kLlJvb20pIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIHByaW1hcnkgPSBfdChcIlNlZSA8Yj4lKG1zZ3R5cGUpczwvYj4gbWVzc2FnZXMgcG9zdGVkIHRvIHRoaXMgcm9vbVwiLCB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgbXNndHlwZTogZXZlbnRDYXAua2V5U3RyLFxuICAgICAgICAgICAgICAgICAgICAgICAgfSwge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGI6IHN1YiA9PiA8Yj57c3VifTwvYj4sXG4gICAgICAgICAgICAgICAgICAgICAgICB9KTtcbiAgICAgICAgICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIHByaW1hcnkgPSBfdChcIlNlZSA8Yj4lKG1zZ3R5cGUpczwvYj4gbWVzc2FnZXMgcG9zdGVkIHRvIHlvdXIgYWN0aXZlIHJvb21cIiwge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1zZ3R5cGU6IGV2ZW50Q2FwLmtleVN0cixcbiAgICAgICAgICAgICAgICAgICAgICAgIH0sIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBiOiBzdWIgPT4gPGI+e3N1Yn08L2I+LFxuICAgICAgICAgICAgICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgcmV0dXJuIHtwcmltYXJ5fTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgIH1cbn1cbiJdfQ==