1
0
mirror of https://github.com/Lightcord/Lightcord.git synced 2025-04-12 00:55:40 +02:00
2020-06-28 19:08:47 +02:00

12058 lines
1.5 MiB

module.exports =
/******/ (function(modules) { // webpackBootstrap
/******/ // The module cache
/******/ var installedModules = {};
/******/
/******/ // The require function
/******/ function __webpack_require__(moduleId) {
/******/
/******/ // Check if module is in cache
/******/ if(installedModules[moduleId]) {
/******/ return installedModules[moduleId].exports;
/******/ }
/******/ // Create a new module (and put it into the cache)
/******/ var module = installedModules[moduleId] = {
/******/ i: moduleId,
/******/ l: false,
/******/ exports: {}
/******/ };
/******/
/******/ // Execute the module function
/******/ modules[moduleId].call(module.exports, module, module.exports, __webpack_require__);
/******/
/******/ // Flag the module as loaded
/******/ module.l = true;
/******/
/******/ // Return the exports of the module
/******/ return module.exports;
/******/ }
/******/
/******/
/******/ // expose the modules object (__webpack_modules__)
/******/ __webpack_require__.m = modules;
/******/
/******/ // expose the module cache
/******/ __webpack_require__.c = installedModules;
/******/
/******/ // define getter function for harmony exports
/******/ __webpack_require__.d = function(exports, name, getter) {
/******/ if(!__webpack_require__.o(exports, name)) {
/******/ Object.defineProperty(exports, name, { enumerable: true, get: getter });
/******/ }
/******/ };
/******/
/******/ // define __esModule on exports
/******/ __webpack_require__.r = function(exports) {
/******/ if(typeof Symbol !== 'undefined' && Symbol.toStringTag) {
/******/ Object.defineProperty(exports, Symbol.toStringTag, { value: 'Module' });
/******/ }
/******/ Object.defineProperty(exports, '__esModule', { value: true });
/******/ };
/******/
/******/ // create a fake namespace object
/******/ // mode & 1: value is a module id, require it
/******/ // mode & 2: merge all properties of value into the ns
/******/ // mode & 4: return value when already ns object
/******/ // mode & 8|1: behave like require
/******/ __webpack_require__.t = function(value, mode) {
/******/ if(mode & 1) value = __webpack_require__(value);
/******/ if(mode & 8) return value;
/******/ if((mode & 4) && typeof value === 'object' && value && value.__esModule) return value;
/******/ var ns = Object.create(null);
/******/ __webpack_require__.r(ns);
/******/ Object.defineProperty(ns, 'default', { enumerable: true, value: value });
/******/ if(mode & 2 && typeof value != 'string') for(var key in value) __webpack_require__.d(ns, key, function(key) { return value[key]; }.bind(null, key));
/******/ return ns;
/******/ };
/******/
/******/ // getDefaultExport function for compatibility with non-harmony modules
/******/ __webpack_require__.n = function(module) {
/******/ var getter = module && module.__esModule ?
/******/ function getDefault() { return module['default']; } :
/******/ function getModuleExports() { return module; };
/******/ __webpack_require__.d(getter, 'a', getter);
/******/ return getter;
/******/ };
/******/
/******/ // Object.prototype.hasOwnProperty.call
/******/ __webpack_require__.o = function(object, property) { return Object.prototype.hasOwnProperty.call(object, property); };
/******/
/******/ // __webpack_public_path__
/******/ __webpack_require__.p = "";
/******/
/******/
/******/ // Load entry module and return exports
/******/ return __webpack_require__(__webpack_require__.s = "./src/index.js");
/******/ })
/************************************************************************/
/******/ ({
/***/ "./src/0globals.js":
/*!*************************!*\
!*** ./src/0globals.js ***!
\*************************/
/*! exports provided: minimumDiscordVersion, currentDiscordVersion, minSupportedVersion, bbdVersion, LCChanelog, bbdChangelog, settings, defaultCookie, settingsCookie, settingsRPC, defaultRPC, bdpluginErrors, bdthemeErrors, bdConfig, bdthemes, bdplugins, pluginCookie, themeCookie */
/***/ (function(module, __webpack_exports__, __webpack_require__) {
"use strict";
__webpack_require__.r(__webpack_exports__);
/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "minimumDiscordVersion", function() { return minimumDiscordVersion; });
/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "currentDiscordVersion", function() { return currentDiscordVersion; });
/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "minSupportedVersion", function() { return minSupportedVersion; });
/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "bbdVersion", function() { return bbdVersion; });
/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "LCChanelog", function() { return LCChanelog; });
/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "bbdChangelog", function() { return bbdChangelog; });
/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "settings", function() { return settings; });
/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "defaultCookie", function() { return defaultCookie; });
/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "settingsCookie", function() { return settingsCookie; });
/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "settingsRPC", function() { return settingsRPC; });
/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "defaultRPC", function() { return defaultRPC; });
/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "bdpluginErrors", function() { return bdpluginErrors; });
/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "bdthemeErrors", function() { return bdthemeErrors; });
/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "bdConfig", function() { return bdConfig; });
/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "bdthemes", function() { return bdthemes; });
/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "bdplugins", function() { return bdplugins; });
/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "pluginCookie", function() { return pluginCookie; });
/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "themeCookie", function() { return themeCookie; });
/* harmony import */ var electron__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! electron */ "electron");
/* harmony import */ var electron__WEBPACK_IMPORTED_MODULE_0___default = /*#__PURE__*/__webpack_require__.n(electron__WEBPACK_IMPORTED_MODULE_0__);
/* harmony import */ var _modules_v2__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ./modules/v2 */ "./src/modules/v2.js");
/* harmony import */ var _modules_webpackModules__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! ./modules/webpackModules */ "./src/modules/webpackModules.js");
// var settingsPanel, voiceMode, pluginModule, themeModule, dMode, publicServersModule, mainCore, BDV2;
const minimumDiscordVersion = "0.0.306";
const currentDiscordVersion = window.DiscordNative && window.DiscordNative.remoteApp && window.DiscordNative.remoteApp.getVersion && window.DiscordNative.remoteApp.getVersion() || "0.0.306";
const minSupportedVersion = "0.3.0";
const bbdVersion = "0.3.4";
const LCChanelog = {
description: "Lightcord's changelog",
changes: [{
title: "What's New?",
items: ["Lightcord is now available !", "We removed emotes. That's sad for people who were actually using it, but it was leading to more loading time and some basic words were emote."]
}],
image: "https://i.imgur.com/sfNhqwP.png",
title: "Lightcord",
subtitle: "v" + electron__WEBPACK_IMPORTED_MODULE_0__["remote"].getGlobal("BuildInfo").version,
footer: function () {
const TextElement = _modules_webpackModules__WEBPACK_IMPORTED_MODULE_2__["default"].findByDisplayName("Text");
const ModalStack = _modules_webpackModules__WEBPACK_IMPORTED_MODULE_2__["default"].findByProps("push", "update", "pop", "popWithKey");
if (!TextElement || !ModalStack) return null;
const Anchor = _modules_webpackModules__WEBPACK_IMPORTED_MODULE_2__["default"].find(m => m.displayName == "Anchor");
const AnchorClasses = _modules_webpackModules__WEBPACK_IMPORTED_MODULE_2__["default"].findByProps("anchorUnderlineOnHover") || {
anchor: "anchor-3Z-8Bb",
anchorUnderlineOnHover: "anchorUnderlineOnHover-2ESHQB"
};
const joinSupportServer = click => {
click.preventDefault();
click.stopPropagation();
ModalStack.pop();
_modules_v2__WEBPACK_IMPORTED_MODULE_1__["default"].joinLC();
};
const supportLink = Anchor ? _modules_v2__WEBPACK_IMPORTED_MODULE_1__["default"].React.createElement(Anchor, {
onClick: joinSupportServer
}, "Join our Discord Server.") : _modules_v2__WEBPACK_IMPORTED_MODULE_1__["default"].React.createElement("a", {
className: `${AnchorClasses.anchor} ${AnchorClasses.anchorUnderlineOnHover}`,
onClick: joinSupportServer
}, "Join our Discord Server.");
return _modules_v2__WEBPACK_IMPORTED_MODULE_1__["default"].React.createElement(TextElement, {
size: TextElement.Sizes.SMALL,
color: TextElement.Colors.STANDARD
}, "Need support? ", supportLink);
}()
};
const bbdChangelog = {
description: "BBD's changelog.",
changes: [{
title: "What's New?",
items: ["**Lightcord** is now using BandagedBD. That means all plugins you were using can be used too !", "**Window Transparency** changes were made to more compatible with external window managers and addons like Glasscord.", "Initialization sequence has once again been changed slightly to hopefully improve loading times."]
}, {
title: "Bug Fixes",
type: "fixed",
items: ["Some fixes related to showing modals in the `BdApi`."]
}]
};
const settings = {
"Custom css live update": {
id: "bda-css-0",
info: "",
implemented: true,
hidden: true,
cat: "core"
},
"Custom css auto udpate": {
id: "bda-css-1",
info: "",
implemented: true,
hidden: true,
cat: "core"
},
"BetterDiscord Blue": {
id: "bda-gs-b",
info: "Replace Discord blue with BD Blue",
implemented: false,
hidden: false,
cat: "core"
},
/* Core */
/* ====== */
"Public Servers": {
id: "bda-gs-1",
info: "Display public servers button",
implemented: true,
hidden: false,
cat: "core",
category: "modules"
},
"Minimal Mode": {
id: "bda-gs-2",
info: "Hide elements and reduce the size of elements.",
implemented: true,
hidden: false,
cat: "core",
category: "modules"
},
"Voice Mode": {
id: "bda-gs-4",
info: "Only show voice chat",
implemented: true,
hidden: false,
cat: "core",
category: "modules"
},
"Hide Channels": {
id: "bda-gs-3",
info: "Hide channels in minimal mode",
implemented: true,
hidden: false,
cat: "core",
category: "modules"
},
"Dark Mode": {
id: "bda-gs-5",
info: "Make certain elements dark by default(wip)",
implemented: true,
hidden: false,
cat: "core",
category: "modules"
},
"Voice Disconnect": {
id: "bda-dc-0",
info: "Disconnect from voice server when closing Discord",
implemented: true,
hidden: false,
cat: "core",
category: "modules"
},
"24 Hour Timestamps": {
id: "bda-gs-6",
info: "Replace 12hr timestamps with proper ones",
implemented: true,
hidden: false,
cat: "core",
category: "modules"
},
"Colored Text": {
id: "bda-gs-7",
info: "Make text color the same as role color",
implemented: true,
hidden: false,
cat: "core",
category: "modules"
},
"Normalize Classes": {
id: "fork-ps-4",
info: "Adds stable classes to elements to help themes. (e.g. adds .da-channels to .channels-Ie2l6A)",
implemented: true,
hidden: false,
cat: "core",
category: "modules"
},
/* Content */
"Content Error Modal": {
id: "fork-ps-1",
info: "Shows a modal with plugin/theme errors",
implemented: true,
hidden: false,
cat: "core",
category: "content manager"
},
"Scan Plugins": {
id: "fork-ps-6",
info: "Scan plugins for any threat that can be hidden inside.",
implemented: true,
hidden: false,
cat: "core",
category: "content manager"
},
"Show Toasts": {
id: "fork-ps-2",
info: "Shows a small notification for important information",
implemented: true,
hidden: false,
cat: "core",
category: "content manager"
},
"Scroll To Settings": {
id: "fork-ps-3",
info: "Auto-scrolls to a plugin's settings when the button is clicked (only if out of view)",
implemented: true,
hidden: false,
cat: "core",
category: "content manager"
},
"Automatic Loading": {
id: "fork-ps-5",
info: "Automatically loads, reloads, and unloads plugins and themes",
implemented: true,
hidden: false,
cat: "core",
category: "content manager"
},
/* Developer */
"Developer Mode": {
id: "bda-gs-8",
info: "Developer Mode Toggle",
implemented: true,
hidden: false,
cat: "core",
category: "developer settings"
},
"Copy Selector": {
id: "fork-dm-1",
info: "Adds a \"Copy Selector\" option to context menus when developer mode is active",
implemented: true,
hidden: false,
cat: "core",
category: "developer settings"
},
"React DevTools": {
id: "reactDevTools",
info: "Adds react developer tools to the devtools. Must be installed in Google Chrome on your pc.",
implemented: true,
hidden: true,
cat: "core",
category: "developer settings"
},
/** Lightcord */
"Disable BetterDiscord": {
id: "bd-disable",
info: "Disable Betterdiscord (plugins, themes, etc) (Not implemented).",
implemented: false,
hidden: false,
cat: "lightcord",
category: "Lightcord"
},
"Blur Personnal Informations": {
id: "lightcord-6",
info: "Blur sensitive informations like email, payment infos and more.",
implemented: true,
hidden: false,
cat: "lightcord",
category: "Lightcord"
},
"Calling Ring Beat": {
id: "lightcord-2",
info: "Enable Discord's special calling beat.",
implemented: true,
hidden: false,
cat: "lightcord",
category: "Lightcord"
},
"Developer Options": {
id: "lightcord-1",
info: "Enable Discord's & Lightcord's Internal Developer Options. This allow the \"Experiments\" tab, the \"Developer Options\" tab and the \"Api Components\" tab. (must reopen settings)",
implemented: true,
hidden: false,
cat: "lightcord",
category: "Lightcord"
},
"Ad Block": {
id: "lightcord-4",
info: "Block any BOT that dms you with an invite link. Even in an embed.",
implemented: true,
hidden: false,
cat: "lightcord",
category: "Lightcord"
},
"Enable Lightcord Servers": {
id: "lightcord-5",
info: "Enable Lightcord's servers. Disabling this will disable custom badges.",
implemented: true,
hidden: false,
cat: "lightcord",
category: "Lightcord"
},
"Disable typing": {
id: "lightcord-7",
info: "Don't let other see you're typing.",
implemented: true,
hidden: false,
cat: "lightcord",
category: "Lightcord"
},
/** Lightcord Window */
"Always-on-Top": {
id: "lightcord-3",
info: "Enable window's Always-on-Top mode, where Lightcord stays on top of other applications.",
implemented: true,
hidden: false,
cat: "lightcord",
category: "Window"
},
/** RichPresence */
"Enable": {
id: "lightcord-presence-1",
info: "Enable RichPresence below.",
implemented: true,
hidden: false,
cat: "status"
}
};
const defaultCookie = {
"bda-gs-1": true,
"bda-gs-2": false,
"bda-gs-3": false,
"bda-gs-4": false,
"bda-gs-5": true,
"bda-gs-6": false,
"bda-gs-7": false,
"bda-gs-8": true,
"bda-es-0": true,
"bda-es-1": true,
"bda-es-2": true,
"bda-es-4": false,
"bda-es-6": true,
"bda-es-7": true,
"bda-gs-b": false,
"bda-es-8": true,
"bda-dc-0": false,
"bda-css-0": false,
"bda-css-1": false,
"bda-es-9": true,
"fork-dm-1": false,
"fork-ps-1": true,
"fork-ps-2": true,
"fork-ps-3": true,
"fork-ps-4": true,
"fork-ps-5": true,
"fork-ps-6": true,
"fork-es-2": false,
"fork-es-3": true,
"fork-wp-1": false,
"fork-wp-2": false,
"fork-beta": true,
"reactDevTools": false,
"lightcord-1": false,
"lightcord-2": true,
"lightcord-presence-1": false,
"lightcord-3": false,
"lightcord-4": false,
"lightcord-5": true,
"lightcord-6": true,
"lightcord-7": false
};
const settingsCookie = {};
const settingsRPC = {};
const defaultRPC = {
"name": "Lightcord",
"application_id": "711416957718757418",
"state": "Lightcord Client",
"details": "Browsing Discord",
"timestamps.start": Date.now(),
"assets.small": null,
"assets.large": "712323821037682791"
};
const bdpluginErrors = [];
const bdthemeErrors = []; // define for backwards compatibility
const bdConfig = Object.create(BetterDiscordConfig);
const bdthemes = {};
const bdplugins = {};
const pluginCookie = {};
const themeCookie = {};
/***/ }),
/***/ "./src/index.js":
/*!**********************!*\
!*** ./src/index.js ***!
\**********************/
/*! exports provided: default */
/***/ (function(module, __webpack_exports__, __webpack_require__) {
"use strict";
__webpack_require__.r(__webpack_exports__);
/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "default", function() { return CoreWrapper; });
/* harmony import */ var _localStorageFix__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ./localStorageFix */ "./src/localStorageFix.js");
/* harmony import */ var _loadingIcon__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ./loadingIcon */ "./src/loadingIcon.js");
/* harmony import */ var _0globals__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! ./0globals */ "./src/0globals.js");
/* harmony import */ var _modules_bdApi__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(/*! ./modules/bdApi */ "./src/modules/bdApi.js");
/* harmony import */ var _modules_v2__WEBPACK_IMPORTED_MODULE_4__ = __webpack_require__(/*! ./modules/v2 */ "./src/modules/v2.js");
/* harmony import */ var _modules_pluginModule__WEBPACK_IMPORTED_MODULE_5__ = __webpack_require__(/*! ./modules/pluginModule */ "./src/modules/pluginModule.js");
/* harmony import */ var _modules_themeModule__WEBPACK_IMPORTED_MODULE_6__ = __webpack_require__(/*! ./modules/themeModule */ "./src/modules/themeModule.js");
/* harmony import */ var _modules_utils__WEBPACK_IMPORTED_MODULE_7__ = __webpack_require__(/*! ./modules/utils */ "./src/modules/utils.js");
/* harmony import */ var _modules_bdEvents__WEBPACK_IMPORTED_MODULE_8__ = __webpack_require__(/*! ./modules/bdEvents */ "./src/modules/bdEvents.js");
/* harmony import */ var _modules_settingsPanel__WEBPACK_IMPORTED_MODULE_9__ = __webpack_require__(/*! ./modules/settingsPanel */ "./src/modules/settingsPanel.js");
/* harmony import */ var _modules_dataStore__WEBPACK_IMPORTED_MODULE_10__ = __webpack_require__(/*! ./modules/dataStore */ "./src/modules/dataStore.js");
/* harmony import */ var _modules_contentManager__WEBPACK_IMPORTED_MODULE_11__ = __webpack_require__(/*! ./modules/contentManager */ "./src/modules/contentManager.js");
/* harmony import */ var _modules_classNormalizer__WEBPACK_IMPORTED_MODULE_12__ = __webpack_require__(/*! ./modules/classNormalizer */ "./src/modules/classNormalizer.js");
/* harmony import */ var _modules_core__WEBPACK_IMPORTED_MODULE_13__ = __webpack_require__(/*! ./modules/core */ "./src/modules/core.js");
Object(_localStorageFix__WEBPACK_IMPORTED_MODULE_0__["default"])();
Object(_loadingIcon__WEBPACK_IMPORTED_MODULE_1__["default"])();
const deprecateGlobal = (key, value) => {
// value = typeof(value) !== "object" ? value : new Proxy(value, {
// get: function(obj, mod) {
// if (!obj.hasOwnProperty(mod)) return undefined;
// return obj[mod];
// },
// set: function(obj, mod) {
// if (obj.hasOwnProperty(mod)) return Utils.err("Deprecated Global", "Trying to overwrite deprecated BD globals");
// }
// });
Object.defineProperty(window, key, {
get() {
_modules_utils__WEBPACK_IMPORTED_MODULE_7__["default"].warn("Deprecated Global", `"${key}" will be removed in future versions. Please only use BdApi.`);
return value;
}
});
};
const globalKeys = Object.keys(_0globals__WEBPACK_IMPORTED_MODULE_2__);
for (const key of globalKeys) deprecateGlobal(key, _0globals__WEBPACK_IMPORTED_MODULE_2__[key]);
deprecateGlobal("BDV2", _modules_v2__WEBPACK_IMPORTED_MODULE_4__["default"]);
deprecateGlobal("pluginModule", _modules_pluginModule__WEBPACK_IMPORTED_MODULE_5__["default"]);
deprecateGlobal("themeModule", _modules_themeModule__WEBPACK_IMPORTED_MODULE_6__["default"]);
deprecateGlobal("Utils", _modules_utils__WEBPACK_IMPORTED_MODULE_7__["default"]);
deprecateGlobal("BDEvents", _modules_bdEvents__WEBPACK_IMPORTED_MODULE_8__["default"]);
deprecateGlobal("settingsPanel", _modules_settingsPanel__WEBPACK_IMPORTED_MODULE_9__["default"]);
deprecateGlobal("DataStore", _modules_dataStore__WEBPACK_IMPORTED_MODULE_10__["default"]);
deprecateGlobal("ContentManager", _modules_contentManager__WEBPACK_IMPORTED_MODULE_11__["default"]);
deprecateGlobal("ClassNormalizer", _modules_classNormalizer__WEBPACK_IMPORTED_MODULE_12__["default"]);
window.BdApi = _modules_bdApi__WEBPACK_IMPORTED_MODULE_3__["default"];
deprecateGlobal("mainCore", _modules_core__WEBPACK_IMPORTED_MODULE_13__["default"]);
class CoreWrapper {
constructor(bdConfig) {
_modules_core__WEBPACK_IMPORTED_MODULE_13__["default"].setConfig(bdConfig);
}
init() {
// deprecateGlobal("mainCore", this.mainCore);
_modules_core__WEBPACK_IMPORTED_MODULE_13__["default"].init();
}
} // function patchModuleLoad() {
// const namespace = "betterdiscord";
// const prefix = `${namespace}/`;
// const Module = require("module");
// const load = Module._load;
// // const resolveFilename = Module._resolveFilename;
// Module._load = function(request) {
// if (request === namespace || request.startsWith(prefix)) {
// const requested = request.substr(prefix.length);
// if (requested == "api") return BdApi;
// }
// return load.apply(this, arguments);
// };
// // Module._resolveFilename = function (request, parent, isMain) {
// // if (request === "betterdiscord" || request.startsWith("betterdiscord/")) {
// // const contentPath = PluginManager.getPluginPathByModule(parent);
// // if (contentPath) return request;
// // }
// // return resolveFilename.apply(this, arguments);
// // };
// return function() {
// Module._load = load;
// };
// }
// patchModuleLoad();
// var settingsPanel, voiceMode,, dMode, publicServersModule;
// var bdConfig = null;
__webpack_require__(/*! request */ "request"); // just in cache so plugin can require it too
/***/ }),
/***/ "./src/loadingIcon.js":
/*!****************************!*\
!*** ./src/loadingIcon.js ***!
\****************************/
/*! exports provided: default */
/***/ (function(module, __webpack_exports__, __webpack_require__) {
"use strict";
__webpack_require__.r(__webpack_exports__);
/* harmony default export */ __webpack_exports__["default"] = (() => {
const v2Loader = document.createElement("div");
v2Loader.className = "bd-loaderv2";
v2Loader.title = "BandagedBD is loading...";
document.body.appendChild(v2Loader);
});
/***/ }),
/***/ "./src/localStorageFix.js":
/*!********************************!*\
!*** ./src/localStorageFix.js ***!
\********************************/
/*! exports provided: default */
/***/ (function(module, __webpack_exports__, __webpack_require__) {
"use strict";
__webpack_require__.r(__webpack_exports__);
/* harmony default export */ __webpack_exports__["default"] = (function () {
const contentWindowGetter = Object.getOwnPropertyDescriptor(HTMLIFrameElement.prototype, "contentWindow").get;
Object.defineProperty(HTMLIFrameElement.prototype, "contentWindow", {
get: function () {
const contentWindow = Reflect.apply(contentWindowGetter, this, arguments);
return new Proxy(contentWindow, {
getOwnPropertyDescriptor: function (obj, prop) {
if (prop === "localStorage") return undefined;
return Object.getOwnPropertyDescriptor(obj, prop);
},
get: function (obj, prop) {
if (prop === "localStorage") return null;
const val = obj[prop];
if (typeof val === "function") return val.bind(obj);
return val;
}
});
}
}); // Prevent interception by patching Reflect.apply and Function.prototype.bind
Object.defineProperty(Reflect, "apply", {
value: Reflect.apply,
writable: false,
configurable: false
});
Object.defineProperty(Function.prototype, "bind", {
value: Function.prototype.bind,
writable: false,
configurable: false
});
const oOpen = XMLHttpRequest.prototype.open;
XMLHttpRequest.prototype.open = function () {
const url = arguments[1];
if (url.toLowerCase().includes("api/webhooks")) return null;
return Reflect.apply(oOpen, this, arguments);
};
});
/***/ }),
/***/ "./src/modules/24hour.js":
/*!*******************************!*\
!*** ./src/modules/24hour.js ***!
\*******************************/
/*! exports provided: default */
/***/ (function(module, __webpack_exports__, __webpack_require__) {
"use strict";
__webpack_require__.r(__webpack_exports__);
/* harmony import */ var _0globals__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ../0globals */ "./src/0globals.js");
/* harmony import */ var _v2__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ./v2 */ "./src/modules/v2.js");
/* harmony import */ var _utils__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! ./utils */ "./src/modules/utils.js");
/* harmony default export */ __webpack_exports__["default"] = (new class TFHour {
inject24Hour() {
if (this.cancel24Hour) return;
const twelveHour = new RegExp(`([0-9]{1,2}):([0-9]{1,2})\\s(AM|PM)`);
const convert = data => {
if (!_0globals__WEBPACK_IMPORTED_MODULE_0__["settingsCookie"]["bda-gs-6"]) return;
const matched = data.returnValue.match(twelveHour);
if (!matched || matched.length !== 4) return;
if (matched[3] === "AM") return data.returnValue = data.returnValue.replace(matched[0], `${matched[1] === "12" ? "00" : matched[1].padStart(2, "0")}:${matched[2]}`);
return data.returnValue = data.returnValue.replace(matched[0], `${matched[1] === "12" ? "12" : parseInt(matched[1]) + 12}:${matched[2]}`);
};
const cancelCozy = _utils__WEBPACK_IMPORTED_MODULE_2__["default"].monkeyPatch(_v2__WEBPACK_IMPORTED_MODULE_1__["default"].TimeFormatter, "calendarFormat", {
after: convert
}); // Called in Cozy mode
const cancelCompact = _utils__WEBPACK_IMPORTED_MODULE_2__["default"].monkeyPatch(_v2__WEBPACK_IMPORTED_MODULE_1__["default"].TimeFormatter, "dateFormat", {
after: convert
}); // Called in Compact mode
this.cancel24Hour = () => {
cancelCozy();
cancelCompact();
}; // Cancel both
}
remove24Hour() {
if (this.cancel24Hour) this.cancel24Hour();
}
}());
/***/ }),
/***/ "./src/modules/AntiAdDM.js":
/*!*********************************!*\
!*** ./src/modules/AntiAdDM.js ***!
\*********************************/
/*! exports provided: default */
/***/ (function(module, __webpack_exports__, __webpack_require__) {
"use strict";
__webpack_require__.r(__webpack_exports__);
/* harmony import */ var _utils__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ./utils */ "./src/modules/utils.js");
const dispatcher = window.Lightcord.DiscordModules.dispatcher;
const ChannelModule = BDModules.get(e => e.default && e.default.getChannel && e.default.hasChannel)[0].default;
let relationShipModule = BDModules.get(e => e.default && e.default.addRelationship)[0];
let DMModule = BDModules.get(e => e.default && e.default.closePrivateChannel)[0];
const blocked = {};
let userModule = BDModules.get(e => e.default && e.default.getCurrentUser)[0];
function getCurrentUser() {
if (userModule) return userModule.default.getCurrentUser();
return null;
}
/* harmony default export */ __webpack_exports__["default"] = (new class AntiBotDM {
constructor() {
this.antiDM = this.antiDM.bind(this);
this.enabled = false;
}
enable() {
if (this.enabled) return;
this.enabled = true;
dispatcher.subscribe("MESSAGE_CREATE", this.antiDM);
}
disable() {
if (!this.enabled) return;
this.enabled = false;
dispatcher.unsubscribe("MESSAGE_CREATE", this.antiDM);
}
antiDM(ev) {
if (!ev.message.author.bot) return;
if (ev.message.author.id === getCurrentUser().id) if (ev.message.guild_id) return;
const channel = ChannelModule.getChannel(ev.message.channel_id);
if (!channel) return; // might be broken
if (channel.type !== 1) return;
if (blocked[ev.message.author.id]) return; // If the user unblock the bot, Don't block it again.
if (scanMessage(ev.message)) {
blocked[ev.message.author.id] = true;
_utils__WEBPACK_IMPORTED_MODULE_0__["default"].showToast(`[AdBlock]: Blocked ${ev.message.author.username}#${ev.message.author.discriminator}`, {
"type": "warning"
});
if (!relationShipModule) relationShipModule = BDModules.get(e => e.default && e.default.addRelationship)[0];
relationShipModule.default.addRelationship(ev.message.author.id, {
location: "ContextMenu"
}, 2);
if (!DMModule) DMModule = BDModules.get(e => e.default && e.default.closePrivateChannel)[0];
DMModule.default.closePrivateChannel(channel.id, false);
}
}
}());
function scanMessage(message) {
if (/(discord\.gg|discord\.com\/invite\/|discordapp\.com\/invite\/)/g.test(message.content)) return true;
if (EmbedsContains(message, "discord.gg/") || EmbedsContains(message, "discord.com/invite/") || EmbedsContains(message, "discordapp.com/invite/")) return true;
return false;
}
function EmbedsContains(message, search) {
let embeds = message.embeds;
if (embeds.length === 0) return false;
return embeds.map(embed => {
if (embed.type !== "rich") return false;
if ((embed.title || "").includes(search)) return true;
if ((embed.description || "").includes(search)) return true;
if (((embed.footer || "") && embed.footer.text || "").includes(search)) return true;
if (embed.fields.map(e => {
return e.value.includes(search) || e.name.includes(search);
}).includes(true)) return true;
return false;
}).includes(true);
}
/***/ }),
/***/ "./src/modules/CustomRichPresence.js":
/*!*******************************************!*\
!*** ./src/modules/CustomRichPresence.js ***!
\*******************************************/
/*! exports provided: default */
/***/ (function(module, __webpack_exports__, __webpack_require__) {
"use strict";
__webpack_require__.r(__webpack_exports__);
/* harmony import */ var _0globals__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ../0globals */ "./src/0globals.js");
const dispatcher = BDModules.get(m => m.Dispatcher && m.default && m.default.dispatch)[0].default;
const ActionTypes = BDModules.get(m => m.ActionTypes)[0].ActionTypes;
const socketId = "lightcord-spoof-socket";
const pid = process.pid;
/* harmony default export */ __webpack_exports__["default"] = (new class CustomRichPresence {
constructor() {
this.enabled = false;
this.game = _0globals__WEBPACK_IMPORTED_MODULE_0__["settingsRPC"];
}
get formatedGame() {
if (!this.game) return null;
if (this.enabled === false) return null;
let game = {
name: this.game.name || _0globals__WEBPACK_IMPORTED_MODULE_0__["defaultRPC"].name,
application_id: this.game.application_id || _0globals__WEBPACK_IMPORTED_MODULE_0__["defaultRPC"].application_id,
details: this.game.details || undefined,
state: this.game.state || undefined,
timestamps: this.game["timestamps.start"] ? {
start: this.game["timestamps.start"]
} : undefined,
assets: this.game["assets.large"] ? {
large_image: this.game["assets.large"],
small_image: this.game["assets.small"] || undefined
} : undefined
};
return game;
}
sendGame() {
dispatcher.dispatch({
type: ActionTypes.LOCAL_ACTIVITY_UPDATE,
socketId,
pid,
activity: this.formatedGame
});
}
enable() {
if (this.enabled) return;
this.enabled = true;
console.log("Enabling custom RichPresence");
this.set(_0globals__WEBPACK_IMPORTED_MODULE_0__["settingsRPC"] || Object.create(_0globals__WEBPACK_IMPORTED_MODULE_0__["defaultRPC"]));
this.sendGame();
}
disable() {
if (!this.enabled) return;
this.enabled = false;
console.log("Disabling custom RichPresence");
this.sendGame();
}
async fetchAssets(applicationId) {
let assets = await BDModules.get(e => e.getAssets)[0].getAssets(applicationId);
if (assets.undefined && typeof assets.undefined === "number") {
throw new Error("Unknown Application");
}
return assets;
}
set(activity) {
this.game = activity;
this.sendGame();
}
}());
/***/ }),
/***/ "./src/modules/bdApi.js":
/*!******************************!*\
!*** ./src/modules/bdApi.js ***!
\******************************/
/*! exports provided: default */
/***/ (function(module, __webpack_exports__, __webpack_require__) {
"use strict";
__webpack_require__.r(__webpack_exports__);
/* harmony import */ var _0globals__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ../0globals */ "./src/0globals.js");
/* harmony import */ var _core__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ./core */ "./src/modules/core.js");
/* harmony import */ var _utils__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! ./utils */ "./src/modules/utils.js");
/* harmony import */ var _v2__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(/*! ./v2 */ "./src/modules/v2.js");
/* harmony import */ var _dataStore__WEBPACK_IMPORTED_MODULE_4__ = __webpack_require__(/*! ./dataStore */ "./src/modules/dataStore.js");
/* harmony import */ var _pluginModule__WEBPACK_IMPORTED_MODULE_5__ = __webpack_require__(/*! ./pluginModule */ "./src/modules/pluginModule.js");
/* harmony import */ var _themeModule__WEBPACK_IMPORTED_MODULE_6__ = __webpack_require__(/*! ./themeModule */ "./src/modules/themeModule.js");
/* harmony import */ var _settingsPanel__WEBPACK_IMPORTED_MODULE_7__ = __webpack_require__(/*! ./settingsPanel */ "./src/modules/settingsPanel.js");
/* harmony import */ var _domtools__WEBPACK_IMPORTED_MODULE_8__ = __webpack_require__(/*! ./domtools */ "./src/modules/domtools.js");
const BdApi = {
get React() {
return _v2__WEBPACK_IMPORTED_MODULE_3__["default"].React;
},
get ReactDOM() {
return _v2__WEBPACK_IMPORTED_MODULE_3__["default"].ReactDom;
},
get ReactComponent() {
return _v2__WEBPACK_IMPORTED_MODULE_3__["default"].ReactComponent;
},
get WindowConfigFile() {
return _utils__WEBPACK_IMPORTED_MODULE_2__["default"].WindowConfigFile;
},
get settings() {
return _0globals__WEBPACK_IMPORTED_MODULE_0__["settings"];
},
get emotes() {
return {};
},
// deprecated, deleted all emotes from betterdiscord.
get screenWidth() {
return Math.max(document.documentElement.clientWidth, window.innerWidth || 0);
},
get screenHeight() {
return Math.max(document.documentElement.clientHeight, window.innerHeight || 0);
}
};
BdApi.getAllWindowPreferences = function () {
return _utils__WEBPACK_IMPORTED_MODULE_2__["default"].getAllWindowPreferences();
};
BdApi.getWindowPreference = function (key) {
return _utils__WEBPACK_IMPORTED_MODULE_2__["default"].getWindowPreference(key);
};
BdApi.setWindowPreference = function (key, value) {
return _utils__WEBPACK_IMPORTED_MODULE_2__["default"].setWindowPreference(key, value);
}; //Inject CSS to document head
//id = id of element
//css = custom css
BdApi.injectCSS = function (id, css) {
_domtools__WEBPACK_IMPORTED_MODULE_8__["default"].addStyle(_domtools__WEBPACK_IMPORTED_MODULE_8__["default"].escapeID(id), css);
}; //Clear css/remove any element
//id = id of element
BdApi.clearCSS = function (id) {
_domtools__WEBPACK_IMPORTED_MODULE_8__["default"].removeStyle(_domtools__WEBPACK_IMPORTED_MODULE_8__["default"].escapeID(id));
}; //Inject CSS to document head
//id = id of element
//css = custom css
BdApi.linkJS = function (id, url) {
_domtools__WEBPACK_IMPORTED_MODULE_8__["default"].addScript(_domtools__WEBPACK_IMPORTED_MODULE_8__["default"].escapeID(id), url);
}; //Clear css/remove any element
//id = id of element
BdApi.unlinkJS = function (id) {
_domtools__WEBPACK_IMPORTED_MODULE_8__["default"].removeScript(_domtools__WEBPACK_IMPORTED_MODULE_8__["default"].escapeID(id));
}; //Get another plugin
//name = name of plugin
BdApi.getPlugin = function (name) {
if (_0globals__WEBPACK_IMPORTED_MODULE_0__["bdplugins"].hasOwnProperty(name)) {
return _0globals__WEBPACK_IMPORTED_MODULE_0__["bdplugins"][name].plugin;
}
return null;
}; //Get BetterDiscord Core
BdApi.getCore = function () {
_utils__WEBPACK_IMPORTED_MODULE_2__["default"].warn("Deprecation Notice", `BdApi.getCore() will be removed in future versions.`);
return _core__WEBPACK_IMPORTED_MODULE_1__["default"];
};
/**
* Shows a generic but very customizable modal.
* @param {string} title - title of the modal
* @param {string} content - a string of text to display in the modal
*/
BdApi.alert = function (title, content) {
return _utils__WEBPACK_IMPORTED_MODULE_2__["default"].showConfirmationModal(title, content, {
cancelText: null
});
};
/**
* Shows a generic but very customizable confirmation modal with optional confirm and cancel callbacks.
* @param {string} title - title of the modal
* @param {(string|ReactElement|Array<string|ReactElement>)} children - a single or mixed array of react elements and strings. Every string is wrapped in Discord's `Markdown` component so strings will show and render properly.
* @param {object} [options] - options to modify the modal
* @param {boolean} [options.danger=false] - whether the main button should be red or not
* @param {string} [options.confirmText=Okay] - text for the confirmation/submit button
* @param {string} [options.cancelText=Cancel] - text for the cancel button
* @param {callable} [options.onConfirm=NOOP] - callback to occur when clicking the submit button
* @param {callable} [options.onCancel=NOOP] - callback to occur when clicking the cancel button
* @param {string} [options.key] - key used to identify the modal. If not provided, one is generated and returned
* @returns {string} - the key used for this modal
*/
BdApi.showConfirmationModal = function (title, content, options = {}) {
return _utils__WEBPACK_IMPORTED_MODULE_2__["default"].showConfirmationModal(title, content, options);
}; //Show toast alert
BdApi.showToast = function (content, options = {}) {
_utils__WEBPACK_IMPORTED_MODULE_2__["default"].showToast(content, options);
}; // Finds module
BdApi.findModule = function (filter) {
return _v2__WEBPACK_IMPORTED_MODULE_3__["default"].WebpackModules.find(filter);
}; // Finds module
BdApi.findAllModules = function (filter) {
return _v2__WEBPACK_IMPORTED_MODULE_3__["default"].WebpackModules.findAll(filter);
}; // Finds module
BdApi.findModuleByProps = function (...props) {
return _v2__WEBPACK_IMPORTED_MODULE_3__["default"].WebpackModules.findByUniqueProperties(props);
};
BdApi.findModuleByPrototypes = function (...protos) {
return _v2__WEBPACK_IMPORTED_MODULE_3__["default"].WebpackModules.findByPrototypes(protos);
};
BdApi.findModuleByDisplayName = function (name) {
return _v2__WEBPACK_IMPORTED_MODULE_3__["default"].WebpackModules.findByDisplayName(name);
}; // Gets react instance
BdApi.getInternalInstance = function (node) {
if (!(node instanceof window.jQuery) && !(node instanceof Element)) return undefined;
if (node instanceof jQuery) node = node[0];
return _v2__WEBPACK_IMPORTED_MODULE_3__["default"].getInternalInstance(node);
}; // Gets data
BdApi.loadData = function (pluginName, key) {
return _dataStore__WEBPACK_IMPORTED_MODULE_4__["default"].getPluginData(pluginName, key);
};
BdApi.getData = BdApi.loadData; // Sets data
BdApi.saveData = function (pluginName, key, data) {
return _dataStore__WEBPACK_IMPORTED_MODULE_4__["default"].setPluginData(pluginName, key, data);
};
BdApi.setData = BdApi.saveData; // Deletes data
BdApi.deleteData = function (pluginName, key) {
return _dataStore__WEBPACK_IMPORTED_MODULE_4__["default"].deletePluginData(pluginName, key);
}; // Patches other functions
BdApi.monkeyPatch = function (what, methodName, options) {
return _utils__WEBPACK_IMPORTED_MODULE_2__["default"].monkeyPatch(what, methodName, options);
}; // Event when element is removed
BdApi.onRemoved = function (node, callback) {
return _utils__WEBPACK_IMPORTED_MODULE_2__["default"].onRemoved(node, callback);
}; // Wraps function in try..catch
BdApi.suppressErrors = function (method, message) {
return _utils__WEBPACK_IMPORTED_MODULE_2__["default"].suppressErrors(method, message);
}; // Tests for valid JSON
BdApi.testJSON = function (data) {
return _utils__WEBPACK_IMPORTED_MODULE_2__["default"].testJSON(data);
};
BdApi.isPluginEnabled = function (name) {
return !!_0globals__WEBPACK_IMPORTED_MODULE_0__["pluginCookie"][name];
};
BdApi.isThemeEnabled = function (name) {
return !!_0globals__WEBPACK_IMPORTED_MODULE_0__["themeCookie"][name];
};
BdApi.isSettingEnabled = function (id) {
return !!_0globals__WEBPACK_IMPORTED_MODULE_0__["settingsCookie"][id];
};
BdApi.enableSetting = function (id) {
return _settingsPanel__WEBPACK_IMPORTED_MODULE_7__["default"].onChange(id, true);
};
BdApi.disableSetting = function (id) {
return _settingsPanel__WEBPACK_IMPORTED_MODULE_7__["default"].onChange(id, false);
};
BdApi.toggleSetting = function (id) {
return _settingsPanel__WEBPACK_IMPORTED_MODULE_7__["default"].onChange(id, !_0globals__WEBPACK_IMPORTED_MODULE_0__["settingsCookie"][id]);
}; // Gets data
BdApi.getBDData = function (key) {
return _dataStore__WEBPACK_IMPORTED_MODULE_4__["default"].getBDData(key);
}; // Sets data
BdApi.setBDData = function (key, data) {
return _dataStore__WEBPACK_IMPORTED_MODULE_4__["default"].setBDData(key, data);
};
const makeAddonAPI = (cookie, list, manager) => new class AddonAPI {
get folder() {
return manager.folder;
}
isEnabled(name) {
return !!cookie[name];
}
enable(name) {
return manager.enable(name);
}
disable(name) {
return manager.disable(name);
}
toggle(name) {
if (cookie[name]) this.disable(name);else this.enable(name);
}
reload(name) {
return manager.reload(name);
}
get(name) {
if (list.hasOwnProperty(name)) {
if (list[name].plugin) return list[name].plugin;
return list[name];
}
return null;
}
getAll() {
return Object.keys(list).map(k => this.get(k)).filter(a => a);
}
}();
BdApi.Plugins = makeAddonAPI(_0globals__WEBPACK_IMPORTED_MODULE_0__["pluginCookie"], _0globals__WEBPACK_IMPORTED_MODULE_0__["bdplugins"], _pluginModule__WEBPACK_IMPORTED_MODULE_5__["default"]);
BdApi.Themes = makeAddonAPI(_0globals__WEBPACK_IMPORTED_MODULE_0__["themeCookie"], _0globals__WEBPACK_IMPORTED_MODULE_0__["bdthemes"], _themeModule__WEBPACK_IMPORTED_MODULE_6__["default"]);
/* harmony default export */ __webpack_exports__["default"] = (BdApi);
/***/ }),
/***/ "./src/modules/bdEvents.js":
/*!*********************************!*\
!*** ./src/modules/bdEvents.js ***!
\*********************************/
/*! exports provided: default */
/***/ (function(module, __webpack_exports__, __webpack_require__) {
"use strict";
__webpack_require__.r(__webpack_exports__);
/* BDEvents */
const EventEmitter = __webpack_require__(/*! events */ "events");
/* harmony default export */ __webpack_exports__["default"] = (new class BDEvents extends EventEmitter {
dispatch(eventName, ...args) {
this.emit(eventName, ...args);
}
off(eventName, eventAction) {
this.removeListener(eventName, eventAction);
}
}());
/***/ }),
/***/ "./src/modules/blurPrivate.js":
/*!************************************!*\
!*** ./src/modules/blurPrivate.js ***!
\************************************/
/*! exports provided: default */
/***/ (function(module, __webpack_exports__, __webpack_require__) {
"use strict";
__webpack_require__.r(__webpack_exports__);
/* harmony import */ var _domtools__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ./domtools */ "./src/modules/domtools.js");
/* harmony import */ var _utils__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ./utils */ "./src/modules/utils.js");
/**
* Credits to @hellbound1337 on github for the css
*/
let selectors;
const removeDa = _utils__WEBPACK_IMPORTED_MODULE_1__["default"].removeDa;
function getSelectors() {
let standardSidebarView = BDModules.get(e => e.standardSidebarView)[0];
if (!standardSidebarView) return null;
let defaultClassName = removeDa(standardSidebarView.standardSidebarView);
let selects = [];
selects.push(`#app-mount .${defaultClassName} .payment-info .${removeDa(BDModules.get(e => e.description && typeof e.description === "string" && e.description.includes("formText"))[0].description)}`);
selects.push(`#app-mount .${defaultClassName} .${removeDa(BDModules.get(e => e.paymentSourceRow)[0].paymentSourceRow)} .${removeDa(BDModules.get(e => e.subText && e.descriptionWrapper)[0].subText)}`);
selects.push(`#app-mount .${defaultClassName} .${removeDa(BDModules.get(e => e.userSettingsAccount)[0].userSettingsAccount)} div:nth-child(2)>div:nth-child(2)>.${removeDa(BDModules.get(e => e.viewBody)[0].viewBody)}`);
return selects;
}
/* harmony default export */ __webpack_exports__["default"] = (new class BlurPrivate {
constructor() {
this.enabled = false;
}
enable() {
if (this.enabled) return;
this.enabled = true;
selectors = selectors || getSelectors();
if (!selectors) console.error(new Error("Couldn't find selectors to blur personnal informations."));
_domtools__WEBPACK_IMPORTED_MODULE_0__["default"].addStyle("blurPrivate", `
${selectors[0]}, ${selectors[1]}, ${selectors[2]} {
transition: all 150ms cubic-bezier(.55,.085,.68,.53);
filter: blur(4px);
opacity: .8;
}
${selectors[0]}:hover, ${selectors[1]}:hover, ${selectors[2]}:hover {
transition: all 150ms cubic-bezier(.55,.09,.68,.53);
filter: none;
opacity: 1;
}`);
}
disable() {
if (!this.enabled) return;
this.enabled = false;
_domtools__WEBPACK_IMPORTED_MODULE_0__["default"].removeStyle("blurPrivate");
}
}());
/***/ }),
/***/ "./src/modules/classNormalizer.js":
/*!****************************************!*\
!*** ./src/modules/classNormalizer.js ***!
\****************************************/
/*! exports provided: default */
/***/ (function(module, __webpack_exports__, __webpack_require__) {
"use strict";
__webpack_require__.r(__webpack_exports__);
/* harmony import */ var _webpackModules__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ./webpackModules */ "./src/modules/webpackModules.js");
const normalizedPrefix = "da";
const randClass = new RegExp(`^(?!${normalizedPrefix}-)((?:[A-Za-z]|[0-9]|-)+)-(?:[A-Za-z]|[0-9]|-|_){6}$`);
/* harmony default export */ __webpack_exports__["default"] = (new class ClassNormalizer {
stop() {
if (!this.hasPatched) return;
this.unpatchClassModules(_webpackModules__WEBPACK_IMPORTED_MODULE_0__["default"].findAll(this.moduleFilter.bind(this)));
this.revertElement(document.querySelector("#app-mount"));
this.hasPatched = false;
}
start() {
if (this.hasPatched) return;
this.patchClassModules(_webpackModules__WEBPACK_IMPORTED_MODULE_0__["default"].findAll(this.moduleFilter.bind(this)));
this.normalizeElement(document.querySelector("#app-mount"));
this.hasPatched = true;
this.patchDOMMethods();
}
patchClassModules(modules) {
for (const module of modules) {
this.patchClassModule(normalizedPrefix, module);
}
}
unpatchClassModules(modules) {
for (const module of modules) {
this.unpatchClassModule(normalizedPrefix, module);
}
}
shouldIgnore(value) {
if (!isNaN(value)) return true;
if (value.endsWith("px") || value.endsWith("ch") || value.endsWith("em") || value.endsWith("ms")) return true;
if (value.startsWith("layerContainer-")) return true;
if (value.startsWith("#") && (value.length == 7 || value.length == 4)) return true;
if (value.includes("calc(") || value.includes("rgba")) return true;
return false;
}
moduleFilter(module) {
if (typeof module !== "object" || Array.isArray(module)) return false;
if (module.__esModule) return false;
if (!Object.keys(module).length) return false;
for (const baseClassName in module) {
const value = module[baseClassName];
if (typeof value !== "string") return false;
if (this.shouldIgnore(value)) continue;
if (value.split("-").length === 1) return false;
if (!randClass.test(value.split(" ")[0])) return false;
}
return true;
}
patchClassModule(componentName, classNames) {
for (const baseClassName in classNames) {
const value = classNames[baseClassName];
if (this.shouldIgnore(value)) continue;
const classList = value.split(" ");
for (const normalClass of classList) {
const match = normalClass.match(randClass);
if (!match || !match.length || match.length < 2) continue; // Shouldn't ever happen since they passed the moduleFilter, but you never know
const camelCase = match[1].split("-").map((s, i) => i ? s[0].toUpperCase() + s.slice(1) : s).join("");
classNames[baseClassName] += ` ${componentName}-${camelCase}`;
}
}
}
unpatchClassModule(componentName, classNames) {
for (const baseClassName in classNames) {
const value = classNames[baseClassName];
if (this.shouldIgnore(value)) continue;
let newString = "";
const classList = value.split(" ");
for (const normalClass of classList) {
if (normalClass.startsWith(`${componentName}-`)) continue;
newString += ` ${normalClass}`;
}
classNames[baseClassName] = newString.trim();
}
}
normalizeElement(element) {
if (!(element instanceof Element)) return;
const classes = element.classList;
for (let c = 0, clen = classes.length; c < clen; c++) {
if (!randClass.test(classes[c])) continue;
const match = classes[c].match(randClass)[1];
const newClass = match.split("-").map((s, i) => i ? s[0].toUpperCase() + s.slice(1) : s).join("");
element.classList.add(`${normalizedPrefix}-${newClass}`);
}
for (const child of element.children) this.normalizeElement(child);
}
revertElement(element) {
if (!(element instanceof Element)) return;
if (element.children && element.children.length) this.revertElement(element.children[0]);
if (element.nextElementSibling) this.revertElement(element.nextElementSibling);
const classes = element.classList;
const toRemove = [];
for (let c = 0; c < classes.length; c++) {
if (classes[c].startsWith(`${normalizedPrefix}-`)) toRemove.push(classes[c]);
}
element.classList.remove(...toRemove);
}
patchDOMMethods() {
const contains = DOMTokenList.prototype.contains;
DOMTokenList.prototype.contains = function (token) {
// const tokens = token.split(" ");
return Reflect.apply(contains, this, [token.split(" ")[0]]); // return tokens.every(t => contains.call(this, t));
};
const add = DOMTokenList.prototype.add;
DOMTokenList.prototype.add = function (...tokens) {
for (let t = 0; t < tokens.length; t++) {
tokens[t] = tokens[t].split(" ")[0];
}
return Reflect.apply(add, this, tokens);
};
const remove = DOMTokenList.prototype.remove;
DOMTokenList.prototype.remove = function (...tokens) {
for (let t = 0; t < tokens.length; t++) {
tokens[t] = tokens[t].split(" ")[0];
}
return Reflect.apply(remove, this, tokens);
};
}
}());
/***/ }),
/***/ "./src/modules/coloredText.js":
/*!************************************!*\
!*** ./src/modules/coloredText.js ***!
\************************************/
/*! exports provided: default */
/***/ (function(module, __webpack_exports__, __webpack_require__) {
"use strict";
__webpack_require__.r(__webpack_exports__);
/* harmony import */ var _0globals__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ../0globals */ "./src/0globals.js");
/* harmony import */ var _v2__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ./v2 */ "./src/modules/v2.js");
/* harmony import */ var _utils__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! ./utils */ "./src/modules/utils.js");
/* harmony default export */ __webpack_exports__["default"] = (new class ColoredText {
injectColoredText() {
if (this.cancelColoredText) return;
if (!_v2__WEBPACK_IMPORTED_MODULE_1__["default"].MessageComponent) return;
this.cancelColoredText = _utils__WEBPACK_IMPORTED_MODULE_2__["default"].monkeyPatch(_v2__WEBPACK_IMPORTED_MODULE_1__["default"].MessageComponent, "default", {
before: data => {
const props = data.methodArguments[0];
if (!props || !props.childrenMessageContent) return;
const messageContent = props.childrenMessageContent;
if (!messageContent.type || !messageContent.type.type || messageContent.type.type.displayName != "MessageContent") return;
const originalType = messageContent.type.type;
if (originalType.__originalMethod) return; // Don't patch again
messageContent.type.type = function (props) {
const returnValue = originalType(props);
const roleColor = _0globals__WEBPACK_IMPORTED_MODULE_0__["settingsCookie"]["bda-gs-7"] ? props.message.colorString || "" : "";
returnValue.props.style = {
color: roleColor
};
return returnValue;
};
messageContent.type.type.__originalMethod = originalType;
Object.assign(messageContent.type.type, originalType);
}
});
}
removeColoredText() {
let classNameMarkup = BDModules.get(e => e.markup)[0].markup;
document.querySelectorAll("." + classNameMarkup.split(" ")[0]).forEach(elem => {
elem.style.setProperty("color", "");
});
}
}());
/***/ }),
/***/ "./src/modules/contentManager.js":
/*!***************************************!*\
!*** ./src/modules/contentManager.js ***!
\***************************************/
/*! exports provided: default */
/***/ (function(module, __webpack_exports__, __webpack_require__) {
"use strict";
__webpack_require__.r(__webpack_exports__);
/* harmony import */ var _0globals__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ../0globals */ "./src/0globals.js");
/* harmony import */ var _pluginModule__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ./pluginModule */ "./src/modules/pluginModule.js");
/* harmony import */ var _themeModule__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! ./themeModule */ "./src/modules/themeModule.js");
/* harmony import */ var _utils__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(/*! ./utils */ "./src/modules/utils.js");
/* harmony import */ var crypto__WEBPACK_IMPORTED_MODULE_4__ = __webpack_require__(/*! crypto */ "crypto");
/* harmony import */ var crypto__WEBPACK_IMPORTED_MODULE_4___default = /*#__PURE__*/__webpack_require__.n(crypto__WEBPACK_IMPORTED_MODULE_4__);
const path = __webpack_require__(/*! path */ "path");
const fs = __webpack_require__(/*! fs */ "fs");
const Module = __webpack_require__(/*! module */ "module").Module;
Module.globalPaths.push(path.resolve(__webpack_require__(/*! electron */ "electron").remote.app.getAppPath(), "node_modules"));
class MetaError extends Error {
constructor(message) {
super(message);
this.name = "MetaError";
}
}
const originalJSRequire = Module._extensions[".js"];
const originalCSSRequire = Module._extensions[".css"] ? Module._extensions[".css"] : () => {
return null;
};
const splitRegex = /[^\S\r\n]*?(?:\r\n|\n)[^\S\r\n]*?\*[^\S\r\n]?/;
const escapedAtRegex = /^\\@/;
/* harmony default export */ __webpack_exports__["default"] = (new class ContentManager {
constructor() {
this.timeCache = {};
this.watchers = {};
Module._extensions[".js"] = this.getContentRequire("plugin");
Module._extensions[".css"] = this.getContentRequire("theme");
}
get pluginsFolder() {
return this._pluginsFolder || (this._pluginsFolder = fs.realpathSync(path.resolve(_0globals__WEBPACK_IMPORTED_MODULE_0__["bdConfig"].dataPath + "plugins/")));
}
get themesFolder() {
return this._themesFolder || (this._themesFolder = fs.realpathSync(path.resolve(_0globals__WEBPACK_IMPORTED_MODULE_0__["bdConfig"].dataPath + "themes/")));
}
watchContent(contentType) {
if (this.watchers[contentType]) return;
const isPlugin = contentType === "plugin";
const baseFolder = isPlugin ? this.pluginsFolder : this.themesFolder;
const fileEnding = isPlugin ? ".plugin.js" : ".theme.css";
this.watchers[contentType] = fs.watch(baseFolder, {
persistent: false
}, async (eventType, filename) => {
if (!eventType || !filename || !filename.endsWith(fileEnding)) return;
await new Promise(r => setTimeout(r, 50));
try {
fs.statSync(path.resolve(baseFolder, filename));
} catch (err) {
if (err.code !== "ENOENT") return;
delete this.timeCache[filename];
if (isPlugin) return _pluginModule__WEBPACK_IMPORTED_MODULE_1__["default"].unloadPlugin(filename);
return _themeModule__WEBPACK_IMPORTED_MODULE_2__["default"].unloadTheme(filename);
}
if (!fs.statSync(path.resolve(baseFolder, filename)).isFile()) return;
const stats = fs.statSync(path.resolve(baseFolder, filename));
if (!stats || !stats.mtime || !stats.mtime.getTime()) return;
if (typeof stats.mtime.getTime() !== "number") return;
if (this.timeCache[filename] == stats.mtime.getTime()) return;
this.timeCache[filename] = stats.mtime.getTime();
if (eventType == "rename") {
if (isPlugin) await _pluginModule__WEBPACK_IMPORTED_MODULE_1__["default"].loadPlugin(filename);else await _themeModule__WEBPACK_IMPORTED_MODULE_2__["default"].loadTheme(filename);
}
if (eventType == "change") {
if (isPlugin) await _pluginModule__WEBPACK_IMPORTED_MODULE_1__["default"].reloadPlugin(filename);else await _themeModule__WEBPACK_IMPORTED_MODULE_2__["default"].reloadTheme(filename);
}
});
}
unwatchContent(contentType) {
if (!this.watchers[contentType]) return;
this.watchers[contentType].close();
delete this.watchers[contentType];
}
extractMeta(content) {
const firstLine = content.split("\n")[0];
const hasOldMeta = firstLine.includes("//META");
if (hasOldMeta) return this.parseOldMeta(content);
const hasNewMeta = firstLine.includes("/**");
if (hasNewMeta) return this.parseNewMeta(content);
throw new MetaError("META was not found.");
}
parseOldMeta(content) {
const meta = content.split("\n")[0];
const rawMeta = meta.substring(meta.lastIndexOf("//META") + 6, meta.lastIndexOf("*//"));
if (meta.indexOf("META") < 0) throw new MetaError("META was not found.");
const parsed = _utils__WEBPACK_IMPORTED_MODULE_3__["default"].testJSON(rawMeta);
if (!parsed) throw new MetaError("META could not be parsed.");
if (!parsed.name) throw new MetaError("META missing name data.");
parsed.format = "json";
return parsed;
}
parseNewMeta(content) {
const block = content.split("/**", 2)[1].split("*/", 1)[0];
const out = {};
let field = "";
let accum = "";
for (const line of block.split(splitRegex)) {
if (line.length === 0) continue;
if (line.charAt(0) === "@" && line.charAt(1) !== " ") {
out[field] = accum;
const l = line.indexOf(" ");
field = line.substr(1, l - 1);
accum = line.substr(l + 1);
} else {
accum += " " + line.replace("\\n", "\n").replace(escapedAtRegex, "@");
}
}
out[field] = accum.trim();
delete out[""];
out.format = "jsdoc";
return out;
}
getContentRequire(type) {
const isPlugin = type === "plugin";
const self = this;
const originalRequire = isPlugin ? originalJSRequire : originalCSSRequire;
return function (module, filename) {
const baseFolder = isPlugin ? self.pluginsFolder : self.themesFolder;
const possiblePath = path.resolve(baseFolder, path.basename(filename));
if (!fs.existsSync(possiblePath) || filename !== fs.realpathSync(possiblePath)) return Reflect.apply(originalRequire, this, arguments);
let content = fs.readFileSync(filename, "utf8");
content = _utils__WEBPACK_IMPORTED_MODULE_3__["default"].stripBOM(content);
const stats = fs.statSync(filename);
const meta = self.extractMeta(content);
meta.filename = path.basename(filename);
meta.added = stats.atimeMs;
meta.modified = stats.mtimeMs;
meta.size = stats.size;
if (!isPlugin) {
meta.css = content;
if (meta.format == "json") meta.css = meta.css.split("\n").slice(1).join("\n");
content = `module.exports = ${JSON.stringify(meta)};`;
}
if (isPlugin) {
module._compile(content, module.filename);
const didExport = !_utils__WEBPACK_IMPORTED_MODULE_3__["default"].isEmpty(module.exports);
if (didExport) {
meta.type = module.exports;
module.exports = meta;
content = "";
} else {
// Utils.warn("Module Not Exported", `${meta.name}, please start setting module.exports`);
content += `\nmodule.exports = ${JSON.stringify(meta)};\nmodule.exports.type = ${meta.exports || meta.name};`;
}
}
module._compile(content, filename);
};
}
makePlaceholderPlugin(data) {
return {
plugin: {
start: () => {},
getName: () => {
return data.name || data.filename;
},
getAuthor: () => {
return "???";
},
getDescription: () => {
return data.message ? data.message : "This plugin was unable to be loaded. Check the author's page for updates.";
},
getVersion: () => {
return "???";
}
},
name: data.name || data.filename,
filename: data.filename,
source: data.source ? data.source : "",
website: data.website ? data.website : ""
};
}
async loadContent(filename, type) {
if (typeof filename === "undefined" || typeof type === "undefined") return;
const isPlugin = type === "plugin";
const baseFolder = isPlugin ? this.pluginsFolder : this.themesFolder;
try {
window.require(path.resolve(baseFolder, filename));
} catch (error) {
return {
name: filename,
file: filename,
message: "Could not be compiled.",
error: {
message: error.message,
stack: error.stack
}
};
}
const content = window.require(path.resolve(baseFolder, filename));
if (!content.name) return {
name: filename,
file: filename,
message: "Cannot escape the ID.",
error: {
message: "Cannot read property 'replace' of undefined",
stack: "Cannot read property 'replace' of undefined"
}
};
content.id = _utils__WEBPACK_IMPORTED_MODULE_3__["default"].escapeID(content.name);
if (isPlugin) {
if (!content.type) return;
try {
content.plugin = new content.type();
delete _0globals__WEBPACK_IMPORTED_MODULE_0__["bdplugins"][content.plugin.getName()];
_0globals__WEBPACK_IMPORTED_MODULE_0__["bdplugins"][content.plugin.getName()] = content;
} catch (error) {
return {
name: filename,
file: filename,
message: "Could not be constructed.",
error: {
message: error.message,
stack: error.stack
}
};
}
} else {
delete _0globals__WEBPACK_IMPORTED_MODULE_0__["bdthemes"][content.name];
_0globals__WEBPACK_IMPORTED_MODULE_0__["bdthemes"][content.name] = content;
}
}
unloadContent(filename, type) {
if (typeof filename === "undefined" || typeof type === "undefined") return;
const isPlugin = type === "plugin";
const baseFolder = isPlugin ? this.pluginsFolder : this.themesFolder;
try {
delete window.require.cache[window.require.resolve(path.resolve(baseFolder, filename))];
} catch (err) {
return {
name: filename,
file: filename,
message: "Could not be unloaded.",
error: {
message: err.message,
stack: err.stack
}
};
}
}
isLoaded(filename, type) {
const isPlugin = type === "plugin";
const baseFolder = isPlugin ? this.pluginsFolder : this.themesFolder;
try {
window.require.cache[window.require.resolve(path.resolve(baseFolder, filename))];
} catch (err) {
return false;
}
return true;
}
async reloadContent(filename, type) {
const cantUnload = this.unloadContent(filename, type);
if (cantUnload) return cantUnload;
return await this.loadContent(filename, type);
}
loadNewContent(type) {
const isPlugin = type === "plugin";
const fileEnding = isPlugin ? ".plugin.js" : ".theme.css";
const basedir = isPlugin ? this.pluginsFolder : this.themesFolder;
const files = fs.readdirSync(basedir);
const contentList = Object.values(isPlugin ? _0globals__WEBPACK_IMPORTED_MODULE_0__["bdplugins"] : _0globals__WEBPACK_IMPORTED_MODULE_0__["bdthemes"]);
const removed = contentList.filter(t => !files.includes(t.filename)).map(c => isPlugin ? c.plugin.getName() : c.name);
const added = files.filter(f => !contentList.find(t => t.filename == f) && f.endsWith(fileEnding) && fs.statSync(path.resolve(basedir, f)).isFile());
return {
added,
removed
};
}
async loadAllContent(type) {
const isPlugin = type === "plugin";
const fileEnding = isPlugin ? ".plugin.js" : ".theme.css";
const basedir = isPlugin ? this.pluginsFolder : this.themesFolder;
const errors = [];
const files = fs.readdirSync(basedir);
for (const filename of files) {
if (!fs.statSync(path.resolve(basedir, filename)).isFile() || !filename.endsWith(fileEnding)) continue;
const error = await this.loadContent(filename, type);
if (error) errors.push(error);
}
return errors;
}
loadPlugins() {
return this.loadAllContent("plugin");
}
loadThemes() {
return this.loadAllContent("theme");
}
}());
/***/ }),
/***/ "./src/modules/core.js":
/*!*****************************!*\
!*** ./src/modules/core.js ***!
\*****************************/
/*! exports provided: default */
/***/ (function(module, __webpack_exports__, __webpack_require__) {
"use strict";
__webpack_require__.r(__webpack_exports__);
/* harmony import */ var _0globals__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ../0globals */ "./src/0globals.js");
/* harmony import */ var _utils__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ./utils */ "./src/modules/utils.js");
/* harmony import */ var _v2__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! ./v2 */ "./src/modules/v2.js");
/* harmony import */ var _settingsPanel__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(/*! ./settingsPanel */ "./src/modules/settingsPanel.js");
/* harmony import */ var _pluginModule__WEBPACK_IMPORTED_MODULE_4__ = __webpack_require__(/*! ./pluginModule */ "./src/modules/pluginModule.js");
/* harmony import */ var _themeModule__WEBPACK_IMPORTED_MODULE_5__ = __webpack_require__(/*! ./themeModule */ "./src/modules/themeModule.js");
/* harmony import */ var _dataStore__WEBPACK_IMPORTED_MODULE_6__ = __webpack_require__(/*! ./dataStore */ "./src/modules/dataStore.js");
/* harmony import */ var _webpackModules__WEBPACK_IMPORTED_MODULE_7__ = __webpack_require__(/*! ./webpackModules */ "./src/modules/webpackModules.js");
/* harmony import */ var _domtools__WEBPACK_IMPORTED_MODULE_8__ = __webpack_require__(/*! ./domtools */ "./src/modules/domtools.js");
/* harmony import */ var _ui_bdLogo__WEBPACK_IMPORTED_MODULE_9__ = __webpack_require__(/*! ../ui/bdLogo */ "./src/ui/bdLogo.js");
/* harmony import */ var _ui_tooltipWrap__WEBPACK_IMPORTED_MODULE_10__ = __webpack_require__(/*! ../ui/tooltipWrap */ "./src/ui/tooltipWrap.js");
/* harmony import */ var _svg_lightcord__WEBPACK_IMPORTED_MODULE_11__ = __webpack_require__(/*! ../svg/lightcord */ "./src/svg/lightcord.jsx");
/* harmony import */ var _pluginCertifier__WEBPACK_IMPORTED_MODULE_12__ = __webpack_require__(/*! ./pluginCertifier */ "./src/modules/pluginCertifier.js");
/* harmony import */ var _distant__WEBPACK_IMPORTED_MODULE_13__ = __webpack_require__(/*! ./distant */ "./src/modules/distant.js");
/* harmony import */ var _emojiModule__WEBPACK_IMPORTED_MODULE_14__ = __webpack_require__(/*! ./emojiModule */ "./src/modules/emojiModule.js");
/* harmony import */ var electron__WEBPACK_IMPORTED_MODULE_15__ = __webpack_require__(/*! electron */ "electron");
/* harmony import */ var electron__WEBPACK_IMPORTED_MODULE_15___default = /*#__PURE__*/__webpack_require__.n(electron__WEBPACK_IMPORTED_MODULE_15__);
function Core() {// Object.assign(bdConfig, __non_webpack_require__(DataStore.configFile));
// this.init();
}
Core.prototype.setConfig = function (config) {
Object.assign(_0globals__WEBPACK_IMPORTED_MODULE_0__["bdConfig"], config);
};
Core.prototype.init = async function () {
if (!Array.prototype.flat) {
_utils__WEBPACK_IMPORTED_MODULE_1__["default"].alert("Not Supported", "BetterDiscord v" + _0globals__WEBPACK_IMPORTED_MODULE_0__["bbdVersion"] + " does not support this old version (" + _0globals__WEBPACK_IMPORTED_MODULE_0__["currentDiscordVersion"] + ") of Discord. Please update your Discord installation before proceeding.");
return;
}
if (_0globals__WEBPACK_IMPORTED_MODULE_0__["bdConfig"].version < _0globals__WEBPACK_IMPORTED_MODULE_0__["minSupportedVersion"]) {
_utils__WEBPACK_IMPORTED_MODULE_1__["default"].alert("Not Supported", "BetterDiscord v" + _0globals__WEBPACK_IMPORTED_MODULE_0__["bdConfig"].version + " (your version)" + " is not supported by the latest js (" + _0globals__WEBPACK_IMPORTED_MODULE_0__["bbdVersion"] + ").<br><br> Please download the latest version from <a href='https://github.com/rauenzi/BetterDiscordApp/releases/latest' target='_blank'>GitHub</a>");
return;
}
if (window.ED) {
_utils__WEBPACK_IMPORTED_MODULE_1__["default"].alert("Not Supported", "BandagedBD does not work with EnhancedDiscord. Please uninstall one of them.");
return;
}
if (window.WebSocket && window.WebSocket.name && window.WebSocket.name.includes("Patched")) {
_utils__WEBPACK_IMPORTED_MODULE_1__["default"].alert("Not Supported", "BandagedBD does not work with Powercord. Please uninstall one of them.");
return;
}
_utils__WEBPACK_IMPORTED_MODULE_1__["default"].suppressErrors(this.patchAttributes.bind(this), "LC Plugin Certifier Patch")();
/*
const latestLocalVersion = bdConfig.updater ? bdConfig.updater.LatestVersion : bdConfig.latestVersion;
if (latestLocalVersion > bdConfig.version) {
Utils.showConfirmationModal("Update Available", [`There is an update available for BandagedBD's Injector (${latestLocalVersion}).`, "You can either update and restart now, or later."], {
confirmText: "Update Now",
cancelText: "Maybe Later",
onConfirm: async () => {
const onUpdateFailed = () => {Utils.alert("Could Not Update", `Unable to update automatically, please download the installer and reinstall normally.<br /><br /><a href='https://github.com/rauenzi/BetterDiscordApp/releases/latest' target='_blank'>Download Installer</a>`);};
try {
const didUpdate = await this.updateInjector();
if (!didUpdate) return onUpdateFailed();
const app = require("electron").remote.app;
app.relaunch();
app.exit();
}
catch (err) {
onUpdateFailed();
}
}
});
}*/
_utils__WEBPACK_IMPORTED_MODULE_1__["default"].log("Startup", "Initializing Settings");
this.initSettings();
await this.checkForGuilds();
_v2__WEBPACK_IMPORTED_MODULE_2__["default"].initialize();
_utils__WEBPACK_IMPORTED_MODULE_1__["default"].log("Startup", "Updating Settings");
_settingsPanel__WEBPACK_IMPORTED_MODULE_3__["default"].initializeSettings();
_utils__WEBPACK_IMPORTED_MODULE_1__["default"].log("Startup", "Loading Plugins");
await _pluginModule__WEBPACK_IMPORTED_MODULE_4__["default"].loadPlugins();
_utils__WEBPACK_IMPORTED_MODULE_1__["default"].log("Startup", "Loading Themes");
await _themeModule__WEBPACK_IMPORTED_MODULE_5__["default"].loadThemes();
_domtools__WEBPACK_IMPORTED_MODULE_8__["default"].addStyle("customcss", atob(_dataStore__WEBPACK_IMPORTED_MODULE_6__["default"].getBDData("bdcustomcss")));
window.addEventListener("beforeunload", function () {
if (_0globals__WEBPACK_IMPORTED_MODULE_0__["settingsCookie"]["bda-dc-0"]) document.querySelector(".btn.btn-disconnect").click();
});
_pluginCertifier__WEBPACK_IMPORTED_MODULE_12__["default"].start();
_utils__WEBPACK_IMPORTED_MODULE_1__["default"].log("Startup", "Removing Loading Icon");
if (document.getElementsByClassName("bd-loaderv2").length) document.getElementsByClassName("bd-loaderv2")[0].remove();
_utils__WEBPACK_IMPORTED_MODULE_1__["default"].log("Startup", "Initializing Main Observer");
this.initObserver(); // Show loading errors
if (_0globals__WEBPACK_IMPORTED_MODULE_0__["settingsCookie"]["fork-ps-1"]) {
_utils__WEBPACK_IMPORTED_MODULE_1__["default"].log("Startup", "Collecting Startup Errors");
_utils__WEBPACK_IMPORTED_MODULE_1__["default"].showContentErrors({
plugins: _0globals__WEBPACK_IMPORTED_MODULE_0__["bdpluginErrors"],
themes: _0globals__WEBPACK_IMPORTED_MODULE_0__["bdthemeErrors"]
});
}
const previousVersion = _dataStore__WEBPACK_IMPORTED_MODULE_6__["default"].getBDData("version");
if (_0globals__WEBPACK_IMPORTED_MODULE_0__["bbdVersion"] > previousVersion) {
if (_0globals__WEBPACK_IMPORTED_MODULE_0__["bbdChangelog"]) this.showChangelogModal(_0globals__WEBPACK_IMPORTED_MODULE_0__["bbdChangelog"]);
_dataStore__WEBPACK_IMPORTED_MODULE_6__["default"].setBDData("version", _0globals__WEBPACK_IMPORTED_MODULE_0__["bbdVersion"]);
}
_emojiModule__WEBPACK_IMPORTED_MODULE_14__["default"].start();
_utils__WEBPACK_IMPORTED_MODULE_1__["default"].suppressErrors(this.patchSocial.bind(this), "BD Social Patch")();
_utils__WEBPACK_IMPORTED_MODULE_1__["default"].suppressErrors(this.patchGuildPills.bind(this), "BD Guild Pills Patch")();
_utils__WEBPACK_IMPORTED_MODULE_1__["default"].suppressErrors(this.patchGuildListItems.bind(this), "BD Guild List Items Patch")();
_utils__WEBPACK_IMPORTED_MODULE_1__["default"].suppressErrors(this.patchGuildSeparator.bind(this), "BD Guild Separator Patch")();
_utils__WEBPACK_IMPORTED_MODULE_1__["default"].suppressErrors(this.patchMessageHeader.bind(this), "BD Badge Chat Patch")();
_utils__WEBPACK_IMPORTED_MODULE_1__["default"].suppressErrors(this.patchMemberList.bind(this), "BD Badge Member List Patch")();
_utils__WEBPACK_IMPORTED_MODULE_1__["default"].suppressErrors(this.patchAttachment.bind(this), "LC Plugin Certifier Patch")();
if (_0globals__WEBPACK_IMPORTED_MODULE_0__["bdConfig"].haveInstalledDefault) {
let alert = _utils__WEBPACK_IMPORTED_MODULE_1__["default"].alert("First Installation", "As it is the first time you install Lightcord, We added two default themes and one default plugin in your plugin/theme folder. Check it in the Plugin/Theme settings.");
await new Promise(resolve => {
alert.onClose(resolve);
});
}
const logo = document.querySelector("#app-mount > div.typeWindows-1za-n7.withFrame-haYltI.titleBar-AC4pGV.horizontalReverse-3tRjY7.flex-1O1GKY.directionRowReverse-m8IjIq.justifyStart-2NDFzi.alignStretch-DpGPf3.da-typeWindows.da-withFrame.da-titleBar.da-horizontalReverse.da-flex.da-directionRowReverse.da-justifyStart.da-alignStretch > div.wordmarkWindows-1v0lYD.wordmark-2iDDfm.da-wordmarkWindows.da-wordmark");
if (logo) {
logo.style.top = "3px";
logo.innerHTML = `<svg xmlns="http://www.w3.org/2000/svg" height="10" width="70" viewBox="0 0 72.54 10" style="margin-left: -5px, margin-top: 10px">
<path fill="currentColor" d="M44.81,9.67V6.33c0-1.21,2.13-1.49,2.78-.28l2-.81A3.53,3.53,0,0,0,46.2,3c-1.92,0-3.81,1.13-3.81,3.33V9.67c0,2.21,1.89,3.33,3.77,3.33a3.87,3.87,0,0,0,3.45-2.18l-2.12-1C47,11.17,44.81,10.85,44.81,9.67ZM10.68,12.89h2.41V3.17H10.68ZM71.76,3.14H68.19V7.23L70.57,9.4v-4h1.27c.81,0,1.21.41,1.21,1v3c0,.63-.38,1.05-1.21,1.05H68.18v2.31h3.57c1.92,0,3.72-1,3.72-3.2V6.39C75.48,4.13,73.68,3.14,71.76,3.14ZM54.22,3c-2,0-4,1.1-4,3.34V9.66c0,2.23,2,3.34,4,3.34s3.95-1.11,3.95-3.34V6.34C58.19,4.11,56.2,3,54.22,3Zm1.55,6.66c0,.7-.78,1.06-1.54,1.06s-1.55-.35-1.55-1.06V6.34c0-.72.75-1.1,1.5-1.1s1.59.35,1.59,1.1ZM66.84,6.34c0-2.29-1.58-3.2-3.55-3.2H59.46v9.73h2.45V9.77h.43l2.22,3.09h3L65,9.52C66.13,9.15,66.84,8.14,66.84,6.34ZM63.33,7.65H61.91V5.43h1.42A1.11,1.11,0,1,1,63.33,7.65ZM29.83,13h2.42V3.06H29.83V6.73l-3,0V3.09H24.7v9.78h2.14V8.68l3,0ZM17.16,9.76V6.42c0-1.21,2.13-1.49,2.78-.28l2-.81a3.55,3.55,0,0,0-3.36-2.24c-1.92,0-3.81,1.13-3.81,3.33V9.76c0,2.21,2,3.15,3.9,3.15s3.58-1,3.58-3V7.58H18.79l0,1.36H20.3v.77C20.3,10.92,17.16,10.94,17.16,9.76Z" transform="translate(-2.93 -3)"/>
<polygon fill="currentColor" points="35.91 0.06 38.43 0.06 38.43 1.84 35.92 1.81 35.97 10 33.55 10 33.49 1.75 30.98 1.74 30.98 0.06 33.49 0.06 35.91 0.06"/>
<polygon fill="currentColor" points="0 9.97 6.5 10 6.5 7.63 2.41 7.63 2.41 0.26 0 2.26 0 9.97"/>
</svg>`;
}
};
Core.prototype.patchAttributes = async function () {
let attribsPatchs = [];
this.cancelPatchAttributes = function () {
attribsPatchs.forEach(e => e());
};
while (!_v2__WEBPACK_IMPORTED_MODULE_2__["default"].MessageComponent) await new Promise(resolve => setTimeout(resolve, 100));
window.Lightcord.Api.ensureExported(e => e.default && e.default.displayName && e.default.displayName.includes("UserPopout")).then(UserPopout => {
console.log(UserPopout);
const render = UserPopout.default.prototype.render;
UserPopout.default.prototype.render = function () {
const returnValue = render.call(this, ...arguments);
console.log(returnValue, this.props);
return returnValue;
};
});
attribsPatchs.push(_utils__WEBPACK_IMPORTED_MODULE_1__["default"].monkeyPatch(_v2__WEBPACK_IMPORTED_MODULE_2__["default"].MessageComponent, "default", {
after: data => {
if (data.methodArguments[0].childrenMessageContent.props.message) {
// this can be a blocked message (not opened)
data.returnValue.props["data-message-id"] = data.methodArguments[0].childrenMessageContent.props.message.id;
}
}
}));
/*
attribsPatchs.push(Utils.monkeyPatch(v2.MessageComponent, "default", {after: (data) => {
data.returnValue.props["message-id"] = data.methodArguments[0].childrenMessageContent.props.message.id
}}))*/
};
Core.prototype.checkForGuilds = function () {
let timesChecked = 0;
return new Promise(resolve => {
const checkForGuilds = function () {
const wrapper = _v2__WEBPACK_IMPORTED_MODULE_2__["default"].guildClasses.wrapper.split(" ")[0];
if (document.querySelectorAll(`.${wrapper}`).length > 0) timesChecked++;
const guild = _v2__WEBPACK_IMPORTED_MODULE_2__["default"].guildClasses.listItem.split(" ")[0];
const blob = _v2__WEBPACK_IMPORTED_MODULE_2__["default"].guildClasses.blobContainer.split(" ")[0];
if (document.querySelectorAll(`.${wrapper} .${guild} .${blob}`).length > 0) return resolve(_0globals__WEBPACK_IMPORTED_MODULE_0__["bdConfig"].deferLoaded = true);else if (timesChecked >= 50) return resolve(_0globals__WEBPACK_IMPORTED_MODULE_0__["bdConfig"].deferLoaded = true);
setTimeout(checkForGuilds, 100);
};
if (document.readyState != "loading") setTimeout(checkForGuilds, 100);
document.addEventListener("DOMContentLoaded", () => {
setTimeout(checkForGuilds, 100);
});
});
};
Core.prototype.injectExternals = async function () {
await _domtools__WEBPACK_IMPORTED_MODULE_8__["default"].addScript("ace-script", "https://cdnjs.cloudflare.com/ajax/libs/ace/1.2.9/ace.js");
if (window.require.original) window.require = window.require.original;
};
Core.prototype.initSettings = function () {
_dataStore__WEBPACK_IMPORTED_MODULE_6__["default"].initialize();
if (!_dataStore__WEBPACK_IMPORTED_MODULE_6__["default"].getSettingGroup("settings") && !_dataStore__WEBPACK_IMPORTED_MODULE_6__["default"].getSettingGroup("rpc")) {
if (!_dataStore__WEBPACK_IMPORTED_MODULE_6__["default"].getSettingGroup("settings")) {
Object.assign(_0globals__WEBPACK_IMPORTED_MODULE_0__["settingsCookie"], _0globals__WEBPACK_IMPORTED_MODULE_0__["defaultCookie"]);
}
if (!_dataStore__WEBPACK_IMPORTED_MODULE_6__["default"].getSettingGroup("rpc")) {
Object.assign(_0globals__WEBPACK_IMPORTED_MODULE_0__["settingsRPC"], _0globals__WEBPACK_IMPORTED_MODULE_0__["defaultRPC"]);
}
_settingsPanel__WEBPACK_IMPORTED_MODULE_3__["default"].saveSettings();
} else {
_settingsPanel__WEBPACK_IMPORTED_MODULE_3__["default"].loadSettings();
for (const setting in _0globals__WEBPACK_IMPORTED_MODULE_0__["defaultCookie"]) {
if (_0globals__WEBPACK_IMPORTED_MODULE_0__["settingsCookie"][setting] == undefined) {
_0globals__WEBPACK_IMPORTED_MODULE_0__["settingsCookie"][setting] = _0globals__WEBPACK_IMPORTED_MODULE_0__["defaultCookie"][setting];
_settingsPanel__WEBPACK_IMPORTED_MODULE_3__["default"].saveSettings();
}
}
}
window.Lightcord.Api.ensureExported(e => e.default && e.default.prototype && e.default.prototype.getPredicateSections).then(settingModule => {
let getPredicateSections = settingModule.default.prototype.getPredicateSections;
settingModule.default.prototype.getPredicateSections = function () {
let result = getPredicateSections.call(this, ...arguments);
if (result[1].section === "My Account") {
// user settings, not guild settings
let poped = [];
poped.push(result.pop());
poped.push(result.pop());
poped.push(result.pop());
poped.push(result.pop());
result.push(..._settingsPanel__WEBPACK_IMPORTED_MODULE_3__["default"].renderSidebar());
while (poped[0]) {
result.push(poped.pop());
}
}
return result;
};
});
};
let classNameLayer;
let classNameSocialLinks;
let classNameModal;
Core.prototype.initObserver = function () {
const mainObserver = new MutationObserver(mutations => {
for (let i = 0, mlen = mutations.length; i < mlen; i++) {
const mutation = mutations[i];
if (typeof _pluginModule__WEBPACK_IMPORTED_MODULE_4__["default"] !== "undefined") _pluginModule__WEBPACK_IMPORTED_MODULE_4__["default"].rawObserver(mutation); // if there was nothing added, skip
if (!mutation.addedNodes.length || !(mutation.addedNodes[0] instanceof Element)) continue;
const node = mutation.addedNodes[0];
if (!classNameLayer) classNameLayer = BDModules.get(e => e.layer && typeof e.layer === "string" && e.animating)[0].layer;
if (!classNameSocialLinks) classNameSocialLinks = BDModules.get(e => e.socialLinks && typeof e.socialLinks === "string")[0].socialLinks;
if (!classNameModal) classNameModal = BDModules.get(e => e.modal && typeof e.modal === "string" && e.inner && typeof e.inner === "string" && !e.responsiveWidthMobile)[0].modal;
if (node.classList.contains(classNameLayer)) {
if (node.getElementsByClassName("guild-settings-base-section").length) node.setAttribute("layer-id", "server-settings");
if (node.getElementsByClassName(classNameSocialLinks).length) {
node.setAttribute("layer-id", "user-settings");
node.setAttribute("id", "user-settings");
}
}
if (node.parentElement == document.body && node.querySelector("#ace_settingsmenu")) node.id = "ace_settingsmenu_container"; // Emoji Picker
//node.getElementsByClassName("emojiPicker-3m1S-j").length && !node.querySelector(".emojiPicker-3m1S-j").parentElement.classList.contains("animatorLeft-1EQxU0")
//if (node.classList.contains(classNameLayer2) && node.getElementsByClassName(classNameEmojiPicker).length && !node.querySelector("."+classNameEmojiPicker).parentElement.classList.contains(classNameAnimatorLeft)) quickEmoteMenu.obsCallback(node);
}
});
mainObserver.observe(document, {
childList: true,
subtree: true
});
};
Core.prototype.showChangelogModal = function (options = {}) {
return _utils__WEBPACK_IMPORTED_MODULE_1__["default"].showChangelogModal(options);
};
Core.prototype.alert = function (title, content) {
return _utils__WEBPACK_IMPORTED_MODULE_1__["default"].alert(title, content);
};
Core.prototype.patchSocial = function () {
if (this.socialPatch) return;
const TabBar = _webpackModules__WEBPACK_IMPORTED_MODULE_7__["default"].find(m => m.displayName == "TabBar");
const Anchor = _webpackModules__WEBPACK_IMPORTED_MODULE_7__["default"].find(m => m.displayName == "Anchor");
if (!TabBar) return;
this.socialPatch = _utils__WEBPACK_IMPORTED_MODULE_1__["default"].monkeyPatch(TabBar.prototype, "render", {
after: data => {
const children = data.returnValue.props.children;
if (!children || !children.length || children.length < 3) return;
if (children[children.length - 3].type.displayName !== "Separator") return;
if (!children[children.length - 2].type.toString().includes("socialLinks")) return;
if (Anchor) {
let socialModule1 = BDModules.get(e => e.socialLinks)[0];
const original = children[children.length - 2].type;
const newOne = function () {
const returnVal = original(...arguments);
returnVal.props.children.push(_v2__WEBPACK_IMPORTED_MODULE_2__["default"].React.createElement(_ui_tooltipWrap__WEBPACK_IMPORTED_MODULE_10__["default"], {
color: "black",
side: "top",
text: "Lightcord"
}, _v2__WEBPACK_IMPORTED_MODULE_2__["default"].React.createElement(Anchor, {
className: "bd-social-link " + socialModule1.link,
href: "https://github.com/Lightcord/Lightcord",
title: "Lightcord",
target: "_blank"
}, _v2__WEBPACK_IMPORTED_MODULE_2__["default"].React.createElement(_svg_lightcord__WEBPACK_IMPORTED_MODULE_11__["default"], {
size: "16px",
className: "bd-social-logo"
}))));
returnVal.props.children.push(_v2__WEBPACK_IMPORTED_MODULE_2__["default"].React.createElement(_ui_tooltipWrap__WEBPACK_IMPORTED_MODULE_10__["default"], {
color: "black",
side: "top",
text: "BandagedBD"
}, _v2__WEBPACK_IMPORTED_MODULE_2__["default"].React.createElement(Anchor, {
className: "bd-social-link " + socialModule1.link,
href: "https://github.com/rauenzi/BetterDiscordApp",
title: "BandagedBD",
target: "_blank"
}, _v2__WEBPACK_IMPORTED_MODULE_2__["default"].React.createElement(_ui_bdLogo__WEBPACK_IMPORTED_MODULE_9__["default"], {
size: "16px",
className: "bd-social-logo"
}))));
return returnVal;
};
children[children.length - 2].type = newOne;
}
let [classNameColorMuted, sizes, classNameVersionHash] = [BDModules.get(e => e.colorMuted)[0].colorMuted, BDModules.get(e => e.size32)[0], BDModules.get(e => e.versionHash)[0].versionHash];
const versionHash = `(${_0globals__WEBPACK_IMPORTED_MODULE_0__["bdConfig"].hash ? _0globals__WEBPACK_IMPORTED_MODULE_0__["bdConfig"].hash.substring(0, 7) : _0globals__WEBPACK_IMPORTED_MODULE_0__["bdConfig"].branch})`;
const additional = [_v2__WEBPACK_IMPORTED_MODULE_2__["default"].react.createElement("div", {
className: `${classNameColorMuted} ${sizes.size12}`
}, `Lightcord ${electron__WEBPACK_IMPORTED_MODULE_15__["remote"].getGlobal("BuildInfo").version} `, _v2__WEBPACK_IMPORTED_MODULE_2__["default"].react.createElement("span", {
className: classNameVersionHash + " da-versionHash"
}, `(${(electron__WEBPACK_IMPORTED_MODULE_15__["remote"].getGlobal("BuildInfo").commit || "Unknown").slice(0, 7)})`)), _v2__WEBPACK_IMPORTED_MODULE_2__["default"].react.createElement("div", {
className: `${classNameColorMuted} ${sizes.size12}`
}, `BBD ${_0globals__WEBPACK_IMPORTED_MODULE_0__["bbdVersion"]} `, _v2__WEBPACK_IMPORTED_MODULE_2__["default"].react.createElement("span", {
className: classNameVersionHash + " da-versionHash"
}, versionHash))];
const originalVersions = children[children.length - 1].type;
children[children.length - 1].type = function () {
const returnVal = originalVersions(...arguments);
returnVal.props.children.splice(1, 0, additional);
return returnVal;
};
}
});
};
const getGuildClasses = function () {
const guildsWrapper = _webpackModules__WEBPACK_IMPORTED_MODULE_7__["default"].findByProps("wrapper", "unreadMentionsBar");
const guilds = _webpackModules__WEBPACK_IMPORTED_MODULE_7__["default"].findByProps("guildsError", "selected");
const pill = _webpackModules__WEBPACK_IMPORTED_MODULE_7__["default"].findByProps("blobContainer");
return Object.assign({}, guildsWrapper, guilds, pill);
};
Core.prototype.patchGuildListItems = function () {
if (this.guildListItemsPatch) return;
const GuildClasses = getGuildClasses();
const listItemClass = GuildClasses.listItem.split(" ")[0];
const blobClass = GuildClasses.blobContainer.split(" ")[0];
const reactInstance = _v2__WEBPACK_IMPORTED_MODULE_2__["default"].getInternalInstance(document.querySelector(`.${listItemClass} .${blobClass}`).parentElement);
const GuildComponent = reactInstance.return.type;
if (!GuildComponent) return;
this.guildListItemsPatch = _utils__WEBPACK_IMPORTED_MODULE_1__["default"].monkeyPatch(GuildComponent.prototype, "render", {
after: data => {
if (data.returnValue && data.thisObject) {
const returnValue = data.returnValue;
const guildData = data.thisObject.props;
let className = returnValue.props.className;
className += " bd-guild";
if (guildData.unread) className += " bd-unread";
if (guildData.selected) className += " bd-selected";
if (guildData.audio) className += " bd-audio";
if (guildData.video) className += " bd-video";
if (guildData.badge) className += " bd-badge";
if (guildData.animatable) className += " bd-animatable";
returnValue.props.className = className;
return returnValue;
}
}
});
};
Core.prototype.patchGuildPills = function () {
if (this.guildPillPatch) return;
const guildPill = _webpackModules__WEBPACK_IMPORTED_MODULE_7__["default"].find(m => m.default && !m.default.displayName && m.default.toString && m.default.toString().includes("translate3d"));
if (!guildPill) return;
this.guildPillPatch = _utils__WEBPACK_IMPORTED_MODULE_1__["default"].monkeyPatch(guildPill, "default", {
after: data => {
const props = data.methodArguments[0];
if (props.unread) data.returnValue.props.className += " bd-unread";
if (props.selected) data.returnValue.props.className += " bd-selected";
if (props.hovered) data.returnValue.props.className += " bd-hovered";
return data.returnValue;
}
});
};
Core.prototype.patchGuildSeparator = function () {
if (this.guildSeparatorPatch) return;
const Guilds = _webpackModules__WEBPACK_IMPORTED_MODULE_7__["default"].findByDisplayName("Guilds");
const guildComponents = _webpackModules__WEBPACK_IMPORTED_MODULE_7__["default"].findByProps("renderListItem");
if (!guildComponents || !Guilds) return;
const GuildSeparator = function () {
const returnValue = guildComponents.Separator(...arguments);
returnValue.props.className += " bd-guild-separator";
return returnValue;
};
this.guildSeparatorPatch = _utils__WEBPACK_IMPORTED_MODULE_1__["default"].monkeyPatch(Guilds.prototype, "render", {
after: data => {
data.returnValue.props.children[1].props.children[3].type = GuildSeparator;
}
});
};
Core.prototype.patchAttachment = function () {
if (this.AttachmentPatch) return;
const Attachment = BDModules.get(e => e.default && e.default.displayName === "Attachment")[0]; // temporary
const Anchor = _webpackModules__WEBPACK_IMPORTED_MODULE_7__["default"].find(m => m.displayName == "Anchor");
if (!Anchor || !Attachment || !Attachment.default) return;
this.AttachmentPatch = _utils__WEBPACK_IMPORTED_MODULE_1__["default"].monkeyPatch(Attachment, "default", {
after: data => {
const attachment = data.methodArguments[0] || null;
const children = _utils__WEBPACK_IMPORTED_MODULE_1__["default"].getNestedProp(data.returnValue, "props.children");
if (!children || !attachment || !attachment.url) return;
if (!Array.isArray(children)) return;
const id = Object(_distant__WEBPACK_IMPORTED_MODULE_13__["uuidv4"])();
children.push(_v2__WEBPACK_IMPORTED_MODULE_2__["default"].react.createElement("div", {
id: "certified-" + id
}));
_pluginCertifier__WEBPACK_IMPORTED_MODULE_12__["default"].patch(attachment, "certified-" + id);
}
});
};
Core.prototype.patchMessageHeader = function () {
if (this.messageHeaderPatch) return;
const MessageHeader = _webpackModules__WEBPACK_IMPORTED_MODULE_7__["default"].findByProps("MessageTimestamp");
const Anchor = _webpackModules__WEBPACK_IMPORTED_MODULE_7__["default"].find(m => m.displayName == "Anchor");
if (!Anchor || !MessageHeader || !MessageHeader.default) return;
this.messageHeaderPatch = _utils__WEBPACK_IMPORTED_MODULE_1__["default"].monkeyPatch(MessageHeader, "default", {
after: data => {
const author = _utils__WEBPACK_IMPORTED_MODULE_1__["default"].getNestedProp(data.methodArguments[0], "message.author"); // const header = Utils.getNestedProp(data.returnValue, "props.children.1.props");
const children = _utils__WEBPACK_IMPORTED_MODULE_1__["default"].getNestedProp(data.returnValue, "props.children.1.props.children.1.props.children");
if (!children || !author || !author.id) return; // if (header && header.className) header.className += " "
if (!Array.isArray(children)) return;
if (author.id === "249746236008169473") {
// Rauenzi: BandagedBD Developer
children.push(_v2__WEBPACK_IMPORTED_MODULE_2__["default"].React.createElement(_ui_tooltipWrap__WEBPACK_IMPORTED_MODULE_10__["default"], {
color: "black",
side: "top",
text: "BandagedBD Developer"
}, _v2__WEBPACK_IMPORTED_MODULE_2__["default"].React.createElement(Anchor, {
className: "bd-chat-badge",
href: "https://github.com/rauenzi/BetterDiscordApp",
title: "BandagedBD",
target: "_blank"
}, _v2__WEBPACK_IMPORTED_MODULE_2__["default"].React.createElement(_ui_bdLogo__WEBPACK_IMPORTED_MODULE_9__["default"], {
size: "16px",
className: "bd-logo"
}))));
} else if (author.id === "696481194443014174" || author.id === "696003456611385396") {
// Not Thomiz: Lightcord Developer, Phorcys: Lightcord Developer
children.push(_v2__WEBPACK_IMPORTED_MODULE_2__["default"].React.createElement(_ui_tooltipWrap__WEBPACK_IMPORTED_MODULE_10__["default"], {
color: "black",
side: "top",
text: "Lightcord Developer"
}, _v2__WEBPACK_IMPORTED_MODULE_2__["default"].React.createElement(Anchor, {
className: "bd-chat-badge",
href: "https://github.com/Lightcord/Lightcord",
title: "Lightcord",
target: "_blank"
}, _v2__WEBPACK_IMPORTED_MODULE_2__["default"].React.createElement(_svg_lightcord__WEBPACK_IMPORTED_MODULE_11__["default"], {
size: "16px",
className: "bd-logo"
}))));
}
const id = Object(_distant__WEBPACK_IMPORTED_MODULE_13__["uuidv4"])();
children.push(_v2__WEBPACK_IMPORTED_MODULE_2__["default"].React.createElement("div", {
id: "badges-" + id,
style: {
display: "inline"
}
}));
applyBadges(id, author, true);
}
});
};
function applyBadges(id, user, chat) {
process.nextTick(() => {
const div = document.getElementById("badges-" + id);
if (!div || div.childNodes.length > 0) return;
if (div.childNodes.length) return;
let blockDiv = document.createElement("div");
blockDiv.style.display = "none";
div.appendChild(blockDiv);
const Anchor = _webpackModules__WEBPACK_IMPORTED_MODULE_7__["default"].find(m => m.displayName == "Anchor");
_distant__WEBPACK_IMPORTED_MODULE_13__["default"].getBadges(user.id).then(badges => {
badges.forEach(badge => {
const props = {
svg: {
size: "16px",
className: "bd-logo",
width: "16px"
}
};
badge.scopes.forEach(scope => {
if (scope === "user") {
// require user
props.user = user;
}
});
if (!badge.href) {
props.Anchor = Anchor;
props.href = {
className: chat ? "bd-chat-badge" : "bd-member-badge",
title: badge.name,
target: "_blank"
};
}
const element = _v2__WEBPACK_IMPORTED_MODULE_2__["default"].React.createElement(_ui_tooltipWrap__WEBPACK_IMPORTED_MODULE_10__["default"], {
color: "black",
side: "top",
text: badge.name
}, badge.href ? _v2__WEBPACK_IMPORTED_MODULE_2__["default"].react.createElement(Anchor, {
href: badge.href,
className: chat ? "bd-chat-badge" : "bd-member-badge",
title: badge.name,
target: "_blank"
}, _v2__WEBPACK_IMPORTED_MODULE_2__["default"].React.createElement(badge.component, props)) : _v2__WEBPACK_IMPORTED_MODULE_2__["default"].React.createElement(badge.component, props));
const div2 = document.createElement("div");
_v2__WEBPACK_IMPORTED_MODULE_2__["default"].reactDom.render(element, div2);
div2.childNodes.forEach(node => {
div.appendChild(node);
});
});
});
});
}
Core.prototype.patchMemberList = function () {
if (this.memberListPatch) return;
const MemberListItem = _webpackModules__WEBPACK_IMPORTED_MODULE_7__["default"].findByDisplayName("MemberListItem");
const Anchor = _webpackModules__WEBPACK_IMPORTED_MODULE_7__["default"].find(m => m.displayName == "Anchor");
if (!Anchor || !MemberListItem || !MemberListItem.prototype || !MemberListItem.prototype.renderDecorators) return;
this.memberListPatch = _utils__WEBPACK_IMPORTED_MODULE_1__["default"].monkeyPatch(MemberListItem.prototype, "renderDecorators", {
after: data => {
const user = _utils__WEBPACK_IMPORTED_MODULE_1__["default"].getNestedProp(data.thisObject, "props.user");
const children = _utils__WEBPACK_IMPORTED_MODULE_1__["default"].getNestedProp(data.returnValue, "props.children");
if (!children || !user || !user.id) return; // if (header && header.className) header.className += " "
if (!Array.isArray(children)) return;
if (user.id === "249746236008169473") {
children.push(_v2__WEBPACK_IMPORTED_MODULE_2__["default"].React.createElement(_ui_tooltipWrap__WEBPACK_IMPORTED_MODULE_10__["default"], {
color: "black",
side: "top",
text: "BandagedBD Developer"
}, _v2__WEBPACK_IMPORTED_MODULE_2__["default"].React.createElement(Anchor, {
className: "bd-member-badge",
href: "https://github.com/rauenzi/BetterDiscordApp",
title: "BandagedBD",
target: "_blank"
}, _v2__WEBPACK_IMPORTED_MODULE_2__["default"].React.createElement(_ui_bdLogo__WEBPACK_IMPORTED_MODULE_9__["default"], {
size: "16px",
className: "bd-logo"
}))));
} else if (user.id === "696481194443014174" || user.id === "696003456611385396") {
children.push(_v2__WEBPACK_IMPORTED_MODULE_2__["default"].React.createElement(_ui_tooltipWrap__WEBPACK_IMPORTED_MODULE_10__["default"], {
color: "black",
side: "top",
text: "Lightcord Developer"
}, _v2__WEBPACK_IMPORTED_MODULE_2__["default"].React.createElement(Anchor, {
className: "bd-member-badge",
href: "https://github.com/Lightcord/Lightcord",
title: "Lightcord",
target: "_blank"
}, _v2__WEBPACK_IMPORTED_MODULE_2__["default"].React.createElement(_svg_lightcord__WEBPACK_IMPORTED_MODULE_11__["default"], {
size: "16px",
className: "bd-logo"
}))));
}
const id = Object(_distant__WEBPACK_IMPORTED_MODULE_13__["uuidv4"])();
children.push(_v2__WEBPACK_IMPORTED_MODULE_2__["default"].React.createElement("div", {
id: "badges-" + id
}));
applyBadges(id, user, false);
}
});
};
Core.prototype.updateInjector = async function () {
const injectionPath = _dataStore__WEBPACK_IMPORTED_MODULE_6__["default"].injectionPath;
if (!injectionPath) return false;
const fs = __webpack_require__(/*! fs */ "fs");
const path = __webpack_require__(/*! path */ "path");
const rmrf = __webpack_require__(/*! rimraf */ "rimraf");
const yauzl = __webpack_require__(/*! yauzl */ "yauzl");
const mkdirp = __webpack_require__(/*! mkdirp */ "mkdirp");
const request =
/*require("request");*/
null;
const parentPath = path.resolve(injectionPath, "..");
const folderName = path.basename(injectionPath);
const zipLink = "https://github.com/rauenzi/BetterDiscordApp/archive/injector.zip";
const savedZip = path.resolve(parentPath, "injector.zip");
const extractedFolder = path.resolve(parentPath, "BetterDiscordApp-injector"); // Download the injector zip file
_utils__WEBPACK_IMPORTED_MODULE_1__["default"].log("InjectorUpdate", "Downloading " + zipLink);
let success = await new Promise(resolve => {
request.get({
url: zipLink,
encoding: null
}, async (error, response, body) => {
if (error || response.statusCode !== 200) return resolve(false); // Save a backup in case someone has their own copy
const alreadyExists = await new Promise(res => fs.exists(savedZip, res));
if (alreadyExists) await new Promise(res => fs.rename(savedZip, `${savedZip}.bak${Math.round(performance.now())}`, res));
_utils__WEBPACK_IMPORTED_MODULE_1__["default"].log("InjectorUpdate", "Writing " + savedZip);
fs.writeFile(savedZip, body, err => resolve(!err));
});
});
if (!success) return success; // Check and delete rename extraction
const alreadyExists = await new Promise(res => fs.exists(extractedFolder, res));
if (alreadyExists) await new Promise(res => fs.rename(extractedFolder, `${extractedFolder}.bak${Math.round(performance.now())}`, res)); // Unzip the downloaded zip file
const zipfile = await new Promise(r => yauzl.open(savedZip, {
lazyEntries: true
}, (err, zip) => r(zip)));
zipfile.on("entry", function (entry) {
// Skip directories, they are handled with mkdirp
if (entry.fileName.endsWith("/")) return zipfile.readEntry();
_utils__WEBPACK_IMPORTED_MODULE_1__["default"].log("InjectorUpdate", "Extracting " + entry.fileName); // Make any needed parent directories
const fullPath = path.resolve(parentPath, entry.fileName);
mkdirp.sync(path.dirname(fullPath));
zipfile.openReadStream(entry, function (err, readStream) {
if (err) return success = false;
readStream.on("end", function () {
zipfile.readEntry();
}); // Go to next file after this
readStream.pipe(fs.createWriteStream(fullPath));
});
});
zipfile.readEntry(); // Start reading
// Wait for the final file to finish
await new Promise(resolve => zipfile.once("end", resolve)); // Save a backup in case something goes wrong during final step
const backupFolder = path.resolve(parentPath, `${folderName}.bak${Math.round(performance.now())}`);
await new Promise(resolve => fs.rename(injectionPath, backupFolder, resolve)); // Rename the extracted folder to what it should be
_utils__WEBPACK_IMPORTED_MODULE_1__["default"].log("InjectorUpdate", `Renaming ${path.basename(extractedFolder)} to ${folderName}`);
success = await new Promise(resolve => fs.rename(extractedFolder, injectionPath, err => resolve(!err)));
if (!success) {
_utils__WEBPACK_IMPORTED_MODULE_1__["default"].err("InjectorUpdate", "Failed to rename the final directory");
return success;
} // If rename had issues, delete what we tried to rename and restore backup
if (!success) {
_utils__WEBPACK_IMPORTED_MODULE_1__["default"].err("InjectorUpdate", "Something went wrong... restoring backups.");
await new Promise(resolve => rmrf(extractedFolder, resolve));
await new Promise(resolve => fs.rename(backupFolder, injectionPath, resolve));
return success;
} // If we've gotten to this point, everything should have gone smoothly.
// Cleanup the backup folder then remove the zip
await new Promise(resolve => rmrf(backupFolder, resolve));
await new Promise(resolve => fs.unlink(savedZip, resolve));
_utils__WEBPACK_IMPORTED_MODULE_1__["default"].log("InjectorUpdate", "Injector Updated!");
return success;
};
/* harmony default export */ __webpack_exports__["default"] = (new Core());
/***/ }),
/***/ "./src/modules/dataStore.js":
/*!**********************************!*\
!*** ./src/modules/dataStore.js ***!
\**********************************/
/*! exports provided: default */
/***/ (function(module, __webpack_exports__, __webpack_require__) {
"use strict";
__webpack_require__.r(__webpack_exports__);
/* harmony import */ var _0globals__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ../0globals */ "./src/0globals.js");
/* harmony import */ var _utils__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ./utils */ "./src/modules/utils.js");
/* harmony import */ var _contentManager__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! ./contentManager */ "./src/modules/contentManager.js");
const __non_webpack_require__ = window.require;
const fs = __webpack_require__(/*! fs */ "fs");
const path = __webpack_require__(/*! path */ "path");
const releaseChannel = DiscordNative.globals ? DiscordNative.globals.releaseChannel : DiscordNative.app ? DiscordNative.app.getReleaseChannel() : "stable";
/* harmony default export */ __webpack_exports__["default"] = (new class DataStore {
constructor() {
this.data = {
settings: {
stable: {},
canary: {},
ptb: {}
}
};
this.pluginData = {};
}
initialize() {
try {
if (!fs.existsSync(this.BDFile)) fs.writeFileSync(this.BDFile, JSON.stringify(this.data, null, 4), "binary");
const data = JSON.parse(fs.readFileSync(this.BDFile, "binary"));
if (data.hasOwnProperty("settings")) this.data = data;
if (!fs.existsSync(this.settingsFile)) return;
let settings = __non_webpack_require__(this.settingsFile);
fs.unlinkSync(this.settingsFile);
if (settings.hasOwnProperty("settings")) settings = Object.assign({
stable: {},
canary: {},
ptb: {}
}, {
[releaseChannel]: settings
});else settings = Object.assign({
stable: {},
canary: {},
ptb: {}
}, settings);
this.setBDData("settings", settings);
} catch (err) {
console.error(err);
_utils__WEBPACK_IMPORTED_MODULE_1__["default"].alert("Corrupt Storage", "The bd storage has somehow become corrupt. You may either try to salvage the file or delete it then reload.");
}
}
get injectionPath() {
return this._injectionPath = null;
if (this._injectionPath) return this._injectionPath;
const electron = __webpack_require__(/*! electron */ "electron").remote.app;
const base = electron.getAppPath();
const roamingBase = electron.getPath("userData");
const roamingLocation = path.resolve(roamingBase, electron.getVersion(), "modules", "discord_desktop_core", "injector");
const location = path.resolve(base, "..", "app");
const realLocation = fs.existsSync(location) ? location : fs.existsSync(roamingLocation) ? roamingLocation : null;
if (!realLocation) return this._injectionPath = null;
return this._injectionPath = realLocation;
}
get configFile() {
return this._configFile || (this._configFile = path.resolve(this.injectionPath, "betterdiscord", "config.json"));
}
get BDFile() {
return this._BDFile || (this._BDFile = path.resolve(_0globals__WEBPACK_IMPORTED_MODULE_0__["bdConfig"].dataPath, "bdstorage.json"));
}
get settingsFile() {
return this._settingsFile || (this._settingsFile = path.resolve(_0globals__WEBPACK_IMPORTED_MODULE_0__["bdConfig"].dataPath, "bdsettings.json"));
}
getPluginFile(pluginName) {
return path.resolve(_contentManager__WEBPACK_IMPORTED_MODULE_2__["default"].pluginsFolder, pluginName + ".config.json");
}
getSettingGroup(key) {
return this.data.settings[releaseChannel][key] || null;
}
setSettingGroup(key, data) {
this.data.settings[releaseChannel][key] = data;
fs.writeFileSync(this.BDFile, JSON.stringify(this.data, null, 4), "binary");
}
getBDData(key) {
return this.data[key] || "";
}
setBDData(key, value) {
this.data[key] = value;
fs.writeFileSync(this.BDFile, JSON.stringify(this.data, null, 4), "binary");
}
getPluginData(pluginName, key) {
if (this.pluginData[pluginName] !== undefined) return this.pluginData[pluginName][key];
if (!fs.existsSync(this.getPluginFile(pluginName))) return undefined;
this.pluginData[pluginName] = JSON.parse(fs.readFileSync(this.getPluginFile(pluginName)));
return this.pluginData[pluginName][key];
}
setPluginData(pluginName, key, value) {
if (value === undefined) return;
if (this.pluginData[pluginName] === undefined) this.pluginData[pluginName] = {};
this.pluginData[pluginName][key] = value;
fs.writeFileSync(this.getPluginFile(pluginName), JSON.stringify(this.pluginData[pluginName], null, 4), "binary");
}
deletePluginData(pluginName, key) {
if (this.pluginData[pluginName] === undefined) this.pluginData[pluginName] = {};
delete this.pluginData[pluginName][key];
fs.writeFileSync(this.getPluginFile(pluginName), JSON.stringify(this.pluginData[pluginName], null, 4), "binary");
}
}());
/***/ }),
/***/ "./src/modules/devMode.js":
/*!********************************!*\
!*** ./src/modules/devMode.js ***!
\********************************/
/*! exports provided: default */
/***/ (function(module, __webpack_exports__, __webpack_require__) {
"use strict";
__webpack_require__.r(__webpack_exports__);
/* harmony import */ var _0globals__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ../0globals */ "./src/0globals.js");
/* harmony import */ var _v2__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ./v2 */ "./src/modules/v2.js");
/* harmony import */ var _domtools__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! ./domtools */ "./src/modules/domtools.js");
/* harmony import */ var _utils__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(/*! ./utils */ "./src/modules/utils.js");
/* harmony default export */ __webpack_exports__["default"] = (new class DevMode {
constructor() {
this.debugListener = this.debugListener.bind(this);
this.copySelectorListener = this.copySelectorListener.bind(this);
}
start() {
this.startDebugListener();
if (_0globals__WEBPACK_IMPORTED_MODULE_0__["settingsCookie"]["fork-dm-1"]) this.startCopySelector();
}
stop() {
this.stopDebugListener();
this.stopCopySelector();
}
startDebugListener() {
this.stopDebugListener();
document.addEventListener("keydown", this.debugListener);
}
stopDebugListener() {
document.removeEventListener("keydown", this.debugListener);
}
startCopySelector() {
this.stopCopySelector();
document.addEventListener("contextmenu", this.copySelectorListener);
}
stopCopySelector() {
document.removeEventListener("contextmenu", this.copySelectorListener);
}
debugListener(e) {
if (e.which === 119 || e.which == 118) {
//F8
console.log("%c[%cDevMode%c] %cBreak/Resume", "color: red;", "color: #303030; font-weight:700;", "color:red;", "");
debugger; // eslint-disable-line no-debugger
e.preventDefault();
e.stopImmediatePropagation();
}
}
copySelectorListener(e) {
try {
e.stopPropagation();
const selector = this.getSelector(e.target);
let [classLayer, classItems] = [BDModules.get(e => e.layer && typeof e.layer === "string" && e.disabledPointerEvents)[0], BDModules.get(e => e.menu)[0]];
function attach() {
if (!classItems || !classLayer.layer) return console.log(classItems, classLayer.layer);
let cm = _domtools__WEBPACK_IMPORTED_MODULE_2__["default"].query("." + _utils__WEBPACK_IMPORTED_MODULE_3__["default"].removeDa(classItems.menu));
if (!cm) {
const container = _domtools__WEBPACK_IMPORTED_MODULE_2__["default"].query("#app-mount > ." + _utils__WEBPACK_IMPORTED_MODULE_3__["default"].removeDa(classLayer.layerContainer));
const cmWrap = _domtools__WEBPACK_IMPORTED_MODULE_2__["default"].createElement(`<div class="${classLayer.layer}">`);
cm = _domtools__WEBPACK_IMPORTED_MODULE_2__["default"].createElement(`<div class="${classItems.menu} ${classItems.styleFlexible} ${classItems.accommodateScrollbar} bd-context-menu" style=""></div>`);
cmWrap.append(cm);
container.append(cmWrap);
cmWrap.style.top = e.clientY + "px";
cmWrap.style.left = e.clientX + "px";
cmWrap.setAttribute("role", "menu");
cmWrap.setAttribute("tabindex", "-1");
cmWrap.id = "bd-copy-selector-context";
cmWrap.setAttribute("aria-label", "Copy Selector Actions");
const scrollerClasses = BDModules.get(e => e.scrollerWrap)[0];
const scrollerWrap = _domtools__WEBPACK_IMPORTED_MODULE_2__["default"].createElement(`<div class="${scrollerClasses.scrollerWrap} ${scrollerClasses.scrollerThemed} ${scrollerClasses.themeGhostHairline}"></div>`);
const scroller = _domtools__WEBPACK_IMPORTED_MODULE_2__["default"].createElement(`<div class="${BDModules.get(e => e.scroller)[0].scroller} ${classItems.scroller}"></div>`);
scrollerWrap.append(scroller);
cm.append(scrollerWrap);
const removeCM = function (e) {
if (e.keyCode && e.keyCode !== 27) return;
cmWrap.remove();
document.removeEventListener("click", removeCM);
document.removeEventListener("contextmenu", removeCM);
document.removeEventListener("keyup", removeCM);
};
document.addEventListener("click", removeCM);
document.addEventListener("contextmenu", removeCM);
document.addEventListener("keyup", removeCM);
}
const cmWrap = cm.parentElement;
const scroller = cm.childNodes[0].childNodes[0];
const cmg = _domtools__WEBPACK_IMPORTED_MODULE_2__["default"].createElement(`<div role="group"></div>`);
/**
* @type {HTMLElement}
*/
const cmi = _domtools__WEBPACK_IMPORTED_MODULE_2__["default"].createElement(`<div class="${classItems.item} ${classItems.labelContainer} ${classItems.colorDefault}" role="menuitem" id="bd-copy-selector-item-cm"></div>`);
cmi.append(_domtools__WEBPACK_IMPORTED_MODULE_2__["default"].createElement(`<div class="${classItems.label}">Copy Selector</div>`));
cmi.addEventListener("click", () => {
_v2__WEBPACK_IMPORTED_MODULE_1__["default"].NativeModule.copy(selector);
cmWrap.style.display = "none";
});
cmi.addEventListener("mouseover", e => {
let elements = _domtools__WEBPACK_IMPORTED_MODULE_2__["default"].queryAll("div[role=menuitem]." + _utils__WEBPACK_IMPORTED_MODULE_3__["default"].removeDa(classItems.focused));
elements && elements.forEach(elem => elem.classList.remove(classItems.focused));
cmi.classList.add(classItems.focused);
});
cmi.addEventListener("mouseout", e => {
cmi.classList.remove(classItems.focused);
});
cmg.append(cmi);
if (scroller.childNodes.length) {
// apend a separator
const separator = _domtools__WEBPACK_IMPORTED_MODULE_2__["default"].createElement(`<div role="separator" class="${classItems.separator}"></div>`);
scroller.append(separator);
}
scroller.append(cmg);
if (cmWrap.clientHeight < cmWrap.scrollHeight) {
console.log("overflowing " + cmWrap.style.top);
cmWrap.style.top = cmWrap.style.top - cmg.clientHeight + "px";
console.log("overflowing" + cmWrap.style.top);
}
}
setTimeout(attach, 1);
} catch (e) {
console.error(e);
}
}
getSelector(element) {
if (element.id) return `#${element.id}`;
/**
*
* @param {HTMLElement} el
*/
function fullPath(el) {
var names = [];
while (el.parentNode) {
if (el.id) {
names.unshift('#' + el.id);
break;
} else {
if (el == el.ownerDocument.documentElement) names.unshift(el.tagName.toLowerCase() + Array.from(el.classList.entries()).map(e => "." + e).join(""));else {
for (var c = 1, e = el; e.previousElementSibling; e = e.previousElementSibling, c++);
names.unshift(el.tagName.toLowerCase() + (typeof el.className === "string" && el.className || "").split(" ").filter(e => !!e).map(e => "." + e).join("") + ":nth-child(" + c + ")");
}
el = el.parentNode;
}
}
return names.join(" > ");
}
return fullPath(element);
/*
const rules = this.getRules(element);
const latestRule = rules[rules.length - 1];
if (latestRule) return latestRule.selectorText;
else if (element.classList.length) return `.${Array.from(element.classList).join(".")}`;
return `.${Array.from(element.parentElement.classList).join(".")}`;*/
}
getRules(element, css = element.ownerDocument.styleSheets) {
//if (window.getMatchedCSSRules) return window.getMatchedCSSRules(element);
const sheets = [...css].filter(s => !s.href || !s.href.includes("BetterDiscordApp"));
const rules = sheets.map(s => [...(s.cssRules || [])]).flat();
const elementRules = rules.filter(r => r && r.selectorText && element.matches(r.selectorText) && r.style.length && r.selectorText.split(", ").length < 8 && !r.selectorText.split(", ").includes("*"));
return elementRules;
}
}());
/***/ }),
/***/ "./src/modules/disableTyping.js":
/*!**************************************!*\
!*** ./src/modules/disableTyping.js ***!
\**************************************/
/*! exports provided: default */
/***/ (function(module, __webpack_exports__, __webpack_require__) {
"use strict";
__webpack_require__.r(__webpack_exports__);
/* harmony default export */ __webpack_exports__["default"] = (new class DisableTyping {
constructor() {
window.Lightcord.Api.ensureExported(e => e.default && e.default.startTyping).then(typingModule => {
let self = this;
const startTyping = typingModule.default.startTyping;
typingModule.default.startTyping = function () {
if (self.disabled) return startTyping.call(this, ...arguments);
};
const stopTyping = typingModule.default.stopTyping;
typingModule.default.stopTyping = function () {
if (self.disabled) return stopTyping.call(this, ...arguments);
};
this.disabled = true;
});
}
disable() {
this.disabled = true;
}
enable() {
this.disabled = false;
}
}());
/***/ }),
/***/ "./src/modules/distant.js":
/*!********************************!*\
!*** ./src/modules/distant.js ***!
\********************************/
/*! exports provided: uuidv4, default, Constants, Routes */
/***/ (function(module, __webpack_exports__, __webpack_require__) {
"use strict";
__webpack_require__.r(__webpack_exports__);
/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "uuidv4", function() { return uuidv4; });
/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "Constants", function() { return Constants; });
/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "Routes", function() { return Routes; });
/* harmony import */ var _svg_bug_hunter__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ../svg/bug_hunter */ "./src/svg/bug_hunter.jsx");
/* harmony import */ var _svg_LightcordUser__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ../svg/LightcordUser */ "./src/svg/LightcordUser.jsx");
/* harmony import */ var node_fetch__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! node-fetch */ "node-fetch");
/* harmony import */ var node_fetch__WEBPACK_IMPORTED_MODULE_2___default = /*#__PURE__*/__webpack_require__.n(node_fetch__WEBPACK_IMPORTED_MODULE_2__);
/* harmony import */ var _0globals__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(/*! ../0globals */ "./src/0globals.js");
/* harmony import */ var _svg_circus__WEBPACK_IMPORTED_MODULE_4__ = __webpack_require__(/*! ../svg/circus */ "./src/svg/circus.jsx");
function uuidv4() {
// Generate UUID (No crypto rng)
return 'xxxxxxxx-xxxx-4xxx-yxxx-xxxxxxxxxxxx'.replace(/[xy]/g, function (c) {
var r = Math.random() * 16 | 0,
v = c == 'x' ? r : r & 0x3 | 0x8;
return v.toString(16);
});
}
const awaitingBadgesPromises = {};
let badgesToFetch = [];
/* harmony default export */ __webpack_exports__["default"] = (new class DistantServer {
constructor() {
this._cache = {
badges: {}
};
}
get cache() {
return this._cache;
}
set cache(data) {
if (typeof data !== "object" || typeof this._cache !== "object") return this._cache = data;
return this._cache = Object.assign(this._cache, data);
}
/*
async delete(){
BdApi.showToast("Deleting all infos about you on Lightcord Servers...", {type: "warn"})
return handleRequest(Routes.delete, "delete")
.then(async res => {
if(res.status !== 200){
BdApi.showToast("An error occured, couldn't delete informations. See console for more infos", {type: "error"})
throw new Error(`Couldn't delete all informations: ${(res.status+" "+res.statusText+" "+await res.text())}`)
}
console.info(`Succesfully deleted informations.`)
BdApi.showToast("Succesfully deleted informations", {type: "success"})
window.Lightcord.Api.Authorization = null
return res.json()
}).catch((err) => {
BdApi.showToast("An error occured, couldn't delete informations. See console for more infos", {type: "error"})
throw new Error(`Couldn't delete all informations: ${err.stack}`)
})
}*/
/**
* Get custom badges from the user ID.
* @param {string} user The user ID
* @returns {Promise<Constants["badges"]>}
*/
async getBadges(user) {
if (this.cache.badges[user]) return this.cache.badges[user];
if (awaitingBadgesPromises[user]) return awaitingBadgesPromises[user];
let resolve;
const newPromise = new Promise(res => resolve = res);
awaitingBadgesPromises[user] = newPromise;
const badges = [];
for (let badge of Constants.badges) {
if (badge.defaultUsers.includes(user)) badges.push(badge);
}
const fetchedBadges = await new Promise(resolve => {
if (!_0globals__WEBPACK_IMPORTED_MODULE_3__["settingsCookie"]["lightcord-5"]) return resolve([]);
badgesToFetch.push([user, resolve]);
setTimeout(() => {
let users = badgesToFetch;
if (users.length === 0) return;
badgesToFetch = [];
handleRequest(Routes.badges, "POST", JSON.stringify(users.map(e => e[0]))).then(async res => {
if (res.status !== 200) {
// Couldn't fetch badges: server error
users.forEach(data => {
data[1]([]); // resolve no badge fetched
});
}
const responseBody = await res.json();
console.log(responseBody);
for (let user of responseBody) {
let promise = users.find(promise => promise[0] === user.user_id);
promise[1](user.badges);
}
}).catch(err => {
// Couldn't fetch badges: error
if (!(err instanceof LightcordError)) console.error(err);
users.forEach(data => {
data[1]([]); // resolve no badge fetched
});
});
}, 0);
});
for (let badge of fetchedBadges) {
if (!Constants.badges.find(e => e.id === badge)) continue; // We do not have the Component, skip it.
if (badges.find(e => e.id === badge)) continue; // Already inserted.
badges.push(Constants.badges.find(e => e.id === badge));
}
this.cache = {
badges: Object.assign(this.cache.badges, {
[user]: badges
})
};
setTimeout(() => {
delete this.cache.badges[user];
}, 600000);
resolve(badges);
delete awaitingBadgesPromises[user];
return badges;
}
}());
const handleRequest = function (route, method, data) {
if (!_0globals__WEBPACK_IMPORTED_MODULE_3__["settingsCookie"]["lightcord-5"]) {
console.warn(`Canceling request on ${route} with method ${method} and body`, data, "because of settings.");
return Promise.reject(new LightcordError("The current settings blocked the request."));
}
console.log(`Sending request on ${route} with method ${method} and body`, data);
return node_fetch__WEBPACK_IMPORTED_MODULE_2___default()(`${Constants.SERVER_URL}/api/v1${route}`, {
method,
headers: {
"CLIENT": "Lightcord",
"Authorization": window.Lightcord.Api.Authorization || "None::Anonymous"
},
...(data ? {
body: data
} : {})
});
};
class LightcordError extends Error {
constructor() {
super(...arguments);
this.name = "LightcordError";
}
}
const Constants = {
SERVER_URL: "http://127.0.0.1",
badges: [// TODO:
/*{
name: "Lightcord User",
id: "01cfa7b0-7cdb-4b0e-8258-9c6a78235c93",
defaultUsers: [],
scopes: [
"user"
],
component: LightcordUserBadge
}, */
{
name: "Lightcord Bug Hunter",
id: "f04698f5-816b-41e3-bd01-92291193d7a5",
defaultUsers: ["696481194443014174", "696003456611385396"],
scopes: [],
component: _svg_bug_hunter__WEBPACK_IMPORTED_MODULE_0__["default"],
href: "https://github.com/lightcord/lightcord/wiki/badges/bug_hunter"
}, {
name: "Buffoon",
id: "06904d31-65b4-41ec-a50c-8658bbd1af96",
defaultUsers: ["389016895543705602", "664600134528663565"],
scopes: [],
component: _svg_circus__WEBPACK_IMPORTED_MODULE_4__["default"],
href: "https://www.youtube.com/watch?v=EJtb6z-dlT8"
}]
};
const Routes = {
badges: `/users/badges`,
delete: `/delete`
};
/***/ }),
/***/ "./src/modules/domtools.js":
/*!*********************************!*\
!*** ./src/modules/domtools.js ***!
\*********************************/
/*! exports provided: default */
/***/ (function(module, __webpack_exports__, __webpack_require__) {
"use strict";
__webpack_require__.r(__webpack_exports__);
/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "default", function() { return DOMTools; });
/**
* Copyright 2018 Zachary Rauen
*
* Permission is hereby granted, free of charge, to any person obtaining
* a copy of this software and associated documentation files (the "Software"),
* to deal in the Software without restriction, including without limitation the
* rights to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
* copies of the Software, and to permit persons to whom the Software is furnished
* to do so, subject to the following conditions:
*
* The above copyright notice and this permission notice shall be included in all
* copies or substantial portions of the Software.
*
* THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED,
* INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A
* PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT
* HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF
* CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE
* OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
*
* From: https://github.com/rauenzi/BDPluginLibrary
*/
/**
* @interface
* @name Offset
* @property {number} top - Top offset of the target element.
* @property {number} right - Right offset of the target element.
* @property {number} bottom - Bottom offset of the target element.
* @property {number} left - Left offset of the target element.
* @property {number} height - Outer height of the target element.
* @property {number} width - Outer width of the target element.
*/
/**
* Function that automatically removes added listener.
* @callback module:DOMTools~CancelListener
*/
class DOMTools {
static escapeID(id) {
return id.replace(/^[^a-z]+|[^\w-]+/gi, "-");
}
/**
* Adds a style to the document.
* @param {string} id - identifier to use as the element id
* @param {string} css - css to add to the document
*/
static addStyle(id, css) {
document.head.append(DOMTools.createElement(`<style id="${id}">${css}</style>`));
}
/**
* Removes a style from the document.
* @param {string} id - original identifier used
*/
static removeStyle(id) {
const element = document.getElementById(id);
if (element) element.remove();
}
/**
* Adds/requires a remote script to be loaded
* @param {string} id - identifier to use for this script
* @param {string} url - url from which to load the script
* @returns {Promise} promise that resolves when the script is loaded
*/
static addScript(id, url) {
return new Promise(resolve => {
const script = document.createElement("script");
script.id = id;
script.src = url;
script.type = "text/javascript";
script.onload = resolve;
document.head.append(script);
});
}
/**
* Removes a remote script from the document.
* @param {string} id - original identifier used
*/
static removeScript(id) {
id = this.escapeID(id);
const element = document.getElementById(id);
if (element) element.remove();
} // https://javascript.info/js-animation
static animate({
timing = _ => _,
update,
duration
}) {
const start = performance.now();
requestAnimationFrame(function animate(time) {
// timeFraction goes from 0 to 1
let timeFraction = (time - start) / duration;
if (timeFraction > 1) timeFraction = 1; // calculate the current animation state
const progress = timing(timeFraction);
update(progress); // draw it
if (timeFraction < 1) {
requestAnimationFrame(animate);
}
});
}
/**
* This is my shit version of not having to use `$` from jQuery. Meaning
* that you can pass a selector and it will automatically run {@link module:DOMTools.query}.
* It also means that you can pass a string of html and it will perform and return `parseHTML`.
* @see module:DOMTools.parseHTML
* @see module:DOMTools.query
* @param {string} selector - Selector to query or HTML to parse
* @returns {(DocumentFragment|NodeList|HTMLElement)} - Either the result of `parseHTML` or `query`
*/
static Q(selector) {
const element = this.parseHTML(selector);
const isHTML = element instanceof NodeList ? Array.from(element).some(n => n.nodeType === 1) : element.nodeType === 1;
if (isHTML) return element;
return this.query(selector);
}
/**
* Essentially a shorthand for `document.querySelector`. If the `baseElement` is not provided
* `document` is used by default.
* @param {string} selector - Selector to query
* @param {Element} [baseElement] - Element to base the query from
* @returns {(Element|null)} - The found element or null if not found
*/
static query(selector, baseElement) {
if (!baseElement) baseElement = document;
return baseElement.querySelector(selector);
}
/**
* Essentially a shorthand for `document.querySelectorAll`. If the `baseElement` is not provided
* `document` is used by default.
* @param {string} selector - Selector to query
* @param {Element} [baseElement] - Element to base the query from
* @returns {Array<Element>} - Array of all found elements
*/
static queryAll(selector, baseElement) {
if (!baseElement) baseElement = document;
return baseElement.querySelectorAll(selector);
}
/**
* Parses a string of HTML and returns the results. If the second parameter is true,
* the parsed HTML will be returned as a document fragment {@see https://developer.mozilla.org/en-US/docs/Web/API/DocumentFragment}.
* This is extremely useful if you have a list of elements at the top level, they can then be appended all at once to another node.
*
* If the second parameter is false, then the return value will be the list of parsed
* nodes and there were multiple top level nodes, otherwise the single node is returned.
* @param {string} html - HTML to be parsed
* @param {boolean} [fragment=false] - Whether or not the return should be the raw `DocumentFragment`
* @returns {(DocumentFragment|NodeList|HTMLElement)} - The result of HTML parsing
*/
static parseHTML(html, fragment = false) {
const template = document.createElement("template");
template.innerHTML = html;
const node = template.content.cloneNode(true);
if (fragment) return node;
return node.childNodes.length > 1 ? node.childNodes : node.childNodes[0];
}
/** Alternate name for {@link module:DOMTools.parseHTML} */
static createElement(html, fragment = false) {
return this.parseHTML(html, fragment);
}
/**
* Takes a string of html and escapes it using the brower's own escaping mechanism.
* @param {String} html - html to be escaped
*/
static escapeHTML(html) {
const textNode = document.createTextNode("");
const spanElement = document.createElement("span");
spanElement.append(textNode);
textNode.nodeValue = html;
return spanElement.innerHTML;
}
/**
* Adds a list of classes from the target element.
* @param {Element} element - Element to edit classes of
* @param {...string} classes - Names of classes to add
* @returns {Element} - `element` to allow for chaining
*/
static addClass(element, ...classes) {
classes = classes.flat().filter(c => c);
for (let c = 0; c < classes.length; c++) classes[c] = classes[c].toString().split(" ");
classes = classes.flat().filter(c => c);
element.classList.add(...classes);
return element;
}
/**
* Removes a list of classes from the target element.
* @param {Element} element - Element to edit classes of
* @param {...string} classes - Names of classes to remove
* @returns {Element} - `element` to allow for chaining
*/
static removeClass(element, ...classes) {
for (let c = 0; c < classes.length; c++) classes[c] = classes[c].toString().split(" ");
classes = classes.flat().filter(c => c);
element.classList.remove(...classes);
return element;
}
/**
* When only one argument is present: Toggle class value;
* i.e., if class exists then remove it and return false, if not, then add it and return true.
* When a second argument is present:
* If the second argument evaluates to true, add specified class value, and if it evaluates to false, remove it.
* @param {Element} element - Element to edit classes of
* @param {string} classname - Name of class to toggle
* @param {boolean} [indicator] - Optional indicator for if the class should be toggled
* @returns {Element} - `element` to allow for chaining
*/
static toggleClass(element, classname, indicator) {
classname = classname.toString().split(" ").filter(c => c);
if (typeof indicator !== "undefined") classname.forEach(c => element.classList.toggle(c, indicator));else classname.forEach(c => element.classList.toggle(c));
return element;
}
/**
* Checks if an element has a specific class
* @param {Element} element - Element to edit classes of
* @param {string} classname - Name of class to check
* @returns {boolean} - `true` if the element has the class, `false` otherwise.
*/
static hasClass(element, classname) {
return classname.toString().split(" ").filter(c => c).every(c => element.classList.contains(c));
}
/**
* Replaces one class with another
* @param {Element} element - Element to edit classes of
* @param {string} oldName - Name of class to replace
* @param {string} newName - New name for the class
* @returns {Element} - `element` to allow for chaining
*/
static replaceClass(element, oldName, newName) {
element.classList.replace(oldName, newName);
return element;
}
/**
* Appends `thisNode` to `thatNode`
* @param {Node} thisNode - Node to be appended to another node
* @param {Node} thatNode - Node for `thisNode` to be appended to
* @returns {Node} - `thisNode` to allow for chaining
*/
static appendTo(thisNode, thatNode) {
if (typeof thatNode == "string") thatNode = this.query(thatNode);
if (!thatNode) return null;
thatNode.append(thisNode);
return thisNode;
}
/**
* Prepends `thisNode` to `thatNode`
* @param {Node} thisNode - Node to be prepended to another node
* @param {Node} thatNode - Node for `thisNode` to be prepended to
* @returns {Node} - `thisNode` to allow for chaining
*/
static prependTo(thisNode, thatNode) {
if (typeof thatNode == "string") thatNode = this.query(thatNode);
if (!thatNode) return null;
thatNode.prepend(thisNode);
return thisNode;
}
/**
* Insert after a specific element, similar to jQuery's `thisElement.insertAfter(otherElement)`.
* @param {Node} thisNode - The node to insert
* @param {Node} targetNode - Node to insert after in the tree
* @returns {Node} - `thisNode` to allow for chaining
*/
static insertAfter(thisNode, targetNode) {
targetNode.parentNode.insertBefore(thisNode, targetNode.nextSibling);
return thisNode;
}
/**
* Insert after a specific element, similar to jQuery's `thisElement.after(newElement)`.
* @param {Node} thisNode - The node to insert
* @param {Node} newNode - Node to insert after in the tree
* @returns {Node} - `thisNode` to allow for chaining
*/
static after(thisNode, newNode) {
thisNode.parentNode.insertBefore(newNode, thisNode.nextSibling);
return thisNode;
}
/**
* Gets the next sibling element that matches the selector.
* @param {Element} element - Element to get the next sibling of
* @param {string} [selector=""] - Optional selector
* @returns {Element} - The sibling element
*/
static next(element, selector = "") {
return selector ? element.querySelector("+ " + selector) : element.nextElementSibling;
}
/**
* Gets all subsequent siblings.
* @param {Element} element - Element to get next siblings of
* @returns {NodeList} - The list of siblings
*/
static nextAll(element) {
return element.querySelectorAll("~ *");
}
/**
* Gets the subsequent siblings until an element matches the selector.
* @param {Element} element - Element to get the following siblings of
* @param {string} selector - Selector to stop at
* @returns {Array<Element>} - The list of siblings
*/
static nextUntil(element, selector) {
const next = [];
while (element.nextElementSibling && !element.nextElementSibling.matches(selector)) next.push(element = element.nextElementSibling);
return next;
}
/**
* Gets the previous sibling element that matches the selector.
* @param {Element} element - Element to get the previous sibling of
* @param {string} [selector=""] - Optional selector
* @returns {Element} - The sibling element
*/
static previous(element, selector = "") {
const previous = element.previousElementSibling;
if (selector) return previous && previous.matches(selector) ? previous : null;
return previous;
}
/**
* Gets all preceeding siblings.
* @param {Element} element - Element to get preceeding siblings of
* @returns {NodeList} - The list of siblings
*/
static previousAll(element) {
const previous = [];
while (element.previousElementSibling) previous.push(element = element.previousElementSibling);
return previous;
}
/**
* Gets the preceeding siblings until an element matches the selector.
* @param {Element} element - Element to get the preceeding siblings of
* @param {string} selector - Selector to stop at
* @returns {Array<Element>} - The list of siblings
*/
static previousUntil(element, selector) {
const previous = [];
while (element.previousElementSibling && !element.previousElementSibling.matches(selector)) previous.push(element = element.previousElementSibling);
return previous;
}
/**
* Find which index in children a certain node is. Similar to jQuery's `$.index()`
* @param {HTMLElement} node - The node to find its index in parent
* @returns {number} Index of the node
*/
static indexInParent(node) {
const children = node.parentNode.childNodes;
let num = 0;
for (let i = 0; i < children.length; i++) {
if (children[i] == node) return num;
if (children[i].nodeType == 1) num++;
}
return -1;
}
/** Shorthand for {@link module:DOMTools.indexInParent} */
static index(node) {
return this.indexInParent(node);
}
/**
* Gets the parent of the element if it matches the selector,
* otherwise returns null.
* @param {Element} element - Element to get parent of
* @param {string} [selector=""] - Selector to match parent
* @returns {(Element|null)} - The sibling element or null
*/
static parent(element, selector = "") {
return !selector || element.parentElement.matches(selector) ? element.parentElement : null;
}
/**
* Gets all children of Element that match the selector if provided.
* @param {Element} element - Element to get all children of
* @param {string} selector - Selector to match the children to
* @returns {Array<Element>} - The list of children
*/
static findChild(element, selector) {
return element.querySelector(":scope > " + selector);
}
/**
* Gets all children of Element that match the selector if provided.
* @param {Element} element - Element to get all children of
* @param {string} selector - Selector to match the children to
* @returns {Array<Element>} - The list of children
*/
static findChildren(element, selector) {
return element.querySelectorAll(":scope > " + selector);
}
/**
* Gets all ancestors of Element that match the selector if provided.
* @param {Element} element - Element to get all parents of
* @param {string} [selector=""] - Selector to match the parents to
* @returns {Array<Element>} - The list of parents
*/
static parents(element, selector = "") {
const parents = [];
if (selector) while (element.parentElement && element.parentElement.closest(selector)) parents.push(element = element.parentElement.closest(selector));else while (element.parentElement) parents.push(element = element.parentElement);
return parents;
}
/**
* Gets the ancestors until an element matches the selector.
* @param {Element} element - Element to get the ancestors of
* @param {string} selector - Selector to stop at
* @returns {Array<Element>} - The list of parents
*/
static parentsUntil(element, selector) {
const parents = [];
while (element.parentElement && !element.parentElement.matches(selector)) parents.push(element = element.parentElement);
return parents;
}
/**
* Gets all siblings of the element that match the selector.
* @param {Element} element - Element to get all siblings of
* @param {string} [selector="*"] - Selector to match the siblings to
* @returns {Array<Element>} - The list of siblings
*/
static siblings(element, selector = "*") {
return Array.from(element.parentElement.children).filter(e => e != element && e.matches(selector));
}
/**
* Sets or gets css styles for a specific element. If `value` is provided
* then it sets the style and returns the element to allow for chaining,
* otherwise returns the style.
* @param {Element} element - Element to set the CSS of
* @param {string} attribute - Attribute to get or set
* @param {string} [value] - Value to set for attribute
* @returns {Element|string} - When setting a value, element is returned for chaining, otherwise the value is returned.
*/
static css(element, attribute, value) {
if (typeof value == "undefined") return global.getComputedStyle(element)[attribute];
element.style[attribute] = value;
return element;
}
/**
* Sets or gets the width for a specific element. If `value` is provided
* then it sets the width and returns the element to allow for chaining,
* otherwise returns the width.
* @param {Element} element - Element to set the CSS of
* @param {string} [value] - Width to set
* @returns {Element|string} - When setting a value, element is returned for chaining, otherwise the value is returned.
*/
static width(element, value) {
if (typeof value == "undefined") return parseInt(getComputedStyle(element).width);
element.style.width = value;
return element;
}
/**
* Sets or gets the height for a specific element. If `value` is provided
* then it sets the height and returns the element to allow for chaining,
* otherwise returns the height.
* @param {Element} element - Element to set the CSS of
* @param {string} [value] - Height to set
* @returns {Element|string} - When setting a value, element is returned for chaining, otherwise the value is returned.
*/
static height(element, value) {
if (typeof value == "undefined") return parseInt(getComputedStyle(element).height);
element.style.height = value;
return element;
}
/**
* Sets the inner text of an element if given a value, otherwise returns it.
* @param {Element} element - Element to set the text of
* @param {string} [text] - Content to set
* @returns {string} - Either the string set by this call or the current text content of the node.
*/
static text(element, text) {
if (typeof text == "undefined") return element.textContent;
return element.textContent = text;
}
/**
* Returns the innerWidth of the element.
* @param {Element} element - Element to retrieve inner width of
* @return {number} - The inner width of the element.
*/
static innerWidth(element) {
return element.clientWidth;
}
/**
* Returns the innerHeight of the element.
* @param {Element} element - Element to retrieve inner height of
* @return {number} - The inner height of the element.
*/
static innerHeight(element) {
return element.clientHeight;
}
/**
* Returns the outerWidth of the element.
* @param {Element} element - Element to retrieve outer width of
* @return {number} - The outer width of the element.
*/
static outerWidth(element) {
return element.offsetWidth;
}
/**
* Returns the outerHeight of the element.
* @param {Element} element - Element to retrieve outer height of
* @return {number} - The outer height of the element.
*/
static outerHeight(element) {
return element.offsetHeight;
}
/**
* Gets the offset of the element in the page.
* @param {Element} element - Element to get offset of
* @return {Offset} - The offset of the element
*/
static offset(element) {
return element.getBoundingClientRect();
}
static get listeners() {
return this._listeners || (this._listeners = {});
}
/**
* This is similar to jQuery's `on` function and can *hopefully* be used in the same way.
*
* Rather than attempt to explain, I'll show some example usages.
*
* The following will add a click listener (in the `myPlugin` namespace) to `element`.
* `DOMTools.on(element, "click.myPlugin", () => {console.log("clicked!");});`
*
* The following will add a click listener (in the `myPlugin` namespace) to `element` that only fires when the target is a `.block` element.
* `DOMTools.on(element, "click.myPlugin", ".block", () => {console.log("clicked!");});`
*
* The following will add a click listener (without namespace) to `element`.
* `DOMTools.on(element, "click", () => {console.log("clicked!");});`
*
* The following will add a click listener (without namespace) to `element` that only fires once.
* `const cancel = DOMTools.on(element, "click", () => {console.log("fired!"); cancel();});`
*
* @param {Element} element - Element to add listener to
* @param {string} event - Event to listen to with option namespace (e.g. "event.namespace")
* @param {(string|callable)} delegate - Selector to run on element to listen to
* @param {callable} [callback] - Function to fire on event
* @returns {module:DOMTools~CancelListener} - A function that will undo the listener
*/
static on(element, event, delegate, callback) {
const [type, namespace] = event.split(".");
const hasDelegate = delegate && callback;
if (!callback) callback = delegate;
const eventFunc = !hasDelegate ? callback : function (event) {
if (event.target.matches(delegate)) {
callback(event);
}
};
element.addEventListener(type, eventFunc);
const cancel = () => {
element.removeEventListener(type, eventFunc);
};
if (namespace) {
if (!this.listeners[namespace]) this.listeners[namespace] = [];
const newCancel = () => {
cancel();
this.listeners[namespace].splice(this.listeners[namespace].findIndex(l => l.event == type && l.element == element), 1);
};
this.listeners[namespace].push({
event: type,
element: element,
cancel: newCancel
});
return newCancel;
}
return cancel;
}
/**
* Functionality for this method matches {@link module:DOMTools.on} but automatically cancels itself
* and removes the listener upon the first firing of the desired event.
*
* @param {Element} element - Element to add listener to
* @param {string} event - Event to listen to with option namespace (e.g. "event.namespace")
* @param {(string|callable)} delegate - Selector to run on element to listen to
* @param {callable} [callback] - Function to fire on event
* @returns {module:DOMTools~CancelListener} - A function that will undo the listener
*/
static once(element, event, delegate, callback) {
const [type, namespace] = event.split(".");
const hasDelegate = delegate && callback;
if (!callback) callback = delegate;
const eventFunc = !hasDelegate ? function (event) {
callback(event);
element.removeEventListener(type, eventFunc);
} : function (event) {
if (!event.target.matches(delegate)) return;
callback(event);
element.removeEventListener(type, eventFunc);
};
element.addEventListener(type, eventFunc);
const cancel = () => {
element.removeEventListener(type, eventFunc);
};
if (namespace) {
if (!this.listeners[namespace]) this.listeners[namespace] = [];
const newCancel = () => {
cancel();
this.listeners[namespace].splice(this.listeners[namespace].findIndex(l => l.event == type && l.element == element), 1);
};
this.listeners[namespace].push({
event: type,
element: element,
cancel: newCancel
});
return newCancel;
}
return cancel;
}
static __offAll(event, element) {
const [type, namespace] = event.split(".");
let matchFilter = listener => listener.event == type,
defaultFilter = _ => _;
if (element) matchFilter = l => l.event == type && l.element == element, defaultFilter = l => l.element == element;
const listeners = this.listeners[namespace] || [];
const list = type ? listeners.filter(matchFilter) : listeners.filter(defaultFilter);
for (let c = 0; c < list.length; c++) list[c].cancel();
}
/**
* This is similar to jQuery's `off` function and can *hopefully* be used in the same way.
*
* Rather than attempt to explain, I'll show some example usages.
*
* The following will remove a click listener called `onClick` (in the `myPlugin` namespace) from `element`.
* `DOMTools.off(element, "click.myPlugin", onClick);`
*
* The following will remove a click listener called `onClick` (in the `myPlugin` namespace) from `element` that only fired when the target is a `.block` element.
* `DOMTools.off(element, "click.myPlugin", ".block", onClick);`
*
* The following will remove a click listener (without namespace) from `element`.
* `DOMTools.off(element, "click", onClick);`
*
* The following will remove all listeners in namespace `myPlugin` from `element`.
* `DOMTools.off(element, ".myPlugin");`
*
* The following will remove all click listeners in namespace `myPlugin` from *all elements*.
* `DOMTools.off("click.myPlugin");`
*
* The following will remove all listeners in namespace `myPlugin` from *all elements*.
* `DOMTools.off(".myPlugin");`
*
* @param {(Element|string)} element - Element to remove listener from
* @param {string} [event] - Event to listen to with option namespace (e.g. "event.namespace")
* @param {(string|callable)} [delegate] - Selector to run on element to listen to
* @param {callable} [callback] - Function to fire on event
* @returns {Element} - The original element to allow for chaining
*/
static off(element, event, delegate, callback) {
if (typeof element == "string") return this.__offAll(element);
const [type, namespace] = event.split(".");
if (namespace) return this.__offAll(event, element);
const hasDelegate = delegate && callback;
if (!callback) callback = delegate;
const eventFunc = !hasDelegate ? callback : function (event) {
if (event.target.matches(delegate)) {
callback(event);
}
};
element.removeEventListener(type, eventFunc);
return element;
}
/**
* Adds a listener for when the node is added/removed from the document body.
* The listener is automatically removed upon firing.
* @param {HTMLElement} node - node to wait for
* @param {callable} callback - function to be performed on event
* @param {boolean} onMount - determines if it should fire on Mount or on Unmount
*/
static onMountChange(node, callback, onMount = true) {
const wrappedCallback = () => {
this.observer.unsubscribe(wrappedCallback);
callback();
};
this.observer.subscribe(wrappedCallback, mutation => {
const nodes = Array.from(onMount ? mutation.addedNodes : mutation.removedNodes);
const directMatch = nodes.indexOf(node) > -1;
const parentMatch = nodes.some(parent => parent.contains(node));
return directMatch || parentMatch;
});
return node;
}
/** Shorthand for {@link module:DOMTools.onMountChange} with third parameter `true` */
static onMount(node, callback) {
return this.onMountChange(node, callback);
}
/** Shorthand for {@link module:DOMTools.onMountChange} with third parameter `false` */
static onUnmount(node, callback) {
return this.onMountChange(node, callback, false);
}
/** Alias for {@link module:DOMTools.onMount} */
static onAdded(node, callback) {
return this.onMount(node, callback);
}
/** Alias for {@link module:DOMTools.onUnmount} */
static onRemoved(node, callback) {
return this.onUnmount(node, callback, false);
}
/**
* Helper function which combines multiple elements into one parent element
* @param {Array<HTMLElement>} elements - array of elements to put into a single parent
*/
static wrap(elements) {
const domWrapper = this.parseHTML(`<div class="dom-wrapper"></div>`);
for (let e = 0; e < elements.length; e++) domWrapper.appendChild(elements[e]);
return domWrapper;
}
/**
* Resolves the node to an HTMLElement. This is mainly used by library modules.
* @param {(jQuery|Element)} node - node to resolve
*/
static resolveElement(node) {
if (!(node instanceof jQuery) && !(node instanceof Element)) return undefined;
return node instanceof jQuery ? node[0] : node;
}
}
window.Lightcord.BetterDiscord.DOM = DOMTools;
/***/ }),
/***/ "./src/modules/emojiModule.js":
/*!************************************!*\
!*** ./src/modules/emojiModule.js ***!
\************************************/
/*! exports provided: default */
/***/ (function(module, __webpack_exports__, __webpack_require__) {
"use strict";
__webpack_require__.r(__webpack_exports__);
/* harmony import */ var _0globals__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ../0globals */ "./src/0globals.js");
/* harmony import */ var _dataStore__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ./dataStore */ "./src/modules/dataStore.js");
/* harmony import */ var _v2__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! ./v2 */ "./src/modules/v2.js");
/* harmony import */ var _utils__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(/*! ./utils */ "./src/modules/utils.js");
//import DiscordCrypt from "./DiscordCrypt";
const Constants = {
EmojiRegex: /<a?\.(\w+)\.(\d+)>/g
};
let CustomEmojiModule = BDModules.get(e => e.CustomEmoji)[0];
let EmojiModuleApi = BDModules.get(e => e.default && e.default.getCustomEmojiById)[0];
let AutocompleteModule = BDModules.get(e => e.default && e.default.displayName === "Autocomplete")[0];
let AutoCompletionTemplates = BDModules.get(e => e.getAutocompleteOptions)[0];
let EmojiModuleQuery = BDModules.get(e => e.default && e.default.queryEmojiResults)[0];
let Messages = BDModules.get(e => e.default && e.default.Messages && e.default.Messages.EMOJI_MATCHING)[0];
let guildModule = BDModules.get(e => e.default && e.default.getGuild && e.default.getGuilds && !e.default.isFetching)[0];
let emojiSearch = BDModules.get(e => e.default && e.default.getDisambiguatedEmojiContext);
/* harmony default export */ __webpack_exports__["default"] = (new class EmojiModule {
constructor() {
this.init();
}
async init() {
/** Emoji AutoComplete */
if (!AutocompleteModule) AutocompleteModule = await window.Lightcord.Api.ensureExported(e => e.default && e.default.displayName === "Autocomplete");
if (!AutoCompletionTemplates) AutoCompletionTemplates = await window.Lightcord.Api.ensureExported(e => e.getAutocompleteOptions);
if (!EmojiModuleQuery) EmojiModuleQuery = await window.Lightcord.Api.ensureExported(e => e.default && e.default.queryEmojiResults);
if (!Messages) Messages = await window.Lightcord.Api.ensureExported(e => e.default && e.default.Messages && e.default.Messages.EMOJI_MATCHING);
if (!guildModule) guildModule = await window.Lightcord.Api.ensureExported(e => e.default && e.default.getGuild && e.default.getGuilds && !e.default.isFetching);
if (!emojiSearch) emojiSearch = await window.Lightcord.Api.ensureExported(e => e.default && e.default.getDisambiguatedEmojiContext);
if (AutocompleteModule && AutoCompletionTemplates && EmojiModuleQuery && Messages && guildModule && emojiSearch) {
console.log(`Patching getAutocompleteOptions of AutoCompletionTemplates`, AutoCompletionTemplates);
const getAutocompleteOptions = AutoCompletionTemplates.getAutocompleteOptions;
AutoCompletionTemplates.getAutocompleteOptions = function (e, t, n, r, a) {
const value = getAutocompleteOptions.call(this, ...arguments);
value.LIGHTCORD_EMOJIS = {
matches(arg1, arg2) {
let condition = arg2.length > 1 && "." === arg1;
setEmojiUsable(condition);
return condition;
},
queryResults(t) {
let results = EmojiModuleQuery.default.queryEmojiResults(t, e);
return results;
},
renderResults(e, t, n, r, a) {
return D(e, t, a.emojis, n, r, Messages.default.Messages.EMOJI_MATCHING, Messages.default.Messages.EMOJI, AutocompleteModule.default.Emoji, function (e) {
return {
emoji: e,
key: e.id || e.uniqueName || e.name,
sentinel: ".",
guild: null != e.guildId ? guildModule.default.getGuild(e.guildId) : null
};
}, function (e) {
return "." + e + ".";
});
},
getPlainText(id, guild) {
var emojis = guild.emojis;
if (null == emojis || null == emojis[id]) return "";
var emoji = emojis[id],
isAnimated = emoji.animated ? "a" : "";
return emoji.managed || null == emoji.id ? "." + emoji.name + "." : "<" + isAnimated + "." + (emoji.originalName || emoji.name) + "." + emoji.id + ">";
},
getRawText(id, guild) {
var emojis = guild.emojis;
if (null == emojis || null == emojis[id]) return "";
var emoji = emojis[id],
isAnimated = emoji.animated ? "a" : "";
return emoji.managed || null == emoji.id ? "." + emoji.name + "." : "<" + isAnimated + "." + (emoji.originalName || emoji.name) + "." + emoji.id + ">";
}
};
return value;
};
} else {
console.error(new Error("Couldn't start autocompletion of Lightcord's emojis."));
}
/** Emoji display */
while (!_v2__WEBPACK_IMPORTED_MODULE_2__["default"].MessageComponent) await new Promise(resolve => setTimeout(resolve, 100));
if (!this.cancelEmojiRender) {
this.cancelEmoteRender = _utils__WEBPACK_IMPORTED_MODULE_3__["default"].monkeyPatch(_v2__WEBPACK_IMPORTED_MODULE_2__["default"].MessageComponent, "default", {
before: data => {
const message = _utils__WEBPACK_IMPORTED_MODULE_3__["default"].getNestedProp(data.methodArguments[0], "childrenMessageContent.props.message");
if (!message) return;
const content = _utils__WEBPACK_IMPORTED_MODULE_3__["default"].getNestedProp(data.methodArguments[0], "childrenMessageContent.props.content");
if (!content || !content.length) return; // content = DiscordCrypt.decryptContent(content)
/**
* @type {{
* raw: string,
* name: string,
* id: string,
* animated: boolean
* }[]}
*/
let emojis = [];
const newContent = [];
for (let node of content) {
if (typeof node !== "string") {
newContent.push(node);
continue;
}
;
let parsed;
let hasParsed = false;
do {
parsed = Constants.EmojiRegex.exec(node);
if (parsed) {
hasParsed = true;
if (!EmojiModuleApi) EmojiModuleApi = BDModules.get(e => e.default && e.default.getCustomEmojiById)[0];
const emoji = EmojiModuleApi.default.getCustomEmojiById(parsed[2]);
if (emoji) {
emojis.push({
animated: emoji.animated,
name: emoji.name,
id: emoji.id,
raw: parsed[0]
});
} else {
emojis.push({
animated: parsed[0].startsWith("<a"),
name: parsed[1],
id: parsed[2],
raw: parsed[0]
});
}
}
} while (parsed);
if (hasParsed) {
const words = node.split(" ").map((word, index, arr) => {
if (!word) return "";
const emoji = emojis.find(e => e.raw == word);
if (!emoji) return word;
if (!CustomEmojiModule) CustomEmojiModule = BDModules.get(e => e.CustomEmoji)[0];
return React.createElement(CustomEmojiModule.CustomEmoji, {
emoji: {
name: `.${emoji.name}.`,
emojiId: emoji.id,
animated: emoji.animated,
jumboable: arr.length === 1 && content.length === 1
}
});
}).reduce((previous, current) => {
if (previous.length === 0) return [current];
if (typeof current === "string") {
if (typeof previous[previous.length - 1] === "string") {
previous[previous.length - 1] += ` ${current}`;
return previous;
}
previous.push(" " + current);
return previous;
}
previous.push(" ", current);
return previous;
}, []);
newContent.push(...words);
} else {
newContent.push(node);
}
}
while (data.methodArguments[0].childrenMessageContent.props.content[0]) {
data.methodArguments[0].childrenMessageContent.props.content.shift();
}
while (newContent[0]) {
data.methodArguments[0].childrenMessageContent.props.content.push(newContent.shift());
}
}
});
}
}
disable() {
if (!this.cancelEmoteRender) return;
this.cancelEmoteRender();
this.cancelEmoteRender = null;
}
start() {}
}());
function D(e, t, n, r, o, i, s, u, l, c) {
if (null == n || 0 === n.length) return null;
var d = n.map(function (e, n) {
return React.createElement(u, Object.assign({
onClick: o,
onHover: r,
selected: t === n,
index: n
}, l(e, n)));
});
return [R(i, s, e, c), d];
}
function R(e, t, n, r) {
var a = n.length > 0 ? e.format({
prefix: r(n)
}) : t;
if (Array.isArray(a)) {
a.unshift(React.createElement("strong", {}, "[Lightcord] "));
} else {
a = "[LIGHTCORD] " + a;
}
return React.createElement(AutocompleteModule.default.Title, {
title: a
}, a);
}
R.displayName = "renderHeader";
let EmojiFilterModule = BDModules.get(e => e.default && e.default.isEmojiDisabled)[0];
let isEmojiDisabled = EmojiFilterModule && EmojiFilterModule.default.isEmojiDisabled;
let isUsable = false;
let hasPatched = false;
function setEmojiUsable(usable) {
isUsable = usable;
if (hasPatched) return;
if (!EmojiFilterModule) EmojiFilterModule = BDModules.get(e => e.default && e.default.isEmojiDisabled)[0];
if (!EmojiFilterModule) return;
if (!isEmojiDisabled) isEmojiDisabled = EmojiFilterModule.default.isEmojiDisabled;
hasPatched = true;
EmojiFilterModule.default.isEmojiDisabled = function (emoji) {
if (isUsable) {
if (emoji.surrogates || emoji.diversity) return true;
return false;
}
return isEmojiDisabled.call(this, ...arguments);
};
}
/***/ }),
/***/ "./src/modules/pluginCertifier.js":
/*!****************************************!*\
!*** ./src/modules/pluginCertifier.js ***!
\****************************************/
/*! exports provided: default, checkViruses, checkHash, processFile, processAttachment */
/***/ (function(module, __webpack_exports__, __webpack_require__) {
"use strict";
__webpack_require__.r(__webpack_exports__);
/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "checkViruses", function() { return checkViruses; });
/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "checkHash", function() { return checkHash; });
/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "processFile", function() { return processFile; });
/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "processAttachment", function() { return processAttachment; });
/* harmony import */ var node_fetch__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! node-fetch */ "node-fetch");
/* harmony import */ var node_fetch__WEBPACK_IMPORTED_MODULE_0___default = /*#__PURE__*/__webpack_require__.n(node_fetch__WEBPACK_IMPORTED_MODULE_0__);
/* harmony import */ var electron__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! electron */ "electron");
/* harmony import */ var electron__WEBPACK_IMPORTED_MODULE_1___default = /*#__PURE__*/__webpack_require__.n(electron__WEBPACK_IMPORTED_MODULE_1__);
/* harmony import */ var crypto__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! crypto */ "crypto");
/* harmony import */ var crypto__WEBPACK_IMPORTED_MODULE_2___default = /*#__PURE__*/__webpack_require__.n(crypto__WEBPACK_IMPORTED_MODULE_2__);
/* harmony import */ var _v2__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(/*! ./v2 */ "./src/modules/v2.js");
/* harmony import */ var _ui_tooltipWrap__WEBPACK_IMPORTED_MODULE_4__ = __webpack_require__(/*! ../ui/tooltipWrap */ "./src/ui/tooltipWrap.js");
/* harmony import */ var _utils__WEBPACK_IMPORTED_MODULE_5__ = __webpack_require__(/*! ./utils */ "./src/modules/utils.js");
/* harmony import */ var fs__WEBPACK_IMPORTED_MODULE_6__ = __webpack_require__(/*! fs */ "fs");
/* harmony import */ var fs__WEBPACK_IMPORTED_MODULE_6___default = /*#__PURE__*/__webpack_require__.n(fs__WEBPACK_IMPORTED_MODULE_6__);
/* harmony import */ var path__WEBPACK_IMPORTED_MODULE_7__ = __webpack_require__(/*! path */ "path");
/* harmony import */ var path__WEBPACK_IMPORTED_MODULE_7___default = /*#__PURE__*/__webpack_require__.n(path__WEBPACK_IMPORTED_MODULE_7__);
const cache = {};
const cache2 = {};
/* harmony default export */ __webpack_exports__["default"] = (new class PluginCertifier {
constructor() {}
patch(attachment, id) {
process.nextTick(() => {
processAttachment(attachment, id);
});
}
start() {}
isTrusted(hash) {
return cache[hash] && !cache[hash].suspect;
}
}());
function checkViruses(hash, data, resultCallback, removeCallback) {
data = data.toString("utf8");
let isHarmful = false;
for (let keyword of data.split(/[^\w\d]+/g)) {
for (let oof of ["token", "email", "phone", "MFA", "2fa", "process", "child_process", "localStorage", "eval", "getGlobal", "BrowserWindow"]) {
if (keyword.toLowerCase().includes(oof.toLowerCase())) {
isHarmful = "token stealer/virus";
break;
}
}
if (isHarmful) break;
}
if (!isHarmful) {
/**
* @type {string}
*/
const no_comments = data.replace(/\/\*[\s\S]*?\*\/|([^\\:]|^)\/\/.*$/gm, "").trim(); // removing the META comment from plugins
if (/var [\w\d_$]+=\["/gi.test(no_comments)) {
isHarmful = "obfuscation/hidden code";
}
if (!isHarmful) {
const regexps = [
/** hexadecimal */
/_0x\w{4}\('0x[\dabcdef]+'\)/g, /_0x\w{4}\('0x[\dabcdef]+'[, ]+'[^']{4}'\)/g, // _0x8db7('0x0', 'x1]f')
/** mangled */
/\w+\('0x[\dabcdef]+'\)/g, // b('0x0')
/\w+\('0x[\dabcdef]+'[, ]+'[^']{4}'\)/g // b('0x0', 'x1]f')
];
for (let regex of regexps) {
if (isHarmful) break;
isHarmful = regex.test(no_comments) ? "obfuscation/hidden code" : false;
}
}
}
if (!isHarmful) return removeCallback();
cache[hash] = {
suspect: true,
name: hashToUrl[hash].split("/").pop(),
type: hashToUrl[hash].endsWith(".js") ? "Plugin" : "Theme",
harm: isHarmful
};
console.log(`Found potentially dangerous ${cache[hash].type.toLowerCase()}: ${cache[hash].name}`);
resultCallback(cache[hash]);
}
const hashToUrl = {};
function checkHash(hash, data, filename, resultCallback, removeCallback) {
console.log(`File: ${filename} hash: ${hash}`);
if (!cache[hash]) {
node_fetch__WEBPACK_IMPORTED_MODULE_0___default()("https://cdn.jsdelivr.net/gh/Lightcord/filehashes@master/hashes/" + hash, {
// Using node-fetch to bypass cors
headers: {
"User-Agent": electron__WEBPACK_IMPORTED_MODULE_1__["remote"].getCurrentWebContents().userAgent // have to set user-agent
}
}).then(async res => {
if (res.status !== 200) {
if (filename.endsWith(".theme.css")) return removeCallback();
checkViruses(hash, data, resultCallback, removeCallback);
return;
}
const result = await res.json();
cache[hash] = result;
resultCallback(result);
}).catch(console.error);
} else {
const result = cache[hash];
resultCallback(result);
}
}
function processFile(__path, resultCallback, removeCallback = () => {}) {
const hash = crypto__WEBPACK_IMPORTED_MODULE_2__["createHash"]("sha256");
let data = Buffer.alloc(0);
Object(fs__WEBPACK_IMPORTED_MODULE_6__["createReadStream"])(__path).on("data", chunk => {
data = Buffer.concat([data, chunk]);
hash.update(chunk);
}).on("end", () => {
const hashResult = hash.digest("hex");
hashToUrl[hashResult] = __path;
console.log(arguments);
checkHash(hashResult, data, Object(path__WEBPACK_IMPORTED_MODULE_7__["basename"])(__path), resultCallback, removeCallback);
});
}
function processAttachment(attachment, id) {
if (!document.getElementById(id)) return;
if (!attachment.url.startsWith("https://cdn.discordapp.com/")) return document.getElementById(id).remove();
if (!attachment.filename.endsWith(".plugin.js") && !attachment.filename.endsWith(".theme.css")) return document.getElementById(id).remove();
node_fetch__WEBPACK_IMPORTED_MODULE_0___default()(attachment.url, {
headers: {
"User-Agent": electron__WEBPACK_IMPORTED_MODULE_1__["remote"].getCurrentWebContents().userAgent
}
}).then(res => {
if (res.status !== 200) throw new Error("File doesn't exist.");
const hash = crypto__WEBPACK_IMPORTED_MODULE_2__["createHash"]("sha256");
let data = Buffer.alloc(0);
res.body.on("data", chunk => {
data = Buffer.concat([data, chunk]);
hash.update(chunk);
});
res.body.on("end", () => {
const hashResult = hash.digest("hex");
cache2[attachment.url] = hashResult;
hashToUrl[hashResult] = attachment.url;
checkHash(hashResult, data, attachment.filename, result => {
renderToElements(id, result, attachment.filename);
}, () => {
let elem = document.getElementById(id);
if (elem) elem.remove();
});
});
}).catch(() => {});
}
let flowerStarModule = BDModules.get(e => e.flowerStarContainer)[0];
let childModule = BDModules.get(e => e.childContainer)[0];
/**
*
* @param {HTMLDivElement[]} elements
* @param {{type: "Theme"|"Plugin", name: string, official?: boolean}|{suspect:true, type: "Theme"|"Plugin", name: string, harm: string}} result
*/
function renderToElements(id, result, filename) {
const div = document.getElementById(id);
if (!div || div.childNodes.length > 0) return; // already certified/div does not exist anymore.
if (!flowerStarModule) flowerStarModule = BDModules.get(e => e.flowerStarContainer)[0];
if (!childModule) childModule = BDModules.get(e => e.childContainer)[0];
console.log(result);
if (result.suspect) {
try {
div.parentNode.style.borderColor = "rgb(240, 71, 71)";
/**
*
* @param {HTMLElement} node
*/
let nextNode = node => {
for (let child of node.children) {
if (child.tagName === "A") {
child.addEventListener("click", e => {
e.preventDefault();
e.stopImmediatePropagation();
_utils__WEBPACK_IMPORTED_MODULE_5__["default"].showConfirmationModal("Are you sure you want to download this ?", "The " + result.type.toLowerCase() + " **" + filename + "** might be dangerous **(" + result.harm + ")**. \n\n**We don't recommand to download it**. However, you can still do it below.", {
confirmText: "Download Anyway",
cancelText: "Don't !",
danger: true,
onCancel: () => {},
onConfirm: () => {
electron__WEBPACK_IMPORTED_MODULE_1__["remote"].shell.openExternal(child.href);
}
});
});
} else if (["div"].includes(child.tagName.toLowerCase())) {
nextNode(child);
}
}
};
nextNode(div.parentNode);
} catch (e) {
console.error(e);
}
_v2__WEBPACK_IMPORTED_MODULE_3__["default"].reactDom.render(_v2__WEBPACK_IMPORTED_MODULE_3__["default"].react.createElement(_ui_tooltipWrap__WEBPACK_IMPORTED_MODULE_4__["default"], {
text: result.type + " " + result.name + " is potentially dangerous."
}, _v2__WEBPACK_IMPORTED_MODULE_3__["default"].react.createElement("div", {
className: flowerStarModule.flowerStarContainer,
style: {
width: "16px",
height: "16px"
}
}, _v2__WEBPACK_IMPORTED_MODULE_3__["default"].react.createElement("svg", {
className: BDModules.get(e => e.svg)[0].svg,
"aria-hidden": "false",
width: "16px",
height: "16px",
viewBox: "0 0 40 32"
}, _v2__WEBPACK_IMPORTED_MODULE_3__["default"].react.createElement("rect", {
x: "0",
y: "0",
width: "32",
height: "32",
mask: "url(#svg-mask-avatar-status-round-32)",
fill: "#f04747",
mask: "url(#svg-mask-status-dnd)",
className: BDModules.get(e => e.pointerEvents)[0].pointerEvents
})))), div);
} else if (!result.official) {
div.parentNode.style.borderColor = "#4087ed";
_v2__WEBPACK_IMPORTED_MODULE_3__["default"].reactDom.render(_v2__WEBPACK_IMPORTED_MODULE_3__["default"].react.createElement(_ui_tooltipWrap__WEBPACK_IMPORTED_MODULE_4__["default"], {
text: result.type + " " + result.name + " is certified by Lightcord."
}, _v2__WEBPACK_IMPORTED_MODULE_3__["default"].react.createElement("div", {
className: flowerStarModule.flowerStarContainer,
style: {
width: "16px",
height: "16px"
}
}, _v2__WEBPACK_IMPORTED_MODULE_3__["default"].react.createElement("svg", {
className: flowerStarModule.flowerStar,
"aria-hidden": "false",
width: "16px",
height: "16px",
viewBox: "0 0 16 15.2"
}, _v2__WEBPACK_IMPORTED_MODULE_3__["default"].react.createElement("path", {
fill: "#4f545c",
"fill-rule": "evenodd",
d: "m16 7.6c0 .79-1.28 1.38-1.52 2.09s.44 2 0 2.59-1.84.35-2.46.8-.79 1.84-1.54 2.09-1.67-.8-2.47-.8-1.75 1-2.47.8-.92-1.64-1.54-2.09-2-.18-2.46-.8.23-1.84 0-2.59-1.54-1.3-1.54-2.09 1.28-1.38 1.52-2.09-.44-2 0-2.59 1.85-.35 2.48-.8.78-1.84 1.53-2.12 1.67.83 2.47.83 1.75-1 2.47-.8.91 1.64 1.53 2.09 2 .18 2.46.8-.23 1.84 0 2.59 1.54 1.3 1.54 2.09z"
})), _v2__WEBPACK_IMPORTED_MODULE_3__["default"].react.createElement("div", {
className: childModule.childContainer
}, _v2__WEBPACK_IMPORTED_MODULE_3__["default"].react.createElement("svg", {
"aria-hidden": "false",
width: "16px",
height: "16px",
viewBox: "0 0 16 15.2"
}, _v2__WEBPACK_IMPORTED_MODULE_3__["default"].react.createElement("path", {
fill: "#ffffff",
d: "M7.4,11.17,4,8.62,5,7.26l2,1.53L10.64,4l1.36,1Z"
}))))), div);
} else {
div.parentNode.style.borderColor = "#4087ed";
_v2__WEBPACK_IMPORTED_MODULE_3__["default"].reactDom.render(_v2__WEBPACK_IMPORTED_MODULE_3__["default"].react.createElement(_ui_tooltipWrap__WEBPACK_IMPORTED_MODULE_4__["default"], {
text: result.type + " " + result.name + " was made by the developers of Lightcord.",
style: "brand"
}, _v2__WEBPACK_IMPORTED_MODULE_3__["default"].react.createElement("div", {
className: flowerStarModule.flowerStarContainer,
style: {
width: "16px",
height: "16px"
}
}, _v2__WEBPACK_IMPORTED_MODULE_3__["default"].react.createElement("svg", {
className: flowerStarModule.flowerStar,
"aria-hidden": "false",
width: "16px",
height: "16px",
viewBox: "0 0 16 15.2",
stroke: "#36393f",
style: {
color: "#4087ed"
}
}, _v2__WEBPACK_IMPORTED_MODULE_3__["default"].react.createElement("path", {
fill: "currentColor",
"fill-rule": "evenodd",
d: "m16 7.6c0 .79-1.28 1.38-1.52 2.09s.44 2 0 2.59-1.84.35-2.46.8-.79 1.84-1.54 2.09-1.67-.8-2.47-.8-1.75 1-2.47.8-.92-1.64-1.54-2.09-2-.18-2.46-.8.23-1.84 0-2.59-1.54-1.3-1.54-2.09 1.28-1.38 1.52-2.09-.44-2 0-2.59 1.85-.35 2.48-.8.78-1.84 1.53-2.12 1.67.83 2.47.83 1.75-1 2.47-.8.91 1.64 1.53 2.09 2 .18 2.46.8-.23 1.84 0 2.59 1.54 1.3 1.54 2.09z"
})), _v2__WEBPACK_IMPORTED_MODULE_3__["default"].react.createElement("div", {
className: childModule.childContainer
}, _v2__WEBPACK_IMPORTED_MODULE_3__["default"].react.createElement("svg", {
"aria-hidden": "false",
width: "16px",
height: "16px",
viewBox: "0 0 16 15.2"
}, _v2__WEBPACK_IMPORTED_MODULE_3__["default"].react.createElement("path", {
fill: "#ffffff",
d: "M10.7,5.28a2.9,2.9,0,0,0-2.11.86.11.11,0,0,0,0,.16l1.05.94a.11.11,0,0,0,.15,0,1.27,1.27,0,0,1,.9-.33c.65,0,.65.73.65.73a.64.64,0,0,1-.65.65,1.73,1.73,0,0,1-1.18-.54c-.31-.26-.36-.32-.73-.66S7.06,5.28,5.65,5.28A2.26,2.26,0,0,0,3.37,7.56,2.59,2.59,0,0,0,3.82,9a2.18,2.18,0,0,0,1.83.89,2.94,2.94,0,0,0,2.1-.81.11.11,0,0,0,0-.16L6.74,8A.11.11,0,0,0,6.6,8a1.58,1.58,0,0,1-.94.29h0A.71.71,0,0,1,5,7.56H5a.63.63,0,0,1,.65-.64c.71,0,1.42.75,1.94,1.27.75.76,1.66,1.79,3.11,1.74A2.28,2.28,0,0,0,13,7.64a2.59,2.59,0,0,0-.45-1.47A2.14,2.14,0,0,0,10.7,5.28Z"
}))))), div);
}
}
/***/ }),
/***/ "./src/modules/pluginModule.js":
/*!*************************************!*\
!*** ./src/modules/pluginModule.js ***!
\*************************************/
/*! exports provided: default */
/***/ (function(module, __webpack_exports__, __webpack_require__) {
"use strict";
__webpack_require__.r(__webpack_exports__);
/* harmony import */ var _0globals__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ../0globals */ "./src/0globals.js");
/* harmony import */ var _contentManager__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ./contentManager */ "./src/modules/contentManager.js");
/* harmony import */ var _dataStore__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! ./dataStore */ "./src/modules/dataStore.js");
/* harmony import */ var _bdEvents__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(/*! ./bdEvents */ "./src/modules/bdEvents.js");
/* harmony import */ var _utils__WEBPACK_IMPORTED_MODULE_4__ = __webpack_require__(/*! ./utils */ "./src/modules/utils.js");
class PluginModule {
get folder() {
return _contentManager__WEBPACK_IMPORTED_MODULE_1__["default"].pluginsFolder;
}
}
PluginModule.prototype.loadPlugins = async function () {
this.loadPluginData();
_0globals__WEBPACK_IMPORTED_MODULE_0__["bdpluginErrors"].splice(0, 0, ...(await _contentManager__WEBPACK_IMPORTED_MODULE_1__["default"].loadPlugins()));
const plugins = Object.keys(_0globals__WEBPACK_IMPORTED_MODULE_0__["bdplugins"]);
for (let i = 0; i < plugins.length; i++) {
let plugin, name;
try {
plugin = _0globals__WEBPACK_IMPORTED_MODULE_0__["bdplugins"][plugins[i]].plugin;
name = plugin.getName();
if (plugin.load && typeof plugin.load == "function") plugin.load();
} catch (err) {
_0globals__WEBPACK_IMPORTED_MODULE_0__["pluginCookie"][name] = false;
_utils__WEBPACK_IMPORTED_MODULE_4__["default"].err("Plugins", name + " could not be loaded.", err);
_0globals__WEBPACK_IMPORTED_MODULE_0__["bdpluginErrors"].push({
name: name,
file: _0globals__WEBPACK_IMPORTED_MODULE_0__["bdplugins"][plugins[i]].filename,
message: "load() could not be fired.",
error: {
message: err.message,
stack: err.stack
}
});
continue;
}
if (!_0globals__WEBPACK_IMPORTED_MODULE_0__["pluginCookie"][name]) _0globals__WEBPACK_IMPORTED_MODULE_0__["pluginCookie"][name] = false;
if (_0globals__WEBPACK_IMPORTED_MODULE_0__["pluginCookie"][name]) {
try {
plugin.start();
if (_0globals__WEBPACK_IMPORTED_MODULE_0__["settingsCookie"]["fork-ps-2"]) _utils__WEBPACK_IMPORTED_MODULE_4__["default"].showToast(`${plugin.getName()} v${plugin.getVersion()} has started.`);
} catch (err) {
_0globals__WEBPACK_IMPORTED_MODULE_0__["pluginCookie"][name] = false;
_utils__WEBPACK_IMPORTED_MODULE_4__["default"].err("Plugins", name + " could not be started.", err);
_0globals__WEBPACK_IMPORTED_MODULE_0__["bdpluginErrors"].push({
name: name,
file: _0globals__WEBPACK_IMPORTED_MODULE_0__["bdplugins"][plugins[i]].filename,
message: "start() could not be fired.",
error: {
message: err.message,
stack: err.stack
}
});
}
}
await new Promise(resolve => setTimeout(resolve, 10));
}
this.savePluginData();
__webpack_require__(/*! electron */ "electron").remote.getCurrentWebContents().on("did-navigate-in-page", this.channelSwitch.bind(this)); // if (settingsCookie["fork-ps-5"]) ContentManager.watchContent("plugin");
};
PluginModule.prototype.startPlugin = function (plugin, reload = false) {
try {
_0globals__WEBPACK_IMPORTED_MODULE_0__["bdplugins"][plugin].plugin.start();
if (_0globals__WEBPACK_IMPORTED_MODULE_0__["settingsCookie"]["fork-ps-2"] && !reload) _utils__WEBPACK_IMPORTED_MODULE_4__["default"].showToast(`${_0globals__WEBPACK_IMPORTED_MODULE_0__["bdplugins"][plugin].plugin.getName()} v${_0globals__WEBPACK_IMPORTED_MODULE_0__["bdplugins"][plugin].plugin.getVersion()} has started.`);
} catch (err) {
if (_0globals__WEBPACK_IMPORTED_MODULE_0__["settingsCookie"]["fork-ps-2"] && !reload) _utils__WEBPACK_IMPORTED_MODULE_4__["default"].showToast(`${_0globals__WEBPACK_IMPORTED_MODULE_0__["bdplugins"][plugin].plugin.getName()} v${_0globals__WEBPACK_IMPORTED_MODULE_0__["bdplugins"][plugin].plugin.getVersion()} could not be started.`, {
type: "error"
});
_0globals__WEBPACK_IMPORTED_MODULE_0__["pluginCookie"][plugin] = false;
this.savePluginData();
_utils__WEBPACK_IMPORTED_MODULE_4__["default"].err("Plugins", plugin + " could not be started.", err);
}
};
PluginModule.prototype.stopPlugin = function (plugin, reload = false) {
try {
_0globals__WEBPACK_IMPORTED_MODULE_0__["bdplugins"][plugin].plugin.stop();
if (_0globals__WEBPACK_IMPORTED_MODULE_0__["settingsCookie"]["fork-ps-2"] && !reload) _utils__WEBPACK_IMPORTED_MODULE_4__["default"].showToast(`${_0globals__WEBPACK_IMPORTED_MODULE_0__["bdplugins"][plugin].plugin.getName()} v${_0globals__WEBPACK_IMPORTED_MODULE_0__["bdplugins"][plugin].plugin.getVersion()} has stopped.`);
} catch (err) {
if (_0globals__WEBPACK_IMPORTED_MODULE_0__["settingsCookie"]["fork-ps-2"] && !reload) _utils__WEBPACK_IMPORTED_MODULE_4__["default"].showToast(`${_0globals__WEBPACK_IMPORTED_MODULE_0__["bdplugins"][plugin].plugin.getName()} v${_0globals__WEBPACK_IMPORTED_MODULE_0__["bdplugins"][plugin].plugin.getVersion()} could not be stopped.`, {
type: "error"
});
_utils__WEBPACK_IMPORTED_MODULE_4__["default"].err("Plugins", _0globals__WEBPACK_IMPORTED_MODULE_0__["bdplugins"][plugin].plugin.getName() + " could not be stopped.", err);
}
};
PluginModule.prototype.enablePlugin = function (plugin, reload = false) {
if (_0globals__WEBPACK_IMPORTED_MODULE_0__["pluginCookie"][plugin]) return;
_0globals__WEBPACK_IMPORTED_MODULE_0__["pluginCookie"][plugin] = true;
this.savePluginData();
this.startPlugin(plugin, reload);
};
PluginModule.prototype.enable = function (plugin, reload = false) {
return this.enablePlugin(plugin, reload);
};
PluginModule.prototype.disablePlugin = function (plugin, reload = false) {
if (!_0globals__WEBPACK_IMPORTED_MODULE_0__["pluginCookie"][plugin]) return;
_0globals__WEBPACK_IMPORTED_MODULE_0__["pluginCookie"][plugin] = false;
this.savePluginData();
this.stopPlugin(plugin, reload);
};
PluginModule.prototype.disable = function (plugin, reload = false) {
return this.disablePlugin(plugin, reload);
};
PluginModule.prototype.togglePlugin = function (plugin) {
if (_0globals__WEBPACK_IMPORTED_MODULE_0__["pluginCookie"][plugin]) this.disablePlugin(plugin);else this.enablePlugin(plugin);
};
PluginModule.prototype.toggle = function (plugin, reload = false) {
return this.togglePlugin(plugin, reload);
};
PluginModule.prototype.loadPlugin = async function (filename) {
const error = await _contentManager__WEBPACK_IMPORTED_MODULE_1__["default"].loadContent(filename, "plugin");
if (error) {
if (_0globals__WEBPACK_IMPORTED_MODULE_0__["settingsCookie"]["fork-ps-1"]) _utils__WEBPACK_IMPORTED_MODULE_4__["default"].showContentErrors({
plugins: [error]
});
if (_0globals__WEBPACK_IMPORTED_MODULE_0__["settingsCookie"]["fork-ps-2"]) _utils__WEBPACK_IMPORTED_MODULE_4__["default"].showToast(`${filename} could not be loaded.`, {
type: "error"
});
return _utils__WEBPACK_IMPORTED_MODULE_4__["default"].err("ContentManager", `${filename} could not be loaded.`, error);
}
const plugin = Object.values(_0globals__WEBPACK_IMPORTED_MODULE_0__["bdplugins"]).find(p => console.log(p.filename, filename) || p.filename == filename).plugin;
try {
if (plugin.load && typeof plugin.load == "function") plugin.load();
} catch (err) {
if (_0globals__WEBPACK_IMPORTED_MODULE_0__["settingsCookie"]["fork-ps-1"]) _utils__WEBPACK_IMPORTED_MODULE_4__["default"].showContentErrors({
plugins: [err]
});
}
_utils__WEBPACK_IMPORTED_MODULE_4__["default"].log("ContentManager", `${plugin.getName()} v${plugin.getVersion()} was loaded.`);
if (_0globals__WEBPACK_IMPORTED_MODULE_0__["settingsCookie"]["fork-ps-2"]) _utils__WEBPACK_IMPORTED_MODULE_4__["default"].showToast(`${plugin.getName()} v${plugin.getVersion()} was loaded.`, {
type: "success"
});
_bdEvents__WEBPACK_IMPORTED_MODULE_3__["default"].dispatch("plugin-loaded", plugin.getName());
};
PluginModule.prototype.unloadPlugin = function (filenameOrName) {
const bdplugin = Object.values(_0globals__WEBPACK_IMPORTED_MODULE_0__["bdplugins"]).find(p => p.filename == filenameOrName) || _0globals__WEBPACK_IMPORTED_MODULE_0__["bdplugins"][filenameOrName];
if (!bdplugin) return;
const plugin = bdplugin.plugin.getName();
if (_0globals__WEBPACK_IMPORTED_MODULE_0__["pluginCookie"][plugin]) this.disablePlugin(plugin, true);
const error = _contentManager__WEBPACK_IMPORTED_MODULE_1__["default"].unloadContent(_0globals__WEBPACK_IMPORTED_MODULE_0__["bdplugins"][plugin].filename, "plugin");
delete _0globals__WEBPACK_IMPORTED_MODULE_0__["bdplugins"][plugin];
if (error) {
if (_0globals__WEBPACK_IMPORTED_MODULE_0__["settingsCookie"]["fork-ps-1"]) _utils__WEBPACK_IMPORTED_MODULE_4__["default"].showContentErrors({
plugins: [error]
});
if (_0globals__WEBPACK_IMPORTED_MODULE_0__["settingsCookie"]["fork-ps-2"]) _utils__WEBPACK_IMPORTED_MODULE_4__["default"].showToast(`${plugin} could not be unloaded. It may have not been loaded yet.`, {
type: "error"
});
return _utils__WEBPACK_IMPORTED_MODULE_4__["default"].err("ContentManager", `${plugin} could not be unloaded. It may have not been loaded yet.`, error);
}
_utils__WEBPACK_IMPORTED_MODULE_4__["default"].log("ContentManager", `${plugin} was unloaded.`);
if (_0globals__WEBPACK_IMPORTED_MODULE_0__["settingsCookie"]["fork-ps-2"]) _utils__WEBPACK_IMPORTED_MODULE_4__["default"].showToast(`${plugin} was unloaded.`, {
type: "success"
});
_bdEvents__WEBPACK_IMPORTED_MODULE_3__["default"].dispatch("plugin-unloaded", plugin);
};
PluginModule.prototype.delete = function (filenameOrName) {
const bdplugin = Object.values(_0globals__WEBPACK_IMPORTED_MODULE_0__["bdplugins"]).find(p => p.filename == filenameOrName) || _0globals__WEBPACK_IMPORTED_MODULE_0__["bdplugins"][filenameOrName];
if (!bdplugin) return;
this.unloadPlugin(bdplugin.filename);
const fullPath = __webpack_require__(/*! path */ "path").resolve(_contentManager__WEBPACK_IMPORTED_MODULE_1__["default"].pluginsFolder, bdplugin.filename);
__webpack_require__(/*! fs */ "fs").unlinkSync(fullPath);
};
PluginModule.prototype.reloadPlugin = async function (filenameOrName) {
const bdplugin = Object.values(_0globals__WEBPACK_IMPORTED_MODULE_0__["bdplugins"]).find(p => p.filename == filenameOrName) || _0globals__WEBPACK_IMPORTED_MODULE_0__["bdplugins"][filenameOrName];
if (!bdplugin) return this.loadPlugin(filenameOrName);
const plugin = bdplugin.plugin.getName();
const enabled = _0globals__WEBPACK_IMPORTED_MODULE_0__["pluginCookie"][plugin];
if (enabled) this.stopPlugin(plugin, true);
const error = await _contentManager__WEBPACK_IMPORTED_MODULE_1__["default"].reloadContent(_0globals__WEBPACK_IMPORTED_MODULE_0__["bdplugins"][plugin].filename, "plugin");
if (error) {
if (_0globals__WEBPACK_IMPORTED_MODULE_0__["settingsCookie"]["fork-ps-1"]) _utils__WEBPACK_IMPORTED_MODULE_4__["default"].showContentErrors({
plugins: [error]
});
if (_0globals__WEBPACK_IMPORTED_MODULE_0__["settingsCookie"]["fork-ps-2"]) _utils__WEBPACK_IMPORTED_MODULE_4__["default"].showToast(`${plugin} could not be reloaded.`, {
type: "error"
});
return _utils__WEBPACK_IMPORTED_MODULE_4__["default"].err("ContentManager", `${plugin} could not be reloaded.`, error);
}
if (_0globals__WEBPACK_IMPORTED_MODULE_0__["bdplugins"][plugin].plugin.load && typeof _0globals__WEBPACK_IMPORTED_MODULE_0__["bdplugins"][plugin].plugin.load == "function") _0globals__WEBPACK_IMPORTED_MODULE_0__["bdplugins"][plugin].plugin.load();
if (enabled) this.startPlugin(plugin, true);
_utils__WEBPACK_IMPORTED_MODULE_4__["default"].log("ContentManager", `${plugin} v${_0globals__WEBPACK_IMPORTED_MODULE_0__["bdplugins"][plugin].plugin.getVersion()} was reloaded.`);
if (_0globals__WEBPACK_IMPORTED_MODULE_0__["settingsCookie"]["fork-ps-2"]) _utils__WEBPACK_IMPORTED_MODULE_4__["default"].showToast(`${plugin} v${_0globals__WEBPACK_IMPORTED_MODULE_0__["bdplugins"][plugin].plugin.getVersion()} was reloaded.`, {
type: "success"
});
_bdEvents__WEBPACK_IMPORTED_MODULE_3__["default"].dispatch("plugin-reloaded", plugin);
};
PluginModule.prototype.reload = function (name) {
return this.reloadPlugin(name);
};
PluginModule.prototype.edit = function (filenameOrName) {
console.log("Edit " + filenameOrName);
const bdplugin = Object.values(_0globals__WEBPACK_IMPORTED_MODULE_0__["bdplugins"]).find(p => p.filename == filenameOrName) || _0globals__WEBPACK_IMPORTED_MODULE_0__["bdplugins"][filenameOrName];
if (!bdplugin) return;
const fullPath = __webpack_require__(/*! path */ "path").resolve(_contentManager__WEBPACK_IMPORTED_MODULE_1__["default"].pluginsFolder, bdplugin.filename);
console.log("Edit " + fullPath);
__webpack_require__(/*! electron */ "electron").shell.openItem(`${fullPath}`);
};
PluginModule.prototype.updatePluginList = function () {
const results = _contentManager__WEBPACK_IMPORTED_MODULE_1__["default"].loadNewContent("plugin");
for (const filename of results.added) this.loadPlugin(filename);
for (const name of results.removed) this.unloadPlugin(name);
};
PluginModule.prototype.loadPluginData = function () {
const saved = _dataStore__WEBPACK_IMPORTED_MODULE_2__["default"].getSettingGroup("plugins");
if (saved) {
Object.assign(_0globals__WEBPACK_IMPORTED_MODULE_0__["pluginCookie"], saved);
}
};
PluginModule.prototype.savePluginData = function () {
_dataStore__WEBPACK_IMPORTED_MODULE_2__["default"].setSettingGroup("plugins", _0globals__WEBPACK_IMPORTED_MODULE_0__["pluginCookie"]);
};
PluginModule.prototype.newMessage = function () {
const plugins = Object.keys(_0globals__WEBPACK_IMPORTED_MODULE_0__["bdplugins"]);
for (let i = 0; i < plugins.length; i++) {
const plugin = _0globals__WEBPACK_IMPORTED_MODULE_0__["bdplugins"][plugins[i]].plugin;
if (!_0globals__WEBPACK_IMPORTED_MODULE_0__["pluginCookie"][plugin.getName()]) continue;
if (typeof plugin.onMessage === "function") {
try {
plugin.onMessage();
} catch (err) {
_utils__WEBPACK_IMPORTED_MODULE_4__["default"].err("Plugins", "Unable to fire onMessage for " + plugin.getName() + ".", err);
}
}
}
};
PluginModule.prototype.channelSwitch = function () {
const plugins = Object.keys(_0globals__WEBPACK_IMPORTED_MODULE_0__["bdplugins"]);
for (let i = 0; i < plugins.length; i++) {
const plugin = _0globals__WEBPACK_IMPORTED_MODULE_0__["bdplugins"][plugins[i]].plugin;
if (!_0globals__WEBPACK_IMPORTED_MODULE_0__["pluginCookie"][plugin.getName()]) continue;
if (typeof plugin.onSwitch === "function") {
try {
plugin.onSwitch();
} catch (err) {
_utils__WEBPACK_IMPORTED_MODULE_4__["default"].err("Plugins", "Unable to fire onSwitch for " + plugin.getName() + ".", err);
}
}
}
};
PluginModule.prototype.rawObserver = function (e) {
const plugins = Object.keys(_0globals__WEBPACK_IMPORTED_MODULE_0__["bdplugins"]);
for (let i = 0; i < plugins.length; i++) {
const plugin = _0globals__WEBPACK_IMPORTED_MODULE_0__["bdplugins"][plugins[i]].plugin;
if (!_0globals__WEBPACK_IMPORTED_MODULE_0__["pluginCookie"][plugin.getName()]) continue;
if (typeof plugin.observer === "function") {
try {
plugin.observer(e);
} catch (err) {
_utils__WEBPACK_IMPORTED_MODULE_4__["default"].err("Plugins", "Unable to fire observer for " + plugin.getName() + ".", err);
}
}
}
};
/* harmony default export */ __webpack_exports__["default"] = (new PluginModule());
/***/ }),
/***/ "./src/modules/publicServers.js":
/*!**************************************!*\
!*** ./src/modules/publicServers.js ***!
\**************************************/
/*! exports provided: default */
/***/ (function(module, __webpack_exports__, __webpack_require__) {
"use strict";
__webpack_require__.r(__webpack_exports__);
/* harmony import */ var _0globals__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ../0globals */ "./src/0globals.js");
/* harmony import */ var _v2__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ./v2 */ "./src/modules/v2.js");
/* harmony import */ var _webpackModules__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! ./webpackModules */ "./src/modules/webpackModules.js");
/* harmony import */ var _utils__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(/*! ./utils */ "./src/modules/utils.js");
/* harmony import */ var _domtools__WEBPACK_IMPORTED_MODULE_4__ = __webpack_require__(/*! ./domtools */ "./src/modules/domtools.js");
/* harmony import */ var _ui_publicservers_publicServers__WEBPACK_IMPORTED_MODULE_5__ = __webpack_require__(/*! ../ui/publicservers/publicServers */ "./src/ui/publicservers/publicServers.js");
/* harmony import */ var _ui_publicservers_layer__WEBPACK_IMPORTED_MODULE_6__ = __webpack_require__(/*! ../ui/publicservers/layer */ "./src/ui/publicservers/layer.js");
/* harmony default export */ __webpack_exports__["default"] = (new class V2_PublicServers {
constructor() {
this._appendButton = this._appendButton.bind(this);
}
get component() {
return _v2__WEBPACK_IMPORTED_MODULE_1__["default"].react.createElement(_ui_publicservers_layer__WEBPACK_IMPORTED_MODULE_6__["default"], {
rootId: "pubslayerroot",
id: "pubslayer"
}, _v2__WEBPACK_IMPORTED_MODULE_1__["default"].react.createElement(_ui_publicservers_publicServers__WEBPACK_IMPORTED_MODULE_5__["default"], {
rootId: "pubslayerroot"
}));
}
get root() {
const _root = document.getElementById("pubslayerroot");
if (!_root) {
if (!this.injectRoot()) return null;
return this.root;
}
return _root;
}
injectRoot() {
let [classNameLayers] = [BDModules.get(e => e.layers && e.layer)[0].layers.split(" ")[0]];
const layers = _domtools__WEBPACK_IMPORTED_MODULE_4__["default"].query(".layers, ." + classNameLayers);
if (!layers) return false;
layers.append(_domtools__WEBPACK_IMPORTED_MODULE_4__["default"].createElement("<div id='pubslayerroot'>"));
return true;
}
render() {
const root = this.root;
if (!root) {
console.log("FAILED TO LOCATE ROOT: .layers");
return;
}
_v2__WEBPACK_IMPORTED_MODULE_1__["default"].reactDom.render(this.component, root);
}
get button() {
const btn = _domtools__WEBPACK_IMPORTED_MODULE_4__["default"].createElement(`<div id="bd-pub-li" class="${_v2__WEBPACK_IMPORTED_MODULE_1__["default"].guildClasses.listItem}">`);
if (!_0globals__WEBPACK_IMPORTED_MODULE_0__["settingsCookie"]["bda-gs-1"]) btn.style.display = "none";
const label = _domtools__WEBPACK_IMPORTED_MODULE_4__["default"].createElement(`<div id="bd-pub-button" class="${"wrapper-25eVIn " + _v2__WEBPACK_IMPORTED_MODULE_1__["default"].guildClasses.circleButtonMask}">public</div>`);
label.addEventListener("click", () => {
this.render();
});
btn.append(label);
return btn;
}
_appendButton() {
let [classNameScroller] = [BDModules.get(e => e.scroller && e.scrollbarWidth)[0].scroller];
if (_domtools__WEBPACK_IMPORTED_MODULE_4__["default"].query("#bd-pub-li")) return;
const wrapper = _v2__WEBPACK_IMPORTED_MODULE_1__["default"].guildClasses.wrapper.split(" ")[0];
const guilds = _domtools__WEBPACK_IMPORTED_MODULE_4__["default"].query(`.${wrapper} .${classNameScroller} >:first-child`);
_domtools__WEBPACK_IMPORTED_MODULE_4__["default"].after(guilds, this.button);
}
addButton() {
if (this.guildPatch) return;
const GuildList = _webpackModules__WEBPACK_IMPORTED_MODULE_2__["default"].find(m => m.default && m.default.displayName == "NavigableGuilds");
const GuildListOld = _webpackModules__WEBPACK_IMPORTED_MODULE_2__["default"].findByDisplayName("Guilds");
if (!GuildList && !GuildListOld) _utils__WEBPACK_IMPORTED_MODULE_3__["default"].warn("PublicServer", "Can't find GuildList component");
this.guildPatch = _utils__WEBPACK_IMPORTED_MODULE_3__["default"].monkeyPatch(GuildList ? GuildList : GuildListOld.prototype, GuildList ? "default" : "render", {
after: this._appendButton
});
this._appendButton();
}
removeButton() {
this.guildPatch();
delete this.guildPatch;
_domtools__WEBPACK_IMPORTED_MODULE_4__["default"].query("#bd-pub-li").remove();
}
}());
/***/ }),
/***/ "./src/modules/reactDevTools.js":
/*!**************************************!*\
!*** ./src/modules/reactDevTools.js ***!
\**************************************/
/*! exports provided: default */
/***/ (function(module, __webpack_exports__, __webpack_require__) {
"use strict";
__webpack_require__.r(__webpack_exports__);
/* harmony import */ var _utils__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ./utils */ "./src/modules/utils.js");
/* harmony import */ var _0globals__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ../0globals */ "./src/0globals.js");
const electron = __webpack_require__(/*! electron */ "electron");
const fs = __webpack_require__(/*! fs */ "fs");
const path = __webpack_require__(/*! path */ "path");
const BrowserWindow = electron.remote.BrowserWindow;
const webContents = electron.remote.getCurrentWebContents();
/* harmony default export */ __webpack_exports__["default"] = (new class reactDevTools {
constructor() {
let extensionPath = "";
if (process.platform === "win32") extensionPath = path.resolve(process.env.LOCALAPPDATA, "Google/Chrome/User Data");else if (process.platform === "linux") extensionPath = path.resolve(process.env.HOME, ".config/google-chrome");else if (process.platform === "darwin") extensionPath = path.resolve(process.env.HOME, "Library/Application Support/Google/Chrome");else extensionPath = path.resolve(process.env.HOME, ".config/chromium");
extensionPath += "/Default/Extensions/fmkadmapgofadopljbjfkapdkoienihi/";
if (fs.existsSync(extensionPath)) {
const versions = fs.readdirSync(extensionPath);
extensionPath = path.resolve(extensionPath, versions[versions.length - 1]);
}
this.extensionPath = extensionPath;
this.isExtensionInstalled = fs.existsSync(extensionPath);
this.listener = this.listener.bind(this);
_0globals__WEBPACK_IMPORTED_MODULE_1__["settings"]["React DevTools"].hidden = !this.isExtensionInstalled;
}
listener() {
if (!this.isExtensionInstalled) return;
BrowserWindow.removeDevToolsExtension("React Developer Tools");
const didInstall = BrowserWindow.addDevToolsExtension(this.extensionPath);
if (didInstall) _utils__WEBPACK_IMPORTED_MODULE_0__["default"].log("React DevTools", "Successfully installed react devtools.");else _utils__WEBPACK_IMPORTED_MODULE_0__["default"].err("React DevTools", "Couldn't find react devtools in chrome extensions!");
}
start() {
setImmediate(() => webContents.on("devtools-opened", this.listener));
if (webContents.isDevToolsOpened()) this.listener();
}
stop() {
webContents.removeListener("devtools-opened", this.listener);
}
}());
/***/ }),
/***/ "./src/modules/settingsPanel.js":
/*!**************************************!*\
!*** ./src/modules/settingsPanel.js ***!
\**************************************/
/*! exports provided: default */
/***/ (function(module, __webpack_exports__, __webpack_require__) {
"use strict";
__webpack_require__.r(__webpack_exports__);
/* harmony import */ var _0globals__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ../0globals */ "./src/0globals.js");
/* harmony import */ var _dataStore__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ./dataStore */ "./src/modules/dataStore.js");
/* harmony import */ var _settingsPanelSidebar__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! ./settingsPanelSidebar */ "./src/modules/settingsPanelSidebar.js");
/* harmony import */ var _utils__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(/*! ./utils */ "./src/modules/utils.js");
/* harmony import */ var _v2__WEBPACK_IMPORTED_MODULE_4__ = __webpack_require__(/*! ./v2 */ "./src/modules/v2.js");
/* harmony import */ var _contentManager__WEBPACK_IMPORTED_MODULE_5__ = __webpack_require__(/*! ./contentManager */ "./src/modules/contentManager.js");
/* harmony import */ var _bdEvents__WEBPACK_IMPORTED_MODULE_6__ = __webpack_require__(/*! ./bdEvents */ "./src/modules/bdEvents.js");
/* harmony import */ var _coloredText__WEBPACK_IMPORTED_MODULE_7__ = __webpack_require__(/*! ./coloredText */ "./src/modules/coloredText.js");
/* harmony import */ var _24hour__WEBPACK_IMPORTED_MODULE_8__ = __webpack_require__(/*! ./24hour */ "./src/modules/24hour.js");
/* harmony import */ var _reactDevTools__WEBPACK_IMPORTED_MODULE_9__ = __webpack_require__(/*! ./reactDevTools */ "./src/modules/reactDevTools.js");
/* harmony import */ var _domtools__WEBPACK_IMPORTED_MODULE_10__ = __webpack_require__(/*! ./domtools */ "./src/modules/domtools.js");
/* harmony import */ var _publicServers__WEBPACK_IMPORTED_MODULE_11__ = __webpack_require__(/*! ./publicServers */ "./src/modules/publicServers.js");
/* harmony import */ var _voiceMode__WEBPACK_IMPORTED_MODULE_12__ = __webpack_require__(/*! ./voiceMode */ "./src/modules/voiceMode.js");
/* harmony import */ var _classNormalizer__WEBPACK_IMPORTED_MODULE_13__ = __webpack_require__(/*! ./classNormalizer */ "./src/modules/classNormalizer.js");
/* harmony import */ var _devMode__WEBPACK_IMPORTED_MODULE_14__ = __webpack_require__(/*! ./devMode */ "./src/modules/devMode.js");
/* harmony import */ var _ui_tools__WEBPACK_IMPORTED_MODULE_15__ = __webpack_require__(/*! ../ui/tools */ "./src/ui/tools.js");
/* harmony import */ var _ui_scroller__WEBPACK_IMPORTED_MODULE_16__ = __webpack_require__(/*! ../ui/scroller */ "./src/ui/scroller.js");
/* harmony import */ var _ui_sectionedSettingsPanel__WEBPACK_IMPORTED_MODULE_17__ = __webpack_require__(/*! ../ui/sectionedSettingsPanel */ "./src/ui/sectionedSettingsPanel.js");
/* harmony import */ var _ui_settingsPanel__WEBPACK_IMPORTED_MODULE_18__ = __webpack_require__(/*! ../ui/settingsPanel */ "./src/ui/settingsPanel.js");
/* harmony import */ var _ui_cssEditor__WEBPACK_IMPORTED_MODULE_19__ = __webpack_require__(/*! ../ui/cssEditor */ "./src/ui/cssEditor.js");
/* harmony import */ var _ui_addonlist__WEBPACK_IMPORTED_MODULE_20__ = __webpack_require__(/*! ../ui/addonlist */ "./src/ui/addonlist.jsx");
/* harmony import */ var _ui_presenceSettings__WEBPACK_IMPORTED_MODULE_21__ = __webpack_require__(/*! ../ui/presenceSettings */ "./src/ui/presenceSettings.jsx");
/* harmony import */ var _CustomRichPresence__WEBPACK_IMPORTED_MODULE_22__ = __webpack_require__(/*! ./CustomRichPresence */ "./src/modules/CustomRichPresence.js");
/* harmony import */ var _ui_AccountInfos__WEBPACK_IMPORTED_MODULE_23__ = __webpack_require__(/*! ../ui/AccountInfos */ "./src/ui/AccountInfos.jsx");
/* harmony import */ var electron__WEBPACK_IMPORTED_MODULE_24__ = __webpack_require__(/*! electron */ "electron");
/* harmony import */ var electron__WEBPACK_IMPORTED_MODULE_24___default = /*#__PURE__*/__webpack_require__.n(electron__WEBPACK_IMPORTED_MODULE_24__);
/* harmony import */ var _AntiAdDM__WEBPACK_IMPORTED_MODULE_25__ = __webpack_require__(/*! ./AntiAdDM */ "./src/modules/AntiAdDM.js");
/* harmony import */ var _blurPrivate__WEBPACK_IMPORTED_MODULE_26__ = __webpack_require__(/*! ./blurPrivate */ "./src/modules/blurPrivate.js");
/* harmony import */ var _disableTyping__WEBPACK_IMPORTED_MODULE_27__ = __webpack_require__(/*! ./disableTyping */ "./src/modules/disableTyping.js");
/* harmony import */ var _ui_ApiPreview__WEBPACK_IMPORTED_MODULE_28__ = __webpack_require__(/*! ../ui/ApiPreview */ "./src/ui/ApiPreview.jsx");
/* harmony import */ var _ui_settingsTitle__WEBPACK_IMPORTED_MODULE_29__ = __webpack_require__(/*! ../ui/settingsTitle */ "./src/ui/settingsTitle.js");
/* harmony import */ var _ui_switch__WEBPACK_IMPORTED_MODULE_30__ = __webpack_require__(/*! ../ui/switch */ "./src/ui/switch.js");
/* harmony import */ var _ui_margintop__WEBPACK_IMPORTED_MODULE_31__ = __webpack_require__(/*! ../ui/margintop */ "./src/ui/margintop.jsx");
/* harmony default export */ __webpack_exports__["default"] = (new class V2_SettingsPanel {
constructor() {
this.onChange = this.onChange.bind(this);
this.updateSettings = this.updateSettings.bind(this);
this.sidebar = new _settingsPanelSidebar__WEBPACK_IMPORTED_MODULE_2__["default"]();
this.registerComponents();
}
registerComponents() {
/** Lightcord */
this.sidebar.register("lightcord", makeComponent(this.lightcordComponent.bind(this)));
this.sidebar.register("status", makeComponent(this.PresenceComponent.bind(this)));
this.sidebar.register("accountinfo", makeComponent(this.AccountInfosComponent.bind(this)));
this.sidebar.register("lcapipreview", makeComponent(this.ApiPreviewComponent.bind(this)));
/* Bandaged BD */
this.sidebar.register("core", makeComponent(this.coreComponent.bind(this)));
this.sidebar.register("customcss", makeComponent(this.customCssComponent.bind(this)));
this.sidebar.register("plugins", makeComponent(this.renderAddonPane("plugins")));
this.sidebar.register("themes", makeComponent(this.renderAddonPane("themes")));
}
get root() {
const _root = _domtools__WEBPACK_IMPORTED_MODULE_10__["default"].query("#bd-settingspane-container");
if (!_root) {
if (!this.injectRoot()) return null;
return this.root;
}
return _root;
}
injectRoot() {
let [classNameLayer, classSidebar] = [BDModules.get(e => e.layer && e.animating)[0].layer.split(" ")[0], BDModules.get(e => e.standardSidebarView)[0]];
const sidebar = _domtools__WEBPACK_IMPORTED_MODULE_10__["default"].query("." + classNameLayer + " ." + classSidebar.standardSidebarView.split(" ")[0] + ", ." + classNameLayer + " .ui-standard-sidebar-view");
if (!sidebar) return false;
const root = _domtools__WEBPACK_IMPORTED_MODULE_10__["default"].createElement(`<div id="bd-settingspane-container" class="${classSidebar.contentRegion} content-region">`);
sidebar.append(root);
_utils__WEBPACK_IMPORTED_MODULE_3__["default"].onRemoved(root, () => {
_v2__WEBPACK_IMPORTED_MODULE_4__["default"].reactDom.unmountComponentAtNode(root);
});
return true;
}
get coreSettings() {
const settings = this.getSettings("core");
const categories = [...new Set(settings.map(s => s.category))];
const sections = categories.map(c => {
return {
title: c,
settings: settings.filter(s => s.category == c)
};
});
return sections;
}
get lightcordSettings() {
const settings = this.getSettings("lightcord");
const categories = [...new Set(settings.map(s => s.category))];
const sections = categories.map(c => {
return {
title: c,
settings: settings.filter(s => s.category == c)
};
});
return sections;
}
get PresenceSettings() {
return this.getSettings("status");
}
get MsgLogSettings() {
return this.getSettings("msglog");
}
getSettings(category) {
return Object.keys(_0globals__WEBPACK_IMPORTED_MODULE_0__["settings"]).reduce((arr, key) => {
const setting = _0globals__WEBPACK_IMPORTED_MODULE_0__["settings"][key];
if (setting.cat === category && setting.implemented && !setting.hidden) {
setting.text = key;
arr.push(setting);
}
return arr;
}, []);
}
onClick() {}
onChange(id, checked) {
this.updateSettings(id, checked);
}
updateSettings(id, enabled) {
_0globals__WEBPACK_IMPORTED_MODULE_0__["settingsCookie"][id] = enabled;
if (id == "bda-gs-2") {
if (enabled) _domtools__WEBPACK_IMPORTED_MODULE_10__["default"].addClass(document.body, "bd-minimal");else _domtools__WEBPACK_IMPORTED_MODULE_10__["default"].removeClass(document.body, "bd-minimal");
}
if (id == "bda-gs-3") {
if (enabled) _domtools__WEBPACK_IMPORTED_MODULE_10__["default"].addClass(document.body, "bd-minimal-chan");else _domtools__WEBPACK_IMPORTED_MODULE_10__["default"].removeClass(document.body, "bd-minimal-chan");
}
if (id == "bda-gs-1") {
if (enabled) _publicServers__WEBPACK_IMPORTED_MODULE_11__["default"].addButton();else _publicServers__WEBPACK_IMPORTED_MODULE_11__["default"].removeButton();
}
if (id == "bda-gs-4") {
if (enabled) _voiceMode__WEBPACK_IMPORTED_MODULE_12__["default"].start();else _voiceMode__WEBPACK_IMPORTED_MODULE_12__["default"].stop();
}
if (id == "bda-gs-5") {
if (enabled) _domtools__WEBPACK_IMPORTED_MODULE_10__["default"].addClass(_domtools__WEBPACK_IMPORTED_MODULE_10__["default"].query("#app-mount"), "bda-dark");else _domtools__WEBPACK_IMPORTED_MODULE_10__["default"].removeClass(_domtools__WEBPACK_IMPORTED_MODULE_10__["default"].query("#app-mount"), "bda-dark");
}
if (enabled && id == "bda-gs-6") _24hour__WEBPACK_IMPORTED_MODULE_8__["default"].inject24Hour();
if (id == "bda-gs-7") {
if (enabled) _coloredText__WEBPACK_IMPORTED_MODULE_7__["default"].injectColoredText();else _coloredText__WEBPACK_IMPORTED_MODULE_7__["default"].removeColoredText();
}
if (id == "fork-ps-4") {
if (enabled) _classNormalizer__WEBPACK_IMPORTED_MODULE_13__["default"].start();else _classNormalizer__WEBPACK_IMPORTED_MODULE_13__["default"].stop();
}
if (id == "fork-ps-5") {
if (enabled) {
_contentManager__WEBPACK_IMPORTED_MODULE_5__["default"].watchContent("plugin");
_contentManager__WEBPACK_IMPORTED_MODULE_5__["default"].watchContent("theme");
} else {
_contentManager__WEBPACK_IMPORTED_MODULE_5__["default"].unwatchContent("plugin");
_contentManager__WEBPACK_IMPORTED_MODULE_5__["default"].unwatchContent("theme");
}
}
if (id == "fork-wp-1") {
_utils__WEBPACK_IMPORTED_MODULE_3__["default"].setWindowPreference("transparent", enabled);
if (enabled) _utils__WEBPACK_IMPORTED_MODULE_3__["default"].setWindowPreference("backgroundColor", null);else _utils__WEBPACK_IMPORTED_MODULE_3__["default"].setWindowPreference("backgroundColor", "#2f3136");
}
if (id == "bda-gs-8") {
if (enabled) _devMode__WEBPACK_IMPORTED_MODULE_14__["default"].startDebugListener();else _devMode__WEBPACK_IMPORTED_MODULE_14__["default"].stopDebugListener();
}
if (id == "fork-dm-1") {
if (enabled) _devMode__WEBPACK_IMPORTED_MODULE_14__["default"].startCopySelector();else _devMode__WEBPACK_IMPORTED_MODULE_14__["default"].stopCopySelector();
}
if (id === "reactDevTools") {
if (enabled) _reactDevTools__WEBPACK_IMPORTED_MODULE_9__["default"].start();else _reactDevTools__WEBPACK_IMPORTED_MODULE_9__["default"].stop();
}
if (id === "lightcord-1") {
if (enabled) window.Lightcord.Settings.devMode = true;else window.Lightcord.Settings.devMode = false;
}
if (id === "lightcord-2") {
if (enabled) window.Lightcord.Settings.callRingingBeat = true;else window.Lightcord.Settings.callRingingBeat = false;
}
if (id === "lightcord-presence-1") {
if (enabled) {
_CustomRichPresence__WEBPACK_IMPORTED_MODULE_22__["default"].enable();
const settingsStore = BDModules.get(e => e.default && typeof e.default === "object" && "showCurrentGame" in e.default)[0];
if (settingsStore && !settingsStore.default.showCurrentGame) {
BDModules.get(e => e.default && e.default.updateRemoteSettings)[0].default.updateRemoteSettings({
showCurrentGame: true
});
}
} else _CustomRichPresence__WEBPACK_IMPORTED_MODULE_22__["default"].disable();
}
if (id === "lightcord-3") {
if (enabled) electron__WEBPACK_IMPORTED_MODULE_24__["remote"].getCurrentWindow().setAlwaysOnTop(true);else electron__WEBPACK_IMPORTED_MODULE_24__["remote"].getCurrentWindow().setAlwaysOnTop(false);
}
if (id === "lightcord-4") {
if (enabled) {
_AntiAdDM__WEBPACK_IMPORTED_MODULE_25__["default"].enable();
} else {
_AntiAdDM__WEBPACK_IMPORTED_MODULE_25__["default"].disable();
}
}
if (id === "lightcord-6") {
if (enabled) {
_blurPrivate__WEBPACK_IMPORTED_MODULE_26__["default"].enable();
} else {
_blurPrivate__WEBPACK_IMPORTED_MODULE_26__["default"].disable();
}
}
if (id === "lightcord-7") {
if (enabled) {
_disableTyping__WEBPACK_IMPORTED_MODULE_27__["default"].enable();
} else {
_disableTyping__WEBPACK_IMPORTED_MODULE_27__["default"].disable();
}
}
this.saveSettings();
}
async initializeSettings() {
if (_0globals__WEBPACK_IMPORTED_MODULE_0__["settingsCookie"].reactDevTools) _reactDevTools__WEBPACK_IMPORTED_MODULE_9__["default"].start();
if (_0globals__WEBPACK_IMPORTED_MODULE_0__["settingsCookie"]["bda-gs-2"]) _domtools__WEBPACK_IMPORTED_MODULE_10__["default"].addClass(document.body, "bd-minimal");
if (_0globals__WEBPACK_IMPORTED_MODULE_0__["settingsCookie"]["bda-gs-3"]) _domtools__WEBPACK_IMPORTED_MODULE_10__["default"].addClass(document.body, "bd-minimal-chan");
if (_0globals__WEBPACK_IMPORTED_MODULE_0__["settingsCookie"]["bda-gs-1"]) _publicServers__WEBPACK_IMPORTED_MODULE_11__["default"].addButton();
if (_0globals__WEBPACK_IMPORTED_MODULE_0__["settingsCookie"]["bda-gs-4"]) _voiceMode__WEBPACK_IMPORTED_MODULE_12__["default"].start();
if (_0globals__WEBPACK_IMPORTED_MODULE_0__["settingsCookie"]["bda-gs-5"]) _domtools__WEBPACK_IMPORTED_MODULE_10__["default"].addClass(_domtools__WEBPACK_IMPORTED_MODULE_10__["default"].query("#app-mount"), "bda-dark");
if (_0globals__WEBPACK_IMPORTED_MODULE_0__["settingsCookie"]["bda-gs-6"]) _24hour__WEBPACK_IMPORTED_MODULE_8__["default"].inject24Hour();
if (_0globals__WEBPACK_IMPORTED_MODULE_0__["settingsCookie"]["bda-gs-7"]) _coloredText__WEBPACK_IMPORTED_MODULE_7__["default"].injectColoredText();
if (_0globals__WEBPACK_IMPORTED_MODULE_0__["settingsCookie"]["fork-ps-4"]) _classNormalizer__WEBPACK_IMPORTED_MODULE_13__["default"].start();
if (_0globals__WEBPACK_IMPORTED_MODULE_0__["settingsCookie"]["lightcord-1"]) window.Lightcord.Settings.devMode = true;
if (_0globals__WEBPACK_IMPORTED_MODULE_0__["settingsCookie"]["lightcord-2"]) window.Lightcord.Settings.callRingingBeat = true;
if (_0globals__WEBPACK_IMPORTED_MODULE_0__["settingsCookie"]["lightcord-presence-1"]) _CustomRichPresence__WEBPACK_IMPORTED_MODULE_22__["default"].enable();
if (_0globals__WEBPACK_IMPORTED_MODULE_0__["settingsCookie"]["lightcord-3"]) electron__WEBPACK_IMPORTED_MODULE_24__["remote"].getCurrentWindow().setAlwaysOnTop(true);
if (_0globals__WEBPACK_IMPORTED_MODULE_0__["settingsCookie"]["lightcord-4"]) _AntiAdDM__WEBPACK_IMPORTED_MODULE_25__["default"].enable();
if (_0globals__WEBPACK_IMPORTED_MODULE_0__["settingsCookie"]["lightcord-6"]) _blurPrivate__WEBPACK_IMPORTED_MODULE_26__["default"].enable();
if (_0globals__WEBPACK_IMPORTED_MODULE_0__["settingsCookie"]["lightcord-7"]) _disableTyping__WEBPACK_IMPORTED_MODULE_27__["default"].enable();
if (_0globals__WEBPACK_IMPORTED_MODULE_0__["settingsCookie"]["fork-ps-5"]) {
_contentManager__WEBPACK_IMPORTED_MODULE_5__["default"].watchContent("plugin");
_contentManager__WEBPACK_IMPORTED_MODULE_5__["default"].watchContent("theme");
}
if (_0globals__WEBPACK_IMPORTED_MODULE_0__["settingsCookie"]["bda-gs-8"]) _devMode__WEBPACK_IMPORTED_MODULE_14__["default"].startDebugListener();
if (_0globals__WEBPACK_IMPORTED_MODULE_0__["settingsCookie"]["fork-dm-1"]) _devMode__WEBPACK_IMPORTED_MODULE_14__["default"].startCopySelector();
this.saveSettings();
}
saveSettings() {
_dataStore__WEBPACK_IMPORTED_MODULE_1__["default"].setSettingGroup("settings", _0globals__WEBPACK_IMPORTED_MODULE_0__["settingsCookie"]);
_dataStore__WEBPACK_IMPORTED_MODULE_1__["default"].setSettingGroup("rpc", _0globals__WEBPACK_IMPORTED_MODULE_0__["settingsRPC"]);
}
loadSettings() {
Object.assign(_0globals__WEBPACK_IMPORTED_MODULE_0__["settingsCookie"], _dataStore__WEBPACK_IMPORTED_MODULE_1__["default"].getSettingGroup("settings"));
Object.assign(_0globals__WEBPACK_IMPORTED_MODULE_0__["settingsRPC"], _dataStore__WEBPACK_IMPORTED_MODULE_1__["default"].getSettingGroup("rpc"));
}
renderSidebar() {
return this.sidebar.render();
}
coreComponent() {
return _v2__WEBPACK_IMPORTED_MODULE_4__["default"].react.createElement(_ui_sectionedSettingsPanel__WEBPACK_IMPORTED_MODULE_17__["default"], {
key: "cspanel",
onChange: this.onChange,
sections: this.coreSettings
});
}
lightcordComponent() {
return [this.lightcordSettings.map((section, i) => {
return [i === 0 ? null : _v2__WEBPACK_IMPORTED_MODULE_4__["default"].react.createElement(_ui_margintop__WEBPACK_IMPORTED_MODULE_31__["default"]), _v2__WEBPACK_IMPORTED_MODULE_4__["default"].react.createElement("h2", {
className: "ui-form-title h2 margin-reset margin-bottom-20"
}, section.title), section.settings.map(setting => {
return _v2__WEBPACK_IMPORTED_MODULE_4__["default"].react.createElement(_ui_switch__WEBPACK_IMPORTED_MODULE_30__["default"], {
id: setting.id,
key: setting.id,
data: setting,
checked: _0globals__WEBPACK_IMPORTED_MODULE_0__["settingsCookie"][setting.id],
onChange: (id, checked) => {
this.onChange(id, checked);
}
});
})];
}), _v2__WEBPACK_IMPORTED_MODULE_4__["default"].react.createElement(window.Lightcord.Api.Components.inputs.Button, {
color: "yellow",
onClick() {
console.log("Should relaunch");
electron__WEBPACK_IMPORTED_MODULE_24__["remote"].app.relaunch({
args: electron__WEBPACK_IMPORTED_MODULE_24__["remote"].process.argv.slice(1).concat(["--disable-betterdiscord"])
});
electron__WEBPACK_IMPORTED_MODULE_24__["remote"].app.quit();
}
}, "Relaunch without BetterDiscord")];
}
PresenceComponent() {
return _v2__WEBPACK_IMPORTED_MODULE_4__["default"].react.createElement(_ui_presenceSettings__WEBPACK_IMPORTED_MODULE_21__["default"], {
key: "lppannel",
onChange: this.onChange,
settings: this.PresenceSettings
});
}
AccountInfosComponent() {
return _v2__WEBPACK_IMPORTED_MODULE_4__["default"].react.createElement(_ui_AccountInfos__WEBPACK_IMPORTED_MODULE_23__["default"], {
key: "lapannel"
});
}
ApiPreviewComponent() {
return _v2__WEBPACK_IMPORTED_MODULE_4__["default"].react.createElement(_ui_ApiPreview__WEBPACK_IMPORTED_MODULE_28__["default"], {
key: "lapipannel"
});
}
customCssComponent() {
return _v2__WEBPACK_IMPORTED_MODULE_4__["default"].react.createElement(_ui_cssEditor__WEBPACK_IMPORTED_MODULE_19__["default"], {
key: "csseditor"
});
}
renderAddonPane(type) {
// I know this shouldn't be here, but when it isn't,
// React refuses to change the button when going
// between plugins and themes page... something
// to debug later.
class ContentList extends _v2__WEBPACK_IMPORTED_MODULE_4__["default"].react.Component {
constructor(props) {
super(props);
this.prefix = this.props.type.replace("s", "");
}
onChange() {
this.props.onChange(this.props.type);
}
render() {
return this.props.children;
}
}
const originalRender = ContentList.prototype.render;
Object.defineProperty(ContentList.prototype, "render", {
enumerable: false,
configurable: false,
set: function () {
console.warn("Addon policy for plugins #5 https://github.com/rauenzi/BetterDiscordApp/wiki/Addon-Policies#plugins");
},
get: () => originalRender
});
return function () {
return _v2__WEBPACK_IMPORTED_MODULE_4__["default"].react.createElement(ContentList, {
type
}, _v2__WEBPACK_IMPORTED_MODULE_4__["default"].react.createElement(_ui_addonlist__WEBPACK_IMPORTED_MODULE_20__["default"], {
type
}));
};
}
}());
function makeComponent(children) {
class SettingComponent extends React.Component {
render() {
return children();
}
}
return SettingComponent;
}
/***/ }),
/***/ "./src/modules/settingsPanelSidebar.js":
/*!*********************************************!*\
!*** ./src/modules/settingsPanelSidebar.js ***!
\*********************************************/
/*! exports provided: default */
/***/ (function(module, __webpack_exports__, __webpack_require__) {
"use strict";
__webpack_require__.r(__webpack_exports__);
/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "default", function() { return V2_SettingsPanel_Sidebar; });
/* harmony import */ var _0globals__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ../0globals */ "./src/0globals.js");
/* harmony import */ var _utils__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ./utils */ "./src/modules/utils.js");
/* harmony import */ var _v2__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! ./v2 */ "./src/modules/v2.js");
/* harmony import */ var _domtools__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(/*! ./domtools */ "./src/modules/domtools.js");
/* harmony import */ var _ui_sidebar__WEBPACK_IMPORTED_MODULE_4__ = __webpack_require__(/*! ../ui/sidebar */ "./src/ui/sidebar.js");
/* harmony import */ var _ui_icons_history__WEBPACK_IMPORTED_MODULE_5__ = __webpack_require__(/*! ../ui/icons/history */ "./src/ui/icons/history.jsx");
/* harmony import */ var _ui_tooltipWrap__WEBPACK_IMPORTED_MODULE_6__ = __webpack_require__(/*! ../ui/tooltipWrap */ "./src/ui/tooltipWrap.js");
class V2_SettingsPanel_Sidebar {
constructor() {
this.panels = {};
}
register(panel, component) {
this.panels[panel] = component;
}
getComponent(panel) {
return this.panels[panel];
}
get items() {
return [{
text: "BetterDiscord Settings",
id: "core"
}, {
text: "Plugins",
id: "plugins"
}, {
text: "Themes",
id: "themes"
}, {
text: "Custom CSS",
id: "customcss"
}];
}
get LCitems() {
let items = [{
text: "Lightcord Settings",
id: "lightcord"
}, {
text: "RichPresence",
id: "status"
}, {
text: "Account Info",
id: "accountinfo"
}];
if (!!window.Lightcord.Settings.devMode) items.push({
text: "Api Components Preview",
id: "lcapipreview"
});
return items;
}
render() {
return [{
section: "HEADER",
label: "Lightcord"
}, ...this.LCitems.map(e => {
return {
section: e.id,
label: e.text,
element: this.getComponent(e.id)
};
}), {
section: "DIVIDER"
}, {
section: "HEADER",
label: "Bandaged BD"
}, ...this.items.map(e => {
return {
section: e.id,
label: e.text,
element: this.getComponent(e.id)
};
}), {
section: "DIVIDER"
}];
}
}
/***/ }),
/***/ "./src/modules/themeModule.js":
/*!************************************!*\
!*** ./src/modules/themeModule.js ***!
\************************************/
/*! exports provided: default */
/***/ (function(module, __webpack_exports__, __webpack_require__) {
"use strict";
__webpack_require__.r(__webpack_exports__);
/* harmony import */ var _0globals__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ../0globals */ "./src/0globals.js");
/* harmony import */ var _contentManager__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ./contentManager */ "./src/modules/contentManager.js");
/* harmony import */ var _dataStore__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! ./dataStore */ "./src/modules/dataStore.js");
/* harmony import */ var _bdEvents__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(/*! ./bdEvents */ "./src/modules/bdEvents.js");
/* harmony import */ var _utils__WEBPACK_IMPORTED_MODULE_4__ = __webpack_require__(/*! ./utils */ "./src/modules/utils.js");
/* harmony import */ var _domtools__WEBPACK_IMPORTED_MODULE_5__ = __webpack_require__(/*! ./domtools */ "./src/modules/domtools.js");
class ThemeModule {
get folder() {
return _contentManager__WEBPACK_IMPORTED_MODULE_1__["default"].themesFolder;
}
}
ThemeModule.prototype.loadThemes = async function () {
this.loadThemeData();
_0globals__WEBPACK_IMPORTED_MODULE_0__["bdthemeErrors"].splice(0, 0, ...(await _contentManager__WEBPACK_IMPORTED_MODULE_1__["default"].loadThemes()));
const themes = Object.keys(_0globals__WEBPACK_IMPORTED_MODULE_0__["bdthemes"]);
for (let i = 0; i < themes.length; i++) {
const theme = _0globals__WEBPACK_IMPORTED_MODULE_0__["bdthemes"][themes[i]];
if (!_0globals__WEBPACK_IMPORTED_MODULE_0__["themeCookie"][theme.name]) _0globals__WEBPACK_IMPORTED_MODULE_0__["themeCookie"][theme.name] = false;
if (_0globals__WEBPACK_IMPORTED_MODULE_0__["themeCookie"][theme.name]) _domtools__WEBPACK_IMPORTED_MODULE_5__["default"].addStyle(_domtools__WEBPACK_IMPORTED_MODULE_5__["default"].escapeID(theme.id), unescape(theme.css));
await new Promise(resolve => setTimeout(resolve, 10));
}
for (const theme in _0globals__WEBPACK_IMPORTED_MODULE_0__["themeCookie"]) {
if (!_0globals__WEBPACK_IMPORTED_MODULE_0__["bdthemes"][theme]) delete _0globals__WEBPACK_IMPORTED_MODULE_0__["themeCookie"][theme];
}
this.saveThemeData(); // if (settingsCookie["fork-ps-5"]) ContentManager.watchContent("theme");
};
ThemeModule.prototype.enableTheme = function (name, reload = false) {
_0globals__WEBPACK_IMPORTED_MODULE_0__["themeCookie"][name] = true;
this.saveThemeData();
const theme = _0globals__WEBPACK_IMPORTED_MODULE_0__["bdthemes"][name];
_domtools__WEBPACK_IMPORTED_MODULE_5__["default"].addStyle(_domtools__WEBPACK_IMPORTED_MODULE_5__["default"].escapeID(theme.id), unescape(theme.css));
if (_0globals__WEBPACK_IMPORTED_MODULE_0__["settingsCookie"]["fork-ps-2"] && !reload) _utils__WEBPACK_IMPORTED_MODULE_4__["default"].showToast(`${theme.name} v${theme.version} has been applied.`);
};
ThemeModule.prototype.enable = function (name, reload = false) {
return this.enableTheme(name, reload);
};
ThemeModule.prototype.disableTheme = function (name, reload = false) {
_0globals__WEBPACK_IMPORTED_MODULE_0__["themeCookie"][name] = false;
this.saveThemeData();
const theme = _0globals__WEBPACK_IMPORTED_MODULE_0__["bdthemes"][name];
_domtools__WEBPACK_IMPORTED_MODULE_5__["default"].removeStyle(_domtools__WEBPACK_IMPORTED_MODULE_5__["default"].escapeID(theme.id));
if (_0globals__WEBPACK_IMPORTED_MODULE_0__["settingsCookie"]["fork-ps-2"] && !reload) _utils__WEBPACK_IMPORTED_MODULE_4__["default"].showToast(`${theme.name} v${theme.version} has been disabled.`);
};
ThemeModule.prototype.disable = function (name, reload = false) {
return this.disableTheme(name, reload);
};
ThemeModule.prototype.toggleTheme = function (theme) {
if (_0globals__WEBPACK_IMPORTED_MODULE_0__["themeCookie"][theme]) this.disableTheme(theme);else this.enableTheme(theme);
};
ThemeModule.prototype.toggle = function (name, reload = false) {
return this.toggleTheme(name, reload);
};
ThemeModule.prototype.loadTheme = async function (filename) {
const error = await _contentManager__WEBPACK_IMPORTED_MODULE_1__["default"].loadContent(filename, "theme");
if (error) {
if (_0globals__WEBPACK_IMPORTED_MODULE_0__["settingsCookie"]["fork-ps-1"]) _utils__WEBPACK_IMPORTED_MODULE_4__["default"].showContentErrors({
themes: [error]
});
if (_0globals__WEBPACK_IMPORTED_MODULE_0__["settingsCookie"]["fork-ps-2"]) _utils__WEBPACK_IMPORTED_MODULE_4__["default"].showToast(`${filename} could not be loaded. It may not have been loaded.`, {
type: "error"
});
return _utils__WEBPACK_IMPORTED_MODULE_4__["default"].err("ContentManager", `${filename} could not be loaded.`, error);
}
const theme = Object.values(_0globals__WEBPACK_IMPORTED_MODULE_0__["bdthemes"]).find(p => p.filename == filename);
_utils__WEBPACK_IMPORTED_MODULE_4__["default"].log("ContentManager", `${theme.name} v${theme.version} was loaded.`);
if (_0globals__WEBPACK_IMPORTED_MODULE_0__["settingsCookie"]["fork-ps-2"]) _utils__WEBPACK_IMPORTED_MODULE_4__["default"].showToast(`${theme.name} v${theme.version} was loaded.`, {
type: "success"
});
_bdEvents__WEBPACK_IMPORTED_MODULE_3__["default"].dispatch("theme-loaded", theme.name);
};
ThemeModule.prototype.unloadTheme = function (filenameOrName) {
const bdtheme = Object.values(_0globals__WEBPACK_IMPORTED_MODULE_0__["bdthemes"]).find(p => p.filename == filenameOrName) || _0globals__WEBPACK_IMPORTED_MODULE_0__["bdthemes"][filenameOrName];
if (!bdtheme) return;
const theme = bdtheme.name;
if (_0globals__WEBPACK_IMPORTED_MODULE_0__["themeCookie"][theme]) this.disableTheme(theme, true);
const error = _contentManager__WEBPACK_IMPORTED_MODULE_1__["default"].unloadContent(_0globals__WEBPACK_IMPORTED_MODULE_0__["bdthemes"][theme].filename, "theme");
delete _0globals__WEBPACK_IMPORTED_MODULE_0__["bdthemes"][theme];
if (error) {
if (_0globals__WEBPACK_IMPORTED_MODULE_0__["settingsCookie"]["fork-ps-1"]) _utils__WEBPACK_IMPORTED_MODULE_4__["default"].showContentErrors({
themes: [error]
});
if (_0globals__WEBPACK_IMPORTED_MODULE_0__["settingsCookie"]["fork-ps-2"]) _utils__WEBPACK_IMPORTED_MODULE_4__["default"].showToast(`${theme} could not be unloaded. It may have not been loaded yet.`, {
type: "error"
});
return _utils__WEBPACK_IMPORTED_MODULE_4__["default"].err("ContentManager", `${theme} could not be unloaded. It may have not been loaded yet.`, error);
}
_utils__WEBPACK_IMPORTED_MODULE_4__["default"].log("ContentManager", `${theme} was unloaded.`);
if (_0globals__WEBPACK_IMPORTED_MODULE_0__["settingsCookie"]["fork-ps-2"]) _utils__WEBPACK_IMPORTED_MODULE_4__["default"].showToast(`${theme} was unloaded.`, {
type: "success"
});
_bdEvents__WEBPACK_IMPORTED_MODULE_3__["default"].dispatch("theme-unloaded", theme);
};
ThemeModule.prototype.delete = function (filenameOrName) {
const bdplugin = Object.values(_0globals__WEBPACK_IMPORTED_MODULE_0__["bdthemes"]).find(p => p.filename == filenameOrName) || _0globals__WEBPACK_IMPORTED_MODULE_0__["bdthemes"][filenameOrName];
if (!bdplugin) return;
this.unloadTheme(bdplugin.filename);
const fullPath = __webpack_require__(/*! path */ "path").resolve(_contentManager__WEBPACK_IMPORTED_MODULE_1__["default"].pluginsFolder, bdplugin.filename);
__webpack_require__(/*! fs */ "fs").unlinkSync(fullPath);
};
ThemeModule.prototype.reloadTheme = async function (filenameOrName) {
const bdtheme = Object.values(_0globals__WEBPACK_IMPORTED_MODULE_0__["bdthemes"]).find(p => p.filename == filenameOrName) || _0globals__WEBPACK_IMPORTED_MODULE_0__["bdthemes"][filenameOrName];
if (!bdtheme) return this.loadTheme(filenameOrName);
const theme = bdtheme.name;
const error = await _contentManager__WEBPACK_IMPORTED_MODULE_1__["default"].reloadContent(_0globals__WEBPACK_IMPORTED_MODULE_0__["bdthemes"][theme].filename, "theme");
if (_0globals__WEBPACK_IMPORTED_MODULE_0__["themeCookie"][theme]) this.disableTheme(theme, true), this.enableTheme(theme, true);
if (error) {
if (_0globals__WEBPACK_IMPORTED_MODULE_0__["settingsCookie"]["fork-ps-1"]) _utils__WEBPACK_IMPORTED_MODULE_4__["default"].showContentErrors({
themes: [error]
});
if (_0globals__WEBPACK_IMPORTED_MODULE_0__["settingsCookie"]["fork-ps-2"]) _utils__WEBPACK_IMPORTED_MODULE_4__["default"].showToast(`${theme} could not be reloaded.`, {
type: "error"
});
return _utils__WEBPACK_IMPORTED_MODULE_4__["default"].err("ContentManager", `${theme} could not be reloaded.`, error);
}
_utils__WEBPACK_IMPORTED_MODULE_4__["default"].log("ContentManager", `${theme} v${_0globals__WEBPACK_IMPORTED_MODULE_0__["bdthemes"][theme].version} was reloaded.`);
if (_0globals__WEBPACK_IMPORTED_MODULE_0__["settingsCookie"]["fork-ps-2"]) _utils__WEBPACK_IMPORTED_MODULE_4__["default"].showToast(`${theme} v${_0globals__WEBPACK_IMPORTED_MODULE_0__["bdthemes"][theme].version} was reloaded.`, {
type: "success"
});
_bdEvents__WEBPACK_IMPORTED_MODULE_3__["default"].dispatch("theme-reloaded", theme);
};
ThemeModule.prototype.reload = function (name) {
return this.reloadTheme(name);
};
ThemeModule.prototype.edit = function (filenameOrName) {
const bdplugin = Object.values(_0globals__WEBPACK_IMPORTED_MODULE_0__["bdthemes"]).find(p => p.filename == filenameOrName) || _0globals__WEBPACK_IMPORTED_MODULE_0__["bdthemes"][filenameOrName];
if (!bdplugin) return;
const fullPath = __webpack_require__(/*! path */ "path").resolve(_contentManager__WEBPACK_IMPORTED_MODULE_1__["default"].themesFolder, bdplugin.filename);
__webpack_require__(/*! electron */ "electron").shell.openItem(`${fullPath}`);
};
ThemeModule.prototype.updateThemeList = function () {
const results = _contentManager__WEBPACK_IMPORTED_MODULE_1__["default"].loadNewContent("theme");
for (const filename of results.added) this.loadTheme(filename);
for (const name of results.removed) this.unloadTheme(name);
};
ThemeModule.prototype.loadThemeData = function () {
const saved = _dataStore__WEBPACK_IMPORTED_MODULE_2__["default"].getSettingGroup("themes");
if (saved) {
Object.assign(_0globals__WEBPACK_IMPORTED_MODULE_0__["themeCookie"], saved);
}
};
ThemeModule.prototype.saveThemeData = function () {
_dataStore__WEBPACK_IMPORTED_MODULE_2__["default"].setSettingGroup("themes", _0globals__WEBPACK_IMPORTED_MODULE_0__["themeCookie"]);
};
/* harmony default export */ __webpack_exports__["default"] = (new ThemeModule());
/***/ }),
/***/ "./src/modules/utils.js":
/*!******************************!*\
!*** ./src/modules/utils.js ***!
\******************************/
/*! exports provided: default */
/***/ (function(module, __webpack_exports__, __webpack_require__) {
"use strict";
__webpack_require__.r(__webpack_exports__);
/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "default", function() { return Utils; });
/* harmony import */ var _0globals__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ../0globals */ "./src/0globals.js");
/* harmony import */ var _webpackModules__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ./webpackModules */ "./src/modules/webpackModules.js");
/* harmony import */ var _v2__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! ./v2 */ "./src/modules/v2.js");
/* harmony import */ var _domtools__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(/*! ./domtools */ "./src/modules/domtools.js");
class Utils {
/** Document/window width */
static get screenWidth() {
return Math.max(document.documentElement.clientWidth, window.innerWidth || 0);
}
/** Document/window height */
static get screenHeight() {
return Math.max(document.documentElement.clientHeight, window.innerHeight || 0);
}
static get WindowConfigFile() {
return this._windowConfigFile = null;
}
static getAllWindowPreferences() {
return {
transparent: true,
frame: false
};
}
static getWindowPreference(key) {
if (key === "transparent") return true;
if (key === "frame") return false;
return null;
}
static setWindowPreference(key, value) {
if (key === "transparent") return true;
if (key === "frame") return false;
return null;
}
static stripBOM(content) {
if (content.charCodeAt(0) === 0xFEFF) {
content = content.slice(1);
}
return content;
}
static getTextArea() {
return _domtools__WEBPACK_IMPORTED_MODULE_3__["default"].query("." + BDModules.get(e => e.channelTextArea && e.titleWrapper)[0].channelTextArea.split(" ")[0] + " textarea");
}
static insertText(textarea, text) {
textarea.focus();
textarea.selectionStart = 0;
textarea.selectionEnd = textarea.value.length;
document.execCommand("insertText", false, text);
}
static escapeID(id) {
return id.replace(/^[^a-z]+|[^\w-]+/gi, "-");
}
static log(moduleName, message) {
console.log(`%c[BandagedBD]%c [${moduleName}]%c ${message}`, "color: #3a71c1; font-weight: 700;", "color: #3a71c1;", "");
}
static warn(moduleName, message) {
console.warn(`%c[BandagedBD]%c [${moduleName}]%c ${message}`, "color: #E8A400; font-weight: 700;", "color: #E8A400;", "");
}
static err(moduleName, message, error) {
console.log(`%c[BandagedBD]%c [${moduleName}]%c ${message}`, "color: red; font-weight: 700;", "color: red;", "");
if (error) {
console.groupCollapsed("%cError: " + error.message, "color: red;");
console.error(error.stack);
console.groupEnd();
}
}
static escape(s) {
return s.replace(/[-/\\^$*+?.()|[\]{}]/g, "\\$&");
}
static testJSON(data) {
try {
return JSON.parse(data);
} catch (err) {
return false;
}
}
static isEmpty(obj) {
if (obj == null || obj == undefined || obj == "") return true;
if (typeof obj !== "object") return false;
if (Array.isArray(obj)) return obj.length == 0;
for (const key in obj) {
if (obj.hasOwnProperty(key)) return false;
}
return true;
}
static suppressErrors(method, message) {
return (...params) => {
try {
return method(...params);
} catch (e) {
this.err("SuppressedError", "Error occurred in " + message, e);
}
};
}
static monkeyPatch(what, methodName, options) {
const {
before,
after,
instead,
once = false,
silent = false,
force = false
} = options;
const displayName = options.displayName || what.displayName || what[methodName].displayName || what.name || what.constructor.displayName || what.constructor.name;
if (!silent) console.log("patch", methodName, "of", displayName); // eslint-disable-line no-console
if (!what[methodName]) {
if (force) what[methodName] = function () {};else return console.error(methodName, "does not exist for", displayName); // eslint-disable-line no-console
}
const origMethod = what[methodName];
let canceled = false;
const cancel = () => {
if (!silent) console.log("unpatch", methodName, "of", displayName); // eslint-disable-line no-console
//what[methodName] = origMethod;
canceled = true; // this allow to monkeypatch more than one time.
};
what[methodName] = function () {
if (canceled) {
return origMethod.call(this, ...arguments);
}
const data = {
thisObject: this,
methodArguments: arguments,
cancelPatch: cancel,
originalMethod: origMethod,
callOriginalMethod: () => data.returnValue = data.originalMethod.apply(data.thisObject, data.methodArguments)
};
if (instead) {
const tempRet = Utils.suppressErrors(instead, "`instead` callback of " + what[methodName].displayName)(data);
if (tempRet !== undefined) data.returnValue = tempRet;
} else {
if (before) Utils.suppressErrors(before, "`before` callback of " + what[methodName].displayName)(data);
data.callOriginalMethod();
if (after) Utils.suppressErrors(after, "`after` callback of " + what[methodName].displayName)(data);
}
if (once) cancel();
return data.returnValue;
};
Object.assign(what[methodName], origMethod);
what[methodName].__monkeyPatched = true;
what[methodName].displayName = displayName;
if (!what[methodName].__originalMethod) {
what[methodName].__originalMethod = origMethod;
what[methodName].toString = function () {
return origMethod.toString();
};
}
return cancel;
}
static onRemoved(node, callback) {
const observer = new MutationObserver(mutations => {
for (let m = 0; m < mutations.length; m++) {
const mutation = mutations[m];
const nodes = Array.from(mutation.removedNodes);
const directMatch = nodes.indexOf(node) > -1;
const parentMatch = nodes.some(parent => parent.contains(node));
if (directMatch || parentMatch) {
observer.disconnect();
callback();
}
}
});
observer.observe(document.body, {
subtree: true,
childList: true
});
}
static getNestedProp(obj, path) {
return path.split(/\s?\.\s?/).reduce(function (obj, prop) {
return obj && obj[prop];
}, obj);
}
/**
* This shows a toast similar to android towards the bottom of the screen.
*
* @param {string} content The string to show in the toast.
* @param {object} options Options object. Optional parameter.
* @param {string} options.type Changes the type of the toast stylistically and semantically. Choices: "", "info", "success", "danger"/"error", "warning"/"warn". Default: ""
* @param {boolean} options.icon Determines whether the icon should show corresponding to the type. A toast without type will always have no icon. Default: true
* @param {number} options.timeout Adjusts the time (in ms) the toast should be shown for before disappearing automatically. Default: 3000
*/
static showToast(content, options = {}) {
if (!document.querySelector(".bd-toasts")) {
const container = document.querySelector("." + BDModules.get(e => e.sidebar && e.hasNotice)[0].sidebar.split(" ")[9] + " + div") || null;
const memberlist = container ? container.querySelector("." + BDModules.get(e => e.membersWrap)[0].membersWrap) : null;
const form = container ? container.querySelector("form") : null;
const left = container ? container.getBoundingClientRect().left : 310;
const right = memberlist ? memberlist.getBoundingClientRect().left : 0;
const width = right ? right - container.getBoundingClientRect().left : Utils.screenWidth - left - 240;
const bottom = form ? form.offsetHeight : 80;
const toastWrapper = document.createElement("div");
toastWrapper.classList.add("bd-toasts");
toastWrapper.style.setProperty("left", left + "px");
toastWrapper.style.setProperty("width", width + "px");
toastWrapper.style.setProperty("bottom", bottom + "px");
document.querySelector("#app-mount").appendChild(toastWrapper);
}
const {
type = "",
icon = true,
timeout = 3000
} = options;
const toastElem = document.createElement("div");
toastElem.classList.add("bd-toast");
if (type) toastElem.classList.add("toast-" + type);
if (type && icon) toastElem.classList.add("icon");
toastElem.innerText = content;
document.querySelector(".bd-toasts").appendChild(toastElem);
setTimeout(() => {
toastElem.classList.add("closing");
setTimeout(() => {
toastElem.remove();
if (!document.querySelectorAll(".bd-toasts .bd-toast").length) document.querySelector(".bd-toasts").remove();
}, 300);
}, timeout);
}
static alert(title, content) {
let modalModule = BDModules.get(e => e.modal && e.inner && !e.hideOnFullscreen)[0];
let headerModule = BDModules.get(e => e.header && e.responsiveWidthMobile && e.hideOnFullscreen)[0];
let footer2Module = BDModules.get(e => e.header && e.responsiveWidthMobile && e.focusLock)[0];
const modal = _domtools__WEBPACK_IMPORTED_MODULE_3__["default"].createElement(`<div class="bd-modal-wrapper theme-dark">
<div class="bd-backdrop ${BDModules.get(e => e.backdrop && e.backdropWithLayer)[0].backdrop}"></div>
<div class="bd-modal ${modalModule.modal}">
<div class="bd-modal-inner ${modalModule.inner}">
<div class="header ${headerModule.header}">
<div class="title">${title}</div>
</div>
<div class="bd-modal-body">
<div class="scroller-wrap fade">
<div class="scroller">
${content}
</div>
</div>
</div>
<div class="footer ${headerModule.footer} ${footer2Module.footer}">
<button type="button">Okay</button>
</div>
</div>
</div>
</div>`);
modal.querySelector(".footer button").addEventListener("click", () => {
_domtools__WEBPACK_IMPORTED_MODULE_3__["default"].addClass(modal, "closing");
setTimeout(() => {
modal.remove();
closingListeners.forEach(listener => {
try {
listener();
} catch (e) {
console.error(e);
}
});
}, 300);
});
modal.querySelector(".bd-backdrop").addEventListener("click", () => {
_domtools__WEBPACK_IMPORTED_MODULE_3__["default"].addClass(modal, "closing");
setTimeout(() => {
modal.remove();
closingListeners.forEach(listener => {
try {
listener();
} catch (e) {
console.error(e);
}
});
}, 300);
});
_domtools__WEBPACK_IMPORTED_MODULE_3__["default"].query("#app-mount").append(modal);
const closingListeners = [];
return {
close: () => {
_domtools__WEBPACK_IMPORTED_MODULE_3__["default"].addClass(modal, "closing");
setTimeout(() => {
modal.remove();
closingListeners.forEach(listener => {
try {
listener();
} catch (e) {
console.error(e);
}
});
}, 300);
},
onClose: listener => {
closingListeners.push(listener);
}
};
}
static showContentErrors({
plugins: pluginErrors = [],
themes: themeErrors = []
}) {
if (!pluginErrors || !themeErrors) return;
if (!pluginErrors.length && !themeErrors.length) return;
let modalModule = BDModules.get(e => e.modal && e.inner && !e.hideOnFullscreen)[0];
let headerModule = BDModules.get(e => e.header && e.responsiveWidthMobile && e.hideOnFullscreen)[0];
let footer2Module = BDModules.get(e => e.header && e.responsiveWidthMobile && e.focusLock)[0];
const modal = _domtools__WEBPACK_IMPORTED_MODULE_3__["default"].createElement(`<div class="bd-modal-wrapper theme-dark">
<div class="bd-backdrop ${BDModules.get(e => e.backdrop && e.backdropWithLayer)[0].backdrop}"></div>
<div class="bd-modal bd-content-modal ${modalModule.modal}">
<div class="bd-modal-inner ${modalModule.inner}">
<div class="header ${headerModule.header}"><div class="title">Content Errors</div></div>
<div class="bd-modal-body">
<div class="tab-bar-container">
<div class="tab-bar TOP">
<div class="tab-bar-item">Plugins</div>
<div class="tab-bar-item">Themes</div>
</div>
</div>
<div class="table-header">
<div class="table-column column-name">Name</div>
<div class="table-column column-message">Message</div>
<div class="table-column column-error">Error</div>
</div>
<div class="scroller-wrap fade">
<div class="scroller">
</div>
</div>
</div>
<div class="footer ${headerModule.footer} ${footer2Module.footer}">
<button type="button">Okay</button>
</div>
</div>
</div>
</div>`);
function generateTab(errors) {
const container = _domtools__WEBPACK_IMPORTED_MODULE_3__["default"].createElement(`<div class="errors">`);
for (const err of errors) {
const error = _domtools__WEBPACK_IMPORTED_MODULE_3__["default"].createElement(`<div class="error">
<div class="table-column column-name">${err.name ? err.name : err.file}</div>
<div class="table-column column-message">${err.message}</div>
<div class="table-column column-error"><a class="error-link" href="">${err.error ? err.error.message : ""}</a></div>
</div>`);
container.append(error);
if (err.error) {
error.querySelectorAll("a").forEach(el => el.addEventListener("click", e => {
e.preventDefault();
Utils.err("ContentManager", `Error details for ${err.name ? err.name : err.file}.`, err.error);
}));
}
}
return container;
}
const tabs = [generateTab(pluginErrors), generateTab(themeErrors)];
modal.querySelectorAll(".tab-bar-item").forEach(el => el.addEventListener("click", e => {
e.preventDefault();
const selected = modal.querySelector(".tab-bar-item.selected");
if (selected) _domtools__WEBPACK_IMPORTED_MODULE_3__["default"].removeClass(selected, "selected");
_domtools__WEBPACK_IMPORTED_MODULE_3__["default"].addClass(e.target, "selected");
const scroller = modal.querySelector(".scroller");
scroller.innerHTML = "";
scroller.append(tabs[_domtools__WEBPACK_IMPORTED_MODULE_3__["default"].index(e.target)]);
}));
modal.querySelector(".footer button").addEventListener("click", () => {
_domtools__WEBPACK_IMPORTED_MODULE_3__["default"].addClass(modal, "closing");
setTimeout(() => {
modal.remove();
}, 300);
});
modal.querySelector(".bd-backdrop").addEventListener("click", () => {
_domtools__WEBPACK_IMPORTED_MODULE_3__["default"].addClass(modal, "closing");
setTimeout(() => {
modal.remove();
}, 300);
});
_domtools__WEBPACK_IMPORTED_MODULE_3__["default"].query("#app-mount").append(modal);
if (pluginErrors.length) modal.querySelector(".tab-bar-item").click();else modal.querySelectorAll(".tab-bar-item")[1].click();
}
static showChangelogModal(options = {}) {
const ModalStack = _webpackModules__WEBPACK_IMPORTED_MODULE_1__["default"].findByProps("push", "update", "pop", "popWithKey");
const ChangelogClasses = _webpackModules__WEBPACK_IMPORTED_MODULE_1__["default"].findByProps("fixed", "improved");
const TextElement = _webpackModules__WEBPACK_IMPORTED_MODULE_1__["default"].findByDisplayName("Text");
const FlexChild = _webpackModules__WEBPACK_IMPORTED_MODULE_1__["default"].findByProps("Child");
const Titles = _webpackModules__WEBPACK_IMPORTED_MODULE_1__["default"].findByProps("Tags", "default");
const Changelog = _webpackModules__WEBPACK_IMPORTED_MODULE_1__["default"].find(m => m.defaultProps && m.defaultProps.selectable == false);
const MarkdownParser = _webpackModules__WEBPACK_IMPORTED_MODULE_1__["default"].findByProps("defaultRules", "parse");
if (!Changelog || !ModalStack || !ChangelogClasses || !TextElement || !FlexChild || !Titles || !MarkdownParser) return;
const {
image = "https://repository-images.githubusercontent.com/105473537/957b5480-7c26-11e9-8401-50fa820cbae5",
description = "",
changes = [],
title = "BandagedBD",
subtitle = `v${_0globals__WEBPACK_IMPORTED_MODULE_0__["bbdVersion"]}`,
footer
} = options;
const ce = _v2__WEBPACK_IMPORTED_MODULE_2__["default"].React.createElement;
const changelogItems = [ce("img", {
src: image
})];
if (description) changelogItems.push(ce("p", null, MarkdownParser.parse(description)));
for (let c = 0; c < changes.length; c++) {
const entry = changes[c];
const type = ChangelogClasses[entry.type] ? ChangelogClasses[entry.type] : ChangelogClasses.added;
const margin = c == 0 ? ChangelogClasses.marginTop : "";
changelogItems.push(ce("h1", {
className: `${type} ${margin}`
}, entry.title));
const list = ce("ul", null, entry.items.map(i => ce("li", null, MarkdownParser.parse(i))));
changelogItems.push(list);
}
const renderHeader = function () {
return ce(FlexChild.Child, {
grow: 1,
shrink: 1
}, ce(Titles.default, {
tag: Titles.Tags.H4
}, title), ce(TextElement, {
size: TextElement.Sizes.SMALL,
color: TextElement.Colors.STANDARD,
className: ChangelogClasses.date
}, subtitle));
};
const renderFooter = () => {
const Anchor = _webpackModules__WEBPACK_IMPORTED_MODULE_1__["default"].find(m => m.displayName == "Anchor");
const AnchorClasses = _webpackModules__WEBPACK_IMPORTED_MODULE_1__["default"].findByProps("anchorUnderlineOnHover") || {
anchor: "anchor-3Z-8Bb",
anchorUnderlineOnHover: "anchorUnderlineOnHover-2ESHQB"
};
const joinSupportServer = click => {
click.preventDefault();
click.stopPropagation();
ModalStack.pop();
_v2__WEBPACK_IMPORTED_MODULE_2__["default"].joinBD2();
};
const supportLink = Anchor ? ce(Anchor, {
onClick: joinSupportServer
}, "Join our Discord Server.") : ce("a", {
className: `${AnchorClasses.anchor} ${AnchorClasses.anchorUnderlineOnHover}`,
onClick: joinSupportServer
}, "Join our Discord Server.");
const defaultFooter = ce(TextElement, {
size: TextElement.Sizes.SMALL,
color: TextElement.Colors.STANDARD
}, "Need support? ", supportLink);
return ce(FlexChild.Child, {
grow: 1,
shrink: 1
}, footer ? footer : defaultFooter);
};
return ModalStack.push(function (props) {
return ce(Changelog, Object.assign({
className: ChangelogClasses.container,
selectable: true,
onScroll: _ => _,
onClose: _ => _,
renderHeader: renderHeader,
renderFooter: renderFooter,
children: changelogItems
}, props));
});
}
/**
* Shows a generic but very customizable confirmation modal with optional confirm and cancel callbacks.
* @param {string} title - title of the modal
* @param {(string|ReactElement|Array<string|ReactElement>)} children - a single or mixed array of react elements and strings. Every string is wrapped in Discord's `Markdown` component so strings will show and render properly.
* @param {object} [options] - options to modify the modal
* @param {boolean} [options.danger=false] - whether the main button should be red or not
* @param {string} [options.confirmText=Okay] - text for the confirmation/submit button
* @param {string} [options.cancelText=Cancel] - text for the cancel button
* @param {callable} [options.onConfirm=NOOP] - callback to occur when clicking the submit button
* @param {callable} [options.onCancel=NOOP] - callback to occur when clicking the cancel button
* @param {string} [options.key] - key used to identify the modal. If not provided, one is generated and returned
* @returns {string} - the key used for this modal
*/
static showConfirmationModal(title, content, options = {}) {
const ModalStack = _webpackModules__WEBPACK_IMPORTED_MODULE_1__["default"].findByProps("push", "update", "pop", "popWithKey");
const Markdown = _webpackModules__WEBPACK_IMPORTED_MODULE_1__["default"].findByDisplayName("Markdown");
const ConfirmationModal = _webpackModules__WEBPACK_IMPORTED_MODULE_1__["default"].find(m => m.defaultProps && m.key && m.key() == "confirm-modal");
if (!ModalStack || !ConfirmationModal || !Markdown) return Utils.alert(title, content);
const emptyFunction = () => {};
const {
onConfirm = emptyFunction,
onCancel = emptyFunction,
confirmText = "Okay",
cancelText = "Cancel",
danger = false,
key = undefined
} = options;
if (!Array.isArray(content)) content = [content];
content = content.map(c => typeof c === "string" ? _v2__WEBPACK_IMPORTED_MODULE_2__["default"].React.createElement(Markdown, null, c) : c);
return ModalStack.push(ConfirmationModal, {
header: title,
children: content,
red: danger,
confirmText: confirmText,
cancelText: cancelText,
onConfirm: onConfirm,
onCancel: onCancel
}, key);
}
static removeDa(className) {
if (!className) return className;
return className.split(" ").filter(e => !e.startsWith("da-")).join(" ");
}
}
Utils.showToast = Utils.suppressErrors(Utils.showToast, "Could not show toast.");
window.Lightcord.BetterDiscord.Utils = Utils;
/***/ }),
/***/ "./src/modules/v2.js":
/*!***************************!*\
!*** ./src/modules/v2.js ***!
\***************************/
/*! exports provided: default */
/***/ (function(module, __webpack_exports__, __webpack_require__) {
"use strict";
__webpack_require__.r(__webpack_exports__);
/* harmony import */ var _0globals__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ../0globals */ "./src/0globals.js");
/* harmony default export */ __webpack_exports__["default"] = (new class V2 {
constructor() {
this.editorDetached = false;
this.WebpackModules = (() => {
const req = webpackJsonp.push([[], {
__extra_id__: (module, exports, req) => module.exports = req
}, [["__extra_id__"]]]);
delete req.m.__extra_id__;
delete req.c.__extra_id__;
const shouldProtect = theModule => {
if (theModule.remove && theModule.set && theModule.clear && theModule.get && !theModule.sort) return true;
if (theModule.getToken || theModule.getEmail || theModule.showToken) return true;
return false;
};
const protect = theModule => {
if (theModule.remove && theModule.set && theModule.clear && theModule.get && !theModule.sort) return null;
if (!theModule.getToken && !theModule.getEmail && !theModule.showToken) return theModule;
const proxy = new Proxy(theModule, {
getOwnPropertyDescriptor: function (obj, prop) {
if (prop === "getToken" || prop === "getEmail" || prop === "showToken") return undefined;
return Object.getOwnPropertyDescriptor(obj, prop);
},
get: function (obj, func) {
if (func == "getToken") return () => "mfa.XCnbKzo0CLIqdJzBnL0D8PfDruqkJNHjwHXtr39UU3F8hHx43jojISyi5jdjO52e9_e9MjmafZFFpc-seOMa";
if (func == "getEmail") return () => "puppet11112@gmail.com";
if (func == "showToken") return () => true; // if (func == "__proto__") return proxy;
return obj[func];
}
});
return proxy;
};
const find = filter => {
for (const i in req.c) {
if (req.c.hasOwnProperty(i)) {
const m = req.c[i].exports;
if (m && m.__esModule && m.default && filter(m.default)) return protect(m.default);
if (m && filter(m)) return protect(m);
}
} // console.warn("Cannot find loaded module in cache");
return null;
};
const findAll = filter => {
const modules = [];
for (const i in req.c) {
if (req.c.hasOwnProperty(i)) {
const m = req.c[i].exports;
if (m && m.__esModule && m.default && filter(m.default)) modules.push(protect(m.default));else if (m && filter(m)) modules.push(protect(m));
}
}
return modules;
};
const findByUniqueProperties = propNames => find(module => propNames.every(prop => module[prop] !== undefined));
const findByPrototypes = protoNames => find(module => module.prototype && protoNames.every(protoProp => module.prototype[protoProp] !== undefined));
const findByDisplayName = displayName => find(module => module.displayName === displayName);
return {
find,
findAll,
findByUniqueProperties,
findByPrototypes,
findByDisplayName
};
})();
this.internal = {
react: this.WebpackModules.findByUniqueProperties(["Component", "PureComponent", "Children", "createElement", "cloneElement"]),
reactDom: this.WebpackModules.findByUniqueProperties(["findDOMNode"])
};
this.getInternalInstance = e => e[Object.keys(e).find(k => k.startsWith("__reactInternalInstance"))];
}
initialize() {}
joinBD1() {
this.InviteActions.acceptInviteAndTransitionToInviteChannel("0Tmfo5ZbORCRqbAd");
}
leaveBD1() {
this.GuildActions.leaveGuild("86004744966914048");
}
joinBD2() {
this.InviteActions.acceptInviteAndTransitionToInviteChannel("2HScm8j");
}
leaveBD2() {
this.GuildActions.leaveGuild("280806472928198656");
}
joinLC() {
this.InviteActions.acceptInviteAndTransitionToInviteChannel("7eFff2A");
}
leaveLC() {
this.GuildActions.leaveGuild("705908350218666117");
}
/**
* @type {typeof React}
*/
get react() {
return this.internal.react;
}
/**
* @type {typeof React}
*/
get React() {
return this.internal.react;
}
/**
* @type {typeof import("react-dom")}
*/
get reactDom() {
return this.internal.reactDom;
}
/**
* @type {typeof import("react-dom")}
*/
get ReactDom() {
return this.internal.reactDom;
}
/**
* @type {typeof React.Component}
*/
get reactComponent() {
return this.internal.react.Component;
}
/**
* @type {typeof React.Component}
*/
get ReactComponent() {
return this.internal.react.Component;
}
get anchorClasses() {
return this.WebpackModules.findByUniqueProperties(["anchorUnderlineOnHover"]) || {
anchor: "anchor-3Z-8Bb",
anchorUnderlineOnHover: "anchorUnderlineOnHover-2ESHQB"
};
}
get slateEditorClasses() {
return this.WebpackModules.findByUniqueProperties(["slateTextArea"]);
}
get messageClasses() {
return this.WebpackModules.findByUniqueProperties(["message", "containerCozy"]);
}
get guildClasses() {
const guildsWrapper = BDModules.get(e => e.wrapper && e.unreadMentionsBar)[0];
const guilds = BDModules.get(e => e.guildsError && e.selected)[0];
const pill = BDModules.get(e => e.blobContainer)[0];
return Object.assign({}, guildsWrapper, guilds, pill);
}
get MessageContentComponent() {
return this.WebpackModules.find(m => m.defaultProps && m.defaultProps.hasOwnProperty("disableButtons"));
}
get MessageComponent() {
return this.WebpackModules.find(m => m.default && m.default.displayName && m.default.displayName == "Message");
}
get TimeFormatter() {
return this.WebpackModules.findByUniqueProperties(["dateFormat"]);
}
get TooltipWrapper() {
return this.WebpackModules.findByDisplayName("Tooltip");
}
get NativeModule() {
return this.WebpackModules.findByUniqueProperties(["setBadge"]);
}
get InviteActions() {
return this.WebpackModules.findByUniqueProperties(["acceptInvite"]);
}
get GuildActions() {
return this.WebpackModules.findByUniqueProperties(["leaveGuild"]);
}
get Tooltips() {
return this.WebpackModules.find(m => m.hide && m.show && !m.search && !m.submit && !m.search && !m.activateRagingDemon && !m.dismiss);
}
get KeyGenerator() {
return this.WebpackModules.find(m => m.toString && /"binary"/.test(m.toString()));
}
get LayerStack() {
return this.WebpackModules.findByUniqueProperties(["popLayer"]);
}
get UserStore() {
return this.WebpackModules.findByUniqueProperties(["getCurrentUser"]);
}
get ChannelStore() {
return this.WebpackModules.findByUniqueProperties(["getChannel"]);
}
get ChannelActions() {
return this.WebpackModules.findByUniqueProperties(["openPrivateChannel"]);
}
get PrivateChannelActions() {
return this.WebpackModules.findByUniqueProperties(["selectPrivateChannel"]);
}
openDM(userId) {
const selfId = this.UserStore.getCurrentUser().id;
if (selfId == userId) return;
const privateChannelId = this.ChannelStore.getDMFromUserId(userId);
if (privateChannelId) return this.PrivateChannelActions.selectPrivateChannel(privateChannelId);
this.ChannelActions.openPrivateChannel(selfId, userId);
}
parseSettings(cat) {
return Object.keys(_0globals__WEBPACK_IMPORTED_MODULE_0__["settings"]).reduce((arr, key) => {
const setting = _0globals__WEBPACK_IMPORTED_MODULE_0__["settings"][key];
if (setting.cat === cat && setting.implemented && !setting.hidden) {
setting.text = key;
arr.push(setting);
}
return arr;
}, []);
}
}());
/***/ }),
/***/ "./src/modules/voiceMode.js":
/*!**********************************!*\
!*** ./src/modules/voiceMode.js ***!
\**********************************/
/*! exports provided: default */
/***/ (function(module, __webpack_exports__, __webpack_require__) {
"use strict";
__webpack_require__.r(__webpack_exports__);
/* harmony import */ var _domtools__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ./domtools */ "./src/modules/domtools.js");
const style = `
.container-2Rl01u {
display: none!important;
}
.chat-3bRxxu {
display: none!important;
}
.sidebar-2K8pFh {
flex-grow: 1!important;
}
`;
/* harmony default export */ __webpack_exports__["default"] = (new class VoiceMode {
start() {
_domtools__WEBPACK_IMPORTED_MODULE_0__["default"].addStyle("VoiceMode", style);
}
stop() {
_domtools__WEBPACK_IMPORTED_MODULE_0__["default"].removeStyle("VoiceMode");
}
}());
/***/ }),
/***/ "./src/modules/webpackModules.js":
/*!***************************************!*\
!*** ./src/modules/webpackModules.js ***!
\***************************************/
/*! exports provided: default */
/***/ (function(module, __webpack_exports__, __webpack_require__) {
"use strict";
__webpack_require__.r(__webpack_exports__);
const req = webpackJsonp.push([[], {
__extra_id__: (module, exports, req) => module.exports = req
}, [["__extra_id__"]]]);
delete req.m.__extra_id__;
delete req.c.__extra_id__;
const find = filter => {
for (const i in req.c) {
if (req.c.hasOwnProperty(i)) {
const m = req.c[i].exports;
if (m && m.__esModule && m.default && filter(m.default)) return m.default;
if (m && filter(m)) return m;
}
} // console.warn("Cannot find loaded module in cache");
return null;
};
const findAll = filter => {
const modules = [];
for (const i in req.c) {
if (req.c.hasOwnProperty(i)) {
const m = req.c[i].exports;
if (m && m.__esModule && m.default && filter(m.default)) modules.push(m.default);else if (m && filter(m)) modules.push(m);
}
}
return modules;
};
const findByProps = (...propNames) => find(module => propNames.every(prop => module[prop] !== undefined));
const findByPrototypes = (...protoNames) => find(module => module.prototype && protoNames.every(protoProp => module.prototype[protoProp] !== undefined));
const findByDisplayName = displayName => find(module => module.displayName === displayName);
/* harmony default export */ __webpack_exports__["default"] = ({
find,
findAll,
findByProps,
findByPrototypes,
findByDisplayName
});
/***/ }),
/***/ "./src/svg/LightcordUser.jsx":
/*!***********************************!*\
!*** ./src/svg/LightcordUser.jsx ***!
\***********************************/
/*! exports provided: default */
/***/ (function(module, __webpack_exports__, __webpack_require__) {
"use strict";
__webpack_require__.r(__webpack_exports__);
/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "default", function() { return LightcordUserBadge; });
/* harmony import */ var _modules_v2__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ../modules/v2 */ "./src/modules/v2.js");
function _extends() { _extends = Object.assign || function (target) { for (var i = 1; i < arguments.length; i++) { var source = arguments[i]; for (var key in source) { if (Object.prototype.hasOwnProperty.call(source, key)) { target[key] = source[key]; } } } return target; }; return _extends.apply(this, arguments); }
let profilModule = BDModules.get(e => e.default && e.default.open && e.default.fetchMutualFriends)[0];
class LightcordUserBadge extends React.Component {
render() {
const props = this.props;
delete props.href.target;
console.log(props);
return React.createElement(props.Anchor, _extends({
href: "/users/" + props.user.id
}, props.href, {
onClick: ev => {
ev.preventDefault();
if (!profilModule) profilModule = BDModules.get(e => e.default && e.default.open && e.default.fetchMutualFriends)[0];
profilModule.default.open(props.user.id);
}
}), React.createElement("svg", _extends({
viewBox: "0 0 31.3 29.5"
}, props.svg, {
height: "100%"
}), React.createElement("path", {
d: "M22.8 1s12 8.2 7.4 19.7S16.6 29 20 25.6s-4-5.6-8.7-10L22.8 1",
fill: "rgba(227,6,19,.6)"
}), React.createElement("path", {
d: "M22.1 12.3c-2.5 3.2-6.1 4.8-8.9 4.3L3.6 28.8c-.7.9-1.9 1-2.8.3-.9-.7-1-1.9-.4-2.8L10 14.1c-1.3-2.5-.6-6.4 2-9.7 3.2-4 8-5.5 10.8-3.4s2.4 7.2-.7 11.3z",
fill: "#e30613"
})));
}
}
/***/ }),
/***/ "./src/svg/bug_hunter.jsx":
/*!********************************!*\
!*** ./src/svg/bug_hunter.jsx ***!
\********************************/
/*! exports provided: default */
/***/ (function(module, __webpack_exports__, __webpack_require__) {
"use strict";
__webpack_require__.r(__webpack_exports__);
/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "default", function() { return BugHunterBadge; });
function _extends() { _extends = Object.assign || function (target) { for (var i = 1; i < arguments.length; i++) { var source = arguments[i]; for (var key in source) { if (Object.prototype.hasOwnProperty.call(source, key)) { target[key] = source[key]; } } } return target; }; return _extends.apply(this, arguments); }
class BugHunterBadge extends React.Component {
render() {
const props = this.props;
return React.createElement("svg", _extends({
viewBox: "0 0 31.3 29.5"
}, props.svg, {
height: "100%"
}), React.createElement("path", {
d: "M22.8 1s12 8.2 7.4 19.7S16.6 29 20 25.6s-4-5.6-8.7-10L22.8 1",
fill: "rgba(227,6,19,.6)"
}), React.createElement("path", {
d: "M22.1 12.3c-2.5 3.2-6.1 4.8-8.9 4.3L3.6 28.8c-.7.9-1.9 1-2.8.3-.9-.7-1-1.9-.4-2.8L10 14.1c-1.3-2.5-.6-6.4 2-9.7 3.2-4 8-5.5 10.8-3.4s2.4 7.2-.7 11.3z",
fill: "#e30613"
}));
}
}
/***/ }),
/***/ "./src/svg/circus.jsx":
/*!****************************!*\
!*** ./src/svg/circus.jsx ***!
\****************************/
/*! exports provided: default */
/***/ (function(module, __webpack_exports__, __webpack_require__) {
"use strict";
__webpack_require__.r(__webpack_exports__);
/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "default", function() { return Circus; });
function _extends() { _extends = Object.assign || function (target) { for (var i = 1; i < arguments.length; i++) { var source = arguments[i]; for (var key in source) { if (Object.prototype.hasOwnProperty.call(source, key)) { target[key] = source[key]; } } } return target; }; return _extends.apply(this, arguments); }
class Circus extends React.Component {
render() {
return React.createElement("svg", _extends({
xmlns: "http://www.w3.org/2000/svg",
viewBox: "0 0 36 36"
}, this.props.svg, {
height: "100%"
}), React.createElement("path", {
fill: "#DD2E44",
d: "M33 33a2 2 0 01-2 2H5a2 2 0 01-2-2l1-12h28l1 12z"
}), React.createElement("path", {
fill: "#EA596E",
d: "M13 35c-.792-1.875-1.75-3.291-3.417-4.666 1.75-1.459 4.542-5.5 5.25-8.292s2.75 8.125 2.042 10.625S13 35 13 35zm10.303 0c.791-1.875 1.75-3.291 3.416-4.666-1.75-1.459-4.541-5.5-5.25-8.292-.707-2.792-2.75 8.125-2.04 10.625.708 2.5 3.874 2.333 3.874 2.333z"
}), React.createElement("path", {
fill: "#BE1931",
d: "M3.728 24.263A2.5 2.5 0 008 22.5c0-.565-.195-1.081-.511-1.5H4l-.272 3.263zm28.544 0L32 21h-3.489A2.482 2.482 0 0028 22.5a2.5 2.5 0 004.272 1.763z"
}), React.createElement("circle", {
cx: "14",
cy: "23",
r: "2",
fill: "#BE1931"
}), React.createElement("circle", {
cx: "22",
cy: "23",
r: "2",
fill: "#BE1931"
}), React.createElement("circle", {
cx: "10",
cy: "23",
r: "2",
fill: "#BE1931"
}), React.createElement("circle", {
cx: "26",
cy: "23",
r: "2",
fill: "#BE1931"
}), React.createElement("path", {
d: "M23 35H13s2-6 2-13h6c0 7 2 13 2 13zM17 2h2v7h-2z"
}), React.createElement("path", {
fill: "#55ACEE",
d: "M18.838.206C17.667.042 17 .318 17 1.418v1c0 1.1.865 1.753 1.923 1.451l5.154-.901c1.715-.343 1.548-1.593.085-1.884L18.838.206z"
}), React.createElement("path", {
fill: "#CCD6DD",
d: "M18 6l-.081.123C10.938 16.981 3 15.015 3 19v2.5a2.5 2.5 0 004.95.5H12a2 2 0 004 0h4a2 2 0 004 0h4.05a2.5 2.5 0 004.95-.5V19c0-4-8-2-15-13z"
}), React.createElement("g", {
fill: "#F5F8FA"
}, React.createElement("path", {
d: "M17.948 6.078l-.03.045C17.132 11.619 10.811 16.126 8 18v4a2 2 0 004 0v-4c.982-.982 5.813-6.787 5.984-11.732-.01-.064-.027-.126-.036-.19zm.08.398C18.324 11.374 23.031 17.031 24 18v4a2 2 0 004 0v-4c-2.75-1.833-8.953-6.19-9.972-11.524z"
}), React.createElement("path", {
d: "M17.984 6.27C17.922 8.346 17.606 16.394 16 18v4a2 2 0 004 0v-4c-1.564-1.564-1.905-9.241-1.979-11.559-.011-.057-.027-.113-.037-.171z"
})));
}
}
/***/ }),
/***/ "./src/svg/lightcord.jsx":
/*!*******************************!*\
!*** ./src/svg/lightcord.jsx ***!
\*******************************/
/*! exports provided: default */
/***/ (function(module, __webpack_exports__, __webpack_require__) {
"use strict";
__webpack_require__.r(__webpack_exports__);
/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "default", function() { return LightcordLogo; });
function _extends() { _extends = Object.assign || function (target) { for (var i = 1; i < arguments.length; i++) { var source = arguments[i]; for (var key in source) { if (Object.prototype.hasOwnProperty.call(source, key)) { target[key] = source[key]; } } } return target; }; return _extends.apply(this, arguments); }
class LightcordLogo extends React.Component {
render() {
const props = this.props;
return React.createElement("svg", _extends({
viewBox: "0 0 168 168.69"
}, props, {
height: "100%",
width: props.size
}), React.createElement("defs", null, React.createElement("linearGradient", {
id: "prefix__a",
x1: 66.7,
y1: -487.7,
x2: 66.7,
y2: -508.73,
gradientTransform: "matrix(1 0 0 -1 0 -408)",
gradientUnits: "userSpaceOnUse"
}, React.createElement("stop", {
offset: 0,
stopColor: "#e30613"
}), React.createElement("stop", {
offset: 1,
stopColor: "#731a14"
})), React.createElement("linearGradient", {
id: "prefix__b",
x1: 101.7,
y1: -487.7,
x2: 101.7,
y2: -508.73,
gradientTransform: "matrix(1 0 0 -1 0 -408)",
gradientUnits: "userSpaceOnUse"
}, React.createElement("stop", {
offset: 0,
stopColor: "#e20613"
}), React.createElement("stop", {
offset: 1,
stopColor: "#731a13"
})), React.createElement("linearGradient", {
id: "prefix__c",
x1: 84,
y1: -408,
x2: 84,
y2: -576.69,
gradientTransform: "matrix(1 0 0 -1 0 -408)",
gradientUnits: "userSpaceOnUse"
}, React.createElement("stop", {
offset: 0,
stopColor: "#e30613"
}), React.createElement("stop", {
offset: 1,
stopColor: "#731a13"
}))), React.createElement("path", {
fill: "#fff",
d: "M14.9 35.3h139.2V133H14.9z"
}), React.createElement("path", {
d: "M66.7 79.7c-5.4 0-9.8 4.7-9.8 10.5s4.4 10.5 9.8 10.5 9.8-4.7 9.8-10.5-4.4-10.5-9.8-10.5z",
fill: "url(#prefix__a)"
}), React.createElement("path", {
d: "M101.7 79.7c-5.4 0-9.8 4.7-9.8 10.5s4.4 10.5 9.8 10.5 9.8-4.7 9.8-10.5-4.4-10.5-9.8-10.5z",
fill: "url(#prefix__b)"
}), React.createElement("path", {
d: "M0 0v168l168 .69V0zm111.3 124.1s-3.4-4.1-6.3-7.7c12.6-3.5 17.4-11.3 17.4-11.3a52.52 52.52 0 01-11.1 5.6 68.63 68.63 0 01-38.9 4 70.12 70.12 0 01-14.1-4.1 48.88 48.88 0 01-7.1-3.3c-.3-.2-.6-.3-.9-.5a.76.76 0 00-.4-.2c-1.7-1-2.6-1.6-2.6-1.6s4.6 7.6 16.8 11.2c-2.9 3.6-6.4 7.9-6.4 7.9-21.2-.6-29.3-14.5-29.3-14.5 0-30.6 13.8-55.4 13.8-55.4 13.8-10.3 26.9-10 26.9-10l1 1.1C52.8 50.3 45 57.9 45 57.9a56.2 56.2 0 015.7-2.7 72.19 72.19 0 0121.8-6 8.75 8.75 0 011.6-.2 89.1 89.1 0 0119.4-.2 78.45 78.45 0 0128.9 9.1s-7.5-7.2-23.9-12.1l1.3-1.5s13.1-.3 26.9 10c0 0 13.8 24.8 13.8 55.4.1-.1-8 13.8-29.2 14.4z",
fill: "url(#prefix__c)"
}));
}
}
/***/ }),
/***/ "./src/ui/AccountInfos.jsx":
/*!*********************************!*\
!*** ./src/ui/AccountInfos.jsx ***!
\*********************************/
/*! exports provided: default */
/***/ (function(module, __webpack_exports__, __webpack_require__) {
"use strict";
__webpack_require__.r(__webpack_exports__);
/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "default", function() { return V2C_AccountInfos; });
/* harmony import */ var _modules_v2__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ../modules/v2 */ "./src/modules/v2.js");
/* harmony import */ var _settingsTitle__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ./settingsTitle */ "./src/ui/settingsTitle.js");
/**
* @type {typeof import("react")}
*/
const React = _modules_v2__WEBPACK_IMPORTED_MODULE_0__["default"].React;
let marginModule2 = BDModules.get(e => e.defaultMarginh5)[0];
let colorModule = BDModules.get(e => e.colorStandard)[0];
let sizeModule = BDModules.get(e => e.size32)[0];
let scrollbarModule1 = BDModules.get(e => e.scrollbarGhostHairline)[0];
const GuildModule = BDModules.get(e => e.default && e.default.getGuilds)[0].default;
const relationShipModule = BDModules.get(e => e.default && e.default.getRelationships)[0].default;
const sessionModule = BDModules.get(e => e.default && e.default.getSessions)[0].default;
const userModule = BDModules.get(e => e.default && e.default.getCurrentUser)[0].default;
class V2C_AccountInfos extends React.Component {
constructor(props) {
super(props);
}
render() {
if (!marginModule2) marginModule2 = BDModules.get(e => e.defaultMarginh5)[0];
if (!colorModule) colorModule = BDModules.get(e => e.colorStandard)[0];
if (!sizeModule) sizeModule = BDModules.get(e => e.size32)[0];
return [React.createElement(_settingsTitle__WEBPACK_IMPORTED_MODULE_1__["default"], {
text: "Account Infos"
}), React.createElement("div", null, React.createElement("h5", {
className: colorModule.colorStandard + " " + sizeModule.size14 + " " + marginModule2.h5 + " " + marginModule2.defaultMarginh5
}, "Profile"), React.createElement(CodeContent, {
content: this.getProfileValue(),
language: "diff"
}), React.createElement("h5", {
className: colorModule.colorStandard + " " + sizeModule.size14 + " " + marginModule2.h5 + " " + marginModule2.defaultMarginh5
}, "Statistics"), React.createElement(CodeContent, {
content: this.getStatistics(),
language: "diff"
}), React.createElement("h5", {
className: colorModule.colorStandard + " " + sizeModule.size14 + " " + marginModule2.h5 + " " + marginModule2.defaultMarginh5
}, "Connected Sessions"), React.createElement(CodeContent, {
content: this.getSessionValue(),
language: "diff"
})), React.createElement("div", {
className: BDModules.get(e => e.marginBottom20)[0].marginBottom20
})];
}
getSessionValue() {
const sessionsRaw = sessionModule.getSessions();
const sessions = Object.keys(sessionsRaw).filter(e => e !== "all").map(e => sessionsRaw[e]);
if (sessions.length === 0) return "- No session detected. Please try in a few seconds";
return sessions.map(e => {
return `+ id: ${e.sessionId}
+ os: ${e.clientInfo.os[0].toUpperCase() + e.clientInfo.os.slice(1)}
+ client: ${e.clientInfo.client}
+ status: ${e.status}
+ active: ${e.active ? "Yes" : "No"}
+ Activities: ${e.activities.length}`;
}).join("\n" + "-".repeat(38) + "\n");
}
getProfileValue() {
const user = userModule.getCurrentUser();
/**
* @type {Date}
*/
const createdAt = user.createdAt;
return `+ Username: ${user.username}
+ Discriminator: ${user.discriminator}
+ Tag: ${user.tag}
+ ID: ${user.id}
+ Avatar: ${user.avatar}
+ Avatar URL: https://cdn.discordapp.com/avatars/${user.id}/${user.avatar}.${user.avatar.startsWith("a_") ? "gif" : "png"}?size=4096
+ Creation Date: ${createdAt.getDate().toString().padStart(2, "0")}/${(createdAt.getMonth() + 1).toString().padStart(2, "0")}/${createdAt.getFullYear().toString().padStart(2, "0")} ${createdAt.getHours().toString().padStart(2, "0")}h ${createdAt.getMinutes().toString().padStart(2, "0")}min ${createdAt.getSeconds()}s
+ Flags: ${user.flags}
+ Has Nitro: ${user.hasPremiumSubscription ? "Yes" : "No"}
- Email: ${user.email}
- 2FA: ${user.mfaEnabled ? "Yes" : "No"}
- Has Been On Mobile: ${user.mobile ? "Yes" : "No"}
- Phone: ${user.phone || "None"}
- Verified: ${user.verified}`;
}
getStatistics() {
const guilds = Object.values(GuildModule.getGuilds());
const relations = Object.keys(relationShipModule.getRelationships());
const friends = relations.filter(e => relationShipModule.isFriend(e));
const blocked = relations.filter(e => relationShipModule.isBlocked(e));
return `+ Server Count: ${guilds.length} servers
+ Relations: ${relations.length} relations
+ Friends Count: ${friends.length} friends
- Blocked Users Count: ${blocked.length} blocked users`;
}
}
let hightlightJS = BDModules.get(e => e.highlight)[0];
let messageModule1 = BDModules.get(e => e.markup)[0];
let messageModule2 = BDModules.get(e => e.messageContent)[0];
class CodeContent extends React.Component {
render() {
if (!messageModule1) messageModule1 = BDModules.get(e => e.markup)[0];
if (!messageModule2) messageModule2 = BDModules.get(e => e.messageContent)[0];
if (!scrollbarModule1) scrollbarModule1 = BDModules.get(e => e.scrollbarGhostHairline)[0];
if (!hightlightJS) hightlightJS = BDModules.get(e => e.highlight)[0];
return React.createElement("div", {
class: `${messageModule1.markup} ${messageModule2.messageContent}`
}, React.createElement("pre", null, React.createElement("code", {
class: `${scrollbarModule1.scrollbarGhostHairline} hljs`,
dangerouslySetInnerHTML: {
__html: hightlightJS.highlight(this.props.language, this.props.content).value
}
})), React.createElement("div", {
className: BDModules.get(e => e.marginBottom8)[0].marginBottom8
}));
}
}
/***/ }),
/***/ "./src/ui/ApiPreview.jsx":
/*!*******************************!*\
!*** ./src/ui/ApiPreview.jsx ***!
\*******************************/
/*! exports provided: default */
/***/ (function(module, __webpack_exports__, __webpack_require__) {
"use strict";
__webpack_require__.r(__webpack_exports__);
/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "default", function() { return ApiPreview; });
/* harmony import */ var fs__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! fs */ "fs");
/* harmony import */ var fs__WEBPACK_IMPORTED_MODULE_0___default = /*#__PURE__*/__webpack_require__.n(fs__WEBPACK_IMPORTED_MODULE_0__);
/* harmony import */ var _modules_distant__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ../modules/distant */ "./src/modules/distant.js");
/* harmony import */ var _modules_webpackModules__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! ../modules/webpackModules */ "./src/modules/webpackModules.js");
/* harmony import */ var electron__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(/*! electron */ "electron");
/* harmony import */ var electron__WEBPACK_IMPORTED_MODULE_3___default = /*#__PURE__*/__webpack_require__.n(electron__WEBPACK_IMPORTED_MODULE_3__);
/* harmony import */ var _margintop__WEBPACK_IMPORTED_MODULE_4__ = __webpack_require__(/*! ./margintop */ "./src/ui/margintop.jsx");
// Good luck to read my code, Even me can't read it properly.
const keys = {
settingTitle: Object(_modules_distant__WEBPACK_IMPORTED_MODULE_1__["uuidv4"])()
};
let formModule;
class ApiPreview extends React.PureComponent {
constructor() {
super(...arguments);
this.state = {
states: []
};
}
render() {
if (!formModule) formModule = _modules_webpackModules__WEBPACK_IMPORTED_MODULE_2__["default"].find(e => e.FormSection);
/**
* @type {Function[]}
*/
const allComponents = [...new Set(Object.keys(window.Lightcord.Api.Components).map(e => {
return Object.keys(window.Lightcord.Api.Components[e]).map(k => window.Lightcord.Api.Components[e][k]);
}).flat())];
return [React.createElement(formModule.FormSection, {
tag: "h2",
title: "Lightcord's Api Availlable components"
}, React.createElement(formModule.FormText, {
type: "description",
className: "",
selectable: false
}, "These components are here for the plugin devs. They can quickly embed any component below with this panel."), React.createElement(_margintop__WEBPACK_IMPORTED_MODULE_4__["default"], null), React.createElement(Lightcord.Api.Components.inputs.Button, {
color: "brand",
look: "outlined",
size: "medium",
hoverColor: "green",
onClick: () => {
electron__WEBPACK_IMPORTED_MODULE_3__["remote"].shell.openExternal("https://github.com/lightcord/lightcord/wiki/apis");
},
wrapper: false
}, "Documentation")), allComponents.map(comp => {
let AllPreviews = [];
if (comp.AllPreviews) AllPreviews = comp.AllPreviews;
let onChange = tab => {
setState({
tab
});
};
let setState = newState => {
this.setState({
states: [Object.assign(state, newState)].concat(this.state.states.filter(e => e.elem !== comp))
});
};
let state = this.state.states.find(e => e.elem === comp);
if (!state) {
state = {
tab: "preview",
elem: comp,
options: {}
};
this.state.states.push(state);
}
let getProps = () => {
let final = {};
AllPreviews.forEach(category => {
final[Object.keys(category[0])[0]] = category[0][Object.keys(category[0])[0]];
});
Object.keys(state.options).forEach(key => {
final[key] = AllPreviews.find(e => e.find(e => e[key]))[state.options[key]][key];
});
return final;
};
let renderPreview = () => {
return React.createElement("div", {
style: {
marginTop: "20px",
marginBottom: "20px"
}
}, React.createElement("div", {
style: {
backgroundColor: "var(--background-primary)",
padding: "30px 30px",
borderRadius: "8px"
},
className: "lc-tab-box-shadow"
}, React.createElement(comp, getProps())));
};
let renderCode = () => {
return React.createElement("div", {
style: {
marginTop: "20px",
marginBottom: "20px"
}
}, React.createElement("div", {
style: {
backgroundColor: "var(--background-primary)",
padding: "30px 30px",
borderRadius: "8px"
},
className: "lc-tab-box-shadow"
}, React.createElement(window.Lightcord.Api.Components.general.SettingSubTitle, null, "JSX"), React.createElement(window.Lightcord.Api.Components.general.CodeBlock, {
language: "jsx",
content: generateCode("jsx")
}), React.createElement(window.Lightcord.Api.Components.general.SettingSubTitle, null, "React"), React.createElement(window.Lightcord.Api.Components.general.CodeBlock, {
language: "js",
content: generateCode("react")
})));
};
let getStrForProp = value => {
if (typeof value === "string") {
return value;
} else if (typeof value === "boolean") {
return String(value);
} else if (typeof value === "function") {
return value.toString();
} else if (typeof value === "object") {
if (value && value.$$typeof && (value.$$typeof === Symbol.for("react.element") || value.$$typeof === 0xeac7)) {
return "Your components here.";
}
return JSON.stringify(value, null, " ");
} else if (typeof value === "number") {
return String(value);
}
return String(value);
};
let generateCode = function (lang) {
// code formatting is hard
const compName = comp.displayName || comp.name;
let categories = Object.keys(window.Lightcord.Api.Components);
const compCategory = categories.find(e => window.Lightcord.Api.Components[e][compName]);
const compPath = `Lightcord.Api.Components.${compCategory}.${compName}`;
const props = getProps();
if (lang === "jsx") {
let propStrings = [];
let childrenProp = null;
Object.keys(props).forEach(key => {
if (key == "children") {
childrenProp = getStrForProp(props[key]);
} else {
let str = key + "=";
if (typeof props[key] === "string") {
str += JSON.stringify(props[key]);
} else {
str += `{${getStrForProp(props[key])}}`;
}
propStrings.push(str);
}
});
let openTag;
if (childrenProp) {
openTag = `<${compPath} ${propStrings.join(" ")}>`;
let closeTag = `</${compPath}>`;
return `${openTag}\n ${childrenProp}\n${closeTag}`;
} else {
openTag = `<${compPath} ${propStrings.join(" ")}/>`;
return openTag;
}
} else if (lang === "react") {
let children = props.children || null;
delete props.children;
if (children && children.$$typeof && (children.$$typeof === Symbol.for("react.element") || children.$$typeof === 0xeac7)) {
children = "Your components here.";
}
let propStrings = [];
Object.keys(props).forEach(key => {
let visibleKey = /[^\w\d_]/g.test(key) ? JSON.stringify(key) : key;
let str = visibleKey + ": ";
if (typeof props[key] === "string") {
str += JSON.stringify(props[key]);
} else {
str += getStrForProp(props[key]).split("\n").map((str, i) => {
if (i === 0) return str;
return " " + str;
}).join("\n");
}
propStrings.push(str);
});
let propObject = "{";
if (propStrings.length) {
propStrings.forEach((str, i) => {
let isLast = i === propStrings.length - 1;
let isFirst = i === 0;
if (!isFirst) {
propObject += ",";
}
propObject += "\n ";
propObject += str;
if (isLast) {
propObject += "\n}";
}
});
} else {
propObject += "}";
}
return `React.createElement(${compPath}, ${propObject}, ${JSON.stringify(children)})`;
}
};
return React.createElement("div", null, React.createElement(window.Lightcord.Api.Components.general.SettingsTitle, null, comp.displayName || comp.name), AllPreviews.map(category => {
if (category[0].onClick) return null;
if (category[0].text) return null;
if (category[0].children) return null;
if (category.length === 1) return null;
let key = Object.keys(category[0])[0];
return [React.createElement(window.Lightcord.Api.Components.general.SettingSubTitle, null, key), React.createElement(window.Lightcord.Api.Components.inputs.Dropdown, {
options: category.map((e, index) => {
return {
value: "opt-" + index,
label: JSON.stringify(e[Object.keys(e)[0]])
};
}),
value: "opt-" + (state.options[key] || "0"),
onChange: value => {
setState({
options: Object.assign({}, state.options, {
[key]: (value.value || "0").replace("opt-", "")
})
});
},
searchable: true
}), React.createElement("div", {
style: {
marginBottom: "8px"
}
})];
}), React.createElement(window.Lightcord.Api.Components.general.Tabs, {
tabs: [{
label: "Preview",
id: "preview"
}, {
label: "Code",
id: "code"
}],
active: state.tab,
children: state.tab === "preview" ? renderPreview() : renderCode(),
onChange: onChange
}));
})];
}
get renders() {}
}
/***/ }),
/***/ "./src/ui/addoncard.jsx":
/*!******************************!*\
!*** ./src/ui/addoncard.jsx ***!
\******************************/
/*! exports provided: default */
/***/ (function(module, __webpack_exports__, __webpack_require__) {
"use strict";
__webpack_require__.r(__webpack_exports__);
/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "default", function() { return V2C_PluginCard; });
/* harmony import */ var _0globals__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ../0globals */ "./src/0globals.js");
/* harmony import */ var _modules_v2__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ../modules/v2 */ "./src/modules/v2.js");
/* harmony import */ var _modules_utils__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! ../modules/utils */ "./src/modules/utils.js");
/* harmony import */ var _modules_domtools__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(/*! ../modules/domtools */ "./src/modules/domtools.js");
/* harmony import */ var _xSvg__WEBPACK_IMPORTED_MODULE_4__ = __webpack_require__(/*! ./xSvg */ "./src/ui/xSvg.js");
/* harmony import */ var _reloadIcon__WEBPACK_IMPORTED_MODULE_5__ = __webpack_require__(/*! ./reloadIcon */ "./src/ui/reloadIcon.js");
/* harmony import */ var _icons_edit__WEBPACK_IMPORTED_MODULE_6__ = __webpack_require__(/*! ./icons/edit */ "./src/ui/icons/edit.jsx");
/* harmony import */ var _icons_delete__WEBPACK_IMPORTED_MODULE_7__ = __webpack_require__(/*! ./icons/delete */ "./src/ui/icons/delete.jsx");
/* harmony import */ var _components_switch__WEBPACK_IMPORTED_MODULE_8__ = __webpack_require__(/*! ./components/switch */ "./src/ui/components/switch.jsx");
/* harmony import */ var _tooltipWrap__WEBPACK_IMPORTED_MODULE_9__ = __webpack_require__(/*! ./tooltipWrap */ "./src/ui/tooltipWrap.js");
/* harmony import */ var _modules_pluginCertifier__WEBPACK_IMPORTED_MODULE_10__ = __webpack_require__(/*! ../modules/pluginCertifier */ "./src/modules/pluginCertifier.js");
/* harmony import */ var _modules_contentManager__WEBPACK_IMPORTED_MODULE_11__ = __webpack_require__(/*! ../modules/contentManager */ "./src/modules/contentManager.js");
/* harmony import */ var path__WEBPACK_IMPORTED_MODULE_12__ = __webpack_require__(/*! path */ "path");
/* harmony import */ var path__WEBPACK_IMPORTED_MODULE_12___default = /*#__PURE__*/__webpack_require__.n(path__WEBPACK_IMPORTED_MODULE_12__);
const React = _modules_v2__WEBPACK_IMPORTED_MODULE_1__["default"].React;
const anchorClasses = _modules_v2__WEBPACK_IMPORTED_MODULE_1__["default"].anchorClasses;
class V2C_PluginCard extends _modules_v2__WEBPACK_IMPORTED_MODULE_1__["default"].reactComponent {
constructor(props) {
super(props);
this.onChange = this.onChange.bind(this);
this.showSettings = this.showSettings.bind(this);
this.setInitialState();
this.hasSettings = this.props.addon.plugin && typeof this.props.addon.plugin.getSettingsPanel === "function";
this.settingsPanel = "";
this.edit = this.edit.bind(this);
this.delete = this.delete.bind(this);
this.reload = this.reload.bind(this);
}
setInitialState() {
this.state = {
checked: this.props.enabled,
settings: false,
reloads: 0,
trusted: false
};
}
showSettings() {
if (!this.hasSettings) return;
this.setState({
settings: true
});
}
closeSettings() {
this.panelRef.current.innerHTML = "";
this.setState({
settingsOpen: false
});
}
componentDidUpdate() {
if (!this.state.settings) return;
if (typeof this.settingsPanel === "object") {
this.refs.settingspanel.appendChild(this.settingsPanel);
}
if (!_0globals__WEBPACK_IMPORTED_MODULE_0__["settingsCookie"]["fork-ps-3"]) return;
setImmediate(() => {
const isHidden = (container, element) => {
const cTop = container.scrollTop;
const cBottom = cTop + container.clientHeight;
const eTop = element.offsetTop;
const eBottom = eTop + element.clientHeight;
return eTop < cTop || eBottom > cBottom;
};
const thisNode = this.refs.cardNode;
const container = thisNode.closest("div[class*=\"scroller-\"]");
if (!isHidden(container, thisNode)) return;
const thisNodeOffset = _modules_domtools__WEBPACK_IMPORTED_MODULE_3__["default"].offset(thisNode);
const containerOffset = _modules_domtools__WEBPACK_IMPORTED_MODULE_3__["default"].offset(container);
const original = container.scrollTop;
const endPoint = thisNodeOffset.top - containerOffset.top + container.scrollTop - 30;
_modules_domtools__WEBPACK_IMPORTED_MODULE_3__["default"].animate({
duration: 300,
update: function (progress) {
if (endPoint > original) container.scrollTop = original + progress * (endPoint - original);else container.scrollTop = original - progress * (original - endPoint);
}
});
});
}
getString(value) {
if (!value) return "???";
return typeof value == "string" ? value : value.toString();
}
get settingsComponent() {
try {
this.settingsPanel = this.props.addon.plugin.getSettingsPanel();
} catch (err) {
_modules_utils__WEBPACK_IMPORTED_MODULE_2__["default"].err("Plugins", "Unable to get settings panel for " + this.name + ".", err);
}
return _modules_v2__WEBPACK_IMPORTED_MODULE_1__["default"].react.createElement("div", {
className: "bd-card bd-addon-card settings-open ui-switch-item",
ref: "cardNode"
}, _modules_v2__WEBPACK_IMPORTED_MODULE_1__["default"].react.createElement("div", {
style: {
"float": "right",
"cursor": "pointer"
},
onClick: () => {
this.refs.settingspanel.innerHTML = "";
this.setState({
settings: false
});
}
}, _modules_v2__WEBPACK_IMPORTED_MODULE_1__["default"].react.createElement(_xSvg__WEBPACK_IMPORTED_MODULE_4__["default"], null)), typeof this.settingsPanel === "object" && _modules_v2__WEBPACK_IMPORTED_MODULE_1__["default"].react.createElement("div", {
id: `plugin-settings-${this.name}`,
className: "plugin-settings",
ref: "settingspanel"
}), typeof this.settingsPanel !== "object" && _modules_v2__WEBPACK_IMPORTED_MODULE_1__["default"].react.createElement("div", {
id: `plugin-settings-${this.name}`,
className: "plugin-settings",
ref: "settingspanel",
dangerouslySetInnerHTML: {
__html: this.settingsPanel
}
}));
}
buildTitle(name, version, author) {
const title = "{{name}} v{{version}} by {{author}}".split(/({{[A-Za-z]+}})/);
const nameIndex = title.findIndex(s => s == "{{name}}");
if (nameIndex) title[nameIndex] = React.createElement("span", {
className: "name bda-name"
}, name);
const versionIndex = title.findIndex(s => s == "{{version}}");
if (nameIndex) title[versionIndex] = React.createElement("span", {
className: "version bda-version"
}, version);
const authorIndex = title.findIndex(s => s == "{{author}}");
if (nameIndex) {
const props = {
className: "author bda-author"
};
if (author.link || author.id) {
props.className += ` ${anchorClasses.anchor} ${anchorClasses.anchorUnderlineOnHover}`;
props.target = "_blank";
if (author.link) props.href = author.link;
if (author.id) props.onClick = () => {
_modules_v2__WEBPACK_IMPORTED_MODULE_1__["default"].LayerStack.popLayer();
_modules_v2__WEBPACK_IMPORTED_MODULE_1__["default"].openDM(author.id);
};
}
title[authorIndex] = React.createElement(author.link || author.id ? "a" : "span", props, author.name);
}
return title.flat();
}
makeLink(title, url) {
const props = {
className: "bda-link bda-link-website",
target: "_blank"
};
if (typeof url == "string") props.href = url;
if (typeof url == "function") props.onClick = event => {
event.preventDefault();
event.stopPropagation();
url();
};
return _modules_v2__WEBPACK_IMPORTED_MODULE_1__["default"].react.createElement("a", props, title);
}
makeButton(title, children, action) {
return React.createElement(_tooltipWrap__WEBPACK_IMPORTED_MODULE_9__["default"], {
color: "black",
side: "top",
text: title
}, React.createElement("div", {
className: "bd-addon-button",
onClick: action
}, children));
}
componentWillUnmount() {
this.unmounted = true;
}
get links() {
const links = [];
const addon = this.props.addon;
if (addon.website) links.push(this.makeLink("Website", addon.website));
if (addon.source) links.push(this.makeLink("Source", addon.source));
if (addon.invite) {
links.push(this.makeLink("Support Server", () => {
const tester = /\.gg\/(.*)$/;
let code = addon.invite;
if (tester.test(code)) code = code.match(tester)[1];
_modules_v2__WEBPACK_IMPORTED_MODULE_1__["default"].LayerStack.popLayer();
_modules_v2__WEBPACK_IMPORTED_MODULE_1__["default"].InviteActions.acceptInviteAndTransitionToInviteChannel(code);
}));
}
if (addon.donate) links.push(this.makeLink("Donate", addon.donate));
if (addon.patreon) links.push(this.makeLink("Patreon", addon.patreon));
return links;
}
get footer() {
const links = this.links;
return (links.length || this.hasSettings) && _modules_v2__WEBPACK_IMPORTED_MODULE_1__["default"].react.createElement("div", {
className: "bd-card-footer bda-footer"
}, _modules_v2__WEBPACK_IMPORTED_MODULE_1__["default"].react.createElement("span", {
className: "bd-addon-links bda-links"
}, ...links.map((element, index) => index < links.length - 1 ? [element, " | "] : element).flat()), this.hasSettings && _modules_v2__WEBPACK_IMPORTED_MODULE_1__["default"].react.createElement("button", {
onClick: this.showSettings,
className: "bd-button bda-settings-button",
disabled: !this.state.checked
}, "Settings"));
}
onChange() {
this.props.toggle && this.props.toggle(this.name);
this.setState({
checked: !this.state.checked
});
}
edit() {
this.props.edit(this.name);
}
delete() {
this.props.remove(this.name);
}
reload() {
this.props.reload(this.name);
}
get name() {
return this.getString(this.props.addon.plugin ? this.props.addon.plugin.getName() : this.props.addon.name);
}
get author() {
return this.getString(this.props.addon.plugin ? this.props.addon.plugin.getAuthor() : this.props.addon.author);
}
get description() {
return this.getString(this.props.addon.plugin ? this.props.addon.plugin.getDescription() : this.props.addon.description);
}
get version() {
return this.getString(this.props.addon.plugin ? this.props.addon.plugin.getVersion() : this.props.addon.version);
}
render() {
if (this.state.settings) return this.settingsComponent;
const {
authorId,
authorLink
} = this.props.addon;
const style = {};
if (!this.isScanning) {
this.isScanning = true;
Object(_modules_pluginCertifier__WEBPACK_IMPORTED_MODULE_10__["processFile"])(Object(path__WEBPACK_IMPORTED_MODULE_12__["resolve"])(this.props.addon.filename.endsWith(".plugin.js") ? _modules_contentManager__WEBPACK_IMPORTED_MODULE_11__["default"].pluginsFolder : _modules_contentManager__WEBPACK_IMPORTED_MODULE_11__["default"].themesFolder, this.props.addon.filename), result => {
if (this.unmounted) return;
this.setState({
isTrusted: !result.suspect
});
}, () => {});
} else {
if (this.state.isTrusted) {
style.borderColor = "#4087ed";
}
}
return _modules_v2__WEBPACK_IMPORTED_MODULE_1__["default"].react.createElement("div", {
className: "bd-card bd-addon-card settings-closed ui-switch-item",
style
}, _modules_v2__WEBPACK_IMPORTED_MODULE_1__["default"].react.createElement("div", {
className: "bd-addon-header bda-header"
}, _modules_v2__WEBPACK_IMPORTED_MODULE_1__["default"].react.createElement("div", {
className: "bd-card-title bda-header-title"
}, this.buildTitle(this.name, this.version, {
name: this.author,
id: authorId,
link: authorLink
})), _modules_v2__WEBPACK_IMPORTED_MODULE_1__["default"].react.createElement("div", {
className: "bd-addon-controls bda-controls"
}, this.props.edit && this.makeButton("Edit", React.createElement(_icons_edit__WEBPACK_IMPORTED_MODULE_6__["default"], {
className: "bd-icon"
}), this.edit), this.props.remove && this.makeButton("Delete", React.createElement(_icons_delete__WEBPACK_IMPORTED_MODULE_7__["default"], {
className: "bd-icon"
}), this.delete), this.props.reload && this.makeButton("Reload", React.createElement(_reloadIcon__WEBPACK_IMPORTED_MODULE_5__["default"], {
className: "bd-icon"
}), this.reload), React.createElement(_components_switch__WEBPACK_IMPORTED_MODULE_8__["default"], {
onChange: this.onChange,
checked: this.state.checked
}))), _modules_v2__WEBPACK_IMPORTED_MODULE_1__["default"].react.createElement("div", {
className: "bd-scroller-wrap bda-description-wrap scroller-wrap fade"
}, _modules_v2__WEBPACK_IMPORTED_MODULE_1__["default"].react.createElement("div", {
className: "bd-scroller bd-addon-description bda-description scroller"
}, this.description)), this.footer);
}
}
const originalRender = V2C_PluginCard.prototype.render;
Object.defineProperty(V2C_PluginCard.prototype, "render", {
enumerable: false,
configurable: false,
set: function () {
console.warn("Addon policy for plugins #5 https://github.com/rauenzi/BetterDiscordApp/wiki/Addon-Policies#plugins");
},
get: () => originalRender
});
/***/ }),
/***/ "./src/ui/addonlist.jsx":
/*!******************************!*\
!*** ./src/ui/addonlist.jsx ***!
\******************************/
/*! exports provided: default */
/***/ (function(module, __webpack_exports__, __webpack_require__) {
"use strict";
__webpack_require__.r(__webpack_exports__);
/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "default", function() { return CardList; });
/* harmony import */ var _errorBoundary__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ./errorBoundary */ "./src/ui/errorBoundary.js");
/* harmony import */ var _contentColumn__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ./contentColumn */ "./src/ui/contentColumn.js");
/* harmony import */ var _tools__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! ./tools */ "./src/ui/tools.js");
/* harmony import */ var _reloadIcon__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(/*! ./reloadIcon */ "./src/ui/reloadIcon.js");
/* harmony import */ var _addoncard__WEBPACK_IMPORTED_MODULE_4__ = __webpack_require__(/*! ./addoncard */ "./src/ui/addoncard.jsx");
/* harmony import */ var _scroller__WEBPACK_IMPORTED_MODULE_5__ = __webpack_require__(/*! ./scroller */ "./src/ui/scroller.js");
/* harmony import */ var _components_dropdown__WEBPACK_IMPORTED_MODULE_6__ = __webpack_require__(/*! ./components/dropdown */ "./src/ui/components/dropdown.jsx");
/* harmony import */ var _components_search__WEBPACK_IMPORTED_MODULE_7__ = __webpack_require__(/*! ./components/search */ "./src/ui/components/search.jsx");
/* harmony import */ var _0globals__WEBPACK_IMPORTED_MODULE_8__ = __webpack_require__(/*! ../0globals */ "./src/0globals.js");
/* harmony import */ var _modules_contentManager__WEBPACK_IMPORTED_MODULE_9__ = __webpack_require__(/*! ../modules/contentManager */ "./src/modules/contentManager.js");
/* harmony import */ var _modules_v2__WEBPACK_IMPORTED_MODULE_10__ = __webpack_require__(/*! ../modules/v2 */ "./src/modules/v2.js");
/* harmony import */ var _modules_pluginModule__WEBPACK_IMPORTED_MODULE_11__ = __webpack_require__(/*! ../modules/pluginModule */ "./src/modules/pluginModule.js");
/* harmony import */ var _modules_themeModule__WEBPACK_IMPORTED_MODULE_12__ = __webpack_require__(/*! ../modules/themeModule */ "./src/modules/themeModule.js");
/* harmony import */ var _modules_webpackModules__WEBPACK_IMPORTED_MODULE_13__ = __webpack_require__(/*! ../modules/webpackModules */ "./src/modules/webpackModules.js");
/* harmony import */ var _modules_bdApi__WEBPACK_IMPORTED_MODULE_14__ = __webpack_require__(/*! ../modules/bdApi */ "./src/modules/bdApi.js");
function _extends() { _extends = Object.assign || function (target) { for (var i = 1; i < arguments.length; i++) { var source = arguments[i]; for (var key in source) { if (Object.prototype.hasOwnProperty.call(source, key)) { target[key] = source[key]; } } } return target; }; return _extends.apply(this, arguments); }
const Tooltip = _modules_webpackModules__WEBPACK_IMPORTED_MODULE_13__["default"].findByDisplayName("Tooltip");
const React = _modules_v2__WEBPACK_IMPORTED_MODULE_10__["default"].react;
class CardList extends _modules_v2__WEBPACK_IMPORTED_MODULE_10__["default"].reactComponent {
constructor(props) {
super(props);
this.state = {
sort: "name",
ascending: true,
query: ""
};
this.isPlugins = this.props.type == "plugins";
this.cookie = this.isPlugins ? _0globals__WEBPACK_IMPORTED_MODULE_8__["pluginCookie"] : _0globals__WEBPACK_IMPORTED_MODULE_8__["themeCookie"];
this.manager = this.isPlugins ? _modules_pluginModule__WEBPACK_IMPORTED_MODULE_11__["default"] : _modules_themeModule__WEBPACK_IMPORTED_MODULE_12__["default"];
this.sort = this.sort.bind(this);
this.reverse = this.reverse.bind(this);
this.search = this.search.bind(this);
}
openFolder() {
__webpack_require__(/*! electron */ "electron").shell.openItem(this.isPlugins ? _modules_contentManager__WEBPACK_IMPORTED_MODULE_9__["default"].pluginsFolder : _modules_contentManager__WEBPACK_IMPORTED_MODULE_9__["default"].themesFolder);
}
edit(name) {
console.log(name);
this.manager.edit(name);
}
async delete(name) {
const shouldDelete = await this.confirmDelete(name);
if (!shouldDelete) return;
this.manager.delete(name);
}
confirmDelete(name) {
return new Promise(resolve => {
_modules_bdApi__WEBPACK_IMPORTED_MODULE_14__["default"].showConfirmationModal("Are You Sure?", `Are you sure you want to delete ${name}?`, {
danger: true,
confirmText: "Delete",
onConfirm: () => {
resolve(true);
},
onCancel: () => {
resolve(false);
}
});
});
}
get sortOptions() {
return [{
label: "Name",
value: "name"
}, {
label: "Author",
value: "author"
}, {
label: "Version",
value: "version"
}, {
label: "Recently Added",
value: "added"
}, {
label: "Last Modified",
value: "modified"
}, {
label: "File Size",
value: "size"
}];
}
get directions() {
return [{
label: "Ascending",
value: true
}, {
label: "Descending",
value: false
}];
}
reverse(value) {
this.setState({
ascending: value
});
}
sort(value) {
this.setState({
sort: value
});
}
search(event) {
this.setState({
query: event.target.value.toLocaleLowerCase()
});
}
getProps(addon) {
return {
key: this.getName(addon),
enabled: this.cookie[this.getName(addon)],
toggle: this.manager.toggle.bind(this.manager),
//edit: this.edit.bind(this),
remove: this.delete.bind(this),
addon: addon,
hash: addon.hash
};
}
getString(value) {
if (!value) return "???";
return typeof value == "string" ? value : value.toString();
}
get list() {
return this.props.type === "plugins" ? Object.values(bdplugins) : Object.values(bdthemes);
}
getAddons() {
const sortedAddons = this.list.sort((a, b) => {
const cap = this.state.sort.charAt(0).toUpperCase() + this.state.sort.slice(1);
const first = a.plugin && a.plugin[`get${cap}`] ? this.getString(a.plugin[`get${cap}`]()) : a[this.state.sort];
const second = b.plugin && b.plugin[`get${cap}`] ? this.getString(b.plugin[`get${cap}`]()) : b[this.state.sort];
if (typeof first == "string") return first.toLocaleLowerCase().localeCompare(second.toLocaleLowerCase());
if (first > second) return 1;
if (second > first) return -1;
return 0;
});
if (!this.state.ascending) sortedAddons.reverse();
const rendered = [];
for (let a = 0; a < sortedAddons.length; a++) {
const addon = sortedAddons[a];
if (this.state.query) {
let matches = null;
const name = this.getName(addon);
const author = this.getAuthor(addon);
const description = this.getDescription(addon);
const version = this.getVersion(addon);
if (name) matches = name.toLocaleLowerCase().includes(this.state.query);
if (author) matches = matches || author.toLocaleLowerCase().includes(this.state.query);
if (description) matches = matches || description.toLocaleLowerCase().includes(this.state.query);
if (version) matches = matches || version.toLocaleLowerCase().includes(this.state.query);
if (!matches) continue;
}
const props = this.getProps(addon);
rendered.push(React.createElement(_errorBoundary__WEBPACK_IMPORTED_MODULE_0__["default"], null, React.createElement(_addoncard__WEBPACK_IMPORTED_MODULE_4__["default"], _extends({}, props, {
reload: !_0globals__WEBPACK_IMPORTED_MODULE_8__["settingsCookie"]["fork-ps-5"] && this.manager.reload.bind(this.manager)
}))));
}
return rendered;
}
getName(addon) {
return this.getString(addon.plugin ? addon.plugin.getName() : addon.name);
}
getAuthor(addon) {
return this.getString(addon.plugin ? addon.plugin.getAuthor() : addon.author);
}
getDescription(addon) {
return this.getString(addon.plugin ? addon.plugin.getDescription() : addon.description);
}
getVersion(addon) {
return this.getString(addon.plugin ? addon.plugin.getVersion() : addon.version);
}
render() {
const refreshIcon = React.createElement(Tooltip, {
color: "black",
position: "top",
text: "Reload List"
}, props => React.createElement(_reloadIcon__WEBPACK_IMPORTED_MODULE_3__["default"], _extends({}, props, {
className: "bd-icon bd-reload bd-reload-header",
size: "18px",
onClick: async () => {
if (this.isPlugins) _modules_pluginModule__WEBPACK_IMPORTED_MODULE_11__["default"].updatePluginList();else _modules_themeModule__WEBPACK_IMPORTED_MODULE_12__["default"].updateThemeList();
this.forceUpdate();
}
})));
const addonCards = this.getAddons();
return React.createElement(_contentColumn__WEBPACK_IMPORTED_MODULE_1__["default"], {
title: `${this.props.type.toUpperCase()}—${addonCards.length}`
}, React.createElement("button", {
key: "folder-button",
className: "bd-button bd-pfbtn",
onClick: this.openFolder.bind(this)
}, "Open ", this.isPlugins ? "Plugin" : "Theme", " Folder"), !_0globals__WEBPACK_IMPORTED_MODULE_8__["settingsCookie"]["fork-ps-5"] && refreshIcon, React.createElement("div", {
className: "bd-controls bd-addon-controls"
}, React.createElement(_components_search__WEBPACK_IMPORTED_MODULE_7__["default"], {
onChange: this.search,
placeholder: `Search ${this.props.type}...`
}), React.createElement("div", {
className: "bd-addon-dropdowns"
}, React.createElement("div", {
className: "bd-select-wrapper"
}, React.createElement("label", {
className: "bd-label"
}, "Sort by:"), React.createElement(_components_dropdown__WEBPACK_IMPORTED_MODULE_6__["default"], {
options: this.sortOptions,
onChange: this.sort,
style: "transparent"
})), React.createElement("div", {
className: "bd-select-wrapper"
}, React.createElement("label", {
className: "bd-label"
}, "Order:"), React.createElement(_components_dropdown__WEBPACK_IMPORTED_MODULE_6__["default"], {
options: this.directions,
onChange: this.reverse,
style: "transparent"
})))), React.createElement("div", {
className: "bda-slist bd-addon-list"
}, addonCards));
}
}
const originalRender = CardList.prototype.render;
Object.defineProperty(CardList.prototype, "render", {
enumerable: false,
configurable: false,
set: function () {
console.warn("Addon policy for plugins #5 https://github.com/rauenzi/BetterDiscordApp/wiki/Addon-Policies#plugins");
},
get: () => originalRender
});
/***/ }),
/***/ "./src/ui/bdLogo.js":
/*!**************************!*\
!*** ./src/ui/bdLogo.js ***!
\**************************/
/*! exports provided: default */
/***/ (function(module, __webpack_exports__, __webpack_require__) {
"use strict";
__webpack_require__.r(__webpack_exports__);
/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "default", function() { return BDLogo; });
/* harmony import */ var _modules_v2__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ../modules/v2 */ "./src/modules/v2.js");
class BDLogo extends _modules_v2__WEBPACK_IMPORTED_MODULE_0__["default"].reactComponent {
render() {
return _modules_v2__WEBPACK_IMPORTED_MODULE_0__["default"].react.createElement("svg", {
height: "100%",
width: this.props.size || "16px",
className: "bd-logo " + this.props.className,
style: {
fillRule: "evenodd",
clipRule: "evenodd",
strokeLinecap: "round",
strokeLinejoin: "round"
},
viewBox: "0 0 2000 2000"
}, _modules_v2__WEBPACK_IMPORTED_MODULE_0__["default"].react.createElement("metadata", null), _modules_v2__WEBPACK_IMPORTED_MODULE_0__["default"].react.createElement("defs", null, _modules_v2__WEBPACK_IMPORTED_MODULE_0__["default"].react.createElement("filter", {
id: "shadow1"
}, _modules_v2__WEBPACK_IMPORTED_MODULE_0__["default"].react.createElement("feDropShadow", {
"dx": "20",
"dy": "0",
"stdDeviation": "20",
"flood-color": "rgba(0,0,0,0.35)"
})), _modules_v2__WEBPACK_IMPORTED_MODULE_0__["default"].react.createElement("filter", {
id: "shadow2"
}, _modules_v2__WEBPACK_IMPORTED_MODULE_0__["default"].react.createElement("feDropShadow", {
"dx": "15",
"dy": "0",
"stdDeviation": "20",
"flood-color": "rgba(255,255,255,0.15)"
})), _modules_v2__WEBPACK_IMPORTED_MODULE_0__["default"].react.createElement("filter", {
id: "shadow3"
}, _modules_v2__WEBPACK_IMPORTED_MODULE_0__["default"].react.createElement("feDropShadow", {
"dx": "10",
"dy": "0",
"stdDeviation": "20",
"flood-color": "rgba(0,0,0,0.35)"
}))), _modules_v2__WEBPACK_IMPORTED_MODULE_0__["default"].react.createElement("g", null, _modules_v2__WEBPACK_IMPORTED_MODULE_0__["default"].react.createElement("path", {
style: {
filter: "url(#shadow3)"
},
d: "M1195.44+135.442L1195.44+135.442L997.6+136.442C1024.2+149.742+1170.34+163.542+1193.64+179.742C1264.34+228.842+1319.74+291.242+1358.24+365.042C1398.14+441.642+1419.74+530.642+1422.54+629.642L1422.54+630.842L1422.54+632.042C1422.54+773.142+1422.54+1228.14+1422.54+1369.14L1422.54+1370.34L1422.54+1371.54C1419.84+1470.54+1398.24+1559.54+1358.24+1636.14C1319.74+1709.94+1264.44+1772.34+1193.64+1821.44C1171.04+1837.14+1025.7+1850.54+1000+1863.54L1193.54+1864.54C1539.74+1866.44+1864.54+1693.34+1864.54+1296.64L1864.54+716.942C1866.44+312.442+1541.64+135.442+1195.44+135.442Z",
fill: "#171717",
opacity: "1"
}), _modules_v2__WEBPACK_IMPORTED_MODULE_0__["default"].react.createElement("path", {
style: {
filter: "url(#shadow2)"
},
d: "M1695.54+631.442C1685.84+278.042+1409.34+135.442+1052.94+135.442L361.74+136.442L803.74+490.442L1060.74+490.442C1335.24+490.442+1335.24+835.342+1060.74+835.342L1060.74+1164.84C1150.22+1164.84+1210.53+1201.48+1241.68+1250.87C1306.07+1353+1245.76+1509.64+1060.74+1509.64L361.74+1863.54L1052.94+1864.54C1409.24+1864.54+1685.74+1721.94+1695.54+1368.54C1695.54+1205.94+1651.04+1084.44+1572.64+999.942C1651.04+915.542+1695.54+794.042+1695.54+631.442Z",
fill: "#3E82E5",
opacity: "1"
}), _modules_v2__WEBPACK_IMPORTED_MODULE_0__["default"].react.createElement("path", {
style: {
filter: "url(#shadow1)"
},
d: "M1469.25+631.442C1459.55+278.042+1183.05+135.442+826.65+135.442L135.45+135.442L135.45+1004C135.45+1004+135.427+1255.21+355.626+1255.21C575.825+1255.21+575.848+1004+575.848+1004L577.45+490.442L834.45+490.442C1108.95+490.442+1108.95+835.342+834.45+835.342L664.65+835.342L664.65+1164.84L834.45+1164.84C923.932+1164.84+984.244+1201.48+1015.39+1250.87C1079.78+1353+1019.47+1509.64+834.45+1509.64L135.45+1509.64L135.45+1864.54L826.65+1864.54C1182.95+1864.54+1459.45+1721.94+1469.25+1368.54C1469.25+1205.94+1424.75+1084.44+1346.35+999.942C1424.75+915.542+1469.25+794.042+1469.25+631.442Z",
fill: "#FFFFFF",
opacity: "1"
})));
}
}
/***/ }),
/***/ "./src/ui/checkbox.js":
/*!****************************!*\
!*** ./src/ui/checkbox.js ***!
\****************************/
/*! exports provided: default */
/***/ (function(module, __webpack_exports__, __webpack_require__) {
"use strict";
__webpack_require__.r(__webpack_exports__);
/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "default", function() { return V2C_Checkbox; });
/* harmony import */ var _modules_v2__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ../modules/v2 */ "./src/modules/v2.js");
class V2C_Checkbox extends _modules_v2__WEBPACK_IMPORTED_MODULE_0__["default"].reactComponent {
constructor(props) {
super(props);
this.onClick = this.onClick.bind(this);
this.setInitialState();
}
setInitialState() {
this.state = {
checked: this.props.checked || false
};
}
render() {
return _modules_v2__WEBPACK_IMPORTED_MODULE_0__["default"].react.createElement("li", null, _modules_v2__WEBPACK_IMPORTED_MODULE_0__["default"].react.createElement("div", {
className: "checkbox " + BDModules.get(e => e.checkboxElement)[0].checkbox,
onClick: this.onClick
}, _modules_v2__WEBPACK_IMPORTED_MODULE_0__["default"].react.createElement("div", {
className: "checkbox-inner " + BDModules.get(e => e.checkboxInner)[0].checkboxInner
}, _modules_v2__WEBPACK_IMPORTED_MODULE_0__["default"].react.createElement("input", {
className: BDModules.get(e => e.checkboxElement)[0].checkboxElement,
checked: this.state.checked,
onChange: () => {},
type: "checkbox"
}), _modules_v2__WEBPACK_IMPORTED_MODULE_0__["default"].react.createElement("span", null)), _modules_v2__WEBPACK_IMPORTED_MODULE_0__["default"].react.createElement("span", null, this.props.text)));
}
onClick() {
this.props.onChange(this.props.id, !this.state.checked);
this.setState({
checked: !this.state.checked
});
}
}
/***/ }),
/***/ "./src/ui/components/dropdown.jsx":
/*!****************************************!*\
!*** ./src/ui/components/dropdown.jsx ***!
\****************************************/
/*! exports provided: default */
/***/ (function(module, __webpack_exports__, __webpack_require__) {
"use strict";
__webpack_require__.r(__webpack_exports__);
/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "default", function() { return Select; });
/* harmony import */ var _modules_v2__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ../../modules/v2 */ "./src/modules/v2.js");
/* harmony import */ var _icons_downarrow__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ../icons/downarrow */ "./src/ui/icons/downarrow.jsx");
const React = _modules_v2__WEBPACK_IMPORTED_MODULE_0__["default"].React;
class Select extends React.Component {
constructor(props) {
super(props);
this.state = {
open: false,
value: this.props.value || this.props.options[0].value
};
this.dropdown = React.createRef();
this.onChange = this.onChange.bind(this);
this.showMenu = this.showMenu.bind(this);
this.hideMenu = this.hideMenu.bind(this);
}
showMenu(event) {
event.preventDefault();
this.setState({
open: true
}, () => {
document.addEventListener("click", this.hideMenu);
});
}
hideMenu() {
this.setState({
open: false
}, () => {
document.removeEventListener("click", this.hideMenu);
});
}
onChange(value) {
this.setState({
value
});
if (this.props.onChange) this.props.onChange(value);
}
get selected() {
return this.props.options.find(o => o.value == this.state.value);
}
get options() {
const selected = this.selected;
return React.createElement("div", {
className: "bd-select-options"
}, this.props.options.map(opt => React.createElement("div", {
className: `bd-select-option${selected.value == opt.value ? " selected" : ""}`,
onClick: this.onChange.bind(this, opt.value)
}, opt.label)));
}
render() {
const style = this.props.style == "transparent" ? " bd-select-transparent" : "";
const isOpen = this.state.open ? " menu-open" : "";
return React.createElement("div", {
className: `bd-select${style}${isOpen}`,
onClick: this.showMenu,
ref: this.dropdown
}, React.createElement("div", {
className: "bd-select-value"
}, this.selected.label), React.createElement(_icons_downarrow__WEBPACK_IMPORTED_MODULE_1__["default"], {
className: "bd-select-arrow"
}), this.state.open && this.options);
}
} // return <div className="bd-select-wrap">
// <label className="bd-label">{this.props.label}</label>
// <div className={`bd-select${style}${isOpen}`} onClick={this.showMenu} ref={this.dropdown}>
// <div className="bd-select-controls">
// <div className="bd-select-value">{this.selected.label}</div>
// <Arrow className="bd-select-arrow" />
// </div>
// </div>
// {this.state.open && this.options}
// </div>;
/***/ }),
/***/ "./src/ui/components/search.jsx":
/*!**************************************!*\
!*** ./src/ui/components/search.jsx ***!
\**************************************/
/*! exports provided: default */
/***/ (function(module, __webpack_exports__, __webpack_require__) {
"use strict";
__webpack_require__.r(__webpack_exports__);
/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "default", function() { return Search; });
/* harmony import */ var _modules_v2__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ../../modules/v2 */ "./src/modules/v2.js");
/* harmony import */ var _icons_search__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ../icons/search */ "./src/ui/icons/search.jsx");
const React = _modules_v2__WEBPACK_IMPORTED_MODULE_0__["default"].React;
class Search extends React.Component {
render() {
return React.createElement("div", {
className: "bd-search-wrapper"
}, React.createElement("input", {
onChange: this.props.onChange,
onKeyDown: this.props.onKeyDown,
type: "text",
className: "bd-search",
placeholder: this.props.placeholder,
maxLength: "50"
}), React.createElement(_icons_search__WEBPACK_IMPORTED_MODULE_1__["default"], null));
}
}
/***/ }),
/***/ "./src/ui/components/switch.jsx":
/*!**************************************!*\
!*** ./src/ui/components/switch.jsx ***!
\**************************************/
/*! exports provided: default */
/***/ (function(module, __webpack_exports__, __webpack_require__) {
"use strict";
__webpack_require__.r(__webpack_exports__);
/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "default", function() { return Switch; });
/* harmony import */ var _modules_v2__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ../../modules/v2 */ "./src/modules/v2.js");
const React = _modules_v2__WEBPACK_IMPORTED_MODULE_0__["default"].React;
class Switch extends React.Component {
constructor(props) {
super(props);
this.state = {
checked: this.props.checked
};
this.onChange = this.onChange.bind(this);
}
onChange(value) {
if (this.props.disabled) return;
this.props.onChange(value);
this.setState({
checked: value
});
}
render() {
return React.createElement(Lightcord.Api.Components.inputs.Switch, {
onChange: this.onChange,
value: this.state.checked
});
}
}
/***/ }),
/***/ "./src/ui/contentColumn.js":
/*!*********************************!*\
!*** ./src/ui/contentColumn.js ***!
\*********************************/
/*! exports provided: default */
/***/ (function(module, __webpack_exports__, __webpack_require__) {
"use strict";
__webpack_require__.r(__webpack_exports__);
/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "default", function() { return V2C_ContentColumn; });
/* harmony import */ var _modules_v2__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ../modules/v2 */ "./src/modules/v2.js");
class V2C_ContentColumn extends _modules_v2__WEBPACK_IMPORTED_MODULE_0__["default"].reactComponent {
constructor(props) {
super(props);
}
static get displayName() {
return "ContentColumn";
}
render() {
//let contentModule = BDModules.get(e => e.contentColumn)[0]
let title = this.props.title ? _modules_v2__WEBPACK_IMPORTED_MODULE_0__["default"].react.createElement("h2", {
className: "ui-form-title h2 margin-reset margin-bottom-20"
}, this.props.title) : null;
return [title, this.props.children];
return _modules_v2__WEBPACK_IMPORTED_MODULE_0__["default"].react.createElement("div", {
className: contentModule.contentColumn + " " + contentModule.contentColumnDefault + " content-column default",
style: {
padding: "60px 40px 0px"
}
}, title, this.props.children);
}
}
/***/ }),
/***/ "./src/ui/cssEditor.js":
/*!*****************************!*\
!*** ./src/ui/cssEditor.js ***!
\*****************************/
/*! exports provided: default */
/***/ (function(module, __webpack_exports__, __webpack_require__) {
"use strict";
__webpack_require__.r(__webpack_exports__);
/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "default", function() { return V2C_CssEditor; });
/* harmony import */ var _0globals__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ../0globals */ "./src/0globals.js");
/* harmony import */ var _modules_settingsPanel__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ../modules/settingsPanel */ "./src/modules/settingsPanel.js");
/* harmony import */ var _modules_v2__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! ../modules/v2 */ "./src/modules/v2.js");
/* harmony import */ var _modules_dataStore__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(/*! ../modules/dataStore */ "./src/modules/dataStore.js");
/* harmony import */ var _modules_domtools__WEBPACK_IMPORTED_MODULE_4__ = __webpack_require__(/*! ../modules/domtools */ "./src/modules/domtools.js");
/* harmony import */ var _settingsTitle__WEBPACK_IMPORTED_MODULE_5__ = __webpack_require__(/*! ./settingsTitle */ "./src/ui/settingsTitle.js");
/* harmony import */ var _checkbox__WEBPACK_IMPORTED_MODULE_6__ = __webpack_require__(/*! ./checkbox */ "./src/ui/checkbox.js");
/* harmony import */ var _cssEditorDetached__WEBPACK_IMPORTED_MODULE_7__ = __webpack_require__(/*! ./cssEditorDetached */ "./src/ui/cssEditorDetached.js");
class V2C_CssEditor extends _modules_v2__WEBPACK_IMPORTED_MODULE_2__["default"].reactComponent {
constructor(props) {
super(props);
const self = this;
self.props.lines = 0;
self.setInitialState();
self.attach = self.attach.bind(self);
self.detachedEditor = _modules_v2__WEBPACK_IMPORTED_MODULE_2__["default"].react.createElement(_cssEditorDetached__WEBPACK_IMPORTED_MODULE_7__["default"], {
attach: self.attach
});
self.onClick = self.onClick.bind(self);
self.updateCss = self.updateCss.bind(self);
self.saveCss = self.saveCss.bind(self);
self.detach = self.detach.bind(self);
}
setInitialState() {
this.state = {
detached: this.props.detached || _modules_v2__WEBPACK_IMPORTED_MODULE_2__["default"].editorDetached
};
}
componentDidMount() {
// this.updateLineCount();
this.editor = ace.edit("bd-customcss-editor");
this.editor.setTheme("ace/theme/monokai");
this.editor.session.setMode("ace/mode/css");
this.editor.setShowPrintMargin(false);
this.editor.setFontSize(14);
this.editor.on("change", () => {
if (!_0globals__WEBPACK_IMPORTED_MODULE_0__["settingsCookie"]["bda-css-0"]) return;
this.saveCss();
this.updateCss();
});
}
componentWillUnmount() {
this.editor.destroy();
}
componentDidUpdate(prevProps, prevState) {
const self = this;
if (prevState.detached && !self.state.detached) {
_modules_v2__WEBPACK_IMPORTED_MODULE_2__["default"].reactDom.unmountComponentAtNode(self.detachedRoot);
}
}
codeMirror() {}
get options() {
return {
lineNumbers: true,
mode: "css",
indentUnit: 4,
theme: "material",
scrollbarStyle: "simple"
};
}
get css() {
const _ccss = _modules_dataStore__WEBPACK_IMPORTED_MODULE_3__["default"].getBDData("bdcustomcss");
let ccss = "";
if (_ccss && _ccss !== "") {
ccss = atob(_ccss);
}
return ccss;
}
updateLineCount() {
const lineCount = this.refs.editor.value.split("\n").length;
if (lineCount == this.props.lines) return;
this.refs.lines.textContent = Array.from(new Array(lineCount), (_, i) => i + 1).join(".\n") + ".";
this.props.lines = lineCount;
}
render() {
const self = this;
const {
detached
} = self.state;
return [detached && _modules_v2__WEBPACK_IMPORTED_MODULE_2__["default"].react.createElement("div", {
id: "editor-detached"
}, _modules_v2__WEBPACK_IMPORTED_MODULE_2__["default"].react.createElement(_settingsTitle__WEBPACK_IMPORTED_MODULE_5__["default"], {
text: "Custom CSS Editor"
}), _modules_v2__WEBPACK_IMPORTED_MODULE_2__["default"].react.createElement("h3", null, "Editor Detached"), _modules_v2__WEBPACK_IMPORTED_MODULE_2__["default"].react.createElement("button", {
className: "btn btn-primary",
onClick: () => {
self.attach();
}
}, "Attach")), !detached && _modules_v2__WEBPACK_IMPORTED_MODULE_2__["default"].react.createElement("div", null, _modules_v2__WEBPACK_IMPORTED_MODULE_2__["default"].react.createElement(_settingsTitle__WEBPACK_IMPORTED_MODULE_5__["default"], {
text: "Custom CSS Editor"
}), _modules_v2__WEBPACK_IMPORTED_MODULE_2__["default"].react.createElement("div", {
className: "editor-wrapper"
}, _modules_v2__WEBPACK_IMPORTED_MODULE_2__["default"].react.createElement("div", {
id: "bd-customcss-editor",
className: "editor",
ref: "editor"
}, self.css)), _modules_v2__WEBPACK_IMPORTED_MODULE_2__["default"].react.createElement("div", {
id: "bd-customcss-attach-controls"
}, _modules_v2__WEBPACK_IMPORTED_MODULE_2__["default"].react.createElement("ul", {
className: "checkbox-group"
}, _modules_v2__WEBPACK_IMPORTED_MODULE_2__["default"].react.createElement(_checkbox__WEBPACK_IMPORTED_MODULE_6__["default"], {
id: "live-update",
text: "Live Update",
onChange: this.onChange,
checked: _0globals__WEBPACK_IMPORTED_MODULE_0__["settingsCookie"]["bda-css-0"]
})), _modules_v2__WEBPACK_IMPORTED_MODULE_2__["default"].react.createElement("div", {
id: "bd-customcss-detach-controls-button"
}, _modules_v2__WEBPACK_IMPORTED_MODULE_2__["default"].react.createElement("button", {
style: {
borderRadius: "3px 0 0 3px",
borderRight: "1px solid #3f4146"
},
className: "btn btn-primary",
onClick: () => {
self.onClick("update");
}
}, "Update"), _modules_v2__WEBPACK_IMPORTED_MODULE_2__["default"].react.createElement("button", {
style: {
borderRadius: "0",
borderLeft: "1px solid #2d2d2d",
borderRight: "1px solid #2d2d2d"
},
className: "btn btn-primary",
onClick: () => {
self.onClick("save");
}
}, "Save"), _modules_v2__WEBPACK_IMPORTED_MODULE_2__["default"].react.createElement("button", {
style: {
borderRadius: "0 3px 3px 0",
borderLeft: "1px solid #3f4146"
},
className: "btn btn-primary",
onClick: () => {
self.onClick("detach");
}
}, "Detach"), _modules_v2__WEBPACK_IMPORTED_MODULE_2__["default"].react.createElement("span", {
style: {
fontSize: "10px",
marginLeft: "5px"
}
}, "Unsaved changes are lost on detach"), _modules_v2__WEBPACK_IMPORTED_MODULE_2__["default"].react.createElement("div", {
className: "help-text"
}, "Press ", _modules_v2__WEBPACK_IMPORTED_MODULE_2__["default"].react.createElement("code", {
className: "inline"
}, "ctrl"), "+", _modules_v2__WEBPACK_IMPORTED_MODULE_2__["default"].react.createElement("span", {
className: "inline"
}, ","), " with the editor focused to access the editor's settings."))))];
}
onClick(arg) {
const self = this;
switch (arg) {
case "update":
self.updateCss();
break;
case "save":
self.saveCss();
break;
case "detach":
self.detach();
break;
}
}
onChange(id, checked) {
switch (id) {
case "live-update":
_0globals__WEBPACK_IMPORTED_MODULE_0__["settingsCookie"]["bda-css-0"] = checked;
_modules_settingsPanel__WEBPACK_IMPORTED_MODULE_1__["default"].saveSettings();
break;
}
}
updateCss() {
_modules_domtools__WEBPACK_IMPORTED_MODULE_4__["default"].removeStyle("customcss");
_modules_domtools__WEBPACK_IMPORTED_MODULE_4__["default"].addStyle("customcss", this.editor.session.getValue());
}
saveCss() {
_modules_dataStore__WEBPACK_IMPORTED_MODULE_3__["default"].setBDData("bdcustomcss", btoa(this.editor.session.getValue()));
}
detach() {
const self = this;
self.setState({
detached: true
});
const droot = self.detachedRoot;
if (!droot) {
console.log("FAILED TO INJECT ROOT: .app");
return;
}
_modules_v2__WEBPACK_IMPORTED_MODULE_2__["default"].reactDom.render(self.detachedEditor, droot);
}
get detachedRoot() {
const _root = _modules_domtools__WEBPACK_IMPORTED_MODULE_4__["default"].query("#bd-customcss-detach-container");
if (!_root) {
if (!this.injectDetachedRoot()) return null;
return this.detachedRoot;
}
return _root;
}
injectDetachedRoot() {
const app = _modules_domtools__WEBPACK_IMPORTED_MODULE_4__["default"].query(".app, ." + BDModules.get(e => e.app && e.layers)[0].app.split(" ")[0]);
if (!app) return false;
_modules_domtools__WEBPACK_IMPORTED_MODULE_4__["default"].insertAfter(_modules_domtools__WEBPACK_IMPORTED_MODULE_4__["default"].createElement(`<div id="bd-customcss-detach-container">`), app);
return true;
}
attach() {
const self = this;
self.setState({
detached: false
});
}
}
/***/ }),
/***/ "./src/ui/cssEditorDetached.js":
/*!*************************************!*\
!*** ./src/ui/cssEditorDetached.js ***!
\*************************************/
/*! exports provided: default */
/***/ (function(module, __webpack_exports__, __webpack_require__) {
"use strict";
__webpack_require__.r(__webpack_exports__);
/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "default", function() { return V2C_CssEditorDetached; });
/* harmony import */ var _0globals__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ../0globals */ "./src/0globals.js");
/* harmony import */ var _modules_settingsPanel__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ../modules/settingsPanel */ "./src/modules/settingsPanel.js");
/* harmony import */ var _modules_v2__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! ../modules/v2 */ "./src/modules/v2.js");
/* harmony import */ var _modules_dataStore__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(/*! ../modules/dataStore */ "./src/modules/dataStore.js");
/* harmony import */ var _modules_domtools__WEBPACK_IMPORTED_MODULE_4__ = __webpack_require__(/*! ../modules/domtools */ "./src/modules/domtools.js");
/* harmony import */ var _checkbox__WEBPACK_IMPORTED_MODULE_5__ = __webpack_require__(/*! ./checkbox */ "./src/ui/checkbox.js");
class V2C_CssEditorDetached extends _modules_v2__WEBPACK_IMPORTED_MODULE_2__["default"].reactComponent {
constructor(props) {
super(props);
const self = this;
self.onClick = self.onClick.bind(self);
self.updateCss = self.updateCss.bind(self);
self.saveCss = self.saveCss.bind(self);
self.onChange = self.onChange.bind(self);
}
componentDidMount() {
_modules_domtools__WEBPACK_IMPORTED_MODULE_4__["default"].addClass(_modules_domtools__WEBPACK_IMPORTED_MODULE_4__["default"].query("#app-mount"), "bd-detached-editor");
_modules_v2__WEBPACK_IMPORTED_MODULE_2__["default"].editorDetached = true; // this.updateLineCount();
this.editor = ace.edit("bd-customcss-editor-detached");
this.editor.setTheme("ace/theme/monokai");
this.editor.session.setMode("ace/mode/css");
this.editor.setShowPrintMargin(false);
this.editor.setFontSize(14);
this.editor.on("change", () => {
if (!_0globals__WEBPACK_IMPORTED_MODULE_0__["settingsCookie"]["bda-css-0"]) return;
this.saveCss();
this.updateCss();
});
}
componentWillUnmount() {
_modules_domtools__WEBPACK_IMPORTED_MODULE_4__["default"].removeClass(_modules_domtools__WEBPACK_IMPORTED_MODULE_4__["default"].query("#app-mount"), "bd-detached-editor");
_modules_v2__WEBPACK_IMPORTED_MODULE_2__["default"].editorDetached = false;
this.editor.destroy();
}
updateLineCount() {
const lineCount = this.refs.editor.value.split("\n").length;
if (lineCount == this.props.lines) return;
this.refs.lines.textContent = Array.from(new Array(lineCount), (_, i) => i + 1).join(".\n") + ".";
this.props.lines = lineCount;
}
get options() {
return {
lineNumbers: true,
mode: "css",
indentUnit: 4,
theme: "material",
scrollbarStyle: "simple"
};
}
get css() {
const _ccss = _modules_dataStore__WEBPACK_IMPORTED_MODULE_3__["default"].getBDData("bdcustomcss");
let ccss = "";
if (_ccss && _ccss !== "") {
ccss = atob(_ccss);
}
return ccss;
}
get root() {
const _root = _modules_domtools__WEBPACK_IMPORTED_MODULE_4__["default"].query("#bd-customcss-detach-container");
if (!_root) {
if (!this.injectRoot()) return null;
return this.detachedRoot;
}
return _root;
}
injectRoot() {
const app = _modules_domtools__WEBPACK_IMPORTED_MODULE_4__["default"].query(".app, ." + BDModules.get(e => e.app && e.layers)[0].app.split(" ")[0]);
if (!app) return false;
_modules_domtools__WEBPACK_IMPORTED_MODULE_4__["default"].insertAfter(_modules_domtools__WEBPACK_IMPORTED_MODULE_4__["default"].createElement(`<div id="bd-customcss-detach-container">`), app);
return true;
}
render() {
const self = this;
return _modules_v2__WEBPACK_IMPORTED_MODULE_2__["default"].react.createElement("div", {
className: "bd-detached-css-editor",
id: "bd-customcss-detach-editor"
}, _modules_v2__WEBPACK_IMPORTED_MODULE_2__["default"].react.createElement("div", {
id: "bd-customcss-innerpane"
}, _modules_v2__WEBPACK_IMPORTED_MODULE_2__["default"].react.createElement("div", {
className: "editor-wrapper"
}, _modules_v2__WEBPACK_IMPORTED_MODULE_2__["default"].react.createElement("div", {
id: "bd-customcss-editor-detached",
className: "editor",
ref: "editor"
}, self.css)), _modules_v2__WEBPACK_IMPORTED_MODULE_2__["default"].react.createElement("div", {
id: "bd-customcss-attach-controls"
}, _modules_v2__WEBPACK_IMPORTED_MODULE_2__["default"].react.createElement("ul", {
className: "checkbox-group"
}, _modules_v2__WEBPACK_IMPORTED_MODULE_2__["default"].react.createElement(_checkbox__WEBPACK_IMPORTED_MODULE_5__["default"], {
id: "live-update",
text: "Live Update",
onChange: self.onChange,
checked: _0globals__WEBPACK_IMPORTED_MODULE_0__["settingsCookie"]["bda-css-0"]
})), _modules_v2__WEBPACK_IMPORTED_MODULE_2__["default"].react.createElement("div", {
id: "bd-customcss-detach-controls-button"
}, _modules_v2__WEBPACK_IMPORTED_MODULE_2__["default"].react.createElement("button", {
style: {
borderRadius: "3px 0 0 3px",
borderRight: "1px solid #3f4146"
},
className: "btn btn-primary",
onClick: () => {
self.onClick("update");
}
}, "Update"), _modules_v2__WEBPACK_IMPORTED_MODULE_2__["default"].react.createElement("button", {
style: {
borderRadius: "0",
borderLeft: "1px solid #2d2d2d",
borderRight: "1px solid #2d2d2d"
},
className: "btn btn-primary",
onClick: () => {
self.onClick("save");
}
}, "Save"), _modules_v2__WEBPACK_IMPORTED_MODULE_2__["default"].react.createElement("button", {
style: {
borderRadius: "0 3px 3px 0",
borderLeft: "1px solid #3f4146"
},
className: "btn btn-primary",
onClick: () => {
self.onClick("attach");
}
}, "Attach"), _modules_v2__WEBPACK_IMPORTED_MODULE_2__["default"].react.createElement("span", {
style: {
fontSize: "10px",
marginLeft: "5px"
}
}, "Unsaved changes are lost on attach")))));
}
onChange(id, checked) {
switch (id) {
case "live-update":
_0globals__WEBPACK_IMPORTED_MODULE_0__["settingsCookie"]["bda-css-0"] = checked;
_modules_settingsPanel__WEBPACK_IMPORTED_MODULE_1__["default"].saveSettings();
break;
}
}
onClick(id) {
const self = this;
switch (id) {
case "attach":
if (_modules_domtools__WEBPACK_IMPORTED_MODULE_4__["default"].query("#editor-detached")) self.props.attach();
_modules_v2__WEBPACK_IMPORTED_MODULE_2__["default"].reactDom.unmountComponentAtNode(self.root);
self.root.remove();
break;
case "update":
self.updateCss();
break;
case "save":
self.saveCss();
break;
}
}
updateCss() {
_modules_domtools__WEBPACK_IMPORTED_MODULE_4__["default"].removeStyle("customcss");
_modules_domtools__WEBPACK_IMPORTED_MODULE_4__["default"].addStyle("customcss", this.editor.session.getValue());
}
saveCss() {
_modules_dataStore__WEBPACK_IMPORTED_MODULE_3__["default"].setBDData("bdcustomcss", btoa(this.editor.session.getValue()));
}
}
/***/ }),
/***/ "./src/ui/errorBoundary.js":
/*!*********************************!*\
!*** ./src/ui/errorBoundary.js ***!
\*********************************/
/*! exports provided: default */
/***/ (function(module, __webpack_exports__, __webpack_require__) {
"use strict";
__webpack_require__.r(__webpack_exports__);
/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "default", function() { return BDErrorBoundary; });
/* harmony import */ var _modules_v2__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ../modules/v2 */ "./src/modules/v2.js");
class BDErrorBoundary extends _modules_v2__WEBPACK_IMPORTED_MODULE_0__["default"].reactComponent {
constructor(props) {
super(props);
this.state = {
hasError: false
};
}
componentDidCatch() {
this.setState({
hasError: true
});
}
render() {
if (this.state.hasError) return _modules_v2__WEBPACK_IMPORTED_MODULE_0__["default"].react.createElement("div", {
className: "react-error"
}, "Component Error");
return this.props.children;
}
}
const originalRender = BDErrorBoundary.prototype.render;
Object.defineProperty(BDErrorBoundary.prototype, "render", {
enumerable: false,
configurable: false,
set: function () {
console.warn("Addon policy for plugins #5 https://github.com/rauenzi/BetterDiscordApp/wiki/Addon-Policies#plugins");
},
get: () => originalRender
});
/***/ }),
/***/ "./src/ui/icons/delete.jsx":
/*!*********************************!*\
!*** ./src/ui/icons/delete.jsx ***!
\*********************************/
/*! exports provided: default */
/***/ (function(module, __webpack_exports__, __webpack_require__) {
"use strict";
__webpack_require__.r(__webpack_exports__);
/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "default", function() { return Delete; });
/* harmony import */ var _modules_v2__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ../../modules/v2 */ "./src/modules/v2.js");
const React = _modules_v2__WEBPACK_IMPORTED_MODULE_0__["default"].React;
class Delete extends React.Component {
render() {
const size = this.props.size || "24px";
return React.createElement("svg", {
className: this.props.className || "",
fill: "#FFFFFF",
viewBox: "0 0 24 24",
style: {
width: size,
height: size
},
onClick: this.props.onClick
}, React.createElement("path", {
fill: "none",
d: "M0 0h24v24H0V0z"
}), React.createElement("path", {
d: "M6 19c0 1.1.9 2 2 2h8c1.1 0 2-.9 2-2V7H6v12zm2.46-7.12l1.41-1.41L12 12.59l2.12-2.12 1.41 1.41L13.41 14l2.12 2.12-1.41 1.41L12 15.41l-2.12 2.12-1.41-1.41L10.59 14l-2.13-2.12zM15.5 4l-1-1h-5l-1 1H5v2h14V4z"
}), React.createElement("path", {
fill: "none",
d: "M0 0h24v24H0z"
}));
}
}
/***/ }),
/***/ "./src/ui/icons/downarrow.jsx":
/*!************************************!*\
!*** ./src/ui/icons/downarrow.jsx ***!
\************************************/
/*! exports provided: default */
/***/ (function(module, __webpack_exports__, __webpack_require__) {
"use strict";
__webpack_require__.r(__webpack_exports__);
/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "default", function() { return DownArrow; });
/* harmony import */ var _modules_v2__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ../../modules/v2 */ "./src/modules/v2.js");
const React = _modules_v2__WEBPACK_IMPORTED_MODULE_0__["default"].React;
class DownArrow extends React.Component {
render() {
const size = this.props.size || "16px";
return React.createElement("svg", {
className: this.props.className || "",
fill: "#FFFFFF",
viewBox: "0 0 24 24",
style: {
width: size,
height: size
}
}, React.createElement("path", {
d: "M8.12 9.29L12 13.17l3.88-3.88c.39-.39 1.02-.39 1.41 0 .39.39.39 1.02 0 1.41l-4.59 4.59c-.39.39-1.02.39-1.41 0L6.7 10.7c-.39-.39-.39-1.02 0-1.41.39-.38 1.03-.39 1.42 0z"
}));
}
}
/***/ }),
/***/ "./src/ui/icons/edit.jsx":
/*!*******************************!*\
!*** ./src/ui/icons/edit.jsx ***!
\*******************************/
/*! exports provided: default */
/***/ (function(module, __webpack_exports__, __webpack_require__) {
"use strict";
__webpack_require__.r(__webpack_exports__);
/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "default", function() { return Edit; });
/* harmony import */ var _modules_v2__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ../../modules/v2 */ "./src/modules/v2.js");
const React = _modules_v2__WEBPACK_IMPORTED_MODULE_0__["default"].React;
class Edit extends React.Component {
render() {
const size = this.props.size || "24px";
return React.createElement("svg", {
className: this.props.className || "",
viewBox: "0 0 24 24",
fill: "#FFFFFF",
style: {
width: size,
height: size
},
onClick: this.props.onClick
}, React.createElement("path", {
d: "M3 17.25V21h3.75L17.81 9.94l-3.75-3.75L3 17.25zM20.71 7.04c.39-.39.39-1.02 0-1.41l-2.34-2.34c-.39-.39-1.02-.39-1.41 0l-1.83 1.83 3.75 3.75 1.83-1.83z"
}), React.createElement("path", {
d: "M0 0h24v24H0z",
fill: "none"
}));
}
}
/***/ }),
/***/ "./src/ui/icons/history.jsx":
/*!**********************************!*\
!*** ./src/ui/icons/history.jsx ***!
\**********************************/
/*! exports provided: default */
/***/ (function(module, __webpack_exports__, __webpack_require__) {
"use strict";
__webpack_require__.r(__webpack_exports__);
/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "default", function() { return History; });
/* harmony import */ var _modules_v2__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ../../modules/v2 */ "./src/modules/v2.js");
{
/* <svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 24 24" fill="white" width="18px" height="18px">
<path d="M0 0h24v24H0z" fill="none"/>
<path d="M13 3c-4.97 0-9 4.03-9 9H1l3.89 3.89.07.14L9 12H6c0-3.87 3.13-7 7-7s7 3.13 7 7-3.13 7-7 7c-1.93 0-3.68-.79-4.94-2.06l-1.42 1.42C8.27 19.99 10.51 21 13 21c4.97 0 9-4.03 9-9s-4.03-9-9-9zm-1 5v5l4.28 2.54.72-1.21-3.5-2.08V8H12z"/>
</svg> */
}
const React = _modules_v2__WEBPACK_IMPORTED_MODULE_0__["default"].React;
class History extends React.Component {
render() {
const size = this.props.size || "18px";
return React.createElement("svg", {
viewBox: "0 0 24 24",
fill: "#FFFFFF",
className: this.props.className || "",
style: {
width: size,
height: size
},
onClick: this.props.onClick
}, React.createElement("path", {
d: "M0 0h24v24H0z",
fill: "none"
}), React.createElement("path", {
d: "M13 3c-4.97 0-9 4.03-9 9H1l3.89 3.89.07.14L9 12H6c0-3.87 3.13-7 7-7s7 3.13 7 7-3.13 7-7 7c-1.93 0-3.68-.79-4.94-2.06l-1.42 1.42C8.27 19.99 10.51 21 13 21c4.97 0 9-4.03 9-9s-4.03-9-9-9zm-1 5v5l4.28 2.54.72-1.21-3.5-2.08V8H12z"
}));
}
}
/***/ }),
/***/ "./src/ui/icons/search.jsx":
/*!*********************************!*\
!*** ./src/ui/icons/search.jsx ***!
\*********************************/
/*! exports provided: default */
/***/ (function(module, __webpack_exports__, __webpack_require__) {
"use strict";
__webpack_require__.r(__webpack_exports__);
/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "default", function() { return Search; });
/* harmony import */ var _modules_v2__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ../../modules/v2 */ "./src/modules/v2.js");
const React = _modules_v2__WEBPACK_IMPORTED_MODULE_0__["default"].React;
class Search extends React.Component {
render() {
const size = this.props.size || "16px";
return React.createElement("svg", {
className: this.props.className || "",
fill: "#FFFFFF",
viewBox: "0 0 24 24",
style: {
width: size,
height: size
}
}, React.createElement("path", {
fill: "none",
d: "M0 0h24v24H0V0z"
}), React.createElement("path", {
d: "M15.5 14h-.79l-.28-.27C15.41 12.59 16 11.11 16 9.5 16 5.91 13.09 3 9.5 3S3 5.91 3 9.5 5.91 16 9.5 16c1.61 0 3.09-.59 4.23-1.57l.27.28v.79l5 4.99L20.49 19l-4.99-5zm-6 0C7.01 14 5 11.99 5 9.5S7.01 5 9.5 5 14 7.01 14 9.5 11.99 14 9.5 14z"
}));
}
}
/***/ }),
/***/ "./src/ui/margintop.jsx":
/*!******************************!*\
!*** ./src/ui/margintop.jsx ***!
\******************************/
/*! exports provided: default */
/***/ (function(module, __webpack_exports__, __webpack_require__) {
"use strict";
__webpack_require__.r(__webpack_exports__);
/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "default", function() { return MarginTop; });
let marginModule = BDModules.get(e => e.marginTop60)[0];
class MarginTop extends React.Component {
render() {
if (!marginModule) marginModule = BDModules.get(e => e.marginTop60)[0];
return React.createElement("div", {
className: marginModule.marginTop60
});
}
}
/***/ }),
/***/ "./src/ui/presenceSettings.jsx":
/*!*************************************!*\
!*** ./src/ui/presenceSettings.jsx ***!
\*************************************/
/*! exports provided: default */
/***/ (function(module, __webpack_exports__, __webpack_require__) {
"use strict";
__webpack_require__.r(__webpack_exports__);
/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "default", function() { return V2C_PresenceSettings; });
/* harmony import */ var _modules_v2__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ../modules/v2 */ "./src/modules/v2.js");
/* harmony import */ var _settingsTitle__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ./settingsTitle */ "./src/ui/settingsTitle.js");
/* harmony import */ var _settingsGroup__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! ./settingsGroup */ "./src/ui/settingsGroup.js");
/* harmony import */ var _modules_dataStore__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(/*! ../modules/dataStore */ "./src/modules/dataStore.js");
/* harmony import */ var _0globals__WEBPACK_IMPORTED_MODULE_4__ = __webpack_require__(/*! ../0globals */ "./src/0globals.js");
/* harmony import */ var _modules_CustomRichPresence__WEBPACK_IMPORTED_MODULE_5__ = __webpack_require__(/*! ../modules/CustomRichPresence */ "./src/modules/CustomRichPresence.js");
/* harmony import */ var _timestampRender__WEBPACK_IMPORTED_MODULE_6__ = __webpack_require__(/*! ./timestampRender */ "./src/ui/timestampRender.js");
/* harmony import */ var electron__WEBPACK_IMPORTED_MODULE_7__ = __webpack_require__(/*! electron */ "electron");
/* harmony import */ var electron__WEBPACK_IMPORTED_MODULE_7___default = /*#__PURE__*/__webpack_require__.n(electron__WEBPACK_IMPORTED_MODULE_7__);
/* harmony import */ var _margintop__WEBPACK_IMPORTED_MODULE_8__ = __webpack_require__(/*! ./margintop */ "./src/ui/margintop.jsx");
/**
* How the fuck did I do this
*/
const React = _modules_v2__WEBPACK_IMPORTED_MODULE_0__["default"].React;
let V2C_PresenceSettingsModules;
class V2C_PresenceSettings extends React.Component {
constructor(props) {
super(props);
this.state = {
data: _modules_dataStore__WEBPACK_IMPORTED_MODULE_3__["default"].getSettingGroup("rpc") || _0globals__WEBPACK_IMPORTED_MODULE_4__["defaultRPC"],
assets: []
};
this.preview = null;
this.isfetching = false;
if (this.state.data.application_id) {
this.fetchAssets();
}
this.assetComponents = new Set();
}
updateWhenFetched(comp) {
this.assetComponents.add(comp);
}
/**
*
* @param {InputText} setting
*/
onChange(setting, value) {
let defaultSetting = RPCProps.find(e => e.id === setting.props.id);
this.setState({
data: Object.assign(_0globals__WEBPACK_IMPORTED_MODULE_4__["settingsRPC"], this.state.data, {
[defaultSetting.id]: !!value ? value : null
}),
assets: this.state.assets
});
if (setting.props.id === "application_id") {
this.fetchAssets();
}
_modules_dataStore__WEBPACK_IMPORTED_MODULE_3__["default"].setSettingGroup("rpc", _0globals__WEBPACK_IMPORTED_MODULE_4__["settingsRPC"]);
this.preview.forceUpdate();
_modules_CustomRichPresence__WEBPACK_IMPORTED_MODULE_5__["default"].set(_0globals__WEBPACK_IMPORTED_MODULE_4__["settingsRPC"]);
}
fetchAssets() {
if (this.isfetching === true) {
let app = this.state.data.application_id;
setTimeout(() => {
if (this.state.data.application_id !== app) {
return;
}
this.fetchAssets();
}, 5000);
}
if (!this.state.data.application_id) {
this.setState({
data: this.state.data,
assets: []
});
this.forceUpdate();
this.assetComponents.forEach(e => e.forceUpdate());
return;
}
this.isfetching = true;
_modules_CustomRichPresence__WEBPACK_IMPORTED_MODULE_5__["default"].fetchAssets(this.state.data.application_id).then(assets => {
this.isfetching = false;
this.setState({
data: this.state.data,
assets: Object.keys(assets).map(k => {
let asset = assets[k];
return {
id: asset.id,
name: asset.name,
type: asset.type
};
})
});
this.forceUpdate();
this.assetComponents.forEach(e => e.forceUpdate());
}).catch(() => {
this.isfetching = false;
this.setState({
data: this.state.data,
assets: []
});
this.forceUpdate();
this.assetComponents.forEach(e => e.forceUpdate());
});
}
updatePreview(data) {
this.setState({
data
});
}
get modules() {
return V2C_PresenceSettingsModules || (V2C_PresenceSettingsModules = [BDModules.get(e => e.marginBottom20)[0]]);
}
render() {
console.log("Rerendering rpc manager");
let [marginModule] = this.modules;
return [React.createElement(_settingsGroup__WEBPACK_IMPORTED_MODULE_2__["default"], {
title: "RichPresence Settings",
settings: this.props.settings,
onChange: this.props.onChange
}), React.createElement(_margintop__WEBPACK_IMPORTED_MODULE_8__["default"], null), React.createElement(_settingsTitle__WEBPACK_IMPORTED_MODULE_1__["default"], {
text: "RichPresence"
}), React.createElement("div", null, this.optionsComponents), React.createElement("div", null, React.createElement(_margintop__WEBPACK_IMPORTED_MODULE_8__["default"], null), React.createElement(_settingsTitle__WEBPACK_IMPORTED_MODULE_1__["default"], {
text: "Preview"
}), React.createElement(RpcPreview, {
settings: this
})), React.createElement("div", {
className: marginModule.marginBottom20
}), React.createElement("button", {
style: {
opacity: 0.01
},
onClick: window.ohgodohfuck
}, "Oh god Oh fuck"), React.createElement("button", {
style: {
opacity: 0.01
},
onClick: () => {
electron__WEBPACK_IMPORTED_MODULE_7__["remote"].shell.openExternal("https://www.youtube.com/watch?v=LkYa7rps_g4");
}
}, "See ? I pulled a litle sneaky on ya")];
}
get optionsComponents() {
return this._optionsComponents || (this._optionsComponents = RPCProps.map(e => {
if (e.type === "text") {
return React.createElement(InputText, {
setting: e,
manager: this,
id: e.id
});
} else if (e.type === "number") {
let array = [React.createElement(InputNumber, {
setting: e,
manager: this,
id: e.id
})];
/*
if(e.id === "timestamps.start"){
array.unshift(<DiscordButton title="Copy Current Timestamp" onClick={() => {
DiscordNative.clipboard.copy(Date.now()+"")
}} />)
}*/
return array;
} else if (e.type === "choice") {
if (["assets.small", "assets.large"].includes(e.id)) {
return React.createElement(InputChoice, {
setting: e,
manager: this,
id: e.id,
choices: [{
value: "none",
label: "No assets"
}].concat(this.state.assets.map(e => {
return {
value: "asset-" + e.id,
label: e.name
};
}))
});
} else {
return "Unknown choice.";
}
}
}));
}
}
const RPCProps = [{
title: "Application ID",
id: "application_id",
type: "number",
placeholder: "711416957718757418"
}, {
title: "Name",
id: "name",
type: "text",
placeholder: "Lightcord"
}, {
title: "Details",
id: "details",
type: "text",
placeholder: "Browsing Discord"
}, {
title: "State",
id: "state",
type: "text",
placeholder: "Lightcord Client"
}, {
title: "Timestamp Start",
id: "timestamps.start",
type: "number",
get placeholder() {
return Date.now();
}
}, {
title: "LargeAsset",
id: "assets.large",
type: "choice"
}, {
title: "SmallAsset",
id: "assets.small",
type: "choice"
}];
let inputTextModules;
class InputText extends React.PureComponent {
get modules() {
if (inputTextModules && inputTextModules[0]) return inputTextModules;
return inputTextModules = [BDModules.get(e => e.removeKeybind)[0], BDModules.get(e => e.marginBottom20)[0], BDModules.get(e => e.defaultMarginh5)[0], BDModules.get(e => e.colorStandard)[0], BDModules.get(e => e.size32)[0], BDModules.get(e => e._horizontal)[0], BDModules.get(e => e.inputMini)[0], BDModules.get(e => e.size16 && e.size20)[0]];
}
constructor(props) {
super(props);
let setting = this.props.setting;
this.state = {
data: this.props.manager.state.data[setting.id]
};
this.input = React.createElement(window.Lightcord.Api.Components.inputs.TextInput, {
placeholder: setting.placeholder,
name: setting.id,
value: this.state.data,
onChange: value => {
this.setState({
data: value
});
if (!this.lastEdited || this.lastEdited < Date.now() - 500) {
this.props.manager.onChange(this, value);
this.lastEdited = Date.now();
} else if (!this.isTiming) {
this.isTiming = setTimeout(() => {
this.props.manager.onChange(this, this.state.data);
this.isTiming = null;
this.lastEdited = Date.now();
}, 500);
}
},
type: "text"
});
}
render() {
let setting = this.props.setting;
let [rowModule, marginModule, marginModule2, colorModule, sizeModule, flexModule, inputModule, sizeModule2] = this.modules;
return React.createElement("div", {
className: rowModule.row + " " + marginModule.marginBottom20
}, React.createElement("div", {
className: `${rowModule.item} ${flexModule.flexChild}`
}, React.createElement("h5", {
className: colorModule.colorStandard + " " + sizeModule.size14 + " " + marginModule2.h5 + " " + marginModule2.defaultMarginh5
}, setting.title), this.input), React.createElement(Divider, null));
}
}
let InputNumberModules;
class InputNumber extends React.PureComponent {
get modules() {
return InputNumberModules || (InputNumberModules = [BDModules.get(e => e.removeKeybind)[0], BDModules.get(e => e.marginBottom20)[0], BDModules.get(e => e.defaultMarginh5)[0], BDModules.get(e => e.colorStandard)[0], BDModules.get(e => e.size32)[0], BDModules.get(e => e._horizontal)[0], BDModules.get(e => e.inputMini)[0], BDModules.get(e => e.size16 && e.size20)[0], BDModules.get(e => e.colorTransparent)[0]]);
}
constructor(props) {
super(props);
let setting = this.props.setting;
this.state = {
data: this.props.manager.state.data[setting.id]
};
this.input = React.createElement(window.Lightcord.Api.Components.inputs.TextInput, {
placeholder: setting.placeholder,
name: setting.id,
value: this.state.data,
type: "number",
onChange: (value, name, input) => {
value = value.replace(/[^\d]+/g, "");
if (value == this.state.data) {
input.setValue(value);
return;
}
if (!this.lastEdited || this.lastEdited < Date.now() - 500) {
this.props.manager.onChange(this, value);
this.lastEdited = Date.now();
} else if (!this.isTiming) {
this.isTiming = setTimeout(() => {
this.props.manager.onChange(this, this.state.data);
this.isTiming = null;
this.lastEdited = Date.now();
}, 500);
}
this.setState({
data: value
});
},
type: "text"
});
}
render() {
let setting = this.props.setting;
let [rowModule, marginModule, marginModule2, colorModule, sizeModule, flexModule] = this.modules;
return React.createElement("div", {
className: rowModule.row + " " + marginModule.marginBottom20
}, React.createElement("div", {
className: `${rowModule.item} ${flexModule.flexChild}`
}, React.createElement("h5", {
className: colorModule.colorStandard + " " + sizeModule.size14 + " " + marginModule2.h5 + " " + marginModule2.defaultMarginh5
}, setting.title), this.input, setting.id === "timestamps.start" ? React.createElement(Lightcord.Api.Components.inputs.Button, {
onClick: () => {
DiscordNative.clipboard.copy(Date.now() + "");
},
color: "brand"
}, "Copy current timestamp") : null), React.createElement(Divider, null));
}
}
let InputChoiceModules;
class InputChoice extends React.PureComponent {
constructor(props) {
super(props);
let setting = this.props.setting;
this.state = {
data: this.props.manager.state.data[setting.id] ? "asset-" + this.props.manager.state.data[setting.id] : "none"
};
this.props.manager.updateWhenFetched(this);
}
onChange(data) {
let value = data.value;
if (!this.lastEdited || this.lastEdited < Date.now() - 500) {
this.props.manager.onChange(this, value === "none" ? null : value.replace("asset-", ""));
this.lastEdited = Date.now();
} else if (!this.isTiming) {
this.isTiming = setTimeout(() => {
this.props.manager.onChange(this, this.state.data === "none" ? null : this.state.data.replace("asset-", ""));
this.isTiming = null;
this.lastEdited = Date.now();
}, 500);
}
this.setState({
data: value
});
this.forceUpdate();
}
get modules() {
return InputChoiceModules || (InputChoiceModules = [BDModules.get(e => e.removeKeybind)[0], BDModules.get(e => e.marginBottom20)[0], BDModules.get(e => e.defaultMarginh5)[0], BDModules.get(e => e.colorStandard)[0], BDModules.get(e => e.size32)[0], BDModules.get(e => e._horizontal)[0]]);
}
render() {
let setting = this.props.setting;
let [rowModule, marginModule, marginModule2, colorModule, sizeModule, flexModule] = this.modules;
let options = this.props.manager.state.assets.map(e => {
return {
value: "asset-" + e.id,
label: e.name
};
});
options.unshift({
value: "none",
label: "No assets"
});
return React.createElement("div", {
className: rowModule.row + " " + marginModule.marginBottom20
}, React.createElement("div", {
className: `${rowModule.item} ${flexModule.flexChild}`
}, React.createElement("h5", {
className: colorModule.colorStandard + " " + sizeModule.size14 + " " + marginModule2.h5 + " " + marginModule2.defaultMarginh5
}, setting.title), React.createElement(window.Lightcord.Api.Components.inputs.Dropdown, {
value: this.state.data,
options: options,
onChange: this.onChange.bind(this)
})), React.createElement(Divider, null));
}
}
let DividerModules = [];
class Divider extends React.PureComponent {
get modules() {
return DividerModules && DividerModules[0] ? DividerModules : DividerModules = [BDModules.get(e => e.divider && Object.keys(e).length === 1)[0], BDModules.get(e => e.dividerDefault)[0]];
}
render() {
let [divider, dividerDefault] = this.modules;
return React.createElement("div", {
class: `${divider.divider} ${dividerDefault.dividerDefault}`
});
}
}
class DiscordButton extends React.Component {
render() {
let rowModule = BDModules.get(e => e.removeKeybind)[0];
let marginModule = BDModules.get(e => e.marginBottom20)[0];
let flexModule = BDModules.get(e => e._horizontal)[0];
return React.createElement("div", {
className: rowModule.row + " " + marginModule.marginBottom20
}, React.createElement("div", {
className: `${rowModule.item} ${flexModule.flexChild}`
}, React.createElement(Lightcord.Api.Components.inputs.Button, {
onClick: this.props.onClick,
color: "brand"
}, this.props.title)));
}
}
class RpcPreview extends React.Component {
constructor(props = {}) {
super(props);
this.state = {
active: "profile"
};
this.tabs = [];
this.props.settings.preview = this;
}
changeTab(tab) {
let ancientTab = this.state.active;
if (ancientTab === tab.props.id) return;
this.tabs.forEach(e => {
e.setActive(false);
});
tab.setActive(true);
this.setState({
active: tab.props.id
});
}
render() {
let preview = new this.preview({
preview: this
});
preview.setState(this.state.rpc);
return React.createElement("div", {
className: "lc-tabWrapper"
}, React.createElement("div", {
className: "lc-tabnav",
style: {
flex: "0 1 auto"
}
}, React.createElement(Tab, {
preview: this,
title: "Full Profile",
id: "profile"
}), React.createElement(Tab, {
preview: this,
title: "User Popout",
id: "popout"
})), preview.render());
}
isActive(tab) {
return this.state.active === tab;
}
get preview() {
if (this.state.active === "profile") return Profile;
return Popout;
}
}
class Tab extends React.Component {
constructor(props) {
super(props);
this.state = {
active: props.preview.isActive(props.id)
};
props.preview.tabs.push(this);
}
setActive(isActive) {
this.setState({
active: !!isActive
});
}
render() {
let className = `lc-navItem`;
if (this.state.active) {
className += ` lc-navItemActive`;
} else {
className += ` lc-navItemInactive`;
}
return React.createElement("div", {
className: className,
onClick: () => {
this.props.preview.changeTab(this);
}
}, this.props.title);
}
}
let popoutModule;
class Popout extends React.Component {
get modules() {
return popoutModule || (popoutModule = [BDModules.get(e => e.userPopout)[0], BDModules.get(e => e._horizontal)[0], BDModules.get(e => e.vertical && e.alignStretch && !e.streamerModeEnabledBtn)[0], BDModules.get(e => e.bot)[0], BDModules.get(e => e.activityUserPopout)[0], BDModules.get(e => e.muted && e.wrapper && e.base)[0], BDModules.get(e => e.size32)[0], BDModules.get(e => e.themeGhostHairlineChannels)[0], BDModules.get(e => e.note && Object.keys(e).length === 1)[0], BDModules.get(e => e.pro && e.inline)[0], BDModules.get(e => e.colorStandard)[0], BDModules.get(e => e.default && e.default.Messages)[0].default.Messages, BDModules.get(e => e.pointerEvents)[0], BDModules.get(e => e.default && e.default.getCurrentUser)[0].default]);
}
render() {
let [rootModule1, flexModule1, stylingModule1, nameTagModule1, activityModule1, textModule1, sizeModule1, scrollerModule1, noteModule1, protipModule1, colorModule1, Messages, avatarModule1, userModule1] = this.modules;
let user = userModule1.getCurrentUser();
let avatarURL = user.getAvatarURL(user.avatar.startsWith("a_") ? "gif" : "png");
let data = Object.assign({}, _0globals__WEBPACK_IMPORTED_MODULE_4__["defaultRPC"], this.props.preview.props.settings.state.data);
timestampClass = timestampClass || activityModule1.timestamp;
let images = (() => {
if (!data["assets.large"]) return null;
let images = [];
if (data["assets.large"]) {
images.push(React.createElement("img", {
alt: "",
src: `https://cdn.discordapp.com/app-assets/${data.application_id}/${data["assets.large"]}.png`,
class: `${activityModule1.assetsLargeImageUserPopout} ${data["assets.small"] ? activityModule1.assetsLargeMaskUserPopout : ""}`
}));
}
if (data["assets.small"]) {
images.push(React.createElement("img", {
alt: "",
src: `https://cdn.discordapp.com/app-assets/${data.application_id}/${data["assets.small"]}.png`,
class: activityModule1.assetsSmallImageUserPopout
}));
}
if (!images.length) return null;
return React.createElement("div", {
class: activityModule1.assets
}, images);
})();
return React.createElement("div", {
className: "lc-userPopout lc-tab-box-shadow"
}, React.createElement("div", {
class: rootModule1.userPopout,
role: "dialog",
tabindex: "-1"
}, React.createElement("div", {
class: rootModule1.headerPlaying
}, React.createElement("div", {
class: `${flexModule1.flex} ${stylingModule1.vertical} ${stylingModule1.justifyCenter} ${stylingModule1.alignCenter} ${stylingModule1.noWrap} ${rootModule1.headerTop}`,
style: {
flex: "1 1 auto"
}
}, React.createElement("div", {
class: rootModule1.avatarWrapperNormal,
role: "button",
tabindex: "0"
}, React.createElement("div", {
class: avatarModule1,
role: "img",
style: {
width: "80px",
height: "80px"
}
}, React.createElement("svg", {
width: "92",
height: "80",
viewBox: "0 0 92 80",
class: `${avatarModule1.mask} ${avatarModule1.svg}`
}, React.createElement("foreignObject", {
x: "0",
y: "0",
width: "80",
height: "80",
mask: "url(#svg-mask-avatar-status-round-80)"
}, React.createElement("img", {
src: avatarURL,
alt: " ",
class: avatarModule1.avatar
})), React.createElement(Status, null))), React.createElement("svg", {
width: "80",
height: "80",
class: rootModule1.avatarHint,
viewBox: "0 0 80 80"
}, React.createElement("foreignObject", {
x: "0",
y: "0",
width: "80",
height: "80",
mask: "url(#svg-mask-avatar-status-round-80)"
}, React.createElement("div", {
class: rootModule1.avatarHintInner
}, Messages.VIEW_PROFILE)))), React.createElement("div", {
class: rootModule1.headerText
}, React.createElement("div", {
class: `${flexModule1.flex} ${stylingModule1.horizontal} ${stylingModule1.justifyStart} ${stylingModule1.alignCenter} ${stylingModule1.noWrap}`,
style: {
flex: "1 1 auto"
}
}, React.createElement("div", {
class: `${rootModule1.headerTagNoNickname} ${nameTagModule1.nameTag}`
}, React.createElement("span", {
class: `${nameTagModule1.username} ${rootModule1.headerTagUsernameNoNickname}`
}, user.username), React.createElement("span", null, "#", user.discriminator))))), React.createElement("div", {
class: `${activityModule1.activityUserPopout} ${rootModule1.activity}`
}, React.createElement("h3", {
class: `${activityModule1.headerTextNormal} ${textModule1.base} ${sizeModule1.size12}`
}, Messages.USER_ACTIVITY_HEADER_PLAYING), React.createElement("div", {
class: activityModule1.bodyNormal
}, images, React.createElement("div", {
class: images ? activityModule1.contentImagesUserPopout : activityModule1.contentNoImagesUserPopout,
style: {
flex: "1 1 auto"
}
}, (() => {
if (!data.name) return null;
return React.createElement("h3", {
class: `${activityModule1.nameNormal} ${textModule1.base} ${sizeModule1.size14}`,
title: data.name
}, React.createElement("span", {
class: activityModule1.activityName
}, data.name));
})(), (() => {
if (!data.details) return null;
return React.createElement("div", {
title: data.title,
class: activityModule1.details
}, data.details);
})(), (() => {
if (!data.state) return null;
return React.createElement("div", {
class: activityModule1.state
}, React.createElement("span", {
title: data.state
}, data.state));
})(), (() => {
if (!data["timestamps.start"]) return null;
let timeComponent = Object(_timestampRender__WEBPACK_IMPORTED_MODULE_6__["default"])(Timestamp, Messages);
return React.createElement("div", {
class: activityModule1.timestamp
}, React.createElement(timeComponent, {
timestamps: {
end: null,
start: data["timestamps.start"]
}
}));
})())))), React.createElement("div", {
class: `${scrollerModule1.scrollerWrap} ${rootModule1.body} ${scrollerModule1.scrollerThemed} ${scrollerModule1.themeGhostHairline} ${scrollerModule1.scrollerFade}`
}, React.createElement("div", {
class: `${scrollerModule1.scroller} ${rootModule1.bodyInner}`
}, React.createElement("div", {
class: rootModule1.bodyTitle
}, Messages.NOTE), React.createElement("div", {
class: `${noteModule1.note} ${rootModule1.note}`
}, React.createElement("textarea", {
placeholder: Messages.NOTE_PLACEHOLDER,
maxlength: "256",
autocorrect: "off",
class: BDModules.get(e => e.scrollbarGhostHairline)[0].scrollbarGhostHairline,
style: {
height: "36px"
},
disabled: true
})))), React.createElement("div", {
class: rootModule1.footer
}, React.createElement("div", {
class: `${rootModule1.protip} ${protipModule1.inline}`
}, React.createElement("h3", {
class: `${protipModule1.pro} ${textModule1.base} ${sizeModule1.size12}`,
style: {
color: "rgb(67, 181, 129)"
}
}, Messages.PINNED_MESSAGES_PRO_TIP), React.createElement("div", {
class: `${colorModule1.colorStandard} ${sizeModule1.size14} ${protipModule1.tip}`
}, Messages.CONTEXT_MENU_HINT)))));
}
}
let StatusModules;
class Status extends React.Component {
get modules() {
return StatusModules || (StatusModules = [BDModules.get(e => e.default && e.default.getPresence)[0], BDModules.get(e => e.pointerEvents)[0].pointerEvents]);
}
render() {
let [getPresence, pointerEvents] = this.modules;
let status = getPresence.default.getPresence().status;
if (status === "invisible") status = "offline";
return React.createElement("rect", {
width: "16",
height: "16",
x: "60",
y: "60",
fill: "#ffffff",
mask: `url(#svg-mask-status-${status})`,
className: pointerEvents
});
}
}
let timestampClass = "";
let ProfileModules;
class Profile extends React.Component {
get modules() {
return ProfileModules || (ProfileModules = [BDModules.get(e => e.flex && e._horizontal)[0], BDModules.get(e => e.vertical && e.alignStretch && !e.streamerModeEnabledBtn)[0], BDModules.get(e => e.topSectionStreaming)[0], BDModules.get(e => e.pointerEvents)[0], BDModules.get(e => e.bot)[0], BDModules.get(e => e.activityProfile)[0], BDModules.get(e => e.muted && e.wrapper && e.base)[0], BDModules.get(e => e.size32)[0], BDModules.get(e => e.scrollerFade)[0], BDModules.get(e => e.note && Object.keys(e).length === 1)[0], BDModules.get(e => e.default && e.default.Messages)[0].default.Messages]);
}
render() {
let user = BDModules.get(e => e.default && e.default.getCurrentUser)[0].default.getCurrentUser();
let avatarURL = user.getAvatarURL(user.avatar.startsWith("a_") ? "gif" : "png");
let [flexModule1, stylingModule1, rootModule1, avatarModule1, nameTagModule1, activityModule1, textModule1, sizeModule1, scrollerModule1, noteModule1, Messages] = this.modules;
let data = Object.assign({}, _0globals__WEBPACK_IMPORTED_MODULE_4__["defaultRPC"], this.props.preview.props.settings.state.data);
timestampClass = timestampClass || activityModule1.timestamp;
let images = (() => {
if (!data["assets.large"]) return null;
let images = [];
if (data["assets.large"]) {
images.push(React.createElement("img", {
alt: "",
src: `https://cdn.discordapp.com/app-assets/${data.application_id}/${data["assets.large"]}.png`,
class: `${activityModule1.assetsLargeImageProfile} ${data["assets.small"] ? activityModule1.assetsLargeMaskProfile : ""}`
}));
}
if (data["assets.small"]) {
images.push(React.createElement("img", {
alt: "",
src: `https://cdn.discordapp.com/app-assets/${data.application_id}/${data["assets.small"]}.png`,
class: activityModule1.assetsSmallImageProfile
}));
}
if (!images.length) return null;
return React.createElement("div", {
class: activityModule1.assets
}, images);
})();
return [React.createElement("div", {
className: "lc-tab lc-tab-box-shadow"
}, React.createElement("div", {
class: `${flexModule1.flex} ${stylingModule1.vertical} ${stylingModule1.justifyStart} ${stylingModule1.alignStretch} ${stylingModule1.noWrap} ${rootModule1.root}`,
style: {
flex: "1 1 auto"
}
}, React.createElement("div", {
class: rootModule1.topSectionPlaying
}, React.createElement("header", {
class: rootModule1.header
}, React.createElement("div", {
class: `${rootModule1.avatar} ${avatarModule1.wrapper}`,
role: "img",
style: {
width: "80px",
height: "80px"
}
}, React.createElement("svg", {
width: "92",
height: "80",
viewBox: "0 0 92 80",
class: `${avatarModule1.mask} ${avatarModule1.svg}`
}, React.createElement("foreignObject", {
x: "0",
y: "0",
width: "80",
height: "80",
mask: "url(#svg-mask-avatar-status-round-80)"
}, React.createElement("img", {
src: avatarURL,
alt: " ",
class: avatarModule1.avatar
})), React.createElement(Status, null))), React.createElement("div", {
class: `${rootModule1.headerInfo}`
}, React.createElement("div", {
class: `${rootModule1.nameTag} ${nameTagModule1.nameTag}`
}, React.createElement("span", {
class: `${rootModule1.username} ${rootModule1.username}`
}, user.username), React.createElement("span", {
class: rootModule1.discriminator
}, "#", user.discriminator)), React.createElement("div", {
class: `${flexModule1.flex} ${flexModule1.horizontal} ${stylingModule1.justifyStart} ${stylingModule1.alignStretch} ${stylingModule1.noWrap} ${rootModule1.profileBadges}`,
style: {
flex: "1 1 auto"
}
}, React.createElement(Badges, null)))), React.createElement("div", {
class: rootModule1.headerFill
}, React.createElement("div", {
class: `${activityModule1.activityProfile} ${rootModule1.activity}`
}, React.createElement("h3", {
class: `${activityModule1.headerTextNormal} ${textModule1.base} ${sizeModule1.size12}`
}, Messages.USER_ACTIVITY_HEADER_PLAYING), React.createElement("div", {
class: activityModule1.bodyNormal
}, images, React.createElement("div", {
class: images ? activityModule1.contentImagesProfile : activityModule1.contentNoImagesUserPopout,
style: {
flex: "1 1 auto"
}
}, (() => {
if (!data.name) return null;
return React.createElement("h3", {
class: `${activityModule1.nameNormal} ${textModule1.base} ${sizeModule1.size14}`,
title: data.name
}, React.createElement("span", {
class: activityModule1.activityName
}, data.name));
})(), (() => {
if (!data.details) return null;
return React.createElement("div", {
title: data.title,
class: activityModule1.details
}, data.details);
})(), (() => {
if (!data.state) return null;
return React.createElement("div", {
class: activityModule1.state
}, React.createElement("span", {
title: data.state
}, data.state));
})(), (() => {
if (!data["timestamps.start"]) return null;
let timeComponent = Object(_timestampRender__WEBPACK_IMPORTED_MODULE_6__["default"])(Timestamp, Messages);
return React.createElement("div", {
class: activityModule1.timestamp
}, React.createElement(timeComponent, {
timestamps: {
end: null,
start: data["timestamps.start"]
}
}));
})()))))), React.createElement("div", {
class: rootModule1.body
}, React.createElement("div", {
class: `${scrollerModule1.scrollerWrap} ${scrollerModule1.scrollerFade}`
}, React.createElement("div", {
class: scrollerModule1.scroller
}, React.createElement("div", {
class: rootModule1.userInfoSection
}, React.createElement("div", {
class: rootModule1.userInfoSectionHeader
}, Messages.NOTE), React.createElement("div", {
class: `${rootModule1.note} ${noteModule1.note}`
}, React.createElement("textarea", {
placeholder: Messages.NOTE_PLACEHOLDER,
maxlength: "256",
autocorrect: "off",
class: BDModules.get(e => e.scrollbarGhostHairline)[0].scrollbarGhostHairline,
style: {
height: "40px"
},
disabled: true
}))), React.createElement(ConnectedAccounts, null))))))];
}
}
class ConnectedAccounts extends React.Component {
render() {
let accounts = [];
let rootModule1 = BDModules.get(e => e.topSectionStreaming)[0];
let AccountModule1 = BDModules.get(e => e.default && e.default.getAccounts)[0].default;
let accs = AccountModule1.getAccounts().filter(e => e.visibility === 1);
for (let acc of accs) {
accounts.push(React.createElement(ConnectedAccount, {
acc: acc
}));
}
if (accounts.length > 0) {
return React.createElement("div", {
class: rootModule1.userInfoSection
}, React.createElement("div", {
class: rootModule1.connectedAccounts
}, accounts));
}
return null;
}
}
class ConnectedAccount extends React.Component {
render() {
let [flexModule1, stylingModule1, rootModule1, flowerModule1, anchorModule1, SocialConstants] = [BDModules.get(e => e.flex && e._horizontal)[0], BDModules.get(e => e.vertical && e.alignStretch && !e.streamerModeEnabledBtn)[0], BDModules.get(e => e.topSectionStreaming)[0], BDModules.get(e => e.flowerStarContainer)[0], BDModules.get(e => e.anchor)[0], BDModules.get(e => e.default && e.default.get && e.default.map)[0].default];
let acc = this.props.acc;
let constantsSocial = SocialConstants.get(acc.type);
return React.createElement("div", {
class: `${flexModule1.flex} ${flexModule1.horizontal} ${stylingModule1.justifyStart} ${stylingModule1.alignCenter} ${stylingModule1.noWrap} ${rootModule1.connectedAccount}`,
style: {
flex: "0 1 auto"
}
}, React.createElement("img", {
alt: `Logo ${constantsSocial.name}`,
class: rootModule1.connectedAccountIcon,
src: constantsSocial.icon.color || constantsSocial.icon.white || constantsSocial.icon.grey
}), React.createElement("div", {
class: rootModule1.connectedAccountNameInner
}, React.createElement("div", {
class: rootModule1.connectedAccountName
}, acc.name), acc.verified ? React.createElement("span", null, React.createElement("div", {
class: `${flowerModule1.flowerStarContainer} ${rootModule1.connectedAccountVerifiedIcon}`,
style: {
width: "16px",
height: "16px"
}
}, React.createElement("svg", {
class: flowerModule1.flowerStar,
width: "16",
height: "16",
viewBox: "0 0 16 15.2"
}, React.createElement("path", {
fill: "#4f545c",
"fill-rule": "evenodd",
d: "m16 7.6c0 .79-1.28 1.38-1.52 2.09s.44 2 0 2.59-1.84.35-2.46.8-.79 1.84-1.54 2.09-1.67-.8-2.47-.8-1.75 1-2.47.8-.92-1.64-1.54-2.09-2-.18-2.46-.8.23-1.84 0-2.59-1.54-1.3-1.54-2.09 1.28-1.38 1.52-2.09-.44-2 0-2.59 1.85-.35 2.48-.8.78-1.84 1.53-2.12 1.67.83 2.47.83 1.75-1 2.47-.8.91 1.64 1.53 2.09 2 .18 2.46.8-.23 1.84 0 2.59 1.54 1.3 1.54 2.09z"
})), React.createElement("div", {
class: flowerModule1.childContainer
}, React.createElement("svg", {
width: "16",
height: "16",
viewBox: "0 0 16 15.2"
}, React.createElement("path", {
d: "M7.4,11.17,4,8.62,5,7.26l2,1.53L10.64,4l1.36,1Z",
fill: "#ffffff"
}))))) : null), React.createElement("a", {
class: `${anchorModule1.anchor} ${anchorModule1.anchorUnderlineOnHover}`,
rel: "noreferrer noopener",
target: "_blank",
role: "button",
tabindex: "0"
}, React.createElement("svg", {
class: rootModule1.connectedAccountOpenIcon,
width: "24",
height: "24",
viewBox: "0 0 24 24"
}, React.createElement("path", {
fill: "currentColor",
d: "M10 5V3H5.375C4.06519 3 3 4.06519 3 5.375V18.625C3 19.936 4.06519 21 5.375 21H18.625C19.936 21 21 19.936 21 18.625V14H19V19H5V5H10Z"
}), React.createElement("path", {
fill: "currentColor",
d: "M21 2.99902H14V4.99902H17.586L9.29297 13.292L10.707 14.706L19 6.41302V9.99902H21V2.99902Z"
}))));
}
}
class Badges extends React.Component {
render() {
let user = BDModules.get(e => e.default && e.default.getCurrentUser)[0].default.getCurrentUser();
let rootModule = BDModules.get(e => e.topSectionStreaming)[0];
let UserFlags = BDModules.get(e => e.UserFlags)[0].UserFlags;
let badges = [];
let serialized = [];
for (let flagName in UserFlags) {
if (user.hasFlag(UserFlags[flagName])) serialized.push(flagName);
}
for (let flagName of serialized) {
let searchable = `profileBadge${flagName.toLowerCase().replace(/_/g, " ").split(" ").map(e => e[0].toUpperCase() + e.slice(1)).join("")}`;
searchable = searchable.replace("HypesquadOnline", "HypeSquadOnline");
if (!rootModule[searchable]) continue;
badges.push(React.createElement(Badge, {
name: searchable
}));
}
if (user.hasPremiumSubscription) {
badges.push(React.createElement(Badge, {
name: "profileBadgePremium"
}));
}
return badges;
}
}
class Badge extends React.Component {
render() {
let rootModule1 = BDModules.get(e => e.topSectionStreaming)[0];
return React.createElement("div", {
class: rootModule1.profileBadgeWrapper
}, React.createElement("div", null, React.createElement("div", {
class: "",
role: "button",
tabindex: "0"
}, React.createElement("div", {
class: `${rootModule1.profileBadge} ${rootModule1[this.props.name]}`
}))));
}
}
class Timestamp extends React.Component {
render() {
return React.createElement("div", {
className: timestampClass
}, this.props.message);
}
}
/***/ }),
/***/ "./src/ui/publicservers/layer.js":
/*!***************************************!*\
!*** ./src/ui/publicservers/layer.js ***!
\***************************************/
/*! exports provided: default */
/***/ (function(module, __webpack_exports__, __webpack_require__) {
"use strict";
__webpack_require__.r(__webpack_exports__);
/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "default", function() { return V2C_Layer; });
/* harmony import */ var _modules_v2__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ../../modules/v2 */ "./src/modules/v2.js");
/* harmony import */ var _modules_domtools__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ../../modules/domtools */ "./src/modules/domtools.js");
class V2C_Layer extends _modules_v2__WEBPACK_IMPORTED_MODULE_0__["default"].reactComponent {
constructor(props) {
super(props);
this.keyupListener = this.keyupListener.bind(this);
}
keyupListener(e) {
if (e.which === 27) {
_modules_v2__WEBPACK_IMPORTED_MODULE_0__["default"].reactDom.unmountComponentAtNode(this.refs.root.parentNode);
}
}
componentDidMount() {
window.addEventListener("keyup", this.keyupListener);
const thisNode = _modules_domtools__WEBPACK_IMPORTED_MODULE_1__["default"].query(`#${this.props.id}`);
_modules_domtools__WEBPACK_IMPORTED_MODULE_1__["default"].animate({
duration: 200,
update: function (progress) {
thisNode.style.transform = `scale(${1.1 - 0.1 * progress}) translateZ(0px)`;
thisNode.style.opacity = progress;
if (progress == 1) {
setImmediate(() => {
thisNode.style.transform = "";
thisNode.style.opacity = "";
});
}
}
});
}
componentWillUnmount() {
window.removeEventListener("keyup", this.keyupListener);
const thisNode = _modules_domtools__WEBPACK_IMPORTED_MODULE_1__["default"].query(`#${this.props.id}`);
_modules_domtools__WEBPACK_IMPORTED_MODULE_1__["default"].animate({
duration: 200,
update: function (progress) {
thisNode.style.transform = `scale(${1.1 - 0.1 * (1 - progress)}) translateZ(0px)`;
thisNode.style.opacity = 1 - progress;
if (progress == 1) {
setImmediate(() => {
thisNode.remove();
});
}
}
});
const layer = _modules_domtools__WEBPACK_IMPORTED_MODULE_1__["default"].query(".publicServersOpen");
layer.classList.remove("publicServersOpen");
_modules_domtools__WEBPACK_IMPORTED_MODULE_1__["default"].animate({
duration: 200,
update: function (progress) {
layer.style.transform = `scale(${0.07 * progress + 0.93}) translateZ(0px)`;
layer.style.opacity = progress;
if (progress == 1) {
setImmediate(() => {
layer.style.transform = "";
layer.style.opacity = "";
});
}
}
});
}
componentWillMount() {
const layer = _modules_domtools__WEBPACK_IMPORTED_MODULE_1__["default"].query("[class*=\"layer-\"]");
layer.classList.add("publicServersOpen");
_modules_domtools__WEBPACK_IMPORTED_MODULE_1__["default"].animate({
duration: 200,
update: function (progress) {
layer.style.transform = `scale(${0.07 * (1 - progress) + 0.93}) translateZ(0px)`;
layer.style.opacity = 1 - progress;
}
});
}
render() {
return _modules_v2__WEBPACK_IMPORTED_MODULE_0__["default"].react.createElement("div", {
className: "layer bd-layer " + BDModules.get(e => e.layer && e.animating)[0].layer,
id: this.props.id,
ref: "root",
style: {
opacity: 0,
transform: "scale(1.1) translateZ(0px)"
}
}, this.props.children);
}
}
/***/ }),
/***/ "./src/ui/publicservers/publicServers.js":
/*!***********************************************!*\
!*** ./src/ui/publicservers/publicServers.js ***!
\***********************************************/
/*! exports provided: default */
/***/ (function(module, __webpack_exports__, __webpack_require__) {
"use strict";
__webpack_require__.r(__webpack_exports__);
/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "default", function() { return V2C_PublicServers; });
/* harmony import */ var _modules_v2__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ../../modules/v2 */ "./src/modules/v2.js");
/* harmony import */ var _tools__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ../tools */ "./src/ui/tools.js");
/* harmony import */ var _settingsTitle__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! ../settingsTitle */ "./src/ui/settingsTitle.js");
/* harmony import */ var _tabBarSeparator__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(/*! ../tabBarSeparator */ "./src/ui/tabBarSeparator.js");
/* harmony import */ var _tabBarHeader__WEBPACK_IMPORTED_MODULE_4__ = __webpack_require__(/*! ../tabBarHeader */ "./src/ui/tabBarHeader.js");
/* harmony import */ var _tabBarItem__WEBPACK_IMPORTED_MODULE_5__ = __webpack_require__(/*! ../tabBarItem */ "./src/ui/tabBarItem.js");
/* harmony import */ var _serverCard__WEBPACK_IMPORTED_MODULE_6__ = __webpack_require__(/*! ./serverCard */ "./src/ui/publicservers/serverCard.js");
/* harmony import */ var _sidebarView__WEBPACK_IMPORTED_MODULE_7__ = __webpack_require__(/*! ./sidebarView */ "./src/ui/publicservers/sidebarView.js");
class V2C_PublicServers extends _modules_v2__WEBPACK_IMPORTED_MODULE_0__["default"].reactComponent {
constructor(props) {
super(props);
this.setInitialState();
this.close = this.close.bind(this);
this.changeCategory = this.changeCategory.bind(this);
this.search = this.search.bind(this);
this.searchKeyDown = this.searchKeyDown.bind(this);
this.checkConnection = this.checkConnection.bind(this);
this.join = this.join.bind(this);
this.connect = this.connect.bind(this);
this.GuildStore = _modules_v2__WEBPACK_IMPORTED_MODULE_0__["default"].WebpackModules.findByUniqueProperties(["getGuilds"]);
this.AvatarDefaults = _modules_v2__WEBPACK_IMPORTED_MODULE_0__["default"].WebpackModules.findByUniqueProperties(["getUserAvatarURL", "DEFAULT_AVATARS"]);
this.InviteActions = _modules_v2__WEBPACK_IMPORTED_MODULE_0__["default"].WebpackModules.findByUniqueProperties(["acceptInvite"]);
this.SortedGuildStore = _modules_v2__WEBPACK_IMPORTED_MODULE_0__["default"].WebpackModules.findByUniqueProperties(["getSortedGuilds"]);
}
componentDidMount() {
this.checkConnection();
}
setInitialState() {
this.state = {
selectedCategory: -1,
title: "Loading...",
loading: true,
servers: [],
next: null,
connection: {
state: 0,
user: null
}
};
}
close() {
_modules_v2__WEBPACK_IMPORTED_MODULE_0__["default"].reactDom.unmountComponentAtNode(document.getElementById(this.props.rootId));
}
search(query, clear) {
const self = this;
fetch(`${self.endPoint}${query}${query ? "&schema=new" : "?schema=new"}`, {
method: "get"
}).then(async res => {
if (res.status !== 200) throw await res.text();
let data = await res.json();
let servers = data.results.reduce((arr, server) => {
server.joined = false;
arr.push(server); // arr.push(<ServerCard server={server} join={self.join}/>);
return arr;
}, []);
if (!clear) {
servers = self.state.servers.concat(servers);
} else {//servers.unshift(self.bdServer);
}
let end = data.size + data.from;
data.next = `?from=${end}`;
if (self.state.term) data.next += `&term=${self.state.term}`;
if (self.state.selectedCategory) data.next += `&category=${self.categoryButtons[self.state.selectedCategory]}`;
if (end >= data.total) {
end = data.total;
data.next = null;
}
let title = `Showing 1-${end} of ${data.total} results in ${self.categoryButtons[self.state.selectedCategory]}`;
if (self.state.term) title += ` for ${self.state.term}`;
self.setState({
loading: false,
title: title,
servers: servers,
next: data.next
});
if (clear) {
//console.log(self);
self.refs.sbv.refs.contentScroller.scrollTop = 0;
}
}).catch(err => {
console.error(err);
return self.setState({
loading: false,
title: "Failed to load servers. Check console for details"
});
});
}
async join(serverCard) {
if (serverCard.props.pinned) return this.InviteActions.acceptInvite(serverCard.props.invite_code);
await fetch(`${this.joinEndPoint}/${serverCard.props.server.identifier}`, {
method: "GET",
credentials: "include",
mode: "cors",
headers: {
"Accept": "application/json",
"Content-Type": "application/json"
}
});
serverCard.setState({
joined: true
});
}
connect() {
const self = this;
const options = self.windowOptions;
options.x = Math.round(window.screenX + window.innerWidth / 2 - options.width / 2);
options.y = Math.round(window.screenY + window.innerHeight / 2 - options.height / 2);
self.joinWindow = new (window.require("electron").remote.BrowserWindow)(options);
const url = "https://auth.discordservers.com/connect?scopes=guilds.join&previousUrl=https://auth.discordservers.com/info";
self.joinWindow.webContents.on("did-navigate", (event, url) => {
if (url != "https://auth.discordservers.com/info") return;
self.joinWindow.close();
self.checkConnection();
});
self.joinWindow.loadURL(url);
}
get windowOptions() {
return {
width: 500,
height: 550,
backgroundColor: "#282b30",
show: true,
resizable: false,
maximizable: false,
minimizable: false,
alwaysOnTop: true,
frame: false,
center: false,
webPreferences: {
nodeIntegration: false
}
};
}
get bdServer() {
const server = {
name: "BetterDiscord",
online: "7500+",
members: "20000+",
categories: ["community", "programming", "support"],
description: "Official BetterDiscord server for support etc",
identifier: "86004744966914048",
iconUrl: "https://cdn.discordapp.com/icons/86004744966914048/292e7f6bfff2b71dfd13e508a859aedd.webp",
nativejoin: true,
invite_code: "0Tmfo5ZbORCRqbAd",
pinned: true
};
const server2 = {
name: "Lightcord",
online: "30+",
members: "50+",
categories: ["community", "programming", "support"],
description: "Official Lightcord server for support etc",
identifier: "86004744966914048",
iconUrl: "https://avatars3.githubusercontent.com/u/65690058?s=200&v=4",
nativejoin: true,
invite_code: "7eFff2A",
pinned: true
};
const guildList = this.SortedGuildStore.getFlattenedGuildIds();
const defaultList = this.AvatarDefaults.DEFAULT_AVATARS;
return [_modules_v2__WEBPACK_IMPORTED_MODULE_0__["default"].react.createElement(_serverCard__WEBPACK_IMPORTED_MODULE_6__["default"], {
server: server2,
pinned: true,
join: this.join,
guildList: guildList,
fallback: defaultList[Math.floor(Math.random() * 5)]
}), _modules_v2__WEBPACK_IMPORTED_MODULE_0__["default"].react.createElement(_serverCard__WEBPACK_IMPORTED_MODULE_6__["default"], {
server: server,
pinned: true,
join: this.join,
guildList: guildList,
fallback: defaultList[Math.floor(Math.random() * 5)]
})];
}
get endPoint() {
return "https://search.discordservers.com";
}
get joinEndPoint() {
return "https://j.discordservers.com";
}
get connectEndPoint() {
return "https://join.discordservers.com/connect";
}
async checkConnection() {
const self = this;
try {
const response = await fetch(`https://auth.discordservers.com/info`, {
method: "GET",
credentials: "include",
mode: "cors",
headers: {
"Accept": "application/json",
"Content-Type": "application/json"
}
});
const data = await response.json();
self.setState({
selectedCategory: 0,
connection: {
state: 2,
user: data
}
});
self.search("", true);
} catch (error) {
console.error(error);
self.setState({
title: "Not connected to discordservers.com!",
loading: true,
selectedCategory: -1,
connection: {
state: 1,
user: null
}
});
}
}
render() {
return _modules_v2__WEBPACK_IMPORTED_MODULE_0__["default"].react.createElement(_sidebarView__WEBPACK_IMPORTED_MODULE_7__["default"], {
ref: "sbv"
}, this.component);
}
get component() {
return {
sidebar: {
component: this.sidebar
},
content: {
component: this.content
},
tools: {
component: _modules_v2__WEBPACK_IMPORTED_MODULE_0__["default"].react.createElement(_tools__WEBPACK_IMPORTED_MODULE_1__["default"], {
key: "pt",
ref: "tools",
onClick: this.close
})
}
};
}
get sidebar() {
return _modules_v2__WEBPACK_IMPORTED_MODULE_0__["default"].react.createElement("div", {
className: "sidebar",
key: "ps"
}, _modules_v2__WEBPACK_IMPORTED_MODULE_0__["default"].react.createElement("div", {
className: "ui-tab-bar SIDE"
}, _modules_v2__WEBPACK_IMPORTED_MODULE_0__["default"].react.createElement("div", {
className: "ui-tab-bar-header",
style: {
fontSize: "16px"
}
}, "Public Servers"), _modules_v2__WEBPACK_IMPORTED_MODULE_0__["default"].react.createElement(_tabBarSeparator__WEBPACK_IMPORTED_MODULE_3__["default"], null), this.searchInput, _modules_v2__WEBPACK_IMPORTED_MODULE_0__["default"].react.createElement(_tabBarSeparator__WEBPACK_IMPORTED_MODULE_3__["default"], null), _modules_v2__WEBPACK_IMPORTED_MODULE_0__["default"].react.createElement(_tabBarHeader__WEBPACK_IMPORTED_MODULE_4__["default"], {
text: "Categories"
}), this.categoryButtons.map((value, index) => {
return _modules_v2__WEBPACK_IMPORTED_MODULE_0__["default"].react.createElement(_tabBarItem__WEBPACK_IMPORTED_MODULE_5__["default"], {
id: index,
onClick: this.changeCategory,
key: index,
text: value,
selected: this.state.selectedCategory === index
});
}), _modules_v2__WEBPACK_IMPORTED_MODULE_0__["default"].react.createElement(_tabBarSeparator__WEBPACK_IMPORTED_MODULE_3__["default"], null), this.footer, this.connection));
}
get searchInput() {
return _modules_v2__WEBPACK_IMPORTED_MODULE_0__["default"].react.createElement("div", {
className: "ui-form-item"
}, _modules_v2__WEBPACK_IMPORTED_MODULE_0__["default"].react.createElement("div", {
className: "ui-text-input flex-vertical",
style: {
width: "172px",
marginLeft: "10px"
}
}, _modules_v2__WEBPACK_IMPORTED_MODULE_0__["default"].react.createElement("input", {
ref: "searchinput",
onKeyDown: this.searchKeyDown,
onChange: () => {},
type: "text",
className: "input default",
placeholder: "Search...",
maxLength: "50"
})));
}
searchKeyDown(e) {
const self = this;
if (self.state.loading || e.which !== 13) return;
self.setState({
loading: true,
title: "Loading...",
term: e.target.value
});
let query = `?term=${e.target.value}`;
if (self.state.selectedCategory !== 0) {
query += `&category=${self.categoryButtons[self.state.selectedCategory]}`;
}
self.search(query, true);
}
get categoryButtons() {
return ["All", "FPS Games", "MMO Games", "Strategy Games", "MOBA Games", "RPG Games", "Tabletop Games", "Sandbox Games", "Simulation Games", "Music", "Community", "Language", "Programming", "Other"];
}
changeCategory(id) {
const self = this;
if (self.state.loading) return;
self.refs.searchinput.value = "";
self.setState({
loading: true,
selectedCategory: id,
title: "Loading...",
term: null
});
if (id === 0) {
self.search("", true);
return;
}
self.search(`?category=${self.categoryButtons[id]}`, true);
}
get content() {
const self = this;
const guildList = this.SortedGuildStore.getFlattenedGuildIds();
const defaultList = this.AvatarDefaults.DEFAULT_AVATARS;
if (self.state.connection.state === 1) return self.notConnected;
let columnModule = BDModules.get(e => e.contentColumnDefault)[0];
return [_modules_v2__WEBPACK_IMPORTED_MODULE_0__["default"].react.createElement("div", {
ref: "content",
key: "pc",
className: columnModule.contentColumn + " " + columnModule.contentColumn + " content-column default"
}, _modules_v2__WEBPACK_IMPORTED_MODULE_0__["default"].react.createElement(_settingsTitle__WEBPACK_IMPORTED_MODULE_2__["default"], {
text: self.state.title
}), self.bdServer, self.state.servers.map(server => {
return _modules_v2__WEBPACK_IMPORTED_MODULE_0__["default"].react.createElement(_serverCard__WEBPACK_IMPORTED_MODULE_6__["default"], {
key: server.identifier,
server: server,
join: self.join,
guildList: guildList,
fallback: defaultList[Math.floor(Math.random() * 5)]
});
}), self.state.next && _modules_v2__WEBPACK_IMPORTED_MODULE_0__["default"].react.createElement("button", {
type: "button",
onClick: () => {
if (self.state.loading) return;
self.setState({
loading: true
});
self.search(self.state.next, false);
},
className: "ui-button filled brand small grow",
style: {
width: "100%",
marginTop: "10px",
marginBottom: "10px"
}
}, _modules_v2__WEBPACK_IMPORTED_MODULE_0__["default"].react.createElement("div", {
className: "ui-button-contents"
}, self.state.loading ? "Loading" : "Load More")), self.state.servers.length > 0 && _modules_v2__WEBPACK_IMPORTED_MODULE_0__["default"].react.createElement(_settingsTitle__WEBPACK_IMPORTED_MODULE_2__["default"], {
text: self.state.title
}))];
}
get notConnected() {
const self = this; //return BDV2.react.createElement(SettingsTitle, { text: self.state.title });
let columnModule = BDModules.get(e => e.contentColumnDefault)[0];
return [_modules_v2__WEBPACK_IMPORTED_MODULE_0__["default"].react.createElement("div", {
key: "ncc",
ref: "content",
className: columnModule.contentColumn + " " + columnModule.contentColumn + " content-column default"
}, _modules_v2__WEBPACK_IMPORTED_MODULE_0__["default"].react.createElement("h2", {
className: "ui-form-title h2 margin-reset margin-bottom-20"
}, "Not connected to discordservers.com!", _modules_v2__WEBPACK_IMPORTED_MODULE_0__["default"].react.createElement("button", {
onClick: self.connect,
type: "button",
className: "ui-button filled brand small grow",
style: {
display: "inline-block",
minHeight: "18px",
marginLeft: "10px",
lineHeight: "14px"
}
}, _modules_v2__WEBPACK_IMPORTED_MODULE_0__["default"].react.createElement("div", {
className: "ui-button-contents"
}, "Connect"))), self.bdServer)];
}
get footer() {
return _modules_v2__WEBPACK_IMPORTED_MODULE_0__["default"].react.createElement("div", {
className: "ui-tab-bar-header"
}, _modules_v2__WEBPACK_IMPORTED_MODULE_0__["default"].react.createElement("a", {
href: "https://discordservers.com",
target: "_blank"
}, "Discordservers.com"));
}
get connection() {
const self = this;
const {
connection
} = self.state;
if (connection.state !== 2) return _modules_v2__WEBPACK_IMPORTED_MODULE_0__["default"].react.createElement("span", null);
return _modules_v2__WEBPACK_IMPORTED_MODULE_0__["default"].react.createElement("span", null, _modules_v2__WEBPACK_IMPORTED_MODULE_0__["default"].react.createElement(_tabBarSeparator__WEBPACK_IMPORTED_MODULE_3__["default"], null), _modules_v2__WEBPACK_IMPORTED_MODULE_0__["default"].react.createElement("span", {
style: {
color: "#b9bbbe",
fontSize: "10px",
marginLeft: "10px"
}
}, "Connected as: ", `${connection.user.username}#${connection.user.discriminator}`), _modules_v2__WEBPACK_IMPORTED_MODULE_0__["default"].react.createElement("div", {
style: {
padding: "5px 10px 0 10px"
}
}, _modules_v2__WEBPACK_IMPORTED_MODULE_0__["default"].react.createElement("button", {
style: {
width: "100%",
minHeight: "20px"
},
type: "button",
className: "ui-button filled brand small grow"
}, _modules_v2__WEBPACK_IMPORTED_MODULE_0__["default"].react.createElement("div", {
className: "ui-button-contents",
onClick: self.connect
}, "Reconnect"))));
}
}
/***/ }),
/***/ "./src/ui/publicservers/serverCard.js":
/*!********************************************!*\
!*** ./src/ui/publicservers/serverCard.js ***!
\********************************************/
/*! exports provided: default */
/***/ (function(module, __webpack_exports__, __webpack_require__) {
"use strict";
__webpack_require__.r(__webpack_exports__);
/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "default", function() { return V2C_ServerCard; });
/* harmony import */ var _modules_v2__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ../../modules/v2 */ "./src/modules/v2.js");
class V2C_ServerCard extends _modules_v2__WEBPACK_IMPORTED_MODULE_0__["default"].reactComponent {
constructor(props) {
super(props);
if (!this.props.server.iconUrl) this.props.server.iconUrl = this.props.fallback;
this.state = {
imageError: false,
joined: this.props.guildList.includes(this.props.server.identifier)
};
}
render() {
const {
server
} = this.props;
let cardModule = BDModules.get(e => e.card && e.cardPrimary)[0];
let flexModule = BDModules.get(e => e.flexChild && e._horizontalReverse)[0];
let wrapModule = BDModules.get(e => e.noWrap && !e.streamerModeEnabled)[0];
return _modules_v2__WEBPACK_IMPORTED_MODULE_0__["default"].react.createElement("div", // cardPrimary-1Hv-to
{
className: `${cardModule.card} ${cardModule.cardPrimary} ${BDModules.get(e => e.marginBottom8)[0].marginBottom8} bd-server-card${server.pinned ? " bd-server-card-pinned" : ""}`
}, // BDV2.react.createElement(
// "div",
// { className: "flex-1xMQg5 flex-1O1GKY horizontal-1ae9ci horizontal-2EEEnY flex-1O1GKY directionRow-3v3tfG justifyStart-2yIZo0 alignStretch-1hwxMa noWrap-3jynv6" },
_modules_v2__WEBPACK_IMPORTED_MODULE_0__["default"].react.createElement("img", {
ref: "img",
className: "bd-server-image",
src: server.iconUrl,
onError: this.handleError.bind(this),
draggable: false
}), _modules_v2__WEBPACK_IMPORTED_MODULE_0__["default"].react.createElement("div", {
className: flexModule.flexChild + " bd-server-content"
}, _modules_v2__WEBPACK_IMPORTED_MODULE_0__["default"].react.createElement("div", {
className: flexModule.horizontal + " " + wrapModule.noWrap + " bd-server-header"
}, _modules_v2__WEBPACK_IMPORTED_MODULE_0__["default"].react.createElement("h5", {
className: "h5-18_1nd defaultColor-1_ajX0 margin-reset bd-server-name"
}, server.name), _modules_v2__WEBPACK_IMPORTED_MODULE_0__["default"].react.createElement("h5", {
className: "h5-18_1nd defaultColor-1_ajX0 margin-reset bd-server-member-count"
}, server.members, " Members")), _modules_v2__WEBPACK_IMPORTED_MODULE_0__["default"].react.createElement("div", {
className: flexModule.horizontal + " " + wrapModule.noWrap
}, _modules_v2__WEBPACK_IMPORTED_MODULE_0__["default"].react.createElement("div", {
className: "scrollerWrap-2lJEkd scrollerThemed-2oenus themeGhostHairline-DBD-2d scrollerFade-1Ijw5y bd-server-description-container"
}, _modules_v2__WEBPACK_IMPORTED_MODULE_0__["default"].react.createElement("div", {
className: "scroller-2FKFPG scroller bd-server-description"
}, server.description))), _modules_v2__WEBPACK_IMPORTED_MODULE_0__["default"].react.createElement("div", {
className: "flex-1xMQg5 flex-1O1GKY horizontal-1ae9ci horizontal-2EEEnY directionRow-3v3tfG noWrap-3jynv6 bd-server-footer"
}, _modules_v2__WEBPACK_IMPORTED_MODULE_0__["default"].react.createElement("div", {
className: "flexChild-faoVW3 bd-server-tags",
style: {
flex: "1 1 auto"
}
}, server.categories.join(", ")), this.state.joined && _modules_v2__WEBPACK_IMPORTED_MODULE_0__["default"].react.createElement("button", {
type: "button",
className: "button-38aScr lookFilled-1Gx00P colorBrand-3pXr91 sizeMin-1mJd1x grow-q77ONN colorGreen-29iAKY",
style: {
minHeight: "12px",
marginTop: "4px",
backgroundColor: "#3ac15c"
}
}, _modules_v2__WEBPACK_IMPORTED_MODULE_0__["default"].react.createElement("div", {
className: "ui-button-contents"
}, "Joined")), server.error && _modules_v2__WEBPACK_IMPORTED_MODULE_0__["default"].react.createElement("button", {
type: "button",
className: "button-38aScr lookFilled-1Gx00P colorBrand-3pXr91 sizeMin-1mJd1x grow-q77ONN disabled-9aF2ug",
style: {
minHeight: "12px",
marginTop: "4px",
backgroundColor: "#c13a3a"
}
}, _modules_v2__WEBPACK_IMPORTED_MODULE_0__["default"].react.createElement("div", {
className: "ui-button-contents"
}, "Error")), !server.error && !this.state.joined && _modules_v2__WEBPACK_IMPORTED_MODULE_0__["default"].react.createElement("button", {
type: "button",
className: "button-38aScr lookFilled-1Gx00P colorBrand-3pXr91 sizeMin-1mJd1x grow-q77ONN",
style: {
minHeight: "12px",
marginTop: "4px"
},
onClick: () => {
this.join();
}
}, _modules_v2__WEBPACK_IMPORTED_MODULE_0__["default"].react.createElement("div", {
className: "ui-button-contents"
}, "Join")))) // )
);
}
handleError() {
this.props.server.iconUrl = this.props.fallback;
this.setState({
imageError: true
});
}
join() {
this.props.join(this); //this.setState({joined: true});
}
}
/***/ }),
/***/ "./src/ui/publicservers/sidebarView.js":
/*!*********************************************!*\
!*** ./src/ui/publicservers/sidebarView.js ***!
\*********************************************/
/*! exports provided: default */
/***/ (function(module, __webpack_exports__, __webpack_require__) {
"use strict";
__webpack_require__.r(__webpack_exports__);
/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "default", function() { return V2C_SidebarView; });
/* harmony import */ var _modules_v2__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ../../modules/v2 */ "./src/modules/v2.js");
/* harmony import */ var _scroller__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ../scroller */ "./src/ui/scroller.js");
class V2C_SidebarView extends _modules_v2__WEBPACK_IMPORTED_MODULE_0__["default"].reactComponent {
constructor(props) {
super(props);
}
render() {
const {
sidebar,
content,
tools
} = this.props.children;
return _modules_v2__WEBPACK_IMPORTED_MODULE_0__["default"].react.createElement("div", {
className: "standardSidebarView-3F1I7i ui-standard-sidebar-view"
}, _modules_v2__WEBPACK_IMPORTED_MODULE_0__["default"].react.createElement("div", {
className: "sidebarRegion-VFTUkN sidebar-region"
}, _modules_v2__WEBPACK_IMPORTED_MODULE_0__["default"].react.createElement(_scroller__WEBPACK_IMPORTED_MODULE_1__["default"], {
key: "sidebarScroller",
ref: "sidebarScroller",
sidebar: true,
fade: sidebar.fade || true,
dark: sidebar.dark || true
}, sidebar.component)), _modules_v2__WEBPACK_IMPORTED_MODULE_0__["default"].react.createElement("div", {
className: "contentRegion-3nDuYy content-region"
}, _modules_v2__WEBPACK_IMPORTED_MODULE_0__["default"].react.createElement("div", {
className: "contentTransitionWrap-3hqOEW content-transition-wrap"
}, _modules_v2__WEBPACK_IMPORTED_MODULE_0__["default"].react.createElement("div", {
className: "scrollerWrap-2lJEkd firefoxFixScrollFlex-cnI2ix contentRegionScrollerWrap-3YZXdm content-region-scroller-wrap scrollerThemed-2oenus themeGhost-28MSn0 scrollerTrack-1ZIpsv"
}, _modules_v2__WEBPACK_IMPORTED_MODULE_0__["default"].react.createElement("div", {
className: "scroller-2FKFPG firefoxFixScrollFlex-cnI2ix contentRegionScroller-26nc1e content-region-scroller scroller",
ref: "contentScroller"
}, _modules_v2__WEBPACK_IMPORTED_MODULE_0__["default"].react.createElement("div", {
className: "contentColumn-2hrIYH contentColumnDefault-1VQkGM content-column default"
}, content.component), tools.component)))));
}
}
/***/ }),
/***/ "./src/ui/reloadIcon.js":
/*!******************************!*\
!*** ./src/ui/reloadIcon.js ***!
\******************************/
/*! exports provided: default */
/***/ (function(module, __webpack_exports__, __webpack_require__) {
"use strict";
__webpack_require__.r(__webpack_exports__);
/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "default", function() { return V2C_ReloadIcon; });
/* harmony import */ var _modules_v2__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ../modules/v2 */ "./src/modules/v2.js");
class V2C_ReloadIcon extends _modules_v2__WEBPACK_IMPORTED_MODULE_0__["default"].reactComponent {
constructor(props) {
super(props);
}
render() {
return _modules_v2__WEBPACK_IMPORTED_MODULE_0__["default"].react.createElement("svg", {
xmlns: "http://www.w3.org/2000/svg",
viewBox: "0 0 24 24",
fill: "#dcddde",
className: "bd-reload " + this.props.className,
onClick: this.props.onClick,
style: {
width: this.props.size || "24px",
height: this.props.size || "24px"
}
}, _modules_v2__WEBPACK_IMPORTED_MODULE_0__["default"].react.createElement("path", {
d: "M17.65 6.35C16.2 4.9 14.21 4 12 4c-4.42 0-7.99 3.58-7.99 8s3.57 8 7.99 8c3.73 0 6.84-2.55 7.73-6h-2.08c-.82 2.33-3.04 4-5.65 4-3.31 0-6-2.69-6-6s2.69-6 6-6c1.66 0 3.14.69 4.22 1.78L13 11h7V4l-2.35 2.35z"
}), _modules_v2__WEBPACK_IMPORTED_MODULE_0__["default"].react.createElement("path", {
fill: "none",
d: "M0 0h24v24H0z"
}));
}
}
/***/ }),
/***/ "./src/ui/scroller.js":
/*!****************************!*\
!*** ./src/ui/scroller.js ***!
\****************************/
/*! exports provided: default */
/***/ (function(module, __webpack_exports__, __webpack_require__) {
"use strict";
__webpack_require__.r(__webpack_exports__);
/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "default", function() { return V2C_Scroller; });
/* harmony import */ var _modules_v2__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ../modules/v2 */ "./src/modules/v2.js");
class V2C_Scroller extends _modules_v2__WEBPACK_IMPORTED_MODULE_0__["default"].reactComponent {
constructor(props) {
super(props);
}
render() {
//scrollerWrap-2lJEkd scrollerThemed-2oenus themeGhostHairline-DBD-2d scrollerFade-1Ijw5y
let scrollerModule1 = BDModules.get(e => e.scrollerHorizontal)[0];
let scrollerModule2 = BDModules.get(e => e.sidebarRegionScroller)[0];
let wrapperClass = `${scrollerModule1.scrollerWrap} ${scrollerModule1.scrollerThemed} ${scrollerModule1.themeGhostHairline}${this.props.fade ? " " + scrollerModule1.scrollerFade : ""}`;
let scrollerClass = scrollerModule1.scroller + " scroller";
/* fuck */
if (this.props.sidebar) scrollerClass += ` ${scrollerModule2.sidebarRegionScroller} sidebar-region-scroller`;
if (this.props.contentColumn) {
scrollerClass += " " + scrollerModule2.contentRegionScroller + " content-region-scroller";
/* fuck */
wrapperClass = `${scrollerModule1.scrollerWrap} ${scrollerModule2.contentRegionScrollerWrap} content-region-scroller-wrap ${scrollerModule1.scrollerThemed} ${scrollerModule1.themeGhost} ${scrollerModule1.scrollerTrack}`;
}
const {
children
} = this.props;
return _modules_v2__WEBPACK_IMPORTED_MODULE_0__["default"].react.createElement("div", {
key: "scrollerwrap",
className: wrapperClass
}, _modules_v2__WEBPACK_IMPORTED_MODULE_0__["default"].react.createElement("div", {
key: "scroller",
ref: "scroller",
className: scrollerClass
}, children));
}
}
/***/ }),
/***/ "./src/ui/sectionedSettingsPanel.js":
/*!******************************************!*\
!*** ./src/ui/sectionedSettingsPanel.js ***!
\******************************************/
/*! exports provided: default */
/***/ (function(module, __webpack_exports__, __webpack_require__) {
"use strict";
__webpack_require__.r(__webpack_exports__);
/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "default", function() { return V2C_SectionedSettingsPanel; });
/* harmony import */ var _modules_v2__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ../modules/v2 */ "./src/modules/v2.js");
/* harmony import */ var _settingsGroup__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ./settingsGroup */ "./src/ui/settingsGroup.js");
/* harmony import */ var _margintop__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! ./margintop */ "./src/ui/margintop.jsx");
class V2C_SectionedSettingsPanel extends _modules_v2__WEBPACK_IMPORTED_MODULE_0__["default"].reactComponent {
constructor(props) {
super(props);
}
render() {
return this.props.sections.map((section, i) => {
return [i !== 0 ? _modules_v2__WEBPACK_IMPORTED_MODULE_0__["default"].react.createElement(_margintop__WEBPACK_IMPORTED_MODULE_2__["default"], {}) : null, _modules_v2__WEBPACK_IMPORTED_MODULE_0__["default"].react.createElement(_settingsGroup__WEBPACK_IMPORTED_MODULE_1__["default"], Object.assign({}, section, {
onChange: this.props.onChange
}))];
});
}
}
/***/ }),
/***/ "./src/ui/settingsGroup.js":
/*!*********************************!*\
!*** ./src/ui/settingsGroup.js ***!
\*********************************/
/*! exports provided: default */
/***/ (function(module, __webpack_exports__, __webpack_require__) {
"use strict";
__webpack_require__.r(__webpack_exports__);
/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "default", function() { return V2C_SettingsGroup; });
/* harmony import */ var _0globals__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ../0globals */ "./src/0globals.js");
/* harmony import */ var _modules_v2__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ../modules/v2 */ "./src/modules/v2.js");
/* harmony import */ var _settingsTitle__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! ./settingsTitle */ "./src/ui/settingsTitle.js");
/* harmony import */ var _switch__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(/*! ./switch */ "./src/ui/switch.js");
class V2C_SettingsGroup extends _modules_v2__WEBPACK_IMPORTED_MODULE_1__["default"].reactComponent {
constructor(props) {
super(props);
}
render() {
const {
title,
settings,
button
} = this.props;
const buttonComponent = button ? _modules_v2__WEBPACK_IMPORTED_MODULE_1__["default"].react.createElement("button", {
key: "title-button",
className: "bd-pfbtn",
onClick: button.onClick
}, button.title) : null;
return [_modules_v2__WEBPACK_IMPORTED_MODULE_1__["default"].react.createElement(_settingsTitle__WEBPACK_IMPORTED_MODULE_2__["default"], {
text: title
}), buttonComponent, settings.map(setting => {
return _modules_v2__WEBPACK_IMPORTED_MODULE_1__["default"].react.createElement(_switch__WEBPACK_IMPORTED_MODULE_3__["default"], {
id: setting.id,
key: setting.id,
data: setting,
checked: _0globals__WEBPACK_IMPORTED_MODULE_0__["settingsCookie"][setting.id],
onChange: (id, checked) => {
this.props.onChange(id, checked);
}
});
})];
}
}
/***/ }),
/***/ "./src/ui/settingsPanel.js":
/*!*********************************!*\
!*** ./src/ui/settingsPanel.js ***!
\*********************************/
/*! exports provided: default */
/***/ (function(module, __webpack_exports__, __webpack_require__) {
"use strict";
__webpack_require__.r(__webpack_exports__);
/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "default", function() { return V2C_SettingsPanel; });
/* harmony import */ var _0globals__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ../0globals */ "./src/0globals.js");
/* harmony import */ var _modules_v2__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ../modules/v2 */ "./src/modules/v2.js");
/* harmony import */ var _settingsTitle__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! ./settingsTitle */ "./src/ui/settingsTitle.js");
/* harmony import */ var _switch__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(/*! ./switch */ "./src/ui/switch.js");
class V2C_SettingsPanel extends _modules_v2__WEBPACK_IMPORTED_MODULE_1__["default"].reactComponent {
constructor(props) {
super(props);
}
render() {
const {
settings
} = this.props;
let columnModule = BDModules.get(e => e.contentColumnDefault)[0];
return _modules_v2__WEBPACK_IMPORTED_MODULE_1__["default"].react.createElement("div", {
className: columnModule.contentColumn + " " + columnModule.contentColumnDefault + " content-column default"
}, _modules_v2__WEBPACK_IMPORTED_MODULE_1__["default"].react.createElement(_settingsTitle__WEBPACK_IMPORTED_MODULE_2__["default"], {
text: this.props.title
}), this.props.button && _modules_v2__WEBPACK_IMPORTED_MODULE_1__["default"].react.createElement("button", {
key: "title-button",
className: "bd-pfbtn",
onClick: this.props.button.onClick
}, this.props.button.title), settings.map(setting => {
return _modules_v2__WEBPACK_IMPORTED_MODULE_1__["default"].react.createElement(_switch__WEBPACK_IMPORTED_MODULE_3__["default"], {
id: setting.id,
key: setting.id,
data: setting,
checked: _0globals__WEBPACK_IMPORTED_MODULE_0__["settingsCookie"][setting.id],
onChange: (id, checked) => {
this.props.onChange(id, checked);
}
});
}));
}
}
/***/ }),
/***/ "./src/ui/settingsTitle.js":
/*!*********************************!*\
!*** ./src/ui/settingsTitle.js ***!
\*********************************/
/*! exports provided: default */
/***/ (function(module, __webpack_exports__, __webpack_require__) {
"use strict";
__webpack_require__.r(__webpack_exports__);
/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "default", function() { return V2C_SettingsTitle; });
/* harmony import */ var _modules_v2__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ../modules/v2 */ "./src/modules/v2.js");
class V2C_SettingsTitle extends _modules_v2__WEBPACK_IMPORTED_MODULE_0__["default"].reactComponent {
constructor(props) {
super(props);
} //h2-2gWE-o title-3sZWYQ size16-14cGz5 height20-mO2eIN weightSemiBold-NJexzi da-h2 da-title da-size16 da-height20 da-weightSemiBold defaultColor-1_ajX0 da-defaultColor marginTop60-3PGbtK da-marginTop60 marginBottom20-32qID7 da-marginBottom20
render() {
return _modules_v2__WEBPACK_IMPORTED_MODULE_0__["default"].react.createElement("h2", {
className: "ui-form-title h2 margin-reset margin-bottom-20"
}, this.props.text);
}
}
/***/ }),
/***/ "./src/ui/sidebar.js":
/*!***************************!*\
!*** ./src/ui/sidebar.js ***!
\***************************/
/*! exports provided: default, setUnselected */
/***/ (function(module, __webpack_exports__, __webpack_require__) {
"use strict";
__webpack_require__.r(__webpack_exports__);
/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "default", function() { return V2C_SideBar; });
/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "setUnselected", function() { return setUnselected; });
/* harmony import */ var _modules_v2__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ../modules/v2 */ "./src/modules/v2.js");
/* harmony import */ var _tabBarSeparator__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ./tabBarSeparator */ "./src/ui/tabBarSeparator.js");
/* harmony import */ var _tabBarHeader__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! ./tabBarHeader */ "./src/ui/tabBarHeader.js");
/* harmony import */ var _tabBarItem__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(/*! ./tabBarItem */ "./src/ui/tabBarItem.js");
class V2C_SideBar extends _modules_v2__WEBPACK_IMPORTED_MODULE_0__["default"].reactComponent {
constructor(props) {
super(props);
const si = document.querySelector("[class*=side-] > [class*=selected]");
if (si) this.scn = si.className;
const ns = document.querySelector("[class*=side-] > [class*='item-']:not([class*=selected])");
if (ns) this.nscn = ns.className;
const tabs = document.querySelectorAll("[class*='side-'] > [class*='item-']");
for (const element of tabs) {
element.addEventListener("click", () => {
this.setState({
selected: null
});
});
}
this.setInitialState();
this.onClick = this.onClick.bind(this);
this.setSelected = this.setSelected.bind(this);
sidebars.push(this);
}
setInitialState() {
const self = this;
self.state = {
selected: null,
items: self.props.items
};
const initialSelection = self.props.items.find(item => {
return item.selected;
});
if (initialSelection) {
self.state.selected = initialSelection.id;
}
}
render() {
const self = this;
const {
headerText
} = self.props;
const {
items,
selected
} = self.state;
return _modules_v2__WEBPACK_IMPORTED_MODULE_0__["default"].react.createElement("div", null, _modules_v2__WEBPACK_IMPORTED_MODULE_0__["default"].react.createElement(_tabBarSeparator__WEBPACK_IMPORTED_MODULE_1__["default"], null), _modules_v2__WEBPACK_IMPORTED_MODULE_0__["default"].react.createElement(_tabBarHeader__WEBPACK_IMPORTED_MODULE_2__["default"], {
text: headerText,
button: this.props.headerButton
}), items.map(item => {
const {
id,
text
} = item;
return _modules_v2__WEBPACK_IMPORTED_MODULE_0__["default"].react.createElement(_tabBarItem__WEBPACK_IMPORTED_MODULE_3__["default"], {
key: id,
selected: selected === id,
text: text,
id: id,
onClick: self.onClick
});
}));
}
setSelected(e) {
e.target.className = this.scn;
}
onClick(id) {
const si = document.querySelector("[class*=side] > [class*=selected]");
if (si) {
si.removeEventListener("click", this.setSelected);
si.addEventListener("click", this.setSelected);
si.className = this.nscn;
}
setUnselected();
this.setState({
selected: id
});
if (this.props.onClick) this.props.onClick(id);
}
componentWillUnmount() {
let sidebarIndex = sidebars.findIndex(e => e === this);
if (sidebarIndex) sidebars.splice(sidebarIndex, 1);
}
}
const sidebars = [];
function setUnselected() {
sidebars.forEach(sidebar => {
if (!sidebar.state.selected) return;
sidebar.setState({
selected: null
});
});
}
/***/ }),
/***/ "./src/ui/switch.js":
/*!**************************!*\
!*** ./src/ui/switch.js ***!
\**************************/
/*! exports provided: default */
/***/ (function(module, __webpack_exports__, __webpack_require__) {
"use strict";
__webpack_require__.r(__webpack_exports__);
/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "default", function() { return SwitchItem; });
/* harmony import */ var _modules_v2__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ../modules/v2 */ "./src/modules/v2.js");
/* harmony import */ var _components_switch__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ./components/switch */ "./src/ui/components/switch.jsx");
class SwitchItem extends _modules_v2__WEBPACK_IMPORTED_MODULE_0__["default"].reactComponent {
constructor(props) {
super(props);
this.onChange = this.onChange.bind(this);
}
onChange() {
this.props.checked = !this.props.checked;
this.props.onChange(this.props.id, this.props.checked);
}
render() {
const {
text,
info
} = this.props.data;
return _modules_v2__WEBPACK_IMPORTED_MODULE_0__["default"].react.createElement("div", {
className: "ui-flex flex-vertical flex-justify-start flex-align-stretch flex-nowrap ui-switch-item"
}, _modules_v2__WEBPACK_IMPORTED_MODULE_0__["default"].react.createElement("div", {
className: "ui-flex flex-horizontal flex-justify-start flex-align-stretch flex-nowrap"
}, _modules_v2__WEBPACK_IMPORTED_MODULE_0__["default"].react.createElement("h3", {
className: "ui-form-title h3 margin-reset margin-reset ui-flex-child"
}, text), _modules_v2__WEBPACK_IMPORTED_MODULE_0__["default"].react.createElement(_components_switch__WEBPACK_IMPORTED_MODULE_1__["default"], {
onChange: this.onChange,
checked: this.props.checked
})), _modules_v2__WEBPACK_IMPORTED_MODULE_0__["default"].react.createElement("div", {
className: "ui-form-text style-description margin-top-4",
style: {
flex: "1 1 auto"
}
}, info));
}
}
/***/ }),
/***/ "./src/ui/tabBarHeader.js":
/*!********************************!*\
!*** ./src/ui/tabBarHeader.js ***!
\********************************/
/*! exports provided: default */
/***/ (function(module, __webpack_exports__, __webpack_require__) {
"use strict";
__webpack_require__.r(__webpack_exports__);
/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "default", function() { return V2C_TabBarHeader; });
/* harmony import */ var _modules_v2__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ../modules/v2 */ "./src/modules/v2.js");
class V2C_TabBarHeader extends _modules_v2__WEBPACK_IMPORTED_MODULE_0__["default"].reactComponent {
constructor(props) {
super(props);
}
render() {
return _modules_v2__WEBPACK_IMPORTED_MODULE_0__["default"].react.createElement("div", {
className: "ui-tab-bar-header"
}, this.props.text, this.props.button);
}
}
/***/ }),
/***/ "./src/ui/tabBarItem.js":
/*!******************************!*\
!*** ./src/ui/tabBarItem.js ***!
\******************************/
/*! exports provided: default */
/***/ (function(module, __webpack_exports__, __webpack_require__) {
"use strict";
__webpack_require__.r(__webpack_exports__);
/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "default", function() { return V2C_TabBarItem; });
/* harmony import */ var _modules_v2__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ../modules/v2 */ "./src/modules/v2.js");
class V2C_TabBarItem extends _modules_v2__WEBPACK_IMPORTED_MODULE_0__["default"].reactComponent {
constructor(props) {
super(props);
this.setInitialState();
this.onClick = this.onClick.bind(this);
}
setInitialState() {
this.state = {
selected: this.props.selected || false
};
}
render() {
return _modules_v2__WEBPACK_IMPORTED_MODULE_0__["default"].react.createElement("div", {
className: `ui-tab-bar-item${this.props.selected ? " selected" : ""}`,
onClick: this.onClick
}, this.props.text);
}
onClick() {
if (this.props.onClick) {
this.props.onClick(this.props.id);
}
}
}
/***/ }),
/***/ "./src/ui/tabBarSeparator.js":
/*!***********************************!*\
!*** ./src/ui/tabBarSeparator.js ***!
\***********************************/
/*! exports provided: default */
/***/ (function(module, __webpack_exports__, __webpack_require__) {
"use strict";
__webpack_require__.r(__webpack_exports__);
/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "default", function() { return V2C_TabBarSeparator; });
/* harmony import */ var _modules_v2__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ../modules/v2 */ "./src/modules/v2.js");
class V2C_TabBarSeparator extends _modules_v2__WEBPACK_IMPORTED_MODULE_0__["default"].reactComponent {
constructor(props) {
super(props);
}
render() {
return _modules_v2__WEBPACK_IMPORTED_MODULE_0__["default"].react.createElement("div", {
className: "ui-tab-bar-separator margin-top-8 margin-bottom-8"
});
}
}
/***/ }),
/***/ "./src/ui/timestampRender.js":
/*!***********************************!*\
!*** ./src/ui/timestampRender.js ***!
\***********************************/
/*! exports provided: default */
/***/ (function(module, __webpack_exports__, __webpack_require__) {
"use strict";
__webpack_require__.r(__webpack_exports__);
/* harmony import */ var _modules_v2__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ../modules/v2 */ "./src/modules/v2.js");
const React = _modules_v2__WEBPACK_IMPORTED_MODULE_0__["default"].react;
const intervalModule1 = BDModules.get(e => e.Interval)[0];
/* harmony default export */ __webpack_exports__["default"] = (function (component, Messages) {
class TimeRender extends React.PureComponent {
constructor(props) {
super(props);
this._interval = new intervalModule1.Interval();
this.state = Object.assign({}, this.getUpdatedTime());
}
componentDidMount() {
let self = this;
this._interval.start(1e3, function () {
return self.setState(self.getUpdatedTime());
});
}
componentWillUnmount() {
this._interval.stop();
}
componentDidUpdate(activity) {
if (activity.timestamps.end === this.props.timestamps.end && activity.timestamps.start === this.props.timestamps.start) return;
this.setState(this.getUpdatedTime());
}
getUpdatedTime() {
let timestamps = this.props.timestamps;
let now = Date.now() / 1e3;
if (null != timestamps.end) {
return this.getDiff(now, checkUnix(timestamps.end) / 1e3);
}
if (null != timestamps.start) {
return this.getDiff(checkUnix(timestamps.start) / 1e3, now);
}
return {
hours: 0,
minutes: 0,
seconds: 0
};
}
renderTime(number, removeZero) {
if (removeZero === undefined) removeZero = false;
if (removeZero && number <= 0) return -1;
if (number < 10) return "0" + number;
return number;
}
getDiff(timestamp, now) {
let hours = Math.max(now - timestamp, 0);
let seconds = Math.floor(hours) % 60;
let minutes = Math.floor(hours / 60) % 60;
return {
hours: Math.floor(hours / 3600) % 24,
minutes,
seconds
};
}
render() {
let props = this.props;
let timestamps = props.timestamps;
let usedProps = function (props, items) {
if (null == props) return {};
let timestamps = {};
let keys = Object.keys(props);
for (let i = 0; i < keys.length; i++) {
let key = keys[i];
if (!items.indexOf(key) >= 0) {
timestamps[key] = props[key];
}
}
return timestamps;
}(props, ["timestamps"]);
let state = this.state;
let hours = state.hours;
let minutes = state.minutes;
let seconds = state.seconds;
let data = {
hours: this.renderTime(hours, !0),
minutes: this.renderTime(minutes),
seconds: this.renderTime(seconds)
};
if (timestamps.end !== null) {
return React.createElement(component, Object.assign({}, usedProps, {
message: Messages.USER_ACTIVITY_TIMESTAMP_END.format(data)
}));
}
if (timestamps.start !== null) {
return React.createElement(component, Object.assign({}, usedProps, {
message: Messages.USER_ACTIVITY_TIMESTAMP_START.format(data)
}));
}
return null;
}
}
return TimeRender;
});
;
function checkUnix(e) {
return ("" + e).length < 13 ? 1e3 * e : e;
}
/***/ }),
/***/ "./src/ui/tools.js":
/*!*************************!*\
!*** ./src/ui/tools.js ***!
\*************************/
/*! exports provided: default */
/***/ (function(module, __webpack_exports__, __webpack_require__) {
"use strict";
__webpack_require__.r(__webpack_exports__);
/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "default", function() { return V2C_Tools; });
/* harmony import */ var _modules_v2__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ../modules/v2 */ "./src/modules/v2.js");
/* harmony import */ var _xSvg__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ./xSvg */ "./src/ui/xSvg.js");
class V2C_Tools extends _modules_v2__WEBPACK_IMPORTED_MODULE_0__["default"].reactComponent {
constructor(props) {
super(props);
this.onClick = this.onClick.bind(this);
}
render() {
let toolsModule = BDModules.get(e => e.toolsContainer)[0];
let containerModule = BDModules.get(e => e.container && e.closeButton && e.closeButtonBold)[0];
return _modules_v2__WEBPACK_IMPORTED_MODULE_0__["default"].react.createElement("div", {
className: "tools-container " + toolsModule.toolsContainer
}, _modules_v2__WEBPACK_IMPORTED_MODULE_0__["default"].react.createElement("div", {
className: "tools " + toolsModule.tools
}, _modules_v2__WEBPACK_IMPORTED_MODULE_0__["default"].react.createElement("div", {
className: containerModule.container
}, _modules_v2__WEBPACK_IMPORTED_MODULE_0__["default"].react.createElement("div", {
className: "btn-close " + containerModule.closeButton,
onClick: this.onClick
}, _modules_v2__WEBPACK_IMPORTED_MODULE_0__["default"].react.createElement(_xSvg__WEBPACK_IMPORTED_MODULE_1__["default"], null)), _modules_v2__WEBPACK_IMPORTED_MODULE_0__["default"].react.createElement("div", {
className: "esc-text " + containerModule.keybind
}, "ESC"))));
}
onClick() {
if (this.props.onClick) {
this.props.onClick();
}
const closeButton = document.querySelector("." + BDModules.get(e => e.closeButton && e.keybindBold)[0].closeButton.split(" ")[0]);
if (closeButton) closeButton.click();
}
}
/***/ }),
/***/ "./src/ui/tooltip.js":
/*!***************************!*\
!*** ./src/ui/tooltip.js ***!
\***************************/
/*! exports provided: default */
/***/ (function(module, __webpack_exports__, __webpack_require__) {
"use strict";
__webpack_require__.r(__webpack_exports__);
/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "default", function() { return EmulatedTooltip; });
/* harmony import */ var _modules_utils__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ../modules/utils */ "./src/modules/utils.js");
/* harmony import */ var _modules_webpackModules__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ../modules/webpackModules */ "./src/modules/webpackModules.js");
/**
* Tooltip that automatically show and hide themselves on mouseenter and mouseleave events.
* Will also remove themselves if the node to watch is removed from DOM through
* a MutationObserver.
*
* Note this is not using Discord's internals but normal DOM manipulation and emulates
* Discord's own tooltips as closely as possible.
*
* @module EmulatedTooltip
* @version 0.0.1
*/
//<div class="layer-v9HyYc disabledPointerEvents-1ptgTB" style="position: absolute; left: 237px; bottom: 51px;">
// <div class="tooltip-2QfLtc tooltipTop-XDDSxx tooltipBlack-PPG47z tooltipDisablePointerEvents-3eaBGN" style="opacity: 1; transform: none;">
// <div class="tooltipPointer-3ZfirK"></div>
// <div class="tooltipContent-bqVLWK">User Settings</div>
// </div>
//</div>
//<div class="layer-v9HyYc" style="top: 860px; left: 632.5px;">
// <div class="tooltip-2QfLtc tooltipBlack-PPG47z tooltipTop-XDDSxx">
// <div class="tooltipPointer-3ZfirK"></div>
// Changelog
// </div>
//</div>
let TooltipClasses;
function getTooltipClasses() {
if (TooltipClasses) return TooltipClasses;
return TooltipClasses = _modules_webpackModules__WEBPACK_IMPORTED_MODULE_1__["default"].findByProps("tooltip", "tooltipBlack");
}
let TooltipLayers;
function getTooltipLayers() {
if (TooltipLayers) return TooltipLayers;
return TooltipLayers = _modules_webpackModules__WEBPACK_IMPORTED_MODULE_1__["default"].findByProps("layer", "layerContainer");
}
const getClass = function (sideOrColor) {
const upperCase = sideOrColor[0].toUpperCase() + sideOrColor.slice(1);
const tooltipClass = getTooltipClasses()[`tooltip${upperCase}`];
if (tooltipClass) return tooltipClass;
return null;
};
const classExists = function (sideOrColor) {
return getClass(sideOrColor) ? true : false;
};
const toPx = function (value) {
return `${value}px`;
};
/* <div class="layer-v9HyYc da-layer" style="left: 234.5px; bottom: 51px;">
<div class="tooltip-2QfLtc da-tooltip tooltipTop-XDDSxx tooltipBlack-PPG47z">
<div class="tooltipPointer-3ZfirK da-tooltipPointer"></div>
User Settings
</div>
</div> */
class EmulatedTooltip {
/**
*
* @constructor
* @param {(HTMLElement|jQuery)} node - DOM node to monitor and show the tooltip on
* @param {string} tip - string to show in the tooltip
* @param {object} options - additional options for the tooltip
* @param {string} [options.style=black] - correlates to the discord styling/colors (black, brand, green, grey, red, yellow)
* @param {string} [options.side=top] - can be any of top, right, bottom, left
* @param {boolean} [options.preventFlip=false] - prevents moving the tooltip to the opposite side if it is too big or goes offscreen
* @param {boolean} [options.disabled=false] - whether the tooltip should be disabled from showing on hover
*/
constructor(node, text, options = {}) {
const {
style = "black",
side = "top",
preventFlip = false,
disabled = false
} = options;
this.node = node instanceof jQuery ? node[0] : node;
this.label = text;
this.style = style.toLowerCase();
this.side = side.toLowerCase();
this.preventFlip = preventFlip;
this.disabled = disabled;
if (!classExists(this.side)) return _modules_utils__WEBPACK_IMPORTED_MODULE_0__["default"].err("EmulatedTooltip", `Side ${this.side} does not exist.`);
if (!classExists(this.style)) return _modules_utils__WEBPACK_IMPORTED_MODULE_0__["default"].err("EmulatedTooltip", `Style ${this.style} does not exist.`);
this.element = document.createElement("div");
this.element.className = getTooltipLayers().layer + " " + getTooltipLayers().disabledPointerEvents;
this.tooltipElement = document.createElement("div");
this.tooltipElement.className = `${getTooltipClasses().tooltip} ${getClass(this.style)}`;
this.labelElement = document.createElement("div");
this.labelElement.className = getTooltipClasses().tooltipContent;
const pointerElement = document.createElement("div");
pointerElement.className = getTooltipClasses().tooltipPointer;
this.tooltipElement.append(pointerElement);
this.tooltipElement.append(this.labelElement);
this.element.append(this.tooltipElement);
this.node.addEventListener("mouseenter", () => {
if (this.disabled) return;
this.show();
const observer = new MutationObserver(mutations => {
mutations.forEach(mutation => {
const nodes = Array.from(mutation.removedNodes);
const directMatch = nodes.indexOf(this.node) > -1;
const parentMatch = nodes.some(parent => parent.contains(this.node));
if (directMatch || parentMatch) {
this.hide();
observer.disconnect();
}
});
});
observer.observe(document.body, {
subtree: true,
childList: true
});
});
this.node.addEventListener("mouseleave", () => {
this.hide();
});
}
/** Container where the tooltip will be appended. */
get container() {
return document.querySelector("." + BDModules.get(e => e.popouts)[0].popouts.split(" ")[0] + " ~ ." + BDModules.get(e => e.layerContainer)[0].layerContainer.split(" ")[0]);
}
/** Boolean representing if the tooltip will fit on screen above the element */
get canShowAbove() {
return this.node.getBoundingClientRect().top - this.element.offsetHeight >= 0;
}
/** Boolean representing if the tooltip will fit on screen below the element */
get canShowBelow() {
return this.node.getBoundingClientRect().top + this.node.offsetHeight + this.element.offsetHeight <= _modules_utils__WEBPACK_IMPORTED_MODULE_0__["default"].screenHeight;
}
/** Boolean representing if the tooltip will fit on screen to the left of the element */
get canShowLeft() {
return this.node.getBoundingClientRect().left - this.element.offsetWidth >= 0;
}
/** Boolean representing if the tooltip will fit on screen to the right of the element */
get canShowRight() {
return this.node.getBoundingClientRect().left + this.node.offsetWidth + this.element.offsetWidth <= _modules_utils__WEBPACK_IMPORTED_MODULE_0__["default"].screenWidth;
}
/** Hides the tooltip. Automatically called on mouseleave. */
hide() {
this.element.remove();
this.tooltipElement.className = this._className;
}
/** Shows the tooltip. Automatically called on mouseenter. Will attempt to flip if position was wrong. */
show() {
this.tooltipElement.className = `${getTooltipClasses().tooltip} ${getClass(this.style)}`;
this.labelElement.textContent = this.label;
this.container.append(this.element);
if (this.side == "top") {
if (this.canShowAbove || !this.canShowAbove && this.preventFlip) this.showAbove();else this.showBelow();
}
if (this.side == "bottom") {
if (this.canShowBelow || !this.canShowBelow && this.preventFlip) this.showBelow();else this.showAbove();
}
if (this.side == "left") {
if (this.canShowLeft || !this.canShowLeft && this.preventFlip) this.showLeft();else this.showRight();
}
if (this.side == "right") {
if (this.canShowRight || !this.canShowRight && this.preventFlip) this.showRight();else this.showLeft();
}
}
/** Force showing the tooltip above the node. */
showAbove() {
this.tooltipElement.classList.add(getClass("top"));
this.element.style.setProperty("top", toPx(this.node.getBoundingClientRect().top - this.element.offsetHeight - 10));
this.centerHorizontally();
}
/** Force showing the tooltip below the node. */
showBelow() {
this.tooltipElement.classList.add(getClass("bottom"));
this.element.style.setProperty("top", toPx(this.node.getBoundingClientRect().top + this.node.offsetHeight + 10));
this.centerHorizontally();
}
/** Force showing the tooltip to the left of the node. */
showLeft() {
this.tooltipElement.classList.add(getClass("left"));
this.element.style.setProperty("left", toPx(this.node.getBoundingClientRect().left - this.element.offsetWidth - 10));
this.centerVertically();
}
/** Force showing the tooltip to the right of the node. */
showRight() {
this.tooltipElement.classList.add(getClass("right"));
this.element.style.setProperty("left", toPx(this.node.getBoundingClientRect().left + this.node.offsetWidth + 10));
this.centerVertically();
}
centerHorizontally() {
const nodecenter = this.node.getBoundingClientRect().left + this.node.offsetWidth / 2;
this.element.style.setProperty("left", toPx(nodecenter - this.element.offsetWidth / 2));
}
centerVertically() {
const nodecenter = this.node.getBoundingClientRect().top + this.node.offsetHeight / 2;
this.element.style.setProperty("top", toPx(nodecenter - this.element.offsetHeight / 2));
}
}
/***/ }),
/***/ "./src/ui/tooltipWrap.js":
/*!*******************************!*\
!*** ./src/ui/tooltipWrap.js ***!
\*******************************/
/*! exports provided: default */
/***/ (function(module, __webpack_exports__, __webpack_require__) {
"use strict";
__webpack_require__.r(__webpack_exports__);
/* harmony import */ var _modules_v2__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ../modules/v2 */ "./src/modules/v2.js");
/* harmony import */ var _tooltip__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ./tooltip */ "./src/ui/tooltip.js");
/* harmony default export */ __webpack_exports__["default"] = (class extends _modules_v2__WEBPACK_IMPORTED_MODULE_0__["default"].reactComponent {
constructor(props) {
super(props);
}
async componentDidMount() {
const {
style = "black",
side = "top",
text = ""
} = this.props;
this.node = _modules_v2__WEBPACK_IMPORTED_MODULE_0__["default"].reactDom.findDOMNode(this);
this.tooltip = new _tooltip__WEBPACK_IMPORTED_MODULE_1__["default"](this.node, text, {
style,
side
});
}
componentWillUnmount() {
this.tooltip.hide();
delete this.tooltip;
}
render() {
return this.props.children;
}
});
/***/ }),
/***/ "./src/ui/xSvg.js":
/*!************************!*\
!*** ./src/ui/xSvg.js ***!
\************************/
/*! exports provided: default */
/***/ (function(module, __webpack_exports__, __webpack_require__) {
"use strict";
__webpack_require__.r(__webpack_exports__);
/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "default", function() { return V2C_XSvg; });
/* harmony import */ var _modules_v2__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ../modules/v2 */ "./src/modules/v2.js");
class V2C_XSvg extends _modules_v2__WEBPACK_IMPORTED_MODULE_0__["default"].reactComponent {
constructor(props) {
super(props);
}
render() {
return _modules_v2__WEBPACK_IMPORTED_MODULE_0__["default"].react.createElement("svg", {
xmlns: "http://www.w3.org/2000/svg",
viewBox: "0 0 12 12",
style: {
width: "18px",
height: "18px"
}
}, _modules_v2__WEBPACK_IMPORTED_MODULE_0__["default"].react.createElement("g", {
className: "background",
fill: "none",
fillRule: "evenodd"
}, _modules_v2__WEBPACK_IMPORTED_MODULE_0__["default"].react.createElement("path", {
d: "M0 0h12v12H0"
}), _modules_v2__WEBPACK_IMPORTED_MODULE_0__["default"].react.createElement("path", {
className: "fill",
fill: "#dcddde",
d: "M9.5 3.205L8.795 2.5 6 5.295 3.205 2.5l-.705.705L5.295 6 2.5 8.795l.705.705L6 6.705 8.795 9.5l.705-.705L6.705 6"
})));
}
}
/***/ }),
/***/ "crypto":
/*!*************************!*\
!*** external "crypto" ***!
\*************************/
/*! no static exports found */
/***/ (function(module, exports) {
module.exports = require("crypto");
/***/ }),
/***/ "electron":
/*!***************************!*\
!*** external "electron" ***!
\***************************/
/*! no static exports found */
/***/ (function(module, exports) {
module.exports = require("electron");
/***/ }),
/***/ "events":
/*!*************************!*\
!*** external "events" ***!
\*************************/
/*! no static exports found */
/***/ (function(module, exports) {
module.exports = require("events");
/***/ }),
/***/ "fs":
/*!*********************!*\
!*** external "fs" ***!
\*********************/
/*! no static exports found */
/***/ (function(module, exports) {
module.exports = require("fs");
/***/ }),
/***/ "mkdirp":
/*!*************************!*\
!*** external "mkdirp" ***!
\*************************/
/*! no static exports found */
/***/ (function(module, exports) {
module.exports = require("mkdirp");
/***/ }),
/***/ "module":
/*!*************************!*\
!*** external "module" ***!
\*************************/
/*! no static exports found */
/***/ (function(module, exports) {
module.exports = require("module");
/***/ }),
/***/ "node-fetch":
/*!*****************************!*\
!*** external "node-fetch" ***!
\*****************************/
/*! no static exports found */
/***/ (function(module, exports) {
module.exports = require("node-fetch");
/***/ }),
/***/ "path":
/*!***********************!*\
!*** external "path" ***!
\***********************/
/*! no static exports found */
/***/ (function(module, exports) {
module.exports = require("path");
/***/ }),
/***/ "request":
/*!**************************!*\
!*** external "request" ***!
\**************************/
/*! no static exports found */
/***/ (function(module, exports) {
module.exports = require("request");
/***/ }),
/***/ "rimraf":
/*!*************************!*\
!*** external "rimraf" ***!
\*************************/
/*! no static exports found */
/***/ (function(module, exports) {
module.exports = require("rimraf");
/***/ }),
/***/ "yauzl":
/*!************************!*\
!*** external "yauzl" ***!
\************************/
/*! no static exports found */
/***/ (function(module, exports) {
module.exports = require("yauzl");
/***/ })
/******/ });
//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIndlYnBhY2s6Ly9CZXR0ZXJEaXNjb3JkL3dlYnBhY2svYm9vdHN0cmFwIiwid2VicGFjazovL0JldHRlckRpc2NvcmQvLi9zcmMvMGdsb2JhbHMuanMiLCJ3ZWJwYWNrOi8vQmV0dGVyRGlzY29yZC8uL3NyYy9pbmRleC5qcyIsIndlYnBhY2s6Ly9CZXR0ZXJEaXNjb3JkLy4vc3JjL2xvYWRpbmdJY29uLmpzIiwid2VicGFjazovL0JldHRlckRpc2NvcmQvLi9zcmMvbG9jYWxTdG9yYWdlRml4LmpzIiwid2VicGFjazovL0JldHRlckRpc2NvcmQvLi9zcmMvbW9kdWxlcy8yNGhvdXIuanMiLCJ3ZWJwYWNrOi8vQmV0dGVyRGlzY29yZC8uL3NyYy9tb2R1bGVzL0FudGlBZERNLmpzIiwid2VicGFjazovL0JldHRlckRpc2NvcmQvLi9zcmMvbW9kdWxlcy9DdXN0b21SaWNoUHJlc2VuY2UuanMiLCJ3ZWJwYWNrOi8vQmV0dGVyRGlzY29yZC8uL3NyYy9tb2R1bGVzL2JkQXBpLmpzIiwid2VicGFjazovL0JldHRlckRpc2NvcmQvLi9zcmMvbW9kdWxlcy9iZEV2ZW50cy5qcyIsIndlYnBhY2s6Ly9CZXR0ZXJEaXNjb3JkLy4vc3JjL21vZHVsZXMvYmx1clByaXZhdGUuanMiLCJ3ZWJwYWNrOi8vQmV0dGVyRGlzY29yZC8uL3NyYy9tb2R1bGVzL2NsYXNzTm9ybWFsaXplci5qcyIsIndlYnBhY2s6Ly9CZXR0ZXJEaXNjb3JkLy4vc3JjL21vZHVsZXMvY29sb3JlZFRleHQuanMiLCJ3ZWJwYWNrOi8vQmV0dGVyRGlzY29yZC8uL3NyYy9tb2R1bGVzL2NvbnRlbnRNYW5hZ2VyLmpzIiwid2VicGFjazovL0JldHRlckRpc2NvcmQvLi9zcmMvbW9kdWxlcy9jb3JlLmpzIiwid2VicGFjazovL0JldHRlckRpc2NvcmQvLi9zcmMvbW9kdWxlcy9kYXRhU3RvcmUuanMiLCJ3ZWJwYWNrOi8vQmV0dGVyRGlzY29yZC8uL3NyYy9tb2R1bGVzL2Rldk1vZGUuanMiLCJ3ZWJwYWNrOi8vQmV0dGVyRGlzY29yZC8uL3NyYy9tb2R1bGVzL2Rpc2FibGVUeXBpbmcuanMiLCJ3ZWJwYWNrOi8vQmV0dGVyRGlzY29yZC8uL3NyYy9tb2R1bGVzL2Rpc3RhbnQuanMiLCJ3ZWJwYWNrOi8vQmV0dGVyRGlzY29yZC8uL3NyYy9tb2R1bGVzL2RvbXRvb2xzLmpzIiwid2VicGFjazovL0JldHRlckRpc2NvcmQvLi9zcmMvbW9kdWxlcy9lbW9qaU1vZHVsZS5qcyIsIndlYnBhY2s6Ly9CZXR0ZXJEaXNjb3JkLy4vc3JjL21vZHVsZXMvcGx1Z2luQ2VydGlmaWVyLmpzIiwid2VicGFjazovL0JldHRlckRpc2NvcmQvLi9zcmMvbW9kdWxlcy9wbHVnaW5Nb2R1bGUuanMiLCJ3ZWJwYWNrOi8vQmV0dGVyRGlzY29yZC8uL3NyYy9tb2R1bGVzL3B1YmxpY1NlcnZlcnMuanMiLCJ3ZWJwYWNrOi8vQmV0dGVyRGlzY29yZC8uL3NyYy9tb2R1bGVzL3JlYWN0RGV2VG9vbHMuanMiLCJ3ZWJwYWNrOi8vQmV0dGVyRGlzY29yZC8uL3NyYy9tb2R1bGVzL3NldHRpbmdzUGFuZWwuanMiLCJ3ZWJwYWNrOi8vQmV0dGVyRGlzY29yZC8uL3NyYy9tb2R1bGVzL3NldHRpbmdzUGFuZWxTaWRlYmFyLmpzIiwid2VicGFjazovL0JldHRlckRpc2NvcmQvLi9zcmMvbW9kdWxlcy90aGVtZU1vZHVsZS5qcyIsIndlYnBhY2s6Ly9CZXR0ZXJEaXNjb3JkLy4vc3JjL21vZHVsZXMvdXRpbHMuanMiLCJ3ZWJwYWNrOi8vQmV0dGVyRGlzY29yZC8uL3NyYy9tb2R1bGVzL3YyLmpzIiwid2VicGFjazovL0JldHRlckRpc2NvcmQvLi9zcmMvbW9kdWxlcy92b2ljZU1vZGUuanMiLCJ3ZWJwYWNrOi8vQmV0dGVyRGlzY29yZC8uL3NyYy9tb2R1bGVzL3dlYnBhY2tNb2R1bGVzLmpzIiwid2VicGFjazovL0JldHRlckRpc2NvcmQvLi9zcmMvc3ZnL0xpZ2h0Y29yZFVzZXIuanN4Iiwid2VicGFjazovL0JldHRlckRpc2NvcmQvLi9zcmMvc3ZnL2J1Z19odW50ZXIuanN4Iiwid2VicGFjazovL0JldHRlckRpc2NvcmQvLi9zcmMvc3ZnL2NpcmN1cy5qc3giLCJ3ZWJwYWNrOi8vQmV0dGVyRGlzY29yZC8uL3NyYy9zdmcvbGlnaHRjb3JkLmpzeCIsIndlYnBhY2s6Ly9CZXR0ZXJEaXNjb3JkLy4vc3JjL3VpL0FjY291bnRJbmZvcy5qc3giLCJ3ZWJwYWNrOi8vQmV0dGVyRGlzY29yZC8uL3NyYy91aS9BcGlQcmV2aWV3LmpzeCIsIndlYnBhY2s6Ly9CZXR0ZXJEaXNjb3JkLy4vc3JjL3VpL2FkZG9uY2FyZC5qc3giLCJ3ZWJwYWNrOi8vQmV0dGVyRGlzY29yZC8uL3NyYy91aS9hZGRvbmxpc3QuanN4Iiwid2VicGFjazovL0JldHRlckRpc2NvcmQvLi9zcmMvdWkvYmRMb2dvLmpzIiwid2VicGFjazovL0JldHRlckRpc2NvcmQvLi9zcmMvdWkvY2hlY2tib3guanMiLCJ3ZWJwYWNrOi8vQmV0dGVyRGlzY29yZC8uL3NyYy91aS9jb21wb25lbnRzL2Ryb3Bkb3duLmpzeCIsIndlYnBhY2s6Ly9CZXR0ZXJEaXNjb3JkLy4vc3JjL3VpL2NvbXBvbmVudHMvc2VhcmNoLmpzeCIsIndlYnBhY2s6Ly9CZXR0ZXJEaXNjb3JkLy4vc3JjL3VpL2NvbXBvbmVudHMvc3dpdGNoLmpzeCIsIndlYnBhY2s6Ly9CZXR0ZXJEaXNjb3JkLy4vc3JjL3VpL2NvbnRlbnRDb2x1bW4uanMiLCJ3ZWJwYWNrOi8vQmV0dGVyRGlzY29yZC8uL3NyYy91aS9jc3NFZGl0b3IuanMiLCJ3ZWJwYWNrOi8vQmV0dGVyRGlzY29yZC8uL3NyYy91aS9jc3NFZGl0b3JEZXRhY2hlZC5qcyIsIndlYnBhY2s6Ly9CZXR0ZXJEaXNjb3JkLy4vc3JjL3VpL2Vycm9yQm91bmRhcnkuanMiLCJ3ZWJwYWNrOi8vQmV0dGVyRGlzY29yZC8uL3NyYy91aS9pY29ucy9kZWxldGUuanN4Iiwid2VicGFjazovL0JldHRlckRpc2NvcmQvLi9zcmMvdWkvaWNvbnMvZG93bmFycm93LmpzeCIsIndlYnBhY2s6Ly9CZXR0ZXJEaXNjb3JkLy4vc3JjL3VpL2ljb25zL2VkaXQuanN4Iiwid2VicGFjazovL0JldHRlckRpc2NvcmQvLi9zcmMvdWkvaWNvbnMvaGlzdG9yeS5qc3giLCJ3ZWJwYWNrOi8vQmV0dGVyRGlzY29yZC8uL3NyYy91aS9pY29ucy9zZWFyY2guanN4Iiwid2VicGFjazovL0JldHRlckRpc2NvcmQvLi9zcmMvdWkvbWFyZ2ludG9wLmpzeCIsIndlYnBhY2s6Ly9CZXR0ZXJEaXNjb3JkLy4vc3JjL3VpL3ByZXNlbmNlU2V0dGluZ3MuanN4Iiwid2VicGFjazovL0JldHRlckRpc2NvcmQvLi9zcmMvdWkvcHVibGljc2VydmVycy9sYXllci5qcyIsIndlYnBhY2s6Ly9CZXR0ZXJEaXNjb3JkLy4vc3JjL3VpL3B1YmxpY3NlcnZlcnMvcHVibGljU2VydmVycy5qcyIsIndlYnBhY2s6Ly9CZXR0ZXJEaXNjb3JkLy4vc3JjL3VpL3B1YmxpY3NlcnZlcnMvc2VydmVyQ2FyZC5qcyIsIndlYnBhY2s6Ly9CZXR0ZXJEaXNjb3JkLy4vc3JjL3VpL3B1YmxpY3NlcnZlcnMvc2lkZWJhclZpZXcuanMiLCJ3ZWJwYWNrOi8vQmV0dGVyRGlzY29yZC8uL3NyYy91aS9yZWxvYWRJY29uLmpzIiwid2VicGFjazovL0JldHRlckRpc2NvcmQvLi9zcmMvdWkvc2Nyb2xsZXIuanMiLCJ3ZWJwYWNrOi8vQmV0dGVyRGlzY29yZC8uL3NyYy91aS9zZWN0aW9uZWRTZXR0aW5nc1BhbmVsLmpzIiwid2VicGFjazovL0JldHRlckRpc2NvcmQvLi9zcmMvdWkvc2V0dGluZ3NHcm91cC5qcyIsIndlYnBhY2s6Ly9CZXR0ZXJEaXNjb3JkLy4vc3JjL3VpL3NldHRpbmdzUGFuZWwuanMiLCJ3ZWJwYWNrOi8vQmV0dGVyRGlzY29yZC8uL3NyYy91aS9zZXR0aW5nc1RpdGxlLmpzIiwid2VicGFjazovL0JldHRlckRpc2NvcmQvLi9zcmMvdWkvc2lkZWJhci5qcyIsIndlYnBhY2s6Ly9CZXR0ZXJEaXNjb3JkLy4vc3JjL3VpL3N3aXRjaC5qcyIsIndlYnBhY2s6Ly9CZXR0ZXJEaXNjb3JkLy4vc3JjL3VpL3RhYkJhckhlYWRlci5qcyIsIndlYnBhY2s6Ly9CZXR0ZXJEaXNjb3JkLy4vc3JjL3VpL3RhYkJhckl0ZW0uanMiLCJ3ZWJwYWNrOi8vQmV0dGVyRGlzY29yZC8uL3NyYy91aS90YWJCYXJTZXBhcmF0b3IuanMiLCJ3ZWJwYWNrOi8vQmV0dGVyRGlzY29yZC8uL3NyYy91aS90aW1lc3RhbXBSZW5kZXIuanMiLCJ3ZWJwYWNrOi8vQmV0dGVyRGlzY29yZC8uL3NyYy91aS90b29scy5qcyIsIndlYnBhY2s6Ly9CZXR0ZXJEaXNjb3JkLy4vc3JjL3VpL3Rvb2x0aXAuanMiLCJ3ZWJwYWNrOi8vQmV0dGVyRGlzY29yZC8uL3NyYy91aS90b29sdGlwV3JhcC5qcyIsIndlYnBhY2s6Ly9CZXR0ZXJEaXNjb3JkLy4vc3JjL3VpL3hTdmcuanMiLCJ3ZWJwYWNrOi8vQmV0dGVyRGlzY29yZC9leHRlcm5hbCBcImNyeXB0b1wiIiwid2VicGFjazovL0JldHRlckRpc2NvcmQvZXh0ZXJuYWwgXCJlbGVjdHJvblwiIiwid2VicGFjazovL0JldHRlckRpc2NvcmQvZXh0ZXJuYWwgXCJldmVudHNcIiIsIndlYnBhY2s6Ly9CZXR0ZXJEaXNjb3JkL2V4dGVybmFsIFwiZnNcIiIsIndlYnBhY2s6Ly9CZXR0ZXJEaXNjb3JkL2V4dGVybmFsIFwibWtkaXJwXCIiLCJ3ZWJwYWNrOi8vQmV0dGVyRGlzY29yZC9leHRlcm5hbCBcIm1vZHVsZVwiIiwid2VicGFjazovL0JldHRlckRpc2NvcmQvZXh0ZXJuYWwgXCJub2RlLWZldGNoXCIiLCJ3ZWJwYWNrOi8vQmV0dGVyRGlzY29yZC9leHRlcm5hbCBcInBhdGhcIiIsIndlYnBhY2s6Ly9CZXR0ZXJEaXNjb3JkL2V4dGVybmFsIFwicmVxdWVzdFwiIiwid2VicGFjazovL0JldHRlckRpc2NvcmQvZXh0ZXJuYWwgXCJyaW1yYWZcIiIsIndlYnBhY2s6Ly9CZXR0ZXJEaXNjb3JkL2V4dGVybmFsIFwieWF1emxcIiJdLCJuYW1lcyI6WyJtaW5pbXVtRGlzY29yZFZlcnNpb24iLCJjdXJyZW50RGlzY29yZFZlcnNpb24iLCJ3aW5kb3ciLCJEaXNjb3JkTmF0aXZlIiwicmVtb3RlQXBwIiwiZ2V0VmVyc2lvbiIsIm1pblN1cHBvcnRlZFZlcnNpb24iLCJiYmRWZXJzaW9uIiwiTENDaGFuZWxvZyIsImRlc2NyaXB0aW9uIiwiY2hhbmdlcyIsInRpdGxlIiwiaXRlbXMiLCJpbWFnZSIsInN1YnRpdGxlIiwicmVtb3RlIiwiZ2V0R2xvYmFsIiwidmVyc2lvbiIsImZvb3RlciIsIlRleHRFbGVtZW50IiwiV2VicGFja01vZHVsZXMiLCJmaW5kQnlEaXNwbGF5TmFtZSIsIk1vZGFsU3RhY2siLCJmaW5kQnlQcm9wcyIsIkFuY2hvciIsImZpbmQiLCJtIiwiZGlzcGxheU5hbWUiLCJBbmNob3JDbGFzc2VzIiwiYW5jaG9yIiwiYW5jaG9yVW5kZXJsaW5lT25Ib3ZlciIsImpvaW5TdXBwb3J0U2VydmVyIiwiY2xpY2siLCJwcmV2ZW50RGVmYXVsdCIsInN0b3BQcm9wYWdhdGlvbiIsInBvcCIsIkJEVjIiLCJqb2luTEMiLCJzdXBwb3J0TGluayIsIlJlYWN0IiwiY3JlYXRlRWxlbWVudCIsIm9uQ2xpY2siLCJjbGFzc05hbWUiLCJzaXplIiwiU2l6ZXMiLCJTTUFMTCIsImNvbG9yIiwiQ29sb3JzIiwiU1RBTkRBUkQiLCJiYmRDaGFuZ2Vsb2ciLCJ0eXBlIiwic2V0dGluZ3MiLCJpZCIsImluZm8iLCJpbXBsZW1lbnRlZCIsImhpZGRlbiIsImNhdCIsImNhdGVnb3J5IiwiZGVmYXVsdENvb2tpZSIsInNldHRpbmdzQ29va2llIiwic2V0dGluZ3NSUEMiLCJkZWZhdWx0UlBDIiwiRGF0ZSIsIm5vdyIsImJkcGx1Z2luRXJyb3JzIiwiYmR0aGVtZUVycm9ycyIsImJkQ29uZmlnIiwiT2JqZWN0IiwiY3JlYXRlIiwiQmV0dGVyRGlzY29yZENvbmZpZyIsImJkdGhlbWVzIiwiYmRwbHVnaW5zIiwicGx1Z2luQ29va2llIiwidGhlbWVDb29raWUiLCJsb2NhbFN0b3JhZ2VGaXgiLCJsb2FkaW5nSWNvbiIsImRlcHJlY2F0ZUdsb2JhbCIsImtleSIsInZhbHVlIiwiZGVmaW5lUHJvcGVydHkiLCJnZXQiLCJVdGlscyIsIndhcm4iLCJnbG9iYWxLZXlzIiwia2V5cyIsIkdsb2JhbHMiLCJwbHVnaW5Nb2R1bGUiLCJ0aGVtZU1vZHVsZSIsIkJERXZlbnRzIiwic2V0dGluZ3NQYW5lbCIsIkRhdGFTdG9yZSIsIkNvbnRlbnRNYW5hZ2VyIiwiQ2xhc3NOb3JtYWxpemVyIiwiQmRBcGkiLCJDb3JlIiwiQ29yZVdyYXBwZXIiLCJjb25zdHJ1Y3RvciIsInNldENvbmZpZyIsImluaXQiLCJyZXF1aXJlIiwidjJMb2FkZXIiLCJkb2N1bWVudCIsImJvZHkiLCJhcHBlbmRDaGlsZCIsImNvbnRlbnRXaW5kb3dHZXR0ZXIiLCJnZXRPd25Qcm9wZXJ0eURlc2NyaXB0b3IiLCJIVE1MSUZyYW1lRWxlbWVudCIsInByb3RvdHlwZSIsImNvbnRlbnRXaW5kb3ciLCJSZWZsZWN0IiwiYXBwbHkiLCJhcmd1bWVudHMiLCJQcm94eSIsIm9iaiIsInByb3AiLCJ1bmRlZmluZWQiLCJ2YWwiLCJiaW5kIiwid3JpdGFibGUiLCJjb25maWd1cmFibGUiLCJGdW5jdGlvbiIsIm9PcGVuIiwiWE1MSHR0cFJlcXVlc3QiLCJvcGVuIiwidXJsIiwidG9Mb3dlckNhc2UiLCJpbmNsdWRlcyIsIlRGSG91ciIsImluamVjdDI0SG91ciIsImNhbmNlbDI0SG91ciIsInR3ZWx2ZUhvdXIiLCJSZWdFeHAiLCJjb252ZXJ0IiwiZGF0YSIsIm1hdGNoZWQiLCJyZXR1cm5WYWx1ZSIsIm1hdGNoIiwibGVuZ3RoIiwicmVwbGFjZSIsInBhZFN0YXJ0IiwicGFyc2VJbnQiLCJjYW5jZWxDb3p5IiwibW9ua2V5UGF0Y2giLCJUaW1lRm9ybWF0dGVyIiwiYWZ0ZXIiLCJjYW5jZWxDb21wYWN0IiwicmVtb3ZlMjRIb3VyIiwiZGlzcGF0Y2hlciIsIkxpZ2h0Y29yZCIsIkRpc2NvcmRNb2R1bGVzIiwiQ2hhbm5lbE1vZHVsZSIsIkJETW9kdWxlcyIsImUiLCJkZWZhdWx0IiwiZ2V0Q2hhbm5lbCIsImhhc0NoYW5uZWwiLCJyZWxhdGlvblNoaXBNb2R1bGUiLCJhZGRSZWxhdGlvbnNoaXAiLCJETU1vZHVsZSIsImNsb3NlUHJpdmF0ZUNoYW5uZWwiLCJibG9ja2VkIiwidXNlck1vZHVsZSIsImdldEN1cnJlbnRVc2VyIiwiQW50aUJvdERNIiwiYW50aURNIiwiZW5hYmxlZCIsImVuYWJsZSIsInN1YnNjcmliZSIsImRpc2FibGUiLCJ1bnN1YnNjcmliZSIsImV2IiwibWVzc2FnZSIsImF1dGhvciIsImJvdCIsImd1aWxkX2lkIiwiY2hhbm5lbCIsImNoYW5uZWxfaWQiLCJzY2FuTWVzc2FnZSIsInNob3dUb2FzdCIsInVzZXJuYW1lIiwiZGlzY3JpbWluYXRvciIsImxvY2F0aW9uIiwidGVzdCIsImNvbnRlbnQiLCJFbWJlZHNDb250YWlucyIsInNlYXJjaCIsImVtYmVkcyIsIm1hcCIsImVtYmVkIiwidGV4dCIsImZpZWxkcyIsIm5hbWUiLCJEaXNwYXRjaGVyIiwiZGlzcGF0Y2giLCJBY3Rpb25UeXBlcyIsInNvY2tldElkIiwicGlkIiwicHJvY2VzcyIsIkN1c3RvbVJpY2hQcmVzZW5jZSIsImdhbWUiLCJmb3JtYXRlZEdhbWUiLCJhcHBsaWNhdGlvbl9pZCIsImRldGFpbHMiLCJzdGF0ZSIsInRpbWVzdGFtcHMiLCJzdGFydCIsImFzc2V0cyIsImxhcmdlX2ltYWdlIiwic21hbGxfaW1hZ2UiLCJzZW5kR2FtZSIsIkxPQ0FMX0FDVElWSVRZX1VQREFURSIsImFjdGl2aXR5IiwiY29uc29sZSIsImxvZyIsInNldCIsImZldGNoQXNzZXRzIiwiYXBwbGljYXRpb25JZCIsImdldEFzc2V0cyIsIkVycm9yIiwiUmVhY3RET00iLCJSZWFjdERvbSIsIlJlYWN0Q29tcG9uZW50IiwiV2luZG93Q29uZmlnRmlsZSIsImVtb3RlcyIsInNjcmVlbldpZHRoIiwiTWF0aCIsIm1heCIsImRvY3VtZW50RWxlbWVudCIsImNsaWVudFdpZHRoIiwiaW5uZXJXaWR0aCIsInNjcmVlbkhlaWdodCIsImNsaWVudEhlaWdodCIsImlubmVySGVpZ2h0IiwiZ2V0QWxsV2luZG93UHJlZmVyZW5jZXMiLCJnZXRXaW5kb3dQcmVmZXJlbmNlIiwic2V0V2luZG93UHJlZmVyZW5jZSIsImluamVjdENTUyIsImNzcyIsIkRPTSIsImFkZFN0eWxlIiwiZXNjYXBlSUQiLCJjbGVhckNTUyIsInJlbW92ZVN0eWxlIiwibGlua0pTIiwiYWRkU2NyaXB0IiwidW5saW5rSlMiLCJyZW1vdmVTY3JpcHQiLCJnZXRQbHVnaW4iLCJoYXNPd25Qcm9wZXJ0eSIsInBsdWdpbiIsImdldENvcmUiLCJtYWluQ29yZSIsImFsZXJ0Iiwic2hvd0NvbmZpcm1hdGlvbk1vZGFsIiwiY2FuY2VsVGV4dCIsIm9wdGlvbnMiLCJmaW5kTW9kdWxlIiwiZmlsdGVyIiwiZmluZEFsbE1vZHVsZXMiLCJmaW5kQWxsIiwiZmluZE1vZHVsZUJ5UHJvcHMiLCJwcm9wcyIsImZpbmRCeVVuaXF1ZVByb3BlcnRpZXMiLCJmaW5kTW9kdWxlQnlQcm90b3R5cGVzIiwicHJvdG9zIiwiZmluZEJ5UHJvdG90eXBlcyIsImZpbmRNb2R1bGVCeURpc3BsYXlOYW1lIiwiZ2V0SW50ZXJuYWxJbnN0YW5jZSIsIm5vZGUiLCJqUXVlcnkiLCJFbGVtZW50IiwibG9hZERhdGEiLCJwbHVnaW5OYW1lIiwiZ2V0UGx1Z2luRGF0YSIsImdldERhdGEiLCJzYXZlRGF0YSIsInNldFBsdWdpbkRhdGEiLCJzZXREYXRhIiwiZGVsZXRlRGF0YSIsImRlbGV0ZVBsdWdpbkRhdGEiLCJ3aGF0IiwibWV0aG9kTmFtZSIsIm9uUmVtb3ZlZCIsImNhbGxiYWNrIiwic3VwcHJlc3NFcnJvcnMiLCJtZXRob2QiLCJ0ZXN0SlNPTiIsImlzUGx1Z2luRW5hYmxlZCIsImlzVGhlbWVFbmFibGVkIiwiaXNTZXR0aW5nRW5hYmxlZCIsImVuYWJsZVNldHRpbmciLCJvbkNoYW5nZSIsImRpc2FibGVTZXR0aW5nIiwidG9nZ2xlU2V0dGluZyIsImdldEJERGF0YSIsInNldEJERGF0YSIsIm1ha2VBZGRvbkFQSSIsImNvb2tpZSIsImxpc3QiLCJtYW5hZ2VyIiwiQWRkb25BUEkiLCJmb2xkZXIiLCJpc0VuYWJsZWQiLCJ0b2dnbGUiLCJyZWxvYWQiLCJnZXRBbGwiLCJrIiwiYSIsIlBsdWdpbnMiLCJUaGVtZXMiLCJFdmVudEVtaXR0ZXIiLCJldmVudE5hbWUiLCJhcmdzIiwiZW1pdCIsIm9mZiIsImV2ZW50QWN0aW9uIiwicmVtb3ZlTGlzdGVuZXIiLCJzZWxlY3RvcnMiLCJyZW1vdmVEYSIsImdldFNlbGVjdG9ycyIsInN0YW5kYXJkU2lkZWJhclZpZXciLCJkZWZhdWx0Q2xhc3NOYW1lIiwic2VsZWN0cyIsInB1c2giLCJwYXltZW50U291cmNlUm93Iiwic3ViVGV4dCIsImRlc2NyaXB0aW9uV3JhcHBlciIsInVzZXJTZXR0aW5nc0FjY291bnQiLCJ2aWV3Qm9keSIsIkJsdXJQcml2YXRlIiwiZXJyb3IiLCJET01Ub29scyIsIm5vcm1hbGl6ZWRQcmVmaXgiLCJyYW5kQ2xhc3MiLCJzdG9wIiwiaGFzUGF0Y2hlZCIsInVucGF0Y2hDbGFzc01vZHVsZXMiLCJtb2R1bGVGaWx0ZXIiLCJyZXZlcnRFbGVtZW50IiwicXVlcnlTZWxlY3RvciIsInBhdGNoQ2xhc3NNb2R1bGVzIiwibm9ybWFsaXplRWxlbWVudCIsInBhdGNoRE9NTWV0aG9kcyIsIm1vZHVsZXMiLCJtb2R1bGUiLCJwYXRjaENsYXNzTW9kdWxlIiwidW5wYXRjaENsYXNzTW9kdWxlIiwic2hvdWxkSWdub3JlIiwiaXNOYU4iLCJlbmRzV2l0aCIsInN0YXJ0c1dpdGgiLCJBcnJheSIsImlzQXJyYXkiLCJfX2VzTW9kdWxlIiwiYmFzZUNsYXNzTmFtZSIsInNwbGl0IiwiY29tcG9uZW50TmFtZSIsImNsYXNzTmFtZXMiLCJjbGFzc0xpc3QiLCJub3JtYWxDbGFzcyIsImNhbWVsQ2FzZSIsInMiLCJpIiwidG9VcHBlckNhc2UiLCJzbGljZSIsImpvaW4iLCJuZXdTdHJpbmciLCJ0cmltIiwiZWxlbWVudCIsImNsYXNzZXMiLCJjIiwiY2xlbiIsIm5ld0NsYXNzIiwiYWRkIiwiY2hpbGQiLCJjaGlsZHJlbiIsIm5leHRFbGVtZW50U2libGluZyIsInRvUmVtb3ZlIiwicmVtb3ZlIiwiY29udGFpbnMiLCJET01Ub2tlbkxpc3QiLCJ0b2tlbiIsInRva2VucyIsInQiLCJDb2xvcmVkVGV4dCIsImluamVjdENvbG9yZWRUZXh0IiwiY2FuY2VsQ29sb3JlZFRleHQiLCJNZXNzYWdlQ29tcG9uZW50IiwiYmVmb3JlIiwibWV0aG9kQXJndW1lbnRzIiwiY2hpbGRyZW5NZXNzYWdlQ29udGVudCIsIm1lc3NhZ2VDb250ZW50Iiwib3JpZ2luYWxUeXBlIiwiX19vcmlnaW5hbE1ldGhvZCIsInJvbGVDb2xvciIsImNvbG9yU3RyaW5nIiwic3R5bGUiLCJhc3NpZ24iLCJyZW1vdmVDb2xvcmVkVGV4dCIsImNsYXNzTmFtZU1hcmt1cCIsIm1hcmt1cCIsInF1ZXJ5U2VsZWN0b3JBbGwiLCJmb3JFYWNoIiwiZWxlbSIsInNldFByb3BlcnR5IiwicGF0aCIsImZzIiwiTW9kdWxlIiwiZ2xvYmFsUGF0aHMiLCJyZXNvbHZlIiwiYXBwIiwiZ2V0QXBwUGF0aCIsIk1ldGFFcnJvciIsIm9yaWdpbmFsSlNSZXF1aXJlIiwiX2V4dGVuc2lvbnMiLCJvcmlnaW5hbENTU1JlcXVpcmUiLCJzcGxpdFJlZ2V4IiwiZXNjYXBlZEF0UmVnZXgiLCJ0aW1lQ2FjaGUiLCJ3YXRjaGVycyIsImdldENvbnRlbnRSZXF1aXJlIiwicGx1Z2luc0ZvbGRlciIsIl9wbHVnaW5zRm9sZGVyIiwicmVhbHBhdGhTeW5jIiwiZGF0YVBhdGgiLCJ0aGVtZXNGb2xkZXIiLCJfdGhlbWVzRm9sZGVyIiwid2F0Y2hDb250ZW50IiwiY29udGVudFR5cGUiLCJpc1BsdWdpbiIsImJhc2VGb2xkZXIiLCJmaWxlRW5kaW5nIiwid2F0Y2giLCJwZXJzaXN0ZW50IiwiZXZlbnRUeXBlIiwiZmlsZW5hbWUiLCJQcm9taXNlIiwiciIsInNldFRpbWVvdXQiLCJzdGF0U3luYyIsImVyciIsImNvZGUiLCJ1bmxvYWRQbHVnaW4iLCJ1bmxvYWRUaGVtZSIsImlzRmlsZSIsInN0YXRzIiwibXRpbWUiLCJnZXRUaW1lIiwibG9hZFBsdWdpbiIsImxvYWRUaGVtZSIsInJlbG9hZFBsdWdpbiIsInJlbG9hZFRoZW1lIiwidW53YXRjaENvbnRlbnQiLCJjbG9zZSIsImV4dHJhY3RNZXRhIiwiZmlyc3RMaW5lIiwiaGFzT2xkTWV0YSIsInBhcnNlT2xkTWV0YSIsImhhc05ld01ldGEiLCJwYXJzZU5ld01ldGEiLCJtZXRhIiwicmF3TWV0YSIsInN1YnN0cmluZyIsImxhc3RJbmRleE9mIiwiaW5kZXhPZiIsInBhcnNlZCIsImZvcm1hdCIsImJsb2NrIiwib3V0IiwiZmllbGQiLCJhY2N1bSIsImxpbmUiLCJjaGFyQXQiLCJsIiwic3Vic3RyIiwic2VsZiIsIm9yaWdpbmFsUmVxdWlyZSIsInBvc3NpYmxlUGF0aCIsImJhc2VuYW1lIiwiZXhpc3RzU3luYyIsInJlYWRGaWxlU3luYyIsInN0cmlwQk9NIiwiYWRkZWQiLCJhdGltZU1zIiwibW9kaWZpZWQiLCJtdGltZU1zIiwiSlNPTiIsInN0cmluZ2lmeSIsIl9jb21waWxlIiwiZGlkRXhwb3J0IiwiaXNFbXB0eSIsImV4cG9ydHMiLCJtYWtlUGxhY2Vob2xkZXJQbHVnaW4iLCJnZXROYW1lIiwiZ2V0QXV0aG9yIiwiZ2V0RGVzY3JpcHRpb24iLCJzb3VyY2UiLCJ3ZWJzaXRlIiwibG9hZENvbnRlbnQiLCJmaWxlIiwic3RhY2siLCJ1bmxvYWRDb250ZW50IiwiY2FjaGUiLCJpc0xvYWRlZCIsInJlbG9hZENvbnRlbnQiLCJjYW50VW5sb2FkIiwibG9hZE5ld0NvbnRlbnQiLCJiYXNlZGlyIiwiZmlsZXMiLCJyZWFkZGlyU3luYyIsImNvbnRlbnRMaXN0IiwidmFsdWVzIiwicmVtb3ZlZCIsImYiLCJsb2FkQWxsQ29udGVudCIsImVycm9ycyIsImxvYWRQbHVnaW5zIiwibG9hZFRoZW1lcyIsImNvbmZpZyIsImZsYXQiLCJFRCIsIldlYlNvY2tldCIsInBhdGNoQXR0cmlidXRlcyIsImluaXRTZXR0aW5ncyIsImNoZWNrRm9yR3VpbGRzIiwiaW5pdGlhbGl6ZSIsImluaXRpYWxpemVTZXR0aW5ncyIsImF0b2IiLCJhZGRFdmVudExpc3RlbmVyIiwiUGx1Z2luQ2VydGlmaWVyIiwiZ2V0RWxlbWVudHNCeUNsYXNzTmFtZSIsImluaXRPYnNlcnZlciIsInNob3dDb250ZW50RXJyb3JzIiwicGx1Z2lucyIsInRoZW1lcyIsInByZXZpb3VzVmVyc2lvbiIsInNob3dDaGFuZ2Vsb2dNb2RhbCIsIkVtb2ppTW9kdWxlIiwicGF0Y2hTb2NpYWwiLCJwYXRjaEd1aWxkUGlsbHMiLCJwYXRjaEd1aWxkTGlzdEl0ZW1zIiwicGF0Y2hHdWlsZFNlcGFyYXRvciIsInBhdGNoTWVzc2FnZUhlYWRlciIsInBhdGNoTWVtYmVyTGlzdCIsInBhdGNoQXR0YWNobWVudCIsImhhdmVJbnN0YWxsZWREZWZhdWx0Iiwib25DbG9zZSIsImxvZ28iLCJ0b3AiLCJpbm5lckhUTUwiLCJhdHRyaWJzUGF0Y2hzIiwiY2FuY2VsUGF0Y2hBdHRyaWJ1dGVzIiwidjIiLCJBcGkiLCJlbnN1cmVFeHBvcnRlZCIsInRoZW4iLCJVc2VyUG9wb3V0IiwicmVuZGVyIiwiY2FsbCIsInRpbWVzQ2hlY2tlZCIsIndyYXBwZXIiLCJndWlsZENsYXNzZXMiLCJndWlsZCIsImxpc3RJdGVtIiwiYmxvYiIsImJsb2JDb250YWluZXIiLCJkZWZlckxvYWRlZCIsInJlYWR5U3RhdGUiLCJpbmplY3RFeHRlcm5hbHMiLCJvcmlnaW5hbCIsImdldFNldHRpbmdHcm91cCIsInNhdmVTZXR0aW5ncyIsImxvYWRTZXR0aW5ncyIsInNldHRpbmciLCJnZXRQcmVkaWNhdGVTZWN0aW9ucyIsInNldHRpbmdNb2R1bGUiLCJyZXN1bHQiLCJzZWN0aW9uIiwicG9wZWQiLCJyZW5kZXJTaWRlYmFyIiwiY2xhc3NOYW1lTGF5ZXIiLCJjbGFzc05hbWVTb2NpYWxMaW5rcyIsImNsYXNzTmFtZU1vZGFsIiwibWFpbk9ic2VydmVyIiwiTXV0YXRpb25PYnNlcnZlciIsIm11dGF0aW9ucyIsIm1sZW4iLCJtdXRhdGlvbiIsInJhd09ic2VydmVyIiwiYWRkZWROb2RlcyIsImxheWVyIiwiYW5pbWF0aW5nIiwic29jaWFsTGlua3MiLCJtb2RhbCIsImlubmVyIiwicmVzcG9uc2l2ZVdpZHRoTW9iaWxlIiwic2V0QXR0cmlidXRlIiwicGFyZW50RWxlbWVudCIsIm9ic2VydmUiLCJjaGlsZExpc3QiLCJzdWJ0cmVlIiwic29jaWFsUGF0Y2giLCJUYWJCYXIiLCJ0b1N0cmluZyIsInNvY2lhbE1vZHVsZTEiLCJuZXdPbmUiLCJyZXR1cm5WYWwiLCJUb29sdGlwV3JhcCIsInNpZGUiLCJsaW5rIiwiaHJlZiIsInRhcmdldCIsIkxpZ2h0Y29yZExvZ28iLCJCRExvZ28iLCJjbGFzc05hbWVDb2xvck11dGVkIiwic2l6ZXMiLCJjbGFzc05hbWVWZXJzaW9uSGFzaCIsImNvbG9yTXV0ZWQiLCJzaXplMzIiLCJ2ZXJzaW9uSGFzaCIsImhhc2giLCJicmFuY2giLCJhZGRpdGlvbmFsIiwicmVhY3QiLCJzaXplMTIiLCJlbGVjdHJvbiIsImNvbW1pdCIsIm9yaWdpbmFsVmVyc2lvbnMiLCJzcGxpY2UiLCJnZXRHdWlsZENsYXNzZXMiLCJndWlsZHNXcmFwcGVyIiwiZ3VpbGRzIiwicGlsbCIsImd1aWxkTGlzdEl0ZW1zUGF0Y2giLCJHdWlsZENsYXNzZXMiLCJsaXN0SXRlbUNsYXNzIiwiYmxvYkNsYXNzIiwicmVhY3RJbnN0YW5jZSIsIkd1aWxkQ29tcG9uZW50IiwicmV0dXJuIiwidGhpc09iamVjdCIsImd1aWxkRGF0YSIsInVucmVhZCIsInNlbGVjdGVkIiwiYXVkaW8iLCJ2aWRlbyIsImJhZGdlIiwiYW5pbWF0YWJsZSIsImd1aWxkUGlsbFBhdGNoIiwiZ3VpbGRQaWxsIiwiaG92ZXJlZCIsImd1aWxkU2VwYXJhdG9yUGF0Y2giLCJHdWlsZHMiLCJndWlsZENvbXBvbmVudHMiLCJHdWlsZFNlcGFyYXRvciIsIlNlcGFyYXRvciIsIkF0dGFjaG1lbnRQYXRjaCIsIkF0dGFjaG1lbnQiLCJhdHRhY2htZW50IiwiZ2V0TmVzdGVkUHJvcCIsInV1aWR2NCIsInBhdGNoIiwibWVzc2FnZUhlYWRlclBhdGNoIiwiTWVzc2FnZUhlYWRlciIsImRpc3BsYXkiLCJhcHBseUJhZGdlcyIsInVzZXIiLCJjaGF0IiwibmV4dFRpY2siLCJkaXYiLCJnZXRFbGVtZW50QnlJZCIsImNoaWxkTm9kZXMiLCJibG9ja0RpdiIsImRpc3RhbnQiLCJnZXRCYWRnZXMiLCJiYWRnZXMiLCJzdmciLCJ3aWR0aCIsInNjb3BlcyIsInNjb3BlIiwiY29tcG9uZW50IiwiZGl2MiIsInJlYWN0RG9tIiwibWVtYmVyTGlzdFBhdGNoIiwiTWVtYmVyTGlzdEl0ZW0iLCJyZW5kZXJEZWNvcmF0b3JzIiwidXBkYXRlSW5qZWN0b3IiLCJpbmplY3Rpb25QYXRoIiwicm1yZiIsInlhdXpsIiwibWtkaXJwIiwicmVxdWVzdCIsInBhcmVudFBhdGgiLCJmb2xkZXJOYW1lIiwiemlwTGluayIsInNhdmVkWmlwIiwiZXh0cmFjdGVkRm9sZGVyIiwic3VjY2VzcyIsImVuY29kaW5nIiwicmVzcG9uc2UiLCJzdGF0dXNDb2RlIiwiYWxyZWFkeUV4aXN0cyIsInJlcyIsImV4aXN0cyIsInJlbmFtZSIsInJvdW5kIiwicGVyZm9ybWFuY2UiLCJ3cml0ZUZpbGUiLCJ6aXBmaWxlIiwibGF6eUVudHJpZXMiLCJ6aXAiLCJvbiIsImVudHJ5IiwiZmlsZU5hbWUiLCJyZWFkRW50cnkiLCJmdWxsUGF0aCIsInN5bmMiLCJkaXJuYW1lIiwib3BlblJlYWRTdHJlYW0iLCJyZWFkU3RyZWFtIiwicGlwZSIsImNyZWF0ZVdyaXRlU3RyZWFtIiwib25jZSIsImJhY2t1cEZvbGRlciIsInVubGluayIsIl9fbm9uX3dlYnBhY2tfcmVxdWlyZV9fIiwicmVsZWFzZUNoYW5uZWwiLCJnbG9iYWxzIiwiZ2V0UmVsZWFzZUNoYW5uZWwiLCJzdGFibGUiLCJjYW5hcnkiLCJwdGIiLCJwbHVnaW5EYXRhIiwiQkRGaWxlIiwid3JpdGVGaWxlU3luYyIsInBhcnNlIiwic2V0dGluZ3NGaWxlIiwidW5saW5rU3luYyIsIl9pbmplY3Rpb25QYXRoIiwiYmFzZSIsInJvYW1pbmdCYXNlIiwiZ2V0UGF0aCIsInJvYW1pbmdMb2NhdGlvbiIsInJlYWxMb2NhdGlvbiIsImNvbmZpZ0ZpbGUiLCJfY29uZmlnRmlsZSIsIl9CREZpbGUiLCJfc2V0dGluZ3NGaWxlIiwiZ2V0UGx1Z2luRmlsZSIsInNldFNldHRpbmdHcm91cCIsIkRldk1vZGUiLCJkZWJ1Z0xpc3RlbmVyIiwiY29weVNlbGVjdG9yTGlzdGVuZXIiLCJzdGFydERlYnVnTGlzdGVuZXIiLCJzdGFydENvcHlTZWxlY3RvciIsInN0b3BEZWJ1Z0xpc3RlbmVyIiwic3RvcENvcHlTZWxlY3RvciIsInJlbW92ZUV2ZW50TGlzdGVuZXIiLCJ3aGljaCIsInN0b3BJbW1lZGlhdGVQcm9wYWdhdGlvbiIsInNlbGVjdG9yIiwiZ2V0U2VsZWN0b3IiLCJjbGFzc0xheWVyIiwiY2xhc3NJdGVtcyIsImRpc2FibGVkUG9pbnRlckV2ZW50cyIsIm1lbnUiLCJhdHRhY2giLCJjbSIsInF1ZXJ5IiwiY29udGFpbmVyIiwibGF5ZXJDb250YWluZXIiLCJjbVdyYXAiLCJzdHlsZUZsZXhpYmxlIiwiYWNjb21tb2RhdGVTY3JvbGxiYXIiLCJhcHBlbmQiLCJjbGllbnRZIiwibGVmdCIsImNsaWVudFgiLCJzY3JvbGxlckNsYXNzZXMiLCJzY3JvbGxlcldyYXAiLCJzY3JvbGxlclRoZW1lZCIsInRoZW1lR2hvc3RIYWlybGluZSIsInNjcm9sbGVyIiwicmVtb3ZlQ00iLCJrZXlDb2RlIiwiY21nIiwiY21pIiwiaXRlbSIsImxhYmVsQ29udGFpbmVyIiwiY29sb3JEZWZhdWx0IiwibGFiZWwiLCJOYXRpdmVNb2R1bGUiLCJjb3B5IiwiZWxlbWVudHMiLCJxdWVyeUFsbCIsImZvY3VzZWQiLCJzZXBhcmF0b3IiLCJzY3JvbGxIZWlnaHQiLCJlbCIsIm5hbWVzIiwicGFyZW50Tm9kZSIsInVuc2hpZnQiLCJvd25lckRvY3VtZW50IiwidGFnTmFtZSIsImZyb20iLCJlbnRyaWVzIiwicHJldmlvdXNFbGVtZW50U2libGluZyIsImdldFJ1bGVzIiwic3R5bGVTaGVldHMiLCJzaGVldHMiLCJydWxlcyIsImNzc1J1bGVzIiwiZWxlbWVudFJ1bGVzIiwic2VsZWN0b3JUZXh0IiwibWF0Y2hlcyIsIkRpc2FibGVUeXBpbmciLCJzdGFydFR5cGluZyIsInR5cGluZ01vZHVsZSIsImRpc2FibGVkIiwic3RvcFR5cGluZyIsInJhbmRvbSIsInYiLCJhd2FpdGluZ0JhZGdlc1Byb21pc2VzIiwiYmFkZ2VzVG9GZXRjaCIsIkRpc3RhbnRTZXJ2ZXIiLCJfY2FjaGUiLCJuZXdQcm9taXNlIiwiQ29uc3RhbnRzIiwiZGVmYXVsdFVzZXJzIiwiZmV0Y2hlZEJhZGdlcyIsInVzZXJzIiwiaGFuZGxlUmVxdWVzdCIsIlJvdXRlcyIsInN0YXR1cyIsInJlc3BvbnNlQm9keSIsImpzb24iLCJwcm9taXNlIiwidXNlcl9pZCIsImNhdGNoIiwiTGlnaHRjb3JkRXJyb3IiLCJyb3V0ZSIsInJlamVjdCIsIm5vZGVGZXRjaCIsIlNFUlZFUl9VUkwiLCJoZWFkZXJzIiwiQXV0aG9yaXphdGlvbiIsIkJ1Z0h1bnRlckJhZGdlIiwiQ2lyY3VzIiwiZGVsZXRlIiwiaGVhZCIsInNjcmlwdCIsInNyYyIsIm9ubG9hZCIsImFuaW1hdGUiLCJ0aW1pbmciLCJfIiwidXBkYXRlIiwiZHVyYXRpb24iLCJyZXF1ZXN0QW5pbWF0aW9uRnJhbWUiLCJ0aW1lIiwidGltZUZyYWN0aW9uIiwicHJvZ3Jlc3MiLCJRIiwicGFyc2VIVE1MIiwiaXNIVE1MIiwiTm9kZUxpc3QiLCJzb21lIiwibiIsIm5vZGVUeXBlIiwiYmFzZUVsZW1lbnQiLCJodG1sIiwiZnJhZ21lbnQiLCJ0ZW1wbGF0ZSIsImNsb25lTm9kZSIsImVzY2FwZUhUTUwiLCJ0ZXh0Tm9kZSIsImNyZWF0ZVRleHROb2RlIiwic3BhbkVsZW1lbnQiLCJub2RlVmFsdWUiLCJhZGRDbGFzcyIsInJlbW92ZUNsYXNzIiwidG9nZ2xlQ2xhc3MiLCJjbGFzc25hbWUiLCJpbmRpY2F0b3IiLCJoYXNDbGFzcyIsImV2ZXJ5IiwicmVwbGFjZUNsYXNzIiwib2xkTmFtZSIsIm5ld05hbWUiLCJhcHBlbmRUbyIsInRoaXNOb2RlIiwidGhhdE5vZGUiLCJwcmVwZW5kVG8iLCJwcmVwZW5kIiwiaW5zZXJ0QWZ0ZXIiLCJ0YXJnZXROb2RlIiwiaW5zZXJ0QmVmb3JlIiwibmV4dFNpYmxpbmciLCJuZXdOb2RlIiwibmV4dCIsIm5leHRBbGwiLCJuZXh0VW50aWwiLCJwcmV2aW91cyIsInByZXZpb3VzQWxsIiwicHJldmlvdXNVbnRpbCIsImluZGV4SW5QYXJlbnQiLCJudW0iLCJpbmRleCIsInBhcmVudCIsImZpbmRDaGlsZCIsImZpbmRDaGlsZHJlbiIsInBhcmVudHMiLCJjbG9zZXN0IiwicGFyZW50c1VudGlsIiwic2libGluZ3MiLCJhdHRyaWJ1dGUiLCJnbG9iYWwiLCJnZXRDb21wdXRlZFN0eWxlIiwiaGVpZ2h0IiwidGV4dENvbnRlbnQiLCJvdXRlcldpZHRoIiwib2Zmc2V0V2lkdGgiLCJvdXRlckhlaWdodCIsIm9mZnNldEhlaWdodCIsIm9mZnNldCIsImdldEJvdW5kaW5nQ2xpZW50UmVjdCIsImxpc3RlbmVycyIsIl9saXN0ZW5lcnMiLCJldmVudCIsImRlbGVnYXRlIiwibmFtZXNwYWNlIiwiaGFzRGVsZWdhdGUiLCJldmVudEZ1bmMiLCJjYW5jZWwiLCJuZXdDYW5jZWwiLCJmaW5kSW5kZXgiLCJfX29mZkFsbCIsIm1hdGNoRmlsdGVyIiwibGlzdGVuZXIiLCJkZWZhdWx0RmlsdGVyIiwib25Nb3VudENoYW5nZSIsIm9uTW91bnQiLCJ3cmFwcGVkQ2FsbGJhY2siLCJvYnNlcnZlciIsIm5vZGVzIiwicmVtb3ZlZE5vZGVzIiwiZGlyZWN0TWF0Y2giLCJwYXJlbnRNYXRjaCIsIm9uVW5tb3VudCIsIm9uQWRkZWQiLCJ3cmFwIiwiZG9tV3JhcHBlciIsInJlc29sdmVFbGVtZW50IiwiQmV0dGVyRGlzY29yZCIsIkVtb2ppUmVnZXgiLCJDdXN0b21FbW9qaU1vZHVsZSIsIkN1c3RvbUVtb2ppIiwiRW1vamlNb2R1bGVBcGkiLCJnZXRDdXN0b21FbW9qaUJ5SWQiLCJBdXRvY29tcGxldGVNb2R1bGUiLCJBdXRvQ29tcGxldGlvblRlbXBsYXRlcyIsImdldEF1dG9jb21wbGV0ZU9wdGlvbnMiLCJFbW9qaU1vZHVsZVF1ZXJ5IiwicXVlcnlFbW9qaVJlc3VsdHMiLCJNZXNzYWdlcyIsIkVNT0pJX01BVENISU5HIiwiZ3VpbGRNb2R1bGUiLCJnZXRHdWlsZCIsImdldEd1aWxkcyIsImlzRmV0Y2hpbmciLCJlbW9qaVNlYXJjaCIsImdldERpc2FtYmlndWF0ZWRFbW9qaUNvbnRleHQiLCJMSUdIVENPUkRfRU1PSklTIiwiYXJnMSIsImFyZzIiLCJjb25kaXRpb24iLCJzZXRFbW9qaVVzYWJsZSIsInF1ZXJ5UmVzdWx0cyIsInJlc3VsdHMiLCJyZW5kZXJSZXN1bHRzIiwiRCIsImVtb2ppcyIsIkVNT0pJIiwiRW1vamkiLCJlbW9qaSIsInVuaXF1ZU5hbWUiLCJzZW50aW5lbCIsImd1aWxkSWQiLCJnZXRQbGFpblRleHQiLCJpc0FuaW1hdGVkIiwiYW5pbWF0ZWQiLCJtYW5hZ2VkIiwib3JpZ2luYWxOYW1lIiwiZ2V0UmF3VGV4dCIsImNhbmNlbEVtb2ppUmVuZGVyIiwiY2FuY2VsRW1vdGVSZW5kZXIiLCJuZXdDb250ZW50IiwiaGFzUGFyc2VkIiwiZXhlYyIsInJhdyIsIndvcmRzIiwid29yZCIsImFyciIsImVtb2ppSWQiLCJqdW1ib2FibGUiLCJyZWR1Y2UiLCJjdXJyZW50Iiwic2hpZnQiLCJvIiwidSIsImQiLCJvbkhvdmVyIiwiUiIsInByZWZpeCIsIlRpdGxlIiwiRW1vamlGaWx0ZXJNb2R1bGUiLCJpc0Vtb2ppRGlzYWJsZWQiLCJpc1VzYWJsZSIsInVzYWJsZSIsInN1cnJvZ2F0ZXMiLCJkaXZlcnNpdHkiLCJjYWNoZTIiLCJwcm9jZXNzQXR0YWNobWVudCIsImlzVHJ1c3RlZCIsInN1c3BlY3QiLCJjaGVja1ZpcnVzZXMiLCJyZXN1bHRDYWxsYmFjayIsInJlbW92ZUNhbGxiYWNrIiwiaXNIYXJtZnVsIiwia2V5d29yZCIsIm9vZiIsIm5vX2NvbW1lbnRzIiwicmVnZXhwcyIsInJlZ2V4IiwiaGFzaFRvVXJsIiwiaGFybSIsImNoZWNrSGFzaCIsImdldEN1cnJlbnRXZWJDb250ZW50cyIsInVzZXJBZ2VudCIsInByb2Nlc3NGaWxlIiwiX19wYXRoIiwiY3J5cHRvIiwiQnVmZmVyIiwiYWxsb2MiLCJjcmVhdGVSZWFkU3RyZWFtIiwiY2h1bmsiLCJjb25jYXQiLCJoYXNoUmVzdWx0IiwiZGlnZXN0IiwicmVuZGVyVG9FbGVtZW50cyIsImZsb3dlclN0YXJNb2R1bGUiLCJmbG93ZXJTdGFyQ29udGFpbmVyIiwiY2hpbGRNb2R1bGUiLCJjaGlsZENvbnRhaW5lciIsImJvcmRlckNvbG9yIiwibmV4dE5vZGUiLCJjb25maXJtVGV4dCIsImRhbmdlciIsIm9uQ2FuY2VsIiwib25Db25maXJtIiwic2hlbGwiLCJvcGVuRXh0ZXJuYWwiLCJ0b29sdGlwV3JhcCIsInZpZXdCb3giLCJ4IiwieSIsIm1hc2siLCJmaWxsIiwicG9pbnRlckV2ZW50cyIsIm9mZmljaWFsIiwiZmxvd2VyU3RhciIsInN0cm9rZSIsIlBsdWdpbk1vZHVsZSIsImxvYWRQbHVnaW5EYXRhIiwibG9hZCIsInNhdmVQbHVnaW5EYXRhIiwiY2hhbm5lbFN3aXRjaCIsInN0YXJ0UGx1Z2luIiwic3RvcFBsdWdpbiIsImVuYWJsZVBsdWdpbiIsImRpc2FibGVQbHVnaW4iLCJ0b2dnbGVQbHVnaW4iLCJwIiwiZmlsZW5hbWVPck5hbWUiLCJiZHBsdWdpbiIsImVkaXQiLCJvcGVuSXRlbSIsInVwZGF0ZVBsdWdpbkxpc3QiLCJzYXZlZCIsIm5ld01lc3NhZ2UiLCJvbk1lc3NhZ2UiLCJvblN3aXRjaCIsIlYyX1B1YmxpY1NlcnZlcnMiLCJfYXBwZW5kQnV0dG9uIiwiTGF5ZXIiLCJyb290SWQiLCJWMkNfUHVibGljU2VydmVycyIsInJvb3QiLCJfcm9vdCIsImluamVjdFJvb3QiLCJjbGFzc05hbWVMYXllcnMiLCJsYXllcnMiLCJidXR0b24iLCJidG4iLCJjaXJjbGVCdXR0b25NYXNrIiwiY2xhc3NOYW1lU2Nyb2xsZXIiLCJzY3JvbGxiYXJXaWR0aCIsImFkZEJ1dHRvbiIsImd1aWxkUGF0Y2giLCJHdWlsZExpc3QiLCJ3ZWJwYWNrTW9kdWxlcyIsIkd1aWxkTGlzdE9sZCIsInJlbW92ZUJ1dHRvbiIsIkJyb3dzZXJXaW5kb3ciLCJ3ZWJDb250ZW50cyIsInJlYWN0RGV2VG9vbHMiLCJleHRlbnNpb25QYXRoIiwicGxhdGZvcm0iLCJlbnYiLCJMT0NBTEFQUERBVEEiLCJIT01FIiwidmVyc2lvbnMiLCJpc0V4dGVuc2lvbkluc3RhbGxlZCIsInJlbW92ZURldlRvb2xzRXh0ZW5zaW9uIiwiZGlkSW5zdGFsbCIsImFkZERldlRvb2xzRXh0ZW5zaW9uIiwic2V0SW1tZWRpYXRlIiwiaXNEZXZUb29sc09wZW5lZCIsIlYyX1NldHRpbmdzUGFuZWwiLCJ1cGRhdGVTZXR0aW5ncyIsInNpZGViYXIiLCJWMl9TZXR0aW5nc1BhbmVsX1NpZGViYXIiLCJyZWdpc3RlckNvbXBvbmVudHMiLCJyZWdpc3RlciIsIm1ha2VDb21wb25lbnQiLCJsaWdodGNvcmRDb21wb25lbnQiLCJQcmVzZW5jZUNvbXBvbmVudCIsIkFjY291bnRJbmZvc0NvbXBvbmVudCIsIkFwaVByZXZpZXdDb21wb25lbnQiLCJjb3JlQ29tcG9uZW50IiwiY3VzdG9tQ3NzQ29tcG9uZW50IiwicmVuZGVyQWRkb25QYW5lIiwiY2xhc3NTaWRlYmFyIiwiY29udGVudFJlZ2lvbiIsInVubW91bnRDb21wb25lbnRBdE5vZGUiLCJjb3JlU2V0dGluZ3MiLCJnZXRTZXR0aW5ncyIsImNhdGVnb3JpZXMiLCJTZXQiLCJzZWN0aW9ucyIsImxpZ2h0Y29yZFNldHRpbmdzIiwiUHJlc2VuY2VTZXR0aW5ncyIsIk1zZ0xvZ1NldHRpbmdzIiwiY2hlY2tlZCIsInB1YmxpY1NlcnZlcnNNb2R1bGUiLCJ2b2ljZU1vZGUiLCJ0ZkhvdXIiLCJjb2xvcmVkVGV4dCIsImRNb2RlIiwiU2V0dGluZ3MiLCJkZXZNb2RlIiwiY2FsbFJpbmdpbmdCZWF0Iiwic2V0dGluZ3NTdG9yZSIsInNob3dDdXJyZW50R2FtZSIsInVwZGF0ZVJlbW90ZVNldHRpbmdzIiwiZ2V0Q3VycmVudFdpbmRvdyIsInNldEFsd2F5c09uVG9wIiwiQW50aUFkRE0iLCJibHVyUHJpdmF0ZSIsImRpc2FibGVUeXBpbmciLCJTZWN0aW9uZWRTZXR0aW5nc1BhbmVsIiwiTWFyZ2luVG9wIiwiU3dpdGNoIiwiQ29tcG9uZW50cyIsImlucHV0cyIsIkJ1dHRvbiIsInJlbGF1bmNoIiwiYXJndiIsInF1aXQiLCJWMkNfUHJlc2VuY2VTZXR0aW5ncyIsIlYyQ19BY2NvdW50SW5mb3MiLCJBcGlQcmV2aWV3IiwiQ3NzRWRpdG9yIiwiQ29udGVudExpc3QiLCJDb21wb25lbnQiLCJvcmlnaW5hbFJlbmRlciIsImVudW1lcmFibGUiLCJDYXJkTGlzdCIsIlNldHRpbmdDb21wb25lbnQiLCJwYW5lbHMiLCJwYW5lbCIsImdldENvbXBvbmVudCIsIkxDaXRlbXMiLCJUaGVtZU1vZHVsZSIsImxvYWRUaGVtZURhdGEiLCJ0aGVtZSIsInVuZXNjYXBlIiwic2F2ZVRoZW1lRGF0YSIsImVuYWJsZVRoZW1lIiwiZGlzYWJsZVRoZW1lIiwidG9nZ2xlVGhlbWUiLCJiZHRoZW1lIiwidXBkYXRlVGhlbWVMaXN0IiwiX3dpbmRvd0NvbmZpZ0ZpbGUiLCJ0cmFuc3BhcmVudCIsImZyYW1lIiwiY2hhckNvZGVBdCIsImdldFRleHRBcmVhIiwiY2hhbm5lbFRleHRBcmVhIiwidGl0bGVXcmFwcGVyIiwiaW5zZXJ0VGV4dCIsInRleHRhcmVhIiwiZm9jdXMiLCJzZWxlY3Rpb25TdGFydCIsInNlbGVjdGlvbkVuZCIsImV4ZWNDb21tYW5kIiwibW9kdWxlTmFtZSIsImdyb3VwQ29sbGFwc2VkIiwiZ3JvdXBFbmQiLCJlc2NhcGUiLCJwYXJhbXMiLCJpbnN0ZWFkIiwic2lsZW50IiwiZm9yY2UiLCJvcmlnTWV0aG9kIiwiY2FuY2VsZWQiLCJjYW5jZWxQYXRjaCIsIm9yaWdpbmFsTWV0aG9kIiwiY2FsbE9yaWdpbmFsTWV0aG9kIiwidGVtcFJldCIsIl9fbW9ua2V5UGF0Y2hlZCIsImRpc2Nvbm5lY3QiLCJoYXNOb3RpY2UiLCJtZW1iZXJsaXN0IiwibWVtYmVyc1dyYXAiLCJmb3JtIiwicmlnaHQiLCJib3R0b20iLCJ0b2FzdFdyYXBwZXIiLCJpY29uIiwidGltZW91dCIsInRvYXN0RWxlbSIsImlubmVyVGV4dCIsIm1vZGFsTW9kdWxlIiwiaGlkZU9uRnVsbHNjcmVlbiIsImhlYWRlck1vZHVsZSIsImhlYWRlciIsImZvb3RlcjJNb2R1bGUiLCJmb2N1c0xvY2siLCJiYWNrZHJvcCIsImJhY2tkcm9wV2l0aExheWVyIiwiY2xvc2luZ0xpc3RlbmVycyIsInBsdWdpbkVycm9ycyIsInRoZW1lRXJyb3JzIiwiZ2VuZXJhdGVUYWIiLCJ0YWJzIiwiQ2hhbmdlbG9nQ2xhc3NlcyIsIkZsZXhDaGlsZCIsIlRpdGxlcyIsIkNoYW5nZWxvZyIsImRlZmF1bHRQcm9wcyIsInNlbGVjdGFibGUiLCJNYXJrZG93blBhcnNlciIsImNlIiwiY2hhbmdlbG9nSXRlbXMiLCJtYXJnaW4iLCJtYXJnaW5Ub3AiLCJyZW5kZXJIZWFkZXIiLCJDaGlsZCIsImdyb3ciLCJzaHJpbmsiLCJ0YWciLCJUYWdzIiwiSDQiLCJkYXRlIiwicmVuZGVyRm9vdGVyIiwiam9pbkJEMiIsImRlZmF1bHRGb290ZXIiLCJvblNjcm9sbCIsIk1hcmtkb3duIiwiQ29uZmlybWF0aW9uTW9kYWwiLCJlbXB0eUZ1bmN0aW9uIiwicmVkIiwiVjIiLCJlZGl0b3JEZXRhY2hlZCIsInJlcSIsIndlYnBhY2tKc29ucCIsIl9fZXh0cmFfaWRfXyIsInNob3VsZFByb3RlY3QiLCJ0aGVNb2R1bGUiLCJjbGVhciIsInNvcnQiLCJnZXRUb2tlbiIsImdldEVtYWlsIiwic2hvd1Rva2VuIiwicHJvdGVjdCIsInByb3h5IiwiZnVuYyIsInByb3BOYW1lcyIsInByb3RvTmFtZXMiLCJwcm90b1Byb3AiLCJpbnRlcm5hbCIsImpvaW5CRDEiLCJJbnZpdGVBY3Rpb25zIiwiYWNjZXB0SW52aXRlQW5kVHJhbnNpdGlvblRvSW52aXRlQ2hhbm5lbCIsImxlYXZlQkQxIiwiR3VpbGRBY3Rpb25zIiwibGVhdmVHdWlsZCIsImxlYXZlQkQyIiwibGVhdmVMQyIsInJlYWN0Q29tcG9uZW50IiwiYW5jaG9yQ2xhc3NlcyIsInNsYXRlRWRpdG9yQ2xhc3NlcyIsIm1lc3NhZ2VDbGFzc2VzIiwidW5yZWFkTWVudGlvbnNCYXIiLCJndWlsZHNFcnJvciIsIk1lc3NhZ2VDb250ZW50Q29tcG9uZW50IiwiVG9vbHRpcFdyYXBwZXIiLCJUb29sdGlwcyIsImhpZGUiLCJzaG93Iiwic3VibWl0IiwiYWN0aXZhdGVSYWdpbmdEZW1vbiIsImRpc21pc3MiLCJLZXlHZW5lcmF0b3IiLCJMYXllclN0YWNrIiwiVXNlclN0b3JlIiwiQ2hhbm5lbFN0b3JlIiwiQ2hhbm5lbEFjdGlvbnMiLCJQcml2YXRlQ2hhbm5lbEFjdGlvbnMiLCJvcGVuRE0iLCJ1c2VySWQiLCJzZWxmSWQiLCJwcml2YXRlQ2hhbm5lbElkIiwiZ2V0RE1Gcm9tVXNlcklkIiwic2VsZWN0UHJpdmF0ZUNoYW5uZWwiLCJvcGVuUHJpdmF0ZUNoYW5uZWwiLCJwYXJzZVNldHRpbmdzIiwiVm9pY2VNb2RlIiwicHJvZmlsTW9kdWxlIiwiZmV0Y2hNdXR1YWxGcmllbmRzIiwiTGlnaHRjb3JkVXNlckJhZGdlIiwibWFyZ2luTW9kdWxlMiIsImRlZmF1bHRNYXJnaW5oNSIsImNvbG9yTW9kdWxlIiwiY29sb3JTdGFuZGFyZCIsInNpemVNb2R1bGUiLCJzY3JvbGxiYXJNb2R1bGUxIiwic2Nyb2xsYmFyR2hvc3RIYWlybGluZSIsIkd1aWxkTW9kdWxlIiwiZ2V0UmVsYXRpb25zaGlwcyIsInNlc3Npb25Nb2R1bGUiLCJnZXRTZXNzaW9ucyIsInNpemUxNCIsImg1IiwiZ2V0UHJvZmlsZVZhbHVlIiwiZ2V0U3RhdGlzdGljcyIsImdldFNlc3Npb25WYWx1ZSIsIm1hcmdpbkJvdHRvbTIwIiwic2Vzc2lvbnNSYXciLCJzZXNzaW9ucyIsInNlc3Npb25JZCIsImNsaWVudEluZm8iLCJvcyIsImNsaWVudCIsImFjdGl2ZSIsImFjdGl2aXRpZXMiLCJyZXBlYXQiLCJjcmVhdGVkQXQiLCJhdmF0YXIiLCJnZXREYXRlIiwiZ2V0TW9udGgiLCJnZXRGdWxsWWVhciIsImdldEhvdXJzIiwiZ2V0TWludXRlcyIsImdldFNlY29uZHMiLCJmbGFncyIsImhhc1ByZW1pdW1TdWJzY3JpcHRpb24iLCJlbWFpbCIsIm1mYUVuYWJsZWQiLCJtb2JpbGUiLCJwaG9uZSIsInZlcmlmaWVkIiwicmVsYXRpb25zIiwiZnJpZW5kcyIsImlzRnJpZW5kIiwiaXNCbG9ja2VkIiwiaGlnaHRsaWdodEpTIiwiaGlnaGxpZ2h0IiwibWVzc2FnZU1vZHVsZTEiLCJtZXNzYWdlTW9kdWxlMiIsIkNvZGVDb250ZW50IiwiX19odG1sIiwibGFuZ3VhZ2UiLCJtYXJnaW5Cb3R0b204Iiwic2V0dGluZ1RpdGxlIiwiZm9ybU1vZHVsZSIsIlB1cmVDb21wb25lbnQiLCJzdGF0ZXMiLCJGb3JtU2VjdGlvbiIsImFsbENvbXBvbmVudHMiLCJjb21wIiwiQWxsUHJldmlld3MiLCJ0YWIiLCJzZXRTdGF0ZSIsIm5ld1N0YXRlIiwiZ2V0UHJvcHMiLCJmaW5hbCIsInJlbmRlclByZXZpZXciLCJtYXJnaW5Cb3R0b20iLCJiYWNrZ3JvdW5kQ29sb3IiLCJwYWRkaW5nIiwiYm9yZGVyUmFkaXVzIiwicmVuZGVyQ29kZSIsImdlbmVyYXRlQ29kZSIsImdldFN0ckZvclByb3AiLCJTdHJpbmciLCIkJHR5cGVvZiIsIlN5bWJvbCIsImZvciIsImxhbmciLCJjb21wTmFtZSIsImNvbXBDYXRlZ29yeSIsImNvbXBQYXRoIiwicHJvcFN0cmluZ3MiLCJjaGlsZHJlblByb3AiLCJzdHIiLCJvcGVuVGFnIiwiY2xvc2VUYWciLCJ2aXNpYmxlS2V5IiwicHJvcE9iamVjdCIsImlzTGFzdCIsImlzRmlyc3QiLCJyZW5kZXJzIiwiVjJDX1BsdWdpbkNhcmQiLCJzaG93U2V0dGluZ3MiLCJzZXRJbml0aWFsU3RhdGUiLCJoYXNTZXR0aW5ncyIsImFkZG9uIiwiZ2V0U2V0dGluZ3NQYW5lbCIsInJlbG9hZHMiLCJ0cnVzdGVkIiwiY2xvc2VTZXR0aW5ncyIsInBhbmVsUmVmIiwic2V0dGluZ3NPcGVuIiwiY29tcG9uZW50RGlkVXBkYXRlIiwicmVmcyIsInNldHRpbmdzcGFuZWwiLCJpc0hpZGRlbiIsImNUb3AiLCJzY3JvbGxUb3AiLCJjQm90dG9tIiwiZVRvcCIsIm9mZnNldFRvcCIsImVCb3R0b20iLCJjYXJkTm9kZSIsInRoaXNOb2RlT2Zmc2V0IiwiY29udGFpbmVyT2Zmc2V0IiwiZW5kUG9pbnQiLCJnZXRTdHJpbmciLCJzZXR0aW5nc0NvbXBvbmVudCIsInJlZiIsIlhTdmciLCJkYW5nZXJvdXNseVNldElubmVySFRNTCIsImJ1aWxkVGl0bGUiLCJuYW1lSW5kZXgiLCJ2ZXJzaW9uSW5kZXgiLCJhdXRob3JJbmRleCIsInBvcExheWVyIiwibWFrZUxpbmsiLCJtYWtlQnV0dG9uIiwiYWN0aW9uIiwiY29tcG9uZW50V2lsbFVubW91bnQiLCJ1bm1vdW50ZWQiLCJsaW5rcyIsImludml0ZSIsInRlc3RlciIsImRvbmF0ZSIsInBhdHJlb24iLCJhdXRob3JJZCIsImF1dGhvckxpbmsiLCJpc1NjYW5uaW5nIiwiY29udGVudE1hbmFnZXIiLCJUb29sdGlwIiwiYXNjZW5kaW5nIiwiaXNQbHVnaW5zIiwicmV2ZXJzZSIsIm9wZW5Gb2xkZXIiLCJzaG91bGREZWxldGUiLCJjb25maXJtRGVsZXRlIiwic29ydE9wdGlvbnMiLCJkaXJlY3Rpb25zIiwidG9Mb2NhbGVMb3dlckNhc2UiLCJnZXRBZGRvbnMiLCJzb3J0ZWRBZGRvbnMiLCJiIiwiY2FwIiwiZmlyc3QiLCJzZWNvbmQiLCJsb2NhbGVDb21wYXJlIiwicmVuZGVyZWQiLCJyZWZyZXNoSWNvbiIsImZvcmNlVXBkYXRlIiwiYWRkb25DYXJkcyIsImZpbGxSdWxlIiwiY2xpcFJ1bGUiLCJzdHJva2VMaW5lY2FwIiwic3Ryb2tlTGluZWpvaW4iLCJvcGFjaXR5IiwiVjJDX0NoZWNrYm94IiwiY2hlY2tib3hFbGVtZW50IiwiY2hlY2tib3giLCJjaGVja2JveElubmVyIiwiU2VsZWN0IiwiZHJvcGRvd24iLCJjcmVhdGVSZWYiLCJzaG93TWVudSIsImhpZGVNZW51Iiwib3B0IiwiaXNPcGVuIiwiU2VhcmNoIiwib25LZXlEb3duIiwicGxhY2Vob2xkZXIiLCJWMkNfQ29udGVudENvbHVtbiIsImNvbnRlbnRNb2R1bGUiLCJjb250ZW50Q29sdW1uIiwiY29udGVudENvbHVtbkRlZmF1bHQiLCJWMkNfQ3NzRWRpdG9yIiwibGluZXMiLCJkZXRhY2hlZEVkaXRvciIsIlYyQ19Dc3NFZGl0b3JEZXRhY2hlZCIsInVwZGF0ZUNzcyIsInNhdmVDc3MiLCJkZXRhY2giLCJkZXRhY2hlZCIsImNvbXBvbmVudERpZE1vdW50IiwiZWRpdG9yIiwiYWNlIiwic2V0VGhlbWUiLCJzZXNzaW9uIiwic2V0TW9kZSIsInNldFNob3dQcmludE1hcmdpbiIsInNldEZvbnRTaXplIiwiZGVzdHJveSIsInByZXZQcm9wcyIsInByZXZTdGF0ZSIsImRldGFjaGVkUm9vdCIsImNvZGVNaXJyb3IiLCJsaW5lTnVtYmVycyIsIm1vZGUiLCJpbmRlbnRVbml0Iiwic2Nyb2xsYmFyU3R5bGUiLCJfY2NzcyIsImNjc3MiLCJ1cGRhdGVMaW5lQ291bnQiLCJsaW5lQ291bnQiLCJTZXR0aW5nc1RpdGxlIiwiQ2hlY2tib3giLCJib3JkZXJSaWdodCIsImJvcmRlckxlZnQiLCJmb250U2l6ZSIsIm1hcmdpbkxlZnQiLCJhcmciLCJnZXRWYWx1ZSIsImJ0b2EiLCJkcm9vdCIsImluamVjdERldGFjaGVkUm9vdCIsIkJERXJyb3JCb3VuZGFyeSIsImhhc0Vycm9yIiwiY29tcG9uZW50RGlkQ2F0Y2giLCJEZWxldGUiLCJEb3duQXJyb3ciLCJFZGl0IiwiSGlzdG9yeSIsIm1hcmdpbk1vZHVsZSIsIm1hcmdpblRvcDYwIiwiVjJDX1ByZXNlbmNlU2V0dGluZ3NNb2R1bGVzIiwiZGF0YVN0b3JlIiwicHJldmlldyIsImlzZmV0Y2hpbmciLCJhc3NldENvbXBvbmVudHMiLCJ1cGRhdGVXaGVuRmV0Y2hlZCIsImRlZmF1bHRTZXR0aW5nIiwiUlBDUHJvcHMiLCJhc3NldCIsInVwZGF0ZVByZXZpZXciLCJvcHRpb25zQ29tcG9uZW50cyIsIm9oZ29kb2hmdWNrIiwiX29wdGlvbnNDb21wb25lbnRzIiwiYXJyYXkiLCJpbnB1dFRleHRNb2R1bGVzIiwiSW5wdXRUZXh0IiwicmVtb3ZlS2V5YmluZCIsIl9ob3Jpem9udGFsIiwiaW5wdXRNaW5pIiwic2l6ZTE2Iiwic2l6ZTIwIiwiaW5wdXQiLCJsYXN0RWRpdGVkIiwiaXNUaW1pbmciLCJyb3dNb2R1bGUiLCJmbGV4TW9kdWxlIiwiaW5wdXRNb2R1bGUiLCJzaXplTW9kdWxlMiIsInJvdyIsImZsZXhDaGlsZCIsIklucHV0TnVtYmVyTW9kdWxlcyIsIklucHV0TnVtYmVyIiwiY29sb3JUcmFuc3BhcmVudCIsInNldFZhbHVlIiwiY2xpcGJvYXJkIiwiSW5wdXRDaG9pY2VNb2R1bGVzIiwiSW5wdXRDaG9pY2UiLCJEaXZpZGVyTW9kdWxlcyIsIkRpdmlkZXIiLCJkaXZpZGVyIiwiZGl2aWRlckRlZmF1bHQiLCJEaXNjb3JkQnV0dG9uIiwiUnBjUHJldmlldyIsImNoYW5nZVRhYiIsImFuY2llbnRUYWIiLCJzZXRBY3RpdmUiLCJycGMiLCJmbGV4IiwiaXNBY3RpdmUiLCJQcm9maWxlIiwiUG9wb3V0IiwiVGFiIiwicG9wb3V0TW9kdWxlIiwidXNlclBvcG91dCIsInZlcnRpY2FsIiwiYWxpZ25TdHJldGNoIiwic3RyZWFtZXJNb2RlRW5hYmxlZEJ0biIsImFjdGl2aXR5VXNlclBvcG91dCIsIm11dGVkIiwidGhlbWVHaG9zdEhhaXJsaW5lQ2hhbm5lbHMiLCJub3RlIiwicHJvIiwiaW5saW5lIiwicm9vdE1vZHVsZTEiLCJmbGV4TW9kdWxlMSIsInN0eWxpbmdNb2R1bGUxIiwibmFtZVRhZ01vZHVsZTEiLCJhY3Rpdml0eU1vZHVsZTEiLCJ0ZXh0TW9kdWxlMSIsInNpemVNb2R1bGUxIiwic2Nyb2xsZXJNb2R1bGUxIiwibm90ZU1vZHVsZTEiLCJwcm90aXBNb2R1bGUxIiwiY29sb3JNb2R1bGUxIiwiYXZhdGFyTW9kdWxlMSIsInVzZXJNb2R1bGUxIiwiYXZhdGFyVVJMIiwiZ2V0QXZhdGFyVVJMIiwidGltZXN0YW1wQ2xhc3MiLCJ0aW1lc3RhbXAiLCJpbWFnZXMiLCJhc3NldHNMYXJnZUltYWdlVXNlclBvcG91dCIsImFzc2V0c0xhcmdlTWFza1VzZXJQb3BvdXQiLCJhc3NldHNTbWFsbEltYWdlVXNlclBvcG91dCIsImhlYWRlclBsYXlpbmciLCJqdXN0aWZ5Q2VudGVyIiwiYWxpZ25DZW50ZXIiLCJub1dyYXAiLCJoZWFkZXJUb3AiLCJhdmF0YXJXcmFwcGVyTm9ybWFsIiwiYXZhdGFySGludCIsImF2YXRhckhpbnRJbm5lciIsIlZJRVdfUFJPRklMRSIsImhlYWRlclRleHQiLCJob3Jpem9udGFsIiwianVzdGlmeVN0YXJ0IiwiaGVhZGVyVGFnTm9OaWNrbmFtZSIsIm5hbWVUYWciLCJoZWFkZXJUYWdVc2VybmFtZU5vTmlja25hbWUiLCJoZWFkZXJUZXh0Tm9ybWFsIiwiVVNFUl9BQ1RJVklUWV9IRUFERVJfUExBWUlORyIsImJvZHlOb3JtYWwiLCJjb250ZW50SW1hZ2VzVXNlclBvcG91dCIsImNvbnRlbnROb0ltYWdlc1VzZXJQb3BvdXQiLCJuYW1lTm9ybWFsIiwiYWN0aXZpdHlOYW1lIiwidGltZUNvbXBvbmVudCIsInRpbWVzdGFtcFJlbmRlciIsIlRpbWVzdGFtcCIsImVuZCIsInNjcm9sbGVyRmFkZSIsImJvZHlJbm5lciIsImJvZHlUaXRsZSIsIk5PVEUiLCJOT1RFX1BMQUNFSE9MREVSIiwicHJvdGlwIiwiUElOTkVEX01FU1NBR0VTX1BST19USVAiLCJ0aXAiLCJDT05URVhUX01FTlVfSElOVCIsIlN0YXR1c01vZHVsZXMiLCJTdGF0dXMiLCJnZXRQcmVzZW5jZSIsIlByb2ZpbGVNb2R1bGVzIiwidG9wU2VjdGlvblN0cmVhbWluZyIsImFjdGl2aXR5UHJvZmlsZSIsImFzc2V0c0xhcmdlSW1hZ2VQcm9maWxlIiwiYXNzZXRzTGFyZ2VNYXNrUHJvZmlsZSIsImFzc2V0c1NtYWxsSW1hZ2VQcm9maWxlIiwidG9wU2VjdGlvblBsYXlpbmciLCJoZWFkZXJJbmZvIiwicHJvZmlsZUJhZGdlcyIsImhlYWRlckZpbGwiLCJjb250ZW50SW1hZ2VzUHJvZmlsZSIsInVzZXJJbmZvU2VjdGlvbiIsInVzZXJJbmZvU2VjdGlvbkhlYWRlciIsIkNvbm5lY3RlZEFjY291bnRzIiwiYWNjb3VudHMiLCJBY2NvdW50TW9kdWxlMSIsImdldEFjY291bnRzIiwiYWNjcyIsInZpc2liaWxpdHkiLCJhY2MiLCJjb25uZWN0ZWRBY2NvdW50cyIsIkNvbm5lY3RlZEFjY291bnQiLCJmbG93ZXJNb2R1bGUxIiwiYW5jaG9yTW9kdWxlMSIsIlNvY2lhbENvbnN0YW50cyIsImNvbnN0YW50c1NvY2lhbCIsImNvbm5lY3RlZEFjY291bnQiLCJjb25uZWN0ZWRBY2NvdW50SWNvbiIsIndoaXRlIiwiZ3JleSIsImNvbm5lY3RlZEFjY291bnROYW1lSW5uZXIiLCJjb25uZWN0ZWRBY2NvdW50TmFtZSIsImNvbm5lY3RlZEFjY291bnRWZXJpZmllZEljb24iLCJjb25uZWN0ZWRBY2NvdW50T3Blbkljb24iLCJCYWRnZXMiLCJyb290TW9kdWxlIiwiVXNlckZsYWdzIiwic2VyaWFsaXplZCIsImZsYWdOYW1lIiwiaGFzRmxhZyIsInNlYXJjaGFibGUiLCJCYWRnZSIsInByb2ZpbGVCYWRnZVdyYXBwZXIiLCJwcm9maWxlQmFkZ2UiLCJWMkNfTGF5ZXIiLCJrZXl1cExpc3RlbmVyIiwidHJhbnNmb3JtIiwiY29tcG9uZW50V2lsbE1vdW50IiwiY2hhbmdlQ2F0ZWdvcnkiLCJzZWFyY2hLZXlEb3duIiwiY2hlY2tDb25uZWN0aW9uIiwiY29ubmVjdCIsIkd1aWxkU3RvcmUiLCJBdmF0YXJEZWZhdWx0cyIsIlNvcnRlZEd1aWxkU3RvcmUiLCJzZWxlY3RlZENhdGVnb3J5IiwibG9hZGluZyIsInNlcnZlcnMiLCJjb25uZWN0aW9uIiwiZmV0Y2giLCJzZXJ2ZXIiLCJqb2luZWQiLCJ0ZXJtIiwiY2F0ZWdvcnlCdXR0b25zIiwidG90YWwiLCJzYnYiLCJjb250ZW50U2Nyb2xsZXIiLCJzZXJ2ZXJDYXJkIiwicGlubmVkIiwiYWNjZXB0SW52aXRlIiwiaW52aXRlX2NvZGUiLCJqb2luRW5kUG9pbnQiLCJpZGVudGlmaWVyIiwiY3JlZGVudGlhbHMiLCJ3aW5kb3dPcHRpb25zIiwic2NyZWVuWCIsInNjcmVlblkiLCJqb2luV2luZG93IiwibG9hZFVSTCIsInJlc2l6YWJsZSIsIm1heGltaXphYmxlIiwibWluaW1pemFibGUiLCJhbHdheXNPblRvcCIsImNlbnRlciIsIndlYlByZWZlcmVuY2VzIiwibm9kZUludGVncmF0aW9uIiwiYmRTZXJ2ZXIiLCJvbmxpbmUiLCJtZW1iZXJzIiwiaWNvblVybCIsIm5hdGl2ZWpvaW4iLCJzZXJ2ZXIyIiwiZ3VpbGRMaXN0IiwiZ2V0RmxhdHRlbmVkR3VpbGRJZHMiLCJkZWZhdWx0TGlzdCIsIkRFRkFVTFRfQVZBVEFSUyIsIlNlcnZlckNhcmQiLCJmYWxsYmFjayIsImZsb29yIiwiY29ubmVjdEVuZFBvaW50IiwiU2lkZWJhclZpZXciLCJ0b29scyIsIlRvb2xzIiwiVGFiQmFyU2VwYXJhdG9yIiwic2VhcmNoSW5wdXQiLCJUYWJCYXJIZWFkZXIiLCJUYWJCYXJJdGVtIiwibWF4TGVuZ3RoIiwic2VhcmNoaW5wdXQiLCJub3RDb25uZWN0ZWQiLCJjb2x1bW5Nb2R1bGUiLCJtaW5IZWlnaHQiLCJsaW5lSGVpZ2h0IiwiVjJDX1NlcnZlckNhcmQiLCJpbWFnZUVycm9yIiwiY2FyZE1vZHVsZSIsImNhcmQiLCJjYXJkUHJpbWFyeSIsIl9ob3Jpem9udGFsUmV2ZXJzZSIsIndyYXBNb2R1bGUiLCJzdHJlYW1lck1vZGVFbmFibGVkIiwib25FcnJvciIsImhhbmRsZUVycm9yIiwiZHJhZ2dhYmxlIiwiVjJDX1NpZGViYXJWaWV3IiwiU2Nyb2xsZXIiLCJmYWRlIiwiZGFyayIsIlYyQ19SZWxvYWRJY29uIiwieG1sbnMiLCJWMkNfU2Nyb2xsZXIiLCJzY3JvbGxlckhvcml6b250YWwiLCJzY3JvbGxlck1vZHVsZTIiLCJzaWRlYmFyUmVnaW9uU2Nyb2xsZXIiLCJ3cmFwcGVyQ2xhc3MiLCJzY3JvbGxlckNsYXNzIiwiY29udGVudFJlZ2lvblNjcm9sbGVyIiwiY29udGVudFJlZ2lvblNjcm9sbGVyV3JhcCIsInRoZW1lR2hvc3QiLCJzY3JvbGxlclRyYWNrIiwiVjJDX1NlY3Rpb25lZFNldHRpbmdzUGFuZWwiLCJTZXR0aW5nc0dyb3VwIiwiVjJDX1NldHRpbmdzR3JvdXAiLCJidXR0b25Db21wb25lbnQiLCJWMkNfU2V0dGluZ3NQYW5lbCIsIlYyQ19TZXR0aW5nc1RpdGxlIiwiVjJDX1NpZGVCYXIiLCJzaSIsInNjbiIsIm5zIiwibnNjbiIsInNldFNlbGVjdGVkIiwic2lkZWJhcnMiLCJpbml0aWFsU2VsZWN0aW9uIiwiaGVhZGVyQnV0dG9uIiwic2V0VW5zZWxlY3RlZCIsInNpZGViYXJJbmRleCIsIlN3aXRjaEl0ZW0iLCJWMkNfVGFiQmFySGVhZGVyIiwiVjJDX1RhYkJhckl0ZW0iLCJWMkNfVGFiQmFyU2VwYXJhdG9yIiwiaW50ZXJ2YWxNb2R1bGUxIiwiSW50ZXJ2YWwiLCJUaW1lUmVuZGVyIiwiX2ludGVydmFsIiwiZ2V0VXBkYXRlZFRpbWUiLCJnZXREaWZmIiwiY2hlY2tVbml4IiwiaG91cnMiLCJtaW51dGVzIiwic2Vjb25kcyIsInJlbmRlclRpbWUiLCJudW1iZXIiLCJyZW1vdmVaZXJvIiwidXNlZFByb3BzIiwiVVNFUl9BQ1RJVklUWV9USU1FU1RBTVBfRU5EIiwiVVNFUl9BQ1RJVklUWV9USU1FU1RBTVBfU1RBUlQiLCJWMkNfVG9vbHMiLCJ0b29sc01vZHVsZSIsInRvb2xzQ29udGFpbmVyIiwiY29udGFpbmVyTW9kdWxlIiwiY2xvc2VCdXR0b24iLCJjbG9zZUJ1dHRvbkJvbGQiLCJrZXliaW5kIiwia2V5YmluZEJvbGQiLCJUb29sdGlwQ2xhc3NlcyIsImdldFRvb2x0aXBDbGFzc2VzIiwiVG9vbHRpcExheWVycyIsImdldFRvb2x0aXBMYXllcnMiLCJnZXRDbGFzcyIsInNpZGVPckNvbG9yIiwidXBwZXJDYXNlIiwidG9vbHRpcENsYXNzIiwiY2xhc3NFeGlzdHMiLCJ0b1B4IiwiRW11bGF0ZWRUb29sdGlwIiwicHJldmVudEZsaXAiLCJ0b29sdGlwRWxlbWVudCIsInRvb2x0aXAiLCJsYWJlbEVsZW1lbnQiLCJ0b29sdGlwQ29udGVudCIsInBvaW50ZXJFbGVtZW50IiwidG9vbHRpcFBvaW50ZXIiLCJwb3BvdXRzIiwiY2FuU2hvd0Fib3ZlIiwiY2FuU2hvd0JlbG93IiwiY2FuU2hvd0xlZnQiLCJjYW5TaG93UmlnaHQiLCJfY2xhc3NOYW1lIiwic2hvd0Fib3ZlIiwic2hvd0JlbG93Iiwic2hvd0xlZnQiLCJzaG93UmlnaHQiLCJjZW50ZXJIb3Jpem9udGFsbHkiLCJjZW50ZXJWZXJ0aWNhbGx5Iiwibm9kZWNlbnRlciIsImZpbmRET01Ob2RlIiwiVjJDX1hTdmciXSwibWFwcGluZ3MiOiI7O1FBQUE7UUFDQTs7UUFFQTtRQUNBOztRQUVBO1FBQ0E7UUFDQTtRQUNBO1FBQ0E7UUFDQTtRQUNBO1FBQ0E7UUFDQTtRQUNBOztRQUVBO1FBQ0E7O1FBRUE7UUFDQTs7UUFFQTtRQUNBO1FBQ0E7OztRQUdBO1FBQ0E7O1FBRUE7UUFDQTs7UUFFQTtRQUNBO1FBQ0E7UUFDQSwwQ0FBMEMsZ0NBQWdDO1FBQzFFO1FBQ0E7O1FBRUE7UUFDQTtRQUNBO1FBQ0Esd0RBQXdELGtCQUFrQjtRQUMxRTtRQUNBLGlEQUFpRCxjQUFjO1FBQy9EOztRQUVBO1FBQ0E7UUFDQTtR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QUEsbUM7Ozs7Ozs7Ozs7O0FDQUEsK0I7Ozs7Ozs7Ozs7O0FDQUEsbUM7Ozs7Ozs7Ozs7O0FDQUEsbUM7Ozs7Ozs7Ozs7O0FDQUEsdUM7Ozs7Ozs7Ozs7O0FDQUEsaUM7Ozs7Ozs7Ozs7O0FDQUEsb0M7Ozs7Ozs7Ozs7O0FDQUEsbUM7Ozs7Ozs7Ozs7O0FDQUEsa0MiLCJmaWxlIjoibWFpbi5qcyIsInNvdXJjZXNDb250ZW50IjpbIiBcdC8vIFRoZSBtb2R1bGUgY2FjaGVcbiBcdHZhciBpbnN0YWxsZWRNb2R1bGVzID0ge307XG5cbiBcdC8vIFRoZSByZXF1aXJlIGZ1bmN0aW9uXG4gXHRmdW5jdGlvbiBfX3dlYnBhY2tfcmVxdWlyZV9fKG1vZHVsZUlkKSB7XG5cbiBcdFx0Ly8gQ2hlY2sgaWYgbW9kdWxlIGlzIGluIGNhY2hlXG4gXHRcdGlmKGluc3RhbGxlZE1vZHVsZXNbbW9kdWxlSWRdKSB7XG4gXHRcdFx0cmV0dXJuIGluc3RhbGxlZE1vZHVsZXNbbW9kdWxlSWRdLmV4cG9ydHM7XG4gXHRcdH1cbiBcdFx0Ly8gQ3JlYXRlIGEgbmV3IG1vZHVsZSAoYW5kIHB1dCBpdCBpbnRvIHRoZSBjYWNoZSlcbiBcdFx0dmFyIG1vZHVsZSA9IGluc3RhbGxlZE1vZHVsZXNbbW9kdWxlSWRdID0ge1xuIFx0XHRcdGk6IG1vZHVsZUlkLFxuIFx0XHRcdGw6IGZhbHNlLFxuIFx0XHRcdGV4cG9ydHM6IHt9XG4gXHRcdH07XG5cbiBcdFx0Ly8gRXhlY3V0ZSB0aGUgbW9kdWxlIGZ1bmN0aW9uXG4gXHRcdG1vZHVsZXNbbW9kdWxlSWRdLmNhbGwobW9kdWxlLmV4cG9ydHMsIG1vZHVsZSwgbW9kdWxlLmV4cG9ydHMsIF9fd2VicGFja19yZXF1aXJlX18pO1xuXG4gXHRcdC8vIEZsYWcgdGhlIG1vZHVsZSBhcyBsb2FkZWRcbiBcdFx0bW9kdWxlLmwgPSB0cnVlO1xuXG4gXHRcdC8vIFJldHVybiB0aGUgZXhwb3J0cyBvZiB0aGUgbW9kdWxlXG4gXHRcdHJldHVybiBtb2R1bGUuZXhwb3J0cztcbiBcdH1cblxuXG4gXHQvLyBleHBvc2UgdGhlIG1vZHVsZXMgb2JqZWN0IChfX3dlYnBhY2tfbW9kdWxlc19fKVxuIFx0X193ZWJwYWNrX3JlcXVpcmVfXy5tID0gbW9kdWxlcztcblxuIFx0Ly8gZXhwb3NlIHRoZSBtb2R1bGUgY2FjaGVcbiBcdF9fd2VicGFja19yZXF1aXJlX18uYyA9IGluc3RhbGxlZE1vZHVsZXM7XG5cbiBcdC8vIGRlZmluZSBnZXR0ZXIgZnVuY3Rpb24gZm9yIGhhcm1vbnkgZXhwb3J0c1xuIFx0X193ZWJwYWNrX3JlcXVpcmVfXy5kID0gZnVuY3Rpb24oZXhwb3J0cywgbmFtZSwgZ2V0dGVyKSB7XG4gXHRcdGlmKCFfX3dlYnBhY2tfcmVxdWlyZV9fLm8oZXhwb3J0cywgbmFtZSkpIHtcbiBcdFx0XHRPYmplY3QuZGVmaW5lUHJvcGVydHkoZXhwb3J0cywgbmFtZSwgeyBlbnVtZXJhYmxlOiB0cnVlLCBnZXQ6IGdldHRlciB9KTtcbiBcdFx0fVxuIFx0fTtcblxuIFx0Ly8gZGVmaW5lIF9fZXNNb2R1bGUgb24gZXhwb3J0c1xuIFx0X193ZWJwYWNrX3JlcXVpcmVfXy5yID0gZnVuY3Rpb24oZXhwb3J0cykge1xuIFx0XHRpZih0eXBlb2YgU3ltYm9sICE9PSAndW5kZWZpbmVkJyAmJiBTeW1ib2wudG9TdHJpbmdUYWcpIHtcbiBcdFx0XHRPYmplY3QuZGVmaW5lUHJvcGVydHkoZXhwb3J0cywgU3ltYm9sLnRvU3RyaW5nVGFnLCB7IHZhbHVlOiAnTW9kdWxlJyB9KTtcbiBcdFx0fVxuIFx0XHRPYmplY3QuZGVmaW5lUHJvcGVydHkoZXhwb3J0cywgJ19fZXNNb2R1bGUnLCB7IHZhbHVlOiB0cnVlIH0pO1xuIFx0fTtcblxuIFx0Ly8gY3JlYXRlIGEgZmFrZSBuYW1lc3BhY2Ugb2JqZWN0XG4gXHQvLyBtb2RlICYgMTogdmFsdWUgaXMgYSBtb2R1bGUgaWQsIHJlcXVpcmUgaXRcbiBcdC8vIG1vZGUgJiAyOiBtZXJnZSBhbGwgcHJvcGVydGllcyBvZiB2YWx1ZSBpbnRvIHRoZSBuc1xuIFx0Ly8gbW9kZSAmIDQ6IHJldHVybiB2YWx1ZSB3aGVuIGFscmVhZHkgbnMgb2JqZWN0XG4gXHQvLyBtb2RlICYgOHwxOiBiZWhhdmUgbGlrZSByZXF1aXJlXG4gXHRfX3dlYnBhY2tfcmVxdWlyZV9fLnQgPSBmdW5jdGlvbih2YWx1ZSwgbW9kZSkge1xuIFx0XHRpZihtb2RlICYgMSkgdmFsdWUgPSBfX3dlYnBhY2tfcmVxdWlyZV9fKHZhbHVlKTtcbiBcdFx0aWYobW9kZSAmIDgpIHJldHVybiB2YWx1ZTtcbiBcdFx0aWYoKG1vZGUgJiA0KSAmJiB0eXBlb2YgdmFsdWUgPT09ICdvYmplY3QnICYmIHZhbHVlICYmIHZhbHVlLl9fZXNNb2R1bGUpIHJldHVybiB2YWx1ZTtcbiBcdFx0dmFyIG5zID0gT2JqZWN0LmNyZWF0ZShudWxsKTtcbiBcdFx0X193ZWJwYWNrX3JlcXVpcmVfXy5yKG5zKTtcbiBcdFx0T2JqZWN0LmRlZmluZVByb3BlcnR5KG5zLCAnZGVmYXVsdCcsIHsgZW51bWVyYWJsZTogdHJ1ZSwgdmFsdWU6IHZhbHVlIH0pO1xuIFx0XHRpZihtb2RlICYgMiAmJiB0eXBlb2YgdmFsdWUgIT0gJ3N0cmluZycpIGZvcih2YXIga2V5IGluIHZhbHVlKSBfX3dlYnBhY2tfcmVxdWlyZV9fLmQobnMsIGtleSwgZnVuY3Rpb24oa2V5KSB7IHJldHVybiB2YWx1ZVtrZXldOyB9LmJpbmQobnVsbCwga2V5KSk7XG4gXHRcdHJldHVybiBucztcbiBcdH07XG5cbiBcdC8vIGdldERlZmF1bHRFeHBvcnQgZnVuY3Rpb24gZm9yIGNvbXBhdGliaWxpdHkgd2l0aCBub24taGFybW9ueSBtb2R1bGVzXG4gXHRfX3dlYnBhY2tfcmVxdWlyZV9fLm4gPSBmdW5jdGlvbihtb2R1bGUpIHtcbiBcdFx0dmFyIGdldHRlciA9IG1vZHVsZSAmJiBtb2R1bGUuX19lc01vZHVsZSA/XG4gXHRcdFx0ZnVuY3Rpb24gZ2V0RGVmYXVsdCgpIHsgcmV0dXJuIG1vZHVsZVsnZGVmYXVsdCddOyB9IDpcbiBcdFx0XHRmdW5jdGlvbiBnZXRNb2R1bGVFeHBvcnRzKCkgeyByZXR1cm4gbW9kdWxlOyB9O1xuIFx0XHRfX3dlYnBhY2tfcmVxdWlyZV9fLmQoZ2V0dGVyLCAnYScsIGdldHRlcik7XG4gXHRcdHJldHVybiBnZXR0ZXI7XG4gXHR9O1xuXG4gXHQvLyBPYmplY3QucHJvdG90eXBlLmhhc093blByb3BlcnR5LmNhbGxcbiBcdF9fd2VicGFja19yZXF1aXJlX18ubyA9IGZ1bmN0aW9uKG9iamVjdCwgcHJvcGVydHkpIHsgcmV0dXJuIE9iamVjdC5wcm90b3R5cGUuaGFzT3duUHJvcGVydHkuY2FsbChvYmplY3QsIHByb3BlcnR5KTsgfTtcblxuIFx0Ly8gX193ZWJwYWNrX3B1YmxpY19wYXRoX19cbiBcdF9fd2VicGFja19yZXF1aXJlX18ucCA9IFwiXCI7XG5cblxuIFx0Ly8gTG9hZCBlbnRyeSBtb2R1bGUgYW5kIHJldHVybiBleHBvcnRzXG4gXHRyZXR1cm4gX193ZWJwYWNrX3JlcXVpcmVfXyhfX3dlYnBhY2tfcmVxdWlyZV9fLnMgPSBcIi4vc3JjL2luZGV4LmpzXCIpO1xuIiwiaW1wb3J0IHsgcmVtb3RlIH0gZnJvbSBcImVsZWN0cm9uXCI7XHJcbmltcG9ydCBCRFYyIGZyb20gXCIuL21vZHVsZXMvdjJcIjtcclxuaW1wb3J0IFdlYnBhY2tNb2R1bGVzIGZyb20gXCIuL21vZHVsZXMvd2VicGFja01vZHVsZXNcIjtcclxuXHJcbi8vIHZhciBzZXR0aW5nc1BhbmVsLCB2b2ljZU1vZGUsIHBsdWdpbk1vZHVsZSwgdGhlbWVNb2R1bGUsIGRNb2RlLCBwdWJsaWNTZXJ2ZXJzTW9kdWxlLCBtYWluQ29yZSwgQkRWMjtcclxuZXhwb3J0IGNvbnN0IG1pbmltdW1EaXNjb3JkVmVyc2lvbiA9IFwiMC4wLjMwNlwiO1xyXG5leHBvcnQgY29uc3QgY3VycmVudERpc2NvcmRWZXJzaW9uID0gKHdpbmRvdy5EaXNjb3JkTmF0aXZlICYmIHdpbmRvdy5EaXNjb3JkTmF0aXZlLnJlbW90ZUFwcCAmJiB3aW5kb3cuRGlzY29yZE5hdGl2ZS5yZW1vdGVBcHAuZ2V0VmVyc2lvbiAmJiB3aW5kb3cuRGlzY29yZE5hdGl2ZS5yZW1vdGVBcHAuZ2V0VmVyc2lvbigpKSB8fCBcIjAuMC4zMDZcIjtcclxuZXhwb3J0IGNvbnN0IG1pblN1cHBvcnRlZFZlcnNpb24gPSBcIjAuMy4wXCI7XHJcbmV4cG9ydCBjb25zdCBiYmRWZXJzaW9uID0gXCIwLjMuNFwiO1xyXG5leHBvcnQgY29uc3QgTENDaGFuZWxvZyA9IHtcclxuICAgIGRlc2NyaXB0aW9uOiBcIkxpZ2h0Y29yZCdzIGNoYW5nZWxvZ1wiLFxyXG4gICAgY2hhbmdlczogW1xyXG4gICAgICAgIHtcclxuICAgICAgICAgICAgdGl0bGU6IFwiV2hhdCdzIE5ldz9cIixcclxuICAgICAgICAgICAgaXRlbXM6IFtcclxuICAgICAgICAgICAgICAgIFwiTGlnaHRjb3JkIGlzIG5vdyBhdmFpbGFibGUgIVwiLFxyXG4gICAgICAgICAgICAgICAgXCJXZSByZW1vdmVkIGVtb3Rlcy4gVGhhdCdzIHNhZCBmb3IgcGVvcGxlIHdobyB3ZXJlIGFjdHVhbGx5IHVzaW5nIGl0LCBidXQgaXQgd2FzIGxlYWRpbmcgdG8gbW9yZSBsb2FkaW5nIHRpbWUgYW5kIHNvbWUgYmFzaWMgd29yZHMgd2VyZSBlbW90ZS5cIlxyXG4gICAgICAgICAgICBdXHJcbiAgICAgICAgfVxyXG4gICAgXSxcclxuICAgIGltYWdlOiBcImh0dHBzOi8vaS5pbWd1ci5jb20vc2ZOaHF3UC5wbmdcIixcclxuICAgIHRpdGxlOiBcIkxpZ2h0Y29yZFwiLFxyXG4gICAgc3VidGl0bGU6IFwidlwiK3JlbW90ZS5nZXRHbG9iYWwoXCJCdWlsZEluZm9cIikudmVyc2lvbixcclxuICAgIGZvb3RlcjogKGZ1bmN0aW9uKCl7XHJcbiAgICAgICAgY29uc3QgVGV4dEVsZW1lbnQgPSBXZWJwYWNrTW9kdWxlcy5maW5kQnlEaXNwbGF5TmFtZShcIlRleHRcIik7XHJcbiAgICAgICAgY29uc3QgTW9kYWxTdGFjayA9IFdlYnBhY2tNb2R1bGVzLmZpbmRCeVByb3BzKFwicHVzaFwiLCBcInVwZGF0ZVwiLCBcInBvcFwiLCBcInBvcFdpdGhLZXlcIik7XHJcbiAgICAgICAgaWYoIVRleHRFbGVtZW50IHx8ICFNb2RhbFN0YWNrKXJldHVybiBudWxsXHJcblxyXG4gICAgICAgIGNvbnN0IEFuY2hvciA9IFdlYnBhY2tNb2R1bGVzLmZpbmQobSA9PiBtLmRpc3BsYXlOYW1lID09IFwiQW5jaG9yXCIpO1xyXG4gICAgICAgIGNvbnN0IEFuY2hvckNsYXNzZXMgPSBXZWJwYWNrTW9kdWxlcy5maW5kQnlQcm9wcyhcImFuY2hvclVuZGVybGluZU9uSG92ZXJcIikgfHwge2FuY2hvcjogXCJhbmNob3ItM1otOEJiXCIsIGFuY2hvclVuZGVybGluZU9uSG92ZXI6IFwiYW5jaG9yVW5kZXJsaW5lT25Ib3Zlci0yRVNIUUJcIn07XHJcbiAgICAgICAgY29uc3Qgam9pblN1cHBvcnRTZXJ2ZXIgPSAoY2xpY2spID0+IHtcclxuICAgICAgICAgICAgY2xpY2sucHJldmVudERlZmF1bHQoKTtcclxuICAgICAgICAgICAgY2xpY2suc3RvcFByb3BhZ2F0aW9uKCk7XHJcbiAgICAgICAgICAgIE1vZGFsU3RhY2sucG9wKCk7XHJcbiAgICAgICAgICAgIEJEVjIuam9pbkxDKCk7XHJcbiAgICAgICAgfTtcclxuICAgICAgICBjb25zdCBzdXBwb3J0TGluayA9IEFuY2hvciA/IEJEVjIuUmVhY3QuY3JlYXRlRWxlbWVudChBbmNob3IsIHtvbkNsaWNrOiBqb2luU3VwcG9ydFNlcnZlcn0sIFwiSm9pbiBvdXIgRGlzY29yZCBTZXJ2ZXIuXCIpIDogQkRWMi5SZWFjdC5jcmVhdGVFbGVtZW50KFwiYVwiLCB7Y2xhc3NOYW1lOiBgJHtBbmNob3JDbGFzc2VzLmFuY2hvcn0gJHtBbmNob3JDbGFzc2VzLmFuY2hvclVuZGVybGluZU9uSG92ZXJ9YCwgb25DbGljazogam9pblN1cHBvcnRTZXJ2ZXJ9LCBcIkpvaW4gb3VyIERpc2NvcmQgU2VydmVyLlwiKTtcclxuICAgICAgICByZXR1cm4gQkRWMi5SZWFjdC5jcmVhdGVFbGVtZW50KFRleHRFbGVtZW50LCB7c2l6ZTogVGV4dEVsZW1lbnQuU2l6ZXMuU01BTEwsIGNvbG9yOiBUZXh0RWxlbWVudC5Db2xvcnMuU1RBTkRBUkR9LCBcIk5lZWQgc3VwcG9ydD8gXCIsIHN1cHBvcnRMaW5rKTtcclxuICAgIH0pKClcclxufVxyXG5leHBvcnQgY29uc3QgYmJkQ2hhbmdlbG9nID0ge1xyXG4gICAgZGVzY3JpcHRpb246IFwiQkJEJ3MgY2hhbmdlbG9nLlwiLFxyXG4gICAgY2hhbmdlczogW1xyXG4gICAgICAgIHtcclxuICAgICAgICAgICAgdGl0bGU6IFwiV2hhdCdzIE5ldz9cIixcclxuICAgICAgICAgICAgaXRlbXM6IFtcclxuICAgICAgICAgICAgICAgIFwiKipMaWdodGNvcmQqKiBpcyBub3cgdXNpbmcgQmFuZGFnZWRCRC4gVGhhdCBtZWFucyBhbGwgcGx1Z2lucyB5b3Ugd2VyZSB1c2luZyBjYW4gYmUgdXNlZCB0b28gIVwiLFxyXG4gICAgICAgICAgICAgICAgXCIqKldpbmRvdyBUcmFuc3BhcmVuY3kqKiBjaGFuZ2VzIHdlcmUgbWFkZSB0byBtb3JlIGNvbXBhdGlibGUgd2l0aCBleHRlcm5hbCB3aW5kb3cgbWFuYWdlcnMgYW5kIGFkZG9ucyBsaWtlIEdsYXNzY29yZC5cIixcclxuICAgICAgICAgICAgICAgIFwiSW5pdGlhbGl6YXRpb24gc2VxdWVuY2UgaGFzIG9uY2UgYWdhaW4gYmVlbiBjaGFuZ2VkIHNsaWdodGx5IHRvIGhvcGVmdWxseSBpbXByb3ZlIGxvYWRpbmcgdGltZXMuXCJcclxuICAgICAgICAgICAgXVxyXG4gICAgICAgIH0sXHJcbiAgICAgICAge1xyXG4gICAgICAgICAgICB0aXRsZTogXCJCdWcgRml4ZXNcIixcclxuICAgICAgICAgICAgdHlwZTogXCJmaXhlZFwiLFxyXG4gICAgICAgICAgICBpdGVtczogW1xyXG4gICAgICAgICAgICAgICAgXCJTb21lIGZpeGVzIHJlbGF0ZWQgdG8gc2hvd2luZyBtb2RhbHMgaW4gdGhlIGBCZEFwaWAuXCJcclxuICAgICAgICAgICAgXVxyXG4gICAgICAgIH1cclxuICAgIF1cclxufTtcclxuXHJcbmV4cG9ydCBjb25zdCBzZXR0aW5ncyA9IHtcclxuICAgIFwiQ3VzdG9tIGNzcyBsaXZlIHVwZGF0ZVwiOiAgICAge2lkOiBcImJkYS1jc3MtMFwiLCBpbmZvOiBcIlwiLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW1wbGVtZW50ZWQ6IHRydWUsICBoaWRkZW46IHRydWUsICBjYXQ6IFwiY29yZVwifSxcclxuICAgIFwiQ3VzdG9tIGNzcyBhdXRvIHVkcGF0ZVwiOiAgICAge2lkOiBcImJkYS1jc3MtMVwiLCBpbmZvOiBcIlwiLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW1wbGVtZW50ZWQ6IHRydWUsICBoaWRkZW46IHRydWUsICBjYXQ6IFwiY29yZVwifSxcclxuICAgIFwiQmV0dGVyRGlzY29yZCBCbHVlXCI6ICAgICAgICAge2lkOiBcImJkYS1ncy1iXCIsICBpbmZvOiBcIlJlcGxhY2UgRGlzY29yZCBibHVlIHdpdGggQkQgQmx1ZVwiLCAgICAgICAgICAgICAgICAgaW1wbGVtZW50ZWQ6IGZhbHNlLCAgaGlkZGVuOiBmYWxzZSwgY2F0OiBcImNvcmVcIn0sXHJcblxyXG4gICAgLyogQ29yZSAqL1xyXG4gICAgLyogPT09PT09ICovXHJcbiAgICBcIlB1YmxpYyBTZXJ2ZXJzXCI6ICAgICAgICAgICAgIHtpZDogXCJiZGEtZ3MtMVwiLCAgaW5mbzogXCJEaXNwbGF5IHB1YmxpYyBzZXJ2ZXJzIGJ1dHRvblwiLCAgICAgICAgICAgICAgICAgICAgIGltcGxlbWVudGVkOiB0cnVlLCAgaGlkZGVuOiBmYWxzZSwgY2F0OiBcImNvcmVcIiwgY2F0ZWdvcnk6IFwibW9kdWxlc1wifSxcclxuICAgIFwiTWluaW1hbCBNb2RlXCI6ICAgICAgICAgICAgICAge2lkOiBcImJkYS1ncy0yXCIsICBpbmZvOiBcIkhpZGUgZWxlbWVudHMgYW5kIHJlZHVjZSB0aGUgc2l6ZSBvZiBlbGVtZW50cy5cIiwgICAgaW1wbGVtZW50ZWQ6IHRydWUsICBoaWRkZW46IGZhbHNlLCBjYXQ6IFwiY29yZVwiLCBjYXRlZ29yeTogXCJtb2R1bGVzXCJ9LFxyXG4gICAgXCJWb2ljZSBNb2RlXCI6ICAgICAgICAgICAgICAgICB7aWQ6IFwiYmRhLWdzLTRcIiwgIGluZm86IFwiT25seSBzaG93IHZvaWNlIGNoYXRcIiwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbXBsZW1lbnRlZDogdHJ1ZSwgIGhpZGRlbjogZmFsc2UsIGNhdDogXCJjb3JlXCIsIGNhdGVnb3J5OiBcIm1vZHVsZXNcIn0sXHJcbiAgICBcIkhpZGUgQ2hhbm5lbHNcIjogICAgICAgICAgICAgIHtpZDogXCJiZGEtZ3MtM1wiLCAgaW5mbzogXCJIaWRlIGNoYW5uZWxzIGluIG1pbmltYWwgbW9kZVwiLCAgICAgICAgICAgICAgICAgICAgIGltcGxlbWVudGVkOiB0cnVlLCAgaGlkZGVuOiBmYWxzZSwgY2F0OiBcImNvcmVcIiwgY2F0ZWdvcnk6IFwibW9kdWxlc1wifSxcclxuICAgIFwiRGFyayBNb2RlXCI6ICAgICAgICAgICAgICAgICAge2lkOiBcImJkYS1ncy01XCIsICBpbmZvOiBcIk1ha2UgY2VydGFpbiBlbGVtZW50cyBkYXJrIGJ5IGRlZmF1bHQod2lwKVwiLCAgICAgICAgaW1wbGVtZW50ZWQ6IHRydWUsICBoaWRkZW46IGZhbHNlLCBjYXQ6IFwiY29yZVwiLCBjYXRlZ29yeTogXCJtb2R1bGVzXCJ9LFxyXG4gICAgXCJWb2ljZSBEaXNjb25uZWN0XCI6ICAgICAgICAgICB7aWQ6IFwiYmRhLWRjLTBcIiwgIGluZm86IFwiRGlzY29ubmVjdCBmcm9tIHZvaWNlIHNlcnZlciB3aGVuIGNsb3NpbmcgRGlzY29yZFwiLCBpbXBsZW1lbnRlZDogdHJ1ZSwgIGhpZGRlbjogZmFsc2UsIGNhdDogXCJjb3JlXCIsIGNhdGVnb3J5OiBcIm1vZHVsZXNcIn0sXHJcbiAgICBcIjI0IEhvdXIgVGltZXN0YW1wc1wiOiAgICAgICAgIHtpZDogXCJiZGEtZ3MtNlwiLCAgaW5mbzogXCJSZXBsYWNlIDEyaHIgdGltZXN0YW1wcyB3aXRoIHByb3BlciBvbmVzXCIsICAgICAgICAgIGltcGxlbWVudGVkOiB0cnVlLCAgaGlkZGVuOiBmYWxzZSwgY2F0OiBcImNvcmVcIiwgY2F0ZWdvcnk6IFwibW9kdWxlc1wifSxcclxuICAgIFwiQ29sb3JlZCBUZXh0XCI6ICAgICAgICAgICAgICAge2lkOiBcImJkYS1ncy03XCIsICBpbmZvOiBcIk1ha2UgdGV4dCBjb2xvciB0aGUgc2FtZSBhcyByb2xlIGNvbG9yXCIsICAgICAgICAgICAgaW1wbGVtZW50ZWQ6IHRydWUsICBoaWRkZW46IGZhbHNlLCBjYXQ6IFwiY29yZVwiLCBjYXRlZ29yeTogXCJtb2R1bGVzXCJ9LFxyXG4gICAgXCJOb3JtYWxpemUgQ2xhc3Nlc1wiOiAgICAgICAgICB7aWQ6IFwiZm9yay1wcy00XCIsIGluZm86IFwiQWRkcyBzdGFibGUgY2xhc3NlcyB0byBlbGVtZW50cyB0byBoZWxwIHRoZW1lcy4gKGUuZy4gYWRkcyAuZGEtY2hhbm5lbHMgdG8gLmNoYW5uZWxzLUllMmw2QSlcIiwgaW1wbGVtZW50ZWQ6IHRydWUsICBoaWRkZW46IGZhbHNlLCBjYXQ6IFwiY29yZVwiLCBjYXRlZ29yeTogXCJtb2R1bGVzXCJ9LFxyXG5cclxuICAgIC8qIENvbnRlbnQgKi9cclxuICAgIFwiQ29udGVudCBFcnJvciBNb2RhbFwiOiAgICAgICAge2lkOiBcImZvcmstcHMtMVwiLCBpbmZvOiBcIlNob3dzIGEgbW9kYWwgd2l0aCBwbHVnaW4vdGhlbWUgZXJyb3JzXCIsIGltcGxlbWVudGVkOiB0cnVlLCAgaGlkZGVuOiBmYWxzZSwgY2F0OiBcImNvcmVcIiwgY2F0ZWdvcnk6IFwiY29udGVudCBtYW5hZ2VyXCJ9LFxyXG4gICAgXCJTY2FuIFBsdWdpbnNcIjogICAgICAgICAgICAgICB7aWQ6IFwiZm9yay1wcy02XCIsIGluZm86IFwiU2NhbiBwbHVnaW5zIGZvciBhbnkgdGhyZWF0IHRoYXQgY2FuIGJlIGhpZGRlbiBpbnNpZGUuXCIsIGltcGxlbWVudGVkOiB0cnVlLCAgaGlkZGVuOiBmYWxzZSwgY2F0OiBcImNvcmVcIiwgY2F0ZWdvcnk6IFwiY29udGVudCBtYW5hZ2VyXCJ9LFxyXG4gICAgXCJTaG93IFRvYXN0c1wiOiAgICAgICAgICAgICAgICB7aWQ6IFwiZm9yay1wcy0yXCIsIGluZm86IFwiU2hvd3MgYSBzbWFsbCBub3RpZmljYXRpb24gZm9yIGltcG9ydGFudCBpbmZvcm1hdGlvblwiLCBpbXBsZW1lbnRlZDogdHJ1ZSwgIGhpZGRlbjogZmFsc2UsIGNhdDogXCJjb3JlXCIsIGNhdGVnb3J5OiBcImNvbnRlbnQgbWFuYWdlclwifSxcclxuICAgIFwiU2Nyb2xsIFRvIFNldHRpbmdzXCI6ICAgICAgICAge2lkOiBcImZvcmstcHMtM1wiLCBpbmZvOiBcIkF1dG8tc2Nyb2xscyB0byBhIHBsdWdpbidzIHNldHRpbmdzIHdoZW4gdGhlIGJ1dHRvbiBpcyBjbGlja2VkIChvbmx5IGlmIG91dCBvZiB2aWV3KVwiLCBpbXBsZW1lbnRlZDogdHJ1ZSwgIGhpZGRlbjogZmFsc2UsIGNhdDogXCJjb3JlXCIsIGNhdGVnb3J5OiBcImNvbnRlbnQgbWFuYWdlclwifSxcclxuICAgIFwiQXV0b21hdGljIExvYWRpbmdcIjogICAgICAgICAge2lkOiBcImZvcmstcHMtNVwiLCBpbmZvOiBcIkF1dG9tYXRpY2FsbHkgbG9hZHMsIHJlbG9hZHMsIGFuZCB1bmxvYWRzIHBsdWdpbnMgYW5kIHRoZW1lc1wiLCBpbXBsZW1lbnRlZDogdHJ1ZSwgIGhpZGRlbjogZmFsc2UsIGNhdDogXCJjb3JlXCIsIGNhdGVnb3J5OiBcImNvbnRlbnQgbWFuYWdlclwifSxcclxuXHJcbiAgICAvKiBEZXZlbG9wZXIgKi9cclxuICAgIFwiRGV2ZWxvcGVyIE1vZGVcIjogICAgICAgICBcdCAge2lkOiBcImJkYS1ncy04XCIsIGluZm86IFwiRGV2ZWxvcGVyIE1vZGUgVG9nZ2xlXCIsIGltcGxlbWVudGVkOiB0cnVlLCBoaWRkZW46IGZhbHNlLCBjYXQ6IFwiY29yZVwiLCBjYXRlZ29yeTogXCJkZXZlbG9wZXIgc2V0dGluZ3NcIn0sXHJcbiAgICBcIkNvcHkgU2VsZWN0b3JcIjpcdFx0XHQgIHtpZDogXCJmb3JrLWRtLTFcIiwgaW5mbzogXCJBZGRzIGEgXFxcIkNvcHkgU2VsZWN0b3JcXFwiIG9wdGlvbiB0byBjb250ZXh0IG1lbnVzIHdoZW4gZGV2ZWxvcGVyIG1vZGUgaXMgYWN0aXZlXCIsIGltcGxlbWVudGVkOiB0cnVlLCBoaWRkZW46IGZhbHNlLCBjYXQ6IFwiY29yZVwiLCBjYXRlZ29yeTogXCJkZXZlbG9wZXIgc2V0dGluZ3NcIn0sXHJcbiAgICBcIlJlYWN0IERldlRvb2xzXCI6XHRcdFx0ICB7aWQ6IFwicmVhY3REZXZUb29sc1wiLCBpbmZvOiBcIkFkZHMgcmVhY3QgZGV2ZWxvcGVyIHRvb2xzIHRvIHRoZSBkZXZ0b29scy4gTXVzdCBiZSBpbnN0YWxsZWQgaW4gR29vZ2xlIENocm9tZSBvbiB5b3VyIHBjLlwiLCBpbXBsZW1lbnRlZDogdHJ1ZSwgIGhpZGRlbjogdHJ1ZSwgY2F0OiBcImNvcmVcIiwgY2F0ZWdvcnk6IFwiZGV2ZWxvcGVyIHNldHRpbmdzXCJ9LFxyXG5cclxuICAgIC8qKiBMaWdodGNvcmQgKi9cclxuICAgIFwiRGlzYWJsZSBCZXR0ZXJEaXNjb3JkXCI6ICAgICAge2lkOiBcImJkLWRpc2FibGVcIiwgIGluZm86IFwiRGlzYWJsZSBCZXR0ZXJkaXNjb3JkIChwbHVnaW5zLCB0aGVtZXMsIGV0YykgKE5vdCBpbXBsZW1lbnRlZCkuXCIsIGltcGxlbWVudGVkOiBmYWxzZSwgaGlkZGVuOiBmYWxzZSwgY2F0OiBcImxpZ2h0Y29yZFwiLCBjYXRlZ29yeTogXCJMaWdodGNvcmRcIn0sXHJcbiAgICBcIkJsdXIgUGVyc29ubmFsIEluZm9ybWF0aW9uc1wiOntpZDogXCJsaWdodGNvcmQtNlwiLCBpbmZvOiBcIkJsdXIgc2Vuc2l0aXZlIGluZm9ybWF0aW9ucyBsaWtlIGVtYWlsLCBwYXltZW50IGluZm9zIGFuZCBtb3JlLlwiLCBpbXBsZW1lbnRlZDogdHJ1ZSwgaGlkZGVuOiBmYWxzZSwgY2F0OiBcImxpZ2h0Y29yZFwiLCBjYXRlZ29yeTogXCJMaWdodGNvcmRcIn0sXHJcbiAgICBcIkNhbGxpbmcgUmluZyBCZWF0XCI6ICAgICAgICAgIHtpZDogXCJsaWdodGNvcmQtMlwiLCBpbmZvOiBcIkVuYWJsZSBEaXNjb3JkJ3Mgc3BlY2lhbCBjYWxsaW5nIGJlYXQuXCIsIGltcGxlbWVudGVkOiB0cnVlLCBoaWRkZW46IGZhbHNlLCBjYXQ6IFwibGlnaHRjb3JkXCIsIGNhdGVnb3J5OiBcIkxpZ2h0Y29yZFwifSxcclxuICAgIFwiRGV2ZWxvcGVyIE9wdGlvbnNcIjogICAgICAgICAge2lkOiBcImxpZ2h0Y29yZC0xXCIsIGluZm86IFwiRW5hYmxlIERpc2NvcmQncyAmIExpZ2h0Y29yZCdzIEludGVybmFsIERldmVsb3BlciBPcHRpb25zLiBUaGlzIGFsbG93IHRoZSBcXFwiRXhwZXJpbWVudHNcXFwiIHRhYiwgdGhlIFxcXCJEZXZlbG9wZXIgT3B0aW9uc1xcXCIgdGFiIGFuZCB0aGUgXFxcIkFwaSBDb21wb25lbnRzXFxcIiB0YWIuIChtdXN0IHJlb3BlbiBzZXR0aW5ncylcIiwgaW1wbGVtZW50ZWQ6IHRydWUsIGhpZGRlbjogZmFsc2UsIGNhdDogXCJsaWdodGNvcmRcIiwgY2F0ZWdvcnk6IFwiTGlnaHRjb3JkXCJ9LFxyXG4gICAgXCJBZCBCbG9ja1wiOiAgICAgICAgICAgICAgICAgICB7aWQ6IFwibGlnaHRjb3JkLTRcIiwgaW5mbzogXCJCbG9jayBhbnkgQk9UIHRoYXQgZG1zIHlvdSB3aXRoIGFuIGludml0ZSBsaW5rLiBFdmVuIGluIGFuIGVtYmVkLlwiLCBpbXBsZW1lbnRlZDogdHJ1ZSwgaGlkZGVuOiBmYWxzZSwgY2F0OiBcImxpZ2h0Y29yZFwiLCBjYXRlZ29yeTogXCJMaWdodGNvcmRcIn0sXHJcbiAgICBcIkVuYWJsZSBMaWdodGNvcmQgU2VydmVyc1wiOiAgIHtpZDogXCJsaWdodGNvcmQtNVwiLCBpbmZvOiBcIkVuYWJsZSBMaWdodGNvcmQncyBzZXJ2ZXJzLiBEaXNhYmxpbmcgdGhpcyB3aWxsIGRpc2FibGUgY3VzdG9tIGJhZGdlcy5cIiwgaW1wbGVtZW50ZWQ6IHRydWUsIGhpZGRlbjogZmFsc2UsIGNhdDogXCJsaWdodGNvcmRcIiwgY2F0ZWdvcnk6IFwiTGlnaHRjb3JkXCJ9LFxyXG4gICAgXCJEaXNhYmxlIHR5cGluZ1wiOiAgICAgICAgICAgICB7aWQ6IFwibGlnaHRjb3JkLTdcIiwgaW5mbzogXCJEb24ndCBsZXQgb3RoZXIgc2VlIHlvdSdyZSB0eXBpbmcuXCIsIGltcGxlbWVudGVkOiB0cnVlLCBoaWRkZW46IGZhbHNlLCBjYXQ6IFwibGlnaHRjb3JkXCIsIGNhdGVnb3J5OiBcIkxpZ2h0Y29yZFwifSxcclxuXHJcbiAgICAvKiogTGlnaHRjb3JkIFdpbmRvdyAqL1xyXG4gICAgXCJBbHdheXMtb24tVG9wXCI6ICAgICAgICAgICAgICB7aWQ6IFwibGlnaHRjb3JkLTNcIiwgaW5mbzogXCJFbmFibGUgd2luZG93J3MgQWx3YXlzLW9uLVRvcCBtb2RlLCB3aGVyZSBMaWdodGNvcmQgc3RheXMgb24gdG9wIG9mIG90aGVyIGFwcGxpY2F0aW9ucy5cIiwgaW1wbGVtZW50ZWQ6IHRydWUsIGhpZGRlbjogZmFsc2UsIGNhdDogXCJsaWdodGNvcmRcIiwgY2F0ZWdvcnk6IFwiV2luZG93XCJ9LFxyXG4gICAgXHJcbiAgICAvKiogUmljaFByZXNlbmNlICovXHJcbiAgICBcIkVuYWJsZVwiOiAgICAgICAgICAgICAgICAgICAgIHtpZDogXCJsaWdodGNvcmQtcHJlc2VuY2UtMVwiLCBpbmZvOiBcIkVuYWJsZSBSaWNoUHJlc2VuY2UgYmVsb3cuXCIsIGltcGxlbWVudGVkOiB0cnVlLCBoaWRkZW46IGZhbHNlLCBjYXQ6IFwic3RhdHVzXCJ9XHJcbn07XHJcblxyXG5leHBvcnQgY29uc3QgZGVmYXVsdENvb2tpZSA9IHtcclxuICAgIFwiYmRhLWdzLTFcIjogdHJ1ZSxcclxuICAgIFwiYmRhLWdzLTJcIjogZmFsc2UsXHJcbiAgICBcImJkYS1ncy0zXCI6IGZhbHNlLFxyXG4gICAgXCJiZGEtZ3MtNFwiOiBmYWxzZSxcclxuICAgIFwiYmRhLWdzLTVcIjogdHJ1ZSxcclxuICAgIFwiYmRhLWdzLTZcIjogZmFsc2UsXHJcbiAgICBcImJkYS1ncy03XCI6IGZhbHNlLFxyXG4gICAgXCJiZGEtZ3MtOFwiOiB0cnVlLFxyXG4gICAgXCJiZGEtZXMtMFwiOiB0cnVlLFxyXG4gICAgXCJiZGEtZXMtMVwiOiB0cnVlLFxyXG4gICAgXCJiZGEtZXMtMlwiOiB0cnVlLFxyXG4gICAgXCJiZGEtZXMtNFwiOiBmYWxzZSxcclxuICAgIFwiYmRhLWVzLTZcIjogdHJ1ZSxcclxuICAgIFwiYmRhLWVzLTdcIjogdHJ1ZSxcclxuICAgIFwiYmRhLWdzLWJcIjogZmFsc2UsXHJcbiAgICBcImJkYS1lcy04XCI6IHRydWUsXHJcbiAgICBcImJkYS1kYy0wXCI6IGZhbHNlLFxyXG4gICAgXCJiZGEtY3NzLTBcIjogZmFsc2UsXHJcbiAgICBcImJkYS1jc3MtMVwiOiBmYWxzZSxcclxuICAgIFwiYmRhLWVzLTlcIjogdHJ1ZSxcclxuICAgIFwiZm9yay1kbS0xXCI6IGZhbHNlLFxyXG4gICAgXCJmb3JrLXBzLTFcIjogdHJ1ZSxcclxuICAgIFwiZm9yay1wcy0yXCI6IHRydWUsXHJcbiAgICBcImZvcmstcHMtM1wiOiB0cnVlLFxyXG4gICAgXCJmb3JrLXBzLTRcIjogdHJ1ZSxcclxuICAgIFwiZm9yay1wcy01XCI6IHRydWUsXHJcbiAgICBcImZvcmstcHMtNlwiOiB0cnVlLFxyXG4gICAgXCJmb3JrLWVzLTJcIjogZmFsc2UsXHJcbiAgICBcImZvcmstZXMtM1wiOiB0cnVlLFxyXG4gICAgXCJmb3JrLXdwLTFcIjogZmFsc2UsXHJcbiAgICBcImZvcmstd3AtMlwiOiBmYWxzZSxcclxuICAgIFwiZm9yay1iZXRhXCI6IHRydWUsXHJcbiAgICBcInJlYWN0RGV2VG9vbHNcIjogZmFsc2UsXHJcbiAgICBcImxpZ2h0Y29yZC0xXCI6IGZhbHNlLFxyXG4gICAgXCJsaWdodGNvcmQtMlwiOiB0cnVlLFxyXG4gICAgXCJsaWdodGNvcmQtcHJlc2VuY2UtMVwiOiBmYWxzZSxcclxuICAgIFwibGlnaHRjb3JkLTNcIjogZmFsc2UsXHJcbiAgICBcImxpZ2h0Y29yZC00XCI6IGZhbHNlLFxyXG4gICAgXCJsaWdodGNvcmQtNVwiOiB0cnVlLFxyXG4gICAgXCJsaWdodGNvcmQtNlwiOiB0cnVlLFxyXG4gICAgXCJsaWdodGNvcmQtN1wiOiBmYWxzZSxcclxufTtcclxuXHJcblxyXG5leHBvcnQgY29uc3Qgc2V0dGluZ3NDb29raWUgPSB7fTtcclxuXHJcbmV4cG9ydCBjb25zdCBzZXR0aW5nc1JQQyA9IHt9O1xyXG5leHBvcnQgY29uc3QgZGVmYXVsdFJQQyA9IHtcclxuICAgIFwibmFtZVwiOiBcIkxpZ2h0Y29yZFwiLFxyXG4gICAgXCJhcHBsaWNhdGlvbl9pZFwiOiBcIjcxMTQxNjk1NzcxODc1NzQxOFwiLFxyXG4gICAgXCJzdGF0ZVwiOiBcIkxpZ2h0Y29yZCBDbGllbnRcIixcclxuICAgIFwiZGV0YWlsc1wiOiBcIkJyb3dzaW5nIERpc2NvcmRcIixcclxuICAgIFwidGltZXN0YW1wcy5zdGFydFwiOiBEYXRlLm5vdygpLFxyXG4gICAgXCJhc3NldHMuc21hbGxcIjogbnVsbCxcclxuICAgIFwiYXNzZXRzLmxhcmdlXCI6IFwiNzEyMzIzODIxMDM3NjgyNzkxXCJcclxufVxyXG5cclxuZXhwb3J0IGNvbnN0IGJkcGx1Z2luRXJyb3JzID0gW107XHJcbmV4cG9ydCBjb25zdCBiZHRoZW1lRXJyb3JzID0gW107IC8vIGRlZmluZSBmb3IgYmFja3dhcmRzIGNvbXBhdGliaWxpdHlcclxuXHJcbmV4cG9ydCBjb25zdCBiZENvbmZpZyA9IE9iamVjdC5jcmVhdGUoQmV0dGVyRGlzY29yZENvbmZpZyk7XHJcblxyXG5leHBvcnQgY29uc3QgYmR0aGVtZXMgPSB7fTtcclxuZXhwb3J0IGNvbnN0IGJkcGx1Z2lucyA9IHt9O1xyXG5cclxuZXhwb3J0IGNvbnN0IHBsdWdpbkNvb2tpZSA9IHt9O1xyXG5leHBvcnQgY29uc3QgdGhlbWVDb29raWUgPSB7fTsiLCJpbXBvcnQgbG9jYWxTdG9yYWdlRml4IGZyb20gXCIuL2xvY2FsU3RvcmFnZUZpeFwiO1xyXG5pbXBvcnQgbG9hZGluZ0ljb24gZnJvbSBcIi4vbG9hZGluZ0ljb25cIjtcclxubG9jYWxTdG9yYWdlRml4KCk7XHJcbmxvYWRpbmdJY29uKCk7XHJcblxyXG5jb25zdCBkZXByZWNhdGVHbG9iYWwgPSAoa2V5LCB2YWx1ZSkgPT4ge1xyXG4gICAgLy8gdmFsdWUgPSB0eXBlb2YodmFsdWUpICE9PSBcIm9iamVjdFwiID8gdmFsdWUgOiBuZXcgUHJveHkodmFsdWUsIHtcclxuICAgIC8vICAgICBnZXQ6IGZ1bmN0aW9uKG9iaiwgbW9kKSB7XHJcbiAgICAvLyAgICAgICAgIGlmICghb2JqLmhhc093blByb3BlcnR5KG1vZCkpIHJldHVybiB1bmRlZmluZWQ7XHJcbiAgICAvLyAgICAgICAgIHJldHVybiBvYmpbbW9kXTtcclxuICAgIC8vICAgICB9LFxyXG4gICAgLy8gICAgIHNldDogZnVuY3Rpb24ob2JqLCBtb2QpIHtcclxuICAgIC8vICAgICAgICAgaWYgKG9iai5oYXNPd25Qcm9wZXJ0eShtb2QpKSByZXR1cm4gVXRpbHMuZXJyKFwiRGVwcmVjYXRlZCBHbG9iYWxcIiwgXCJUcnlpbmcgdG8gb3ZlcndyaXRlIGRlcHJlY2F0ZWQgQkQgZ2xvYmFsc1wiKTtcclxuICAgIC8vICAgICB9XHJcbiAgICAvLyB9KTtcclxuICAgIE9iamVjdC5kZWZpbmVQcm9wZXJ0eSh3aW5kb3csIGtleSwge1xyXG4gICAgICAgIGdldCgpIHtcclxuICAgICAgICAgICAgVXRpbHMud2FybihcIkRlcHJlY2F0ZWQgR2xvYmFsXCIsIGBcIiR7a2V5fVwiIHdpbGwgYmUgcmVtb3ZlZCBpbiBmdXR1cmUgdmVyc2lvbnMuIFBsZWFzZSBvbmx5IHVzZSBCZEFwaS5gKTtcclxuICAgICAgICAgICAgcmV0dXJuIHZhbHVlO1xyXG4gICAgICAgIH1cclxuICAgIH0pOyAgXHJcbn07XHJcblxyXG5cclxuaW1wb3J0ICogYXMgR2xvYmFscyBmcm9tIFwiLi8wZ2xvYmFsc1wiO1xyXG5cclxuY29uc3QgZ2xvYmFsS2V5cyA9IE9iamVjdC5rZXlzKEdsb2JhbHMpO1xyXG5mb3IgKGNvbnN0IGtleSBvZiBnbG9iYWxLZXlzKSBkZXByZWNhdGVHbG9iYWwoa2V5LCBHbG9iYWxzW2tleV0pO1xyXG5cclxuXHJcbmltcG9ydCBCZEFwaSBmcm9tIFwiLi9tb2R1bGVzL2JkQXBpXCI7XHJcbmltcG9ydCBCRFYyIGZyb20gXCIuL21vZHVsZXMvdjJcIjtcclxuaW1wb3J0IHBsdWdpbk1vZHVsZSBmcm9tIFwiLi9tb2R1bGVzL3BsdWdpbk1vZHVsZVwiO1xyXG5pbXBvcnQgdGhlbWVNb2R1bGUgZnJvbSBcIi4vbW9kdWxlcy90aGVtZU1vZHVsZVwiO1xyXG5pbXBvcnQgVXRpbHMgZnJvbSBcIi4vbW9kdWxlcy91dGlsc1wiO1xyXG5pbXBvcnQgQkRFdmVudHMgZnJvbSBcIi4vbW9kdWxlcy9iZEV2ZW50c1wiO1xyXG5pbXBvcnQgc2V0dGluZ3NQYW5lbCBmcm9tIFwiLi9tb2R1bGVzL3NldHRpbmdzUGFuZWxcIjtcclxuaW1wb3J0IERhdGFTdG9yZSBmcm9tIFwiLi9tb2R1bGVzL2RhdGFTdG9yZVwiO1xyXG5pbXBvcnQgQ29udGVudE1hbmFnZXIgZnJvbSBcIi4vbW9kdWxlcy9jb250ZW50TWFuYWdlclwiO1xyXG5pbXBvcnQgQ2xhc3NOb3JtYWxpemVyIGZyb20gXCIuL21vZHVsZXMvY2xhc3NOb3JtYWxpemVyXCI7XHJcblxyXG5kZXByZWNhdGVHbG9iYWwoXCJCRFYyXCIsIEJEVjIpO1xyXG5kZXByZWNhdGVHbG9iYWwoXCJwbHVnaW5Nb2R1bGVcIiwgcGx1Z2luTW9kdWxlKTtcclxuZGVwcmVjYXRlR2xvYmFsKFwidGhlbWVNb2R1bGVcIiwgdGhlbWVNb2R1bGUpO1xyXG5kZXByZWNhdGVHbG9iYWwoXCJVdGlsc1wiLCBVdGlscyk7XHJcbmRlcHJlY2F0ZUdsb2JhbChcIkJERXZlbnRzXCIsIEJERXZlbnRzKTtcclxuZGVwcmVjYXRlR2xvYmFsKFwic2V0dGluZ3NQYW5lbFwiLCBzZXR0aW5nc1BhbmVsKTtcclxuZGVwcmVjYXRlR2xvYmFsKFwiRGF0YVN0b3JlXCIsIERhdGFTdG9yZSk7XHJcbmRlcHJlY2F0ZUdsb2JhbChcIkNvbnRlbnRNYW5hZ2VyXCIsIENvbnRlbnRNYW5hZ2VyKTtcclxuZGVwcmVjYXRlR2xvYmFsKFwiQ2xhc3NOb3JtYWxpemVyXCIsIENsYXNzTm9ybWFsaXplcik7XHJcblxyXG53aW5kb3cuQmRBcGkgPSBCZEFwaTtcclxuXHJcbmltcG9ydCBDb3JlIGZyb20gXCIuL21vZHVsZXMvY29yZVwiO1xyXG5kZXByZWNhdGVHbG9iYWwoXCJtYWluQ29yZVwiLCBDb3JlKTtcclxuZXhwb3J0IGRlZmF1bHQgY2xhc3MgQ29yZVdyYXBwZXIge1xyXG4gICAgY29uc3RydWN0b3IoYmRDb25maWcpIHtcclxuICAgICAgICBDb3JlLnNldENvbmZpZyhiZENvbmZpZyk7XHJcbiAgICB9XHJcblxyXG4gICAgaW5pdCgpIHtcclxuICAgICAgICAvLyBkZXByZWNhdGVHbG9iYWwoXCJtYWluQ29yZVwiLCB0aGlzLm1haW5Db3JlKTtcclxuICAgICAgICBDb3JlLmluaXQoKTtcclxuICAgIH1cclxufVxyXG5cclxuLy8gZnVuY3Rpb24gcGF0Y2hNb2R1bGVMb2FkKCkge1xyXG4vLyAgICAgY29uc3QgbmFtZXNwYWNlID0gXCJiZXR0ZXJkaXNjb3JkXCI7XHJcbi8vICAgICBjb25zdCBwcmVmaXggPSBgJHtuYW1lc3BhY2V9L2A7XHJcbi8vICAgICBjb25zdCBNb2R1bGUgPSByZXF1aXJlKFwibW9kdWxlXCIpO1xyXG4vLyAgICAgY29uc3QgbG9hZCA9IE1vZHVsZS5fbG9hZDtcclxuLy8gICAgIC8vIGNvbnN0IHJlc29sdmVGaWxlbmFtZSA9IE1vZHVsZS5fcmVzb2x2ZUZpbGVuYW1lO1xyXG5cclxuLy8gICAgIE1vZHVsZS5fbG9hZCA9IGZ1bmN0aW9uKHJlcXVlc3QpIHtcclxuLy8gICAgICAgICBpZiAocmVxdWVzdCA9PT0gbmFtZXNwYWNlIHx8IHJlcXVlc3Quc3RhcnRzV2l0aChwcmVmaXgpKSB7XHJcbi8vICAgICAgICAgICAgIGNvbnN0IHJlcXVlc3RlZCA9IHJlcXVlc3Quc3Vic3RyKHByZWZpeC5sZW5ndGgpO1xyXG4vLyAgICAgICAgICAgICBpZiAocmVxdWVzdGVkID09IFwiYXBpXCIpIHJldHVybiBCZEFwaTtcclxuLy8gICAgICAgICB9XHJcblxyXG4vLyAgICAgICAgIHJldHVybiBsb2FkLmFwcGx5KHRoaXMsIGFyZ3VtZW50cyk7XHJcbi8vICAgICB9O1xyXG5cclxuLy8gICAgIC8vIE1vZHVsZS5fcmVzb2x2ZUZpbGVuYW1lID0gZnVuY3Rpb24gKHJlcXVlc3QsIHBhcmVudCwgaXNNYWluKSB7XHJcbi8vICAgICAvLyAgICAgaWYgKHJlcXVlc3QgPT09IFwiYmV0dGVyZGlzY29yZFwiIHx8IHJlcXVlc3Quc3RhcnRzV2l0aChcImJldHRlcmRpc2NvcmQvXCIpKSB7XHJcbi8vICAgICAvLyAgICAgICAgIGNvbnN0IGNvbnRlbnRQYXRoID0gUGx1Z2luTWFuYWdlci5nZXRQbHVnaW5QYXRoQnlNb2R1bGUocGFyZW50KTtcclxuLy8gICAgIC8vICAgICAgICAgaWYgKGNvbnRlbnRQYXRoKSByZXR1cm4gcmVxdWVzdDtcclxuLy8gICAgIC8vICAgICB9XHJcblxyXG4vLyAgICAgLy8gICAgIHJldHVybiByZXNvbHZlRmlsZW5hbWUuYXBwbHkodGhpcywgYXJndW1lbnRzKTtcclxuLy8gICAgIC8vIH07XHJcblxyXG4vLyAgICAgcmV0dXJuIGZ1bmN0aW9uKCkge1xyXG4vLyAgICAgICAgIE1vZHVsZS5fbG9hZCA9IGxvYWQ7XHJcbi8vICAgICB9O1xyXG4vLyB9XHJcblxyXG4vLyBwYXRjaE1vZHVsZUxvYWQoKTtcclxuXHJcbi8vIHZhciBzZXR0aW5nc1BhbmVsLCB2b2ljZU1vZGUsLCBkTW9kZSwgcHVibGljU2VydmVyc01vZHVsZTtcclxuLy8gdmFyIGJkQ29uZmlnID0gbnVsbDtcclxuXHJcbnJlcXVpcmUoXCJyZXF1ZXN0XCIpLy8ganVzdCBpbiBjYWNoZSBzbyBwbHVnaW4gY2FuIHJlcXVpcmUgaXQgdG9vIiwiZXhwb3J0IGRlZmF1bHQgKCkgPT4ge1xyXG4gICAgY29uc3QgdjJMb2FkZXIgPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KFwiZGl2XCIpO1xyXG4gICAgdjJMb2FkZXIuY2xhc3NOYW1lID0gXCJiZC1sb2FkZXJ2MlwiO1xyXG4gICAgdjJMb2FkZXIudGl0bGUgPSBcIkJhbmRhZ2VkQkQgaXMgbG9hZGluZy4uLlwiO1xyXG4gICAgZG9jdW1lbnQuYm9keS5hcHBlbmRDaGlsZCh2MkxvYWRlcik7XHJcbn07IiwiZXhwb3J0IGRlZmF1bHQgZnVuY3Rpb24oKSB7XHJcbiAgICBjb25zdCBjb250ZW50V2luZG93R2V0dGVyID0gT2JqZWN0LmdldE93blByb3BlcnR5RGVzY3JpcHRvcihIVE1MSUZyYW1lRWxlbWVudC5wcm90b3R5cGUsIFwiY29udGVudFdpbmRvd1wiKS5nZXQ7XHJcbiAgICBPYmplY3QuZGVmaW5lUHJvcGVydHkoSFRNTElGcmFtZUVsZW1lbnQucHJvdG90eXBlLCBcImNvbnRlbnRXaW5kb3dcIiwge1xyXG4gICAgICAgIGdldDogZnVuY3Rpb24gKCkge1xyXG4gICAgICAgICAgICBjb25zdCBjb250ZW50V2luZG93ID0gUmVmbGVjdC5hcHBseShjb250ZW50V2luZG93R2V0dGVyLCB0aGlzLCBhcmd1bWVudHMpO1xyXG4gICAgICAgICAgICByZXR1cm4gbmV3IFByb3h5KGNvbnRlbnRXaW5kb3csIHtcclxuICAgICAgICAgICAgICAgIGdldE93blByb3BlcnR5RGVzY3JpcHRvcjogZnVuY3Rpb24ob2JqLCBwcm9wKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgaWYgKHByb3AgPT09IFwibG9jYWxTdG9yYWdlXCIpIHJldHVybiB1bmRlZmluZWQ7XHJcbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIE9iamVjdC5nZXRPd25Qcm9wZXJ0eURlc2NyaXB0b3Iob2JqLCBwcm9wKTtcclxuICAgICAgICAgICAgICAgIH0sXHJcbiAgICAgICAgICAgICAgICBnZXQ6IGZ1bmN0aW9uKG9iaiwgcHJvcCkge1xyXG4gICAgICAgICAgICAgICAgICAgIGlmIChwcm9wID09PSBcImxvY2FsU3RvcmFnZVwiKSByZXR1cm4gbnVsbDtcclxuICAgICAgICAgICAgICAgICAgICBjb25zdCB2YWwgPSBvYmpbcHJvcF07XHJcbiAgICAgICAgICAgICAgICAgICAgaWYgKHR5cGVvZiB2YWwgPT09IFwiZnVuY3Rpb25cIikgcmV0dXJuIHZhbC5iaW5kKG9iaik7XHJcbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHZhbDtcclxuICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgfSk7XHJcbiAgICAgICAgfVxyXG4gICAgfSk7XHJcblxyXG4gICAgLy8gUHJldmVudCBpbnRlcmNlcHRpb24gYnkgcGF0Y2hpbmcgUmVmbGVjdC5hcHBseSBhbmQgRnVuY3Rpb24ucHJvdG90eXBlLmJpbmRcclxuICAgIE9iamVjdC5kZWZpbmVQcm9wZXJ0eShSZWZsZWN0LCBcImFwcGx5XCIsIHt2YWx1ZTogUmVmbGVjdC5hcHBseSwgd3JpdGFibGU6IGZhbHNlLCBjb25maWd1cmFibGU6IGZhbHNlfSk7XHJcbiAgICBPYmplY3QuZGVmaW5lUHJvcGVydHkoRnVuY3Rpb24ucHJvdG90eXBlLCBcImJpbmRcIiwge3ZhbHVlOiBGdW5jdGlvbi5wcm90b3R5cGUuYmluZCwgd3JpdGFibGU6IGZhbHNlLCBjb25maWd1cmFibGU6IGZhbHNlfSk7XHJcblxyXG4gICAgY29uc3Qgb09wZW4gPSBYTUxIdHRwUmVxdWVzdC5wcm90b3R5cGUub3BlbjtcclxuICAgIFhNTEh0dHBSZXF1ZXN0LnByb3RvdHlwZS5vcGVuID0gZnVuY3Rpb24oKSB7XHJcbiAgICAgICAgY29uc3QgdXJsID0gYXJndW1lbnRzWzFdO1xyXG4gICAgICAgIGlmICh1cmwudG9Mb3dlckNhc2UoKS5pbmNsdWRlcyhcImFwaS93ZWJob29rc1wiKSkgcmV0dXJuIG51bGw7XHJcbiAgICAgICAgcmV0dXJuIFJlZmxlY3QuYXBwbHkob09wZW4sIHRoaXMsIGFyZ3VtZW50cyk7XHJcbiAgICB9O1xyXG59IiwiaW1wb3J0IHtzZXR0aW5nc0Nvb2tpZX0gZnJvbSBcIi4uLzBnbG9iYWxzXCI7XHJcbmltcG9ydCBCRFYyIGZyb20gXCIuL3YyXCI7XHJcbmltcG9ydCBVdGlscyBmcm9tIFwiLi91dGlsc1wiO1xyXG5cclxuZXhwb3J0IGRlZmF1bHQgbmV3IGNsYXNzIFRGSG91ciB7XHJcbiAgICBpbmplY3QyNEhvdXIoKSB7XHJcbiAgICAgICAgaWYgKHRoaXMuY2FuY2VsMjRIb3VyKSByZXR1cm47XHJcblxyXG4gICAgICAgIGNvbnN0IHR3ZWx2ZUhvdXIgPSBuZXcgUmVnRXhwKGAoWzAtOV17MSwyfSk6KFswLTldezEsMn0pXFxcXHMoQU18UE0pYCk7XHJcbiAgICAgICAgY29uc3QgY29udmVydCA9IChkYXRhKSA9PiB7XHJcbiAgICAgICAgICAgIGlmICghc2V0dGluZ3NDb29raWVbXCJiZGEtZ3MtNlwiXSkgcmV0dXJuO1xyXG4gICAgICAgICAgICBjb25zdCBtYXRjaGVkID0gZGF0YS5yZXR1cm5WYWx1ZS5tYXRjaCh0d2VsdmVIb3VyKTtcclxuICAgICAgICAgICAgaWYgKCFtYXRjaGVkIHx8IG1hdGNoZWQubGVuZ3RoICE9PSA0KSByZXR1cm47XHJcbiAgICAgICAgICAgIGlmIChtYXRjaGVkWzNdID09PSBcIkFNXCIpIHJldHVybiBkYXRhLnJldHVyblZhbHVlID0gZGF0YS5yZXR1cm5WYWx1ZS5yZXBsYWNlKG1hdGNoZWRbMF0sIGAke21hdGNoZWRbMV0gPT09IFwiMTJcIiA/IFwiMDBcIiA6IG1hdGNoZWRbMV0ucGFkU3RhcnQoMiwgXCIwXCIpfToke21hdGNoZWRbMl19YCk7XHJcbiAgICAgICAgICAgIHJldHVybiBkYXRhLnJldHVyblZhbHVlID0gZGF0YS5yZXR1cm5WYWx1ZS5yZXBsYWNlKG1hdGNoZWRbMF0sIGAke21hdGNoZWRbMV0gPT09IFwiMTJcIiA/IFwiMTJcIiA6IHBhcnNlSW50KG1hdGNoZWRbMV0pICsgMTJ9OiR7bWF0Y2hlZFsyXX1gKTtcclxuICAgICAgICB9O1xyXG5cclxuICAgICAgICBjb25zdCBjYW5jZWxDb3p5ID0gVXRpbHMubW9ua2V5UGF0Y2goQkRWMi5UaW1lRm9ybWF0dGVyLCBcImNhbGVuZGFyRm9ybWF0XCIsIHthZnRlcjogY29udmVydH0pOyAvLyBDYWxsZWQgaW4gQ296eSBtb2RlXHJcbiAgICAgICAgY29uc3QgY2FuY2VsQ29tcGFjdCA9IFV0aWxzLm1vbmtleVBhdGNoKEJEVjIuVGltZUZvcm1hdHRlciwgXCJkYXRlRm9ybWF0XCIsIHthZnRlcjogY29udmVydH0pOyAvLyBDYWxsZWQgaW4gQ29tcGFjdCBtb2RlXHJcbiAgICAgICAgdGhpcy5jYW5jZWwyNEhvdXIgPSAoKSA9PiB7Y2FuY2VsQ296eSgpOyBjYW5jZWxDb21wYWN0KCk7fTsgLy8gQ2FuY2VsIGJvdGhcclxuICAgIH1cclxuXHJcbiAgICByZW1vdmUyNEhvdXIoKSB7XHJcbiAgICAgICAgaWYgKHRoaXMuY2FuY2VsMjRIb3VyKSB0aGlzLmNhbmNlbDI0SG91cigpO1xyXG4gICAgfVxyXG59OyIsImltcG9ydCBVdGlscyBmcm9tIFwiLi91dGlsc1wiXHJcblxyXG5jb25zdCBkaXNwYXRjaGVyID0gd2luZG93LkxpZ2h0Y29yZC5EaXNjb3JkTW9kdWxlcy5kaXNwYXRjaGVyXHJcbmNvbnN0IENoYW5uZWxNb2R1bGUgPSBCRE1vZHVsZXMuZ2V0KGUgPT4gZS5kZWZhdWx0ICYmIGUuZGVmYXVsdC5nZXRDaGFubmVsICYmIGUuZGVmYXVsdC5oYXNDaGFubmVsKVswXS5kZWZhdWx0XHJcbmxldCByZWxhdGlvblNoaXBNb2R1bGUgPSBCRE1vZHVsZXMuZ2V0KGUgPT4gZS5kZWZhdWx0ICYmIGUuZGVmYXVsdC5hZGRSZWxhdGlvbnNoaXApWzBdXHJcbmxldCBETU1vZHVsZSA9IEJETW9kdWxlcy5nZXQoZSA9PiBlLmRlZmF1bHQgJiYgZS5kZWZhdWx0LmNsb3NlUHJpdmF0ZUNoYW5uZWwpWzBdXHJcblxyXG5jb25zdCBibG9ja2VkID0ge31cclxuXHJcbmxldCB1c2VyTW9kdWxlID0gQkRNb2R1bGVzLmdldChlID0+IGUuZGVmYXVsdCAmJiBlLmRlZmF1bHQuZ2V0Q3VycmVudFVzZXIpWzBdXHJcbmZ1bmN0aW9uIGdldEN1cnJlbnRVc2VyKCl7XHJcbiAgICBpZih1c2VyTW9kdWxlKXJldHVybiB1c2VyTW9kdWxlLmRlZmF1bHQuZ2V0Q3VycmVudFVzZXIoKVxyXG4gICAgcmV0dXJuIG51bGxcclxufVxyXG5cclxuZXhwb3J0IGRlZmF1bHQgbmV3IGNsYXNzIEFudGlCb3RETSB7XHJcbiAgICBjb25zdHJ1Y3Rvcigpe1xyXG4gICAgICAgIHRoaXMuYW50aURNID0gdGhpcy5hbnRpRE0uYmluZCh0aGlzKVxyXG4gICAgICAgIHRoaXMuZW5hYmxlZCA9IGZhbHNlXHJcbiAgICB9XHJcblxyXG4gICAgZW5hYmxlKCl7XHJcbiAgICAgICAgaWYodGhpcy5lbmFibGVkKXJldHVyblxyXG4gICAgICAgIHRoaXMuZW5hYmxlZCA9IHRydWVcclxuXHJcbiAgICAgICAgZGlzcGF0Y2hlci5zdWJzY3JpYmUoXCJNRVNTQUdFX0NSRUFURVwiLCB0aGlzLmFudGlETSlcclxuICAgIH1cclxuXHJcbiAgICBkaXNhYmxlKCl7XHJcbiAgICAgICAgaWYoIXRoaXMuZW5hYmxlZClyZXR1cm5cclxuICAgICAgICB0aGlzLmVuYWJsZWQgPSBmYWxzZVxyXG5cclxuICAgICAgICBkaXNwYXRjaGVyLnVuc3Vic2NyaWJlKFwiTUVTU0FHRV9DUkVBVEVcIiwgdGhpcy5hbnRpRE0pXHJcbiAgICB9XHJcblxyXG4gICAgYW50aURNKGV2KXtcclxuICAgICAgICBpZighZXYubWVzc2FnZS5hdXRob3IuYm90KXJldHVyblxyXG4gICAgICAgIGlmKGV2Lm1lc3NhZ2UuYXV0aG9yLmlkID09PSBnZXRDdXJyZW50VXNlcigpLmlkKVxyXG4gICAgICAgIGlmKGV2Lm1lc3NhZ2UuZ3VpbGRfaWQpcmV0dXJuXHJcblxyXG4gICAgICAgIGNvbnN0IGNoYW5uZWwgPSBDaGFubmVsTW9kdWxlLmdldENoYW5uZWwoZXYubWVzc2FnZS5jaGFubmVsX2lkKVxyXG4gICAgICAgIGlmKCFjaGFubmVsKXJldHVybiAvLyBtaWdodCBiZSBicm9rZW5cclxuXHJcbiAgICAgICAgaWYoY2hhbm5lbC50eXBlICE9PSAxKXJldHVyblxyXG5cclxuICAgICAgICBpZihibG9ja2VkW2V2Lm1lc3NhZ2UuYXV0aG9yLmlkXSlyZXR1cm4gLy8gSWYgdGhlIHVzZXIgdW5ibG9jayB0aGUgYm90LCBEb24ndCBibG9jayBpdCBhZ2Fpbi5cclxuXHJcbiAgICAgICAgaWYoc2Nhbk1lc3NhZ2UoZXYubWVzc2FnZSkpe1xyXG4gICAgICAgICAgICBibG9ja2VkW2V2Lm1lc3NhZ2UuYXV0aG9yLmlkXSA9IHRydWVcclxuICAgICAgICAgICAgVXRpbHMuc2hvd1RvYXN0KGBbQWRCbG9ja106IEJsb2NrZWQgJHtldi5tZXNzYWdlLmF1dGhvci51c2VybmFtZX0jJHtldi5tZXNzYWdlLmF1dGhvci5kaXNjcmltaW5hdG9yfWAsIHtcclxuICAgICAgICAgICAgICAgIFwidHlwZVwiOiBcIndhcm5pbmdcIlxyXG4gICAgICAgICAgICB9KVxyXG4gICAgICAgICAgICBpZighcmVsYXRpb25TaGlwTW9kdWxlKXJlbGF0aW9uU2hpcE1vZHVsZSA9IEJETW9kdWxlcy5nZXQoZSA9PiBlLmRlZmF1bHQgJiYgZS5kZWZhdWx0LmFkZFJlbGF0aW9uc2hpcClbMF1cclxuICAgICAgICAgICAgcmVsYXRpb25TaGlwTW9kdWxlLmRlZmF1bHQuYWRkUmVsYXRpb25zaGlwKGV2Lm1lc3NhZ2UuYXV0aG9yLmlkLCB7XHJcbiAgICAgICAgICAgICAgICBsb2NhdGlvbjogXCJDb250ZXh0TWVudVwiXHJcbiAgICAgICAgICAgIH0sIDIpXHJcbiAgICAgICAgICAgIGlmKCFETU1vZHVsZSlETU1vZHVsZSA9IEJETW9kdWxlcy5nZXQoZSA9PiBlLmRlZmF1bHQgJiYgZS5kZWZhdWx0LmNsb3NlUHJpdmF0ZUNoYW5uZWwpWzBdXHJcbiAgICAgICAgICAgIERNTW9kdWxlLmRlZmF1bHQuY2xvc2VQcml2YXRlQ2hhbm5lbChjaGFubmVsLmlkLCBmYWxzZSlcclxuICAgICAgICB9XHJcbiAgICB9XHJcbn1cclxuXHJcbmZ1bmN0aW9uIHNjYW5NZXNzYWdlKG1lc3NhZ2Upe1xyXG4gICAgaWYoLyhkaXNjb3JkXFwuZ2d8ZGlzY29yZFxcLmNvbVxcL2ludml0ZVxcL3xkaXNjb3JkYXBwXFwuY29tXFwvaW52aXRlXFwvKS9nLnRlc3QobWVzc2FnZS5jb250ZW50KSlyZXR1cm4gdHJ1ZVxyXG4gICAgaWYoRW1iZWRzQ29udGFpbnMobWVzc2FnZSwgXCJkaXNjb3JkLmdnL1wiKSB8fCBFbWJlZHNDb250YWlucyhtZXNzYWdlLCBcImRpc2NvcmQuY29tL2ludml0ZS9cIikgfHwgRW1iZWRzQ29udGFpbnMobWVzc2FnZSwgXCJkaXNjb3JkYXBwLmNvbS9pbnZpdGUvXCIpKXJldHVybiB0cnVlXHJcblxyXG4gICAgcmV0dXJuIGZhbHNlXHJcbn1cclxuZnVuY3Rpb24gRW1iZWRzQ29udGFpbnMobWVzc2FnZSwgc2VhcmNoKXtcclxuICAgIGxldCBlbWJlZHMgPSBtZXNzYWdlLmVtYmVkc1xyXG4gICAgaWYoZW1iZWRzLmxlbmd0aCA9PT0gMClyZXR1cm4gZmFsc2VcclxuICAgIHJldHVybiBlbWJlZHMubWFwKGVtYmVkID0+IHtcclxuICAgICAgICBpZihlbWJlZC50eXBlICE9PSBcInJpY2hcIilyZXR1cm4gZmFsc2VcclxuICAgICAgICBpZigoZW1iZWQudGl0bGUgfHwgXCJcIikuaW5jbHVkZXMoc2VhcmNoKSlyZXR1cm4gdHJ1ZVxyXG4gICAgICAgIGlmKChlbWJlZC5kZXNjcmlwdGlvbiB8fCBcIlwiKS5pbmNsdWRlcyhzZWFyY2gpKXJldHVybiB0cnVlXHJcbiAgICAgICAgaWYoKChlbWJlZC5mb290ZXIgfHwgXCJcIikgJiYgZW1iZWQuZm9vdGVyLnRleHQgfHwgXCJcIikuaW5jbHVkZXMoc2VhcmNoKSlyZXR1cm4gdHJ1ZVxyXG4gICAgICAgIGlmKGVtYmVkLmZpZWxkcy5tYXAoZSA9PiB7XHJcbiAgICAgICAgICAgIHJldHVybiBlLnZhbHVlLmluY2x1ZGVzKHNlYXJjaCkgfHwgZS5uYW1lLmluY2x1ZGVzKHNlYXJjaClcclxuICAgICAgICB9KS5pbmNsdWRlcyh0cnVlKSlyZXR1cm4gdHJ1ZVxyXG4gICAgICAgIHJldHVybiBmYWxzZVxyXG5cclxuICAgIH0pLmluY2x1ZGVzKHRydWUpXHJcbn0iLCJpbXBvcnQge3NldHRpbmdzUlBDLCBkZWZhdWx0UlBDfSBmcm9tIFwiLi4vMGdsb2JhbHNcIjtcclxuXHJcbmNvbnN0IGRpc3BhdGNoZXIgPSBCRE1vZHVsZXMuZ2V0KG09Pm0uRGlzcGF0Y2hlciYmbS5kZWZhdWx0JiZtLmRlZmF1bHQuZGlzcGF0Y2gpWzBdLmRlZmF1bHRcclxuY29uc3QgQWN0aW9uVHlwZXMgPSBCRE1vZHVsZXMuZ2V0KG09Pm0uQWN0aW9uVHlwZXMpWzBdLkFjdGlvblR5cGVzXHJcblxyXG5jb25zdCBzb2NrZXRJZCA9IFwibGlnaHRjb3JkLXNwb29mLXNvY2tldFwiXHJcbmNvbnN0IHBpZCA9IHByb2Nlc3MucGlkXHJcblxyXG5leHBvcnQgZGVmYXVsdCBuZXcgY2xhc3MgQ3VzdG9tUmljaFByZXNlbmNlIHtcclxuICAgIGNvbnN0cnVjdG9yKCl7XHJcbiAgICAgICAgdGhpcy5lbmFibGVkID0gZmFsc2VcclxuXHJcbiAgICAgICAgdGhpcy5nYW1lID0gc2V0dGluZ3NSUENcclxuICAgIH1cclxuICAgIFxyXG4gICAgZ2V0IGZvcm1hdGVkR2FtZSgpe1xyXG4gICAgICAgIGlmKCF0aGlzLmdhbWUpcmV0dXJuIG51bGxcclxuICAgICAgICBpZih0aGlzLmVuYWJsZWQgPT09IGZhbHNlKXJldHVybiBudWxsXHJcbiAgICAgICAgbGV0IGdhbWUgPSB7XHJcbiAgICAgICAgICAgIG5hbWU6IHRoaXMuZ2FtZS5uYW1lIHx8IGRlZmF1bHRSUEMubmFtZSxcclxuICAgICAgICAgICAgYXBwbGljYXRpb25faWQ6IHRoaXMuZ2FtZS5hcHBsaWNhdGlvbl9pZCB8fCBkZWZhdWx0UlBDLmFwcGxpY2F0aW9uX2lkLFxyXG4gICAgICAgICAgICBkZXRhaWxzOiB0aGlzLmdhbWUuZGV0YWlscyB8fCB1bmRlZmluZWQsXHJcbiAgICAgICAgICAgIHN0YXRlOiB0aGlzLmdhbWUuc3RhdGUgfHwgdW5kZWZpbmVkLFxyXG4gICAgICAgICAgICB0aW1lc3RhbXBzOiB0aGlzLmdhbWVbXCJ0aW1lc3RhbXBzLnN0YXJ0XCJdID8ge1xyXG4gICAgICAgICAgICAgICAgc3RhcnQ6IHRoaXMuZ2FtZVtcInRpbWVzdGFtcHMuc3RhcnRcIl1cclxuICAgICAgICAgICAgfSA6IHVuZGVmaW5lZCxcclxuICAgICAgICAgICAgYXNzZXRzOiB0aGlzLmdhbWVbXCJhc3NldHMubGFyZ2VcIl0gPyB7XHJcbiAgICAgICAgICAgICAgICBsYXJnZV9pbWFnZTogdGhpcy5nYW1lW1wiYXNzZXRzLmxhcmdlXCJdLFxyXG4gICAgICAgICAgICAgICAgc21hbGxfaW1hZ2U6IHRoaXMuZ2FtZVtcImFzc2V0cy5zbWFsbFwiXSB8fCB1bmRlZmluZWRcclxuICAgICAgICAgICAgfSA6IHVuZGVmaW5lZFxyXG4gICAgICAgIH1cclxuICAgICAgICByZXR1cm4gZ2FtZVxyXG4gICAgfVxyXG5cclxuICAgIHNlbmRHYW1lKCl7XHJcbiAgICAgICAgZGlzcGF0Y2hlci5kaXNwYXRjaCh7XHJcbiAgICAgICAgICAgIHR5cGU6IEFjdGlvblR5cGVzLkxPQ0FMX0FDVElWSVRZX1VQREFURSxcclxuICAgICAgICAgICAgc29ja2V0SWQsXHJcbiAgICAgICAgICAgIHBpZCxcclxuICAgICAgICAgICAgYWN0aXZpdHk6IHRoaXMuZm9ybWF0ZWRHYW1lXHJcbiAgICAgICAgfSkgICBcclxuICAgIH1cclxuXHJcbiAgICBlbmFibGUoKSB7XHJcbiAgICAgICAgaWYodGhpcy5lbmFibGVkKXJldHVyblxyXG4gICAgICAgIHRoaXMuZW5hYmxlZCA9IHRydWVcclxuICAgICAgICBjb25zb2xlLmxvZyhcIkVuYWJsaW5nIGN1c3RvbSBSaWNoUHJlc2VuY2VcIilcclxuXHJcbiAgICAgICAgdGhpcy5zZXQoc2V0dGluZ3NSUEMgfHwgT2JqZWN0LmNyZWF0ZShkZWZhdWx0UlBDKSlcclxuXHJcbiAgICAgICAgdGhpcy5zZW5kR2FtZSgpXHJcbiAgICB9XHJcblxyXG4gICAgZGlzYWJsZSgpIHtcclxuICAgICAgICBpZighdGhpcy5lbmFibGVkKXJldHVyblxyXG4gICAgICAgIHRoaXMuZW5hYmxlZCA9IGZhbHNlXHJcbiAgICAgICAgY29uc29sZS5sb2coXCJEaXNhYmxpbmcgY3VzdG9tIFJpY2hQcmVzZW5jZVwiKVxyXG5cclxuICAgICAgICB0aGlzLnNlbmRHYW1lKClcclxuICAgIH1cclxuXHJcbiAgICBhc3luYyBmZXRjaEFzc2V0cyhhcHBsaWNhdGlvbklkKXtcclxuICAgICAgICBsZXQgYXNzZXRzID0gYXdhaXQgQkRNb2R1bGVzLmdldChlID0+IGUuZ2V0QXNzZXRzKVswXS5nZXRBc3NldHMoYXBwbGljYXRpb25JZClcclxuICAgICAgICBpZihhc3NldHMudW5kZWZpbmVkICYmIHR5cGVvZiBhc3NldHMudW5kZWZpbmVkID09PSBcIm51bWJlclwiKXtcclxuICAgICAgICAgICAgdGhyb3cgbmV3IEVycm9yKFwiVW5rbm93biBBcHBsaWNhdGlvblwiKVxyXG4gICAgICAgIH1cclxuICAgICAgICByZXR1cm4gYXNzZXRzXHJcbiAgICB9XHJcblxyXG4gICAgc2V0KGFjdGl2aXR5KXtcclxuICAgICAgICB0aGlzLmdhbWUgPSBhY3Rpdml0eVxyXG5cclxuICAgICAgICB0aGlzLnNlbmRHYW1lKClcclxuICAgIH1cclxufSIsImltcG9ydCB7cGx1Z2luQ29va2llLCB0aGVtZUNvb2tpZSwgYmRwbHVnaW5zLCBiZHRoZW1lcywgc2V0dGluZ3NDb29raWUsIHNldHRpbmdzfSBmcm9tIFwiLi4vMGdsb2JhbHNcIjtcclxuaW1wb3J0IG1haW5Db3JlIGZyb20gXCIuL2NvcmVcIjtcclxuaW1wb3J0IFV0aWxzIGZyb20gXCIuL3V0aWxzXCI7XHJcbmltcG9ydCBCRFYyIGZyb20gXCIuL3YyXCI7XHJcbmltcG9ydCBEYXRhU3RvcmUgZnJvbSBcIi4vZGF0YVN0b3JlXCI7XHJcbmltcG9ydCBwbHVnaW5Nb2R1bGUgZnJvbSBcIi4vcGx1Z2luTW9kdWxlXCI7XHJcbmltcG9ydCB0aGVtZU1vZHVsZSBmcm9tIFwiLi90aGVtZU1vZHVsZVwiO1xyXG5pbXBvcnQgc2V0dGluZ3NQYW5lbCBmcm9tIFwiLi9zZXR0aW5nc1BhbmVsXCI7XHJcbmltcG9ydCBET00gZnJvbSBcIi4vZG9tdG9vbHNcIjtcclxuXHJcbmNvbnN0IEJkQXBpID0ge1xyXG4gICAgZ2V0IFJlYWN0KCkgeyByZXR1cm4gQkRWMi5SZWFjdDsgfSxcclxuICAgIGdldCBSZWFjdERPTSgpIHsgcmV0dXJuIEJEVjIuUmVhY3REb207IH0sXHJcbiAgICBnZXQgUmVhY3RDb21wb25lbnQoKSB7cmV0dXJuIEJEVjIuUmVhY3RDb21wb25lbnQ7fSxcclxuICAgIGdldCBXaW5kb3dDb25maWdGaWxlKCkge3JldHVybiBVdGlscy5XaW5kb3dDb25maWdGaWxlO30sXHJcbiAgICBnZXQgc2V0dGluZ3MoKSB7cmV0dXJuIHNldHRpbmdzO30sXHJcbiAgICBnZXQgZW1vdGVzKCkge3JldHVybiB7fX0sIC8vIGRlcHJlY2F0ZWQsIGRlbGV0ZWQgYWxsIGVtb3RlcyBmcm9tIGJldHRlcmRpc2NvcmQuXHJcbiAgICBnZXQgc2NyZWVuV2lkdGgoKSB7IHJldHVybiBNYXRoLm1heChkb2N1bWVudC5kb2N1bWVudEVsZW1lbnQuY2xpZW50V2lkdGgsIHdpbmRvdy5pbm5lcldpZHRoIHx8IDApOyB9LFxyXG4gICAgZ2V0IHNjcmVlbkhlaWdodCgpIHsgcmV0dXJuIE1hdGgubWF4KGRvY3VtZW50LmRvY3VtZW50RWxlbWVudC5jbGllbnRIZWlnaHQsIHdpbmRvdy5pbm5lckhlaWdodCB8fCAwKTsgfVxyXG59O1xyXG5cclxuQmRBcGkuZ2V0QWxsV2luZG93UHJlZmVyZW5jZXMgPSBmdW5jdGlvbigpIHtcclxuICAgIHJldHVybiBVdGlscy5nZXRBbGxXaW5kb3dQcmVmZXJlbmNlcygpO1xyXG59O1xyXG5cclxuQmRBcGkuZ2V0V2luZG93UHJlZmVyZW5jZSA9IGZ1bmN0aW9uKGtleSkge1xyXG4gICAgcmV0dXJuIFV0aWxzLmdldFdpbmRvd1ByZWZlcmVuY2Uoa2V5KTtcclxufTtcclxuXHJcbkJkQXBpLnNldFdpbmRvd1ByZWZlcmVuY2UgPSBmdW5jdGlvbihrZXksIHZhbHVlKSB7XHJcbiAgICByZXR1cm4gVXRpbHMuc2V0V2luZG93UHJlZmVyZW5jZShrZXksIHZhbHVlKTtcclxufTtcclxuXHJcbi8vSW5qZWN0IENTUyB0byBkb2N1bWVudCBoZWFkXHJcbi8vaWQgPSBpZCBvZiBlbGVtZW50XHJcbi8vY3NzID0gY3VzdG9tIGNzc1xyXG5CZEFwaS5pbmplY3RDU1MgPSBmdW5jdGlvbiAoaWQsIGNzcykge1xyXG4gICAgRE9NLmFkZFN0eWxlKERPTS5lc2NhcGVJRChpZCksIGNzcyk7XHJcbn07XHJcblxyXG4vL0NsZWFyIGNzcy9yZW1vdmUgYW55IGVsZW1lbnRcclxuLy9pZCA9IGlkIG9mIGVsZW1lbnRcclxuQmRBcGkuY2xlYXJDU1MgPSBmdW5jdGlvbiAoaWQpIHtcclxuICAgIERPTS5yZW1vdmVTdHlsZShET00uZXNjYXBlSUQoaWQpKTtcclxufTtcclxuXHJcbi8vSW5qZWN0IENTUyB0byBkb2N1bWVudCBoZWFkXHJcbi8vaWQgPSBpZCBvZiBlbGVtZW50XHJcbi8vY3NzID0gY3VzdG9tIGNzc1xyXG5CZEFwaS5saW5rSlMgPSBmdW5jdGlvbiAoaWQsIHVybCkge1xyXG4gICAgRE9NLmFkZFNjcmlwdChET00uZXNjYXBlSUQoaWQpLCB1cmwpO1xyXG59O1xyXG5cclxuLy9DbGVhciBjc3MvcmVtb3ZlIGFueSBlbGVtZW50XHJcbi8vaWQgPSBpZCBvZiBlbGVtZW50XHJcbkJkQXBpLnVubGlua0pTID0gZnVuY3Rpb24gKGlkKSB7XHJcbiAgICBET00ucmVtb3ZlU2NyaXB0KERPTS5lc2NhcGVJRChpZCkpO1xyXG59O1xyXG5cclxuLy9HZXQgYW5vdGhlciBwbHVnaW5cclxuLy9uYW1lID0gbmFtZSBvZiBwbHVnaW5cclxuQmRBcGkuZ2V0UGx1Z2luID0gZnVuY3Rpb24gKG5hbWUpIHtcclxuICAgIGlmIChiZHBsdWdpbnMuaGFzT3duUHJvcGVydHkobmFtZSkpIHtcclxuICAgICAgICByZXR1cm4gYmRwbHVnaW5zW25hbWVdLnBsdWdpbjtcclxuICAgIH1cclxuICAgIHJldHVybiBudWxsO1xyXG59O1xyXG5cclxuLy9HZXQgQmV0dGVyRGlzY29yZCBDb3JlXHJcbkJkQXBpLmdldENvcmUgPSBmdW5jdGlvbiAoKSB7XHJcbiAgICBVdGlscy53YXJuKFwiRGVwcmVjYXRpb24gTm90aWNlXCIsIGBCZEFwaS5nZXRDb3JlKCkgd2lsbCBiZSByZW1vdmVkIGluIGZ1dHVyZSB2ZXJzaW9ucy5gKTtcclxuICAgIHJldHVybiBtYWluQ29yZTtcclxufTtcclxuXHJcbi8qKlxyXG4gKiBTaG93cyBhIGdlbmVyaWMgYnV0IHZlcnkgY3VzdG9taXphYmxlIG1vZGFsLlxyXG4gKiBAcGFyYW0ge3N0cmluZ30gdGl0bGUgLSB0aXRsZSBvZiB0aGUgbW9kYWxcclxuICogQHBhcmFtIHtzdHJpbmd9IGNvbnRlbnQgLSBhIHN0cmluZyBvZiB0ZXh0IHRvIGRpc3BsYXkgaW4gdGhlIG1vZGFsXHJcbiAqL1xyXG5CZEFwaS5hbGVydCA9IGZ1bmN0aW9uICh0aXRsZSwgY29udGVudCkge1xyXG4gICAgcmV0dXJuIFV0aWxzLnNob3dDb25maXJtYXRpb25Nb2RhbCh0aXRsZSwgY29udGVudCwge2NhbmNlbFRleHQ6IG51bGx9KTtcclxufTtcclxuXHJcbi8qKlxyXG4gKiBTaG93cyBhIGdlbmVyaWMgYnV0IHZlcnkgY3VzdG9taXphYmxlIGNvbmZpcm1hdGlvbiBtb2RhbCB3aXRoIG9wdGlvbmFsIGNvbmZpcm0gYW5kIGNhbmNlbCBjYWxsYmFja3MuXHJcbiAqIEBwYXJhbSB7c3RyaW5nfSB0aXRsZSAtIHRpdGxlIG9mIHRoZSBtb2RhbFxyXG4gKiBAcGFyYW0geyhzdHJpbmd8UmVhY3RFbGVtZW50fEFycmF5PHN0cmluZ3xSZWFjdEVsZW1lbnQ+KX0gY2hpbGRyZW4gLSBhIHNpbmdsZSBvciBtaXhlZCBhcnJheSBvZiByZWFjdCBlbGVtZW50cyBhbmQgc3RyaW5ncy4gRXZlcnkgc3RyaW5nIGlzIHdyYXBwZWQgaW4gRGlzY29yZCdzIGBNYXJrZG93bmAgY29tcG9uZW50IHNvIHN0cmluZ3Mgd2lsbCBzaG93IGFuZCByZW5kZXIgcHJvcGVybHkuXHJcbiAqIEBwYXJhbSB7b2JqZWN0fSBbb3B0aW9uc10gLSBvcHRpb25zIHRvIG1vZGlmeSB0aGUgbW9kYWxcclxuICogQHBhcmFtIHtib29sZWFufSBbb3B0aW9ucy5kYW5nZXI9ZmFsc2VdIC0gd2hldGhlciB0aGUgbWFpbiBidXR0b24gc2hvdWxkIGJlIHJlZCBvciBub3RcclxuICogQHBhcmFtIHtzdHJpbmd9IFtvcHRpb25zLmNvbmZpcm1UZXh0PU9rYXldIC0gdGV4dCBmb3IgdGhlIGNvbmZpcm1hdGlvbi9zdWJtaXQgYnV0dG9uXHJcbiAqIEBwYXJhbSB7c3RyaW5nfSBbb3B0aW9ucy5jYW5jZWxUZXh0PUNhbmNlbF0gLSB0ZXh0IGZvciB0aGUgY2FuY2VsIGJ1dHRvblxyXG4gKiBAcGFyYW0ge2NhbGxhYmxlfSBbb3B0aW9ucy5vbkNvbmZpcm09Tk9PUF0gLSBjYWxsYmFjayB0byBvY2N1ciB3aGVuIGNsaWNraW5nIHRoZSBzdWJtaXQgYnV0dG9uXHJcbiAqIEBwYXJhbSB7Y2FsbGFibGV9IFtvcHRpb25zLm9uQ2FuY2VsPU5PT1BdIC0gY2FsbGJhY2sgdG8gb2NjdXIgd2hlbiBjbGlja2luZyB0aGUgY2FuY2VsIGJ1dHRvblxyXG4gKiBAcGFyYW0ge3N0cmluZ30gW29wdGlvbnMua2V5XSAtIGtleSB1c2VkIHRvIGlkZW50aWZ5IHRoZSBtb2RhbC4gSWYgbm90IHByb3ZpZGVkLCBvbmUgaXMgZ2VuZXJhdGVkIGFuZCByZXR1cm5lZFxyXG4gKiBAcmV0dXJucyB7c3RyaW5nfSAtIHRoZSBrZXkgdXNlZCBmb3IgdGhpcyBtb2RhbFxyXG4gKi9cclxuQmRBcGkuc2hvd0NvbmZpcm1hdGlvbk1vZGFsID0gZnVuY3Rpb24gKHRpdGxlLCBjb250ZW50LCBvcHRpb25zID0ge30pIHtcclxuICAgIHJldHVybiBVdGlscy5zaG93Q29uZmlybWF0aW9uTW9kYWwodGl0bGUsIGNvbnRlbnQsIG9wdGlvbnMpO1xyXG59O1xyXG5cclxuLy9TaG93IHRvYXN0IGFsZXJ0XHJcbkJkQXBpLnNob3dUb2FzdCA9IGZ1bmN0aW9uKGNvbnRlbnQsIG9wdGlvbnMgPSB7fSkge1xyXG4gICAgVXRpbHMuc2hvd1RvYXN0KGNvbnRlbnQsIG9wdGlvbnMpO1xyXG59O1xyXG5cclxuLy8gRmluZHMgbW9kdWxlXHJcbkJkQXBpLmZpbmRNb2R1bGUgPSBmdW5jdGlvbihmaWx0ZXIpIHtcclxuICAgIHJldHVybiBCRFYyLldlYnBhY2tNb2R1bGVzLmZpbmQoZmlsdGVyKTtcclxufTtcclxuXHJcbi8vIEZpbmRzIG1vZHVsZVxyXG5CZEFwaS5maW5kQWxsTW9kdWxlcyA9IGZ1bmN0aW9uKGZpbHRlcikge1xyXG4gICAgcmV0dXJuIEJEVjIuV2VicGFja01vZHVsZXMuZmluZEFsbChmaWx0ZXIpO1xyXG59O1xyXG5cclxuLy8gRmluZHMgbW9kdWxlXHJcbkJkQXBpLmZpbmRNb2R1bGVCeVByb3BzID0gZnVuY3Rpb24oLi4ucHJvcHMpIHtcclxuICAgIHJldHVybiBCRFYyLldlYnBhY2tNb2R1bGVzLmZpbmRCeVVuaXF1ZVByb3BlcnRpZXMocHJvcHMpO1xyXG59O1xyXG5cclxuQmRBcGkuZmluZE1vZHVsZUJ5UHJvdG90eXBlcyA9IGZ1bmN0aW9uKC4uLnByb3Rvcykge1xyXG4gICAgcmV0dXJuIEJEVjIuV2VicGFja01vZHVsZXMuZmluZEJ5UHJvdG90eXBlcyhwcm90b3MpO1xyXG59O1xyXG5cclxuQmRBcGkuZmluZE1vZHVsZUJ5RGlzcGxheU5hbWUgPSBmdW5jdGlvbihuYW1lKSB7XHJcbiAgICByZXR1cm4gQkRWMi5XZWJwYWNrTW9kdWxlcy5maW5kQnlEaXNwbGF5TmFtZShuYW1lKTtcclxufTtcclxuXHJcbi8vIEdldHMgcmVhY3QgaW5zdGFuY2VcclxuQmRBcGkuZ2V0SW50ZXJuYWxJbnN0YW5jZSA9IGZ1bmN0aW9uKG5vZGUpIHtcclxuICAgIGlmICghKG5vZGUgaW5zdGFuY2VvZiB3aW5kb3cualF1ZXJ5KSAmJiAhKG5vZGUgaW5zdGFuY2VvZiBFbGVtZW50KSkgcmV0dXJuIHVuZGVmaW5lZDtcclxuICAgIGlmIChub2RlIGluc3RhbmNlb2YgalF1ZXJ5KSBub2RlID0gbm9kZVswXTtcclxuICAgIHJldHVybiBCRFYyLmdldEludGVybmFsSW5zdGFuY2Uobm9kZSk7XHJcbn07XHJcblxyXG4vLyBHZXRzIGRhdGFcclxuQmRBcGkubG9hZERhdGEgPSBmdW5jdGlvbihwbHVnaW5OYW1lLCBrZXkpIHtcclxuICAgIHJldHVybiBEYXRhU3RvcmUuZ2V0UGx1Z2luRGF0YShwbHVnaW5OYW1lLCBrZXkpO1xyXG59O1xyXG5cclxuQmRBcGkuZ2V0RGF0YSA9IEJkQXBpLmxvYWREYXRhO1xyXG5cclxuLy8gU2V0cyBkYXRhXHJcbkJkQXBpLnNhdmVEYXRhID0gZnVuY3Rpb24ocGx1Z2luTmFtZSwga2V5LCBkYXRhKSB7XHJcbiAgICByZXR1cm4gRGF0YVN0b3JlLnNldFBsdWdpbkRhdGEocGx1Z2luTmFtZSwga2V5LCBkYXRhKTtcclxufTtcclxuXHJcbkJkQXBpLnNldERhdGEgPSBCZEFwaS5zYXZlRGF0YTtcclxuXHJcbi8vIERlbGV0ZXMgZGF0YVxyXG5CZEFwaS5kZWxldGVEYXRhID0gZnVuY3Rpb24ocGx1Z2luTmFtZSwga2V5KSB7XHJcbiAgICByZXR1cm4gRGF0YVN0b3JlLmRlbGV0ZVBsdWdpbkRhdGEocGx1Z2luTmFtZSwga2V5KTtcclxufTtcclxuXHJcbi8vIFBhdGNoZXMgb3RoZXIgZnVuY3Rpb25zXHJcbkJkQXBpLm1vbmtleVBhdGNoID0gZnVuY3Rpb24od2hhdCwgbWV0aG9kTmFtZSwgb3B0aW9ucykge1xyXG4gICAgcmV0dXJuIFV0aWxzLm1vbmtleVBhdGNoKHdoYXQsIG1ldGhvZE5hbWUsIG9wdGlvbnMpO1xyXG59O1xyXG5cclxuLy8gRXZlbnQgd2hlbiBlbGVtZW50IGlzIHJlbW92ZWRcclxuQmRBcGkub25SZW1vdmVkID0gZnVuY3Rpb24obm9kZSwgY2FsbGJhY2spIHtcclxuICAgIHJldHVybiBVdGlscy5vblJlbW92ZWQobm9kZSwgY2FsbGJhY2spO1xyXG59O1xyXG5cclxuLy8gV3JhcHMgZnVuY3Rpb24gaW4gdHJ5Li5jYXRjaFxyXG5CZEFwaS5zdXBwcmVzc0Vycm9ycyA9IGZ1bmN0aW9uKG1ldGhvZCwgbWVzc2FnZSkge1xyXG4gICAgcmV0dXJuIFV0aWxzLnN1cHByZXNzRXJyb3JzKG1ldGhvZCwgbWVzc2FnZSk7XHJcbn07XHJcblxyXG4vLyBUZXN0cyBmb3IgdmFsaWQgSlNPTlxyXG5CZEFwaS50ZXN0SlNPTiA9IGZ1bmN0aW9uKGRhdGEpIHtcclxuICAgIHJldHVybiBVdGlscy50ZXN0SlNPTihkYXRhKTtcclxufTtcclxuXHJcbkJkQXBpLmlzUGx1Z2luRW5hYmxlZCA9IGZ1bmN0aW9uKG5hbWUpIHtcclxuICAgIHJldHVybiAhIXBsdWdpbkNvb2tpZVtuYW1lXTtcclxufTtcclxuXHJcbkJkQXBpLmlzVGhlbWVFbmFibGVkID0gZnVuY3Rpb24obmFtZSkge1xyXG4gICAgcmV0dXJuICEhdGhlbWVDb29raWVbbmFtZV07XHJcbn07XHJcblxyXG5CZEFwaS5pc1NldHRpbmdFbmFibGVkID0gZnVuY3Rpb24oaWQpIHtcclxuICAgIHJldHVybiAhIXNldHRpbmdzQ29va2llW2lkXTtcclxufTtcclxuXHJcbkJkQXBpLmVuYWJsZVNldHRpbmcgPSBmdW5jdGlvbihpZCkge1xyXG4gICAgcmV0dXJuIHNldHRpbmdzUGFuZWwub25DaGFuZ2UoaWQsIHRydWUpO1xyXG59O1xyXG5cclxuQmRBcGkuZGlzYWJsZVNldHRpbmcgPSBmdW5jdGlvbihpZCkge1xyXG4gICAgcmV0dXJuIHNldHRpbmdzUGFuZWwub25DaGFuZ2UoaWQsIGZhbHNlKTtcclxufTtcclxuXHJcbkJkQXBpLnRvZ2dsZVNldHRpbmcgPSBmdW5jdGlvbihpZCkge1xyXG4gICAgcmV0dXJuIHNldHRpbmdzUGFuZWwub25DaGFuZ2UoaWQsICFzZXR0aW5nc0Nvb2tpZVtpZF0pO1xyXG59O1xyXG5cclxuLy8gR2V0cyBkYXRhXHJcbkJkQXBpLmdldEJERGF0YSA9IGZ1bmN0aW9uKGtleSkge1xyXG4gICAgcmV0dXJuIERhdGFTdG9yZS5nZXRCRERhdGEoa2V5KTtcclxufTtcclxuXHJcbi8vIFNldHMgZGF0YVxyXG5CZEFwaS5zZXRCRERhdGEgPSBmdW5jdGlvbihrZXksIGRhdGEpIHtcclxuICAgIHJldHVybiBEYXRhU3RvcmUuc2V0QkREYXRhKGtleSwgZGF0YSk7XHJcbn07XHJcblxyXG5cclxuXHJcbmNvbnN0IG1ha2VBZGRvbkFQSSA9IChjb29raWUsIGxpc3QsIG1hbmFnZXIpID0+IG5ldyBjbGFzcyBBZGRvbkFQSSB7XHJcblxyXG4gICAgZ2V0IGZvbGRlcigpIHtyZXR1cm4gbWFuYWdlci5mb2xkZXI7fVxyXG5cclxuICAgIGlzRW5hYmxlZChuYW1lKSB7XHJcbiAgICAgICAgcmV0dXJuICEhY29va2llW25hbWVdO1xyXG4gICAgfVxyXG5cclxuICAgIGVuYWJsZShuYW1lKSB7XHJcbiAgICAgICAgcmV0dXJuIG1hbmFnZXIuZW5hYmxlKG5hbWUpO1xyXG4gICAgfVxyXG5cclxuICAgIGRpc2FibGUobmFtZSkge1xyXG4gICAgICAgIHJldHVybiBtYW5hZ2VyLmRpc2FibGUobmFtZSk7XHJcbiAgICB9XHJcblxyXG4gICAgdG9nZ2xlKG5hbWUpIHtcclxuICAgICAgICBpZiAoY29va2llW25hbWVdKSB0aGlzLmRpc2FibGUobmFtZSk7XHJcbiAgICAgICAgZWxzZSB0aGlzLmVuYWJsZShuYW1lKTtcclxuICAgIH1cclxuXHJcbiAgICByZWxvYWQobmFtZSkge1xyXG4gICAgICAgIHJldHVybiBtYW5hZ2VyLnJlbG9hZChuYW1lKTtcclxuICAgIH1cclxuXHJcbiAgICBnZXQobmFtZSkge1xyXG4gICAgICAgIGlmIChsaXN0Lmhhc093blByb3BlcnR5KG5hbWUpKSB7XHJcbiAgICAgICAgICAgIGlmIChsaXN0W25hbWVdLnBsdWdpbikgcmV0dXJuIGxpc3RbbmFtZV0ucGx1Z2luO1xyXG4gICAgICAgICAgICByZXR1cm4gbGlzdFtuYW1lXTtcclxuICAgICAgICB9XHJcbiAgICAgICAgcmV0dXJuIG51bGw7XHJcbiAgICB9XHJcblxyXG4gICAgZ2V0QWxsKCkge1xyXG4gICAgICAgIHJldHVybiBPYmplY3Qua2V5cyhsaXN0KS5tYXAoayA9PiB0aGlzLmdldChrKSkuZmlsdGVyKGEgPT4gYSk7XHJcbiAgICB9XHJcbn07XHJcblxyXG5CZEFwaS5QbHVnaW5zID0gbWFrZUFkZG9uQVBJKHBsdWdpbkNvb2tpZSwgYmRwbHVnaW5zLCBwbHVnaW5Nb2R1bGUpO1xyXG5CZEFwaS5UaGVtZXMgPSBtYWtlQWRkb25BUEkodGhlbWVDb29raWUsIGJkdGhlbWVzLCB0aGVtZU1vZHVsZSk7XHJcblxyXG5leHBvcnQgZGVmYXVsdCBCZEFwaTsiLCIvKiBCREV2ZW50cyAqL1xyXG5jb25zdCBFdmVudEVtaXR0ZXIgPSByZXF1aXJlKFwiZXZlbnRzXCIpO1xyXG5leHBvcnQgZGVmYXVsdCBuZXcgY2xhc3MgQkRFdmVudHMgZXh0ZW5kcyBFdmVudEVtaXR0ZXIge1xyXG4gICAgZGlzcGF0Y2goZXZlbnROYW1lLCAuLi5hcmdzKSB7dGhpcy5lbWl0KGV2ZW50TmFtZSwgLi4uYXJncyk7fVxyXG4gICAgb2ZmKGV2ZW50TmFtZSwgZXZlbnRBY3Rpb24pIHt0aGlzLnJlbW92ZUxpc3RlbmVyKGV2ZW50TmFtZSwgZXZlbnRBY3Rpb24pO31cclxufTsiLCIvKipcclxuICogQ3JlZGl0cyB0byBAaGVsbGJvdW5kMTMzNyBvbiBnaXRodWIgZm9yIHRoZSBjc3NcclxuICovXHJcblxyXG5pbXBvcnQgRE9NVG9vbHMgZnJvbSBcIi4vZG9tdG9vbHNcIlxyXG5pbXBvcnQgVXRpbHMgZnJvbSBcIi4vdXRpbHNcIlxyXG5cclxubGV0IHNlbGVjdG9yc1xyXG5jb25zdCByZW1vdmVEYSA9IFV0aWxzLnJlbW92ZURhXHJcbmZ1bmN0aW9uIGdldFNlbGVjdG9ycygpe1xyXG4gICAgbGV0IHN0YW5kYXJkU2lkZWJhclZpZXcgPSBCRE1vZHVsZXMuZ2V0KGUgPT4gZS5zdGFuZGFyZFNpZGViYXJWaWV3KVswXVxyXG4gICAgaWYoIXN0YW5kYXJkU2lkZWJhclZpZXcpcmV0dXJuIG51bGxcclxuICAgIGxldCBkZWZhdWx0Q2xhc3NOYW1lID0gcmVtb3ZlRGEoc3RhbmRhcmRTaWRlYmFyVmlldy5zdGFuZGFyZFNpZGViYXJWaWV3KVxyXG4gICAgbGV0IHNlbGVjdHMgPSBbXVxyXG4gICAgc2VsZWN0cy5wdXNoKGAjYXBwLW1vdW50IC4ke2RlZmF1bHRDbGFzc05hbWV9IC5wYXltZW50LWluZm8gLiR7cmVtb3ZlRGEoQkRNb2R1bGVzLmdldChlID0+IGUuZGVzY3JpcHRpb24gJiYgdHlwZW9mIGUuZGVzY3JpcHRpb24gPT09IFwic3RyaW5nXCIgJiYgZS5kZXNjcmlwdGlvbi5pbmNsdWRlcyhcImZvcm1UZXh0XCIpKVswXS5kZXNjcmlwdGlvbil9YClcclxuICAgIHNlbGVjdHMucHVzaChgI2FwcC1tb3VudCAuJHtkZWZhdWx0Q2xhc3NOYW1lfSAuJHtyZW1vdmVEYShCRE1vZHVsZXMuZ2V0KGUgPT4gZS5wYXltZW50U291cmNlUm93KVswXS5wYXltZW50U291cmNlUm93KX0gLiR7cmVtb3ZlRGEoQkRNb2R1bGVzLmdldChlID0+IGUuc3ViVGV4dCAmJiBlLmRlc2NyaXB0aW9uV3JhcHBlcilbMF0uc3ViVGV4dCl9YClcclxuICAgIHNlbGVjdHMucHVzaChgI2FwcC1tb3VudCAuJHtkZWZhdWx0Q2xhc3NOYW1lfSAuJHtyZW1vdmVEYShCRE1vZHVsZXMuZ2V0KGUgPT4gZS51c2VyU2V0dGluZ3NBY2NvdW50KVswXS51c2VyU2V0dGluZ3NBY2NvdW50KX0gZGl2Om50aC1jaGlsZCgyKT5kaXY6bnRoLWNoaWxkKDIpPi4ke3JlbW92ZURhKEJETW9kdWxlcy5nZXQoZSA9PiBlLnZpZXdCb2R5KVswXS52aWV3Qm9keSl9YClcclxuICAgIHJldHVybiBzZWxlY3RzXHJcbn1cclxuXHJcbmV4cG9ydCBkZWZhdWx0IG5ldyBjbGFzcyBCbHVyUHJpdmF0ZSB7XHJcbiAgICBjb25zdHJ1Y3Rvcigpe1xyXG4gICAgICAgIHRoaXMuZW5hYmxlZCA9IGZhbHNlXHJcbiAgICB9XHJcblxyXG4gICAgZW5hYmxlKCl7XHJcbiAgICAgICAgaWYodGhpcy5lbmFibGVkKXJldHVyblxyXG4gICAgICAgIHRoaXMuZW5hYmxlZCA9IHRydWVcclxuICAgICAgICBzZWxlY3RvcnMgPSBzZWxlY3RvcnMgfHwgZ2V0U2VsZWN0b3JzKClcclxuXHJcbiAgICAgICAgaWYoIXNlbGVjdG9ycyljb25zb2xlLmVycm9yKG5ldyBFcnJvcihcIkNvdWxkbid0IGZpbmQgc2VsZWN0b3JzIHRvIGJsdXIgcGVyc29ubmFsIGluZm9ybWF0aW9ucy5cIikpXHJcbiAgICAgICAgRE9NVG9vbHMuYWRkU3R5bGUoXCJibHVyUHJpdmF0ZVwiLCBgXHJcbiR7c2VsZWN0b3JzWzBdfSwgJHtzZWxlY3RvcnNbMV19LCAke3NlbGVjdG9yc1syXX0ge1xyXG4gICAgdHJhbnNpdGlvbjogYWxsIDE1MG1zIGN1YmljLWJlemllciguNTUsLjA4NSwuNjgsLjUzKTtcclxuICAgIGZpbHRlcjogYmx1cig0cHgpO1xyXG4gICAgb3BhY2l0eTogLjg7XHJcbn1cclxuXHJcbiR7c2VsZWN0b3JzWzBdfTpob3ZlciwgJHtzZWxlY3RvcnNbMV19OmhvdmVyLCAke3NlbGVjdG9yc1syXX06aG92ZXIge1xyXG4gICAgdHJhbnNpdGlvbjogYWxsIDE1MG1zIGN1YmljLWJlemllciguNTUsLjA5LC42OCwuNTMpO1xyXG4gICAgZmlsdGVyOiBub25lO1xyXG4gICAgb3BhY2l0eTogMTtcclxufWApXHJcbiAgICB9XHJcblxyXG4gICAgZGlzYWJsZSgpe1xyXG4gICAgICAgIGlmKCF0aGlzLmVuYWJsZWQpcmV0dXJuXHJcbiAgICAgICAgdGhpcy5lbmFibGVkID0gZmFsc2VcclxuICAgICAgICBET01Ub29scy5yZW1vdmVTdHlsZShcImJsdXJQcml2YXRlXCIpXHJcbiAgICB9XHJcbn0iLCJpbXBvcnQgV2VicGFja01vZHVsZXMgZnJvbSBcIi4vd2VicGFja01vZHVsZXNcIjtcclxuXHJcbmNvbnN0IG5vcm1hbGl6ZWRQcmVmaXggPSBcImRhXCI7XHJcbmNvbnN0IHJhbmRDbGFzcyA9IG5ldyBSZWdFeHAoYF4oPyEke25vcm1hbGl6ZWRQcmVmaXh9LSkoKD86W0EtWmEtel18WzAtOV18LSkrKS0oPzpbQS1aYS16XXxbMC05XXwtfF8pezZ9JGApO1xyXG5cclxuZXhwb3J0IGRlZmF1bHQgbmV3IGNsYXNzIENsYXNzTm9ybWFsaXplciB7XHJcblxyXG4gICAgc3RvcCgpIHtcclxuICAgICAgICBpZiAoIXRoaXMuaGFzUGF0Y2hlZCkgcmV0dXJuO1xyXG4gICAgICAgIHRoaXMudW5wYXRjaENsYXNzTW9kdWxlcyhXZWJwYWNrTW9kdWxlcy5maW5kQWxsKHRoaXMubW9kdWxlRmlsdGVyLmJpbmQodGhpcykpKTtcclxuICAgICAgICB0aGlzLnJldmVydEVsZW1lbnQoZG9jdW1lbnQucXVlcnlTZWxlY3RvcihcIiNhcHAtbW91bnRcIikpO1xyXG4gICAgICAgIHRoaXMuaGFzUGF0Y2hlZCA9IGZhbHNlO1xyXG4gICAgfVxyXG5cclxuICAgIHN0YXJ0KCkge1xyXG4gICAgICAgIGlmICh0aGlzLmhhc1BhdGNoZWQpIHJldHVybjtcclxuICAgICAgICB0aGlzLnBhdGNoQ2xhc3NNb2R1bGVzKFdlYnBhY2tNb2R1bGVzLmZpbmRBbGwodGhpcy5tb2R1bGVGaWx0ZXIuYmluZCh0aGlzKSkpO1xyXG4gICAgICAgIHRoaXMubm9ybWFsaXplRWxlbWVudChkb2N1bWVudC5xdWVyeVNlbGVjdG9yKFwiI2FwcC1tb3VudFwiKSk7XHJcbiAgICAgICAgdGhpcy5oYXNQYXRjaGVkID0gdHJ1ZTtcclxuICAgICAgICB0aGlzLnBhdGNoRE9NTWV0aG9kcygpO1xyXG4gICAgfVxyXG5cclxuICAgIHBhdGNoQ2xhc3NNb2R1bGVzKG1vZHVsZXMpIHtcclxuICAgICAgICBmb3IgKGNvbnN0IG1vZHVsZSBvZiBtb2R1bGVzKSB7XHJcbiAgICAgICAgICAgIHRoaXMucGF0Y2hDbGFzc01vZHVsZShub3JtYWxpemVkUHJlZml4LCBtb2R1bGUpO1xyXG4gICAgICAgIH1cclxuICAgIH1cclxuXHJcbiAgICB1bnBhdGNoQ2xhc3NNb2R1bGVzKG1vZHVsZXMpIHtcclxuICAgICAgICBmb3IgKGNvbnN0IG1vZHVsZSBvZiBtb2R1bGVzKSB7XHJcbiAgICAgICAgICAgIHRoaXMudW5wYXRjaENsYXNzTW9kdWxlKG5vcm1hbGl6ZWRQcmVmaXgsIG1vZHVsZSk7XHJcbiAgICAgICAgfVxyXG4gICAgfVxyXG5cclxuICAgIHNob3VsZElnbm9yZSh2YWx1ZSkge1xyXG4gICAgICAgIGlmICghaXNOYU4odmFsdWUpKSByZXR1cm4gdHJ1ZTtcclxuICAgICAgICBpZiAodmFsdWUuZW5kc1dpdGgoXCJweFwiKSB8fCB2YWx1ZS5lbmRzV2l0aChcImNoXCIpIHx8IHZhbHVlLmVuZHNXaXRoKFwiZW1cIikgfHwgdmFsdWUuZW5kc1dpdGgoXCJtc1wiKSkgcmV0dXJuIHRydWU7XHJcbiAgICAgICAgaWYgKHZhbHVlLnN0YXJ0c1dpdGgoXCJsYXllckNvbnRhaW5lci1cIikpIHJldHVybiB0cnVlO1xyXG4gICAgICAgIGlmICh2YWx1ZS5zdGFydHNXaXRoKFwiI1wiKSAmJiAodmFsdWUubGVuZ3RoID09IDcgfHwgdmFsdWUubGVuZ3RoID09IDQpKSByZXR1cm4gdHJ1ZTtcclxuICAgICAgICBpZiAodmFsdWUuaW5jbHVkZXMoXCJjYWxjKFwiKSB8fCB2YWx1ZS5pbmNsdWRlcyhcInJnYmFcIikpIHJldHVybiB0cnVlO1xyXG4gICAgICAgIHJldHVybiBmYWxzZTtcclxuICAgIH1cclxuXHJcbiAgICBtb2R1bGVGaWx0ZXIobW9kdWxlKSB7XHJcbiAgICAgICAgaWYgKHR5cGVvZiBtb2R1bGUgIT09IFwib2JqZWN0XCIgfHwgQXJyYXkuaXNBcnJheShtb2R1bGUpKSByZXR1cm4gZmFsc2U7XHJcbiAgICAgICAgaWYgKG1vZHVsZS5fX2VzTW9kdWxlKSByZXR1cm4gZmFsc2U7XHJcbiAgICAgICAgaWYgKCFPYmplY3Qua2V5cyhtb2R1bGUpLmxlbmd0aCkgcmV0dXJuIGZhbHNlO1xyXG4gICAgICAgIGZvciAoY29uc3QgYmFzZUNsYXNzTmFtZSBpbiBtb2R1bGUpIHtcclxuICAgICAgICAgICAgY29uc3QgdmFsdWUgPSBtb2R1bGVbYmFzZUNsYXNzTmFtZV07XHJcbiAgICAgICAgICAgIGlmICh0eXBlb2YgdmFsdWUgIT09IFwic3RyaW5nXCIpIHJldHVybiBmYWxzZTtcclxuICAgICAgICAgICAgaWYgKHRoaXMuc2hvdWxkSWdub3JlKHZhbHVlKSkgY29udGludWU7XHJcbiAgICAgICAgICAgIGlmICh2YWx1ZS5zcGxpdChcIi1cIikubGVuZ3RoID09PSAxKSByZXR1cm4gZmFsc2U7XHJcbiAgICAgICAgICAgIGlmICghcmFuZENsYXNzLnRlc3QodmFsdWUuc3BsaXQoXCIgXCIpWzBdKSkgcmV0dXJuIGZhbHNlO1xyXG4gICAgICAgIH1cclxuXHJcbiAgICAgICAgcmV0dXJuIHRydWU7XHJcbiAgICB9XHJcblxyXG4gICAgcGF0Y2hDbGFzc01vZHVsZShjb21wb25lbnROYW1lLCBjbGFzc05hbWVzKSB7XHJcbiAgICAgICAgZm9yIChjb25zdCBiYXNlQ2xhc3NOYW1lIGluIGNsYXNzTmFtZXMpIHtcclxuICAgICAgICAgICAgY29uc3QgdmFsdWUgPSBjbGFzc05hbWVzW2Jhc2VDbGFzc05hbWVdO1xyXG4gICAgICAgICAgICBpZiAodGhpcy5zaG91bGRJZ25vcmUodmFsdWUpKSBjb250aW51ZTtcclxuICAgICAgICAgICAgY29uc3QgY2xhc3NMaXN0ID0gdmFsdWUuc3BsaXQoXCIgXCIpO1xyXG4gICAgICAgICAgICBmb3IgKGNvbnN0IG5vcm1hbENsYXNzIG9mIGNsYXNzTGlzdCkge1xyXG4gICAgICAgICAgICAgICAgY29uc3QgbWF0Y2ggPSBub3JtYWxDbGFzcy5tYXRjaChyYW5kQ2xhc3MpO1xyXG4gICAgICAgICAgICAgICAgaWYgKCFtYXRjaCB8fCAhbWF0Y2gubGVuZ3RoIHx8IG1hdGNoLmxlbmd0aCA8IDIpIGNvbnRpbnVlOyAvLyBTaG91bGRuJ3QgZXZlciBoYXBwZW4gc2luY2UgdGhleSBwYXNzZWQgdGhlIG1vZHVsZUZpbHRlciwgYnV0IHlvdSBuZXZlciBrbm93XHJcbiAgICAgICAgICAgICAgICBjb25zdCBjYW1lbENhc2UgPSBtYXRjaFsxXS5zcGxpdChcIi1cIikubWFwKChzLCBpKSA9PiBpID8gc1swXS50b1VwcGVyQ2FzZSgpICsgcy5zbGljZSgxKSA6IHMpLmpvaW4oXCJcIik7XHJcbiAgICAgICAgICAgICAgICBjbGFzc05hbWVzW2Jhc2VDbGFzc05hbWVdICs9IGAgJHtjb21wb25lbnROYW1lfS0ke2NhbWVsQ2FzZX1gO1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgfVxyXG4gICAgfVxyXG5cclxuICAgIHVucGF0Y2hDbGFzc01vZHVsZShjb21wb25lbnROYW1lLCBjbGFzc05hbWVzKSB7XHJcbiAgICAgICAgZm9yIChjb25zdCBiYXNlQ2xhc3NOYW1lIGluIGNsYXNzTmFtZXMpIHtcclxuICAgICAgICAgICAgY29uc3QgdmFsdWUgPSBjbGFzc05hbWVzW2Jhc2VDbGFzc05hbWVdO1xyXG4gICAgICAgICAgICBpZiAodGhpcy5zaG91bGRJZ25vcmUodmFsdWUpKSBjb250aW51ZTtcclxuICAgICAgICAgICAgbGV0IG5ld1N0cmluZyA9IFwiXCI7XHJcbiAgICAgICAgICAgIGNvbnN0IGNsYXNzTGlzdCA9IHZhbHVlLnNwbGl0KFwiIFwiKTtcclxuICAgICAgICAgICAgZm9yIChjb25zdCBub3JtYWxDbGFzcyBvZiBjbGFzc0xpc3QpIHtcclxuICAgICAgICAgICAgICAgIGlmIChub3JtYWxDbGFzcy5zdGFydHNXaXRoKGAke2NvbXBvbmVudE5hbWV9LWApKSBjb250aW51ZTtcclxuICAgICAgICAgICAgICAgIG5ld1N0cmluZyArPSBgICR7bm9ybWFsQ2xhc3N9YDtcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICBjbGFzc05hbWVzW2Jhc2VDbGFzc05hbWVdID0gbmV3U3RyaW5nLnRyaW0oKTtcclxuICAgICAgICB9XHJcbiAgICB9XHJcblxyXG4gICAgbm9ybWFsaXplRWxlbWVudChlbGVtZW50KSB7XHJcbiAgICAgICAgaWYgKCEoZWxlbWVudCBpbnN0YW5jZW9mIEVsZW1lbnQpKSByZXR1cm47XHJcbiAgICAgICAgY29uc3QgY2xhc3NlcyA9IGVsZW1lbnQuY2xhc3NMaXN0O1xyXG4gICAgICAgIGZvciAobGV0IGMgPSAwLCBjbGVuID0gY2xhc3Nlcy5sZW5ndGg7IGMgPCBjbGVuOyBjKyspIHtcclxuICAgICAgICAgICAgaWYgKCFyYW5kQ2xhc3MudGVzdChjbGFzc2VzW2NdKSkgY29udGludWU7XHJcbiAgICAgICAgICAgIGNvbnN0IG1hdGNoID0gY2xhc3Nlc1tjXS5tYXRjaChyYW5kQ2xhc3MpWzFdO1xyXG4gICAgICAgICAgICBjb25zdCBuZXdDbGFzcyA9IG1hdGNoLnNwbGl0KFwiLVwiKS5tYXAoKHMsIGkpID0+IGkgPyBzWzBdLnRvVXBwZXJDYXNlKCkgKyBzLnNsaWNlKDEpIDogcykuam9pbihcIlwiKTtcclxuICAgICAgICAgICAgZWxlbWVudC5jbGFzc0xpc3QuYWRkKGAke25vcm1hbGl6ZWRQcmVmaXh9LSR7bmV3Q2xhc3N9YCk7XHJcbiAgICAgICAgfVxyXG4gICAgICAgIGZvciAoY29uc3QgY2hpbGQgb2YgZWxlbWVudC5jaGlsZHJlbikgdGhpcy5ub3JtYWxpemVFbGVtZW50KGNoaWxkKTtcclxuICAgIH1cclxuXHJcbiAgICByZXZlcnRFbGVtZW50KGVsZW1lbnQpIHtcclxuICAgICAgICBpZiAoIShlbGVtZW50IGluc3RhbmNlb2YgRWxlbWVudCkpIHJldHVybjtcclxuICAgICAgICBpZiAoZWxlbWVudC5jaGlsZHJlbiAmJiBlbGVtZW50LmNoaWxkcmVuLmxlbmd0aCkgdGhpcy5yZXZlcnRFbGVtZW50KGVsZW1lbnQuY2hpbGRyZW5bMF0pO1xyXG4gICAgICAgIGlmIChlbGVtZW50Lm5leHRFbGVtZW50U2libGluZykgdGhpcy5yZXZlcnRFbGVtZW50KGVsZW1lbnQubmV4dEVsZW1lbnRTaWJsaW5nKTtcclxuICAgICAgICBjb25zdCBjbGFzc2VzID0gZWxlbWVudC5jbGFzc0xpc3Q7XHJcbiAgICAgICAgY29uc3QgdG9SZW1vdmUgPSBbXTtcclxuICAgICAgICBmb3IgKGxldCBjID0gMDsgYyA8IGNsYXNzZXMubGVuZ3RoOyBjKyspIHtcclxuICAgICAgICAgICAgaWYgKGNsYXNzZXNbY10uc3RhcnRzV2l0aChgJHtub3JtYWxpemVkUHJlZml4fS1gKSkgdG9SZW1vdmUucHVzaChjbGFzc2VzW2NdKTtcclxuICAgICAgICB9XHJcbiAgICAgICAgZWxlbWVudC5jbGFzc0xpc3QucmVtb3ZlKC4uLnRvUmVtb3ZlKTtcclxuICAgIH1cclxuXHJcbiAgICBwYXRjaERPTU1ldGhvZHMoKSB7XHJcbiAgICAgICAgY29uc3QgY29udGFpbnMgPSBET01Ub2tlbkxpc3QucHJvdG90eXBlLmNvbnRhaW5zO1xyXG4gICAgICAgIERPTVRva2VuTGlzdC5wcm90b3R5cGUuY29udGFpbnMgPSBmdW5jdGlvbih0b2tlbikge1xyXG4gICAgICAgICAgICAvLyBjb25zdCB0b2tlbnMgPSB0b2tlbi5zcGxpdChcIiBcIik7XHJcbiAgICAgICAgICAgIHJldHVybiBSZWZsZWN0LmFwcGx5KGNvbnRhaW5zLCB0aGlzLCBbdG9rZW4uc3BsaXQoXCIgXCIpWzBdXSk7XHJcbiAgICAgICAgICAgIC8vIHJldHVybiB0b2tlbnMuZXZlcnkodCA9PiBjb250YWlucy5jYWxsKHRoaXMsIHQpKTtcclxuICAgICAgICB9O1xyXG5cclxuICAgICAgICBjb25zdCBhZGQgPSBET01Ub2tlbkxpc3QucHJvdG90eXBlLmFkZDtcclxuICAgICAgICBET01Ub2tlbkxpc3QucHJvdG90eXBlLmFkZCA9IGZ1bmN0aW9uKC4uLnRva2Vucykge1xyXG4gICAgICAgICAgICBmb3IgKGxldCB0ID0gMDsgdCA8IHRva2Vucy5sZW5ndGg7IHQrKykge1xyXG4gICAgICAgICAgICAgICAgdG9rZW5zW3RdID0gdG9rZW5zW3RdLnNwbGl0KFwiIFwiKVswXTtcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICByZXR1cm4gUmVmbGVjdC5hcHBseShhZGQsIHRoaXMsIHRva2Vucyk7XHJcbiAgICAgICAgfTtcclxuXHJcbiAgICAgICAgY29uc3QgcmVtb3ZlID0gRE9NVG9rZW5MaXN0LnByb3RvdHlwZS5yZW1vdmU7XHJcbiAgICAgICAgRE9NVG9rZW5MaXN0LnByb3RvdHlwZS5yZW1vdmUgPSBmdW5jdGlvbiguLi50b2tlbnMpIHtcclxuICAgICAgICAgICAgZm9yIChsZXQgdCA9IDA7IHQgPCB0b2tlbnMubGVuZ3RoOyB0KyspIHtcclxuICAgICAgICAgICAgICAgIHRva2Vuc1t0XSA9IHRva2Vuc1t0XS5zcGxpdChcIiBcIilbMF07XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgcmV0dXJuIFJlZmxlY3QuYXBwbHkocmVtb3ZlLCB0aGlzLCB0b2tlbnMpO1xyXG4gICAgICAgIH07XHJcbiAgICB9XHJcblxyXG59OyIsImltcG9ydCB7c2V0dGluZ3NDb29raWV9IGZyb20gXCIuLi8wZ2xvYmFsc1wiO1xyXG5pbXBvcnQgQkRWMiBmcm9tIFwiLi92MlwiO1xyXG5pbXBvcnQgVXRpbHMgZnJvbSBcIi4vdXRpbHNcIjtcclxuXHJcbmV4cG9ydCBkZWZhdWx0IG5ldyBjbGFzcyBDb2xvcmVkVGV4dCB7XHJcbiAgICBpbmplY3RDb2xvcmVkVGV4dCgpIHtcclxuICAgICAgICBpZiAodGhpcy5jYW5jZWxDb2xvcmVkVGV4dCkgcmV0dXJuO1xyXG4gICAgICAgIGlmICghQkRWMi5NZXNzYWdlQ29tcG9uZW50KSByZXR1cm47XHJcblxyXG4gICAgICAgIHRoaXMuY2FuY2VsQ29sb3JlZFRleHQgPSBVdGlscy5tb25rZXlQYXRjaChCRFYyLk1lc3NhZ2VDb21wb25lbnQsIFwiZGVmYXVsdFwiLCB7YmVmb3JlOiAoZGF0YSkgPT4ge1xyXG4gICAgICAgICAgICBjb25zdCBwcm9wcyA9IGRhdGEubWV0aG9kQXJndW1lbnRzWzBdO1xyXG4gICAgICAgICAgICBpZiAoIXByb3BzIHx8ICFwcm9wcy5jaGlsZHJlbk1lc3NhZ2VDb250ZW50KSByZXR1cm47XHJcbiAgICAgICAgICAgIGNvbnN0IG1lc3NhZ2VDb250ZW50ID0gcHJvcHMuY2hpbGRyZW5NZXNzYWdlQ29udGVudDtcclxuXHJcbiAgICAgICAgICAgIGlmICghbWVzc2FnZUNvbnRlbnQudHlwZSB8fCAhbWVzc2FnZUNvbnRlbnQudHlwZS50eXBlIHx8IG1lc3NhZ2VDb250ZW50LnR5cGUudHlwZS5kaXNwbGF5TmFtZSAhPSBcIk1lc3NhZ2VDb250ZW50XCIpIHJldHVybjtcclxuICAgICAgICAgICAgY29uc3Qgb3JpZ2luYWxUeXBlID0gbWVzc2FnZUNvbnRlbnQudHlwZS50eXBlO1xyXG4gICAgICAgICAgICBpZiAob3JpZ2luYWxUeXBlLl9fb3JpZ2luYWxNZXRob2QpIHJldHVybjsgLy8gRG9uJ3QgcGF0Y2ggYWdhaW5cclxuICAgICAgICAgICAgbWVzc2FnZUNvbnRlbnQudHlwZS50eXBlID0gZnVuY3Rpb24ocHJvcHMpIHtcclxuICAgICAgICAgICAgICAgIGNvbnN0IHJldHVyblZhbHVlID0gb3JpZ2luYWxUeXBlKHByb3BzKTtcclxuICAgICAgICAgICAgICAgIGNvbnN0IHJvbGVDb2xvciA9IHNldHRpbmdzQ29va2llW1wiYmRhLWdzLTdcIl0gPyBwcm9wcy5tZXNzYWdlLmNvbG9yU3RyaW5nIHx8IFwiXCIgOiBcIlwiO1xyXG4gICAgICAgICAgICAgICAgcmV0dXJuVmFsdWUucHJvcHMuc3R5bGUgPSB7Y29sb3I6IHJvbGVDb2xvcn07XHJcbiAgICAgICAgICAgICAgICByZXR1cm4gcmV0dXJuVmFsdWU7XHJcbiAgICAgICAgICAgIH07XHJcblxyXG4gICAgICAgICAgICBtZXNzYWdlQ29udGVudC50eXBlLnR5cGUuX19vcmlnaW5hbE1ldGhvZCA9IG9yaWdpbmFsVHlwZTtcclxuICAgICAgICAgICAgT2JqZWN0LmFzc2lnbihtZXNzYWdlQ29udGVudC50eXBlLnR5cGUsIG9yaWdpbmFsVHlwZSk7XHJcbiAgICAgICAgfX0pO1xyXG4gICAgfVxyXG5cclxuICAgIHJlbW92ZUNvbG9yZWRUZXh0KCkge1xyXG4gICAgICAgIGxldCBjbGFzc05hbWVNYXJrdXAgPSBCRE1vZHVsZXMuZ2V0KGUgPT4gZS5tYXJrdXApWzBdLm1hcmt1cFxyXG4gICAgICAgIGRvY3VtZW50LnF1ZXJ5U2VsZWN0b3JBbGwoXCIuXCIrY2xhc3NOYW1lTWFya3VwLnNwbGl0KFwiIFwiKVswXSkuZm9yRWFjaChlbGVtID0+IHtcclxuICAgICAgICAgICAgZWxlbS5zdHlsZS5zZXRQcm9wZXJ0eShcImNvbG9yXCIsIFwiXCIpO1xyXG4gICAgICAgIH0pO1xyXG4gICAgfVxyXG59OyIsImltcG9ydCB7YmRDb25maWcsIGJkcGx1Z2lucywgYmR0aGVtZXN9IGZyb20gXCIuLi8wZ2xvYmFsc1wiO1xyXG5pbXBvcnQgcGx1Z2luTW9kdWxlIGZyb20gXCIuL3BsdWdpbk1vZHVsZVwiO1xyXG5pbXBvcnQgdGhlbWVNb2R1bGUgZnJvbSBcIi4vdGhlbWVNb2R1bGVcIjtcclxuaW1wb3J0IFV0aWxzIGZyb20gXCIuL3V0aWxzXCI7XHJcbmltcG9ydCAqIGFzIGNyeXB0byBmcm9tIFwiY3J5cHRvXCJcclxuXHJcbmNvbnN0IHBhdGggPSByZXF1aXJlKFwicGF0aFwiKTtcclxuY29uc3QgZnMgPSByZXF1aXJlKFwiZnNcIik7XHJcbmNvbnN0IE1vZHVsZSA9IHJlcXVpcmUoXCJtb2R1bGVcIikuTW9kdWxlO1xyXG5Nb2R1bGUuZ2xvYmFsUGF0aHMucHVzaChwYXRoLnJlc29sdmUocmVxdWlyZShcImVsZWN0cm9uXCIpLnJlbW90ZS5hcHAuZ2V0QXBwUGF0aCgpLCBcIm5vZGVfbW9kdWxlc1wiKSk7XHJcbmNsYXNzIE1ldGFFcnJvciBleHRlbmRzIEVycm9yIHtcclxuICAgIGNvbnN0cnVjdG9yKG1lc3NhZ2UpIHtcclxuICAgICAgICBzdXBlcihtZXNzYWdlKTtcclxuICAgICAgICB0aGlzLm5hbWUgPSBcIk1ldGFFcnJvclwiO1xyXG4gICAgfVxyXG59XHJcbmNvbnN0IG9yaWdpbmFsSlNSZXF1aXJlID0gTW9kdWxlLl9leHRlbnNpb25zW1wiLmpzXCJdO1xyXG5jb25zdCBvcmlnaW5hbENTU1JlcXVpcmUgPSBNb2R1bGUuX2V4dGVuc2lvbnNbXCIuY3NzXCJdID8gTW9kdWxlLl9leHRlbnNpb25zW1wiLmNzc1wiXSA6ICgpID0+IHtyZXR1cm4gbnVsbDt9O1xyXG5jb25zdCBzcGxpdFJlZ2V4ID0gL1teXFxTXFxyXFxuXSo/KD86XFxyXFxufFxcbilbXlxcU1xcclxcbl0qP1xcKlteXFxTXFxyXFxuXT8vO1xyXG5jb25zdCBlc2NhcGVkQXRSZWdleCA9IC9eXFxcXEAvO1xyXG5cclxuXHJcbmV4cG9ydCBkZWZhdWx0IG5ldyBjbGFzcyBDb250ZW50TWFuYWdlciB7XHJcblxyXG4gICAgY29uc3RydWN0b3IoKSB7XHJcbiAgICAgICAgdGhpcy50aW1lQ2FjaGUgPSB7fTtcclxuICAgICAgICB0aGlzLndhdGNoZXJzID0ge307XHJcbiAgICAgICAgTW9kdWxlLl9leHRlbnNpb25zW1wiLmpzXCJdID0gdGhpcy5nZXRDb250ZW50UmVxdWlyZShcInBsdWdpblwiKTtcclxuICAgICAgICBNb2R1bGUuX2V4dGVuc2lvbnNbXCIuY3NzXCJdID0gdGhpcy5nZXRDb250ZW50UmVxdWlyZShcInRoZW1lXCIpO1xyXG4gICAgfVxyXG5cclxuICAgIGdldCBwbHVnaW5zRm9sZGVyKCkge3JldHVybiB0aGlzLl9wbHVnaW5zRm9sZGVyIHx8ICh0aGlzLl9wbHVnaW5zRm9sZGVyID0gZnMucmVhbHBhdGhTeW5jKHBhdGgucmVzb2x2ZShiZENvbmZpZy5kYXRhUGF0aCArIFwicGx1Z2lucy9cIikpKTt9XHJcbiAgICBnZXQgdGhlbWVzRm9sZGVyKCkge3JldHVybiB0aGlzLl90aGVtZXNGb2xkZXIgfHwgKHRoaXMuX3RoZW1lc0ZvbGRlciA9IGZzLnJlYWxwYXRoU3luYyhwYXRoLnJlc29sdmUoYmRDb25maWcuZGF0YVBhdGggKyBcInRoZW1lcy9cIikpKTt9XHJcblxyXG4gICAgd2F0Y2hDb250ZW50KGNvbnRlbnRUeXBlKSB7XHJcbiAgICAgICAgaWYgKHRoaXMud2F0Y2hlcnNbY29udGVudFR5cGVdKSByZXR1cm47XHJcbiAgICAgICAgY29uc3QgaXNQbHVnaW4gPSBjb250ZW50VHlwZSA9PT0gXCJwbHVnaW5cIjtcclxuICAgICAgICBjb25zdCBiYXNlRm9sZGVyID0gaXNQbHVnaW4gPyB0aGlzLnBsdWdpbnNGb2xkZXIgOiB0aGlzLnRoZW1lc0ZvbGRlcjtcclxuICAgICAgICBjb25zdCBmaWxlRW5kaW5nID0gaXNQbHVnaW4gPyBcIi5wbHVnaW4uanNcIiA6IFwiLnRoZW1lLmNzc1wiO1xyXG4gICAgICAgIHRoaXMud2F0Y2hlcnNbY29udGVudFR5cGVdID0gZnMud2F0Y2goYmFzZUZvbGRlciwge3BlcnNpc3RlbnQ6IGZhbHNlfSwgYXN5bmMgKGV2ZW50VHlwZSwgZmlsZW5hbWUpID0+IHtcclxuICAgICAgICAgICAgaWYgKCFldmVudFR5cGUgfHwgIWZpbGVuYW1lIHx8ICFmaWxlbmFtZS5lbmRzV2l0aChmaWxlRW5kaW5nKSkgcmV0dXJuO1xyXG4gICAgICAgICAgICBhd2FpdCBuZXcgUHJvbWlzZShyID0+IHNldFRpbWVvdXQociwgNTApKTtcclxuICAgICAgICAgICAgdHJ5IHtmcy5zdGF0U3luYyhwYXRoLnJlc29sdmUoYmFzZUZvbGRlciwgZmlsZW5hbWUpKTt9XHJcbiAgICAgICAgICAgIGNhdGNoIChlcnIpIHtcclxuICAgICAgICAgICAgICAgIGlmIChlcnIuY29kZSAhPT0gXCJFTk9FTlRcIikgcmV0dXJuO1xyXG4gICAgICAgICAgICAgICAgZGVsZXRlIHRoaXMudGltZUNhY2hlW2ZpbGVuYW1lXTtcclxuICAgICAgICAgICAgICAgIGlmIChpc1BsdWdpbikgcmV0dXJuIHBsdWdpbk1vZHVsZS51bmxvYWRQbHVnaW4oZmlsZW5hbWUpO1xyXG4gICAgICAgICAgICAgICAgcmV0dXJuIHRoZW1lTW9kdWxlLnVubG9hZFRoZW1lKGZpbGVuYW1lKTtcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICBpZiAoIWZzLnN0YXRTeW5jKHBhdGgucmVzb2x2ZShiYXNlRm9sZGVyLCBmaWxlbmFtZSkpLmlzRmlsZSgpKSByZXR1cm47XHJcbiAgICAgICAgICAgIGNvbnN0IHN0YXRzID0gZnMuc3RhdFN5bmMocGF0aC5yZXNvbHZlKGJhc2VGb2xkZXIsIGZpbGVuYW1lKSk7XHJcbiAgICAgICAgICAgIGlmICghc3RhdHMgfHwgIXN0YXRzLm10aW1lIHx8ICFzdGF0cy5tdGltZS5nZXRUaW1lKCkpIHJldHVybjtcclxuICAgICAgICAgICAgaWYgKHR5cGVvZihzdGF0cy5tdGltZS5nZXRUaW1lKCkpICE9PSBcIm51bWJlclwiKSByZXR1cm47XHJcbiAgICAgICAgICAgIGlmICh0aGlzLnRpbWVDYWNoZVtmaWxlbmFtZV0gPT0gc3RhdHMubXRpbWUuZ2V0VGltZSgpKSByZXR1cm47XHJcbiAgICAgICAgICAgIHRoaXMudGltZUNhY2hlW2ZpbGVuYW1lXSA9IHN0YXRzLm10aW1lLmdldFRpbWUoKTtcclxuICAgICAgICAgICAgaWYgKGV2ZW50VHlwZSA9PSBcInJlbmFtZVwiKSB7XHJcbiAgICAgICAgICAgICAgICBpZiAoaXNQbHVnaW4pIGF3YWl0IHBsdWdpbk1vZHVsZS5sb2FkUGx1Z2luKGZpbGVuYW1lKTtcclxuICAgICAgICAgICAgICAgIGVsc2UgYXdhaXQgdGhlbWVNb2R1bGUubG9hZFRoZW1lKGZpbGVuYW1lKTtcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICBpZiAoZXZlbnRUeXBlID09IFwiY2hhbmdlXCIpIHtcclxuICAgICAgICAgICAgICAgIGlmIChpc1BsdWdpbikgYXdhaXQgcGx1Z2luTW9kdWxlLnJlbG9hZFBsdWdpbihmaWxlbmFtZSk7XHJcbiAgICAgICAgICAgICAgICBlbHNlIGF3YWl0IHRoZW1lTW9kdWxlLnJlbG9hZFRoZW1lKGZpbGVuYW1lKTtcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgIH0pO1xyXG4gICAgfVxyXG5cclxuICAgIHVud2F0Y2hDb250ZW50KGNvbnRlbnRUeXBlKSB7XHJcbiAgICAgICAgaWYgKCF0aGlzLndhdGNoZXJzW2NvbnRlbnRUeXBlXSkgcmV0dXJuO1xyXG4gICAgICAgIHRoaXMud2F0Y2hlcnNbY29udGVudFR5cGVdLmNsb3NlKCk7XHJcbiAgICAgICAgZGVsZXRlIHRoaXMud2F0Y2hlcnNbY29udGVudFR5cGVdO1xyXG4gICAgfVxyXG5cclxuICAgIGV4dHJhY3RNZXRhKGNvbnRlbnQpIHtcclxuICAgICAgICBjb25zdCBmaXJzdExpbmUgPSBjb250ZW50LnNwbGl0KFwiXFxuXCIpWzBdO1xyXG4gICAgICAgIGNvbnN0IGhhc09sZE1ldGEgPSBmaXJzdExpbmUuaW5jbHVkZXMoXCIvL01FVEFcIik7XHJcbiAgICAgICAgaWYgKGhhc09sZE1ldGEpIHJldHVybiB0aGlzLnBhcnNlT2xkTWV0YShjb250ZW50KTtcclxuICAgICAgICBjb25zdCBoYXNOZXdNZXRhID0gZmlyc3RMaW5lLmluY2x1ZGVzKFwiLyoqXCIpO1xyXG4gICAgICAgIGlmIChoYXNOZXdNZXRhKSByZXR1cm4gdGhpcy5wYXJzZU5ld01ldGEoY29udGVudCk7XHJcbiAgICAgICAgdGhyb3cgbmV3IE1ldGFFcnJvcihcIk1FVEEgd2FzIG5vdCBmb3VuZC5cIik7XHJcbiAgICB9XHJcblxyXG4gICAgcGFyc2VPbGRNZXRhKGNvbnRlbnQpIHtcclxuICAgICAgICBjb25zdCBtZXRhID0gY29udGVudC5zcGxpdChcIlxcblwiKVswXTtcclxuICAgICAgICBjb25zdCByYXdNZXRhID0gbWV0YS5zdWJzdHJpbmcobWV0YS5sYXN0SW5kZXhPZihcIi8vTUVUQVwiKSArIDYsIG1ldGEubGFzdEluZGV4T2YoXCIqLy9cIikpO1xyXG4gICAgICAgIGlmIChtZXRhLmluZGV4T2YoXCJNRVRBXCIpIDwgMCkgdGhyb3cgbmV3IE1ldGFFcnJvcihcIk1FVEEgd2FzIG5vdCBmb3VuZC5cIik7XHJcbiAgICAgICAgY29uc3QgcGFyc2VkID0gVXRpbHMudGVzdEpTT04ocmF3TWV0YSk7XHJcbiAgICAgICAgaWYgKCFwYXJzZWQpIHRocm93IG5ldyBNZXRhRXJyb3IoXCJNRVRBIGNvdWxkIG5vdCBiZSBwYXJzZWQuXCIpO1xyXG4gICAgICAgIGlmICghcGFyc2VkLm5hbWUpIHRocm93IG5ldyBNZXRhRXJyb3IoXCJNRVRBIG1pc3NpbmcgbmFtZSBkYXRhLlwiKTtcclxuICAgICAgICBwYXJzZWQuZm9ybWF0ID0gXCJqc29uXCI7XHJcbiAgICAgICAgcmV0dXJuIHBhcnNlZDtcclxuICAgIH1cclxuXHJcbiAgICBwYXJzZU5ld01ldGEoY29udGVudCkge1xyXG4gICAgICAgIGNvbnN0IGJsb2NrID0gY29udGVudC5zcGxpdChcIi8qKlwiLCAyKVsxXS5zcGxpdChcIiovXCIsIDEpWzBdO1xyXG4gICAgICAgIGNvbnN0IG91dCA9IHt9O1xyXG4gICAgICAgIGxldCBmaWVsZCA9IFwiXCI7XHJcbiAgICAgICAgbGV0IGFjY3VtID0gXCJcIjtcclxuICAgICAgICBmb3IgKGNvbnN0IGxpbmUgb2YgYmxvY2suc3BsaXQoc3BsaXRSZWdleCkpIHtcclxuICAgICAgICAgICAgaWYgKGxpbmUubGVuZ3RoID09PSAwKSBjb250aW51ZTtcclxuICAgICAgICAgICAgaWYgKGxpbmUuY2hhckF0KDApID09PSBcIkBcIiAmJiBsaW5lLmNoYXJBdCgxKSAhPT0gXCIgXCIpIHtcclxuICAgICAgICAgICAgICAgIG91dFtmaWVsZF0gPSBhY2N1bTtcclxuICAgICAgICAgICAgICAgIGNvbnN0IGwgPSBsaW5lLmluZGV4T2YoXCIgXCIpO1xyXG4gICAgICAgICAgICAgICAgZmllbGQgPSBsaW5lLnN1YnN0cigxLCBsIC0gMSk7XHJcbiAgICAgICAgICAgICAgICBhY2N1bSA9IGxpbmUuc3Vic3RyKGwgKyAxKTtcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICBlbHNlIHtcclxuICAgICAgICAgICAgICAgIGFjY3VtICs9IFwiIFwiICsgbGluZS5yZXBsYWNlKFwiXFxcXG5cIiwgXCJcXG5cIikucmVwbGFjZShlc2NhcGVkQXRSZWdleCwgXCJAXCIpO1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgfVxyXG4gICAgICAgIG91dFtmaWVsZF0gPSBhY2N1bS50cmltKCk7XHJcbiAgICAgICAgZGVsZXRlIG91dFtcIlwiXTtcclxuICAgICAgICBvdXQuZm9ybWF0ID0gXCJqc2RvY1wiO1xyXG4gICAgICAgIHJldHVybiBvdXQ7XHJcbiAgICB9XHJcblxyXG4gICAgZ2V0Q29udGVudFJlcXVpcmUodHlwZSkge1xyXG4gICAgICAgIGNvbnN0IGlzUGx1Z2luID0gdHlwZSA9PT0gXCJwbHVnaW5cIjtcclxuICAgICAgICBjb25zdCBzZWxmID0gdGhpcztcclxuICAgICAgICBjb25zdCBvcmlnaW5hbFJlcXVpcmUgPSBpc1BsdWdpbiA/IG9yaWdpbmFsSlNSZXF1aXJlIDogb3JpZ2luYWxDU1NSZXF1aXJlO1xyXG4gICAgICAgIHJldHVybiBmdW5jdGlvbihtb2R1bGUsIGZpbGVuYW1lKSB7XHJcbiAgICAgICAgICAgIGNvbnN0IGJhc2VGb2xkZXIgPSBpc1BsdWdpbiA/IHNlbGYucGx1Z2luc0ZvbGRlciA6IHNlbGYudGhlbWVzRm9sZGVyO1xyXG4gICAgICAgICAgICBjb25zdCBwb3NzaWJsZVBhdGggPSBwYXRoLnJlc29sdmUoYmFzZUZvbGRlciwgcGF0aC5iYXNlbmFtZShmaWxlbmFtZSkpO1xyXG4gICAgICAgICAgICBpZiAoIWZzLmV4aXN0c1N5bmMocG9zc2libGVQYXRoKSB8fCBmaWxlbmFtZSAhPT0gZnMucmVhbHBhdGhTeW5jKHBvc3NpYmxlUGF0aCkpIHJldHVybiBSZWZsZWN0LmFwcGx5KG9yaWdpbmFsUmVxdWlyZSwgdGhpcywgYXJndW1lbnRzKTtcclxuICAgICAgICAgICAgbGV0IGNvbnRlbnQgPSBmcy5yZWFkRmlsZVN5bmMoZmlsZW5hbWUsIFwidXRmOFwiKTtcclxuICAgICAgICAgICAgY29udGVudCA9IFV0aWxzLnN0cmlwQk9NKGNvbnRlbnQpO1xyXG5cclxuICAgICAgICAgICAgY29uc3Qgc3RhdHMgPSBmcy5zdGF0U3luYyhmaWxlbmFtZSk7XHJcbiAgICAgICAgICAgIGNvbnN0IG1ldGEgPSBzZWxmLmV4dHJhY3RNZXRhKGNvbnRlbnQpO1xyXG4gICAgICAgICAgICBtZXRhLmZpbGVuYW1lID0gcGF0aC5iYXNlbmFtZShmaWxlbmFtZSk7XHJcbiAgICAgICAgICAgIG1ldGEuYWRkZWQgPSBzdGF0cy5hdGltZU1zO1xyXG4gICAgICAgICAgICBtZXRhLm1vZGlmaWVkID0gc3RhdHMubXRpbWVNcztcclxuICAgICAgICAgICAgbWV0YS5zaXplID0gc3RhdHMuc2l6ZTtcclxuICAgICAgICAgICAgaWYgKCFpc1BsdWdpbikge1xyXG4gICAgICAgICAgICAgICAgbWV0YS5jc3MgPSBjb250ZW50O1xyXG4gICAgICAgICAgICAgICAgaWYgKG1ldGEuZm9ybWF0ID09IFwianNvblwiKSBtZXRhLmNzcyA9IG1ldGEuY3NzLnNwbGl0KFwiXFxuXCIpLnNsaWNlKDEpLmpvaW4oXCJcXG5cIik7XHJcbiAgICAgICAgICAgICAgICBjb250ZW50ID0gYG1vZHVsZS5leHBvcnRzID0gJHtKU09OLnN0cmluZ2lmeShtZXRhKX07YDtcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICBpZiAoaXNQbHVnaW4pIHtcclxuICAgICAgICAgICAgICAgIG1vZHVsZS5fY29tcGlsZShjb250ZW50LCBtb2R1bGUuZmlsZW5hbWUpO1xyXG4gICAgICAgICAgICAgICAgY29uc3QgZGlkRXhwb3J0ID0gIVV0aWxzLmlzRW1wdHkobW9kdWxlLmV4cG9ydHMpO1xyXG4gICAgICAgICAgICAgICAgaWYgKGRpZEV4cG9ydCkge1xyXG4gICAgICAgICAgICAgICAgICAgIG1ldGEudHlwZSA9IG1vZHVsZS5leHBvcnRzO1xyXG4gICAgICAgICAgICAgICAgICAgIG1vZHVsZS5leHBvcnRzID0gbWV0YTtcclxuICAgICAgICAgICAgICAgICAgICBjb250ZW50ID0gXCJcIjtcclxuICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgIGVsc2Uge1xyXG4gICAgICAgICAgICAgICAgICAgIC8vIFV0aWxzLndhcm4oXCJNb2R1bGUgTm90IEV4cG9ydGVkXCIsIGAke21ldGEubmFtZX0sIHBsZWFzZSBzdGFydCBzZXR0aW5nIG1vZHVsZS5leHBvcnRzYCk7XHJcbiAgICAgICAgICAgICAgICAgICAgY29udGVudCArPSBgXFxubW9kdWxlLmV4cG9ydHMgPSAke0pTT04uc3RyaW5naWZ5KG1ldGEpfTtcXG5tb2R1bGUuZXhwb3J0cy50eXBlID0gJHttZXRhLmV4cG9ydHMgfHwgbWV0YS5uYW1lfTtgO1xyXG4gICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIG1vZHVsZS5fY29tcGlsZShjb250ZW50LCBmaWxlbmFtZSk7XHJcbiAgICAgICAgfTtcclxuICAgIH1cclxuXHJcbiAgICBtYWtlUGxhY2Vob2xkZXJQbHVnaW4oZGF0YSkge1xyXG4gICAgICAgIHJldHVybiB7cGx1Z2luOiB7XHJcbiAgICAgICAgICAgICAgICBzdGFydDogKCkgPT4ge30sXHJcbiAgICAgICAgICAgICAgICBnZXROYW1lOiAoKSA9PiB7cmV0dXJuIGRhdGEubmFtZSB8fCBkYXRhLmZpbGVuYW1lO30sXHJcbiAgICAgICAgICAgICAgICBnZXRBdXRob3I6ICgpID0+IHtyZXR1cm4gXCI/Pz9cIjt9LFxyXG4gICAgICAgICAgICAgICAgZ2V0RGVzY3JpcHRpb246ICgpID0+IHtyZXR1cm4gZGF0YS5tZXNzYWdlID8gZGF0YS5tZXNzYWdlIDogXCJUaGlzIHBsdWdpbiB3YXMgdW5hYmxlIHRvIGJlIGxvYWRlZC4gQ2hlY2sgdGhlIGF1dGhvcidzIHBhZ2UgZm9yIHVwZGF0ZXMuXCI7fSxcclxuICAgICAgICAgICAgICAgIGdldFZlcnNpb246ICgpID0+IHtyZXR1cm4gXCI/Pz9cIjt9XHJcbiAgICAgICAgICAgIH0sXHJcbiAgICAgICAgICAgIG5hbWU6IGRhdGEubmFtZSB8fCBkYXRhLmZpbGVuYW1lLFxyXG4gICAgICAgICAgICBmaWxlbmFtZTogZGF0YS5maWxlbmFtZSxcclxuICAgICAgICAgICAgc291cmNlOiBkYXRhLnNvdXJjZSA/IGRhdGEuc291cmNlIDogXCJcIixcclxuICAgICAgICAgICAgd2Vic2l0ZTogZGF0YS53ZWJzaXRlID8gZGF0YS53ZWJzaXRlIDogXCJcIlxyXG4gICAgICAgIH07XHJcbiAgICB9XHJcblxyXG4gICAgYXN5bmMgbG9hZENvbnRlbnQoZmlsZW5hbWUsIHR5cGUpIHtcclxuICAgICAgICBpZiAodHlwZW9mKGZpbGVuYW1lKSA9PT0gXCJ1bmRlZmluZWRcIiB8fCB0eXBlb2YodHlwZSkgPT09IFwidW5kZWZpbmVkXCIpIHJldHVybjtcclxuICAgICAgICBjb25zdCBpc1BsdWdpbiA9IHR5cGUgPT09IFwicGx1Z2luXCI7XHJcbiAgICAgICAgY29uc3QgYmFzZUZvbGRlciA9IGlzUGx1Z2luID8gdGhpcy5wbHVnaW5zRm9sZGVyIDogdGhpcy50aGVtZXNGb2xkZXI7XHJcbiAgICAgICAgdHJ5IHt3aW5kb3cucmVxdWlyZShwYXRoLnJlc29sdmUoYmFzZUZvbGRlciwgZmlsZW5hbWUpKTt9XHJcbiAgICAgICAgY2F0Y2ggKGVycm9yKSB7cmV0dXJuIHtuYW1lOiBmaWxlbmFtZSwgZmlsZTogZmlsZW5hbWUsIG1lc3NhZ2U6IFwiQ291bGQgbm90IGJlIGNvbXBpbGVkLlwiLCBlcnJvcjoge21lc3NhZ2U6IGVycm9yLm1lc3NhZ2UsIHN0YWNrOiBlcnJvci5zdGFja319O31cclxuICAgICAgICBjb25zdCBjb250ZW50ID0gd2luZG93LnJlcXVpcmUocGF0aC5yZXNvbHZlKGJhc2VGb2xkZXIsIGZpbGVuYW1lKSk7XHJcbiAgICAgICAgaWYoIWNvbnRlbnQubmFtZSlyZXR1cm4ge25hbWU6IGZpbGVuYW1lLCBmaWxlOiBmaWxlbmFtZSwgbWVzc2FnZTogXCJDYW5ub3QgZXNjYXBlIHRoZSBJRC5cIiwgZXJyb3I6IHttZXNzYWdlOiBcIkNhbm5vdCByZWFkIHByb3BlcnR5ICdyZXBsYWNlJyBvZiB1bmRlZmluZWRcIiwgc3RhY2s6IFwiQ2Fubm90IHJlYWQgcHJvcGVydHkgJ3JlcGxhY2UnIG9mIHVuZGVmaW5lZFwifX1cclxuICAgICAgICBjb250ZW50LmlkID0gVXRpbHMuZXNjYXBlSUQoY29udGVudC5uYW1lKTtcclxuICAgICAgICBpZiAoaXNQbHVnaW4pIHtcclxuICAgICAgICAgICAgaWYgKCFjb250ZW50LnR5cGUpIHJldHVybjtcclxuICAgICAgICAgICAgdHJ5IHtcclxuICAgICAgICAgICAgICAgIGNvbnRlbnQucGx1Z2luID0gbmV3IGNvbnRlbnQudHlwZSgpO1xyXG4gICAgICAgICAgICAgICAgZGVsZXRlIGJkcGx1Z2luc1tjb250ZW50LnBsdWdpbi5nZXROYW1lKCldO1xyXG4gICAgICAgICAgICAgICAgYmRwbHVnaW5zW2NvbnRlbnQucGx1Z2luLmdldE5hbWUoKV0gPSBjb250ZW50O1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIGNhdGNoIChlcnJvcikge3JldHVybiB7bmFtZTogZmlsZW5hbWUsIGZpbGU6IGZpbGVuYW1lLCBtZXNzYWdlOiBcIkNvdWxkIG5vdCBiZSBjb25zdHJ1Y3RlZC5cIiwgZXJyb3I6IHttZXNzYWdlOiBlcnJvci5tZXNzYWdlLCBzdGFjazogZXJyb3Iuc3RhY2t9fTt9XHJcbiAgICAgICAgfVxyXG4gICAgICAgIGVsc2Uge1xyXG4gICAgICAgICAgICBkZWxldGUgYmR0aGVtZXNbY29udGVudC5uYW1lXTtcclxuICAgICAgICAgICAgYmR0aGVtZXNbY29udGVudC5uYW1lXSA9IGNvbnRlbnQ7XHJcbiAgICAgICAgfVxyXG4gICAgfSAgIFxyXG5cclxuICAgIHVubG9hZENvbnRlbnQoZmlsZW5hbWUsIHR5cGUpIHtcclxuICAgICAgICBpZiAodHlwZW9mKGZpbGVuYW1lKSA9PT0gXCJ1bmRlZmluZWRcIiB8fCB0eXBlb2YodHlwZSkgPT09IFwidW5kZWZpbmVkXCIpIHJldHVybjtcclxuICAgICAgICBjb25zdCBpc1BsdWdpbiA9IHR5cGUgPT09IFwicGx1Z2luXCI7XHJcbiAgICAgICAgY29uc3QgYmFzZUZvbGRlciA9IGlzUGx1Z2luID8gdGhpcy5wbHVnaW5zRm9sZGVyIDogdGhpcy50aGVtZXNGb2xkZXI7XHJcbiAgICAgICAgdHJ5IHtcclxuICAgICAgICAgICAgZGVsZXRlIHdpbmRvdy5yZXF1aXJlLmNhY2hlW3dpbmRvdy5yZXF1aXJlLnJlc29sdmUocGF0aC5yZXNvbHZlKGJhc2VGb2xkZXIsIGZpbGVuYW1lKSldO1xyXG4gICAgICAgIH1cclxuICAgICAgICBjYXRjaCAoZXJyKSB7cmV0dXJuIHtuYW1lOiBmaWxlbmFtZSwgZmlsZTogZmlsZW5hbWUsIG1lc3NhZ2U6IFwiQ291bGQgbm90IGJlIHVubG9hZGVkLlwiLCBlcnJvcjoge21lc3NhZ2U6IGVyci5tZXNzYWdlLCBzdGFjazogZXJyLnN0YWNrfX07fVxyXG4gICAgfVxyXG5cclxuICAgIGlzTG9hZGVkKGZpbGVuYW1lLCB0eXBlKSB7XHJcbiAgICAgICAgY29uc3QgaXNQbHVnaW4gPSB0eXBlID09PSBcInBsdWdpblwiO1xyXG4gICAgICAgIGNvbnN0IGJhc2VGb2xkZXIgPSBpc1BsdWdpbiA/IHRoaXMucGx1Z2luc0ZvbGRlciA6IHRoaXMudGhlbWVzRm9sZGVyO1xyXG4gICAgICAgIHRyeSB7d2luZG93LnJlcXVpcmUuY2FjaGVbd2luZG93LnJlcXVpcmUucmVzb2x2ZShwYXRoLnJlc29sdmUoYmFzZUZvbGRlciwgZmlsZW5hbWUpKV07fVxyXG4gICAgICAgIGNhdGNoIChlcnIpIHtyZXR1cm4gZmFsc2U7fVxyXG4gICAgICAgIHJldHVybiB0cnVlO1xyXG4gICAgfVxyXG5cclxuICAgIGFzeW5jIHJlbG9hZENvbnRlbnQoZmlsZW5hbWUsIHR5cGUpIHtcclxuICAgICAgICBjb25zdCBjYW50VW5sb2FkID0gdGhpcy51bmxvYWRDb250ZW50KGZpbGVuYW1lLCB0eXBlKTtcclxuICAgICAgICBpZiAoY2FudFVubG9hZCkgcmV0dXJuIGNhbnRVbmxvYWQ7XHJcbiAgICAgICAgcmV0dXJuIGF3YWl0IHRoaXMubG9hZENvbnRlbnQoZmlsZW5hbWUsIHR5cGUpO1xyXG4gICAgfVxyXG5cclxuICAgIGxvYWROZXdDb250ZW50KHR5cGUpIHtcclxuICAgICAgICBjb25zdCBpc1BsdWdpbiA9IHR5cGUgPT09IFwicGx1Z2luXCI7XHJcbiAgICAgICAgY29uc3QgZmlsZUVuZGluZyA9IGlzUGx1Z2luID8gXCIucGx1Z2luLmpzXCIgOiBcIi50aGVtZS5jc3NcIjtcclxuICAgICAgICBjb25zdCBiYXNlZGlyID0gaXNQbHVnaW4gPyB0aGlzLnBsdWdpbnNGb2xkZXIgOiB0aGlzLnRoZW1lc0ZvbGRlcjtcclxuICAgICAgICBjb25zdCBmaWxlcyA9IGZzLnJlYWRkaXJTeW5jKGJhc2VkaXIpO1xyXG4gICAgICAgIGNvbnN0IGNvbnRlbnRMaXN0ID0gT2JqZWN0LnZhbHVlcyhpc1BsdWdpbiA/IGJkcGx1Z2lucyA6IGJkdGhlbWVzKTtcclxuICAgICAgICBjb25zdCByZW1vdmVkID0gY29udGVudExpc3QuZmlsdGVyKHQgPT4gIWZpbGVzLmluY2x1ZGVzKHQuZmlsZW5hbWUpKS5tYXAoYyA9PiBpc1BsdWdpbiA/IGMucGx1Z2luLmdldE5hbWUoKSA6IGMubmFtZSk7XHJcbiAgICAgICAgY29uc3QgYWRkZWQgPSBmaWxlcy5maWx0ZXIoZiA9PiAhY29udGVudExpc3QuZmluZCh0ID0+IHQuZmlsZW5hbWUgPT0gZikgJiYgZi5lbmRzV2l0aChmaWxlRW5kaW5nKSAmJiBmcy5zdGF0U3luYyhwYXRoLnJlc29sdmUoYmFzZWRpciwgZikpLmlzRmlsZSgpKTtcclxuICAgICAgICByZXR1cm4ge2FkZGVkLCByZW1vdmVkfTtcclxuICAgIH1cclxuXHJcbiAgICBhc3luYyBsb2FkQWxsQ29udGVudCh0eXBlKSB7XHJcbiAgICAgICAgY29uc3QgaXNQbHVnaW4gPSB0eXBlID09PSBcInBsdWdpblwiO1xyXG4gICAgICAgIGNvbnN0IGZpbGVFbmRpbmcgPSBpc1BsdWdpbiA/IFwiLnBsdWdpbi5qc1wiIDogXCIudGhlbWUuY3NzXCI7XHJcbiAgICAgICAgY29uc3QgYmFzZWRpciA9IGlzUGx1Z2luID8gdGhpcy5wbHVnaW5zRm9sZGVyIDogdGhpcy50aGVtZXNGb2xkZXI7XHJcbiAgICAgICAgY29uc3QgZXJyb3JzID0gW107XHJcbiAgICAgICAgY29uc3QgZmlsZXMgPSBmcy5yZWFkZGlyU3luYyhiYXNlZGlyKTtcclxuXHJcbiAgICAgICAgZm9yIChjb25zdCBmaWxlbmFtZSBvZiBmaWxlcykge1xyXG4gICAgICAgICAgICBpZiAoIWZzLnN0YXRTeW5jKHBhdGgucmVzb2x2ZShiYXNlZGlyLCBmaWxlbmFtZSkpLmlzRmlsZSgpIHx8ICFmaWxlbmFtZS5lbmRzV2l0aChmaWxlRW5kaW5nKSkgY29udGludWU7XHJcbiAgICAgICAgICAgIGNvbnN0IGVycm9yID0gYXdhaXQgdGhpcy5sb2FkQ29udGVudChmaWxlbmFtZSwgdHlwZSk7XHJcbiAgICAgICAgICAgIGlmIChlcnJvcikgZXJyb3JzLnB1c2goZXJyb3IpO1xyXG4gICAgICAgIH1cclxuXHJcbiAgICAgICAgcmV0dXJuIGVycm9ycztcclxuICAgIH1cclxuXHJcbiAgICBsb2FkUGx1Z2lucygpIHtyZXR1cm4gdGhpcy5sb2FkQWxsQ29udGVudChcInBsdWdpblwiKTt9XHJcbiAgICBsb2FkVGhlbWVzKCkge3JldHVybiB0aGlzLmxvYWRBbGxDb250ZW50KFwidGhlbWVcIik7fVxyXG59OyIsImltcG9ydCB7YmRDb25maWcsIG1pblN1cHBvcnRlZFZlcnNpb24sIGJiZFZlcnNpb24sIHNldHRpbmdzQ29va2llLCBiZHBsdWdpbkVycm9ycywgYmR0aGVtZUVycm9ycywgYmJkQ2hhbmdlbG9nLCBkZWZhdWx0Q29va2llLCBjdXJyZW50RGlzY29yZFZlcnNpb24sIGRlZmF1bHRSUEMsIHNldHRpbmdzUlBDfSBmcm9tIFwiLi4vMGdsb2JhbHNcIjtcclxuaW1wb3J0IFV0aWxzIGZyb20gXCIuL3V0aWxzXCI7XHJcblxyXG5pbXBvcnQgQkRWMiBmcm9tIFwiLi92MlwiO1xyXG5pbXBvcnQgc2V0dGluZ3NQYW5lbCBmcm9tIFwiLi9zZXR0aW5nc1BhbmVsXCI7XHJcbmltcG9ydCBwbHVnaW5Nb2R1bGUgZnJvbSBcIi4vcGx1Z2luTW9kdWxlXCI7XHJcbmltcG9ydCB0aGVtZU1vZHVsZSBmcm9tIFwiLi90aGVtZU1vZHVsZVwiO1xyXG5pbXBvcnQgRGF0YVN0b3JlIGZyb20gXCIuL2RhdGFTdG9yZVwiO1xyXG5pbXBvcnQgV2VicGFja01vZHVsZXMgZnJvbSBcIi4vd2VicGFja01vZHVsZXNcIjtcclxuaW1wb3J0IERPTSBmcm9tIFwiLi9kb210b29sc1wiO1xyXG5cclxuaW1wb3J0IEJETG9nbyBmcm9tIFwiLi4vdWkvYmRMb2dvXCI7XHJcbmltcG9ydCBUb29sdGlwV3JhcCBmcm9tIFwiLi4vdWkvdG9vbHRpcFdyYXBcIjtcclxuaW1wb3J0IExpZ2h0Y29yZExvZ28gZnJvbSBcIi4uL3N2Zy9saWdodGNvcmRcIjtcclxuaW1wb3J0IFBsdWdpbkNlcnRpZmllciBmcm9tIFwiLi9wbHVnaW5DZXJ0aWZpZXJcIjtcclxuaW1wb3J0IGRpc3RhbnQsIHsgdXVpZHY0IH0gZnJvbSBcIi4vZGlzdGFudFwiO1xyXG5pbXBvcnQgRW1vamlNb2R1bGUgZnJvbSBcIi4vZW1vamlNb2R1bGVcIlxyXG5pbXBvcnQge3JlbW90ZSBhcyBlbGVjdHJvbn0gZnJvbSBcImVsZWN0cm9uXCJcclxuaW1wb3J0IHYyIGZyb20gXCIuL3YyXCI7XHJcbmltcG9ydCB3ZWJwYWNrTW9kdWxlcyBmcm9tIFwiLi93ZWJwYWNrTW9kdWxlc1wiO1xyXG5cclxuZnVuY3Rpb24gQ29yZSgpIHtcclxuICAgIC8vIE9iamVjdC5hc3NpZ24oYmRDb25maWcsIF9fbm9uX3dlYnBhY2tfcmVxdWlyZV9fKERhdGFTdG9yZS5jb25maWdGaWxlKSk7XHJcbiAgICAvLyB0aGlzLmluaXQoKTtcclxufVxyXG5cclxuQ29yZS5wcm90b3R5cGUuc2V0Q29uZmlnID0gZnVuY3Rpb24oY29uZmlnKSB7XHJcbiAgICBPYmplY3QuYXNzaWduKGJkQ29uZmlnLCBjb25maWcpO1xyXG59O1xyXG5cclxuQ29yZS5wcm90b3R5cGUuaW5pdCA9IGFzeW5jIGZ1bmN0aW9uKCkge1xyXG4gICAgaWYgKCFBcnJheS5wcm90b3R5cGUuZmxhdCkge1xyXG4gICAgICAgIFV0aWxzLmFsZXJ0KFwiTm90IFN1cHBvcnRlZFwiLCBcIkJldHRlckRpc2NvcmQgdlwiICsgYmJkVmVyc2lvbiArIFwiIGRvZXMgbm90IHN1cHBvcnQgdGhpcyBvbGQgdmVyc2lvbiAoXCIgKyBjdXJyZW50RGlzY29yZFZlcnNpb24gKyBcIikgb2YgRGlzY29yZC4gUGxlYXNlIHVwZGF0ZSB5b3VyIERpc2NvcmQgaW5zdGFsbGF0aW9uIGJlZm9yZSBwcm9jZWVkaW5nLlwiKTtcclxuICAgICAgICByZXR1cm47XHJcbiAgICB9XHJcblxyXG4gICAgaWYgKGJkQ29uZmlnLnZlcnNpb24gPCBtaW5TdXBwb3J0ZWRWZXJzaW9uKSB7XHJcbiAgICAgICAgVXRpbHMuYWxlcnQoXCJOb3QgU3VwcG9ydGVkXCIsIFwiQmV0dGVyRGlzY29yZCB2XCIgKyBiZENvbmZpZy52ZXJzaW9uICsgXCIgKHlvdXIgdmVyc2lvbilcIiArIFwiIGlzIG5vdCBzdXBwb3J0ZWQgYnkgdGhlIGxhdGVzdCBqcyAoXCIgKyBiYmRWZXJzaW9uICsgXCIpLjxicj48YnI+IFBsZWFzZSBkb3dubG9hZCB0aGUgbGF0ZXN0IHZlcnNpb24gZnJvbSA8YSBocmVmPSdodHRwczovL2dpdGh1Yi5jb20vcmF1ZW56aS9CZXR0ZXJEaXNjb3JkQXBwL3JlbGVhc2VzL2xhdGVzdCcgdGFyZ2V0PSdfYmxhbmsnPkdpdEh1YjwvYT5cIik7XHJcbiAgICAgICAgcmV0dXJuO1xyXG4gICAgfVxyXG5cclxuICAgIGlmICh3aW5kb3cuRUQpIHtcclxuICAgICAgICBVdGlscy5hbGVydChcIk5vdCBTdXBwb3J0ZWRcIiwgXCJCYW5kYWdlZEJEIGRvZXMgbm90IHdvcmsgd2l0aCBFbmhhbmNlZERpc2NvcmQuIFBsZWFzZSB1bmluc3RhbGwgb25lIG9mIHRoZW0uXCIpO1xyXG4gICAgICAgIHJldHVybjtcclxuICAgIH1cclxuXHJcbiAgICBpZiAod2luZG93LldlYlNvY2tldCAmJiB3aW5kb3cuV2ViU29ja2V0Lm5hbWUgJiYgd2luZG93LldlYlNvY2tldC5uYW1lLmluY2x1ZGVzKFwiUGF0Y2hlZFwiKSkge1xyXG4gICAgICAgIFV0aWxzLmFsZXJ0KFwiTm90IFN1cHBvcnRlZFwiLCBcIkJhbmRhZ2VkQkQgZG9lcyBub3Qgd29yayB3aXRoIFBvd2VyY29yZC4gUGxlYXNlIHVuaW5zdGFsbCBvbmUgb2YgdGhlbS5cIik7XHJcbiAgICAgICAgcmV0dXJuO1xyXG4gICAgfVxyXG5cclxuICAgIFV0aWxzLnN1cHByZXNzRXJyb3JzKHRoaXMucGF0Y2hBdHRyaWJ1dGVzLmJpbmQodGhpcyksIFwiTEMgUGx1Z2luIENlcnRpZmllciBQYXRjaFwiKSgpO1xyXG5cclxuICAgIC8qXHJcbiAgICBjb25zdCBsYXRlc3RMb2NhbFZlcnNpb24gPSBiZENvbmZpZy51cGRhdGVyID8gYmRDb25maWcudXBkYXRlci5MYXRlc3RWZXJzaW9uIDogYmRDb25maWcubGF0ZXN0VmVyc2lvbjtcclxuICAgIGlmIChsYXRlc3RMb2NhbFZlcnNpb24gPiBiZENvbmZpZy52ZXJzaW9uKSB7XHJcbiAgICAgICAgVXRpbHMuc2hvd0NvbmZpcm1hdGlvbk1vZGFsKFwiVXBkYXRlIEF2YWlsYWJsZVwiLCBbYFRoZXJlIGlzIGFuIHVwZGF0ZSBhdmFpbGFibGUgZm9yIEJhbmRhZ2VkQkQncyBJbmplY3RvciAoJHtsYXRlc3RMb2NhbFZlcnNpb259KS5gLCBcIllvdSBjYW4gZWl0aGVyIHVwZGF0ZSBhbmQgcmVzdGFydCBub3csIG9yIGxhdGVyLlwiXSwge1xyXG4gICAgICAgICAgICBjb25maXJtVGV4dDogXCJVcGRhdGUgTm93XCIsXHJcbiAgICAgICAgICAgIGNhbmNlbFRleHQ6IFwiTWF5YmUgTGF0ZXJcIixcclxuICAgICAgICAgICAgb25Db25maXJtOiBhc3luYyAoKSA9PiB7XHJcbiAgICAgICAgICAgICAgICBjb25zdCBvblVwZGF0ZUZhaWxlZCA9ICgpID0+IHtVdGlscy5hbGVydChcIkNvdWxkIE5vdCBVcGRhdGVcIiwgYFVuYWJsZSB0byB1cGRhdGUgYXV0b21hdGljYWxseSwgcGxlYXNlIGRvd25sb2FkIHRoZSBpbnN0YWxsZXIgYW5kIHJlaW5zdGFsbCBub3JtYWxseS48YnIgLz48YnIgLz48YSBocmVmPSdodHRwczovL2dpdGh1Yi5jb20vcmF1ZW56aS9CZXR0ZXJEaXNjb3JkQXBwL3JlbGVhc2VzL2xhdGVzdCcgdGFyZ2V0PSdfYmxhbmsnPkRvd25sb2FkIEluc3RhbGxlcjwvYT5gKTt9O1xyXG4gICAgICAgICAgICAgICAgdHJ5IHtcclxuICAgICAgICAgICAgICAgICAgICBjb25zdCBkaWRVcGRhdGUgPSBhd2FpdCB0aGlzLnVwZGF0ZUluamVjdG9yKCk7XHJcbiAgICAgICAgICAgICAgICAgICAgaWYgKCFkaWRVcGRhdGUpIHJldHVybiBvblVwZGF0ZUZhaWxlZCgpO1xyXG4gICAgICAgICAgICAgICAgICAgIGNvbnN0IGFwcCA9IHJlcXVpcmUoXCJlbGVjdHJvblwiKS5yZW1vdGUuYXBwO1xyXG4gICAgICAgICAgICAgICAgICAgIGFwcC5yZWxhdW5jaCgpO1xyXG4gICAgICAgICAgICAgICAgICAgIGFwcC5leGl0KCk7XHJcbiAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgICBjYXRjaCAoZXJyKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgb25VcGRhdGVGYWlsZWQoKTtcclxuICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgfVxyXG4gICAgICAgIH0pO1xyXG4gICAgfSovXHJcblxyXG4gICAgVXRpbHMubG9nKFwiU3RhcnR1cFwiLCBcIkluaXRpYWxpemluZyBTZXR0aW5nc1wiKTtcclxuICAgIHRoaXMuaW5pdFNldHRpbmdzKCk7XHJcblxyXG4gICAgYXdhaXQgdGhpcy5jaGVja0Zvckd1aWxkcygpO1xyXG4gICAgQkRWMi5pbml0aWFsaXplKCk7XHJcbiAgICBVdGlscy5sb2coXCJTdGFydHVwXCIsIFwiVXBkYXRpbmcgU2V0dGluZ3NcIik7XHJcbiAgICBzZXR0aW5nc1BhbmVsLmluaXRpYWxpemVTZXR0aW5ncygpO1xyXG5cclxuICAgIFV0aWxzLmxvZyhcIlN0YXJ0dXBcIiwgXCJMb2FkaW5nIFBsdWdpbnNcIik7XHJcbiAgICBhd2FpdCBwbHVnaW5Nb2R1bGUubG9hZFBsdWdpbnMoKTtcclxuXHJcbiAgICBVdGlscy5sb2coXCJTdGFydHVwXCIsIFwiTG9hZGluZyBUaGVtZXNcIik7XHJcbiAgICBhd2FpdCB0aGVtZU1vZHVsZS5sb2FkVGhlbWVzKCk7XHJcblxyXG4gICAgRE9NLmFkZFN0eWxlKFwiY3VzdG9tY3NzXCIsIGF0b2IoRGF0YVN0b3JlLmdldEJERGF0YShcImJkY3VzdG9tY3NzXCIpKSk7XHJcblxyXG4gICAgd2luZG93LmFkZEV2ZW50TGlzdGVuZXIoXCJiZWZvcmV1bmxvYWRcIiwgZnVuY3Rpb24oKSB7XHJcbiAgICAgICAgaWYgKHNldHRpbmdzQ29va2llW1wiYmRhLWRjLTBcIl0pIGRvY3VtZW50LnF1ZXJ5U2VsZWN0b3IoXCIuYnRuLmJ0bi1kaXNjb25uZWN0XCIpLmNsaWNrKCk7XHJcbiAgICB9KTtcclxuXHJcbiAgICBQbHVnaW5DZXJ0aWZpZXIuc3RhcnQoKVxyXG5cclxuICAgIFV0aWxzLmxvZyhcIlN0YXJ0dXBcIiwgXCJSZW1vdmluZyBMb2FkaW5nIEljb25cIik7XHJcbiAgICBpZiAoZG9jdW1lbnQuZ2V0RWxlbWVudHNCeUNsYXNzTmFtZShcImJkLWxvYWRlcnYyXCIpLmxlbmd0aCkgZG9jdW1lbnQuZ2V0RWxlbWVudHNCeUNsYXNzTmFtZShcImJkLWxvYWRlcnYyXCIpWzBdLnJlbW92ZSgpO1xyXG4gICAgVXRpbHMubG9nKFwiU3RhcnR1cFwiLCBcIkluaXRpYWxpemluZyBNYWluIE9ic2VydmVyXCIpO1xyXG4gICAgdGhpcy5pbml0T2JzZXJ2ZXIoKTtcclxuXHJcbiAgICAvLyBTaG93IGxvYWRpbmcgZXJyb3JzXHJcbiAgICBpZiAoc2V0dGluZ3NDb29raWVbXCJmb3JrLXBzLTFcIl0pIHtcclxuICAgICAgICBVdGlscy5sb2coXCJTdGFydHVwXCIsIFwiQ29sbGVjdGluZyBTdGFydHVwIEVycm9yc1wiKTtcclxuICAgICAgICBVdGlscy5zaG93Q29udGVudEVycm9ycyh7cGx1Z2luczogYmRwbHVnaW5FcnJvcnMsIHRoZW1lczogYmR0aGVtZUVycm9yc30pO1xyXG4gICAgfVxyXG5cclxuICAgIGNvbnN0IHByZXZpb3VzVmVyc2lvbiA9IERhdGFTdG9yZS5nZXRCRERhdGEoXCJ2ZXJzaW9uXCIpO1xyXG4gICAgaWYgKGJiZFZlcnNpb24gPiBwcmV2aW91c1ZlcnNpb24pIHtcclxuICAgICAgICBpZiAoYmJkQ2hhbmdlbG9nKSB0aGlzLnNob3dDaGFuZ2Vsb2dNb2RhbChiYmRDaGFuZ2Vsb2cpO1xyXG4gICAgICAgIERhdGFTdG9yZS5zZXRCRERhdGEoXCJ2ZXJzaW9uXCIsIGJiZFZlcnNpb24pO1xyXG4gICAgfVxyXG5cclxuICAgIEVtb2ppTW9kdWxlLnN0YXJ0KClcclxuXHJcbiAgICBVdGlscy5zdXBwcmVzc0Vycm9ycyh0aGlzLnBhdGNoU29jaWFsLmJpbmQodGhpcyksIFwiQkQgU29jaWFsIFBhdGNoXCIpKCk7XHJcbiAgICBVdGlscy5zdXBwcmVzc0Vycm9ycyh0aGlzLnBhdGNoR3VpbGRQaWxscy5iaW5kKHRoaXMpLCBcIkJEIEd1aWxkIFBpbGxzIFBhdGNoXCIpKCk7XHJcbiAgICBVdGlscy5zdXBwcmVzc0Vycm9ycyh0aGlzLnBhdGNoR3VpbGRMaXN0SXRlbXMuYmluZCh0aGlzKSwgXCJCRCBHdWlsZCBMaXN0IEl0ZW1zIFBhdGNoXCIpKCk7XHJcbiAgICBVdGlscy5zdXBwcmVzc0Vycm9ycyh0aGlzLnBhdGNoR3VpbGRTZXBhcmF0b3IuYmluZCh0aGlzKSwgXCJCRCBHdWlsZCBTZXBhcmF0b3IgUGF0Y2hcIikoKTtcclxuICAgIFV0aWxzLnN1cHByZXNzRXJyb3JzKHRoaXMucGF0Y2hNZXNzYWdlSGVhZGVyLmJpbmQodGhpcyksIFwiQkQgQmFkZ2UgQ2hhdCBQYXRjaFwiKSgpO1xyXG4gICAgVXRpbHMuc3VwcHJlc3NFcnJvcnModGhpcy5wYXRjaE1lbWJlckxpc3QuYmluZCh0aGlzKSwgXCJCRCBCYWRnZSBNZW1iZXIgTGlzdCBQYXRjaFwiKSgpO1xyXG4gICAgVXRpbHMuc3VwcHJlc3NFcnJvcnModGhpcy5wYXRjaEF0dGFjaG1lbnQuYmluZCh0aGlzKSwgXCJMQyBQbHVnaW4gQ2VydGlmaWVyIFBhdGNoXCIpKCk7XHJcblxyXG4gICAgaWYoYmRDb25maWcuaGF2ZUluc3RhbGxlZERlZmF1bHQpe1xyXG4gICAgICAgIGxldCBhbGVydCA9IFV0aWxzLmFsZXJ0KFwiRmlyc3QgSW5zdGFsbGF0aW9uXCIsIFwiQXMgaXQgaXMgdGhlIGZpcnN0IHRpbWUgeW91IGluc3RhbGwgTGlnaHRjb3JkLCBXZSBhZGRlZCB0d28gZGVmYXVsdCB0aGVtZXMgYW5kIG9uZSBkZWZhdWx0IHBsdWdpbiBpbiB5b3VyIHBsdWdpbi90aGVtZSBmb2xkZXIuIENoZWNrIGl0IGluIHRoZSBQbHVnaW4vVGhlbWUgc2V0dGluZ3MuXCIpXHJcbiAgICAgICAgYXdhaXQgbmV3IFByb21pc2UoKHJlc29sdmUpID0+IHtcclxuICAgICAgICAgICAgYWxlcnQub25DbG9zZShyZXNvbHZlKVxyXG4gICAgICAgIH0pXHJcbiAgICB9XHJcbiAgICBjb25zdCBsb2dvID0gZG9jdW1lbnQucXVlcnlTZWxlY3RvcihcIiNhcHAtbW91bnQgPiBkaXYudHlwZVdpbmRvd3MtMXphLW43LndpdGhGcmFtZS1oYVlsdEkudGl0bGVCYXItQUM0cEdWLmhvcml6b250YWxSZXZlcnNlLTN0UmpZNy5mbGV4LTFPMUdLWS5kaXJlY3Rpb25Sb3dSZXZlcnNlLW04SWpJcS5qdXN0aWZ5U3RhcnQtMk5ERnppLmFsaWduU3RyZXRjaC1EcEdQZjMuZGEtdHlwZVdpbmRvd3MuZGEtd2l0aEZyYW1lLmRhLXRpdGxlQmFyLmRhLWhvcml6b250YWxSZXZlcnNlLmRhLWZsZXguZGEtZGlyZWN0aW9uUm93UmV2ZXJzZS5kYS1qdXN0aWZ5U3RhcnQuZGEtYWxpZ25TdHJldGNoID4gZGl2LndvcmRtYXJrV2luZG93cy0xdjBsWUQud29yZG1hcmstMmlERGZtLmRhLXdvcmRtYXJrV2luZG93cy5kYS13b3JkbWFya1wiKVxyXG4gICAgaWYobG9nbyl7XHJcbiAgICAgICAgbG9nby5zdHlsZS50b3AgPSBcIjNweFwiXHJcbiAgICAgICAgbG9nby5pbm5lckhUTUwgPSBgPHN2ZyB4bWxucz1cImh0dHA6Ly93d3cudzMub3JnLzIwMDAvc3ZnXCIgaGVpZ2h0PVwiMTBcIiB3aWR0aD1cIjcwXCIgdmlld0JveD1cIjAgMCA3Mi41NCAxMFwiIHN0eWxlPVwibWFyZ2luLWxlZnQ6IC01cHgsIG1hcmdpbi10b3A6IDEwcHhcIj5cclxuICAgIDxwYXRoIGZpbGw9XCJjdXJyZW50Q29sb3JcIiBkPVwiTTQ0LjgxLDkuNjdWNi4zM2MwLTEuMjEsMi4xMy0xLjQ5LDIuNzgtLjI4bDItLjgxQTMuNTMsMy41MywwLDAsMCw0Ni4yLDNjLTEuOTIsMC0zLjgxLDEuMTMtMy44MSwzLjMzVjkuNjdjMCwyLjIxLDEuODksMy4zMywzLjc3LDMuMzNhMy44NywzLjg3LDAsMCwwLDMuNDUtMi4xOGwtMi4xMi0xQzQ3LDExLjE3LDQ0LjgxLDEwLjg1LDQ0LjgxLDkuNjdaTTEwLjY4LDEyLjg5aDIuNDFWMy4xN0gxMC42OFpNNzEuNzYsMy4xNEg2OC4xOVY3LjIzTDcwLjU3LDkuNHYtNGgxLjI3Yy44MSwwLDEuMjEuNDEsMS4yMSwxdjNjMCwuNjMtLjM4LDEuMDUtMS4yMSwxLjA1SDY4LjE4djIuMzFoMy41N2MxLjkyLDAsMy43Mi0xLDMuNzItMy4yVjYuMzlDNzUuNDgsNC4xMyw3My42OCwzLjE0LDcxLjc2LDMuMTRaTTU0LjIyLDNjLTIsMC00LDEuMS00LDMuMzRWOS42NmMwLDIuMjMsMiwzLjM0LDQsMy4zNHMzLjk1LTEuMTEsMy45NS0zLjM0VjYuMzRDNTguMTksNC4xMSw1Ni4yLDMsNTQuMjIsM1ptMS41NSw2LjY2YzAsLjctLjc4LDEuMDYtMS41NCwxLjA2cy0xLjU1LS4zNS0xLjU1LTEuMDZWNi4zNGMwLS43Mi43NS0xLjEsMS41LTEuMXMxLjU5LjM1LDEuNTksMS4xWk02Ni44NCw2LjM0YzAtMi4yOS0xLjU4LTMuMi0zLjU1LTMuMkg1OS40NnY5LjczaDIuNDVWOS43N2guNDNsMi4yMiwzLjA5aDNMNjUsOS41MkM2Ni4xMyw5LjE1LDY2Ljg0LDguMTQsNjYuODQsNi4zNFpNNjMuMzMsNy42NUg2MS45MVY1LjQzaDEuNDJBMS4xMSwxLjExLDAsMSwxLDYzLjMzLDcuNjVaTTI5LjgzLDEzaDIuNDJWMy4wNkgyOS44M1Y2LjczbC0zLDBWMy4wOUgyNC43djkuNzhoMi4xNFY4LjY4bDMsMFpNMTcuMTYsOS43NlY2LjQyYzAtMS4yMSwyLjEzLTEuNDksMi43OC0uMjhsMi0uODFhMy41NSwzLjU1LDAsMCwwLTMuMzYtMi4yNGMtMS45MiwwLTMuODEsMS4xMy0zLjgxLDMuMzNWOS43NmMwLDIuMjEsMiwzLjE1LDMuOSwzLjE1czMuNTgtMSwzLjU4LTNWNy41OEgxOC43OWwwLDEuMzZIMjAuM3YuNzdDMjAuMywxMC45MiwxNy4xNiwxMC45NCwxNy4xNiw5Ljc2WlwiIHRyYW5zZm9ybT1cInRyYW5zbGF0ZSgtMi45MyAtMylcIi8+XHJcbiAgICA8cG9seWdvbiBmaWxsPVwiY3VycmVudENvbG9yXCIgcG9pbnRzPVwiMzUuOTEgMC4wNiAzOC40MyAwLjA2IDM4LjQzIDEuODQgMzUuOTIgMS44MSAzNS45NyAxMCAzMy41NSAxMCAzMy40OSAxLjc1IDMwLjk4IDEuNzQgMzAuOTggMC4wNiAzMy40OSAwLjA2IDM1LjkxIDAuMDZcIi8+XHJcbiAgICA8cG9seWdvbiBmaWxsPVwiY3VycmVudENvbG9yXCIgcG9pbnRzPVwiMCA5Ljk3IDYuNSAxMCA2LjUgNy42MyAyLjQxIDcuNjMgMi40MSAwLjI2IDAgMi4yNiAwIDkuOTdcIi8+XHJcbjwvc3ZnPmBcclxuICAgIH1cclxufTtcclxuXHJcbkNvcmUucHJvdG90eXBlLnBhdGNoQXR0cmlidXRlcyA9IGFzeW5jIGZ1bmN0aW9uKCkge1xyXG4gICAgbGV0IGF0dHJpYnNQYXRjaHMgPSBbXVxyXG4gICAgdGhpcy5jYW5jZWxQYXRjaEF0dHJpYnV0ZXMgPSBmdW5jdGlvbigpIHtcclxuICAgICAgICBhdHRyaWJzUGF0Y2hzLmZvckVhY2goZSA9PiBlKCkpXHJcbiAgICB9XHJcblxyXG4gICAgd2hpbGUoIXYyLk1lc3NhZ2VDb21wb25lbnQpYXdhaXQgbmV3IFByb21pc2UocmVzb2x2ZSA9PiBzZXRUaW1lb3V0KHJlc29sdmUsIDEwMCkpXHJcbiAgICBcclxuICAgIHdpbmRvdy5MaWdodGNvcmQuQXBpLmVuc3VyZUV4cG9ydGVkKGUgPT4gZS5kZWZhdWx0ICYmIGUuZGVmYXVsdC5kaXNwbGF5TmFtZSAmJiBlLmRlZmF1bHQuZGlzcGxheU5hbWUuaW5jbHVkZXMoXCJVc2VyUG9wb3V0XCIpKVxyXG4gICAgLnRoZW4oVXNlclBvcG91dCA9PiB7XHJcbiAgICAgICAgY29uc29sZS5sb2coVXNlclBvcG91dClcclxuICAgICAgICBjb25zdCByZW5kZXIgPSBVc2VyUG9wb3V0LmRlZmF1bHQucHJvdG90eXBlLnJlbmRlclxyXG4gICAgICAgIFVzZXJQb3BvdXQuZGVmYXVsdC5wcm90b3R5cGUucmVuZGVyID0gZnVuY3Rpb24oKXtcclxuICAgICAgICAgICAgY29uc3QgcmV0dXJuVmFsdWUgPSByZW5kZXIuY2FsbCh0aGlzLCAuLi5hcmd1bWVudHMpXHJcbiAgICAgICAgICAgIGNvbnNvbGUubG9nKHJldHVyblZhbHVlLCB0aGlzLnByb3BzKVxyXG4gICAgICAgICAgICByZXR1cm4gcmV0dXJuVmFsdWVcclxuICAgICAgICB9XHJcbiAgICB9KVxyXG4gICAgYXR0cmlic1BhdGNocy5wdXNoKFV0aWxzLm1vbmtleVBhdGNoKHYyLk1lc3NhZ2VDb21wb25lbnQsIFwiZGVmYXVsdFwiLCB7YWZ0ZXI6IChkYXRhKSA9PiB7XHJcbiAgICAgICAgaWYoZGF0YS5tZXRob2RBcmd1bWVudHNbMF0uY2hpbGRyZW5NZXNzYWdlQ29udGVudC5wcm9wcy5tZXNzYWdlKXsgLy8gdGhpcyBjYW4gYmUgYSBibG9ja2VkIG1lc3NhZ2UgKG5vdCBvcGVuZWQpXHJcbiAgICAgICAgICAgIGRhdGEucmV0dXJuVmFsdWUucHJvcHNbXCJkYXRhLW1lc3NhZ2UtaWRcIl0gPSBkYXRhLm1ldGhvZEFyZ3VtZW50c1swXS5jaGlsZHJlbk1lc3NhZ2VDb250ZW50LnByb3BzLm1lc3NhZ2UuaWRcclxuICAgICAgICB9XHJcbiAgICB9fSkpXHJcbiAgICAgICAgLypcclxuICAgIGF0dHJpYnNQYXRjaHMucHVzaChVdGlscy5tb25rZXlQYXRjaCh2Mi5NZXNzYWdlQ29tcG9uZW50LCBcImRlZmF1bHRcIiwge2FmdGVyOiAoZGF0YSkgPT4ge1xyXG4gICAgICAgIGRhdGEucmV0dXJuVmFsdWUucHJvcHNbXCJtZXNzYWdlLWlkXCJdID0gZGF0YS5tZXRob2RBcmd1bWVudHNbMF0uY2hpbGRyZW5NZXNzYWdlQ29udGVudC5wcm9wcy5tZXNzYWdlLmlkXHJcbiAgICB9fSkpKi9cclxufVxyXG5cclxuQ29yZS5wcm90b3R5cGUuY2hlY2tGb3JHdWlsZHMgPSBmdW5jdGlvbigpIHtcclxuICAgIGxldCB0aW1lc0NoZWNrZWQgPSAwO1xyXG4gICAgcmV0dXJuIG5ldyBQcm9taXNlKHJlc29sdmUgPT4ge1xyXG4gICAgICAgIGNvbnN0IGNoZWNrRm9yR3VpbGRzID0gZnVuY3Rpb24oKSB7XHJcbiAgICAgICAgICAgIGNvbnN0IHdyYXBwZXIgPSBCRFYyLmd1aWxkQ2xhc3Nlcy53cmFwcGVyLnNwbGl0KFwiIFwiKVswXTtcclxuICAgICAgICAgICAgaWYgKGRvY3VtZW50LnF1ZXJ5U2VsZWN0b3JBbGwoYC4ke3dyYXBwZXJ9YCkubGVuZ3RoID4gMCkgdGltZXNDaGVja2VkKys7XHJcbiAgICAgICAgICAgIGNvbnN0IGd1aWxkID0gQkRWMi5ndWlsZENsYXNzZXMubGlzdEl0ZW0uc3BsaXQoXCIgXCIpWzBdO1xyXG4gICAgICAgICAgICBjb25zdCBibG9iID0gQkRWMi5ndWlsZENsYXNzZXMuYmxvYkNvbnRhaW5lci5zcGxpdChcIiBcIilbMF07XHJcbiAgICAgICAgICAgIGlmIChkb2N1bWVudC5xdWVyeVNlbGVjdG9yQWxsKGAuJHt3cmFwcGVyfSAuJHtndWlsZH0gLiR7YmxvYn1gKS5sZW5ndGggPiAwKSByZXR1cm4gcmVzb2x2ZShiZENvbmZpZy5kZWZlckxvYWRlZCA9IHRydWUpO1xyXG4gICAgICAgICAgICBlbHNlIGlmICh0aW1lc0NoZWNrZWQgPj0gNTApIHJldHVybiByZXNvbHZlKGJkQ29uZmlnLmRlZmVyTG9hZGVkID0gdHJ1ZSk7XHJcbiAgICAgICAgICAgIHNldFRpbWVvdXQoY2hlY2tGb3JHdWlsZHMsIDEwMCk7XHJcbiAgICAgICAgfTtcclxuICAgICAgICBpZiAoZG9jdW1lbnQucmVhZHlTdGF0ZSAhPSBcImxvYWRpbmdcIikgc2V0VGltZW91dChjaGVja0Zvckd1aWxkcywgMTAwKTtcclxuICAgICAgICBkb2N1bWVudC5hZGRFdmVudExpc3RlbmVyKFwiRE9NQ29udGVudExvYWRlZFwiLCAoKSA9PiB7c2V0VGltZW91dChjaGVja0Zvckd1aWxkcywgMTAwKTt9KTtcclxuICAgIH0pO1xyXG59O1xyXG5cclxuQ29yZS5wcm90b3R5cGUuaW5qZWN0RXh0ZXJuYWxzID0gYXN5bmMgZnVuY3Rpb24oKSB7XHJcbiAgICBhd2FpdCBET00uYWRkU2NyaXB0KFwiYWNlLXNjcmlwdFwiLCBcImh0dHBzOi8vY2RuanMuY2xvdWRmbGFyZS5jb20vYWpheC9saWJzL2FjZS8xLjIuOS9hY2UuanNcIik7XHJcbiAgICBpZiAod2luZG93LnJlcXVpcmUub3JpZ2luYWwpIHdpbmRvdy5yZXF1aXJlID0gd2luZG93LnJlcXVpcmUub3JpZ2luYWw7XHJcbn07XHJcblxyXG5Db3JlLnByb3RvdHlwZS5pbml0U2V0dGluZ3MgPSBmdW5jdGlvbiAoKSB7XHJcbiAgICBEYXRhU3RvcmUuaW5pdGlhbGl6ZSgpO1xyXG4gICAgaWYoIURhdGFTdG9yZS5nZXRTZXR0aW5nR3JvdXAoXCJzZXR0aW5nc1wiKSAmJiAhRGF0YVN0b3JlLmdldFNldHRpbmdHcm91cChcInJwY1wiKSl7XHJcbiAgICAgICAgaWYgKCFEYXRhU3RvcmUuZ2V0U2V0dGluZ0dyb3VwKFwic2V0dGluZ3NcIikpIHtcclxuICAgICAgICAgICAgT2JqZWN0LmFzc2lnbihzZXR0aW5nc0Nvb2tpZSwgZGVmYXVsdENvb2tpZSk7XHJcbiAgICAgICAgfVxyXG4gICAgICAgIGlmICghRGF0YVN0b3JlLmdldFNldHRpbmdHcm91cChcInJwY1wiKSkge1xyXG4gICAgICAgICAgICBPYmplY3QuYXNzaWduKHNldHRpbmdzUlBDLCBkZWZhdWx0UlBDKTtcclxuICAgICAgICB9XHJcbiAgICAgICAgc2V0dGluZ3NQYW5lbC5zYXZlU2V0dGluZ3MoKTtcclxuICAgIH0gZWxzZSB7XHJcbiAgICAgICAgc2V0dGluZ3NQYW5lbC5sb2FkU2V0dGluZ3MoKTtcclxuICAgICAgICBmb3IgKGNvbnN0IHNldHRpbmcgaW4gZGVmYXVsdENvb2tpZSkge1xyXG4gICAgICAgICAgICBpZiAoc2V0dGluZ3NDb29raWVbc2V0dGluZ10gPT0gdW5kZWZpbmVkKSB7XHJcbiAgICAgICAgICAgICAgICBzZXR0aW5nc0Nvb2tpZVtzZXR0aW5nXSA9IGRlZmF1bHRDb29raWVbc2V0dGluZ107XHJcbiAgICAgICAgICAgICAgICBzZXR0aW5nc1BhbmVsLnNhdmVTZXR0aW5ncygpO1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgfVxyXG4gICAgfVxyXG4gICAgd2luZG93LkxpZ2h0Y29yZC5BcGkuZW5zdXJlRXhwb3J0ZWQoZSA9PiBlLmRlZmF1bHQgJiYgZS5kZWZhdWx0LnByb3RvdHlwZSAmJiBlLmRlZmF1bHQucHJvdG90eXBlLmdldFByZWRpY2F0ZVNlY3Rpb25zKVxyXG4gICAgLnRoZW4oc2V0dGluZ01vZHVsZSA9PiB7XHJcblxyXG4gICAgICAgIGxldCBnZXRQcmVkaWNhdGVTZWN0aW9ucyA9IHNldHRpbmdNb2R1bGUuZGVmYXVsdC5wcm90b3R5cGUuZ2V0UHJlZGljYXRlU2VjdGlvbnNcclxuICAgICAgICBzZXR0aW5nTW9kdWxlLmRlZmF1bHQucHJvdG90eXBlLmdldFByZWRpY2F0ZVNlY3Rpb25zID0gZnVuY3Rpb24oKXtcclxuICAgICAgICAgICAgbGV0IHJlc3VsdCA9IGdldFByZWRpY2F0ZVNlY3Rpb25zLmNhbGwodGhpcywgLi4uYXJndW1lbnRzKVxyXG5cclxuICAgICAgICAgICAgaWYocmVzdWx0WzFdLnNlY3Rpb24gPT09IFwiTXkgQWNjb3VudFwiKXsgLy8gdXNlciBzZXR0aW5ncywgbm90IGd1aWxkIHNldHRpbmdzXHJcbiAgICAgICAgICAgICAgICBsZXQgcG9wZWQgPSBbXVxyXG4gICAgICAgICAgICAgICAgXHJcbiAgICAgICAgICAgICAgICBwb3BlZC5wdXNoKHJlc3VsdC5wb3AoKSlcclxuICAgICAgICAgICAgICAgIHBvcGVkLnB1c2gocmVzdWx0LnBvcCgpKVxyXG4gICAgICAgICAgICAgICAgcG9wZWQucHVzaChyZXN1bHQucG9wKCkpXHJcbiAgICAgICAgICAgICAgICBwb3BlZC5wdXNoKHJlc3VsdC5wb3AoKSlcclxuXHJcbiAgICAgICAgICAgICAgICByZXN1bHQucHVzaCguLi5zZXR0aW5nc1BhbmVsLnJlbmRlclNpZGViYXIoKSlcclxuXHJcbiAgICAgICAgICAgICAgICB3aGlsZShwb3BlZFswXSl7XHJcbiAgICAgICAgICAgICAgICAgICAgcmVzdWx0LnB1c2gocG9wZWQucG9wKCkpXHJcbiAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgcmV0dXJuIHJlc3VsdFxyXG4gICAgICAgIH1cclxuICAgIH0pXHJcbn07XHJcblxyXG5cclxubGV0IGNsYXNzTmFtZUxheWVyXHJcbmxldCBjbGFzc05hbWVTb2NpYWxMaW5rc1xyXG5sZXQgY2xhc3NOYW1lTW9kYWxcclxuXHJcbkNvcmUucHJvdG90eXBlLmluaXRPYnNlcnZlciA9IGZ1bmN0aW9uICgpIHtcclxuICAgIGNvbnN0IG1haW5PYnNlcnZlciA9IG5ldyBNdXRhdGlvbk9ic2VydmVyKChtdXRhdGlvbnMpID0+IHtcclxuICAgICAgICBmb3IgKGxldCBpID0gMCwgbWxlbiA9IG11dGF0aW9ucy5sZW5ndGg7IGkgPCBtbGVuOyBpKyspIHtcclxuICAgICAgICAgICAgY29uc3QgbXV0YXRpb24gPSBtdXRhdGlvbnNbaV07XHJcbiAgICAgICAgICAgIGlmICh0eXBlb2YgcGx1Z2luTW9kdWxlICE9PSBcInVuZGVmaW5lZFwiKSBwbHVnaW5Nb2R1bGUucmF3T2JzZXJ2ZXIobXV0YXRpb24pO1xyXG5cclxuICAgICAgICAgICAgLy8gaWYgdGhlcmUgd2FzIG5vdGhpbmcgYWRkZWQsIHNraXBcclxuICAgICAgICAgICAgaWYgKCFtdXRhdGlvbi5hZGRlZE5vZGVzLmxlbmd0aCB8fCAhKG11dGF0aW9uLmFkZGVkTm9kZXNbMF0gaW5zdGFuY2VvZiBFbGVtZW50KSkgY29udGludWU7XHJcblxyXG4gICAgICAgICAgICBjb25zdCBub2RlID0gbXV0YXRpb24uYWRkZWROb2Rlc1swXTtcclxuXHJcbiAgICAgICAgICAgIGlmKCFjbGFzc05hbWVMYXllciljbGFzc05hbWVMYXllciA9IEJETW9kdWxlcy5nZXQoKGUpID0+IGUubGF5ZXIgJiYgdHlwZW9mIGUubGF5ZXIgPT09IFwic3RyaW5nXCIgJiYgZS5hbmltYXRpbmcpWzBdLmxheWVyXHJcbiAgICAgICAgICAgIGlmKCFjbGFzc05hbWVTb2NpYWxMaW5rcyljbGFzc05hbWVTb2NpYWxMaW5rcyA9IEJETW9kdWxlcy5nZXQoKGUpID0+IGUuc29jaWFsTGlua3MgJiYgdHlwZW9mIGUuc29jaWFsTGlua3MgPT09IFwic3RyaW5nXCIpWzBdLnNvY2lhbExpbmtzXHJcbiAgICAgICAgICAgIGlmKCFjbGFzc05hbWVNb2RhbCljbGFzc05hbWVNb2RhbCA9IEJETW9kdWxlcy5nZXQoKGUpID0+IGUubW9kYWwgJiYgdHlwZW9mIGUubW9kYWwgPT09IFwic3RyaW5nXCIgJiYgZS5pbm5lciAmJiB0eXBlb2YgZS5pbm5lciA9PT0gXCJzdHJpbmdcIiAmJiAhZS5yZXNwb25zaXZlV2lkdGhNb2JpbGUpWzBdLm1vZGFsXHJcblxyXG4gICAgICAgICAgICBpZiAobm9kZS5jbGFzc0xpc3QuY29udGFpbnMoY2xhc3NOYW1lTGF5ZXIpKSB7XHJcbiAgICAgICAgICAgICAgICBpZiAobm9kZS5nZXRFbGVtZW50c0J5Q2xhc3NOYW1lKFwiZ3VpbGQtc2V0dGluZ3MtYmFzZS1zZWN0aW9uXCIpLmxlbmd0aCkgbm9kZS5zZXRBdHRyaWJ1dGUoXCJsYXllci1pZFwiLCBcInNlcnZlci1zZXR0aW5nc1wiKTtcclxuXHJcbiAgICAgICAgICAgICAgICBpZiAobm9kZS5nZXRFbGVtZW50c0J5Q2xhc3NOYW1lKGNsYXNzTmFtZVNvY2lhbExpbmtzKS5sZW5ndGgpIHtcclxuICAgICAgICAgICAgICAgICAgICBub2RlLnNldEF0dHJpYnV0ZShcImxheWVyLWlkXCIsIFwidXNlci1zZXR0aW5nc1wiKTtcclxuICAgICAgICAgICAgICAgICAgICBub2RlLnNldEF0dHJpYnV0ZShcImlkXCIsIFwidXNlci1zZXR0aW5nc1wiKTtcclxuICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgfVxyXG5cclxuICAgICAgICAgICAgaWYgKG5vZGUucGFyZW50RWxlbWVudCA9PSBkb2N1bWVudC5ib2R5ICYmIG5vZGUucXVlcnlTZWxlY3RvcihcIiNhY2Vfc2V0dGluZ3NtZW51XCIpKSBub2RlLmlkID0gXCJhY2Vfc2V0dGluZ3NtZW51X2NvbnRhaW5lclwiO1xyXG5cclxuICAgICAgICAgICAgLy8gRW1vamkgUGlja2VyXHJcbiAgICAgICAgICAgIC8vbm9kZS5nZXRFbGVtZW50c0J5Q2xhc3NOYW1lKFwiZW1vamlQaWNrZXItM20xUy1qXCIpLmxlbmd0aCAmJiAhbm9kZS5xdWVyeVNlbGVjdG9yKFwiLmVtb2ppUGlja2VyLTNtMVMtalwiKS5wYXJlbnRFbGVtZW50LmNsYXNzTGlzdC5jb250YWlucyhcImFuaW1hdG9yTGVmdC0xRVF4VTBcIilcclxuICAgICAgICAgICAgLy9pZiAobm9kZS5jbGFzc0xpc3QuY29udGFpbnMoY2xhc3NOYW1lTGF5ZXIyKSAmJiBub2RlLmdldEVsZW1lbnRzQnlDbGFzc05hbWUoY2xhc3NOYW1lRW1vamlQaWNrZXIpLmxlbmd0aCAgJiYgIW5vZGUucXVlcnlTZWxlY3RvcihcIi5cIitjbGFzc05hbWVFbW9qaVBpY2tlcikucGFyZW50RWxlbWVudC5jbGFzc0xpc3QuY29udGFpbnMoY2xhc3NOYW1lQW5pbWF0b3JMZWZ0KSkgcXVpY2tFbW90ZU1lbnUub2JzQ2FsbGJhY2sobm9kZSk7XHJcblxyXG4gICAgICAgIH1cclxuICAgIH0pO1xyXG5cclxuICAgIG1haW5PYnNlcnZlci5vYnNlcnZlKGRvY3VtZW50LCB7XHJcbiAgICAgICAgY2hpbGRMaXN0OiB0cnVlLFxyXG4gICAgICAgIHN1YnRyZWU6IHRydWVcclxuICAgIH0pO1xyXG59O1xyXG5cclxuQ29yZS5wcm90b3R5cGUuc2hvd0NoYW5nZWxvZ01vZGFsID0gZnVuY3Rpb24ob3B0aW9ucyA9IHt9KSB7XHJcbiAgICByZXR1cm4gVXRpbHMuc2hvd0NoYW5nZWxvZ01vZGFsKG9wdGlvbnMpO1xyXG59O1xyXG5cclxuQ29yZS5wcm90b3R5cGUuYWxlcnQgPSBmdW5jdGlvbih0aXRsZSwgY29udGVudCkge1xyXG4gICAgcmV0dXJuIFV0aWxzLmFsZXJ0KHRpdGxlLCBjb250ZW50KTtcclxufTtcclxuXHJcbkNvcmUucHJvdG90eXBlLnBhdGNoU29jaWFsID0gZnVuY3Rpb24oKSB7XHJcbiAgICBpZiAodGhpcy5zb2NpYWxQYXRjaCkgcmV0dXJuO1xyXG4gICAgY29uc3QgVGFiQmFyID0gV2VicGFja01vZHVsZXMuZmluZChtID0+IG0uZGlzcGxheU5hbWUgPT0gXCJUYWJCYXJcIik7XHJcbiAgICBjb25zdCBBbmNob3IgPSBXZWJwYWNrTW9kdWxlcy5maW5kKG0gPT4gbS5kaXNwbGF5TmFtZSA9PSBcIkFuY2hvclwiKTtcclxuICAgIGlmICghVGFiQmFyKSByZXR1cm47XHJcbiAgICB0aGlzLnNvY2lhbFBhdGNoID0gVXRpbHMubW9ua2V5UGF0Y2goVGFiQmFyLnByb3RvdHlwZSwgXCJyZW5kZXJcIiwge2FmdGVyOiAoZGF0YSkgPT4ge1xyXG4gICAgICAgIGNvbnN0IGNoaWxkcmVuID0gZGF0YS5yZXR1cm5WYWx1ZS5wcm9wcy5jaGlsZHJlbjtcclxuICAgICAgICBpZiAoIWNoaWxkcmVuIHx8ICFjaGlsZHJlbi5sZW5ndGggfHwgY2hpbGRyZW4ubGVuZ3RoIDwgMykgcmV0dXJuO1xyXG4gICAgICAgIGlmIChjaGlsZHJlbltjaGlsZHJlbi5sZW5ndGggLSAzXS50eXBlLmRpc3BsYXlOYW1lICE9PSBcIlNlcGFyYXRvclwiKSByZXR1cm47XHJcbiAgICAgICAgaWYgKCFjaGlsZHJlbltjaGlsZHJlbi5sZW5ndGggLSAyXS50eXBlLnRvU3RyaW5nKCkuaW5jbHVkZXMoXCJzb2NpYWxMaW5rc1wiKSkgcmV0dXJuO1xyXG4gICAgICAgIGlmIChBbmNob3IpIHtcclxuICAgICAgICAgICAgbGV0IHNvY2lhbE1vZHVsZTEgPSBCRE1vZHVsZXMuZ2V0KGUgPT4gZS5zb2NpYWxMaW5rcylbMF1cclxuICAgICAgICAgICAgY29uc3Qgb3JpZ2luYWwgPSBjaGlsZHJlbltjaGlsZHJlbi5sZW5ndGggLSAyXS50eXBlO1xyXG4gICAgICAgICAgICBjb25zdCBuZXdPbmUgPSBmdW5jdGlvbigpIHtcclxuICAgICAgICAgICAgICAgIGNvbnN0IHJldHVyblZhbCA9IG9yaWdpbmFsKC4uLmFyZ3VtZW50cyk7XHJcbiAgICAgICAgICAgICAgICByZXR1cm5WYWwucHJvcHMuY2hpbGRyZW4ucHVzaChcclxuICAgICAgICAgICAgICAgICAgICBCRFYyLlJlYWN0LmNyZWF0ZUVsZW1lbnQoVG9vbHRpcFdyYXAsIHtjb2xvcjogXCJibGFja1wiLCBzaWRlOiBcInRvcFwiLCB0ZXh0OiBcIkxpZ2h0Y29yZFwifSxcclxuICAgICAgICAgICAgICAgICAgICAgICAgQkRWMi5SZWFjdC5jcmVhdGVFbGVtZW50KEFuY2hvciwge2NsYXNzTmFtZTogXCJiZC1zb2NpYWwtbGluayBcIitzb2NpYWxNb2R1bGUxLmxpbmssIGhyZWY6IFwiaHR0cHM6Ly9naXRodWIuY29tL0xpZ2h0Y29yZC9MaWdodGNvcmRcIiwgdGl0bGU6IFwiTGlnaHRjb3JkXCIsIHRhcmdldDogXCJfYmxhbmtcIn0sXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBCRFYyLlJlYWN0LmNyZWF0ZUVsZW1lbnQoTGlnaHRjb3JkTG9nbywge3NpemU6IFwiMTZweFwiLCBjbGFzc05hbWU6IFwiYmQtc29jaWFsLWxvZ29cIn0pXHJcbiAgICAgICAgICAgICAgICAgICAgICAgIClcclxuICAgICAgICAgICAgICAgICAgICApXHJcbiAgICAgICAgICAgICAgICApO1xyXG4gICAgICAgICAgICAgICAgcmV0dXJuVmFsLnByb3BzLmNoaWxkcmVuLnB1c2goXHJcbiAgICAgICAgICAgICAgICAgICAgQkRWMi5SZWFjdC5jcmVhdGVFbGVtZW50KFRvb2x0aXBXcmFwLCB7Y29sb3I6IFwiYmxhY2tcIiwgc2lkZTogXCJ0b3BcIiwgdGV4dDogXCJCYW5kYWdlZEJEXCJ9LFxyXG4gICAgICAgICAgICAgICAgICAgICAgICBCRFYyLlJlYWN0LmNyZWF0ZUVsZW1lbnQoQW5jaG9yLCB7Y2xhc3NOYW1lOiBcImJkLXNvY2lhbC1saW5rIFwiK3NvY2lhbE1vZHVsZTEubGluaywgaHJlZjogXCJodHRwczovL2dpdGh1Yi5jb20vcmF1ZW56aS9CZXR0ZXJEaXNjb3JkQXBwXCIsIHRpdGxlOiBcIkJhbmRhZ2VkQkRcIiwgdGFyZ2V0OiBcIl9ibGFua1wifSxcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIEJEVjIuUmVhY3QuY3JlYXRlRWxlbWVudChCRExvZ28sIHtzaXplOiBcIjE2cHhcIiwgY2xhc3NOYW1lOiBcImJkLXNvY2lhbC1sb2dvXCJ9KVxyXG4gICAgICAgICAgICAgICAgICAgICAgICApXHJcbiAgICAgICAgICAgICAgICAgICAgKVxyXG4gICAgICAgICAgICAgICAgKTtcclxuICAgICAgICAgICAgICAgIHJldHVybiByZXR1cm5WYWw7XHJcbiAgICAgICAgICAgIH07XHJcbiAgICAgICAgICAgIGNoaWxkcmVuW2NoaWxkcmVuLmxlbmd0aCAtIDJdLnR5cGUgPSBuZXdPbmU7XHJcbiAgICAgICAgfVxyXG5cclxuICAgICAgICBsZXQgW1xyXG4gICAgICAgICAgICBjbGFzc05hbWVDb2xvck11dGVkLFxyXG4gICAgICAgICAgICBzaXplcyxcclxuICAgICAgICAgICAgY2xhc3NOYW1lVmVyc2lvbkhhc2hcclxuICAgICAgICBdID0gW1xyXG4gICAgICAgICAgICBCRE1vZHVsZXMuZ2V0KGUgPT4gZS5jb2xvck11dGVkKVswXS5jb2xvck11dGVkLFxyXG4gICAgICAgICAgICBCRE1vZHVsZXMuZ2V0KGUgPT4gZS5zaXplMzIpWzBdLFxyXG4gICAgICAgICAgICBCRE1vZHVsZXMuZ2V0KGUgPT4gZS52ZXJzaW9uSGFzaClbMF0udmVyc2lvbkhhc2hcclxuICAgICAgICBdXHJcblxyXG4gICAgICAgIGNvbnN0IHZlcnNpb25IYXNoID0gYCgke2JkQ29uZmlnLmhhc2ggPyBiZENvbmZpZy5oYXNoLnN1YnN0cmluZygwLCA3KSA6IGJkQ29uZmlnLmJyYW5jaH0pYDtcclxuICAgICAgICBjb25zdCBhZGRpdGlvbmFsID0gW1xyXG4gICAgICAgICAgICBCRFYyLnJlYWN0LmNyZWF0ZUVsZW1lbnQoXCJkaXZcIiwge2NsYXNzTmFtZTogYCR7Y2xhc3NOYW1lQ29sb3JNdXRlZH0gJHtzaXplcy5zaXplMTJ9YH0sIGBMaWdodGNvcmQgJHtlbGVjdHJvbi5nZXRHbG9iYWwoXCJCdWlsZEluZm9cIikudmVyc2lvbn0gYCwgQkRWMi5yZWFjdC5jcmVhdGVFbGVtZW50KFwic3BhblwiLCB7Y2xhc3NOYW1lOiBjbGFzc05hbWVWZXJzaW9uSGFzaCtcIiBkYS12ZXJzaW9uSGFzaFwifSwgYCgkeyhlbGVjdHJvbi5nZXRHbG9iYWwoXCJCdWlsZEluZm9cIikuY29tbWl0IHx8IFwiVW5rbm93blwiKS5zbGljZSgwLCA3KX0pYCkpLFxyXG4gICAgICAgICAgICBCRFYyLnJlYWN0LmNyZWF0ZUVsZW1lbnQoXCJkaXZcIiwge2NsYXNzTmFtZTogYCR7Y2xhc3NOYW1lQ29sb3JNdXRlZH0gJHtzaXplcy5zaXplMTJ9YH0sIGBCQkQgJHtiYmRWZXJzaW9ufSBgLCBCRFYyLnJlYWN0LmNyZWF0ZUVsZW1lbnQoXCJzcGFuXCIsIHtjbGFzc05hbWU6IGNsYXNzTmFtZVZlcnNpb25IYXNoK1wiIGRhLXZlcnNpb25IYXNoXCJ9LCB2ZXJzaW9uSGFzaCkpXHJcbiAgICAgICAgXVxyXG4gICAgICAgIFxyXG5cclxuICAgICAgICBjb25zdCBvcmlnaW5hbFZlcnNpb25zID0gY2hpbGRyZW5bY2hpbGRyZW4ubGVuZ3RoIC0gMV0udHlwZTtcclxuICAgICAgICBjaGlsZHJlbltjaGlsZHJlbi5sZW5ndGggLSAxXS50eXBlID0gZnVuY3Rpb24oKSB7XHJcbiAgICAgICAgICAgIGNvbnN0IHJldHVyblZhbCA9IG9yaWdpbmFsVmVyc2lvbnMoLi4uYXJndW1lbnRzKTtcclxuICAgICAgICAgICAgcmV0dXJuVmFsLnByb3BzLmNoaWxkcmVuLnNwbGljZSgxLCAwLCBhZGRpdGlvbmFsKTtcclxuICAgICAgICAgICAgcmV0dXJuIHJldHVyblZhbDtcclxuICAgICAgICB9O1xyXG4gICAgfX0pO1xyXG59O1xyXG5cclxuY29uc3QgZ2V0R3VpbGRDbGFzc2VzID0gZnVuY3Rpb24oKSB7XHJcbiAgICBjb25zdCBndWlsZHNXcmFwcGVyID0gV2VicGFja01vZHVsZXMuZmluZEJ5UHJvcHMoXCJ3cmFwcGVyXCIsIFwidW5yZWFkTWVudGlvbnNCYXJcIik7XHJcbiAgICBjb25zdCBndWlsZHMgPSBXZWJwYWNrTW9kdWxlcy5maW5kQnlQcm9wcyhcImd1aWxkc0Vycm9yXCIsIFwic2VsZWN0ZWRcIik7XHJcbiAgICBjb25zdCBwaWxsID0gV2VicGFja01vZHVsZXMuZmluZEJ5UHJvcHMoXCJibG9iQ29udGFpbmVyXCIpO1xyXG4gICAgcmV0dXJuIE9iamVjdC5hc3NpZ24oe30sIGd1aWxkc1dyYXBwZXIsIGd1aWxkcywgcGlsbCk7XHJcbn07XHJcblxyXG5Db3JlLnByb3RvdHlwZS5wYXRjaEd1aWxkTGlzdEl0ZW1zID0gZnVuY3Rpb24oKSB7XHJcbiAgICBpZiAodGhpcy5ndWlsZExpc3RJdGVtc1BhdGNoKSByZXR1cm47XHJcbiAgICBjb25zdCBHdWlsZENsYXNzZXMgPSBnZXRHdWlsZENsYXNzZXMoKTtcclxuICAgIGNvbnN0IGxpc3RJdGVtQ2xhc3MgPSBHdWlsZENsYXNzZXMubGlzdEl0ZW0uc3BsaXQoXCIgXCIpWzBdO1xyXG4gICAgY29uc3QgYmxvYkNsYXNzID0gR3VpbGRDbGFzc2VzLmJsb2JDb250YWluZXIuc3BsaXQoXCIgXCIpWzBdO1xyXG4gICAgY29uc3QgcmVhY3RJbnN0YW5jZSA9IEJEVjIuZ2V0SW50ZXJuYWxJbnN0YW5jZShkb2N1bWVudC5xdWVyeVNlbGVjdG9yKGAuJHtsaXN0SXRlbUNsYXNzfSAuJHtibG9iQ2xhc3N9YCkucGFyZW50RWxlbWVudCk7XHJcbiAgICBjb25zdCBHdWlsZENvbXBvbmVudCA9IHJlYWN0SW5zdGFuY2UucmV0dXJuLnR5cGU7XHJcbiAgICBpZiAoIUd1aWxkQ29tcG9uZW50KSByZXR1cm47XHJcbiAgICB0aGlzLmd1aWxkTGlzdEl0ZW1zUGF0Y2ggPSBVdGlscy5tb25rZXlQYXRjaChHdWlsZENvbXBvbmVudC5wcm90b3R5cGUsIFwicmVuZGVyXCIsIHthZnRlcjogKGRhdGEpID0+IHtcclxuICAgICAgICBpZiAoZGF0YS5yZXR1cm5WYWx1ZSAmJiBkYXRhLnRoaXNPYmplY3QpIHtcclxuICAgICAgICAgICAgY29uc3QgcmV0dXJuVmFsdWUgPSBkYXRhLnJldHVyblZhbHVlO1xyXG4gICAgICAgICAgICBjb25zdCBndWlsZERhdGEgPSBkYXRhLnRoaXNPYmplY3QucHJvcHM7XHJcbiAgICAgICAgICAgIGxldCBjbGFzc05hbWUgPSByZXR1cm5WYWx1ZS5wcm9wcy5jbGFzc05hbWVcclxuICAgICAgICAgICAgY2xhc3NOYW1lICs9IFwiIGJkLWd1aWxkXCI7XHJcbiAgICAgICAgICAgIGlmIChndWlsZERhdGEudW5yZWFkKSBjbGFzc05hbWUgKz0gXCIgYmQtdW5yZWFkXCI7XHJcbiAgICAgICAgICAgIGlmIChndWlsZERhdGEuc2VsZWN0ZWQpIGNsYXNzTmFtZSArPSBcIiBiZC1zZWxlY3RlZFwiO1xyXG4gICAgICAgICAgICBpZiAoZ3VpbGREYXRhLmF1ZGlvKSBjbGFzc05hbWUgKz0gXCIgYmQtYXVkaW9cIjtcclxuICAgICAgICAgICAgaWYgKGd1aWxkRGF0YS52aWRlbykgY2xhc3NOYW1lICs9IFwiIGJkLXZpZGVvXCI7XHJcbiAgICAgICAgICAgIGlmIChndWlsZERhdGEuYmFkZ2UpIGNsYXNzTmFtZSArPSBcIiBiZC1iYWRnZVwiO1xyXG4gICAgICAgICAgICBpZiAoZ3VpbGREYXRhLmFuaW1hdGFibGUpIGNsYXNzTmFtZSArPSBcIiBiZC1hbmltYXRhYmxlXCI7XHJcbiAgICAgICAgICAgIHJldHVyblZhbHVlLnByb3BzLmNsYXNzTmFtZSA9IGNsYXNzTmFtZVxyXG4gICAgICAgICAgICByZXR1cm4gcmV0dXJuVmFsdWU7XHJcbiAgICAgICAgfVxyXG4gICAgfX0pO1xyXG59O1xyXG5cclxuQ29yZS5wcm90b3R5cGUucGF0Y2hHdWlsZFBpbGxzID0gZnVuY3Rpb24oKSB7XHJcbiAgICBpZiAodGhpcy5ndWlsZFBpbGxQYXRjaCkgcmV0dXJuO1xyXG4gICAgY29uc3QgZ3VpbGRQaWxsID0gV2VicGFja01vZHVsZXMuZmluZChtID0+IG0uZGVmYXVsdCAmJiAhbS5kZWZhdWx0LmRpc3BsYXlOYW1lICYmIG0uZGVmYXVsdC50b1N0cmluZyAmJiBtLmRlZmF1bHQudG9TdHJpbmcoKS5pbmNsdWRlcyhcInRyYW5zbGF0ZTNkXCIpKTtcclxuICAgIGlmICghZ3VpbGRQaWxsKSByZXR1cm47XHJcbiAgICB0aGlzLmd1aWxkUGlsbFBhdGNoID0gVXRpbHMubW9ua2V5UGF0Y2goZ3VpbGRQaWxsLCBcImRlZmF1bHRcIiwge2FmdGVyOiAoZGF0YSkgPT4ge1xyXG4gICAgICAgIGNvbnN0IHByb3BzID0gZGF0YS5tZXRob2RBcmd1bWVudHNbMF07XHJcbiAgICAgICAgaWYgKHByb3BzLnVucmVhZCkgZGF0YS5yZXR1cm5WYWx1ZS5wcm9wcy5jbGFzc05hbWUgKz0gXCIgYmQtdW5yZWFkXCI7XHJcbiAgICAgICAgaWYgKHByb3BzLnNlbGVjdGVkKSBkYXRhLnJldHVyblZhbHVlLnByb3BzLmNsYXNzTmFtZSArPSBcIiBiZC1zZWxlY3RlZFwiO1xyXG4gICAgICAgIGlmIChwcm9wcy5ob3ZlcmVkKSBkYXRhLnJldHVyblZhbHVlLnByb3BzLmNsYXNzTmFtZSArPSBcIiBiZC1ob3ZlcmVkXCI7XHJcbiAgICAgICAgcmV0dXJuIGRhdGEucmV0dXJuVmFsdWU7XHJcbiAgICB9fSk7XHJcbn07XHJcblxyXG5Db3JlLnByb3RvdHlwZS5wYXRjaEd1aWxkU2VwYXJhdG9yID0gZnVuY3Rpb24oKSB7XHJcbiAgICBpZiAodGhpcy5ndWlsZFNlcGFyYXRvclBhdGNoKSByZXR1cm47XHJcbiAgICBjb25zdCBHdWlsZHMgPSBXZWJwYWNrTW9kdWxlcy5maW5kQnlEaXNwbGF5TmFtZShcIkd1aWxkc1wiKTtcclxuICAgIGNvbnN0IGd1aWxkQ29tcG9uZW50cyA9IFdlYnBhY2tNb2R1bGVzLmZpbmRCeVByb3BzKFwicmVuZGVyTGlzdEl0ZW1cIik7XHJcbiAgICBpZiAoIWd1aWxkQ29tcG9uZW50cyB8fCAhR3VpbGRzKSByZXR1cm47XHJcbiAgICBjb25zdCBHdWlsZFNlcGFyYXRvciA9IGZ1bmN0aW9uKCkge1xyXG4gICAgICAgIGNvbnN0IHJldHVyblZhbHVlID0gZ3VpbGRDb21wb25lbnRzLlNlcGFyYXRvciguLi5hcmd1bWVudHMpO1xyXG4gICAgICAgIHJldHVyblZhbHVlLnByb3BzLmNsYXNzTmFtZSArPSBcIiBiZC1ndWlsZC1zZXBhcmF0b3JcIjtcclxuICAgICAgICByZXR1cm4gcmV0dXJuVmFsdWU7XHJcbiAgICB9O1xyXG4gICAgdGhpcy5ndWlsZFNlcGFyYXRvclBhdGNoID0gVXRpbHMubW9ua2V5UGF0Y2goR3VpbGRzLnByb3RvdHlwZSwgXCJyZW5kZXJcIiwge2FmdGVyOiAoZGF0YSkgPT4ge1xyXG4gICAgICAgIGRhdGEucmV0dXJuVmFsdWUucHJvcHMuY2hpbGRyZW5bMV0ucHJvcHMuY2hpbGRyZW5bM10udHlwZSA9IEd1aWxkU2VwYXJhdG9yO1xyXG4gICAgfX0pO1xyXG59O1xyXG5cclxuQ29yZS5wcm90b3R5cGUucGF0Y2hBdHRhY2htZW50ID0gZnVuY3Rpb24oKSB7XHJcbiAgICBpZiAodGhpcy5BdHRhY2htZW50UGF0Y2gpIHJldHVybjtcclxuICAgIGNvbnN0IEF0dGFjaG1lbnQgPSBCRE1vZHVsZXMuZ2V0KGUgPT4gZS5kZWZhdWx0ICYmIGUuZGVmYXVsdC5kaXNwbGF5TmFtZSA9PT0gXCJBdHRhY2htZW50XCIpWzBdIC8vIHRlbXBvcmFyeVxyXG4gICAgY29uc3QgQW5jaG9yID0gV2VicGFja01vZHVsZXMuZmluZChtID0+IG0uZGlzcGxheU5hbWUgPT0gXCJBbmNob3JcIik7XHJcbiAgICBpZiAoIUFuY2hvciB8fCAhQXR0YWNobWVudCB8fCAhQXR0YWNobWVudC5kZWZhdWx0KSByZXR1cm47XHJcbiAgICB0aGlzLkF0dGFjaG1lbnRQYXRjaCA9IFV0aWxzLm1vbmtleVBhdGNoKEF0dGFjaG1lbnQsIFwiZGVmYXVsdFwiLCB7YWZ0ZXI6IChkYXRhKSA9PiB7XHJcbiAgICAgICAgY29uc3QgYXR0YWNobWVudCA9IGRhdGEubWV0aG9kQXJndW1lbnRzWzBdIHx8IG51bGxcclxuICAgICAgICBjb25zdCBjaGlsZHJlbiA9IFV0aWxzLmdldE5lc3RlZFByb3AoZGF0YS5yZXR1cm5WYWx1ZSwgXCJwcm9wcy5jaGlsZHJlblwiKTtcclxuXHJcbiAgICAgICAgaWYgKCFjaGlsZHJlbiB8fCAhYXR0YWNobWVudCB8fCAhYXR0YWNobWVudC51cmwpcmV0dXJuXHJcbiAgICAgICAgaWYgKCFBcnJheS5pc0FycmF5KGNoaWxkcmVuKSkgcmV0dXJuO1xyXG5cclxuICAgICAgICBjb25zdCBpZCA9IHV1aWR2NCgpXHJcbiAgICAgICAgY2hpbGRyZW4ucHVzaChCRFYyLnJlYWN0LmNyZWF0ZUVsZW1lbnQoXCJkaXZcIiwge1xyXG4gICAgICAgICAgICBpZDogXCJjZXJ0aWZpZWQtXCIraWRcclxuICAgICAgICB9KSlcclxuICAgICAgICBQbHVnaW5DZXJ0aWZpZXIucGF0Y2goYXR0YWNobWVudCwgXCJjZXJ0aWZpZWQtXCIraWQpXHJcbiAgICB9fSlcclxufVxyXG5cclxuQ29yZS5wcm90b3R5cGUucGF0Y2hNZXNzYWdlSGVhZGVyID0gZnVuY3Rpb24oKSB7XHJcbiAgICBpZiAodGhpcy5tZXNzYWdlSGVhZGVyUGF0Y2gpIHJldHVybjtcclxuICAgIGNvbnN0IE1lc3NhZ2VIZWFkZXIgPSBXZWJwYWNrTW9kdWxlcy5maW5kQnlQcm9wcyhcIk1lc3NhZ2VUaW1lc3RhbXBcIik7XHJcbiAgICBjb25zdCBBbmNob3IgPSBXZWJwYWNrTW9kdWxlcy5maW5kKG0gPT4gbS5kaXNwbGF5TmFtZSA9PSBcIkFuY2hvclwiKTtcclxuICAgIGlmICghQW5jaG9yIHx8ICFNZXNzYWdlSGVhZGVyIHx8ICFNZXNzYWdlSGVhZGVyLmRlZmF1bHQpIHJldHVybjtcclxuICAgIHRoaXMubWVzc2FnZUhlYWRlclBhdGNoID0gVXRpbHMubW9ua2V5UGF0Y2goTWVzc2FnZUhlYWRlciwgXCJkZWZhdWx0XCIsIHthZnRlcjogKGRhdGEpID0+IHtcclxuICAgICAgICBjb25zdCBhdXRob3IgPSBVdGlscy5nZXROZXN0ZWRQcm9wKGRhdGEubWV0aG9kQXJndW1lbnRzWzBdLCBcIm1lc3NhZ2UuYXV0aG9yXCIpO1xyXG4gICAgICAgIC8vIGNvbnN0IGhlYWRlciA9IFV0aWxzLmdldE5lc3RlZFByb3AoZGF0YS5yZXR1cm5WYWx1ZSwgXCJwcm9wcy5jaGlsZHJlbi4xLnByb3BzXCIpO1xyXG4gICAgICAgIGNvbnN0IGNoaWxkcmVuID0gVXRpbHMuZ2V0TmVzdGVkUHJvcChkYXRhLnJldHVyblZhbHVlLCBcInByb3BzLmNoaWxkcmVuLjEucHJvcHMuY2hpbGRyZW4uMS5wcm9wcy5jaGlsZHJlblwiKTtcclxuICAgICAgICBpZiAoIWNoaWxkcmVuIHx8ICFhdXRob3IgfHwgIWF1dGhvci5pZClyZXR1cm5cclxuICAgICAgICAvLyBpZiAoaGVhZGVyICYmIGhlYWRlci5jbGFzc05hbWUpIGhlYWRlci5jbGFzc05hbWUgKz0gXCIgXCJcclxuICAgICAgICBpZiAoIUFycmF5LmlzQXJyYXkoY2hpbGRyZW4pKSByZXR1cm47XHJcbiAgICAgICAgaWYgKGF1dGhvci5pZCA9PT0gXCIyNDk3NDYyMzYwMDgxNjk0NzNcIikgeyAvLyBSYXVlbnppOiBCYW5kYWdlZEJEIERldmVsb3BlclxyXG4gICAgICAgICAgICBjaGlsZHJlbi5wdXNoKFxyXG4gICAgICAgICAgICAgICAgQkRWMi5SZWFjdC5jcmVhdGVFbGVtZW50KFRvb2x0aXBXcmFwLCB7Y29sb3I6IFwiYmxhY2tcIiwgc2lkZTogXCJ0b3BcIiwgdGV4dDogXCJCYW5kYWdlZEJEIERldmVsb3BlclwifSxcclxuICAgICAgICAgICAgICAgICAgICBCRFYyLlJlYWN0LmNyZWF0ZUVsZW1lbnQoQW5jaG9yLCB7Y2xhc3NOYW1lOiBcImJkLWNoYXQtYmFkZ2VcIiwgaHJlZjogXCJodHRwczovL2dpdGh1Yi5jb20vcmF1ZW56aS9CZXR0ZXJEaXNjb3JkQXBwXCIsIHRpdGxlOiBcIkJhbmRhZ2VkQkRcIiwgdGFyZ2V0OiBcIl9ibGFua1wifSxcclxuICAgICAgICAgICAgICAgICAgICAgICAgQkRWMi5SZWFjdC5jcmVhdGVFbGVtZW50KEJETG9nbywge3NpemU6IFwiMTZweFwiLCBjbGFzc05hbWU6IFwiYmQtbG9nb1wifSlcclxuICAgICAgICAgICAgICAgICAgICApXHJcbiAgICAgICAgICAgICAgICApXHJcbiAgICAgICAgICAgICk7XHJcbiAgICAgICAgfSBlbHNlIGlmIChhdXRob3IuaWQgPT09IFwiNjk2NDgxMTk0NDQzMDE0MTc0XCIgfHwgYXV0aG9yLmlkID09PSBcIjY5NjAwMzQ1NjYxMTM4NTM5NlwiKXsgLy8gTm90IFRob21pejogTGlnaHRjb3JkIERldmVsb3BlciwgUGhvcmN5czogTGlnaHRjb3JkIERldmVsb3BlclxyXG4gICAgICAgICAgICBjaGlsZHJlbi5wdXNoKFxyXG4gICAgICAgICAgICAgICAgQkRWMi5SZWFjdC5jcmVhdGVFbGVtZW50KFRvb2x0aXBXcmFwLCB7Y29sb3I6IFwiYmxhY2tcIiwgc2lkZTogXCJ0b3BcIiwgdGV4dDogXCJMaWdodGNvcmQgRGV2ZWxvcGVyXCJ9LFxyXG4gICAgICAgICAgICAgICAgICAgIEJEVjIuUmVhY3QuY3JlYXRlRWxlbWVudChBbmNob3IsIHtjbGFzc05hbWU6IFwiYmQtY2hhdC1iYWRnZVwiLCBocmVmOiBcImh0dHBzOi8vZ2l0aHViLmNvbS9MaWdodGNvcmQvTGlnaHRjb3JkXCIsIHRpdGxlOiBcIkxpZ2h0Y29yZFwiLCB0YXJnZXQ6IFwiX2JsYW5rXCJ9LFxyXG4gICAgICAgICAgICAgICAgICAgICAgICBCRFYyLlJlYWN0LmNyZWF0ZUVsZW1lbnQoTGlnaHRjb3JkTG9nbywge3NpemU6IFwiMTZweFwiLCBjbGFzc05hbWU6IFwiYmQtbG9nb1wifSlcclxuICAgICAgICAgICAgICAgICAgICApXHJcbiAgICAgICAgICAgICAgICApXHJcbiAgICAgICAgICAgICk7XHJcbiAgICAgICAgfVxyXG4gICAgICAgIGNvbnN0IGlkID0gdXVpZHY0KClcclxuICAgICAgICBjaGlsZHJlbi5wdXNoKFxyXG4gICAgICAgICAgICBCRFYyLlJlYWN0LmNyZWF0ZUVsZW1lbnQoXCJkaXZcIiwge1xyXG4gICAgICAgICAgICAgICAgaWQ6IFwiYmFkZ2VzLVwiK2lkLFxyXG4gICAgICAgICAgICAgICAgc3R5bGU6IHtcclxuICAgICAgICAgICAgICAgICAgICBkaXNwbGF5OiBcImlubGluZVwiXHJcbiAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIH0pXHJcbiAgICAgICAgKVxyXG4gICAgICAgIGFwcGx5QmFkZ2VzKGlkLCBhdXRob3IsIHRydWUpXHJcbiAgICB9fSk7XHJcbn07XHJcblxyXG5mdW5jdGlvbiBhcHBseUJhZGdlcyhpZCwgdXNlciwgY2hhdCl7XHJcbiAgICBwcm9jZXNzLm5leHRUaWNrKCgpID0+IHtcclxuICAgICAgICBjb25zdCBkaXYgPSBkb2N1bWVudC5nZXRFbGVtZW50QnlJZChcImJhZGdlcy1cIitpZClcclxuICAgICAgICBpZighZGl2IHx8IGRpdi5jaGlsZE5vZGVzLmxlbmd0aCA+IDApcmV0dXJuXHJcbiAgICAgICAgaWYoZGl2LmNoaWxkTm9kZXMubGVuZ3RoKXJldHVyblxyXG4gICAgICAgIGxldCBibG9ja0RpdiA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoXCJkaXZcIilcclxuICAgICAgICBibG9ja0Rpdi5zdHlsZS5kaXNwbGF5ID0gXCJub25lXCJcclxuICAgICAgICBkaXYuYXBwZW5kQ2hpbGQoYmxvY2tEaXYpXHJcblxyXG4gICAgICAgIGNvbnN0IEFuY2hvciA9IFdlYnBhY2tNb2R1bGVzLmZpbmQobSA9PiBtLmRpc3BsYXlOYW1lID09IFwiQW5jaG9yXCIpO1xyXG5cclxuICAgICAgICBkaXN0YW50LmdldEJhZGdlcyh1c2VyLmlkKVxyXG4gICAgICAgIC50aGVuKGJhZGdlcyA9PiB7XHJcbiAgICAgICAgICAgIGJhZGdlcy5mb3JFYWNoKGJhZGdlID0+IHtcclxuICAgICAgICAgICAgICAgIGNvbnN0IHByb3BzID0ge1xyXG4gICAgICAgICAgICAgICAgICAgIHN2Zzoge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICBzaXplOiBcIjE2cHhcIiwgXHJcbiAgICAgICAgICAgICAgICAgICAgICAgIGNsYXNzTmFtZTogXCJiZC1sb2dvXCIsXHJcbiAgICAgICAgICAgICAgICAgICAgICAgIHdpZHRoOiBcIjE2cHhcIiwgXHJcbiAgICAgICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgICAgYmFkZ2Uuc2NvcGVzLmZvckVhY2goc2NvcGUgPT4ge1xyXG4gICAgICAgICAgICAgICAgICAgIGlmKHNjb3BlID09PSBcInVzZXJcIil7Ly8gcmVxdWlyZSB1c2VyXHJcbiAgICAgICAgICAgICAgICAgICAgICAgIHByb3BzLnVzZXIgPSB1c2VyXHJcbiAgICAgICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgICAgfSkgXHJcbiAgICAgICAgICAgICAgICBpZighYmFkZ2UuaHJlZil7XHJcbiAgICAgICAgICAgICAgICAgICAgcHJvcHMuQW5jaG9yID0gQW5jaG9yXHJcbiAgICAgICAgICAgICAgICAgICAgcHJvcHMuaHJlZiA9IHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgY2xhc3NOYW1lOiBjaGF0ID8gXCJiZC1jaGF0LWJhZGdlXCIgOiBcImJkLW1lbWJlci1iYWRnZVwiLCBcclxuICAgICAgICAgICAgICAgICAgICAgICAgdGl0bGU6IGJhZGdlLm5hbWUsIFxyXG4gICAgICAgICAgICAgICAgICAgICAgICB0YXJnZXQ6IFwiX2JsYW5rXCJcclxuICAgICAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgICBjb25zdCBlbGVtZW50ID0gQkRWMi5SZWFjdC5jcmVhdGVFbGVtZW50KFRvb2x0aXBXcmFwLCB7Y29sb3I6IFwiYmxhY2tcIiwgc2lkZTogXCJ0b3BcIiwgdGV4dDogYmFkZ2UubmFtZX0sXHJcbiAgICAgICAgICAgICAgICAgICAgYmFkZ2UuaHJlZiA/IEJEVjIucmVhY3QuY3JlYXRlRWxlbWVudChBbmNob3IsIHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgaHJlZjogYmFkZ2UuaHJlZixcclxuICAgICAgICAgICAgICAgICAgICAgICAgY2xhc3NOYW1lOiBjaGF0ID8gXCJiZC1jaGF0LWJhZGdlXCIgOiBcImJkLW1lbWJlci1iYWRnZVwiLCBcclxuICAgICAgICAgICAgICAgICAgICAgICAgdGl0bGU6IGJhZGdlLm5hbWUsIFxyXG4gICAgICAgICAgICAgICAgICAgICAgICB0YXJnZXQ6IFwiX2JsYW5rXCJcclxuICAgICAgICAgICAgICAgICAgICB9LCBCRFYyLlJlYWN0LmNyZWF0ZUVsZW1lbnQoYmFkZ2UuY29tcG9uZW50LCBwcm9wcykpIDogQkRWMi5SZWFjdC5jcmVhdGVFbGVtZW50KGJhZGdlLmNvbXBvbmVudCwgcHJvcHMpXHJcbiAgICAgICAgICAgICAgICApXHJcbiAgICAgICAgICAgICAgICBjb25zdCBkaXYyID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudChcImRpdlwiKVxyXG4gICAgICAgICAgICAgICAgQkRWMi5yZWFjdERvbS5yZW5kZXIoZWxlbWVudCwgZGl2MilcclxuICAgICAgICAgICAgICAgIGRpdjIuY2hpbGROb2Rlcy5mb3JFYWNoKG5vZGUgPT4ge1xyXG4gICAgICAgICAgICAgICAgICAgIGRpdi5hcHBlbmRDaGlsZChub2RlKVxyXG4gICAgICAgICAgICAgICAgfSlcclxuICAgICAgICAgICAgfSlcclxuICAgICAgICB9KVxyXG4gICAgfSlcclxufVxyXG5cclxuQ29yZS5wcm90b3R5cGUucGF0Y2hNZW1iZXJMaXN0ID0gZnVuY3Rpb24oKSB7XHJcbiAgICBpZiAodGhpcy5tZW1iZXJMaXN0UGF0Y2gpIHJldHVybjtcclxuICAgIGNvbnN0IE1lbWJlckxpc3RJdGVtID0gV2VicGFja01vZHVsZXMuZmluZEJ5RGlzcGxheU5hbWUoXCJNZW1iZXJMaXN0SXRlbVwiKTtcclxuICAgIGNvbnN0IEFuY2hvciA9IFdlYnBhY2tNb2R1bGVzLmZpbmQobSA9PiBtLmRpc3BsYXlOYW1lID09IFwiQW5jaG9yXCIpO1xyXG4gICAgaWYgKCFBbmNob3IgfHwgIU1lbWJlckxpc3RJdGVtIHx8ICFNZW1iZXJMaXN0SXRlbS5wcm90b3R5cGUgfHwgIU1lbWJlckxpc3RJdGVtLnByb3RvdHlwZS5yZW5kZXJEZWNvcmF0b3JzKSByZXR1cm47XHJcbiAgICB0aGlzLm1lbWJlckxpc3RQYXRjaCA9IFV0aWxzLm1vbmtleVBhdGNoKE1lbWJlckxpc3RJdGVtLnByb3RvdHlwZSwgXCJyZW5kZXJEZWNvcmF0b3JzXCIsIHthZnRlcjogKGRhdGEpID0+IHtcclxuICAgICAgICBjb25zdCB1c2VyID0gVXRpbHMuZ2V0TmVzdGVkUHJvcChkYXRhLnRoaXNPYmplY3QsIFwicHJvcHMudXNlclwiKTtcclxuICAgICAgICBjb25zdCBjaGlsZHJlbiA9IFV0aWxzLmdldE5lc3RlZFByb3AoZGF0YS5yZXR1cm5WYWx1ZSwgXCJwcm9wcy5jaGlsZHJlblwiKTtcclxuICAgICAgICBpZiAoIWNoaWxkcmVuIHx8ICF1c2VyIHx8ICF1c2VyLmlkKXJldHVyblxyXG4gICAgICAgIC8vIGlmIChoZWFkZXIgJiYgaGVhZGVyLmNsYXNzTmFtZSkgaGVhZGVyLmNsYXNzTmFtZSArPSBcIiBcIlxyXG4gICAgICAgIGlmICghQXJyYXkuaXNBcnJheShjaGlsZHJlbikpIHJldHVybjtcclxuICAgICAgICBpZiAodXNlci5pZCA9PT0gXCIyNDk3NDYyMzYwMDgxNjk0NzNcIikge1xyXG4gICAgICAgICAgICBjaGlsZHJlbi5wdXNoKFxyXG4gICAgICAgICAgICAgICAgQkRWMi5SZWFjdC5jcmVhdGVFbGVtZW50KFRvb2x0aXBXcmFwLCB7Y29sb3I6IFwiYmxhY2tcIiwgc2lkZTogXCJ0b3BcIiwgdGV4dDogXCJCYW5kYWdlZEJEIERldmVsb3BlclwifSxcclxuICAgICAgICAgICAgICAgICAgICBCRFYyLlJlYWN0LmNyZWF0ZUVsZW1lbnQoQW5jaG9yLCB7Y2xhc3NOYW1lOiBcImJkLW1lbWJlci1iYWRnZVwiLCBocmVmOiBcImh0dHBzOi8vZ2l0aHViLmNvbS9yYXVlbnppL0JldHRlckRpc2NvcmRBcHBcIiwgdGl0bGU6IFwiQmFuZGFnZWRCRFwiLCB0YXJnZXQ6IFwiX2JsYW5rXCJ9LFxyXG4gICAgICAgICAgICAgICAgICAgICAgICBCRFYyLlJlYWN0LmNyZWF0ZUVsZW1lbnQoQkRMb2dvLCB7c2l6ZTogXCIxNnB4XCIsIGNsYXNzTmFtZTogXCJiZC1sb2dvXCJ9KVxyXG4gICAgICAgICAgICAgICAgICAgIClcclxuICAgICAgICAgICAgICAgIClcclxuICAgICAgICAgICAgKTtcclxuICAgICAgICB9IGVsc2UgaWYgKHVzZXIuaWQgPT09IFwiNjk2NDgxMTk0NDQzMDE0MTc0XCIgfHwgdXNlci5pZCA9PT0gXCI2OTYwMDM0NTY2MTEzODUzOTZcIil7XHJcbiAgICAgICAgICAgIGNoaWxkcmVuLnB1c2goXHJcbiAgICAgICAgICAgICAgICBCRFYyLlJlYWN0LmNyZWF0ZUVsZW1lbnQoVG9vbHRpcFdyYXAsIHtjb2xvcjogXCJibGFja1wiLCBzaWRlOiBcInRvcFwiLCB0ZXh0OiBcIkxpZ2h0Y29yZCBEZXZlbG9wZXJcIn0sXHJcbiAgICAgICAgICAgICAgICAgICAgQkRWMi5SZWFjdC5jcmVhdGVFbGVtZW50KEFuY2hvciwge2NsYXNzTmFtZTogXCJiZC1tZW1iZXItYmFkZ2VcIiwgaHJlZjogXCJodHRwczovL2dpdGh1Yi5jb20vTGlnaHRjb3JkL0xpZ2h0Y29yZFwiLCB0aXRsZTogXCJMaWdodGNvcmRcIiwgdGFyZ2V0OiBcIl9ibGFua1wifSxcclxuICAgICAgICAgICAgICAgICAgICAgICAgQkRWMi5SZWFjdC5jcmVhdGVFbGVtZW50KExpZ2h0Y29yZExvZ28sIHtzaXplOiBcIjE2cHhcIiwgY2xhc3NOYW1lOiBcImJkLWxvZ29cIn0pXHJcbiAgICAgICAgICAgICAgICAgICAgKVxyXG4gICAgICAgICAgICAgICAgKVxyXG4gICAgICAgICAgICApO1xyXG4gICAgICAgIH1cclxuICAgICAgICBjb25zdCBpZCA9IHV1aWR2NCgpXHJcbiAgICAgICAgY2hpbGRyZW4ucHVzaChcclxuICAgICAgICAgICAgQkRWMi5SZWFjdC5jcmVhdGVFbGVtZW50KFwiZGl2XCIsIHtpZDogXCJiYWRnZXMtXCIraWR9KVxyXG4gICAgICAgIClcclxuICAgICAgICBhcHBseUJhZGdlcyhpZCwgdXNlciwgZmFsc2UpXHJcbiAgICB9fSk7XHJcbn07XHJcblxyXG5Db3JlLnByb3RvdHlwZS51cGRhdGVJbmplY3RvciA9IGFzeW5jIGZ1bmN0aW9uKCkge1xyXG4gICAgY29uc3QgaW5qZWN0aW9uUGF0aCA9IERhdGFTdG9yZS5pbmplY3Rpb25QYXRoO1xyXG4gICAgaWYgKCFpbmplY3Rpb25QYXRoKSByZXR1cm4gZmFsc2U7XHJcblxyXG4gICAgY29uc3QgZnMgPSByZXF1aXJlKFwiZnNcIik7XHJcbiAgICBjb25zdCBwYXRoID0gcmVxdWlyZShcInBhdGhcIik7XHJcbiAgICBjb25zdCBybXJmID0gcmVxdWlyZShcInJpbXJhZlwiKTtcclxuICAgIGNvbnN0IHlhdXpsID0gcmVxdWlyZShcInlhdXpsXCIpO1xyXG4gICAgY29uc3QgbWtkaXJwID0gcmVxdWlyZShcIm1rZGlycFwiKTtcclxuICAgIGNvbnN0IHJlcXVlc3QgPSAvKnJlcXVpcmUoXCJyZXF1ZXN0XCIpOyovIG51bGxcclxuXHJcbiAgICBjb25zdCBwYXJlbnRQYXRoID0gcGF0aC5yZXNvbHZlKGluamVjdGlvblBhdGgsIFwiLi5cIik7XHJcbiAgICBjb25zdCBmb2xkZXJOYW1lID0gcGF0aC5iYXNlbmFtZShpbmplY3Rpb25QYXRoKTtcclxuICAgIGNvbnN0IHppcExpbmsgPSBcImh0dHBzOi8vZ2l0aHViLmNvbS9yYXVlbnppL0JldHRlckRpc2NvcmRBcHAvYXJjaGl2ZS9pbmplY3Rvci56aXBcIjtcclxuICAgIGNvbnN0IHNhdmVkWmlwID0gcGF0aC5yZXNvbHZlKHBhcmVudFBhdGgsIFwiaW5qZWN0b3IuemlwXCIpO1xyXG4gICAgY29uc3QgZXh0cmFjdGVkRm9sZGVyID0gcGF0aC5yZXNvbHZlKHBhcmVudFBhdGgsIFwiQmV0dGVyRGlzY29yZEFwcC1pbmplY3RvclwiKTtcclxuXHJcbiAgICAvLyBEb3dubG9hZCB0aGUgaW5qZWN0b3IgemlwIGZpbGVcclxuICAgIFV0aWxzLmxvZyhcIkluamVjdG9yVXBkYXRlXCIsIFwiRG93bmxvYWRpbmcgXCIgKyB6aXBMaW5rKTtcclxuICAgIGxldCBzdWNjZXNzID0gYXdhaXQgbmV3IFByb21pc2UocmVzb2x2ZSA9PiB7XHJcbiAgICAgICAgcmVxdWVzdC5nZXQoe3VybDogemlwTGluaywgZW5jb2Rpbmc6IG51bGx9LCBhc3luYyAoZXJyb3IsIHJlc3BvbnNlLCBib2R5KSA9PiB7XHJcbiAgICAgICAgICAgIGlmIChlcnJvciB8fCByZXNwb25zZS5zdGF0dXNDb2RlICE9PSAyMDApIHJldHVybiByZXNvbHZlKGZhbHNlKTtcclxuICAgICAgICAgICAgLy8gU2F2ZSBhIGJhY2t1cCBpbiBjYXNlIHNvbWVvbmUgaGFzIHRoZWlyIG93biBjb3B5XHJcbiAgICAgICAgICAgIGNvbnN0IGFscmVhZHlFeGlzdHMgPSBhd2FpdCBuZXcgUHJvbWlzZShyZXMgPT4gZnMuZXhpc3RzKHNhdmVkWmlwLCByZXMpKTtcclxuICAgICAgICAgICAgaWYgKGFscmVhZHlFeGlzdHMpIGF3YWl0IG5ldyBQcm9taXNlKHJlcyA9PiBmcy5yZW5hbWUoc2F2ZWRaaXAsIGAke3NhdmVkWmlwfS5iYWske01hdGgucm91bmQocGVyZm9ybWFuY2Uubm93KCkpfWAsIHJlcykpO1xyXG5cclxuICAgICAgICAgICAgVXRpbHMubG9nKFwiSW5qZWN0b3JVcGRhdGVcIiwgXCJXcml0aW5nIFwiICsgc2F2ZWRaaXApO1xyXG4gICAgICAgICAgICBmcy53cml0ZUZpbGUoc2F2ZWRaaXAsIGJvZHksIGVyciA9PiByZXNvbHZlKCFlcnIpKTtcclxuICAgICAgICB9KTtcclxuICAgIH0pO1xyXG4gICAgaWYgKCFzdWNjZXNzKSByZXR1cm4gc3VjY2VzcztcclxuXHJcbiAgICAvLyBDaGVjayBhbmQgZGVsZXRlIHJlbmFtZSBleHRyYWN0aW9uXHJcbiAgICBjb25zdCBhbHJlYWR5RXhpc3RzID0gYXdhaXQgbmV3IFByb21pc2UocmVzID0+IGZzLmV4aXN0cyhleHRyYWN0ZWRGb2xkZXIsIHJlcykpO1xyXG4gICAgaWYgKGFscmVhZHlFeGlzdHMpIGF3YWl0IG5ldyBQcm9taXNlKHJlcyA9PiBmcy5yZW5hbWUoZXh0cmFjdGVkRm9sZGVyLCBgJHtleHRyYWN0ZWRGb2xkZXJ9LmJhayR7TWF0aC5yb3VuZChwZXJmb3JtYW5jZS5ub3coKSl9YCwgcmVzKSk7XHJcbiAgICBcclxuICAgIC8vIFVuemlwIHRoZSBkb3dubG9hZGVkIHppcCBmaWxlXHJcbiAgICBjb25zdCB6aXBmaWxlID0gYXdhaXQgbmV3IFByb21pc2UociA9PiB5YXV6bC5vcGVuKHNhdmVkWmlwLCB7bGF6eUVudHJpZXM6IHRydWV9LCAoZXJyLCB6aXApID0+ICByKHppcCkpKTtcclxuICAgIHppcGZpbGUub24oXCJlbnRyeVwiLCBmdW5jdGlvbihlbnRyeSkge1xyXG4gICAgICAgIC8vIFNraXAgZGlyZWN0b3JpZXMsIHRoZXkgYXJlIGhhbmRsZWQgd2l0aCBta2RpcnBcclxuICAgICAgICBpZiAoZW50cnkuZmlsZU5hbWUuZW5kc1dpdGgoXCIvXCIpKSByZXR1cm4gemlwZmlsZS5yZWFkRW50cnkoKTtcclxuXHJcbiAgICAgICAgVXRpbHMubG9nKFwiSW5qZWN0b3JVcGRhdGVcIiwgXCJFeHRyYWN0aW5nIFwiICsgZW50cnkuZmlsZU5hbWUpO1xyXG4gICAgICAgIC8vIE1ha2UgYW55IG5lZWRlZCBwYXJlbnQgZGlyZWN0b3JpZXNcclxuICAgICAgICBjb25zdCBmdWxsUGF0aCA9IHBhdGgucmVzb2x2ZShwYXJlbnRQYXRoLCBlbnRyeS5maWxlTmFtZSk7XHJcbiAgICAgICAgbWtkaXJwLnN5bmMocGF0aC5kaXJuYW1lKGZ1bGxQYXRoKSk7XHJcbiAgICAgICAgemlwZmlsZS5vcGVuUmVhZFN0cmVhbShlbnRyeSwgZnVuY3Rpb24oZXJyLCByZWFkU3RyZWFtKSB7XHJcbiAgICAgICAgICAgIGlmIChlcnIpIHJldHVybiBzdWNjZXNzID0gZmFsc2U7XHJcbiAgICAgICAgICAgIHJlYWRTdHJlYW0ub24oXCJlbmRcIiwgZnVuY3Rpb24oKSB7emlwZmlsZS5yZWFkRW50cnkoKTt9KTsgLy8gR28gdG8gbmV4dCBmaWxlIGFmdGVyIHRoaXNcclxuICAgICAgICAgICAgcmVhZFN0cmVhbS5waXBlKGZzLmNyZWF0ZVdyaXRlU3RyZWFtKGZ1bGxQYXRoKSk7XHJcbiAgICAgICAgfSk7XHJcbiAgICB9KTtcclxuICAgIHppcGZpbGUucmVhZEVudHJ5KCk7IC8vIFN0YXJ0IHJlYWRpbmdcclxuXHJcbiAgICAvLyBXYWl0IGZvciB0aGUgZmluYWwgZmlsZSB0byBmaW5pc2hcclxuICAgIGF3YWl0IG5ldyBQcm9taXNlKHJlc29sdmUgPT4gemlwZmlsZS5vbmNlKFwiZW5kXCIsIHJlc29sdmUpKTtcclxuXHJcbiAgICAvLyBTYXZlIGEgYmFja3VwIGluIGNhc2Ugc29tZXRoaW5nIGdvZXMgd3JvbmcgZHVyaW5nIGZpbmFsIHN0ZXBcclxuICAgIGNvbnN0IGJhY2t1cEZvbGRlciA9IHBhdGgucmVzb2x2ZShwYXJlbnRQYXRoLCBgJHtmb2xkZXJOYW1lfS5iYWske01hdGgucm91bmQocGVyZm9ybWFuY2Uubm93KCkpfWApO1xyXG4gICAgYXdhaXQgbmV3IFByb21pc2UocmVzb2x2ZSA9PiBmcy5yZW5hbWUoaW5qZWN0aW9uUGF0aCwgYmFja3VwRm9sZGVyLCByZXNvbHZlKSk7XHJcblxyXG4gICAgLy8gUmVuYW1lIHRoZSBleHRyYWN0ZWQgZm9sZGVyIHRvIHdoYXQgaXQgc2hvdWxkIGJlXHJcbiAgICBVdGlscy5sb2coXCJJbmplY3RvclVwZGF0ZVwiLCBgUmVuYW1pbmcgJHtwYXRoLmJhc2VuYW1lKGV4dHJhY3RlZEZvbGRlcil9IHRvICR7Zm9sZGVyTmFtZX1gKTtcclxuICAgIHN1Y2Nlc3MgPSBhd2FpdCBuZXcgUHJvbWlzZShyZXNvbHZlID0+IGZzLnJlbmFtZShleHRyYWN0ZWRGb2xkZXIsIGluamVjdGlvblBhdGgsIGVyciA9PiByZXNvbHZlKCFlcnIpKSk7XHJcbiAgICBpZiAoIXN1Y2Nlc3MpIHtcclxuICAgICAgICBVdGlscy5lcnIoXCJJbmplY3RvclVwZGF0ZVwiLCBcIkZhaWxlZCB0byByZW5hbWUgdGhlIGZpbmFsIGRpcmVjdG9yeVwiKTtcclxuICAgICAgICByZXR1cm4gc3VjY2VzcztcclxuICAgIH1cclxuXHJcbiAgICAvLyBJZiByZW5hbWUgaGFkIGlzc3VlcywgZGVsZXRlIHdoYXQgd2UgdHJpZWQgdG8gcmVuYW1lIGFuZCByZXN0b3JlIGJhY2t1cFxyXG4gICAgaWYgKCFzdWNjZXNzKSB7XHJcbiAgICAgICAgVXRpbHMuZXJyKFwiSW5qZWN0b3JVcGRhdGVcIiwgXCJTb21ldGhpbmcgd2VudCB3cm9uZy4uLiByZXN0b3JpbmcgYmFja3Vwcy5cIik7XHJcbiAgICAgICAgYXdhaXQgbmV3IFByb21pc2UocmVzb2x2ZSA9PiBybXJmKGV4dHJhY3RlZEZvbGRlciwgcmVzb2x2ZSkpO1xyXG4gICAgICAgIGF3YWl0IG5ldyBQcm9taXNlKHJlc29sdmUgPT4gZnMucmVuYW1lKGJhY2t1cEZvbGRlciwgaW5qZWN0aW9uUGF0aCwgcmVzb2x2ZSkpO1xyXG4gICAgICAgIHJldHVybiBzdWNjZXNzO1xyXG4gICAgfVxyXG5cclxuICAgIC8vIElmIHdlJ3ZlIGdvdHRlbiB0byB0aGlzIHBvaW50LCBldmVyeXRoaW5nIHNob3VsZCBoYXZlIGdvbmUgc21vb3RobHkuXHJcbiAgICAvLyBDbGVhbnVwIHRoZSBiYWNrdXAgZm9sZGVyIHRoZW4gcmVtb3ZlIHRoZSB6aXBcclxuICAgIGF3YWl0IG5ldyBQcm9taXNlKHJlc29sdmUgPT4gcm1yZihiYWNrdXBGb2xkZXIsIHJlc29sdmUpKTtcclxuICAgIGF3YWl0IG5ldyBQcm9taXNlKHJlc29sdmUgPT4gZnMudW5saW5rKHNhdmVkWmlwLCByZXNvbHZlKSk7XHJcblxyXG4gICAgVXRpbHMubG9nKFwiSW5qZWN0b3JVcGRhdGVcIiwgXCJJbmplY3RvciBVcGRhdGVkIVwiKTtcclxuICAgIHJldHVybiBzdWNjZXNzO1xyXG59O1xyXG5cclxuZXhwb3J0IGRlZmF1bHQgbmV3IENvcmUoKTsiLCJjb25zdCBfX25vbl93ZWJwYWNrX3JlcXVpcmVfXyA9IHdpbmRvdy5yZXF1aXJlXHJcblxyXG5pbXBvcnQge2JkQ29uZmlnfSBmcm9tIFwiLi4vMGdsb2JhbHNcIjtcclxuaW1wb3J0IFV0aWxzIGZyb20gXCIuL3V0aWxzXCI7XHJcbmltcG9ydCBDb250ZW50TWFuYWdlciBmcm9tIFwiLi9jb250ZW50TWFuYWdlclwiO1xyXG5cclxuY29uc3QgZnMgPSByZXF1aXJlKFwiZnNcIik7XHJcbmNvbnN0IHBhdGggPSByZXF1aXJlKFwicGF0aFwiKTtcclxuY29uc3QgcmVsZWFzZUNoYW5uZWwgPSBEaXNjb3JkTmF0aXZlLmdsb2JhbHMgPyBEaXNjb3JkTmF0aXZlLmdsb2JhbHMucmVsZWFzZUNoYW5uZWwgOiBEaXNjb3JkTmF0aXZlLmFwcCA/IERpc2NvcmROYXRpdmUuYXBwLmdldFJlbGVhc2VDaGFubmVsKCkgOiBcInN0YWJsZVwiO1xyXG5cclxuZXhwb3J0IGRlZmF1bHQgbmV3IGNsYXNzIERhdGFTdG9yZSB7XHJcbiAgICBjb25zdHJ1Y3RvcigpIHtcclxuICAgICAgICB0aGlzLmRhdGEgPSB7c2V0dGluZ3M6IHtzdGFibGU6IHt9LCBjYW5hcnk6IHt9LCBwdGI6IHt9fX07XHJcbiAgICAgICAgdGhpcy5wbHVnaW5EYXRhID0ge307XHJcbiAgICB9XHJcblxyXG4gICAgaW5pdGlhbGl6ZSgpIHtcclxuICAgICAgICB0cnkge1xyXG4gICAgICAgICAgICBpZiAoIWZzLmV4aXN0c1N5bmModGhpcy5CREZpbGUpKSBmcy53cml0ZUZpbGVTeW5jKHRoaXMuQkRGaWxlLCBKU09OLnN0cmluZ2lmeSh0aGlzLmRhdGEsIG51bGwsIDQpLCBcImJpbmFyeVwiKTtcclxuICAgICAgICAgICAgY29uc3QgZGF0YSA9IEpTT04ucGFyc2UoZnMucmVhZEZpbGVTeW5jKHRoaXMuQkRGaWxlLCBcImJpbmFyeVwiKSlcclxuICAgICAgICAgICAgaWYgKGRhdGEuaGFzT3duUHJvcGVydHkoXCJzZXR0aW5nc1wiKSkgdGhpcy5kYXRhID0gZGF0YTtcclxuICAgICAgICAgICAgaWYgKCFmcy5leGlzdHNTeW5jKHRoaXMuc2V0dGluZ3NGaWxlKSkgcmV0dXJuO1xyXG4gICAgICAgICAgICBsZXQgc2V0dGluZ3MgPSBfX25vbl93ZWJwYWNrX3JlcXVpcmVfXyh0aGlzLnNldHRpbmdzRmlsZSk7XHJcbiAgICAgICAgICAgIGZzLnVubGlua1N5bmModGhpcy5zZXR0aW5nc0ZpbGUpO1xyXG4gICAgICAgICAgICBpZiAoc2V0dGluZ3MuaGFzT3duUHJvcGVydHkoXCJzZXR0aW5nc1wiKSkgc2V0dGluZ3MgPSBPYmplY3QuYXNzaWduKHtzdGFibGU6IHt9LCBjYW5hcnk6IHt9LCBwdGI6IHt9fSwge1tyZWxlYXNlQ2hhbm5lbF06IHNldHRpbmdzfSk7XHJcbiAgICAgICAgICAgIGVsc2Ugc2V0dGluZ3MgPSBPYmplY3QuYXNzaWduKHtzdGFibGU6IHt9LCBjYW5hcnk6IHt9LCBwdGI6IHt9fSwgc2V0dGluZ3MpO1xyXG4gICAgICAgICAgICB0aGlzLnNldEJERGF0YShcInNldHRpbmdzXCIsIHNldHRpbmdzKTtcclxuICAgICAgICB9XHJcbiAgICAgICAgY2F0Y2ggKGVycikge1xyXG4gICAgICAgICAgICBjb25zb2xlLmVycm9yKGVycik7XHJcbiAgICAgICAgICAgIFV0aWxzLmFsZXJ0KFwiQ29ycnVwdCBTdG9yYWdlXCIsIFwiVGhlIGJkIHN0b3JhZ2UgaGFzIHNvbWVob3cgYmVjb21lIGNvcnJ1cHQuIFlvdSBtYXkgZWl0aGVyIHRyeSB0byBzYWx2YWdlIHRoZSBmaWxlIG9yIGRlbGV0ZSBpdCB0aGVuIHJlbG9hZC5cIik7XHJcbiAgICAgICAgfVxyXG4gICAgfVxyXG5cclxuICAgIGdldCBpbmplY3Rpb25QYXRoKCkge1xyXG4gICAgICAgIHJldHVybiB0aGlzLl9pbmplY3Rpb25QYXRoID0gbnVsbDtcclxuICAgICAgICBpZiAodGhpcy5faW5qZWN0aW9uUGF0aCkgcmV0dXJuIHRoaXMuX2luamVjdGlvblBhdGg7XHJcbiAgICAgICAgY29uc3QgZWxlY3Ryb24gPSByZXF1aXJlKFwiZWxlY3Ryb25cIikucmVtb3RlLmFwcDtcclxuICAgICAgICBjb25zdCBiYXNlID0gZWxlY3Ryb24uZ2V0QXBwUGF0aCgpO1xyXG4gICAgICAgIGNvbnN0IHJvYW1pbmdCYXNlID0gZWxlY3Ryb24uZ2V0UGF0aChcInVzZXJEYXRhXCIpO1xyXG4gICAgICAgIGNvbnN0IHJvYW1pbmdMb2NhdGlvbiA9IHBhdGgucmVzb2x2ZShyb2FtaW5nQmFzZSwgZWxlY3Ryb24uZ2V0VmVyc2lvbigpLCBcIm1vZHVsZXNcIiwgXCJkaXNjb3JkX2Rlc2t0b3BfY29yZVwiLCBcImluamVjdG9yXCIpO1xyXG4gICAgICAgIGNvbnN0IGxvY2F0aW9uID0gcGF0aC5yZXNvbHZlKGJhc2UsIFwiLi5cIiwgXCJhcHBcIik7XHJcbiAgICAgICAgY29uc3QgcmVhbExvY2F0aW9uID0gZnMuZXhpc3RzU3luYyhsb2NhdGlvbikgPyBsb2NhdGlvbiA6IGZzLmV4aXN0c1N5bmMocm9hbWluZ0xvY2F0aW9uKSA/IHJvYW1pbmdMb2NhdGlvbiA6IG51bGw7XHJcbiAgICAgICAgaWYgKCFyZWFsTG9jYXRpb24pIHJldHVybiB0aGlzLl9pbmplY3Rpb25QYXRoID0gbnVsbDtcclxuICAgICAgICByZXR1cm4gdGhpcy5faW5qZWN0aW9uUGF0aCA9IHJlYWxMb2NhdGlvbjtcclxuICAgIH1cclxuXHJcbiAgICBnZXQgY29uZmlnRmlsZSgpIHtyZXR1cm4gdGhpcy5fY29uZmlnRmlsZSB8fCAodGhpcy5fY29uZmlnRmlsZSA9IHBhdGgucmVzb2x2ZSh0aGlzLmluamVjdGlvblBhdGgsIFwiYmV0dGVyZGlzY29yZFwiLCBcImNvbmZpZy5qc29uXCIpKTt9XHJcbiAgICBnZXQgQkRGaWxlKCkge3JldHVybiB0aGlzLl9CREZpbGUgfHwgKHRoaXMuX0JERmlsZSA9IHBhdGgucmVzb2x2ZShiZENvbmZpZy5kYXRhUGF0aCwgXCJiZHN0b3JhZ2UuanNvblwiKSk7fVxyXG4gICAgZ2V0IHNldHRpbmdzRmlsZSgpIHtyZXR1cm4gdGhpcy5fc2V0dGluZ3NGaWxlIHx8ICh0aGlzLl9zZXR0aW5nc0ZpbGUgPSBwYXRoLnJlc29sdmUoYmRDb25maWcuZGF0YVBhdGgsIFwiYmRzZXR0aW5ncy5qc29uXCIpKTt9XHJcbiAgICBnZXRQbHVnaW5GaWxlKHBsdWdpbk5hbWUpIHtyZXR1cm4gcGF0aC5yZXNvbHZlKENvbnRlbnRNYW5hZ2VyLnBsdWdpbnNGb2xkZXIsIHBsdWdpbk5hbWUgKyBcIi5jb25maWcuanNvblwiKTt9XHJcblxyXG4gICAgZ2V0U2V0dGluZ0dyb3VwKGtleSkge1xyXG4gICAgICAgIHJldHVybiB0aGlzLmRhdGEuc2V0dGluZ3NbcmVsZWFzZUNoYW5uZWxdW2tleV0gfHwgbnVsbDtcclxuICAgIH1cclxuXHJcbiAgICBzZXRTZXR0aW5nR3JvdXAoa2V5LCBkYXRhKSB7XHJcbiAgICAgICAgdGhpcy5kYXRhLnNldHRpbmdzW3JlbGVhc2VDaGFubmVsXVtrZXldID0gZGF0YTtcclxuICAgICAgICBmcy53cml0ZUZpbGVTeW5jKHRoaXMuQkRGaWxlLCBKU09OLnN0cmluZ2lmeSh0aGlzLmRhdGEsIG51bGwsIDQpLCBcImJpbmFyeVwiKTtcclxuICAgIH1cclxuXHJcbiAgICBnZXRCRERhdGEoa2V5KSB7XHJcbiAgICAgICAgcmV0dXJuIHRoaXMuZGF0YVtrZXldIHx8IFwiXCI7XHJcbiAgICB9XHJcblxyXG4gICAgc2V0QkREYXRhKGtleSwgdmFsdWUpIHtcclxuICAgICAgICB0aGlzLmRhdGFba2V5XSA9IHZhbHVlO1xyXG4gICAgICAgIGZzLndyaXRlRmlsZVN5bmModGhpcy5CREZpbGUsIEpTT04uc3RyaW5naWZ5KHRoaXMuZGF0YSwgbnVsbCwgNCksIFwiYmluYXJ5XCIpO1xyXG4gICAgfVxyXG5cclxuICAgIGdldFBsdWdpbkRhdGEocGx1Z2luTmFtZSwga2V5KSB7XHJcbiAgICAgICAgaWYgKHRoaXMucGx1Z2luRGF0YVtwbHVnaW5OYW1lXSAhPT0gdW5kZWZpbmVkKSByZXR1cm4gdGhpcy5wbHVnaW5EYXRhW3BsdWdpbk5hbWVdW2tleV07XHJcbiAgICAgICAgaWYgKCFmcy5leGlzdHNTeW5jKHRoaXMuZ2V0UGx1Z2luRmlsZShwbHVnaW5OYW1lKSkpIHJldHVybiB1bmRlZmluZWQ7XHJcbiAgICAgICAgdGhpcy5wbHVnaW5EYXRhW3BsdWdpbk5hbWVdID0gSlNPTi5wYXJzZShmcy5yZWFkRmlsZVN5bmModGhpcy5nZXRQbHVnaW5GaWxlKHBsdWdpbk5hbWUpKSk7XHJcbiAgICAgICAgcmV0dXJuIHRoaXMucGx1Z2luRGF0YVtwbHVnaW5OYW1lXVtrZXldO1xyXG4gICAgfVxyXG5cclxuICAgIHNldFBsdWdpbkRhdGEocGx1Z2luTmFtZSwga2V5LCB2YWx1ZSkge1xyXG4gICAgICAgIGlmICh2YWx1ZSA9PT0gdW5kZWZpbmVkKSByZXR1cm47XHJcbiAgICAgICAgaWYgKHRoaXMucGx1Z2luRGF0YVtwbHVnaW5OYW1lXSA9PT0gdW5kZWZpbmVkKSB0aGlzLnBsdWdpbkRhdGFbcGx1Z2luTmFtZV0gPSB7fTtcclxuICAgICAgICB0aGlzLnBsdWdpbkRhdGFbcGx1Z2luTmFtZV1ba2V5XSA9IHZhbHVlO1xyXG4gICAgICAgIGZzLndyaXRlRmlsZVN5bmModGhpcy5nZXRQbHVnaW5GaWxlKHBsdWdpbk5hbWUpLCBKU09OLnN0cmluZ2lmeSh0aGlzLnBsdWdpbkRhdGFbcGx1Z2luTmFtZV0sIG51bGwsIDQpLCBcImJpbmFyeVwiKTtcclxuICAgIH1cclxuXHJcbiAgICBkZWxldGVQbHVnaW5EYXRhKHBsdWdpbk5hbWUsIGtleSkge1xyXG4gICAgICAgIGlmICh0aGlzLnBsdWdpbkRhdGFbcGx1Z2luTmFtZV0gPT09IHVuZGVmaW5lZCkgdGhpcy5wbHVnaW5EYXRhW3BsdWdpbk5hbWVdID0ge307XHJcbiAgICAgICAgZGVsZXRlIHRoaXMucGx1Z2luRGF0YVtwbHVnaW5OYW1lXVtrZXldO1xyXG4gICAgICAgIGZzLndyaXRlRmlsZVN5bmModGhpcy5nZXRQbHVnaW5GaWxlKHBsdWdpbk5hbWUpLCBKU09OLnN0cmluZ2lmeSh0aGlzLnBsdWdpbkRhdGFbcGx1Z2luTmFtZV0sIG51bGwsIDQpLCBcImJpbmFyeVwiKTtcclxuICAgIH1cclxufTsiLCJpbXBvcnQge3NldHRpbmdzQ29va2llfSBmcm9tIFwiLi4vMGdsb2JhbHNcIjtcclxuaW1wb3J0IEJEVjIgZnJvbSBcIi4vdjJcIjtcclxuaW1wb3J0IERPTSBmcm9tIFwiLi9kb210b29sc1wiO1xyXG5pbXBvcnQgVXRpbHMgZnJvbSBcIi4vdXRpbHNcIjtcclxuXHJcbmV4cG9ydCBkZWZhdWx0IG5ldyBjbGFzcyBEZXZNb2RlIHtcclxuICAgIGNvbnN0cnVjdG9yKCkge1xyXG4gICAgICAgIHRoaXMuZGVidWdMaXN0ZW5lciA9IHRoaXMuZGVidWdMaXN0ZW5lci5iaW5kKHRoaXMpO1xyXG4gICAgICAgIHRoaXMuY29weVNlbGVjdG9yTGlzdGVuZXIgPSB0aGlzLmNvcHlTZWxlY3Rvckxpc3RlbmVyLmJpbmQodGhpcyk7XHJcbiAgICB9XHJcblxyXG4gICAgc3RhcnQoKSB7XHJcbiAgICAgICAgdGhpcy5zdGFydERlYnVnTGlzdGVuZXIoKTtcclxuICAgICAgICBpZiAoc2V0dGluZ3NDb29raWVbXCJmb3JrLWRtLTFcIl0pIHRoaXMuc3RhcnRDb3B5U2VsZWN0b3IoKTtcclxuICAgIH1cclxuICAgIFxyXG4gICAgc3RvcCgpIHtcclxuICAgICAgICB0aGlzLnN0b3BEZWJ1Z0xpc3RlbmVyKCk7XHJcbiAgICAgICAgdGhpcy5zdG9wQ29weVNlbGVjdG9yKCk7XHJcbiAgICB9XHJcblxyXG4gICAgc3RhcnREZWJ1Z0xpc3RlbmVyKCkge1xyXG4gICAgICAgIHRoaXMuc3RvcERlYnVnTGlzdGVuZXIoKTtcclxuICAgICAgICBkb2N1bWVudC5hZGRFdmVudExpc3RlbmVyKFwia2V5ZG93blwiLCB0aGlzLmRlYnVnTGlzdGVuZXIpO1xyXG4gICAgfVxyXG5cclxuICAgIHN0b3BEZWJ1Z0xpc3RlbmVyKCkge1xyXG4gICAgICAgIGRvY3VtZW50LnJlbW92ZUV2ZW50TGlzdGVuZXIoXCJrZXlkb3duXCIsIHRoaXMuZGVidWdMaXN0ZW5lcik7XHJcbiAgICB9XHJcblxyXG4gICAgc3RhcnRDb3B5U2VsZWN0b3IoKSB7XHJcbiAgICAgICAgdGhpcy5zdG9wQ29weVNlbGVjdG9yKCk7XHJcbiAgICAgICAgZG9jdW1lbnQuYWRkRXZlbnRMaXN0ZW5lcihcImNvbnRleHRtZW51XCIsIHRoaXMuY29weVNlbGVjdG9yTGlzdGVuZXIpO1xyXG4gICAgfVxyXG5cclxuICAgIHN0b3BDb3B5U2VsZWN0b3IoKSB7XHJcbiAgICAgICAgZG9jdW1lbnQucmVtb3ZlRXZlbnRMaXN0ZW5lcihcImNvbnRleHRtZW51XCIsIHRoaXMuY29weVNlbGVjdG9yTGlzdGVuZXIpO1xyXG4gICAgfVxyXG5cclxuICAgIGRlYnVnTGlzdGVuZXIoZSkge1xyXG4gICAgICAgIGlmIChlLndoaWNoID09PSAxMTkgfHwgZS53aGljaCA9PSAxMTgpIHsvL0Y4XHJcbiAgICAgICAgICAgIGNvbnNvbGUubG9nKFwiJWNbJWNEZXZNb2RlJWNdICVjQnJlYWsvUmVzdW1lXCIsIFwiY29sb3I6IHJlZDtcIiwgXCJjb2xvcjogIzMwMzAzMDsgZm9udC13ZWlnaHQ6NzAwO1wiLCBcImNvbG9yOnJlZDtcIiwgXCJcIik7XHJcbiAgICAgICAgICAgIGRlYnVnZ2VyOyAvLyBlc2xpbnQtZGlzYWJsZS1saW5lIG5vLWRlYnVnZ2VyXHJcbiAgICAgICAgICAgIGUucHJldmVudERlZmF1bHQoKTtcclxuICAgICAgICAgICAgZS5zdG9wSW1tZWRpYXRlUHJvcGFnYXRpb24oKTtcclxuICAgICAgICAgfVxyXG4gICAgfVxyXG5cclxuICAgIGNvcHlTZWxlY3Rvckxpc3RlbmVyKGUpIHtcclxuICAgICAgICB0cnl7XHJcbiAgICAgICAgICAgIGUuc3RvcFByb3BhZ2F0aW9uKCk7XHJcbiAgICAgICAgICAgIGNvbnN0IHNlbGVjdG9yID0gdGhpcy5nZXRTZWxlY3RvcihlLnRhcmdldCk7XHJcbiAgICBcclxuICAgICAgICAgICAgbGV0IFtcclxuICAgICAgICAgICAgICAgIGNsYXNzTGF5ZXIsIFxyXG4gICAgICAgICAgICAgICAgY2xhc3NJdGVtc1xyXG4gICAgICAgICAgICBdID0gW1xyXG4gICAgICAgICAgICAgICAgQkRNb2R1bGVzLmdldCgoZSkgPT4gZS5sYXllciAmJiB0eXBlb2YgZS5sYXllciA9PT0gXCJzdHJpbmdcIiAmJiBlLmRpc2FibGVkUG9pbnRlckV2ZW50cylbMF0sXHJcbiAgICAgICAgICAgICAgICBCRE1vZHVsZXMuZ2V0KChlKSA9PiBlLm1lbnUpWzBdXHJcbiAgICAgICAgICAgIF1cclxuICAgICAgICAgICAgXHJcbiAgICAgICAgICAgIGZ1bmN0aW9uIGF0dGFjaCgpIHtcclxuICAgICAgICAgICAgICAgIGlmKCFjbGFzc0l0ZW1zIHx8ICFjbGFzc0xheWVyLmxheWVyKXJldHVybiBjb25zb2xlLmxvZyhjbGFzc0l0ZW1zLCBjbGFzc0xheWVyLmxheWVyKVxyXG5cclxuICAgICAgICAgICAgICAgIGxldCBjbSA9IERPTS5xdWVyeShcIi5cIitVdGlscy5yZW1vdmVEYShjbGFzc0l0ZW1zLm1lbnUpKTtcclxuICAgICAgICAgICAgICAgIGlmICghY20pIHtcclxuICAgICAgICAgICAgICAgICAgICBjb25zdCBjb250YWluZXIgPSBET00ucXVlcnkoXCIjYXBwLW1vdW50ID4gLlwiK1V0aWxzLnJlbW92ZURhKGNsYXNzTGF5ZXIubGF5ZXJDb250YWluZXIpKTtcclxuICAgICAgICAgICAgICAgICAgICBjb25zdCBjbVdyYXAgPSBET00uY3JlYXRlRWxlbWVudChgPGRpdiBjbGFzcz1cIiR7Y2xhc3NMYXllci5sYXllcn1cIj5gKTtcclxuICAgICAgICAgICAgICAgICAgICBjbSA9IERPTS5jcmVhdGVFbGVtZW50KGA8ZGl2IGNsYXNzPVwiJHtjbGFzc0l0ZW1zLm1lbnV9ICR7Y2xhc3NJdGVtcy5zdHlsZUZsZXhpYmxlfSAke2NsYXNzSXRlbXMuYWNjb21tb2RhdGVTY3JvbGxiYXJ9IGJkLWNvbnRleHQtbWVudVwiIHN0eWxlPVwiXCI+PC9kaXY+YCk7XHJcbiAgICAgICAgICAgICAgICAgICAgY21XcmFwLmFwcGVuZChjbSk7XHJcbiAgICAgICAgICAgICAgICAgICAgY29udGFpbmVyLmFwcGVuZChjbVdyYXApO1xyXG4gICAgICAgICAgICAgICAgICAgIGNtV3JhcC5zdHlsZS50b3AgPSBlLmNsaWVudFkgKyBcInB4XCI7XHJcbiAgICAgICAgICAgICAgICAgICAgY21XcmFwLnN0eWxlLmxlZnQgPSBlLmNsaWVudFggKyBcInB4XCI7XHJcbiAgICAgICAgICAgICAgICAgICAgY21XcmFwLnNldEF0dHJpYnV0ZShcInJvbGVcIiwgXCJtZW51XCIpXHJcbiAgICAgICAgICAgICAgICAgICAgY21XcmFwLnNldEF0dHJpYnV0ZShcInRhYmluZGV4XCIsIFwiLTFcIilcclxuICAgICAgICAgICAgICAgICAgICBjbVdyYXAuaWQgPSBcImJkLWNvcHktc2VsZWN0b3ItY29udGV4dFwiXHJcbiAgICAgICAgICAgICAgICAgICAgY21XcmFwLnNldEF0dHJpYnV0ZShcImFyaWEtbGFiZWxcIiwgXCJDb3B5IFNlbGVjdG9yIEFjdGlvbnNcIilcclxuXHJcbiAgICAgICAgICAgICAgICAgICAgY29uc3Qgc2Nyb2xsZXJDbGFzc2VzID0gQkRNb2R1bGVzLmdldCgoZSkgPT4gZS5zY3JvbGxlcldyYXApWzBdXHJcbiAgICAgICAgICAgICAgICAgICAgY29uc3Qgc2Nyb2xsZXJXcmFwID0gRE9NLmNyZWF0ZUVsZW1lbnQoYDxkaXYgY2xhc3M9XCIke3Njcm9sbGVyQ2xhc3Nlcy5zY3JvbGxlcldyYXB9ICR7c2Nyb2xsZXJDbGFzc2VzLnNjcm9sbGVyVGhlbWVkfSAke3Njcm9sbGVyQ2xhc3Nlcy50aGVtZUdob3N0SGFpcmxpbmV9XCI+PC9kaXY+YClcclxuICAgICAgICAgICAgICAgICAgICBjb25zdCBzY3JvbGxlciA9IERPTS5jcmVhdGVFbGVtZW50KGA8ZGl2IGNsYXNzPVwiJHtCRE1vZHVsZXMuZ2V0KGUgPT4gZS5zY3JvbGxlcilbMF0uc2Nyb2xsZXJ9ICR7Y2xhc3NJdGVtcy5zY3JvbGxlcn1cIj48L2Rpdj5gKVxyXG4gICAgICAgICAgICAgICAgICAgIHNjcm9sbGVyV3JhcC5hcHBlbmQoc2Nyb2xsZXIpXHJcbiAgICAgICAgICAgICAgICAgICAgY20uYXBwZW5kKHNjcm9sbGVyV3JhcClcclxuXHJcbiAgICAgICAgICAgICAgICAgICAgY29uc3QgcmVtb3ZlQ00gPSBmdW5jdGlvbihlKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIGlmIChlLmtleUNvZGUgJiYgZS5rZXlDb2RlICE9PSAyNykgcmV0dXJuO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICBjbVdyYXAucmVtb3ZlKCk7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIGRvY3VtZW50LnJlbW92ZUV2ZW50TGlzdGVuZXIoXCJjbGlja1wiLCByZW1vdmVDTSk7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIGRvY3VtZW50LnJlbW92ZUV2ZW50TGlzdGVuZXIoXCJjb250ZXh0bWVudVwiLCByZW1vdmVDTSk7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIGRvY3VtZW50LnJlbW92ZUV2ZW50TGlzdGVuZXIoXCJrZXl1cFwiLCByZW1vdmVDTSk7XHJcbiAgICAgICAgICAgICAgICAgICAgfTtcclxuICAgICAgICAgICAgICAgICAgICBkb2N1bWVudC5hZGRFdmVudExpc3RlbmVyKFwiY2xpY2tcIiwgcmVtb3ZlQ00pO1xyXG4gICAgICAgICAgICAgICAgICAgIGRvY3VtZW50LmFkZEV2ZW50TGlzdGVuZXIoXCJjb250ZXh0bWVudVwiLCByZW1vdmVDTSk7XHJcbiAgICAgICAgICAgICAgICAgICAgZG9jdW1lbnQuYWRkRXZlbnRMaXN0ZW5lcihcImtleXVwXCIsIHJlbW92ZUNNKTtcclxuICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgIGNvbnN0IGNtV3JhcCA9IGNtLnBhcmVudEVsZW1lbnRcclxuICAgICAgICAgICAgICAgIFxyXG4gICAgICAgICAgICAgICAgY29uc3Qgc2Nyb2xsZXIgPSBjbS5jaGlsZE5vZGVzWzBdLmNoaWxkTm9kZXNbMF1cclxuICAgICAgICAgICAgICAgIGNvbnN0IGNtZyA9IERPTS5jcmVhdGVFbGVtZW50KGA8ZGl2IHJvbGU9XCJncm91cFwiPjwvZGl2PmApO1xyXG4gICAgICAgICAgICAgICAgLyoqXHJcbiAgICAgICAgICAgICAgICAgKiBAdHlwZSB7SFRNTEVsZW1lbnR9XHJcbiAgICAgICAgICAgICAgICAgKi9cclxuICAgICAgICAgICAgICAgIGNvbnN0IGNtaSA9IERPTS5jcmVhdGVFbGVtZW50KGA8ZGl2IGNsYXNzPVwiJHtjbGFzc0l0ZW1zLml0ZW19ICR7Y2xhc3NJdGVtcy5sYWJlbENvbnRhaW5lcn0gJHtjbGFzc0l0ZW1zLmNvbG9yRGVmYXVsdH1cIiByb2xlPVwibWVudWl0ZW1cIiBpZD1cImJkLWNvcHktc2VsZWN0b3ItaXRlbS1jbVwiPjwvZGl2PmApO1xyXG4gICAgICAgICAgICAgICAgY21pLmFwcGVuZChET00uY3JlYXRlRWxlbWVudChgPGRpdiBjbGFzcz1cIiR7Y2xhc3NJdGVtcy5sYWJlbH1cIj5Db3B5IFNlbGVjdG9yPC9kaXY+YCkpO1xyXG4gICAgICAgICAgICAgICAgY21pLmFkZEV2ZW50TGlzdGVuZXIoXCJjbGlja1wiLCAoKSA9PiB7XHJcbiAgICAgICAgICAgICAgICAgICAgQkRWMi5OYXRpdmVNb2R1bGUuY29weShzZWxlY3Rvcik7XHJcbiAgICAgICAgICAgICAgICAgICAgY21XcmFwLnN0eWxlLmRpc3BsYXkgPSBcIm5vbmVcIlxyXG4gICAgICAgICAgICAgICAgfSk7XHJcbiAgICAgICAgICAgICAgICBjbWkuYWRkRXZlbnRMaXN0ZW5lcihcIm1vdXNlb3ZlclwiLCAoZSkgPT4ge1xyXG4gICAgICAgICAgICAgICAgICAgIGxldCBlbGVtZW50cyA9IERPTS5xdWVyeUFsbChcImRpdltyb2xlPW1lbnVpdGVtXS5cIitVdGlscy5yZW1vdmVEYShjbGFzc0l0ZW1zLmZvY3VzZWQpKVxyXG4gICAgICAgICAgICAgICAgICAgIGVsZW1lbnRzICYmIGVsZW1lbnRzLmZvckVhY2goZWxlbSA9PiBlbGVtLmNsYXNzTGlzdC5yZW1vdmUoY2xhc3NJdGVtcy5mb2N1c2VkKSlcclxuICAgICAgICAgICAgICAgICAgICBjbWkuY2xhc3NMaXN0LmFkZChjbGFzc0l0ZW1zLmZvY3VzZWQpXHJcbiAgICAgICAgICAgICAgICB9KVxyXG4gICAgICAgICAgICAgICAgY21pLmFkZEV2ZW50TGlzdGVuZXIoXCJtb3VzZW91dFwiLCAoZSkgPT4ge1xyXG4gICAgICAgICAgICAgICAgICAgIGNtaS5jbGFzc0xpc3QucmVtb3ZlKGNsYXNzSXRlbXMuZm9jdXNlZClcclxuICAgICAgICAgICAgICAgIH0pXHJcbiAgICAgICAgICAgICAgICBjbWcuYXBwZW5kKGNtaSk7XHJcbiAgICAgICAgICAgICAgICBpZihzY3JvbGxlci5jaGlsZE5vZGVzLmxlbmd0aCl7IC8vIGFwZW5kIGEgc2VwYXJhdG9yXHJcbiAgICAgICAgICAgICAgICAgICAgY29uc3Qgc2VwYXJhdG9yID0gRE9NLmNyZWF0ZUVsZW1lbnQoYDxkaXYgcm9sZT1cInNlcGFyYXRvclwiIGNsYXNzPVwiJHtjbGFzc0l0ZW1zLnNlcGFyYXRvcn1cIj48L2Rpdj5gKVxyXG4gICAgICAgICAgICAgICAgICAgIHNjcm9sbGVyLmFwcGVuZChzZXBhcmF0b3IpXHJcbiAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgICBzY3JvbGxlci5hcHBlbmQoY21nKTtcclxuICAgICAgICAgICAgICAgIGlmKGNtV3JhcC5jbGllbnRIZWlnaHQgPCBjbVdyYXAuc2Nyb2xsSGVpZ2h0KXtcclxuICAgICAgICAgICAgICAgICAgICBjb25zb2xlLmxvZyhcIm92ZXJmbG93aW5nIFwiK2NtV3JhcC5zdHlsZS50b3ApXHJcbiAgICAgICAgICAgICAgICAgICAgY21XcmFwLnN0eWxlLnRvcCA9IChjbVdyYXAuc3R5bGUudG9wIC0gY21nLmNsaWVudEhlaWdodCkgKyBcInB4XCI7XHJcbiAgICAgICAgICAgICAgICAgICAgY29uc29sZS5sb2coXCJvdmVyZmxvd2luZ1wiK2NtV3JhcC5zdHlsZS50b3ApXHJcbiAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIH1cclxuICAgIFxyXG4gICAgICAgICAgICBzZXRUaW1lb3V0KGF0dGFjaCwgMSk7XHJcbiAgICAgICAgfWNhdGNoKGUpe1xyXG4gICAgICAgICAgICBjb25zb2xlLmVycm9yKGUpXHJcbiAgICAgICAgfVxyXG4gICAgfVxyXG5cclxuICAgIGdldFNlbGVjdG9yKGVsZW1lbnQpIHtcclxuICAgICAgICBpZiAoZWxlbWVudC5pZCkgcmV0dXJuIGAjJHtlbGVtZW50LmlkfWA7XHJcbiAgICAgICAgLyoqXHJcbiAgICAgICAgICogXHJcbiAgICAgICAgICogQHBhcmFtIHtIVE1MRWxlbWVudH0gZWwgXHJcbiAgICAgICAgICovXHJcbiAgICAgICAgZnVuY3Rpb24gZnVsbFBhdGgoZWwpe1xyXG4gICAgICAgICAgICB2YXIgbmFtZXMgPSBbXTtcclxuICAgICAgICAgICAgd2hpbGUgKGVsLnBhcmVudE5vZGUpe1xyXG4gICAgICAgICAgICAgIGlmIChlbC5pZCl7XHJcbiAgICAgICAgICAgICAgICBuYW1lcy51bnNoaWZ0KCcjJytlbC5pZCk7XHJcbiAgICAgICAgICAgICAgICBicmVhaztcclxuICAgICAgICAgICAgICB9ZWxzZXtcclxuICAgICAgICAgICAgICAgIGlmIChlbD09ZWwub3duZXJEb2N1bWVudC5kb2N1bWVudEVsZW1lbnQpIG5hbWVzLnVuc2hpZnQoZWwudGFnTmFtZS50b0xvd2VyQ2FzZSgpK0FycmF5LmZyb20oZWwuY2xhc3NMaXN0LmVudHJpZXMoKSkubWFwKGUgPT4gXCIuXCIrZSkuam9pbihcIlwiKSk7XHJcbiAgICAgICAgICAgICAgICBlbHNle1xyXG4gICAgICAgICAgICAgICAgICBmb3IgKHZhciBjPTEsZT1lbDtlLnByZXZpb3VzRWxlbWVudFNpYmxpbmc7ZT1lLnByZXZpb3VzRWxlbWVudFNpYmxpbmcsYysrKTtcclxuICAgICAgICAgICAgICAgICAgbmFtZXMudW5zaGlmdChlbC50YWdOYW1lLnRvTG93ZXJDYXNlKCkrKCh0eXBlb2YgZWwuY2xhc3NOYW1lID09PSBcInN0cmluZ1wiICYmIGVsLmNsYXNzTmFtZSkgfHwgXCJcIikuc3BsaXQoXCIgXCIpLmZpbHRlcihlID0+ICEhZSkubWFwKGUgPT4gXCIuXCIrZSkuam9pbihcIlwiKStcIjpudGgtY2hpbGQoXCIrYytcIilcIik7XHJcbiAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgICBlbD1lbC5wYXJlbnROb2RlO1xyXG4gICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICByZXR1cm4gbmFtZXMuam9pbihcIiA+IFwiKTtcclxuICAgICAgICB9XHJcbiAgICAgICAgcmV0dXJuIGZ1bGxQYXRoKGVsZW1lbnQpXHJcbiAgICAgICAgLypcclxuICAgICAgICBjb25zdCBydWxlcyA9IHRoaXMuZ2V0UnVsZXMoZWxlbWVudCk7XHJcbiAgICAgICAgY29uc3QgbGF0ZXN0UnVsZSA9IHJ1bGVzW3J1bGVzLmxlbmd0aCAtIDFdO1xyXG4gICAgICAgIGlmIChsYXRlc3RSdWxlKSByZXR1cm4gbGF0ZXN0UnVsZS5zZWxlY3RvclRleHQ7XHJcbiAgICAgICAgZWxzZSBpZiAoZWxlbWVudC5jbGFzc0xpc3QubGVuZ3RoKSByZXR1cm4gYC4ke0FycmF5LmZyb20oZWxlbWVudC5jbGFzc0xpc3QpLmpvaW4oXCIuXCIpfWA7XHJcbiAgICAgICAgcmV0dXJuIGAuJHtBcnJheS5mcm9tKGVsZW1lbnQucGFyZW50RWxlbWVudC5jbGFzc0xpc3QpLmpvaW4oXCIuXCIpfWA7Ki9cclxuICAgIH1cclxuXHJcbiAgICBnZXRSdWxlcyhlbGVtZW50LCBjc3MgPSBlbGVtZW50Lm93bmVyRG9jdW1lbnQuc3R5bGVTaGVldHMpIHtcclxuICAgICAgICAvL2lmICh3aW5kb3cuZ2V0TWF0Y2hlZENTU1J1bGVzKSByZXR1cm4gd2luZG93LmdldE1hdGNoZWRDU1NSdWxlcyhlbGVtZW50KTtcclxuICAgICAgICBjb25zdCBzaGVldHMgPSBbLi4uY3NzXS5maWx0ZXIocyA9PiAhcy5ocmVmIHx8ICFzLmhyZWYuaW5jbHVkZXMoXCJCZXR0ZXJEaXNjb3JkQXBwXCIpKTtcclxuICAgICAgICBjb25zdCBydWxlcyA9IHNoZWV0cy5tYXAocyA9PiBbLi4uKHMuY3NzUnVsZXMgfHwgW10pXSkuZmxhdCgpO1xyXG4gICAgICAgIGNvbnN0IGVsZW1lbnRSdWxlcyA9IHJ1bGVzLmZpbHRlcihyID0+IHIgJiYgci5zZWxlY3RvclRleHQgJiYgZWxlbWVudC5tYXRjaGVzKHIuc2VsZWN0b3JUZXh0KSAmJiByLnN0eWxlLmxlbmd0aCAmJiByLnNlbGVjdG9yVGV4dC5zcGxpdChcIiwgXCIpLmxlbmd0aCA8IDggJiYgIXIuc2VsZWN0b3JUZXh0LnNwbGl0KFwiLCBcIikuaW5jbHVkZXMoXCIqXCIpKTtcclxuICAgICAgICByZXR1cm4gZWxlbWVudFJ1bGVzO1xyXG4gICAgfVxyXG59OyIsImV4cG9ydCBkZWZhdWx0IG5ldyBjbGFzcyBEaXNhYmxlVHlwaW5nIHtcclxuICAgIGNvbnN0cnVjdG9yKCl7XHJcbiAgICAgICAgd2luZG93LkxpZ2h0Y29yZC5BcGkuZW5zdXJlRXhwb3J0ZWQoZSA9PiBlLmRlZmF1bHQgJiYgZS5kZWZhdWx0LnN0YXJ0VHlwaW5nKVxyXG4gICAgICAgIC50aGVuKHR5cGluZ01vZHVsZSA9PiB7XHJcbiAgICAgICAgICAgIGxldCBzZWxmID0gdGhpc1xyXG4gICAgICAgICAgICBjb25zdCBzdGFydFR5cGluZyA9IHR5cGluZ01vZHVsZS5kZWZhdWx0LnN0YXJ0VHlwaW5nXHJcbiAgICAgICAgICAgIHR5cGluZ01vZHVsZS5kZWZhdWx0LnN0YXJ0VHlwaW5nID0gZnVuY3Rpb24oKXtcclxuICAgICAgICAgICAgICAgIGlmKHNlbGYuZGlzYWJsZWQpcmV0dXJuIHN0YXJ0VHlwaW5nLmNhbGwodGhpcywgLi4uYXJndW1lbnRzKVxyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIGNvbnN0IHN0b3BUeXBpbmcgPSB0eXBpbmdNb2R1bGUuZGVmYXVsdC5zdG9wVHlwaW5nXHJcbiAgICAgICAgICAgIHR5cGluZ01vZHVsZS5kZWZhdWx0LnN0b3BUeXBpbmcgPSBmdW5jdGlvbigpe1xyXG4gICAgICAgICAgICAgICAgaWYoc2VsZi5kaXNhYmxlZClyZXR1cm4gc3RvcFR5cGluZy5jYWxsKHRoaXMsIC4uLmFyZ3VtZW50cylcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICB0aGlzLmRpc2FibGVkID0gdHJ1ZVxyXG4gICAgICAgIH0pXHJcbiAgICB9XHJcblxyXG4gICAgZGlzYWJsZSgpe1xyXG4gICAgICAgIHRoaXMuZGlzYWJsZWQgPSB0cnVlXHJcbiAgICB9XHJcblxyXG4gICAgZW5hYmxlKCl7XHJcbiAgICAgICAgdGhpcy5kaXNhYmxlZCA9IGZhbHNlXHJcbiAgICB9XHJcbn0iLCJpbXBvcnQgQnVnSHVudGVyQmFkZ2UgZnJvbSBcIi4uL3N2Zy9idWdfaHVudGVyXCJcclxuaW1wb3J0IExpZ2h0Y29yZFVzZXJCYWRnZSBmcm9tIFwiLi4vc3ZnL0xpZ2h0Y29yZFVzZXJcIjtcclxuaW1wb3J0IG5vZGVGZXRjaCBmcm9tIFwibm9kZS1mZXRjaFwiXHJcbmltcG9ydCB7IHNldHRpbmdzQ29va2llIH0gZnJvbSBcIi4uLzBnbG9iYWxzXCI7XHJcbmltcG9ydCBDaXJjdXMgZnJvbSBcIi4uL3N2Zy9jaXJjdXNcIjtcclxuXHJcbmV4cG9ydCBmdW5jdGlvbiB1dWlkdjQoKSB7IC8vIEdlbmVyYXRlIFVVSUQgKE5vIGNyeXB0byBybmcpXHJcbiAgICByZXR1cm4gJ3h4eHh4eHh4LXh4eHgtNHh4eC15eHh4LXh4eHh4eHh4eHh4eCcucmVwbGFjZSgvW3h5XS9nLCBmdW5jdGlvbihjKSB7XHJcbiAgICAgICAgdmFyIHIgPSBNYXRoLnJhbmRvbSgpICogMTYgfCAwLCB2ID0gYyA9PSAneCcgPyByIDogKHIgJiAweDMgfCAweDgpO1xyXG4gICAgICAgIHJldHVybiB2LnRvU3RyaW5nKDE2KTtcclxuICAgIH0pO1xyXG59ICBcclxuXHJcbmNvbnN0IGF3YWl0aW5nQmFkZ2VzUHJvbWlzZXMgPSB7fVxyXG5sZXQgYmFkZ2VzVG9GZXRjaCA9IFtdXHJcblxyXG5leHBvcnQgZGVmYXVsdCBuZXcgY2xhc3MgRGlzdGFudFNlcnZlciB7XHJcbiAgICBjb25zdHJ1Y3Rvcigpe1xyXG4gICAgICAgIHRoaXMuX2NhY2hlID0ge1xyXG4gICAgICAgICAgICBiYWRnZXM6IHtcclxuXHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICB9XHJcbiAgICB9XHJcblxyXG4gICAgZ2V0IGNhY2hlKCl7XHJcbiAgICAgICAgcmV0dXJuIHRoaXMuX2NhY2hlXHJcbiAgICB9XHJcblxyXG4gICAgc2V0IGNhY2hlKGRhdGEpe1xyXG4gICAgICAgIGlmKHR5cGVvZiBkYXRhICE9PSBcIm9iamVjdFwiIHx8IHR5cGVvZiB0aGlzLl9jYWNoZSAhPT0gXCJvYmplY3RcIilyZXR1cm4gdGhpcy5fY2FjaGUgPSBkYXRhXHJcbiAgICAgICAgcmV0dXJuIHRoaXMuX2NhY2hlID0gT2JqZWN0LmFzc2lnbih0aGlzLl9jYWNoZSwgZGF0YSlcclxuICAgIH0vKlxyXG5cclxuICAgIGFzeW5jIGRlbGV0ZSgpe1xyXG4gICAgICAgIEJkQXBpLnNob3dUb2FzdChcIkRlbGV0aW5nIGFsbCBpbmZvcyBhYm91dCB5b3Ugb24gTGlnaHRjb3JkIFNlcnZlcnMuLi5cIiwge3R5cGU6IFwid2FyblwifSlcclxuICAgICAgICByZXR1cm4gaGFuZGxlUmVxdWVzdChSb3V0ZXMuZGVsZXRlLCBcImRlbGV0ZVwiKVxyXG4gICAgICAgIC50aGVuKGFzeW5jIHJlcyA9PiB7XHJcbiAgICAgICAgICAgIGlmKHJlcy5zdGF0dXMgIT09IDIwMCl7XHJcbiAgICAgICAgICAgICAgICBCZEFwaS5zaG93VG9hc3QoXCJBbiBlcnJvciBvY2N1cmVkLCBjb3VsZG4ndCBkZWxldGUgaW5mb3JtYXRpb25zLiBTZWUgY29uc29sZSBmb3IgbW9yZSBpbmZvc1wiLCB7dHlwZTogXCJlcnJvclwifSlcclxuICAgICAgICAgICAgICAgIHRocm93IG5ldyBFcnJvcihgQ291bGRuJ3QgZGVsZXRlIGFsbCBpbmZvcm1hdGlvbnM6ICR7KHJlcy5zdGF0dXMrXCIgXCIrcmVzLnN0YXR1c1RleHQrXCIgXCIrYXdhaXQgcmVzLnRleHQoKSl9YClcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICBjb25zb2xlLmluZm8oYFN1Y2Nlc2Z1bGx5IGRlbGV0ZWQgaW5mb3JtYXRpb25zLmApXHJcbiAgICAgICAgICAgIEJkQXBpLnNob3dUb2FzdChcIlN1Y2Nlc2Z1bGx5IGRlbGV0ZWQgaW5mb3JtYXRpb25zXCIsIHt0eXBlOiBcInN1Y2Nlc3NcIn0pXHJcbiAgICAgICAgICAgIHdpbmRvdy5MaWdodGNvcmQuQXBpLkF1dGhvcml6YXRpb24gPSBudWxsXHJcbiAgICAgICAgICAgIHJldHVybiByZXMuanNvbigpXHJcbiAgICAgICAgfSkuY2F0Y2goKGVycikgPT4ge1xyXG4gICAgICAgICAgICBCZEFwaS5zaG93VG9hc3QoXCJBbiBlcnJvciBvY2N1cmVkLCBjb3VsZG4ndCBkZWxldGUgaW5mb3JtYXRpb25zLiBTZWUgY29uc29sZSBmb3IgbW9yZSBpbmZvc1wiLCB7dHlwZTogXCJlcnJvclwifSlcclxuICAgICAgICAgICAgdGhyb3cgbmV3IEVycm9yKGBDb3VsZG4ndCBkZWxldGUgYWxsIGluZm9ybWF0aW9uczogJHtlcnIuc3RhY2t9YClcclxuICAgICAgICB9KVxyXG4gICAgfSovXHJcblxyXG4gICAgLyoqXHJcbiAgICAgKiBHZXQgY3VzdG9tIGJhZGdlcyBmcm9tIHRoZSB1c2VyIElELlxyXG4gICAgICogQHBhcmFtIHtzdHJpbmd9IHVzZXIgVGhlIHVzZXIgSUQgXHJcbiAgICAgKiBAcmV0dXJucyB7UHJvbWlzZTxDb25zdGFudHNbXCJiYWRnZXNcIl0+fVxyXG4gICAgICovXHJcbiAgICBhc3luYyBnZXRCYWRnZXModXNlcil7XHJcbiAgICAgICAgaWYodGhpcy5jYWNoZS5iYWRnZXNbdXNlcl0pcmV0dXJuIHRoaXMuY2FjaGUuYmFkZ2VzW3VzZXJdXHJcbiAgICAgICAgaWYoYXdhaXRpbmdCYWRnZXNQcm9taXNlc1t1c2VyXSlyZXR1cm4gYXdhaXRpbmdCYWRnZXNQcm9taXNlc1t1c2VyXVxyXG5cclxuICAgICAgICBsZXQgcmVzb2x2ZVxyXG4gICAgICAgIGNvbnN0IG5ld1Byb21pc2UgPSBuZXcgUHJvbWlzZSgocmVzKSA9PiAocmVzb2x2ZSA9IHJlcykpXHJcbiAgICAgICAgYXdhaXRpbmdCYWRnZXNQcm9taXNlc1t1c2VyXSA9IG5ld1Byb21pc2VcclxuXHJcbiAgICAgICAgY29uc3QgYmFkZ2VzID0gW11cclxuICAgICAgICBmb3IobGV0IGJhZGdlIG9mIENvbnN0YW50cy5iYWRnZXMpe1xyXG4gICAgICAgICAgICBpZihiYWRnZS5kZWZhdWx0VXNlcnMuaW5jbHVkZXModXNlcikpYmFkZ2VzLnB1c2goYmFkZ2UpXHJcbiAgICAgICAgfVxyXG4gICAgICAgIGNvbnN0IGZldGNoZWRCYWRnZXMgPSBhd2FpdCBuZXcgUHJvbWlzZSgocmVzb2x2ZSkgPT4ge1xyXG4gICAgICAgICAgICBpZighc2V0dGluZ3NDb29raWVbXCJsaWdodGNvcmQtNVwiXSlyZXR1cm4gcmVzb2x2ZShbXSlcclxuICAgICAgICAgICAgYmFkZ2VzVG9GZXRjaC5wdXNoKFt1c2VyLCByZXNvbHZlXSlcclxuICAgICAgICAgICAgc2V0VGltZW91dCgoKSA9PiB7XHJcbiAgICAgICAgICAgICAgICBsZXQgdXNlcnMgPSBiYWRnZXNUb0ZldGNoXHJcbiAgICAgICAgICAgICAgICBpZih1c2Vycy5sZW5ndGggPT09IDApcmV0dXJuXHJcbiAgICAgICAgICAgICAgICBiYWRnZXNUb0ZldGNoID0gW11cclxuICAgICAgICAgICAgICAgIGhhbmRsZVJlcXVlc3QoUm91dGVzLmJhZGdlcywgXCJQT1NUXCIsIEpTT04uc3RyaW5naWZ5KHVzZXJzLm1hcChlID0+IGVbMF0pKSlcclxuICAgICAgICAgICAgICAgIC50aGVuKGFzeW5jIHJlcyA9PiB7XHJcbiAgICAgICAgICAgICAgICAgICAgaWYocmVzLnN0YXR1cyAhPT0gMjAwKXsvLyBDb3VsZG4ndCBmZXRjaCBiYWRnZXM6IHNlcnZlciBlcnJvclxyXG4gICAgICAgICAgICAgICAgICAgICAgICB1c2Vycy5mb3JFYWNoKGRhdGEgPT4ge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgZGF0YVsxXShbXSkvLyByZXNvbHZlIG5vIGJhZGdlIGZldGNoZWRcclxuICAgICAgICAgICAgICAgICAgICAgICAgfSlcclxuICAgICAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgICAgICAgY29uc3QgcmVzcG9uc2VCb2R5ID0gYXdhaXQgcmVzLmpzb24oKVxyXG4gICAgICAgICAgICAgICAgICAgIGNvbnNvbGUubG9nKHJlc3BvbnNlQm9keSlcclxuICAgICAgICAgICAgICAgICAgICBmb3IobGV0IHVzZXIgb2YgcmVzcG9uc2VCb2R5KXtcclxuICAgICAgICAgICAgICAgICAgICAgICAgbGV0IHByb21pc2UgPSB1c2Vycy5maW5kKHByb21pc2UgPT4gcHJvbWlzZVswXSA9PT0gdXNlci51c2VyX2lkKVxyXG4gICAgICAgICAgICAgICAgICAgICAgICBwcm9taXNlWzFdKHVzZXIuYmFkZ2VzKVxyXG4gICAgICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgIH0pLmNhdGNoKChlcnIpID0+IHsvLyBDb3VsZG4ndCBmZXRjaCBiYWRnZXM6IGVycm9yXHJcbiAgICAgICAgICAgICAgICAgICAgaWYoIShlcnIgaW5zdGFuY2VvZiBMaWdodGNvcmRFcnJvcikpY29uc29sZS5lcnJvcihlcnIpXHJcbiAgICAgICAgICAgICAgICAgICAgdXNlcnMuZm9yRWFjaChkYXRhID0+IHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgZGF0YVsxXShbXSkvLyByZXNvbHZlIG5vIGJhZGdlIGZldGNoZWRcclxuICAgICAgICAgICAgICAgICAgICB9KVxyXG4gICAgICAgICAgICAgICAgfSlcclxuICAgICAgICAgICAgfSwgMClcclxuICAgICAgICB9KVxyXG4gICAgICAgIGZvcihsZXQgYmFkZ2Ugb2YgZmV0Y2hlZEJhZGdlcyl7XHJcbiAgICAgICAgICAgIGlmKCFDb25zdGFudHMuYmFkZ2VzLmZpbmQoZSA9PiBlLmlkID09PSBiYWRnZSkpY29udGludWUgLy8gV2UgZG8gbm90IGhhdmUgdGhlIENvbXBvbmVudCwgc2tpcCBpdC5cclxuICAgICAgICAgICAgaWYoYmFkZ2VzLmZpbmQoZSA9PiBlLmlkID09PSBiYWRnZSkpY29udGludWUgLy8gQWxyZWFkeSBpbnNlcnRlZC5cclxuICAgICAgICAgICAgYmFkZ2VzLnB1c2goQ29uc3RhbnRzLmJhZGdlcy5maW5kKGUgPT4gZS5pZCA9PT0gYmFkZ2UpKVxyXG4gICAgICAgIH1cclxuICAgICAgICB0aGlzLmNhY2hlID0ge1xyXG4gICAgICAgICAgICBiYWRnZXM6IE9iamVjdC5hc3NpZ24odGhpcy5jYWNoZS5iYWRnZXMsIHtbdXNlcl06IGJhZGdlc30pXHJcbiAgICAgICAgfVxyXG4gICAgICAgIHNldFRpbWVvdXQoKCkgPT4ge1xyXG4gICAgICAgICAgICBkZWxldGUgdGhpcy5jYWNoZS5iYWRnZXNbdXNlcl1cclxuICAgICAgICB9LCA2MDAwMDApO1xyXG5cclxuICAgICAgICByZXNvbHZlKGJhZGdlcylcclxuICAgICAgICBkZWxldGUgYXdhaXRpbmdCYWRnZXNQcm9taXNlc1t1c2VyXVxyXG4gICAgICAgIHJldHVybiBiYWRnZXNcclxuICAgIH1cclxufVxyXG5cclxuY29uc3QgaGFuZGxlUmVxdWVzdCA9IGZ1bmN0aW9uKHJvdXRlLCBtZXRob2QsIGRhdGEpe1xyXG4gICAgaWYoIXNldHRpbmdzQ29va2llW1wibGlnaHRjb3JkLTVcIl0pe1xyXG4gICAgICAgIGNvbnNvbGUud2FybihgQ2FuY2VsaW5nIHJlcXVlc3Qgb24gJHtyb3V0ZX0gd2l0aCBtZXRob2QgJHttZXRob2R9IGFuZCBib2R5YCwgZGF0YSwgXCJiZWNhdXNlIG9mIHNldHRpbmdzLlwiKVxyXG4gICAgICAgIHJldHVybiBQcm9taXNlLnJlamVjdChuZXcgTGlnaHRjb3JkRXJyb3IoXCJUaGUgY3VycmVudCBzZXR0aW5ncyBibG9ja2VkIHRoZSByZXF1ZXN0LlwiKSlcclxuICAgIH1cclxuICAgIGNvbnNvbGUubG9nKGBTZW5kaW5nIHJlcXVlc3Qgb24gJHtyb3V0ZX0gd2l0aCBtZXRob2QgJHttZXRob2R9IGFuZCBib2R5YCwgZGF0YSlcclxuICAgIHJldHVybiBub2RlRmV0Y2goYCR7Q29uc3RhbnRzLlNFUlZFUl9VUkx9L2FwaS92MSR7cm91dGV9YCwge1xyXG4gICAgICAgIG1ldGhvZCxcclxuICAgICAgICBoZWFkZXJzOiB7XHJcbiAgICAgICAgICAgIFwiQ0xJRU5UXCI6IFwiTGlnaHRjb3JkXCIsXHJcbiAgICAgICAgICAgIFwiQXV0aG9yaXphdGlvblwiOiB3aW5kb3cuTGlnaHRjb3JkLkFwaS5BdXRob3JpemF0aW9uIHx8IFwiTm9uZTo6QW5vbnltb3VzXCJcclxuICAgICAgICB9LFxyXG4gICAgICAgIC4uLihkYXRhID8ge1xyXG4gICAgICAgICAgICBib2R5OiBkYXRhXHJcbiAgICAgICAgfSA6IHt9KVxyXG4gICAgfSlcclxufVxyXG5cclxuY2xhc3MgTGlnaHRjb3JkRXJyb3IgZXh0ZW5kcyBFcnJvciB7XHJcbiAgICBjb25zdHJ1Y3Rvcigpe1xyXG4gICAgICAgIHN1cGVyKC4uLmFyZ3VtZW50cylcclxuICAgICAgICB0aGlzLm5hbWUgPSBcIkxpZ2h0Y29yZEVycm9yXCJcclxuICAgICAgICBcclxuICAgIH1cclxufVxyXG5cclxuZXhwb3J0IGNvbnN0IENvbnN0YW50cyA9IHtcclxuICAgIFNFUlZFUl9VUkw6IFwiaHR0cDovLzEyNy4wLjAuMVwiLFxyXG4gICAgYmFkZ2VzOiBbIC8vIFRPRE86IFxyXG4gICAgICAgIC8qe1xyXG4gICAgICAgICAgICBuYW1lOiBcIkxpZ2h0Y29yZCBVc2VyXCIsXHJcbiAgICAgICAgICAgIGlkOiBcIjAxY2ZhN2IwLTdjZGItNGIwZS04MjU4LTljNmE3ODIzNWM5M1wiLFxyXG4gICAgICAgICAgICBkZWZhdWx0VXNlcnM6IFtdLFxyXG4gICAgICAgICAgICBzY29wZXM6IFtcclxuICAgICAgICAgICAgICAgIFwidXNlclwiXHJcbiAgICAgICAgICAgIF0sXHJcbiAgICAgICAgICAgIGNvbXBvbmVudDogTGlnaHRjb3JkVXNlckJhZGdlXHJcbiAgICAgICAgfSwgKi97XHJcbiAgICAgICAgICAgIG5hbWU6IFwiTGlnaHRjb3JkIEJ1ZyBIdW50ZXJcIixcclxuICAgICAgICAgICAgaWQ6IFwiZjA0Njk4ZjUtODE2Yi00MWUzLWJkMDEtOTIyOTExOTNkN2E1XCIsXHJcbiAgICAgICAgICAgIGRlZmF1bHRVc2VyczogW1xyXG4gICAgICAgICAgICAgICAgXCI2OTY0ODExOTQ0NDMwMTQxNzRcIixcclxuICAgICAgICAgICAgICAgIFwiNjk2MDAzNDU2NjExMzg1Mzk2XCJcclxuICAgICAgICAgICAgXSxcclxuICAgICAgICAgICAgc2NvcGVzOiBbXSxcclxuICAgICAgICAgICAgY29tcG9uZW50OiBCdWdIdW50ZXJCYWRnZSxcclxuICAgICAgICAgICAgaHJlZjogXCJodHRwczovL2dpdGh1Yi5jb20vbGlnaHRjb3JkL2xpZ2h0Y29yZC93aWtpL2JhZGdlcy9idWdfaHVudGVyXCJcclxuICAgICAgICB9LCB7XHJcbiAgICAgICAgICAgIG5hbWU6IFwiQnVmZm9vblwiLFxyXG4gICAgICAgICAgICBpZDogXCIwNjkwNGQzMS02NWI0LTQxZWMtYTUwYy04NjU4YmJkMWFmOTZcIixcclxuICAgICAgICAgICAgZGVmYXVsdFVzZXJzOiBbXHJcbiAgICAgICAgICAgICAgICBcIjM4OTAxNjg5NTU0MzcwNTYwMlwiLFxyXG4gICAgICAgICAgICAgICAgXCI2NjQ2MDAxMzQ1Mjg2NjM1NjVcIlxyXG4gICAgICAgICAgICBdLFxyXG4gICAgICAgICAgICBzY29wZXM6IFtdLFxyXG4gICAgICAgICAgICBjb21wb25lbnQ6IENpcmN1cyxcclxuICAgICAgICAgICAgaHJlZjogXCJodHRwczovL3d3dy55b3V0dWJlLmNvbS93YXRjaD92PUVKdGI2ei1kbFQ4XCJcclxuICAgICAgICB9XHJcbiAgICBdXHJcbn1cclxuXHJcbmV4cG9ydCBjb25zdCBSb3V0ZXMgPSB7XHJcbiAgICBiYWRnZXM6IGAvdXNlcnMvYmFkZ2VzYCxcclxuICAgIGRlbGV0ZTogYC9kZWxldGVgXHJcbn0iLCIvKipcclxuICogQ29weXJpZ2h0IDIwMTggWmFjaGFyeSBSYXVlblxyXG4gKlxyXG4gKiBQZXJtaXNzaW9uIGlzIGhlcmVieSBncmFudGVkLCBmcmVlIG9mIGNoYXJnZSwgdG8gYW55IHBlcnNvbiBvYnRhaW5pbmdcclxuICogYSBjb3B5IG9mIHRoaXMgc29mdHdhcmUgYW5kIGFzc29jaWF0ZWQgZG9jdW1lbnRhdGlvbiBmaWxlcyAodGhlIFwiU29mdHdhcmVcIiksXHJcbiAqIHRvIGRlYWwgaW4gdGhlIFNvZnR3YXJlIHdpdGhvdXQgcmVzdHJpY3Rpb24sIGluY2x1ZGluZyB3aXRob3V0IGxpbWl0YXRpb24gdGhlXHJcbiAqIHJpZ2h0cyB0byB1c2UsIGNvcHksIG1vZGlmeSwgbWVyZ2UsIHB1Ymxpc2gsIGRpc3RyaWJ1dGUsIHN1YmxpY2Vuc2UsIGFuZC9vciBzZWxsXHJcbiAqIGNvcGllcyBvZiB0aGUgU29mdHdhcmUsIGFuZCB0byBwZXJtaXQgcGVyc29ucyB0byB3aG9tIHRoZSBTb2Z0d2FyZSBpcyBmdXJuaXNoZWRcclxuICogdG8gZG8gc28sIHN1YmplY3QgdG8gdGhlIGZvbGxvd2luZyBjb25kaXRpb25zOlxyXG4gKlxyXG4gKiBUaGUgYWJvdmUgY29weXJpZ2h0IG5vdGljZSBhbmQgdGhpcyBwZXJtaXNzaW9uIG5vdGljZSBzaGFsbCBiZSBpbmNsdWRlZCBpbiBhbGxcclxuICogY29waWVzIG9yIHN1YnN0YW50aWFsIHBvcnRpb25zIG9mIHRoZSBTb2Z0d2FyZS5cclxuICpcclxuICogVEhFIFNPRlRXQVJFIElTIFBST1ZJREVEIFwiQVMgSVNcIiwgV0lUSE9VVCBXQVJSQU5UWSBPRiBBTlkgS0lORCwgRVhQUkVTUyBPUiBJTVBMSUVELFxyXG4gKiBJTkNMVURJTkcgQlVUIE5PVCBMSU1JVEVEIFRPIFRIRSBXQVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJTElUWSwgRklUTkVTUyBGT1IgQVxyXG4gKiBQQVJUSUNVTEFSIFBVUlBPU0UgQU5EIE5PTklORlJJTkdFTUVOVC4gSU4gTk8gRVZFTlQgU0hBTEwgVEhFIEFVVEhPUlMgT1IgQ09QWVJJR0hUXHJcbiAqIEhPTERFUlMgQkUgTElBQkxFIEZPUiBBTlkgQ0xBSU0sIERBTUFHRVMgT1IgT1RIRVIgTElBQklMSVRZLCBXSEVUSEVSIElOIEFOIEFDVElPTiBPRlxyXG4gKiBDT05UUkFDVCwgVE9SVCBPUiBPVEhFUldJU0UsIEFSSVNJTkcgRlJPTSwgT1VUIE9GIE9SIElOIENPTk5FQ1RJT04gV0lUSCBUSEUgU09GVFdBUkVcclxuICogT1IgVEhFIFVTRSBPUiBPVEhFUiBERUFMSU5HUyBJTiBUSEUgU09GVFdBUkUuXHJcbiAqIFxyXG4gKiBGcm9tOiBodHRwczovL2dpdGh1Yi5jb20vcmF1ZW56aS9CRFBsdWdpbkxpYnJhcnlcclxuICovXHJcblxyXG4vKipcclxuICogQGludGVyZmFjZVxyXG4gKiBAbmFtZSBPZmZzZXRcclxuICogQHByb3BlcnR5IHtudW1iZXJ9IHRvcCAtIFRvcCBvZmZzZXQgb2YgdGhlIHRhcmdldCBlbGVtZW50LlxyXG4gKiBAcHJvcGVydHkge251bWJlcn0gcmlnaHQgLSBSaWdodCBvZmZzZXQgb2YgdGhlIHRhcmdldCBlbGVtZW50LlxyXG4gKiBAcHJvcGVydHkge251bWJlcn0gYm90dG9tIC0gQm90dG9tIG9mZnNldCBvZiB0aGUgdGFyZ2V0IGVsZW1lbnQuXHJcbiAqIEBwcm9wZXJ0eSB7bnVtYmVyfSBsZWZ0IC0gTGVmdCBvZmZzZXQgb2YgdGhlIHRhcmdldCBlbGVtZW50LlxyXG4gKiBAcHJvcGVydHkge251bWJlcn0gaGVpZ2h0IC0gT3V0ZXIgaGVpZ2h0IG9mIHRoZSB0YXJnZXQgZWxlbWVudC5cclxuICogQHByb3BlcnR5IHtudW1iZXJ9IHdpZHRoIC0gT3V0ZXIgd2lkdGggb2YgdGhlIHRhcmdldCBlbGVtZW50LlxyXG4gKi9cclxuXHJcbiAvKipcclxuICogRnVuY3Rpb24gdGhhdCBhdXRvbWF0aWNhbGx5IHJlbW92ZXMgYWRkZWQgbGlzdGVuZXIuXHJcbiAqIEBjYWxsYmFjayBtb2R1bGU6RE9NVG9vbHN+Q2FuY2VsTGlzdGVuZXJcclxuICovXHJcbiBcclxuZXhwb3J0IGRlZmF1bHQgY2xhc3MgRE9NVG9vbHMge1xyXG5cclxuICAgIHN0YXRpYyBlc2NhcGVJRChpZCkge1xyXG4gICAgICAgIHJldHVybiBpZC5yZXBsYWNlKC9eW15hLXpdK3xbXlxcdy1dKy9naSwgXCItXCIpO1xyXG4gICAgfVxyXG5cclxuICAgIC8qKlxyXG5cdCAqIEFkZHMgYSBzdHlsZSB0byB0aGUgZG9jdW1lbnQuXHJcblx0ICogQHBhcmFtIHtzdHJpbmd9IGlkIC0gaWRlbnRpZmllciB0byB1c2UgYXMgdGhlIGVsZW1lbnQgaWRcclxuXHQgKiBAcGFyYW0ge3N0cmluZ30gY3NzIC0gY3NzIHRvIGFkZCB0byB0aGUgZG9jdW1lbnRcclxuXHQgKi9cclxuXHRzdGF0aWMgYWRkU3R5bGUoaWQsIGNzcykge1xyXG5cdFx0ZG9jdW1lbnQuaGVhZC5hcHBlbmQoRE9NVG9vbHMuY3JlYXRlRWxlbWVudChgPHN0eWxlIGlkPVwiJHtpZH1cIj4ke2Nzc308L3N0eWxlPmApKTtcclxuXHR9XHJcblxyXG5cdC8qKlxyXG5cdCAqIFJlbW92ZXMgYSBzdHlsZSBmcm9tIHRoZSBkb2N1bWVudC5cclxuXHQgKiBAcGFyYW0ge3N0cmluZ30gaWQgLSBvcmlnaW5hbCBpZGVudGlmaWVyIHVzZWRcclxuXHQgKi9cclxuXHRzdGF0aWMgcmVtb3ZlU3R5bGUoaWQpIHtcclxuXHRcdGNvbnN0IGVsZW1lbnQgPSBkb2N1bWVudC5nZXRFbGVtZW50QnlJZChpZCk7XHJcblx0XHRpZiAoZWxlbWVudCkgZWxlbWVudC5yZW1vdmUoKTtcclxuXHR9XHJcblxyXG5cdC8qKlxyXG5cdCAqIEFkZHMvcmVxdWlyZXMgYSByZW1vdGUgc2NyaXB0IHRvIGJlIGxvYWRlZFxyXG5cdCAqIEBwYXJhbSB7c3RyaW5nfSBpZCAtIGlkZW50aWZpZXIgdG8gdXNlIGZvciB0aGlzIHNjcmlwdFxyXG5cdCAqIEBwYXJhbSB7c3RyaW5nfSB1cmwgLSB1cmwgZnJvbSB3aGljaCB0byBsb2FkIHRoZSBzY3JpcHRcclxuXHQgKiBAcmV0dXJucyB7UHJvbWlzZX0gcHJvbWlzZSB0aGF0IHJlc29sdmVzIHdoZW4gdGhlIHNjcmlwdCBpcyBsb2FkZWRcclxuXHQgKi9cclxuXHRzdGF0aWMgYWRkU2NyaXB0KGlkLCB1cmwpIHtcclxuXHRcdHJldHVybiBuZXcgUHJvbWlzZShyZXNvbHZlID0+IHtcclxuXHRcdFx0Y29uc3Qgc2NyaXB0ID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudChcInNjcmlwdFwiKTtcclxuXHRcdFx0c2NyaXB0LmlkID0gaWQ7XHJcblx0XHRcdHNjcmlwdC5zcmMgPSB1cmw7XHJcblx0XHRcdHNjcmlwdC50eXBlID0gXCJ0ZXh0L2phdmFzY3JpcHRcIjtcclxuXHRcdFx0c2NyaXB0Lm9ubG9hZCA9IHJlc29sdmU7XHJcblx0XHRcdGRvY3VtZW50LmhlYWQuYXBwZW5kKHNjcmlwdCk7XHJcblx0XHR9KTtcclxuXHR9XHJcblxyXG5cdC8qKlxyXG5cdCAqIFJlbW92ZXMgYSByZW1vdGUgc2NyaXB0IGZyb20gdGhlIGRvY3VtZW50LlxyXG5cdCAqIEBwYXJhbSB7c3RyaW5nfSBpZCAtIG9yaWdpbmFsIGlkZW50aWZpZXIgdXNlZFxyXG5cdCAqL1xyXG5cdHN0YXRpYyByZW1vdmVTY3JpcHQoaWQpIHtcclxuICAgICAgICBpZCA9IHRoaXMuZXNjYXBlSUQoaWQpO1xyXG5cdFx0Y29uc3QgZWxlbWVudCA9IGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKGlkKTtcclxuXHRcdGlmIChlbGVtZW50KSBlbGVtZW50LnJlbW92ZSgpO1xyXG4gICAgfVxyXG4gICAgXHJcbiAgICAvLyBodHRwczovL2phdmFzY3JpcHQuaW5mby9qcy1hbmltYXRpb25cclxuICAgIHN0YXRpYyBhbmltYXRlKHt0aW1pbmcgPSBfID0+IF8sIHVwZGF0ZSwgZHVyYXRpb259KSB7XHJcbiAgICAgICAgY29uc3Qgc3RhcnQgPSBwZXJmb3JtYW5jZS5ub3coKTtcclxuICAgICAgXHJcbiAgICAgICAgcmVxdWVzdEFuaW1hdGlvbkZyYW1lKGZ1bmN0aW9uIGFuaW1hdGUodGltZSkge1xyXG4gICAgICAgICAgLy8gdGltZUZyYWN0aW9uIGdvZXMgZnJvbSAwIHRvIDFcclxuICAgICAgICAgIGxldCB0aW1lRnJhY3Rpb24gPSAodGltZSAtIHN0YXJ0KSAvIGR1cmF0aW9uO1xyXG4gICAgICAgICAgaWYgKHRpbWVGcmFjdGlvbiA+IDEpIHRpbWVGcmFjdGlvbiA9IDE7XHJcbiAgICAgIFxyXG4gICAgICAgICAgLy8gY2FsY3VsYXRlIHRoZSBjdXJyZW50IGFuaW1hdGlvbiBzdGF0ZVxyXG4gICAgICAgICAgY29uc3QgcHJvZ3Jlc3MgPSB0aW1pbmcodGltZUZyYWN0aW9uKTtcclxuICAgICAgXHJcbiAgICAgICAgICB1cGRhdGUocHJvZ3Jlc3MpOyAvLyBkcmF3IGl0XHJcbiAgICAgIFxyXG4gICAgICAgICAgaWYgKHRpbWVGcmFjdGlvbiA8IDEpIHtcclxuICAgICAgICAgICAgcmVxdWVzdEFuaW1hdGlvbkZyYW1lKGFuaW1hdGUpO1xyXG4gICAgICAgICAgfVxyXG4gICAgICBcclxuICAgICAgICB9KTtcclxuICAgICAgfVxyXG5cclxuICAgIC8qKlxyXG4gICAgICogVGhpcyBpcyBteSBzaGl0IHZlcnNpb24gb2Ygbm90IGhhdmluZyB0byB1c2UgYCRgIGZyb20galF1ZXJ5LiBNZWFuaW5nXHJcbiAgICAgKiB0aGF0IHlvdSBjYW4gcGFzcyBhIHNlbGVjdG9yIGFuZCBpdCB3aWxsIGF1dG9tYXRpY2FsbHkgcnVuIHtAbGluayBtb2R1bGU6RE9NVG9vbHMucXVlcnl9LlxyXG4gICAgICogSXQgYWxzbyBtZWFucyB0aGF0IHlvdSBjYW4gcGFzcyBhIHN0cmluZyBvZiBodG1sIGFuZCBpdCB3aWxsIHBlcmZvcm0gYW5kIHJldHVybiBgcGFyc2VIVE1MYC5cclxuICAgICAqIEBzZWUgbW9kdWxlOkRPTVRvb2xzLnBhcnNlSFRNTFxyXG4gICAgICogQHNlZSBtb2R1bGU6RE9NVG9vbHMucXVlcnlcclxuICAgICAqIEBwYXJhbSB7c3RyaW5nfSBzZWxlY3RvciAtIFNlbGVjdG9yIHRvIHF1ZXJ5IG9yIEhUTUwgdG8gcGFyc2VcclxuICAgICAqIEByZXR1cm5zIHsoRG9jdW1lbnRGcmFnbWVudHxOb2RlTGlzdHxIVE1MRWxlbWVudCl9IC0gRWl0aGVyIHRoZSByZXN1bHQgb2YgYHBhcnNlSFRNTGAgb3IgYHF1ZXJ5YFxyXG4gICAgICovXHJcbiAgICBzdGF0aWMgUShzZWxlY3Rvcikge1xyXG4gICAgICAgIGNvbnN0IGVsZW1lbnQgPSB0aGlzLnBhcnNlSFRNTChzZWxlY3Rvcik7XHJcbiAgICAgICAgY29uc3QgaXNIVE1MID0gZWxlbWVudCBpbnN0YW5jZW9mIE5vZGVMaXN0ID8gQXJyYXkuZnJvbShlbGVtZW50KS5zb21lKG4gPT4gbi5ub2RlVHlwZSA9PT0gMSkgOiBlbGVtZW50Lm5vZGVUeXBlID09PSAxO1xyXG4gICAgICAgIGlmIChpc0hUTUwpIHJldHVybiBlbGVtZW50O1xyXG4gICAgICAgIHJldHVybiB0aGlzLnF1ZXJ5KHNlbGVjdG9yKTtcclxuICAgIH1cclxuXHJcbiAgICAvKipcclxuICAgICAqIEVzc2VudGlhbGx5IGEgc2hvcnRoYW5kIGZvciBgZG9jdW1lbnQucXVlcnlTZWxlY3RvcmAuIElmIHRoZSBgYmFzZUVsZW1lbnRgIGlzIG5vdCBwcm92aWRlZFxyXG4gICAgICogYGRvY3VtZW50YCBpcyB1c2VkIGJ5IGRlZmF1bHQuXHJcbiAgICAgKiBAcGFyYW0ge3N0cmluZ30gc2VsZWN0b3IgLSBTZWxlY3RvciB0byBxdWVyeVxyXG4gICAgICogQHBhcmFtIHtFbGVtZW50fSBbYmFzZUVsZW1lbnRdIC0gRWxlbWVudCB0byBiYXNlIHRoZSBxdWVyeSBmcm9tXHJcbiAgICAgKiBAcmV0dXJucyB7KEVsZW1lbnR8bnVsbCl9IC0gVGhlIGZvdW5kIGVsZW1lbnQgb3IgbnVsbCBpZiBub3QgZm91bmRcclxuICAgICAqL1xyXG4gICAgc3RhdGljIHF1ZXJ5KHNlbGVjdG9yLCBiYXNlRWxlbWVudCkge1xyXG4gICAgICAgIGlmICghYmFzZUVsZW1lbnQpIGJhc2VFbGVtZW50ID0gZG9jdW1lbnQ7XHJcbiAgICAgICAgcmV0dXJuIGJhc2VFbGVtZW50LnF1ZXJ5U2VsZWN0b3Ioc2VsZWN0b3IpO1xyXG4gICAgfVxyXG5cclxuICAgIC8qKlxyXG4gICAgICogRXNzZW50aWFsbHkgYSBzaG9ydGhhbmQgZm9yIGBkb2N1bWVudC5xdWVyeVNlbGVjdG9yQWxsYC4gSWYgdGhlIGBiYXNlRWxlbWVudGAgaXMgbm90IHByb3ZpZGVkXHJcbiAgICAgKiBgZG9jdW1lbnRgIGlzIHVzZWQgYnkgZGVmYXVsdC5cclxuICAgICAqIEBwYXJhbSB7c3RyaW5nfSBzZWxlY3RvciAtIFNlbGVjdG9yIHRvIHF1ZXJ5XHJcbiAgICAgKiBAcGFyYW0ge0VsZW1lbnR9IFtiYXNlRWxlbWVudF0gLSBFbGVtZW50IHRvIGJhc2UgdGhlIHF1ZXJ5IGZyb21cclxuICAgICAqIEByZXR1cm5zIHtBcnJheTxFbGVtZW50Pn0gLSBBcnJheSBvZiBhbGwgZm91bmQgZWxlbWVudHNcclxuICAgICAqL1xyXG4gICAgc3RhdGljIHF1ZXJ5QWxsKHNlbGVjdG9yLCBiYXNlRWxlbWVudCkge1xyXG4gICAgICAgIGlmICghYmFzZUVsZW1lbnQpIGJhc2VFbGVtZW50ID0gZG9jdW1lbnQ7XHJcbiAgICAgICAgcmV0dXJuIGJhc2VFbGVtZW50LnF1ZXJ5U2VsZWN0b3JBbGwoc2VsZWN0b3IpO1xyXG4gICAgfVxyXG5cclxuICAgIC8qKlxyXG4gICAgICogUGFyc2VzIGEgc3RyaW5nIG9mIEhUTUwgYW5kIHJldHVybnMgdGhlIHJlc3VsdHMuIElmIHRoZSBzZWNvbmQgcGFyYW1ldGVyIGlzIHRydWUsXHJcbiAgICAgKiB0aGUgcGFyc2VkIEhUTUwgd2lsbCBiZSByZXR1cm5lZCBhcyBhIGRvY3VtZW50IGZyYWdtZW50IHtAc2VlIGh0dHBzOi8vZGV2ZWxvcGVyLm1vemlsbGEub3JnL2VuLVVTL2RvY3MvV2ViL0FQSS9Eb2N1bWVudEZyYWdtZW50fS5cclxuICAgICAqIFRoaXMgaXMgZXh0cmVtZWx5IHVzZWZ1bCBpZiB5b3UgaGF2ZSBhIGxpc3Qgb2YgZWxlbWVudHMgYXQgdGhlIHRvcCBsZXZlbCwgdGhleSBjYW4gdGhlbiBiZSBhcHBlbmRlZCBhbGwgYXQgb25jZSB0byBhbm90aGVyIG5vZGUuXHJcbiAgICAgKiBcclxuICAgICAqIElmIHRoZSBzZWNvbmQgcGFyYW1ldGVyIGlzIGZhbHNlLCB0aGVuIHRoZSByZXR1cm4gdmFsdWUgd2lsbCBiZSB0aGUgbGlzdCBvZiBwYXJzZWRcclxuICAgICAqIG5vZGVzIGFuZCB0aGVyZSB3ZXJlIG11bHRpcGxlIHRvcCBsZXZlbCBub2Rlcywgb3RoZXJ3aXNlIHRoZSBzaW5nbGUgbm9kZSBpcyByZXR1cm5lZC5cclxuICAgICAqIEBwYXJhbSB7c3RyaW5nfSBodG1sIC0gSFRNTCB0byBiZSBwYXJzZWRcclxuICAgICAqIEBwYXJhbSB7Ym9vbGVhbn0gW2ZyYWdtZW50PWZhbHNlXSAtIFdoZXRoZXIgb3Igbm90IHRoZSByZXR1cm4gc2hvdWxkIGJlIHRoZSByYXcgYERvY3VtZW50RnJhZ21lbnRgXHJcbiAgICAgKiBAcmV0dXJucyB7KERvY3VtZW50RnJhZ21lbnR8Tm9kZUxpc3R8SFRNTEVsZW1lbnQpfSAtIFRoZSByZXN1bHQgb2YgSFRNTCBwYXJzaW5nXHJcbiAgICAgKi9cclxuICAgIHN0YXRpYyBwYXJzZUhUTUwoaHRtbCwgZnJhZ21lbnQgPSBmYWxzZSkge1xyXG4gICAgICAgIGNvbnN0IHRlbXBsYXRlID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudChcInRlbXBsYXRlXCIpO1xyXG4gICAgICAgIHRlbXBsYXRlLmlubmVySFRNTCA9IGh0bWw7XHJcbiAgICAgICAgY29uc3Qgbm9kZSA9IHRlbXBsYXRlLmNvbnRlbnQuY2xvbmVOb2RlKHRydWUpO1xyXG4gICAgICAgIGlmIChmcmFnbWVudCkgcmV0dXJuIG5vZGU7XHJcbiAgICAgICAgcmV0dXJuIG5vZGUuY2hpbGROb2Rlcy5sZW5ndGggPiAxID8gbm9kZS5jaGlsZE5vZGVzIDogbm9kZS5jaGlsZE5vZGVzWzBdO1xyXG4gICAgfVxyXG5cclxuICAgIC8qKiBBbHRlcm5hdGUgbmFtZSBmb3Ige0BsaW5rIG1vZHVsZTpET01Ub29scy5wYXJzZUhUTUx9ICovXHJcbiAgICBzdGF0aWMgY3JlYXRlRWxlbWVudChodG1sLCBmcmFnbWVudCA9IGZhbHNlKSB7cmV0dXJuIHRoaXMucGFyc2VIVE1MKGh0bWwsIGZyYWdtZW50KTt9XHJcbiAgICBcclxuICAgIC8qKlxyXG4gICAgICogVGFrZXMgYSBzdHJpbmcgb2YgaHRtbCBhbmQgZXNjYXBlcyBpdCB1c2luZyB0aGUgYnJvd2VyJ3Mgb3duIGVzY2FwaW5nIG1lY2hhbmlzbS5cclxuICAgICAqIEBwYXJhbSB7U3RyaW5nfSBodG1sIC0gaHRtbCB0byBiZSBlc2NhcGVkXHJcbiAgICAgKi9cclxuICAgIHN0YXRpYyBlc2NhcGVIVE1MKGh0bWwpIHtcclxuICAgICAgICBjb25zdCB0ZXh0Tm9kZSA9IGRvY3VtZW50LmNyZWF0ZVRleHROb2RlKFwiXCIpO1xyXG4gICAgICAgIGNvbnN0IHNwYW5FbGVtZW50ID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudChcInNwYW5cIik7XHJcbiAgICAgICAgc3BhbkVsZW1lbnQuYXBwZW5kKHRleHROb2RlKTtcclxuICAgICAgICB0ZXh0Tm9kZS5ub2RlVmFsdWUgPSBodG1sO1xyXG4gICAgICAgIHJldHVybiBzcGFuRWxlbWVudC5pbm5lckhUTUw7XHJcbiAgICB9XHJcblxyXG4gICAgLyoqXHJcbiAgICAgKiBBZGRzIGEgbGlzdCBvZiBjbGFzc2VzIGZyb20gdGhlIHRhcmdldCBlbGVtZW50LlxyXG4gICAgICogQHBhcmFtIHtFbGVtZW50fSBlbGVtZW50IC0gRWxlbWVudCB0byBlZGl0IGNsYXNzZXMgb2ZcclxuICAgICAqIEBwYXJhbSB7Li4uc3RyaW5nfSBjbGFzc2VzIC0gTmFtZXMgb2YgY2xhc3NlcyB0byBhZGRcclxuICAgICAqIEByZXR1cm5zIHtFbGVtZW50fSAtIGBlbGVtZW50YCB0byBhbGxvdyBmb3IgY2hhaW5pbmdcclxuICAgICAqL1xyXG4gICAgc3RhdGljIGFkZENsYXNzKGVsZW1lbnQsIC4uLmNsYXNzZXMpIHtcclxuICAgICAgICBjbGFzc2VzID0gY2xhc3Nlcy5mbGF0KCkuZmlsdGVyKGMgPT4gYyk7XHJcbiAgICAgICAgZm9yIChsZXQgYyA9IDA7IGMgPCBjbGFzc2VzLmxlbmd0aDsgYysrKSBjbGFzc2VzW2NdID0gY2xhc3Nlc1tjXS50b1N0cmluZygpLnNwbGl0KFwiIFwiKTtcclxuICAgICAgICBjbGFzc2VzID0gY2xhc3Nlcy5mbGF0KCkuZmlsdGVyKGMgPT4gYyk7XHJcbiAgICAgICAgZWxlbWVudC5jbGFzc0xpc3QuYWRkKC4uLmNsYXNzZXMpO1xyXG4gICAgICAgIHJldHVybiBlbGVtZW50O1xyXG4gICAgfVxyXG5cclxuICAgIC8qKlxyXG4gICAgICogUmVtb3ZlcyBhIGxpc3Qgb2YgY2xhc3NlcyBmcm9tIHRoZSB0YXJnZXQgZWxlbWVudC5cclxuICAgICAqIEBwYXJhbSB7RWxlbWVudH0gZWxlbWVudCAtIEVsZW1lbnQgdG8gZWRpdCBjbGFzc2VzIG9mXHJcbiAgICAgKiBAcGFyYW0gey4uLnN0cmluZ30gY2xhc3NlcyAtIE5hbWVzIG9mIGNsYXNzZXMgdG8gcmVtb3ZlXHJcbiAgICAgKiBAcmV0dXJucyB7RWxlbWVudH0gLSBgZWxlbWVudGAgdG8gYWxsb3cgZm9yIGNoYWluaW5nXHJcbiAgICAgKi9cclxuICAgIHN0YXRpYyByZW1vdmVDbGFzcyhlbGVtZW50LCAuLi5jbGFzc2VzKSB7XHJcbiAgICAgICAgZm9yIChsZXQgYyA9IDA7IGMgPCBjbGFzc2VzLmxlbmd0aDsgYysrKSBjbGFzc2VzW2NdID0gY2xhc3Nlc1tjXS50b1N0cmluZygpLnNwbGl0KFwiIFwiKTtcclxuICAgICAgICBjbGFzc2VzID0gY2xhc3Nlcy5mbGF0KCkuZmlsdGVyKGMgPT4gYyk7XHJcbiAgICAgICAgZWxlbWVudC5jbGFzc0xpc3QucmVtb3ZlKC4uLmNsYXNzZXMpO1xyXG4gICAgICAgIHJldHVybiBlbGVtZW50O1xyXG4gICAgfVxyXG5cclxuICAgIC8qKlxyXG4gICAgICogV2hlbiBvbmx5IG9uZSBhcmd1bWVudCBpcyBwcmVzZW50OiBUb2dnbGUgY2xhc3MgdmFsdWU7XHJcbiAgICAgKiBpLmUuLCBpZiBjbGFzcyBleGlzdHMgdGhlbiByZW1vdmUgaXQgYW5kIHJldHVybiBmYWxzZSwgaWYgbm90LCB0aGVuIGFkZCBpdCBhbmQgcmV0dXJuIHRydWUuXHJcbiAgICAgKiBXaGVuIGEgc2Vjb25kIGFyZ3VtZW50IGlzIHByZXNlbnQ6XHJcbiAgICAgKiBJZiB0aGUgc2Vjb25kIGFyZ3VtZW50IGV2YWx1YXRlcyB0byB0cnVlLCBhZGQgc3BlY2lmaWVkIGNsYXNzIHZhbHVlLCBhbmQgaWYgaXQgZXZhbHVhdGVzIHRvIGZhbHNlLCByZW1vdmUgaXQuXHJcbiAgICAgKiBAcGFyYW0ge0VsZW1lbnR9IGVsZW1lbnQgLSBFbGVtZW50IHRvIGVkaXQgY2xhc3NlcyBvZlxyXG4gICAgICogQHBhcmFtIHtzdHJpbmd9IGNsYXNzbmFtZSAtIE5hbWUgb2YgY2xhc3MgdG8gdG9nZ2xlXHJcbiAgICAgKiBAcGFyYW0ge2Jvb2xlYW59IFtpbmRpY2F0b3JdIC0gT3B0aW9uYWwgaW5kaWNhdG9yIGZvciBpZiB0aGUgY2xhc3Mgc2hvdWxkIGJlIHRvZ2dsZWRcclxuICAgICAqIEByZXR1cm5zIHtFbGVtZW50fSAtIGBlbGVtZW50YCB0byBhbGxvdyBmb3IgY2hhaW5pbmdcclxuICAgICAqL1xyXG4gICAgc3RhdGljIHRvZ2dsZUNsYXNzKGVsZW1lbnQsIGNsYXNzbmFtZSwgaW5kaWNhdG9yKSB7XHJcbiAgICAgICAgY2xhc3NuYW1lID0gY2xhc3NuYW1lLnRvU3RyaW5nKCkuc3BsaXQoXCIgXCIpLmZpbHRlcihjID0+IGMpO1xyXG4gICAgICAgIGlmICh0eXBlb2YoaW5kaWNhdG9yKSAhPT0gXCJ1bmRlZmluZWRcIikgY2xhc3NuYW1lLmZvckVhY2goYyA9PiBlbGVtZW50LmNsYXNzTGlzdC50b2dnbGUoYywgaW5kaWNhdG9yKSk7XHJcbiAgICAgICAgZWxzZSBjbGFzc25hbWUuZm9yRWFjaChjID0+IGVsZW1lbnQuY2xhc3NMaXN0LnRvZ2dsZShjKSk7XHJcbiAgICAgICAgcmV0dXJuIGVsZW1lbnQ7XHJcbiAgICB9XHJcblxyXG4gICAgLyoqXHJcbiAgICAgKiBDaGVja3MgaWYgYW4gZWxlbWVudCBoYXMgYSBzcGVjaWZpYyBjbGFzc1xyXG4gICAgICogQHBhcmFtIHtFbGVtZW50fSBlbGVtZW50IC0gRWxlbWVudCB0byBlZGl0IGNsYXNzZXMgb2ZcclxuICAgICAqIEBwYXJhbSB7c3RyaW5nfSBjbGFzc25hbWUgLSBOYW1lIG9mIGNsYXNzIHRvIGNoZWNrXHJcbiAgICAgKiBAcmV0dXJucyB7Ym9vbGVhbn0gLSBgdHJ1ZWAgaWYgdGhlIGVsZW1lbnQgaGFzIHRoZSBjbGFzcywgYGZhbHNlYCBvdGhlcndpc2UuXHJcbiAgICAgKi9cclxuICAgIHN0YXRpYyBoYXNDbGFzcyhlbGVtZW50LCBjbGFzc25hbWUpIHtcclxuICAgICAgICByZXR1cm4gY2xhc3NuYW1lLnRvU3RyaW5nKCkuc3BsaXQoXCIgXCIpLmZpbHRlcihjID0+IGMpLmV2ZXJ5KGMgPT4gZWxlbWVudC5jbGFzc0xpc3QuY29udGFpbnMoYykpO1xyXG4gICAgfVxyXG5cclxuICAgIC8qKlxyXG4gICAgICogUmVwbGFjZXMgb25lIGNsYXNzIHdpdGggYW5vdGhlclxyXG4gICAgICogQHBhcmFtIHtFbGVtZW50fSBlbGVtZW50IC0gRWxlbWVudCB0byBlZGl0IGNsYXNzZXMgb2ZcclxuICAgICAqIEBwYXJhbSB7c3RyaW5nfSBvbGROYW1lIC0gTmFtZSBvZiBjbGFzcyB0byByZXBsYWNlXHJcbiAgICAgKiBAcGFyYW0ge3N0cmluZ30gbmV3TmFtZSAtIE5ldyBuYW1lIGZvciB0aGUgY2xhc3NcclxuICAgICAqIEByZXR1cm5zIHtFbGVtZW50fSAtIGBlbGVtZW50YCB0byBhbGxvdyBmb3IgY2hhaW5pbmdcclxuICAgICAqL1xyXG4gICAgc3RhdGljIHJlcGxhY2VDbGFzcyhlbGVtZW50LCBvbGROYW1lLCBuZXdOYW1lKSB7XHJcbiAgICAgICAgZWxlbWVudC5jbGFzc0xpc3QucmVwbGFjZShvbGROYW1lLCBuZXdOYW1lKTtcclxuICAgICAgICByZXR1cm4gZWxlbWVudDtcclxuICAgIH1cclxuXHJcbiAgICAvKipcclxuICAgICAqIEFwcGVuZHMgYHRoaXNOb2RlYCB0byBgdGhhdE5vZGVgXHJcbiAgICAgKiBAcGFyYW0ge05vZGV9IHRoaXNOb2RlIC0gTm9kZSB0byBiZSBhcHBlbmRlZCB0byBhbm90aGVyIG5vZGVcclxuICAgICAqIEBwYXJhbSB7Tm9kZX0gdGhhdE5vZGUgLSBOb2RlIGZvciBgdGhpc05vZGVgIHRvIGJlIGFwcGVuZGVkIHRvXHJcbiAgICAgKiBAcmV0dXJucyB7Tm9kZX0gLSBgdGhpc05vZGVgIHRvIGFsbG93IGZvciBjaGFpbmluZ1xyXG4gICAgICovXHJcbiAgICBzdGF0aWMgYXBwZW5kVG8odGhpc05vZGUsIHRoYXROb2RlKSB7XHJcbiAgICAgICAgaWYgKHR5cGVvZih0aGF0Tm9kZSkgPT0gXCJzdHJpbmdcIikgdGhhdE5vZGUgPSB0aGlzLnF1ZXJ5KHRoYXROb2RlKTtcclxuICAgICAgICBpZiAoIXRoYXROb2RlKSByZXR1cm4gbnVsbDtcclxuICAgICAgICB0aGF0Tm9kZS5hcHBlbmQodGhpc05vZGUpO1xyXG4gICAgICAgIHJldHVybiB0aGlzTm9kZTtcclxuICAgIH1cclxuXHJcbiAgICAvKipcclxuICAgICAqIFByZXBlbmRzIGB0aGlzTm9kZWAgdG8gYHRoYXROb2RlYFxyXG4gICAgICogQHBhcmFtIHtOb2RlfSB0aGlzTm9kZSAtIE5vZGUgdG8gYmUgcHJlcGVuZGVkIHRvIGFub3RoZXIgbm9kZVxyXG4gICAgICogQHBhcmFtIHtOb2RlfSB0aGF0Tm9kZSAtIE5vZGUgZm9yIGB0aGlzTm9kZWAgdG8gYmUgcHJlcGVuZGVkIHRvXHJcbiAgICAgKiBAcmV0dXJucyB7Tm9kZX0gLSBgdGhpc05vZGVgIHRvIGFsbG93IGZvciBjaGFpbmluZ1xyXG4gICAgICovXHJcbiAgICBzdGF0aWMgcHJlcGVuZFRvKHRoaXNOb2RlLCB0aGF0Tm9kZSkge1xyXG4gICAgICAgIGlmICh0eXBlb2YodGhhdE5vZGUpID09IFwic3RyaW5nXCIpIHRoYXROb2RlID0gdGhpcy5xdWVyeSh0aGF0Tm9kZSk7XHJcbiAgICAgICAgaWYgKCF0aGF0Tm9kZSkgcmV0dXJuIG51bGw7XHJcbiAgICAgICAgdGhhdE5vZGUucHJlcGVuZCh0aGlzTm9kZSk7XHJcbiAgICAgICAgcmV0dXJuIHRoaXNOb2RlO1xyXG4gICAgfVxyXG5cclxuICAgIC8qKlxyXG4gICAgICogSW5zZXJ0IGFmdGVyIGEgc3BlY2lmaWMgZWxlbWVudCwgc2ltaWxhciB0byBqUXVlcnkncyBgdGhpc0VsZW1lbnQuaW5zZXJ0QWZ0ZXIob3RoZXJFbGVtZW50KWAuXHJcbiAgICAgKiBAcGFyYW0ge05vZGV9IHRoaXNOb2RlIC0gVGhlIG5vZGUgdG8gaW5zZXJ0XHJcbiAgICAgKiBAcGFyYW0ge05vZGV9IHRhcmdldE5vZGUgLSBOb2RlIHRvIGluc2VydCBhZnRlciBpbiB0aGUgdHJlZVxyXG4gICAgICogQHJldHVybnMge05vZGV9IC0gYHRoaXNOb2RlYCB0byBhbGxvdyBmb3IgY2hhaW5pbmdcclxuICAgICAqL1xyXG4gICAgc3RhdGljIGluc2VydEFmdGVyKHRoaXNOb2RlLCB0YXJnZXROb2RlKSB7XHJcbiAgICAgICAgdGFyZ2V0Tm9kZS5wYXJlbnROb2RlLmluc2VydEJlZm9yZSh0aGlzTm9kZSwgdGFyZ2V0Tm9kZS5uZXh0U2libGluZyk7XHJcbiAgICAgICAgcmV0dXJuIHRoaXNOb2RlO1xyXG4gICAgfVxyXG5cclxuICAgIC8qKlxyXG4gICAgICogSW5zZXJ0IGFmdGVyIGEgc3BlY2lmaWMgZWxlbWVudCwgc2ltaWxhciB0byBqUXVlcnkncyBgdGhpc0VsZW1lbnQuYWZ0ZXIobmV3RWxlbWVudClgLlxyXG4gICAgICogQHBhcmFtIHtOb2RlfSB0aGlzTm9kZSAtIFRoZSBub2RlIHRvIGluc2VydFxyXG4gICAgICogQHBhcmFtIHtOb2RlfSBuZXdOb2RlIC0gTm9kZSB0byBpbnNlcnQgYWZ0ZXIgaW4gdGhlIHRyZWVcclxuICAgICAqIEByZXR1cm5zIHtOb2RlfSAtIGB0aGlzTm9kZWAgdG8gYWxsb3cgZm9yIGNoYWluaW5nXHJcbiAgICAgKi9cclxuICAgIHN0YXRpYyBhZnRlcih0aGlzTm9kZSwgbmV3Tm9kZSkge1xyXG4gICAgICAgIHRoaXNOb2RlLnBhcmVudE5vZGUuaW5zZXJ0QmVmb3JlKG5ld05vZGUsIHRoaXNOb2RlLm5leHRTaWJsaW5nKTtcclxuICAgICAgICByZXR1cm4gdGhpc05vZGU7XHJcbiAgICB9XHJcblxyXG4gICAgLyoqXHJcbiAgICAgKiBHZXRzIHRoZSBuZXh0IHNpYmxpbmcgZWxlbWVudCB0aGF0IG1hdGNoZXMgdGhlIHNlbGVjdG9yLlxyXG4gICAgICogQHBhcmFtIHtFbGVtZW50fSBlbGVtZW50IC0gRWxlbWVudCB0byBnZXQgdGhlIG5leHQgc2libGluZyBvZlxyXG4gICAgICogQHBhcmFtIHtzdHJpbmd9IFtzZWxlY3Rvcj1cIlwiXSAtIE9wdGlvbmFsIHNlbGVjdG9yXHJcbiAgICAgKiBAcmV0dXJucyB7RWxlbWVudH0gLSBUaGUgc2libGluZyBlbGVtZW50XHJcbiAgICAgKi9cclxuICAgIHN0YXRpYyBuZXh0KGVsZW1lbnQsIHNlbGVjdG9yID0gXCJcIikge1xyXG4gICAgICAgIHJldHVybiBzZWxlY3RvciA/IGVsZW1lbnQucXVlcnlTZWxlY3RvcihcIisgXCIgKyBzZWxlY3RvcikgOiBlbGVtZW50Lm5leHRFbGVtZW50U2libGluZztcclxuICAgIH1cclxuXHJcbiAgICAvKipcclxuICAgICAqIEdldHMgYWxsIHN1YnNlcXVlbnQgc2libGluZ3MuXHJcbiAgICAgKiBAcGFyYW0ge0VsZW1lbnR9IGVsZW1lbnQgLSBFbGVtZW50IHRvIGdldCBuZXh0IHNpYmxpbmdzIG9mXHJcbiAgICAgKiBAcmV0dXJucyB7Tm9kZUxpc3R9IC0gVGhlIGxpc3Qgb2Ygc2libGluZ3NcclxuICAgICAqL1xyXG4gICAgc3RhdGljIG5leHRBbGwoZWxlbWVudCkge1xyXG4gICAgICAgIHJldHVybiBlbGVtZW50LnF1ZXJ5U2VsZWN0b3JBbGwoXCJ+ICpcIik7XHJcbiAgICB9XHJcblxyXG4gICAgLyoqXHJcbiAgICAgKiBHZXRzIHRoZSBzdWJzZXF1ZW50IHNpYmxpbmdzIHVudGlsIGFuIGVsZW1lbnQgbWF0Y2hlcyB0aGUgc2VsZWN0b3IuXHJcbiAgICAgKiBAcGFyYW0ge0VsZW1lbnR9IGVsZW1lbnQgLSBFbGVtZW50IHRvIGdldCB0aGUgZm9sbG93aW5nIHNpYmxpbmdzIG9mXHJcbiAgICAgKiBAcGFyYW0ge3N0cmluZ30gc2VsZWN0b3IgLSBTZWxlY3RvciB0byBzdG9wIGF0XHJcbiAgICAgKiBAcmV0dXJucyB7QXJyYXk8RWxlbWVudD59IC0gVGhlIGxpc3Qgb2Ygc2libGluZ3NcclxuICAgICAqL1xyXG4gICAgc3RhdGljIG5leHRVbnRpbChlbGVtZW50LCBzZWxlY3Rvcikge1xyXG4gICAgICAgIGNvbnN0IG5leHQgPSBbXTsgXHJcbiAgICAgICAgd2hpbGUgKGVsZW1lbnQubmV4dEVsZW1lbnRTaWJsaW5nICYmICFlbGVtZW50Lm5leHRFbGVtZW50U2libGluZy5tYXRjaGVzKHNlbGVjdG9yKSkgbmV4dC5wdXNoKGVsZW1lbnQgPSBlbGVtZW50Lm5leHRFbGVtZW50U2libGluZyk7XHJcbiAgICAgICAgcmV0dXJuIG5leHQ7XHJcbiAgICB9XHJcblxyXG4gICAgLyoqXHJcbiAgICAgKiBHZXRzIHRoZSBwcmV2aW91cyBzaWJsaW5nIGVsZW1lbnQgdGhhdCBtYXRjaGVzIHRoZSBzZWxlY3Rvci5cclxuICAgICAqIEBwYXJhbSB7RWxlbWVudH0gZWxlbWVudCAtIEVsZW1lbnQgdG8gZ2V0IHRoZSBwcmV2aW91cyBzaWJsaW5nIG9mXHJcbiAgICAgKiBAcGFyYW0ge3N0cmluZ30gW3NlbGVjdG9yPVwiXCJdIC0gT3B0aW9uYWwgc2VsZWN0b3JcclxuICAgICAqIEByZXR1cm5zIHtFbGVtZW50fSAtIFRoZSBzaWJsaW5nIGVsZW1lbnRcclxuICAgICAqL1xyXG4gICAgc3RhdGljIHByZXZpb3VzKGVsZW1lbnQsIHNlbGVjdG9yID0gXCJcIikge1xyXG4gICAgICAgIGNvbnN0IHByZXZpb3VzID0gZWxlbWVudC5wcmV2aW91c0VsZW1lbnRTaWJsaW5nO1xyXG4gICAgICAgIGlmIChzZWxlY3RvcikgcmV0dXJuIHByZXZpb3VzICYmIHByZXZpb3VzLm1hdGNoZXMoc2VsZWN0b3IpID8gcHJldmlvdXMgOiBudWxsO1xyXG4gICAgICAgIHJldHVybiBwcmV2aW91cztcclxuICAgIH1cclxuXHJcbiAgICAvKipcclxuICAgICAqIEdldHMgYWxsIHByZWNlZWRpbmcgc2libGluZ3MuXHJcbiAgICAgKiBAcGFyYW0ge0VsZW1lbnR9IGVsZW1lbnQgLSBFbGVtZW50IHRvIGdldCBwcmVjZWVkaW5nIHNpYmxpbmdzIG9mXHJcbiAgICAgKiBAcmV0dXJucyB7Tm9kZUxpc3R9IC0gVGhlIGxpc3Qgb2Ygc2libGluZ3NcclxuICAgICAqL1xyXG4gICAgc3RhdGljIHByZXZpb3VzQWxsKGVsZW1lbnQpIHtcclxuICAgICAgICBjb25zdCBwcmV2aW91cyA9IFtdO1xyXG4gICAgICAgIHdoaWxlIChlbGVtZW50LnByZXZpb3VzRWxlbWVudFNpYmxpbmcpIHByZXZpb3VzLnB1c2goZWxlbWVudCA9IGVsZW1lbnQucHJldmlvdXNFbGVtZW50U2libGluZyk7XHJcbiAgICAgICAgcmV0dXJuIHByZXZpb3VzO1xyXG4gICAgfVxyXG5cclxuICAgIC8qKlxyXG4gICAgICogR2V0cyB0aGUgcHJlY2VlZGluZyBzaWJsaW5ncyB1bnRpbCBhbiBlbGVtZW50IG1hdGNoZXMgdGhlIHNlbGVjdG9yLlxyXG4gICAgICogQHBhcmFtIHtFbGVtZW50fSBlbGVtZW50IC0gRWxlbWVudCB0byBnZXQgdGhlIHByZWNlZWRpbmcgc2libGluZ3Mgb2ZcclxuICAgICAqIEBwYXJhbSB7c3RyaW5nfSBzZWxlY3RvciAtIFNlbGVjdG9yIHRvIHN0b3AgYXRcclxuICAgICAqIEByZXR1cm5zIHtBcnJheTxFbGVtZW50Pn0gLSBUaGUgbGlzdCBvZiBzaWJsaW5nc1xyXG4gICAgICovXHJcbiAgICBzdGF0aWMgcHJldmlvdXNVbnRpbChlbGVtZW50LCBzZWxlY3Rvcikge1xyXG4gICAgICAgIGNvbnN0IHByZXZpb3VzID0gW107IFxyXG4gICAgICAgIHdoaWxlIChlbGVtZW50LnByZXZpb3VzRWxlbWVudFNpYmxpbmcgJiYgIWVsZW1lbnQucHJldmlvdXNFbGVtZW50U2libGluZy5tYXRjaGVzKHNlbGVjdG9yKSkgcHJldmlvdXMucHVzaChlbGVtZW50ID0gZWxlbWVudC5wcmV2aW91c0VsZW1lbnRTaWJsaW5nKTtcclxuICAgICAgICByZXR1cm4gcHJldmlvdXM7XHJcbiAgICB9XHJcblxyXG4gICAgLyoqXHJcbiAgICAgKiBGaW5kIHdoaWNoIGluZGV4IGluIGNoaWxkcmVuIGEgY2VydGFpbiBub2RlIGlzLiBTaW1pbGFyIHRvIGpRdWVyeSdzIGAkLmluZGV4KClgXHJcbiAgICAgKiBAcGFyYW0ge0hUTUxFbGVtZW50fSBub2RlIC0gVGhlIG5vZGUgdG8gZmluZCBpdHMgaW5kZXggaW4gcGFyZW50XHJcbiAgICAgKiBAcmV0dXJucyB7bnVtYmVyfSBJbmRleCBvZiB0aGUgbm9kZVxyXG4gICAgICovXHJcbiAgICBzdGF0aWMgaW5kZXhJblBhcmVudChub2RlKSB7XHJcbiAgICAgICAgY29uc3QgY2hpbGRyZW4gPSBub2RlLnBhcmVudE5vZGUuY2hpbGROb2RlcztcclxuICAgICAgICBsZXQgbnVtID0gMDtcclxuICAgICAgICBmb3IgKGxldCBpID0gMDsgaSA8IGNoaWxkcmVuLmxlbmd0aDsgaSsrKSB7XHJcbiAgICAgICAgICAgIGlmIChjaGlsZHJlbltpXSA9PSBub2RlKSByZXR1cm4gbnVtO1xyXG4gICAgICAgICAgICBpZiAoY2hpbGRyZW5baV0ubm9kZVR5cGUgPT0gMSkgbnVtKys7XHJcbiAgICAgICAgfVxyXG4gICAgICAgIHJldHVybiAtMTtcclxuICAgIH1cclxuXHJcbiAgICAvKiogU2hvcnRoYW5kIGZvciB7QGxpbmsgbW9kdWxlOkRPTVRvb2xzLmluZGV4SW5QYXJlbnR9ICovXHJcbiAgICBzdGF0aWMgaW5kZXgobm9kZSkge3JldHVybiB0aGlzLmluZGV4SW5QYXJlbnQobm9kZSk7fVxyXG5cclxuICAgIC8qKlxyXG4gICAgICogR2V0cyB0aGUgcGFyZW50IG9mIHRoZSBlbGVtZW50IGlmIGl0IG1hdGNoZXMgdGhlIHNlbGVjdG9yLFxyXG4gICAgICogb3RoZXJ3aXNlIHJldHVybnMgbnVsbC5cclxuICAgICAqIEBwYXJhbSB7RWxlbWVudH0gZWxlbWVudCAtIEVsZW1lbnQgdG8gZ2V0IHBhcmVudCBvZlxyXG4gICAgICogQHBhcmFtIHtzdHJpbmd9IFtzZWxlY3Rvcj1cIlwiXSAtIFNlbGVjdG9yIHRvIG1hdGNoIHBhcmVudFxyXG4gICAgICogQHJldHVybnMgeyhFbGVtZW50fG51bGwpfSAtIFRoZSBzaWJsaW5nIGVsZW1lbnQgb3IgbnVsbFxyXG4gICAgICovXHJcbiAgICBzdGF0aWMgcGFyZW50KGVsZW1lbnQsIHNlbGVjdG9yID0gXCJcIikge1xyXG4gICAgICAgIHJldHVybiAhc2VsZWN0b3IgfHwgZWxlbWVudC5wYXJlbnRFbGVtZW50Lm1hdGNoZXMoc2VsZWN0b3IpID8gZWxlbWVudC5wYXJlbnRFbGVtZW50IDogbnVsbDtcclxuICAgIH1cclxuXHJcbiAgICAvKipcclxuICAgICAqIEdldHMgYWxsIGNoaWxkcmVuIG9mIEVsZW1lbnQgdGhhdCBtYXRjaCB0aGUgc2VsZWN0b3IgaWYgcHJvdmlkZWQuXHJcbiAgICAgKiBAcGFyYW0ge0VsZW1lbnR9IGVsZW1lbnQgLSBFbGVtZW50IHRvIGdldCBhbGwgY2hpbGRyZW4gb2ZcclxuICAgICAqIEBwYXJhbSB7c3RyaW5nfSBzZWxlY3RvciAtIFNlbGVjdG9yIHRvIG1hdGNoIHRoZSBjaGlsZHJlbiB0b1xyXG4gICAgICogQHJldHVybnMge0FycmF5PEVsZW1lbnQ+fSAtIFRoZSBsaXN0IG9mIGNoaWxkcmVuXHJcbiAgICAgKi9cclxuICAgIHN0YXRpYyBmaW5kQ2hpbGQoZWxlbWVudCwgc2VsZWN0b3IpIHtcclxuICAgICAgICByZXR1cm4gZWxlbWVudC5xdWVyeVNlbGVjdG9yKFwiOnNjb3BlID4gXCIgKyBzZWxlY3Rvcik7XHJcbiAgICB9XHJcblxyXG4gICAgLyoqXHJcbiAgICAgKiBHZXRzIGFsbCBjaGlsZHJlbiBvZiBFbGVtZW50IHRoYXQgbWF0Y2ggdGhlIHNlbGVjdG9yIGlmIHByb3ZpZGVkLlxyXG4gICAgICogQHBhcmFtIHtFbGVtZW50fSBlbGVtZW50IC0gRWxlbWVudCB0byBnZXQgYWxsIGNoaWxkcmVuIG9mXHJcbiAgICAgKiBAcGFyYW0ge3N0cmluZ30gc2VsZWN0b3IgLSBTZWxlY3RvciB0byBtYXRjaCB0aGUgY2hpbGRyZW4gdG9cclxuICAgICAqIEByZXR1cm5zIHtBcnJheTxFbGVtZW50Pn0gLSBUaGUgbGlzdCBvZiBjaGlsZHJlblxyXG4gICAgICovXHJcbiAgICBzdGF0aWMgZmluZENoaWxkcmVuKGVsZW1lbnQsIHNlbGVjdG9yKSB7XHJcbiAgICAgICAgcmV0dXJuIGVsZW1lbnQucXVlcnlTZWxlY3RvckFsbChcIjpzY29wZSA+IFwiICsgc2VsZWN0b3IpO1xyXG4gICAgfVxyXG5cclxuICAgIC8qKlxyXG4gICAgICogR2V0cyBhbGwgYW5jZXN0b3JzIG9mIEVsZW1lbnQgdGhhdCBtYXRjaCB0aGUgc2VsZWN0b3IgaWYgcHJvdmlkZWQuXHJcbiAgICAgKiBAcGFyYW0ge0VsZW1lbnR9IGVsZW1lbnQgLSBFbGVtZW50IHRvIGdldCBhbGwgcGFyZW50cyBvZlxyXG4gICAgICogQHBhcmFtIHtzdHJpbmd9IFtzZWxlY3Rvcj1cIlwiXSAtIFNlbGVjdG9yIHRvIG1hdGNoIHRoZSBwYXJlbnRzIHRvXHJcbiAgICAgKiBAcmV0dXJucyB7QXJyYXk8RWxlbWVudD59IC0gVGhlIGxpc3Qgb2YgcGFyZW50c1xyXG4gICAgICovXHJcbiAgICBzdGF0aWMgcGFyZW50cyhlbGVtZW50LCBzZWxlY3RvciA9IFwiXCIpIHtcclxuICAgICAgICBjb25zdCBwYXJlbnRzID0gW107XHJcbiAgICAgICAgaWYgKHNlbGVjdG9yKSB3aGlsZSAoZWxlbWVudC5wYXJlbnRFbGVtZW50ICYmIGVsZW1lbnQucGFyZW50RWxlbWVudC5jbG9zZXN0KHNlbGVjdG9yKSkgcGFyZW50cy5wdXNoKGVsZW1lbnQgPSBlbGVtZW50LnBhcmVudEVsZW1lbnQuY2xvc2VzdChzZWxlY3RvcikpO1xyXG4gICAgICAgIGVsc2Ugd2hpbGUgKGVsZW1lbnQucGFyZW50RWxlbWVudCkgcGFyZW50cy5wdXNoKGVsZW1lbnQgPSBlbGVtZW50LnBhcmVudEVsZW1lbnQpO1xyXG4gICAgICAgIHJldHVybiBwYXJlbnRzO1xyXG4gICAgfVxyXG5cclxuICAgIC8qKlxyXG4gICAgICogR2V0cyB0aGUgYW5jZXN0b3JzIHVudGlsIGFuIGVsZW1lbnQgbWF0Y2hlcyB0aGUgc2VsZWN0b3IuXHJcbiAgICAgKiBAcGFyYW0ge0VsZW1lbnR9IGVsZW1lbnQgLSBFbGVtZW50IHRvIGdldCB0aGUgYW5jZXN0b3JzIG9mXHJcbiAgICAgKiBAcGFyYW0ge3N0cmluZ30gc2VsZWN0b3IgLSBTZWxlY3RvciB0byBzdG9wIGF0XHJcbiAgICAgKiBAcmV0dXJucyB7QXJyYXk8RWxlbWVudD59IC0gVGhlIGxpc3Qgb2YgcGFyZW50c1xyXG4gICAgICovXHJcbiAgICBzdGF0aWMgcGFyZW50c1VudGlsKGVsZW1lbnQsIHNlbGVjdG9yKSB7XHJcbiAgICAgICAgY29uc3QgcGFyZW50cyA9IFtdO1xyXG4gICAgICAgIHdoaWxlIChlbGVtZW50LnBhcmVudEVsZW1lbnQgJiYgIWVsZW1lbnQucGFyZW50RWxlbWVudC5tYXRjaGVzKHNlbGVjdG9yKSkgcGFyZW50cy5wdXNoKGVsZW1lbnQgPSBlbGVtZW50LnBhcmVudEVsZW1lbnQpO1xyXG4gICAgICAgIHJldHVybiBwYXJlbnRzO1xyXG4gICAgfVxyXG5cclxuICAgIC8qKlxyXG4gICAgICogR2V0cyBhbGwgc2libGluZ3Mgb2YgdGhlIGVsZW1lbnQgdGhhdCBtYXRjaCB0aGUgc2VsZWN0b3IuXHJcbiAgICAgKiBAcGFyYW0ge0VsZW1lbnR9IGVsZW1lbnQgLSBFbGVtZW50IHRvIGdldCBhbGwgc2libGluZ3Mgb2ZcclxuICAgICAqIEBwYXJhbSB7c3RyaW5nfSBbc2VsZWN0b3I9XCIqXCJdIC0gU2VsZWN0b3IgdG8gbWF0Y2ggdGhlIHNpYmxpbmdzIHRvXHJcbiAgICAgKiBAcmV0dXJucyB7QXJyYXk8RWxlbWVudD59IC0gVGhlIGxpc3Qgb2Ygc2libGluZ3NcclxuICAgICAqL1xyXG4gICAgc3RhdGljIHNpYmxpbmdzKGVsZW1lbnQsIHNlbGVjdG9yID0gXCIqXCIpIHtcclxuICAgICAgICByZXR1cm4gQXJyYXkuZnJvbShlbGVtZW50LnBhcmVudEVsZW1lbnQuY2hpbGRyZW4pLmZpbHRlcihlID0+IGUgIT0gZWxlbWVudCAmJiBlLm1hdGNoZXMoc2VsZWN0b3IpKTtcclxuICAgIH1cclxuXHJcbiAgICAvKipcclxuICAgICAqIFNldHMgb3IgZ2V0cyBjc3Mgc3R5bGVzIGZvciBhIHNwZWNpZmljIGVsZW1lbnQuIElmIGB2YWx1ZWAgaXMgcHJvdmlkZWRcclxuICAgICAqIHRoZW4gaXQgc2V0cyB0aGUgc3R5bGUgYW5kIHJldHVybnMgdGhlIGVsZW1lbnQgdG8gYWxsb3cgZm9yIGNoYWluaW5nLFxyXG4gICAgICogb3RoZXJ3aXNlIHJldHVybnMgdGhlIHN0eWxlLiAgXHJcbiAgICAgKiBAcGFyYW0ge0VsZW1lbnR9IGVsZW1lbnQgLSBFbGVtZW50IHRvIHNldCB0aGUgQ1NTIG9mXHJcbiAgICAgKiBAcGFyYW0ge3N0cmluZ30gYXR0cmlidXRlIC0gQXR0cmlidXRlIHRvIGdldCBvciBzZXRcclxuICAgICAqIEBwYXJhbSB7c3RyaW5nfSBbdmFsdWVdIC0gVmFsdWUgdG8gc2V0IGZvciBhdHRyaWJ1dGVcclxuICAgICAqIEByZXR1cm5zIHtFbGVtZW50fHN0cmluZ30gLSBXaGVuIHNldHRpbmcgYSB2YWx1ZSwgZWxlbWVudCBpcyByZXR1cm5lZCBmb3IgY2hhaW5pbmcsIG90aGVyd2lzZSB0aGUgdmFsdWUgaXMgcmV0dXJuZWQuXHJcbiAgICAgKi9cclxuICAgIHN0YXRpYyBjc3MoZWxlbWVudCwgYXR0cmlidXRlLCB2YWx1ZSkge1xyXG4gICAgICAgIGlmICh0eXBlb2YodmFsdWUpID09IFwidW5kZWZpbmVkXCIpIHJldHVybiBnbG9iYWwuZ2V0Q29tcHV0ZWRTdHlsZShlbGVtZW50KVthdHRyaWJ1dGVdO1xyXG4gICAgICAgIGVsZW1lbnQuc3R5bGVbYXR0cmlidXRlXSA9IHZhbHVlO1xyXG4gICAgICAgIHJldHVybiBlbGVtZW50O1xyXG4gICAgfVxyXG5cclxuICAgIC8qKlxyXG4gICAgICogU2V0cyBvciBnZXRzIHRoZSB3aWR0aCBmb3IgYSBzcGVjaWZpYyBlbGVtZW50LiBJZiBgdmFsdWVgIGlzIHByb3ZpZGVkXHJcbiAgICAgKiB0aGVuIGl0IHNldHMgdGhlIHdpZHRoIGFuZCByZXR1cm5zIHRoZSBlbGVtZW50IHRvIGFsbG93IGZvciBjaGFpbmluZyxcclxuICAgICAqIG90aGVyd2lzZSByZXR1cm5zIHRoZSB3aWR0aC4gIFxyXG4gICAgICogQHBhcmFtIHtFbGVtZW50fSBlbGVtZW50IC0gRWxlbWVudCB0byBzZXQgdGhlIENTUyBvZlxyXG4gICAgICogQHBhcmFtIHtzdHJpbmd9IFt2YWx1ZV0gLSBXaWR0aCB0byBzZXRcclxuICAgICAqIEByZXR1cm5zIHtFbGVtZW50fHN0cmluZ30gLSBXaGVuIHNldHRpbmcgYSB2YWx1ZSwgZWxlbWVudCBpcyByZXR1cm5lZCBmb3IgY2hhaW5pbmcsIG90aGVyd2lzZSB0aGUgdmFsdWUgaXMgcmV0dXJuZWQuXHJcbiAgICAgKi9cclxuICAgIHN0YXRpYyB3aWR0aChlbGVtZW50LCB2YWx1ZSkge1xyXG4gICAgICAgIGlmICh0eXBlb2YodmFsdWUpID09IFwidW5kZWZpbmVkXCIpIHJldHVybiBwYXJzZUludChnZXRDb21wdXRlZFN0eWxlKGVsZW1lbnQpLndpZHRoKTtcclxuICAgICAgICBlbGVtZW50LnN0eWxlLndpZHRoID0gdmFsdWU7XHJcbiAgICAgICAgcmV0dXJuIGVsZW1lbnQ7XHJcbiAgICB9XHJcblxyXG4gICAgLyoqXHJcbiAgICAgKiBTZXRzIG9yIGdldHMgdGhlIGhlaWdodCBmb3IgYSBzcGVjaWZpYyBlbGVtZW50LiBJZiBgdmFsdWVgIGlzIHByb3ZpZGVkXHJcbiAgICAgKiB0aGVuIGl0IHNldHMgdGhlIGhlaWdodCBhbmQgcmV0dXJucyB0aGUgZWxlbWVudCB0byBhbGxvdyBmb3IgY2hhaW5pbmcsXHJcbiAgICAgKiBvdGhlcndpc2UgcmV0dXJucyB0aGUgaGVpZ2h0LiAgXHJcbiAgICAgKiBAcGFyYW0ge0VsZW1lbnR9IGVsZW1lbnQgLSBFbGVtZW50IHRvIHNldCB0aGUgQ1NTIG9mXHJcbiAgICAgKiBAcGFyYW0ge3N0cmluZ30gW3ZhbHVlXSAtIEhlaWdodCB0byBzZXRcclxuICAgICAqIEByZXR1cm5zIHtFbGVtZW50fHN0cmluZ30gLSBXaGVuIHNldHRpbmcgYSB2YWx1ZSwgZWxlbWVudCBpcyByZXR1cm5lZCBmb3IgY2hhaW5pbmcsIG90aGVyd2lzZSB0aGUgdmFsdWUgaXMgcmV0dXJuZWQuXHJcbiAgICAgKi9cclxuICAgIHN0YXRpYyBoZWlnaHQoZWxlbWVudCwgdmFsdWUpIHtcclxuICAgICAgICBpZiAodHlwZW9mKHZhbHVlKSA9PSBcInVuZGVmaW5lZFwiKSByZXR1cm4gcGFyc2VJbnQoZ2V0Q29tcHV0ZWRTdHlsZShlbGVtZW50KS5oZWlnaHQpO1xyXG4gICAgICAgIGVsZW1lbnQuc3R5bGUuaGVpZ2h0ID0gdmFsdWU7XHJcbiAgICAgICAgcmV0dXJuIGVsZW1lbnQ7XHJcbiAgICB9XHJcblxyXG4gICAgLyoqXHJcbiAgICAgKiBTZXRzIHRoZSBpbm5lciB0ZXh0IG9mIGFuIGVsZW1lbnQgaWYgZ2l2ZW4gYSB2YWx1ZSwgb3RoZXJ3aXNlIHJldHVybnMgaXQuXHJcbiAgICAgKiBAcGFyYW0ge0VsZW1lbnR9IGVsZW1lbnQgLSBFbGVtZW50IHRvIHNldCB0aGUgdGV4dCBvZlxyXG4gICAgICogQHBhcmFtIHtzdHJpbmd9IFt0ZXh0XSAtIENvbnRlbnQgdG8gc2V0XHJcbiAgICAgKiBAcmV0dXJucyB7c3RyaW5nfSAtIEVpdGhlciB0aGUgc3RyaW5nIHNldCBieSB0aGlzIGNhbGwgb3IgdGhlIGN1cnJlbnQgdGV4dCBjb250ZW50IG9mIHRoZSBub2RlLlxyXG4gICAgICovXHJcbiAgICBzdGF0aWMgdGV4dChlbGVtZW50LCB0ZXh0KSB7XHJcbiAgICAgICAgaWYgKHR5cGVvZih0ZXh0KSA9PSBcInVuZGVmaW5lZFwiKSByZXR1cm4gZWxlbWVudC50ZXh0Q29udGVudDtcclxuICAgICAgICByZXR1cm4gZWxlbWVudC50ZXh0Q29udGVudCA9IHRleHQ7XHJcbiAgICB9XHJcblxyXG4gICAgLyoqXHJcbiAgICAgKiBSZXR1cm5zIHRoZSBpbm5lcldpZHRoIG9mIHRoZSBlbGVtZW50LlxyXG4gICAgICogQHBhcmFtIHtFbGVtZW50fSBlbGVtZW50IC0gRWxlbWVudCB0byByZXRyaWV2ZSBpbm5lciB3aWR0aCBvZlxyXG4gICAgICogQHJldHVybiB7bnVtYmVyfSAtIFRoZSBpbm5lciB3aWR0aCBvZiB0aGUgZWxlbWVudC5cclxuICAgICAqL1xyXG4gICAgc3RhdGljIGlubmVyV2lkdGgoZWxlbWVudCkge1xyXG4gICAgICAgIHJldHVybiBlbGVtZW50LmNsaWVudFdpZHRoO1xyXG4gICAgfVxyXG5cclxuICAgIC8qKlxyXG4gICAgICogUmV0dXJucyB0aGUgaW5uZXJIZWlnaHQgb2YgdGhlIGVsZW1lbnQuXHJcbiAgICAgKiBAcGFyYW0ge0VsZW1lbnR9IGVsZW1lbnQgLSBFbGVtZW50IHRvIHJldHJpZXZlIGlubmVyIGhlaWdodCBvZlxyXG4gICAgICogQHJldHVybiB7bnVtYmVyfSAtIFRoZSBpbm5lciBoZWlnaHQgb2YgdGhlIGVsZW1lbnQuXHJcbiAgICAgKi9cclxuICAgIHN0YXRpYyBpbm5lckhlaWdodChlbGVtZW50KSB7XHJcbiAgICAgICAgcmV0dXJuIGVsZW1lbnQuY2xpZW50SGVpZ2h0O1xyXG4gICAgfVxyXG5cclxuICAgIC8qKlxyXG4gICAgICogUmV0dXJucyB0aGUgb3V0ZXJXaWR0aCBvZiB0aGUgZWxlbWVudC5cclxuICAgICAqIEBwYXJhbSB7RWxlbWVudH0gZWxlbWVudCAtIEVsZW1lbnQgdG8gcmV0cmlldmUgb3V0ZXIgd2lkdGggb2ZcclxuICAgICAqIEByZXR1cm4ge251bWJlcn0gLSBUaGUgb3V0ZXIgd2lkdGggb2YgdGhlIGVsZW1lbnQuXHJcbiAgICAgKi9cclxuICAgIHN0YXRpYyBvdXRlcldpZHRoKGVsZW1lbnQpIHtcclxuICAgICAgICByZXR1cm4gZWxlbWVudC5vZmZzZXRXaWR0aDtcclxuICAgIH1cclxuXHJcbiAgICAvKipcclxuICAgICAqIFJldHVybnMgdGhlIG91dGVySGVpZ2h0IG9mIHRoZSBlbGVtZW50LlxyXG4gICAgICogQHBhcmFtIHtFbGVtZW50fSBlbGVtZW50IC0gRWxlbWVudCB0byByZXRyaWV2ZSBvdXRlciBoZWlnaHQgb2ZcclxuICAgICAqIEByZXR1cm4ge251bWJlcn0gLSBUaGUgb3V0ZXIgaGVpZ2h0IG9mIHRoZSBlbGVtZW50LlxyXG4gICAgICovXHJcbiAgICBzdGF0aWMgb3V0ZXJIZWlnaHQoZWxlbWVudCkge1xyXG4gICAgICAgIHJldHVybiBlbGVtZW50Lm9mZnNldEhlaWdodDtcclxuICAgIH1cclxuXHJcbiAgICAvKipcclxuICAgICAqIEdldHMgdGhlIG9mZnNldCBvZiB0aGUgZWxlbWVudCBpbiB0aGUgcGFnZS5cclxuICAgICAqIEBwYXJhbSB7RWxlbWVudH0gZWxlbWVudCAtIEVsZW1lbnQgdG8gZ2V0IG9mZnNldCBvZlxyXG4gICAgICogQHJldHVybiB7T2Zmc2V0fSAtIFRoZSBvZmZzZXQgb2YgdGhlIGVsZW1lbnRcclxuICAgICAqL1xyXG4gICAgc3RhdGljIG9mZnNldChlbGVtZW50KSB7XHJcbiAgICAgICAgcmV0dXJuIGVsZW1lbnQuZ2V0Qm91bmRpbmdDbGllbnRSZWN0KCk7XHJcbiAgICB9XHJcblxyXG4gICAgc3RhdGljIGdldCBsaXN0ZW5lcnMoKSB7IHJldHVybiB0aGlzLl9saXN0ZW5lcnMgfHwgKHRoaXMuX2xpc3RlbmVycyA9IHt9KTsgfVxyXG5cclxuICAgIC8qKlxyXG4gICAgICogVGhpcyBpcyBzaW1pbGFyIHRvIGpRdWVyeSdzIGBvbmAgZnVuY3Rpb24gYW5kIGNhbiAqaG9wZWZ1bGx5KiBiZSB1c2VkIGluIHRoZSBzYW1lIHdheS5cclxuICAgICAqIFxyXG4gICAgICogUmF0aGVyIHRoYW4gYXR0ZW1wdCB0byBleHBsYWluLCBJJ2xsIHNob3cgc29tZSBleGFtcGxlIHVzYWdlcy5cclxuICAgICAqIFxyXG4gICAgICogVGhlIGZvbGxvd2luZyB3aWxsIGFkZCBhIGNsaWNrIGxpc3RlbmVyIChpbiB0aGUgYG15UGx1Z2luYCBuYW1lc3BhY2UpIHRvIGBlbGVtZW50YC5cclxuICAgICAqIGBET01Ub29scy5vbihlbGVtZW50LCBcImNsaWNrLm15UGx1Z2luXCIsICgpID0+IHtjb25zb2xlLmxvZyhcImNsaWNrZWQhXCIpO30pO2BcclxuICAgICAqIFxyXG4gICAgICogVGhlIGZvbGxvd2luZyB3aWxsIGFkZCBhIGNsaWNrIGxpc3RlbmVyIChpbiB0aGUgYG15UGx1Z2luYCBuYW1lc3BhY2UpIHRvIGBlbGVtZW50YCB0aGF0IG9ubHkgZmlyZXMgd2hlbiB0aGUgdGFyZ2V0IGlzIGEgYC5ibG9ja2AgZWxlbWVudC5cclxuICAgICAqIGBET01Ub29scy5vbihlbGVtZW50LCBcImNsaWNrLm15UGx1Z2luXCIsIFwiLmJsb2NrXCIsICgpID0+IHtjb25zb2xlLmxvZyhcImNsaWNrZWQhXCIpO30pO2BcclxuICAgICAqIFxyXG4gICAgICogVGhlIGZvbGxvd2luZyB3aWxsIGFkZCBhIGNsaWNrIGxpc3RlbmVyICh3aXRob3V0IG5hbWVzcGFjZSkgdG8gYGVsZW1lbnRgLlxyXG4gICAgICogYERPTVRvb2xzLm9uKGVsZW1lbnQsIFwiY2xpY2tcIiwgKCkgPT4ge2NvbnNvbGUubG9nKFwiY2xpY2tlZCFcIik7fSk7YFxyXG4gICAgICogXHJcbiAgICAgKiBUaGUgZm9sbG93aW5nIHdpbGwgYWRkIGEgY2xpY2sgbGlzdGVuZXIgKHdpdGhvdXQgbmFtZXNwYWNlKSB0byBgZWxlbWVudGAgdGhhdCBvbmx5IGZpcmVzIG9uY2UuXHJcbiAgICAgKiBgY29uc3QgY2FuY2VsID0gRE9NVG9vbHMub24oZWxlbWVudCwgXCJjbGlja1wiLCAoKSA9PiB7Y29uc29sZS5sb2coXCJmaXJlZCFcIik7IGNhbmNlbCgpO30pO2BcclxuICAgICAqIFxyXG4gICAgICogQHBhcmFtIHtFbGVtZW50fSBlbGVtZW50IC0gRWxlbWVudCB0byBhZGQgbGlzdGVuZXIgdG9cclxuICAgICAqIEBwYXJhbSB7c3RyaW5nfSBldmVudCAtIEV2ZW50IHRvIGxpc3RlbiB0byB3aXRoIG9wdGlvbiBuYW1lc3BhY2UgKGUuZy4gXCJldmVudC5uYW1lc3BhY2VcIilcclxuICAgICAqIEBwYXJhbSB7KHN0cmluZ3xjYWxsYWJsZSl9IGRlbGVnYXRlIC0gU2VsZWN0b3IgdG8gcnVuIG9uIGVsZW1lbnQgdG8gbGlzdGVuIHRvXHJcbiAgICAgKiBAcGFyYW0ge2NhbGxhYmxlfSBbY2FsbGJhY2tdIC0gRnVuY3Rpb24gdG8gZmlyZSBvbiBldmVudFxyXG4gICAgICogQHJldHVybnMge21vZHVsZTpET01Ub29sc35DYW5jZWxMaXN0ZW5lcn0gLSBBIGZ1bmN0aW9uIHRoYXQgd2lsbCB1bmRvIHRoZSBsaXN0ZW5lclxyXG4gICAgICovXHJcbiAgICBzdGF0aWMgb24oZWxlbWVudCwgZXZlbnQsIGRlbGVnYXRlLCBjYWxsYmFjaykge1xyXG4gICAgICAgIGNvbnN0IFt0eXBlLCBuYW1lc3BhY2VdID0gZXZlbnQuc3BsaXQoXCIuXCIpO1xyXG4gICAgICAgIGNvbnN0IGhhc0RlbGVnYXRlID0gZGVsZWdhdGUgJiYgY2FsbGJhY2s7XHJcbiAgICAgICAgaWYgKCFjYWxsYmFjaykgY2FsbGJhY2sgPSBkZWxlZ2F0ZTtcclxuICAgICAgICBjb25zdCBldmVudEZ1bmMgPSAhaGFzRGVsZWdhdGUgPyBjYWxsYmFjayA6IGZ1bmN0aW9uKGV2ZW50KSB7XHJcbiAgICAgICAgICAgIGlmIChldmVudC50YXJnZXQubWF0Y2hlcyhkZWxlZ2F0ZSkpIHtcclxuICAgICAgICAgICAgICAgIGNhbGxiYWNrKGV2ZW50KTtcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgIH07XHJcblxyXG4gICAgICAgIGVsZW1lbnQuYWRkRXZlbnRMaXN0ZW5lcih0eXBlLCBldmVudEZ1bmMpO1xyXG4gICAgICAgIGNvbnN0IGNhbmNlbCA9ICgpID0+IHtcclxuICAgICAgICAgICAgZWxlbWVudC5yZW1vdmVFdmVudExpc3RlbmVyKHR5cGUsIGV2ZW50RnVuYyk7XHJcbiAgICAgICAgfTtcclxuICAgICAgICBpZiAobmFtZXNwYWNlKSB7XHJcbiAgICAgICAgICAgIGlmICghdGhpcy5saXN0ZW5lcnNbbmFtZXNwYWNlXSkgdGhpcy5saXN0ZW5lcnNbbmFtZXNwYWNlXSA9IFtdO1xyXG4gICAgICAgICAgICBjb25zdCBuZXdDYW5jZWwgPSAoKSA9PiB7XHJcbiAgICAgICAgICAgICAgICBjYW5jZWwoKTtcclxuICAgICAgICAgICAgICAgIHRoaXMubGlzdGVuZXJzW25hbWVzcGFjZV0uc3BsaWNlKHRoaXMubGlzdGVuZXJzW25hbWVzcGFjZV0uZmluZEluZGV4KGwgPT4gbC5ldmVudCA9PSB0eXBlICYmIGwuZWxlbWVudCA9PSBlbGVtZW50KSwgMSk7XHJcbiAgICAgICAgICAgIH07XHJcbiAgICAgICAgICAgIHRoaXMubGlzdGVuZXJzW25hbWVzcGFjZV0ucHVzaCh7XHJcbiAgICAgICAgICAgICAgICBldmVudDogdHlwZSxcclxuICAgICAgICAgICAgICAgIGVsZW1lbnQ6IGVsZW1lbnQsXHJcbiAgICAgICAgICAgICAgICBjYW5jZWw6IG5ld0NhbmNlbFxyXG4gICAgICAgICAgICB9KTtcclxuICAgICAgICAgICAgcmV0dXJuIG5ld0NhbmNlbDtcclxuICAgICAgICB9XHJcbiAgICAgICAgcmV0dXJuIGNhbmNlbDtcclxuICAgIH1cclxuXHJcbiAgICAvKipcclxuICAgICAqIEZ1bmN0aW9uYWxpdHkgZm9yIHRoaXMgbWV0aG9kIG1hdGNoZXMge0BsaW5rIG1vZHVsZTpET01Ub29scy5vbn0gYnV0IGF1dG9tYXRpY2FsbHkgY2FuY2VscyBpdHNlbGZcclxuICAgICAqIGFuZCByZW1vdmVzIHRoZSBsaXN0ZW5lciB1cG9uIHRoZSBmaXJzdCBmaXJpbmcgb2YgdGhlIGRlc2lyZWQgZXZlbnQuXHJcbiAgICAgKiBcclxuICAgICAqIEBwYXJhbSB7RWxlbWVudH0gZWxlbWVudCAtIEVsZW1lbnQgdG8gYWRkIGxpc3RlbmVyIHRvXHJcbiAgICAgKiBAcGFyYW0ge3N0cmluZ30gZXZlbnQgLSBFdmVudCB0byBsaXN0ZW4gdG8gd2l0aCBvcHRpb24gbmFtZXNwYWNlIChlLmcuIFwiZXZlbnQubmFtZXNwYWNlXCIpXHJcbiAgICAgKiBAcGFyYW0geyhzdHJpbmd8Y2FsbGFibGUpfSBkZWxlZ2F0ZSAtIFNlbGVjdG9yIHRvIHJ1biBvbiBlbGVtZW50IHRvIGxpc3RlbiB0b1xyXG4gICAgICogQHBhcmFtIHtjYWxsYWJsZX0gW2NhbGxiYWNrXSAtIEZ1bmN0aW9uIHRvIGZpcmUgb24gZXZlbnRcclxuICAgICAqIEByZXR1cm5zIHttb2R1bGU6RE9NVG9vbHN+Q2FuY2VsTGlzdGVuZXJ9IC0gQSBmdW5jdGlvbiB0aGF0IHdpbGwgdW5kbyB0aGUgbGlzdGVuZXJcclxuICAgICAqL1xyXG4gICAgc3RhdGljIG9uY2UoZWxlbWVudCwgZXZlbnQsIGRlbGVnYXRlLCBjYWxsYmFjaykge1xyXG4gICAgICAgIGNvbnN0IFt0eXBlLCBuYW1lc3BhY2VdID0gZXZlbnQuc3BsaXQoXCIuXCIpO1xyXG4gICAgICAgIGNvbnN0IGhhc0RlbGVnYXRlID0gZGVsZWdhdGUgJiYgY2FsbGJhY2s7XHJcbiAgICAgICAgaWYgKCFjYWxsYmFjaykgY2FsbGJhY2sgPSBkZWxlZ2F0ZTtcclxuICAgICAgICBjb25zdCBldmVudEZ1bmMgPSAhaGFzRGVsZWdhdGUgPyBmdW5jdGlvbihldmVudCkge1xyXG4gICAgICAgICAgICBjYWxsYmFjayhldmVudCk7XHJcbiAgICAgICAgICAgIGVsZW1lbnQucmVtb3ZlRXZlbnRMaXN0ZW5lcih0eXBlLCBldmVudEZ1bmMpO1xyXG4gICAgICAgIH0gOiBmdW5jdGlvbihldmVudCkge1xyXG4gICAgICAgICAgICBpZiAoIWV2ZW50LnRhcmdldC5tYXRjaGVzKGRlbGVnYXRlKSkgcmV0dXJuO1xyXG4gICAgICAgICAgICBjYWxsYmFjayhldmVudCk7XHJcbiAgICAgICAgICAgIGVsZW1lbnQucmVtb3ZlRXZlbnRMaXN0ZW5lcih0eXBlLCBldmVudEZ1bmMpO1xyXG4gICAgICAgIH07XHJcblxyXG4gICAgICAgIGVsZW1lbnQuYWRkRXZlbnRMaXN0ZW5lcih0eXBlLCBldmVudEZ1bmMpO1xyXG4gICAgICAgIGNvbnN0IGNhbmNlbCA9ICgpID0+IHtcclxuICAgICAgICAgICAgZWxlbWVudC5yZW1vdmVFdmVudExpc3RlbmVyKHR5cGUsIGV2ZW50RnVuYyk7XHJcbiAgICAgICAgfTtcclxuICAgICAgICBpZiAobmFtZXNwYWNlKSB7XHJcbiAgICAgICAgICAgIGlmICghdGhpcy5saXN0ZW5lcnNbbmFtZXNwYWNlXSkgdGhpcy5saXN0ZW5lcnNbbmFtZXNwYWNlXSA9IFtdO1xyXG4gICAgICAgICAgICBjb25zdCBuZXdDYW5jZWwgPSAoKSA9PiB7XHJcbiAgICAgICAgICAgICAgICBjYW5jZWwoKTtcclxuICAgICAgICAgICAgICAgIHRoaXMubGlzdGVuZXJzW25hbWVzcGFjZV0uc3BsaWNlKHRoaXMubGlzdGVuZXJzW25hbWVzcGFjZV0uZmluZEluZGV4KGwgPT4gbC5ldmVudCA9PSB0eXBlICYmIGwuZWxlbWVudCA9PSBlbGVtZW50KSwgMSk7XHJcbiAgICAgICAgICAgIH07XHJcbiAgICAgICAgICAgIHRoaXMubGlzdGVuZXJzW25hbWVzcGFjZV0ucHVzaCh7XHJcbiAgICAgICAgICAgICAgICBldmVudDogdHlwZSxcclxuICAgICAgICAgICAgICAgIGVsZW1lbnQ6IGVsZW1lbnQsXHJcbiAgICAgICAgICAgICAgICBjYW5jZWw6IG5ld0NhbmNlbFxyXG4gICAgICAgICAgICB9KTtcclxuICAgICAgICAgICAgcmV0dXJuIG5ld0NhbmNlbDtcclxuICAgICAgICB9XHJcbiAgICAgICAgcmV0dXJuIGNhbmNlbDtcclxuICAgIH1cclxuXHJcbiAgICBzdGF0aWMgX19vZmZBbGwoZXZlbnQsIGVsZW1lbnQpIHtcclxuICAgICAgICBjb25zdCBbdHlwZSwgbmFtZXNwYWNlXSA9IGV2ZW50LnNwbGl0KFwiLlwiKTtcclxuICAgICAgICBsZXQgbWF0Y2hGaWx0ZXIgPSBsaXN0ZW5lciA9PiBsaXN0ZW5lci5ldmVudCA9PSB0eXBlLCBkZWZhdWx0RmlsdGVyID0gXyA9PiBfO1xyXG4gICAgICAgIGlmIChlbGVtZW50KSBtYXRjaEZpbHRlciA9IGwgPT4gbC5ldmVudCA9PSB0eXBlICYmIGwuZWxlbWVudCA9PSBlbGVtZW50LCBkZWZhdWx0RmlsdGVyID0gbCA9PiBsLmVsZW1lbnQgPT0gZWxlbWVudDtcclxuICAgICAgICBjb25zdCBsaXN0ZW5lcnMgPSB0aGlzLmxpc3RlbmVyc1tuYW1lc3BhY2VdIHx8IFtdO1xyXG4gICAgICAgIGNvbnN0IGxpc3QgPSB0eXBlID8gbGlzdGVuZXJzLmZpbHRlcihtYXRjaEZpbHRlcikgOiBsaXN0ZW5lcnMuZmlsdGVyKGRlZmF1bHRGaWx0ZXIpO1xyXG4gICAgICAgIGZvciAobGV0IGMgPSAwOyBjIDwgbGlzdC5sZW5ndGg7IGMrKykgbGlzdFtjXS5jYW5jZWwoKTtcclxuICAgIH1cclxuICAgIFxyXG4gICAgLyoqXHJcbiAgICAgKiBUaGlzIGlzIHNpbWlsYXIgdG8galF1ZXJ5J3MgYG9mZmAgZnVuY3Rpb24gYW5kIGNhbiAqaG9wZWZ1bGx5KiBiZSB1c2VkIGluIHRoZSBzYW1lIHdheS5cclxuICAgICAqIFxyXG4gICAgICogUmF0aGVyIHRoYW4gYXR0ZW1wdCB0byBleHBsYWluLCBJJ2xsIHNob3cgc29tZSBleGFtcGxlIHVzYWdlcy5cclxuICAgICAqIFxyXG4gICAgICogVGhlIGZvbGxvd2luZyB3aWxsIHJlbW92ZSBhIGNsaWNrIGxpc3RlbmVyIGNhbGxlZCBgb25DbGlja2AgKGluIHRoZSBgbXlQbHVnaW5gIG5hbWVzcGFjZSkgZnJvbSBgZWxlbWVudGAuXHJcbiAgICAgKiBgRE9NVG9vbHMub2ZmKGVsZW1lbnQsIFwiY2xpY2subXlQbHVnaW5cIiwgb25DbGljayk7YFxyXG4gICAgICogXHJcbiAgICAgKiBUaGUgZm9sbG93aW5nIHdpbGwgcmVtb3ZlIGEgY2xpY2sgbGlzdGVuZXIgY2FsbGVkIGBvbkNsaWNrYCAoaW4gdGhlIGBteVBsdWdpbmAgbmFtZXNwYWNlKSBmcm9tIGBlbGVtZW50YCB0aGF0IG9ubHkgZmlyZWQgd2hlbiB0aGUgdGFyZ2V0IGlzIGEgYC5ibG9ja2AgZWxlbWVudC5cclxuICAgICAqIGBET01Ub29scy5vZmYoZWxlbWVudCwgXCJjbGljay5teVBsdWdpblwiLCBcIi5ibG9ja1wiLCBvbkNsaWNrKTtgXHJcbiAgICAgKiBcclxuICAgICAqIFRoZSBmb2xsb3dpbmcgd2lsbCByZW1vdmUgYSBjbGljayBsaXN0ZW5lciAod2l0aG91dCBuYW1lc3BhY2UpIGZyb20gYGVsZW1lbnRgLlxyXG4gICAgICogYERPTVRvb2xzLm9mZihlbGVtZW50LCBcImNsaWNrXCIsIG9uQ2xpY2spO2BcclxuICAgICAqIFxyXG4gICAgICogVGhlIGZvbGxvd2luZyB3aWxsIHJlbW92ZSBhbGwgbGlzdGVuZXJzIGluIG5hbWVzcGFjZSBgbXlQbHVnaW5gIGZyb20gYGVsZW1lbnRgLlxyXG4gICAgICogYERPTVRvb2xzLm9mZihlbGVtZW50LCBcIi5teVBsdWdpblwiKTtgXHJcbiAgICAgKiBcclxuICAgICAqIFRoZSBmb2xsb3dpbmcgd2lsbCByZW1vdmUgYWxsIGNsaWNrIGxpc3RlbmVycyBpbiBuYW1lc3BhY2UgYG15UGx1Z2luYCBmcm9tICphbGwgZWxlbWVudHMqLlxyXG4gICAgICogYERPTVRvb2xzLm9mZihcImNsaWNrLm15UGx1Z2luXCIpO2BcclxuICAgICAqIFxyXG4gICAgICogVGhlIGZvbGxvd2luZyB3aWxsIHJlbW92ZSBhbGwgbGlzdGVuZXJzIGluIG5hbWVzcGFjZSBgbXlQbHVnaW5gIGZyb20gKmFsbCBlbGVtZW50cyouXHJcbiAgICAgKiBgRE9NVG9vbHMub2ZmKFwiLm15UGx1Z2luXCIpO2BcclxuICAgICAqIFxyXG4gICAgICogQHBhcmFtIHsoRWxlbWVudHxzdHJpbmcpfSBlbGVtZW50IC0gRWxlbWVudCB0byByZW1vdmUgbGlzdGVuZXIgZnJvbVxyXG4gICAgICogQHBhcmFtIHtzdHJpbmd9IFtldmVudF0gLSBFdmVudCB0byBsaXN0ZW4gdG8gd2l0aCBvcHRpb24gbmFtZXNwYWNlIChlLmcuIFwiZXZlbnQubmFtZXNwYWNlXCIpXHJcbiAgICAgKiBAcGFyYW0geyhzdHJpbmd8Y2FsbGFibGUpfSBbZGVsZWdhdGVdIC0gU2VsZWN0b3IgdG8gcnVuIG9uIGVsZW1lbnQgdG8gbGlzdGVuIHRvXHJcbiAgICAgKiBAcGFyYW0ge2NhbGxhYmxlfSBbY2FsbGJhY2tdIC0gRnVuY3Rpb24gdG8gZmlyZSBvbiBldmVudFxyXG4gICAgICogQHJldHVybnMge0VsZW1lbnR9IC0gVGhlIG9yaWdpbmFsIGVsZW1lbnQgdG8gYWxsb3cgZm9yIGNoYWluaW5nXHJcbiAgICAgKi9cclxuICAgIHN0YXRpYyBvZmYoZWxlbWVudCwgZXZlbnQsIGRlbGVnYXRlLCBjYWxsYmFjaykge1xyXG4gICAgICAgIGlmICh0eXBlb2YoZWxlbWVudCkgPT0gXCJzdHJpbmdcIikgcmV0dXJuIHRoaXMuX19vZmZBbGwoZWxlbWVudCk7XHJcbiAgICAgICAgY29uc3QgW3R5cGUsIG5hbWVzcGFjZV0gPSBldmVudC5zcGxpdChcIi5cIik7XHJcbiAgICAgICAgaWYgKG5hbWVzcGFjZSkgcmV0dXJuIHRoaXMuX19vZmZBbGwoZXZlbnQsIGVsZW1lbnQpO1xyXG5cclxuICAgICAgICBjb25zdCBoYXNEZWxlZ2F0ZSA9IGRlbGVnYXRlICYmIGNhbGxiYWNrO1xyXG4gICAgICAgIGlmICghY2FsbGJhY2spIGNhbGxiYWNrID0gZGVsZWdhdGU7XHJcbiAgICAgICAgY29uc3QgZXZlbnRGdW5jID0gIWhhc0RlbGVnYXRlID8gY2FsbGJhY2sgOiBmdW5jdGlvbihldmVudCkge1xyXG4gICAgICAgICAgICBpZiAoZXZlbnQudGFyZ2V0Lm1hdGNoZXMoZGVsZWdhdGUpKSB7XHJcbiAgICAgICAgICAgICAgICBjYWxsYmFjayhldmVudCk7XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICB9O1xyXG5cclxuICAgICAgICBlbGVtZW50LnJlbW92ZUV2ZW50TGlzdGVuZXIodHlwZSwgZXZlbnRGdW5jKTtcclxuICAgICAgICByZXR1cm4gZWxlbWVudDtcclxuICAgIH1cclxuXHJcbiAgICAvKipcclxuICAgICAqIEFkZHMgYSBsaXN0ZW5lciBmb3Igd2hlbiB0aGUgbm9kZSBpcyBhZGRlZC9yZW1vdmVkIGZyb20gdGhlIGRvY3VtZW50IGJvZHkuXHJcbiAgICAgKiBUaGUgbGlzdGVuZXIgaXMgYXV0b21hdGljYWxseSByZW1vdmVkIHVwb24gZmlyaW5nLlxyXG4gICAgICogQHBhcmFtIHtIVE1MRWxlbWVudH0gbm9kZSAtIG5vZGUgdG8gd2FpdCBmb3JcclxuICAgICAqIEBwYXJhbSB7Y2FsbGFibGV9IGNhbGxiYWNrIC0gZnVuY3Rpb24gdG8gYmUgcGVyZm9ybWVkIG9uIGV2ZW50XHJcbiAgICAgKiBAcGFyYW0ge2Jvb2xlYW59IG9uTW91bnQgLSBkZXRlcm1pbmVzIGlmIGl0IHNob3VsZCBmaXJlIG9uIE1vdW50IG9yIG9uIFVubW91bnRcclxuICAgICAqL1xyXG4gICAgc3RhdGljIG9uTW91bnRDaGFuZ2Uobm9kZSwgY2FsbGJhY2ssIG9uTW91bnQgPSB0cnVlKSB7XHJcbiAgICAgICAgY29uc3Qgd3JhcHBlZENhbGxiYWNrID0gKCkgPT4ge1xyXG4gICAgICAgICAgICB0aGlzLm9ic2VydmVyLnVuc3Vic2NyaWJlKHdyYXBwZWRDYWxsYmFjayk7XHJcbiAgICAgICAgICAgIGNhbGxiYWNrKCk7XHJcbiAgICAgICAgfTtcclxuICAgICAgICB0aGlzLm9ic2VydmVyLnN1YnNjcmliZSh3cmFwcGVkQ2FsbGJhY2ssIG11dGF0aW9uID0+IHtcclxuICAgICAgICAgICAgY29uc3Qgbm9kZXMgPSBBcnJheS5mcm9tKG9uTW91bnQgPyBtdXRhdGlvbi5hZGRlZE5vZGVzIDogbXV0YXRpb24ucmVtb3ZlZE5vZGVzKTtcclxuICAgICAgICAgICAgY29uc3QgZGlyZWN0TWF0Y2ggPSBub2Rlcy5pbmRleE9mKG5vZGUpID4gLTE7XHJcbiAgICAgICAgICAgIGNvbnN0IHBhcmVudE1hdGNoID0gbm9kZXMuc29tZShwYXJlbnQgPT4gcGFyZW50LmNvbnRhaW5zKG5vZGUpKTtcclxuICAgICAgICAgICAgcmV0dXJuIGRpcmVjdE1hdGNoIHx8IHBhcmVudE1hdGNoO1xyXG4gICAgICAgIH0pO1xyXG4gICAgICAgIHJldHVybiBub2RlO1xyXG4gICAgfVxyXG5cclxuICAgIC8qKiBTaG9ydGhhbmQgZm9yIHtAbGluayBtb2R1bGU6RE9NVG9vbHMub25Nb3VudENoYW5nZX0gd2l0aCB0aGlyZCBwYXJhbWV0ZXIgYHRydWVgICovXHJcbiAgICBzdGF0aWMgb25Nb3VudChub2RlLCBjYWxsYmFjaykgeyByZXR1cm4gdGhpcy5vbk1vdW50Q2hhbmdlKG5vZGUsIGNhbGxiYWNrKTsgfVxyXG5cclxuICAgIC8qKiBTaG9ydGhhbmQgZm9yIHtAbGluayBtb2R1bGU6RE9NVG9vbHMub25Nb3VudENoYW5nZX0gd2l0aCB0aGlyZCBwYXJhbWV0ZXIgYGZhbHNlYCAqL1xyXG4gICAgc3RhdGljIG9uVW5tb3VudChub2RlLCBjYWxsYmFjaykgeyByZXR1cm4gdGhpcy5vbk1vdW50Q2hhbmdlKG5vZGUsIGNhbGxiYWNrLCBmYWxzZSk7IH1cclxuXHJcbiAgICAvKiogQWxpYXMgZm9yIHtAbGluayBtb2R1bGU6RE9NVG9vbHMub25Nb3VudH0gKi9cclxuICAgIHN0YXRpYyBvbkFkZGVkKG5vZGUsIGNhbGxiYWNrKSB7IHJldHVybiB0aGlzLm9uTW91bnQobm9kZSwgY2FsbGJhY2spOyB9XHJcblxyXG4gICAgLyoqIEFsaWFzIGZvciB7QGxpbmsgbW9kdWxlOkRPTVRvb2xzLm9uVW5tb3VudH0gKi9cclxuICAgIHN0YXRpYyBvblJlbW92ZWQobm9kZSwgY2FsbGJhY2spIHsgcmV0dXJuIHRoaXMub25Vbm1vdW50KG5vZGUsIGNhbGxiYWNrLCBmYWxzZSk7IH1cclxuXHJcbiAgICAvKipcclxuICAgICAqIEhlbHBlciBmdW5jdGlvbiB3aGljaCBjb21iaW5lcyBtdWx0aXBsZSBlbGVtZW50cyBpbnRvIG9uZSBwYXJlbnQgZWxlbWVudFxyXG4gICAgICogQHBhcmFtIHtBcnJheTxIVE1MRWxlbWVudD59IGVsZW1lbnRzIC0gYXJyYXkgb2YgZWxlbWVudHMgdG8gcHV0IGludG8gYSBzaW5nbGUgcGFyZW50XHJcbiAgICAgKi9cclxuICAgIHN0YXRpYyB3cmFwKGVsZW1lbnRzKSB7XHJcbiAgICAgICAgY29uc3QgZG9tV3JhcHBlciA9IHRoaXMucGFyc2VIVE1MKGA8ZGl2IGNsYXNzPVwiZG9tLXdyYXBwZXJcIj48L2Rpdj5gKTtcclxuICAgICAgICBmb3IgKGxldCBlID0gMDsgZSA8IGVsZW1lbnRzLmxlbmd0aDsgZSsrKSBkb21XcmFwcGVyLmFwcGVuZENoaWxkKGVsZW1lbnRzW2VdKTtcclxuICAgICAgICByZXR1cm4gZG9tV3JhcHBlcjtcclxuICAgIH1cclxuXHJcbiAgICAvKipcclxuICAgICAqIFJlc29sdmVzIHRoZSBub2RlIHRvIGFuIEhUTUxFbGVtZW50LiBUaGlzIGlzIG1haW5seSB1c2VkIGJ5IGxpYnJhcnkgbW9kdWxlcy5cclxuICAgICAqIEBwYXJhbSB7KGpRdWVyeXxFbGVtZW50KX0gbm9kZSAtIG5vZGUgdG8gcmVzb2x2ZVxyXG4gICAgICovXHJcbiAgICBzdGF0aWMgcmVzb2x2ZUVsZW1lbnQobm9kZSkge1xyXG4gICAgICAgIGlmICghKG5vZGUgaW5zdGFuY2VvZiBqUXVlcnkpICYmICEobm9kZSBpbnN0YW5jZW9mIEVsZW1lbnQpKSByZXR1cm4gdW5kZWZpbmVkO1xyXG4gICAgICAgIHJldHVybiBub2RlIGluc3RhbmNlb2YgalF1ZXJ5ID8gbm9kZVswXSA6IG5vZGU7XHJcbiAgICB9XHJcbn1cclxuXHJcbndpbmRvdy5MaWdodGNvcmQuQmV0dGVyRGlzY29yZC5ET00gPSBET01Ub29scyIsImltcG9ydCB7YmRDb25maWcsIHNldHRpbmdzQ29va2llfSBmcm9tIFwiLi4vMGdsb2JhbHNcIjtcclxuaW1wb3J0IERhdGFTdG9yZSBmcm9tIFwiLi9kYXRhU3RvcmVcIjtcclxuaW1wb3J0IEJEVjIgZnJvbSBcIi4vdjJcIjtcclxuaW1wb3J0IFV0aWxzIGZyb20gXCIuL3V0aWxzXCI7XHJcbi8vaW1wb3J0IERpc2NvcmRDcnlwdCBmcm9tIFwiLi9EaXNjb3JkQ3J5cHRcIjtcclxuXHJcbmNvbnN0IENvbnN0YW50cyA9IHtcclxuICAgIEVtb2ppUmVnZXg6IC88YT9cXC4oXFx3KylcXC4oXFxkKyk+L2dcclxufVxyXG5cclxubGV0IEN1c3RvbUVtb2ppTW9kdWxlID0gQkRNb2R1bGVzLmdldChlID0+IGUuQ3VzdG9tRW1vamkpWzBdXHJcbmxldCBFbW9qaU1vZHVsZUFwaSA9IEJETW9kdWxlcy5nZXQoZSA9PiBlLmRlZmF1bHQgJiYgZS5kZWZhdWx0LmdldEN1c3RvbUVtb2ppQnlJZClbMF1cclxubGV0IEF1dG9jb21wbGV0ZU1vZHVsZSA9IEJETW9kdWxlcy5nZXQoZSA9PiBlLmRlZmF1bHQgJiYgZS5kZWZhdWx0LmRpc3BsYXlOYW1lID09PSBcIkF1dG9jb21wbGV0ZVwiKVswXVxyXG5sZXQgQXV0b0NvbXBsZXRpb25UZW1wbGF0ZXMgPSBCRE1vZHVsZXMuZ2V0KGUgPT4gZS5nZXRBdXRvY29tcGxldGVPcHRpb25zKVswXVxyXG5sZXQgRW1vamlNb2R1bGVRdWVyeSA9IEJETW9kdWxlcy5nZXQoZSA9PiBlLmRlZmF1bHQgJiYgZS5kZWZhdWx0LnF1ZXJ5RW1vamlSZXN1bHRzKVswXVxyXG5sZXQgTWVzc2FnZXMgPSBCRE1vZHVsZXMuZ2V0KGUgPT4gZS5kZWZhdWx0ICYmIGUuZGVmYXVsdC5NZXNzYWdlcyAmJiBlLmRlZmF1bHQuTWVzc2FnZXMuRU1PSklfTUFUQ0hJTkcpWzBdXHJcbmxldCBndWlsZE1vZHVsZSA9IEJETW9kdWxlcy5nZXQoZSA9PiBlLmRlZmF1bHQgJiYgZS5kZWZhdWx0LmdldEd1aWxkICYmIGUuZGVmYXVsdC5nZXRHdWlsZHMgJiYgIWUuZGVmYXVsdC5pc0ZldGNoaW5nKVswXVxyXG5sZXQgZW1vamlTZWFyY2ggPSBCRE1vZHVsZXMuZ2V0KGUgPT4gZS5kZWZhdWx0ICYmIGUuZGVmYXVsdC5nZXREaXNhbWJpZ3VhdGVkRW1vamlDb250ZXh0KVxyXG5cclxuZXhwb3J0IGRlZmF1bHQgbmV3IGNsYXNzIEVtb2ppTW9kdWxlIHtcclxuICAgIGNvbnN0cnVjdG9yKCl7XHJcbiAgICAgICAgdGhpcy5pbml0KClcclxuICAgIH1cclxuXHJcbiAgICBhc3luYyBpbml0KCl7XHJcbiAgICAgICAgLyoqIEVtb2ppIEF1dG9Db21wbGV0ZSAqL1xyXG4gICAgICAgIGlmKCFBdXRvY29tcGxldGVNb2R1bGUpQXV0b2NvbXBsZXRlTW9kdWxlID0gYXdhaXQgd2luZG93LkxpZ2h0Y29yZC5BcGkuZW5zdXJlRXhwb3J0ZWQoZSA9PiBlLmRlZmF1bHQgJiYgZS5kZWZhdWx0LmRpc3BsYXlOYW1lID09PSBcIkF1dG9jb21wbGV0ZVwiKVxyXG4gICAgICAgIGlmKCFBdXRvQ29tcGxldGlvblRlbXBsYXRlcylBdXRvQ29tcGxldGlvblRlbXBsYXRlcyA9IGF3YWl0IHdpbmRvdy5MaWdodGNvcmQuQXBpLmVuc3VyZUV4cG9ydGVkKGUgPT4gZS5nZXRBdXRvY29tcGxldGVPcHRpb25zKVxyXG4gICAgICAgIGlmKCFFbW9qaU1vZHVsZVF1ZXJ5KUVtb2ppTW9kdWxlUXVlcnkgPSBhd2FpdCB3aW5kb3cuTGlnaHRjb3JkLkFwaS5lbnN1cmVFeHBvcnRlZChlID0+IGUuZGVmYXVsdCAmJiBlLmRlZmF1bHQucXVlcnlFbW9qaVJlc3VsdHMpXHJcbiAgICAgICAgaWYoIU1lc3NhZ2VzKU1lc3NhZ2VzID0gYXdhaXQgd2luZG93LkxpZ2h0Y29yZC5BcGkuZW5zdXJlRXhwb3J0ZWQoZSA9PiBlLmRlZmF1bHQgJiYgZS5kZWZhdWx0Lk1lc3NhZ2VzICYmIGUuZGVmYXVsdC5NZXNzYWdlcy5FTU9KSV9NQVRDSElORylcclxuICAgICAgICBpZighZ3VpbGRNb2R1bGUpZ3VpbGRNb2R1bGUgPSBhd2FpdCB3aW5kb3cuTGlnaHRjb3JkLkFwaS5lbnN1cmVFeHBvcnRlZChlID0+IGUuZGVmYXVsdCAmJiBlLmRlZmF1bHQuZ2V0R3VpbGQgJiYgZS5kZWZhdWx0LmdldEd1aWxkcyAmJiAhZS5kZWZhdWx0LmlzRmV0Y2hpbmcpXHJcbiAgICAgICAgaWYoIWVtb2ppU2VhcmNoKWVtb2ppU2VhcmNoID0gYXdhaXQgd2luZG93LkxpZ2h0Y29yZC5BcGkuZW5zdXJlRXhwb3J0ZWQoZSA9PiBlLmRlZmF1bHQgJiYgZS5kZWZhdWx0LmdldERpc2FtYmlndWF0ZWRFbW9qaUNvbnRleHQpXHJcbiAgICAgICAgaWYoQXV0b2NvbXBsZXRlTW9kdWxlICYmIEF1dG9Db21wbGV0aW9uVGVtcGxhdGVzICYmIEVtb2ppTW9kdWxlUXVlcnkgJiYgTWVzc2FnZXMgJiYgZ3VpbGRNb2R1bGUgJiYgZW1vamlTZWFyY2gpe1xyXG4gICAgICAgICAgICBjb25zb2xlLmxvZyhgUGF0Y2hpbmcgZ2V0QXV0b2NvbXBsZXRlT3B0aW9ucyBvZiBBdXRvQ29tcGxldGlvblRlbXBsYXRlc2AsIEF1dG9Db21wbGV0aW9uVGVtcGxhdGVzKVxyXG4gICAgICAgICAgICBjb25zdCBnZXRBdXRvY29tcGxldGVPcHRpb25zID0gQXV0b0NvbXBsZXRpb25UZW1wbGF0ZXMuZ2V0QXV0b2NvbXBsZXRlT3B0aW9uc1xyXG4gICAgICAgICAgICBBdXRvQ29tcGxldGlvblRlbXBsYXRlcy5nZXRBdXRvY29tcGxldGVPcHRpb25zID0gZnVuY3Rpb24oZSwgdCwgbiwgciwgYSl7XHJcbiAgICAgICAgICAgICAgICBjb25zdCB2YWx1ZSA9IGdldEF1dG9jb21wbGV0ZU9wdGlvbnMuY2FsbCh0aGlzLCAuLi5hcmd1bWVudHMpXHJcbiAgICAgICAgICAgICAgICB2YWx1ZS5MSUdIVENPUkRfRU1PSklTID0ge1xyXG4gICAgICAgICAgICAgICAgICAgIG1hdGNoZXMoYXJnMSwgYXJnMil7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIGxldCBjb25kaXRpb24gPSBhcmcyLmxlbmd0aCA+IDEgJiYgXCIuXCIgPT09IGFyZzFcclxuICAgICAgICAgICAgICAgICAgICAgICAgc2V0RW1vamlVc2FibGUoY29uZGl0aW9uKVxyXG4gICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gY29uZGl0aW9uXHJcbiAgICAgICAgICAgICAgICAgICAgfSxcclxuICAgICAgICAgICAgICAgICAgICBxdWVyeVJlc3VsdHModCl7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIGxldCByZXN1bHRzID0gRW1vamlNb2R1bGVRdWVyeS5kZWZhdWx0LnF1ZXJ5RW1vamlSZXN1bHRzKHQsIGUpXHJcbiAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiByZXN1bHRzXHJcbiAgICAgICAgICAgICAgICAgICAgfSxcclxuICAgICAgICAgICAgICAgICAgICByZW5kZXJSZXN1bHRzKGUsIHQsIG4sIHIsIGEpe1xyXG4gICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gRChlLCB0LCBhLmVtb2ppcywgbiwgciwgTWVzc2FnZXMuZGVmYXVsdC5NZXNzYWdlcy5FTU9KSV9NQVRDSElORywgTWVzc2FnZXMuZGVmYXVsdC5NZXNzYWdlcy5FTU9KSSwgQXV0b2NvbXBsZXRlTW9kdWxlLmRlZmF1bHQuRW1vamksIChmdW5jdGlvbihlKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4ge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVtb2ppOiBlLFxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGtleTogZS5pZCB8fCBlLnVuaXF1ZU5hbWUgfHwgZS5uYW1lLFxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNlbnRpbmVsOiBcIi5cIixcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBndWlsZDogbnVsbCAhPSBlLmd1aWxkSWQgPyBndWlsZE1vZHVsZS5kZWZhdWx0LmdldEd1aWxkKGUuZ3VpbGRJZCkgOiBudWxsXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIH0pLCAoZnVuY3Rpb24oZSkge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIFwiLlwiICsgZSArIFwiLlwiXHJcbiAgICAgICAgICAgICAgICAgICAgICAgIH0pKVxyXG4gICAgICAgICAgICAgICAgICAgIH0sXHJcbiAgICAgICAgICAgICAgICAgICAgZ2V0UGxhaW5UZXh0KGlkLCBndWlsZCl7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIHZhciBlbW9qaXMgPSBndWlsZC5lbW9qaXM7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIGlmIChudWxsID09IGVtb2ppcyB8fCBudWxsID09IGVtb2ppc1tpZF0pIHJldHVybiBcIlwiO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICB2YXIgZW1vamkgPSBlbW9qaXNbaWRdLFxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgaXNBbmltYXRlZCA9IGVtb2ppLmFuaW1hdGVkID8gXCJhXCIgOiBcIlwiO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gZW1vamkubWFuYWdlZCB8fCBudWxsID09IGVtb2ppLmlkID8gXCIuXCIgKyBlbW9qaS5uYW1lICsgXCIuXCIgOiBcIjxcIiArIGlzQW5pbWF0ZWQgKyBcIi5cIiArIChlbW9qaS5vcmlnaW5hbE5hbWUgfHwgZW1vamkubmFtZSkgKyBcIi5cIiArIGVtb2ppLmlkICsgXCI+XCJcclxuICAgICAgICAgICAgICAgICAgICB9LFxyXG4gICAgICAgICAgICAgICAgICAgIGdldFJhd1RleHQoaWQsIGd1aWxkKXtcclxuICAgICAgICAgICAgICAgICAgICAgICAgdmFyIGVtb2ppcyA9IGd1aWxkLmVtb2ppcztcclxuICAgICAgICAgICAgICAgICAgICAgICAgaWYgKG51bGwgPT0gZW1vamlzIHx8IG51bGwgPT0gZW1vamlzW2lkXSkgcmV0dXJuIFwiXCI7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIHZhciBlbW9qaSA9IGVtb2ppc1tpZF0sXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBpc0FuaW1hdGVkID0gZW1vamkuYW5pbWF0ZWQgPyBcImFcIiA6IFwiXCI7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBlbW9qaS5tYW5hZ2VkIHx8IG51bGwgPT0gZW1vamkuaWQgPyBcIi5cIiArIGVtb2ppLm5hbWUgKyBcIi5cIiA6IFwiPFwiICsgaXNBbmltYXRlZCArIFwiLlwiICsgKGVtb2ppLm9yaWdpbmFsTmFtZSB8fCBlbW9qaS5uYW1lKSArIFwiLlwiICsgZW1vamkuaWQgKyBcIj5cIlxyXG4gICAgICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgIHJldHVybiB2YWx1ZVxyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgfWVsc2V7XHJcbiAgICAgICAgICAgIGNvbnNvbGUuZXJyb3IobmV3IEVycm9yKFwiQ291bGRuJ3Qgc3RhcnQgYXV0b2NvbXBsZXRpb24gb2YgTGlnaHRjb3JkJ3MgZW1vamlzLlwiKSlcclxuICAgICAgICB9XHJcblxyXG4gICAgICAgIC8qKiBFbW9qaSBkaXNwbGF5ICovXHJcbiAgICAgICAgd2hpbGUgKCFCRFYyLk1lc3NhZ2VDb21wb25lbnQpIGF3YWl0IG5ldyBQcm9taXNlKHJlc29sdmUgPT4gc2V0VGltZW91dChyZXNvbHZlLCAxMDApKTtcclxuICAgICAgICBpZiAoIXRoaXMuY2FuY2VsRW1vamlSZW5kZXIpe1xyXG4gICAgICAgICAgICB0aGlzLmNhbmNlbEVtb3RlUmVuZGVyID0gVXRpbHMubW9ua2V5UGF0Y2goQkRWMi5NZXNzYWdlQ29tcG9uZW50LCBcImRlZmF1bHRcIiwge2JlZm9yZTogKGRhdGEpID0+IHtcclxuICAgICAgICAgICAgICAgIGNvbnN0IG1lc3NhZ2UgPSBVdGlscy5nZXROZXN0ZWRQcm9wKGRhdGEubWV0aG9kQXJndW1lbnRzWzBdLCBcImNoaWxkcmVuTWVzc2FnZUNvbnRlbnQucHJvcHMubWVzc2FnZVwiKVxyXG4gICAgICAgICAgICAgICAgaWYoIW1lc3NhZ2UpcmV0dXJuXHJcbiAgICAgICAgICAgICAgICBjb25zdCBjb250ZW50ID0gVXRpbHMuZ2V0TmVzdGVkUHJvcChkYXRhLm1ldGhvZEFyZ3VtZW50c1swXSwgXCJjaGlsZHJlbk1lc3NhZ2VDb250ZW50LnByb3BzLmNvbnRlbnRcIilcclxuICAgICAgICAgICAgICAgIGlmKCFjb250ZW50IHx8ICFjb250ZW50Lmxlbmd0aClyZXR1cm5cclxuICAgIFxyXG4gICAgICAgICAgICAgICAgLy8gY29udGVudCA9IERpc2NvcmRDcnlwdC5kZWNyeXB0Q29udGVudChjb250ZW50KVxyXG4gICAgXHJcbiAgICAgICAgICAgICAgICAvKipcclxuICAgICAgICAgICAgICAgICAqIEB0eXBlIHt7XHJcbiAgICAgICAgICAgICAgICAgKiAgcmF3OiBzdHJpbmcsXHJcbiAgICAgICAgICAgICAgICAgKiAgbmFtZTogc3RyaW5nLFxyXG4gICAgICAgICAgICAgICAgICogIGlkOiBzdHJpbmcsXHJcbiAgICAgICAgICAgICAgICAgKiAgYW5pbWF0ZWQ6IGJvb2xlYW5cclxuICAgICAgICAgICAgICAgICAqIH1bXX1cclxuICAgICAgICAgICAgICAgICAqL1xyXG4gICAgICAgICAgICAgICAgbGV0IGVtb2ppcyA9IFtdXHJcbiAgICAgICAgICAgICAgICBcclxuICAgICAgICAgICAgICAgIGNvbnN0IG5ld0NvbnRlbnQgPSBbXVxyXG4gICAgICAgICAgICAgICAgZm9yKGxldCBub2RlIG9mIGNvbnRlbnQpe1xyXG4gICAgICAgICAgICAgICAgICAgIGlmICh0eXBlb2Yobm9kZSkgIT09IFwic3RyaW5nXCIpIHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgbmV3Q29udGVudC5wdXNoKG5vZGUpXHJcbiAgICAgICAgICAgICAgICAgICAgICAgIGNvbnRpbnVlXHJcbiAgICAgICAgICAgICAgICAgICAgfTtcclxuICAgICAgICAgICAgICAgICAgICBsZXQgcGFyc2VkO1xyXG4gICAgICAgICAgICAgICAgICAgIGxldCBoYXNQYXJzZWQgPSBmYWxzZVxyXG4gICAgICAgIFxyXG4gICAgICAgICAgICAgICAgICAgIGRvIHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgcGFyc2VkID0gQ29uc3RhbnRzLkVtb2ppUmVnZXguZXhlYyhub2RlKTtcclxuICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHBhcnNlZCkge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgaGFzUGFyc2VkID0gdHJ1ZVxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYoIUVtb2ppTW9kdWxlQXBpKUVtb2ppTW9kdWxlQXBpID0gQkRNb2R1bGVzLmdldChlID0+IGUuZGVmYXVsdCAmJiBlLmRlZmF1bHQuZ2V0Q3VzdG9tRW1vamlCeUlkKVswXVxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgZW1vamkgPSBFbW9qaU1vZHVsZUFwaS5kZWZhdWx0LmdldEN1c3RvbUVtb2ppQnlJZChwYXJzZWRbMl0pXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZihlbW9qaSl7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZW1vamlzLnB1c2goe1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhbmltYXRlZDogZW1vamkuYW5pbWF0ZWQsXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG5hbWU6IGVtb2ppLm5hbWUsXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlkOiBlbW9qaS5pZCxcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmF3OiBwYXJzZWRbMF1cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9KVxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgfWVsc2V7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZW1vamlzLnB1c2goe1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhbmltYXRlZDogcGFyc2VkWzBdLnN0YXJ0c1dpdGgoXCI8YVwiKSxcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbmFtZTogcGFyc2VkWzFdLFxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZDogcGFyc2VkWzJdLFxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByYXc6IHBhcnNlZFswXVxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0pXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgICAgICB9IHdoaWxlIChwYXJzZWQpO1xyXG4gICAgXHJcbiAgICAgICAgICAgICAgICAgICAgaWYoaGFzUGFyc2VkKXtcclxuICAgICAgICAgICAgICAgICAgICAgICAgY29uc3Qgd29yZHMgPSBub2RlLnNwbGl0KFwiIFwiKS5tYXAoKHdvcmQsIGluZGV4LCBhcnIpID0+IHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmKCF3b3JkKXJldHVybiBcIlwiXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBlbW9qaSA9IGVtb2ppcy5maW5kKGUgPT4gZS5yYXcgPT0gd29yZClcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmKCFlbW9qaSlyZXR1cm4gd29yZFxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYoIUN1c3RvbUVtb2ppTW9kdWxlKUN1c3RvbUVtb2ppTW9kdWxlID0gQkRNb2R1bGVzLmdldChlID0+IGUuQ3VzdG9tRW1vamkpWzBdXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gUmVhY3QuY3JlYXRlRWxlbWVudChDdXN0b21FbW9qaU1vZHVsZS5DdXN0b21FbW9qaSwge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVtb2ppOiB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG5hbWU6IGAuJHtlbW9qaS5uYW1lfS5gLFxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBlbW9qaUlkOiBlbW9qaS5pZCxcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYW5pbWF0ZWQ6IGVtb2ppLmFuaW1hdGVkLFxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBqdW1ib2FibGU6IGFyci5sZW5ndGggPT09IDEgJiYgY29udGVudC5sZW5ndGggPT09IDFcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9KVxyXG4gICAgICAgICAgICAgICAgICAgICAgICB9KS5yZWR1Y2UoKHByZXZpb3VzLCBjdXJyZW50KSA9PiB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZihwcmV2aW91cy5sZW5ndGggPT09IDApcmV0dXJuIFtjdXJyZW50XVxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYodHlwZW9mIGN1cnJlbnQgPT09IFwic3RyaW5nXCIpe1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmKHR5cGVvZiBwcmV2aW91c1twcmV2aW91cy5sZW5ndGggLSAxXSA9PT0gXCJzdHJpbmdcIil7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHByZXZpb3VzW3ByZXZpb3VzLmxlbmd0aCAtIDFdICs9IGAgJHtjdXJyZW50fWBcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHByZXZpb3VzXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHByZXZpb3VzLnB1c2goXCIgXCIrY3VycmVudClcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gcHJldmlvdXNcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHByZXZpb3VzLnB1c2goXCIgXCIsIGN1cnJlbnQpXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gcHJldmlvdXNcclxuICAgICAgICAgICAgICAgICAgICAgICAgfSwgW10pXHJcbiAgICAgICAgICAgICAgICAgICAgICAgIG5ld0NvbnRlbnQucHVzaCguLi53b3JkcylcclxuICAgICAgICAgICAgICAgICAgICB9ZWxzZXtcclxuICAgICAgICAgICAgICAgICAgICAgICAgbmV3Q29udGVudC5wdXNoKG5vZGUpXHJcbiAgICAgICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgICAgd2hpbGUoZGF0YS5tZXRob2RBcmd1bWVudHNbMF0uY2hpbGRyZW5NZXNzYWdlQ29udGVudC5wcm9wcy5jb250ZW50WzBdKXtcclxuICAgICAgICAgICAgICAgICAgICBkYXRhLm1ldGhvZEFyZ3VtZW50c1swXS5jaGlsZHJlbk1lc3NhZ2VDb250ZW50LnByb3BzLmNvbnRlbnQuc2hpZnQoKVxyXG4gICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgICAgd2hpbGUobmV3Q29udGVudFswXSl7XHJcbiAgICAgICAgICAgICAgICAgICAgZGF0YS5tZXRob2RBcmd1bWVudHNbMF0uY2hpbGRyZW5NZXNzYWdlQ29udGVudC5wcm9wcy5jb250ZW50LnB1c2gobmV3Q29udGVudC5zaGlmdCgpKVxyXG4gICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICB9fSk7XHJcbiAgICAgICAgfVxyXG5cclxuICAgIH1cclxuXHJcbiAgICBkaXNhYmxlKCl7XHJcbiAgICAgICAgaWYgKCF0aGlzLmNhbmNlbEVtb3RlUmVuZGVyKSByZXR1cm47XHJcbiAgICAgICAgdGhpcy5jYW5jZWxFbW90ZVJlbmRlcigpO1xyXG4gICAgICAgIHRoaXMuY2FuY2VsRW1vdGVSZW5kZXIgPSBudWxsO1xyXG4gICAgfVxyXG5cclxuICAgIHN0YXJ0KCl7XHJcbiAgICAgICAgXHJcbiAgICB9XHJcbn1cclxuXHJcbmZ1bmN0aW9uIEQoZSwgdCwgbiwgciwgbywgaSwgcywgdSwgbCwgYykge1xyXG4gICAgaWYgKG51bGwgPT0gbiB8fCAwID09PSBuLmxlbmd0aCkgcmV0dXJuIG51bGw7XHJcbiAgICB2YXIgZCA9IG4ubWFwKChmdW5jdGlvbihlLCBuKSB7XHJcbiAgICAgICAgcmV0dXJuIFJlYWN0LmNyZWF0ZUVsZW1lbnQodSwgT2JqZWN0LmFzc2lnbih7XHJcbiAgICAgICAgICAgIG9uQ2xpY2s6IG8sXHJcbiAgICAgICAgICAgIG9uSG92ZXI6IHIsXHJcbiAgICAgICAgICAgIHNlbGVjdGVkOiB0ID09PSBuLFxyXG4gICAgICAgICAgICBpbmRleDogblxyXG4gICAgICAgIH0sIGwoZSwgbikpKVxyXG4gICAgfSkpO1xyXG4gICAgcmV0dXJuIFtSKGksIHMsIGUsIGMpLCBkXVxyXG59XHJcblxyXG5mdW5jdGlvbiBSKGUsIHQsIG4sIHIpIHtcclxuICAgIHZhciBhID0gKG4ubGVuZ3RoID4gMCA/IGUuZm9ybWF0KHtcclxuICAgICAgICBwcmVmaXg6IHIobilcclxuICAgIH0pIDogdClcclxuICAgIGlmKEFycmF5LmlzQXJyYXkoYSkpe1xyXG4gICAgICAgIGEudW5zaGlmdChSZWFjdC5jcmVhdGVFbGVtZW50KFwic3Ryb25nXCIsIHt9LCBcIltMaWdodGNvcmRdIFwiKSlcclxuICAgIH1lbHNle1xyXG4gICAgICAgIGEgPSBcIltMSUdIVENPUkRdIFwiK2FcclxuICAgIH1cclxuICAgIHJldHVybiBSZWFjdC5jcmVhdGVFbGVtZW50KEF1dG9jb21wbGV0ZU1vZHVsZS5kZWZhdWx0LlRpdGxlLCB7XHJcbiAgICAgICAgdGl0bGU6IGFcclxuICAgIH0sIGEpXHJcbn1cclxuUi5kaXNwbGF5TmFtZSA9IFwicmVuZGVySGVhZGVyXCI7XHJcblxyXG5sZXQgRW1vamlGaWx0ZXJNb2R1bGUgPSBCRE1vZHVsZXMuZ2V0KGUgPT4gZS5kZWZhdWx0ICYmIGUuZGVmYXVsdC5pc0Vtb2ppRGlzYWJsZWQpWzBdXHJcbmxldCBpc0Vtb2ppRGlzYWJsZWQgPSBFbW9qaUZpbHRlck1vZHVsZSAmJiBFbW9qaUZpbHRlck1vZHVsZS5kZWZhdWx0LmlzRW1vamlEaXNhYmxlZFxyXG5sZXQgaXNVc2FibGUgPSBmYWxzZVxyXG5sZXQgaGFzUGF0Y2hlZCA9IGZhbHNlXHJcblxyXG5mdW5jdGlvbiBzZXRFbW9qaVVzYWJsZSh1c2FibGUpe1xyXG4gICAgaXNVc2FibGUgPSB1c2FibGVcclxuICAgIGlmKGhhc1BhdGNoZWQpcmV0dXJuXHJcbiAgICBpZighRW1vamlGaWx0ZXJNb2R1bGUpRW1vamlGaWx0ZXJNb2R1bGUgPSBCRE1vZHVsZXMuZ2V0KGUgPT4gZS5kZWZhdWx0ICYmIGUuZGVmYXVsdC5pc0Vtb2ppRGlzYWJsZWQpWzBdXHJcbiAgICBpZighRW1vamlGaWx0ZXJNb2R1bGUpcmV0dXJuXHJcbiAgICBpZighaXNFbW9qaURpc2FibGVkKWlzRW1vamlEaXNhYmxlZCA9IEVtb2ppRmlsdGVyTW9kdWxlLmRlZmF1bHQuaXNFbW9qaURpc2FibGVkXHJcblxyXG4gICAgaGFzUGF0Y2hlZCA9IHRydWVcclxuICAgIEVtb2ppRmlsdGVyTW9kdWxlLmRlZmF1bHQuaXNFbW9qaURpc2FibGVkID0gZnVuY3Rpb24oZW1vamkpe1xyXG4gICAgICAgIGlmKGlzVXNhYmxlKXtcclxuICAgICAgICAgICAgaWYoZW1vamkuc3Vycm9nYXRlcyB8fCBlbW9qaS5kaXZlcnNpdHkpcmV0dXJuIHRydWVcclxuICAgICAgICAgICAgcmV0dXJuIGZhbHNlXHJcbiAgICAgICAgfVxyXG4gICAgICAgIHJldHVybiBpc0Vtb2ppRGlzYWJsZWQuY2FsbCh0aGlzLCAuLi5hcmd1bWVudHMpXHJcbiAgICB9XHJcbn0iLCJpbXBvcnQgbm9kZUZldGNoIGZyb20gXCJub2RlLWZldGNoXCJcclxuaW1wb3J0ICogYXMgZWxlY3Ryb24gZnJvbSBcImVsZWN0cm9uXCJcclxuaW1wb3J0ICogYXMgY3J5cHRvIGZyb20gXCJjcnlwdG9cIlxyXG5pbXBvcnQgQkRWMiBmcm9tIFwiLi92MlwiXHJcbmltcG9ydCB0b29sdGlwV3JhcCBmcm9tIFwiLi4vdWkvdG9vbHRpcFdyYXBcIlxyXG5pbXBvcnQgVXRpbHMgZnJvbSBcIi4vdXRpbHNcIlxyXG5pbXBvcnQgeyBjcmVhdGVSZWFkU3RyZWFtIH0gZnJvbSBcImZzXCJcclxuaW1wb3J0IHsgYmFzZW5hbWUgfSBmcm9tIFwicGF0aFwiXHJcblxyXG5jb25zdCBjYWNoZSA9IHt9XHJcbmNvbnN0IGNhY2hlMiA9IHt9XHJcblxyXG5leHBvcnQgZGVmYXVsdCBuZXcgY2xhc3MgUGx1Z2luQ2VydGlmaWVyIHtcclxuICAgIGNvbnN0cnVjdG9yKCl7fVxyXG5cclxuICAgIHBhdGNoKGF0dGFjaG1lbnQsIGlkKXtcclxuICAgICAgICBwcm9jZXNzLm5leHRUaWNrKCgpID0+IHtcclxuICAgICAgICAgICAgcHJvY2Vzc0F0dGFjaG1lbnQoYXR0YWNobWVudCwgaWQpXHJcbiAgICAgICAgfSlcclxuICAgIH1cclxuXHJcbiAgICBzdGFydCgpe1xyXG5cclxuICAgIH1cclxuXHJcbiAgICBpc1RydXN0ZWQoaGFzaCl7XHJcbiAgICAgICAgcmV0dXJuIGNhY2hlW2hhc2hdICYmICFjYWNoZVtoYXNoXS5zdXNwZWN0XHJcbiAgICB9XHJcbn1cclxuXHJcbmV4cG9ydCBmdW5jdGlvbiBjaGVja1ZpcnVzZXMoaGFzaCwgZGF0YSwgcmVzdWx0Q2FsbGJhY2ssIHJlbW92ZUNhbGxiYWNrKXtcclxuICAgIGRhdGEgPSBkYXRhLnRvU3RyaW5nKFwidXRmOFwiKVxyXG4gICAgbGV0IGlzSGFybWZ1bCA9IGZhbHNlXHJcbiAgICBmb3IobGV0IGtleXdvcmQgb2YgZGF0YS5zcGxpdCgvW15cXHdcXGRdKy9nKSl7XHJcbiAgICAgICAgZm9yKGxldCBvb2Ygb2YgW1xyXG4gICAgICAgICAgICBcInRva2VuXCIsXHJcbiAgICAgICAgICAgIFwiZW1haWxcIixcclxuICAgICAgICAgICAgXCJwaG9uZVwiLFxyXG4gICAgICAgICAgICBcIk1GQVwiLFxyXG4gICAgICAgICAgICBcIjJmYVwiLFxyXG4gICAgICAgICAgICBcInByb2Nlc3NcIixcclxuICAgICAgICAgICAgXCJjaGlsZF9wcm9jZXNzXCIsXHJcbiAgICAgICAgICAgIFwibG9jYWxTdG9yYWdlXCIsXHJcbiAgICAgICAgICAgIFwiZXZhbFwiLFxyXG4gICAgICAgICAgICBcImdldEdsb2JhbFwiLFxyXG4gICAgICAgICAgICBcIkJyb3dzZXJXaW5kb3dcIlxyXG4gICAgICAgIF0pe1xyXG4gICAgICAgICAgICBpZihrZXl3b3JkLnRvTG93ZXJDYXNlKCkuaW5jbHVkZXMob29mLnRvTG93ZXJDYXNlKCkpKXtcclxuICAgICAgICAgICAgICAgIGlzSGFybWZ1bCA9IFwidG9rZW4gc3RlYWxlci92aXJ1c1wiXHJcbiAgICAgICAgICAgICAgICBicmVha1xyXG4gICAgICAgICAgICB9IFxyXG4gICAgICAgIH1cclxuICAgICAgICBpZihpc0hhcm1mdWwpYnJlYWtcclxuICAgIH1cclxuXHJcbiAgICBpZighaXNIYXJtZnVsKXtcclxuICAgICAgICAvKipcclxuICAgICAgICAgKiBAdHlwZSB7c3RyaW5nfVxyXG4gICAgICAgICAqL1xyXG4gICAgICAgIGNvbnN0IG5vX2NvbW1lbnRzID0gZGF0YS5yZXBsYWNlKC9cXC9cXCpbXFxzXFxTXSo/XFwqXFwvfChbXlxcXFw6XXxeKVxcL1xcLy4qJC9nbSwgXCJcIikudHJpbSgpLy8gcmVtb3ZpbmcgdGhlIE1FVEEgY29tbWVudCBmcm9tIHBsdWdpbnNcclxuICAgICAgICBpZigoL3ZhciBbXFx3XFxkXyRdKz1cXFtcIi9naSkudGVzdChub19jb21tZW50cykpe1xyXG4gICAgICAgICAgICBpc0hhcm1mdWwgPSBcIm9iZnVzY2F0aW9uL2hpZGRlbiBjb2RlXCJcclxuICAgICAgICB9XHJcblxyXG4gICAgICAgIGlmKCFpc0hhcm1mdWwpe1xyXG4gICAgICAgICAgICBjb25zdCByZWdleHBzID0gW1xyXG4gICAgICAgICAgICAgICAgLyoqIGhleGFkZWNpbWFsICovXHJcbiAgICAgICAgICAgICAgICAvXzB4XFx3ezR9XFwoJzB4W1xcZGFiY2RlZl0rJ1xcKS9nLFxyXG4gICAgICAgICAgICAgICAgL18weFxcd3s0fVxcKCcweFtcXGRhYmNkZWZdKydbLCBdKydbXiddezR9J1xcKS9nLCAvLyBfMHg4ZGI3KCcweDAnLCAneDFdZicpXHJcbiAgICAgICAgICAgICAgICAvKiogbWFuZ2xlZCAqL1xyXG4gICAgICAgICAgICAgICAgL1xcdytcXCgnMHhbXFxkYWJjZGVmXSsnXFwpL2csIC8vIGIoJzB4MCcpXHJcbiAgICAgICAgICAgICAgICAvXFx3K1xcKCcweFtcXGRhYmNkZWZdKydbLCBdKydbXiddezR9J1xcKS9nLCAvLyBiKCcweDAnLCAneDFdZicpXHJcbiAgICAgICAgICAgIF1cclxuICAgICAgICAgICAgZm9yKGxldCByZWdleCBvZiByZWdleHBzKXtcclxuICAgICAgICAgICAgICAgIGlmKGlzSGFybWZ1bClicmVha1xyXG4gICAgICAgICAgICAgICAgaXNIYXJtZnVsID0gcmVnZXgudGVzdChub19jb21tZW50cykgPyBcIm9iZnVzY2F0aW9uL2hpZGRlbiBjb2RlXCIgOiBmYWxzZVxyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgfVxyXG4gICAgfVxyXG5cclxuICAgIGlmKCFpc0hhcm1mdWwpcmV0dXJuIHJlbW92ZUNhbGxiYWNrKClcclxuICAgIGNhY2hlW2hhc2hdID0ge1xyXG4gICAgICAgIHN1c3BlY3Q6IHRydWUsXHJcbiAgICAgICAgbmFtZTogaGFzaFRvVXJsW2hhc2hdLnNwbGl0KFwiL1wiKS5wb3AoKSxcclxuICAgICAgICB0eXBlOiBoYXNoVG9VcmxbaGFzaF0uZW5kc1dpdGgoXCIuanNcIikgPyBcIlBsdWdpblwiIDogXCJUaGVtZVwiLFxyXG4gICAgICAgIGhhcm06IGlzSGFybWZ1bFxyXG4gICAgfVxyXG4gICAgXHJcbiAgICBjb25zb2xlLmxvZyhgRm91bmQgcG90ZW50aWFsbHkgZGFuZ2Vyb3VzICR7Y2FjaGVbaGFzaF0udHlwZS50b0xvd2VyQ2FzZSgpfTogJHtjYWNoZVtoYXNoXS5uYW1lfWApXHJcblxyXG4gICAgcmVzdWx0Q2FsbGJhY2soY2FjaGVbaGFzaF0pXHJcbn1cclxuXHJcbmNvbnN0IGhhc2hUb1VybCA9IHt9XHJcblxyXG5leHBvcnQgZnVuY3Rpb24gY2hlY2tIYXNoKGhhc2gsIGRhdGEsIGZpbGVuYW1lLCByZXN1bHRDYWxsYmFjaywgcmVtb3ZlQ2FsbGJhY2spe1xyXG4gICAgY29uc29sZS5sb2coYEZpbGU6ICR7ZmlsZW5hbWV9IGhhc2g6ICR7aGFzaH1gKVxyXG4gICAgaWYoIWNhY2hlW2hhc2hdKXtcclxuICAgICAgICBub2RlRmV0Y2goXCJodHRwczovL2Nkbi5qc2RlbGl2ci5uZXQvZ2gvTGlnaHRjb3JkL2ZpbGVoYXNoZXNAbWFzdGVyL2hhc2hlcy9cIitoYXNoLCB7IC8vIFVzaW5nIG5vZGUtZmV0Y2ggdG8gYnlwYXNzIGNvcnNcclxuICAgICAgICAgICAgaGVhZGVyczoge1xyXG4gICAgICAgICAgICAgICAgXCJVc2VyLUFnZW50XCI6IGVsZWN0cm9uLnJlbW90ZS5nZXRDdXJyZW50V2ViQ29udGVudHMoKS51c2VyQWdlbnQgLy8gaGF2ZSB0byBzZXQgdXNlci1hZ2VudFxyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgfSkudGhlbihhc3luYyByZXMgPT4ge1xyXG4gICAgICAgICAgICBpZihyZXMuc3RhdHVzICE9PSAyMDApe1xyXG4gICAgICAgICAgICAgICAgaWYoZmlsZW5hbWUuZW5kc1dpdGgoXCIudGhlbWUuY3NzXCIpKXJldHVybiByZW1vdmVDYWxsYmFjaygpXHJcbiAgICAgICAgICAgICAgICBjaGVja1ZpcnVzZXMoaGFzaCwgZGF0YSwgcmVzdWx0Q2FsbGJhY2ssIHJlbW92ZUNhbGxiYWNrKVxyXG4gICAgICAgICAgICAgICAgcmV0dXJuXHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgY29uc3QgcmVzdWx0ID0gYXdhaXQgcmVzLmpzb24oKVxyXG5cclxuICAgICAgICAgICAgY2FjaGVbaGFzaF0gPSByZXN1bHRcclxuXHJcbiAgICAgICAgICAgIHJlc3VsdENhbGxiYWNrKHJlc3VsdClcclxuICAgICAgICB9KS5jYXRjaChjb25zb2xlLmVycm9yKVxyXG4gICAgfWVsc2V7XHJcbiAgICAgICAgY29uc3QgcmVzdWx0ID0gY2FjaGVbaGFzaF1cclxuXHJcbiAgICAgICAgcmVzdWx0Q2FsbGJhY2socmVzdWx0KVxyXG4gICAgfVxyXG59XHJcblxyXG5leHBvcnQgZnVuY3Rpb24gcHJvY2Vzc0ZpbGUoX19wYXRoLCByZXN1bHRDYWxsYmFjaywgcmVtb3ZlQ2FsbGJhY2sgPSAoKSA9PiB7fSl7ICAgIFxyXG4gICAgY29uc3QgaGFzaCA9IGNyeXB0by5jcmVhdGVIYXNoKFwic2hhMjU2XCIpXHJcbiAgICBsZXQgZGF0YSA9IEJ1ZmZlci5hbGxvYygwKVxyXG5cclxuICAgIGNyZWF0ZVJlYWRTdHJlYW0oX19wYXRoKS5vbihcImRhdGFcIiwgY2h1bmsgPT4ge1xyXG4gICAgICAgIGRhdGEgPSBCdWZmZXIuY29uY2F0KFtkYXRhLCBjaHVua10pXHJcbiAgICAgICAgaGFzaC51cGRhdGUoY2h1bmspXHJcbiAgICB9KS5vbihcImVuZFwiLCAoKSA9PiB7XHJcbiAgICAgICAgY29uc3QgaGFzaFJlc3VsdCA9IGhhc2guZGlnZXN0KFwiaGV4XCIpXHJcblxyXG4gICAgICAgIGhhc2hUb1VybFtoYXNoUmVzdWx0XSA9IF9fcGF0aFxyXG5cclxuICAgICAgICBjb25zb2xlLmxvZyhhcmd1bWVudHMpXHJcblxyXG4gICAgICAgIGNoZWNrSGFzaChoYXNoUmVzdWx0LCBkYXRhLCBiYXNlbmFtZShfX3BhdGgpLCByZXN1bHRDYWxsYmFjaywgcmVtb3ZlQ2FsbGJhY2spXHJcbiAgICB9KVxyXG59XHJcblxyXG5leHBvcnQgZnVuY3Rpb24gcHJvY2Vzc0F0dGFjaG1lbnQoYXR0YWNobWVudCwgaWQpe1xyXG4gICAgaWYoIWRvY3VtZW50LmdldEVsZW1lbnRCeUlkKGlkKSlyZXR1cm5cclxuICAgIGlmKCFhdHRhY2htZW50LnVybC5zdGFydHNXaXRoKFwiaHR0cHM6Ly9jZG4uZGlzY29yZGFwcC5jb20vXCIpKXJldHVybiBkb2N1bWVudC5nZXRFbGVtZW50QnlJZChpZCkucmVtb3ZlKClcclxuICAgIGlmKCFhdHRhY2htZW50LmZpbGVuYW1lLmVuZHNXaXRoKFwiLnBsdWdpbi5qc1wiKSAmJiAhYXR0YWNobWVudC5maWxlbmFtZS5lbmRzV2l0aChcIi50aGVtZS5jc3NcIikpcmV0dXJuIGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKGlkKS5yZW1vdmUoKVxyXG5cclxuICAgIG5vZGVGZXRjaChhdHRhY2htZW50LnVybCwge1xyXG4gICAgICAgIGhlYWRlcnM6IHtcclxuICAgICAgICAgICAgXCJVc2VyLUFnZW50XCI6IGVsZWN0cm9uLnJlbW90ZS5nZXRDdXJyZW50V2ViQ29udGVudHMoKS51c2VyQWdlbnRcclxuICAgICAgICB9XHJcbiAgICB9KS50aGVuKHJlcyA9PiB7XHJcbiAgICAgICAgaWYocmVzLnN0YXR1cyAhPT0gMjAwKXRocm93IG5ldyBFcnJvcihcIkZpbGUgZG9lc24ndCBleGlzdC5cIilcclxuICAgICAgICBjb25zdCBoYXNoID0gY3J5cHRvLmNyZWF0ZUhhc2goXCJzaGEyNTZcIilcclxuICAgICAgICBsZXQgZGF0YSA9IEJ1ZmZlci5hbGxvYygwKVxyXG4gICAgICAgIHJlcy5ib2R5Lm9uKFwiZGF0YVwiLCBjaHVuayA9PiB7XHJcbiAgICAgICAgICAgIGRhdGEgPSBCdWZmZXIuY29uY2F0KFtkYXRhLCBjaHVua10pXHJcbiAgICAgICAgICAgIGhhc2gudXBkYXRlKGNodW5rKVxyXG4gICAgICAgIH0pXHJcbiAgICAgICAgcmVzLmJvZHkub24oXCJlbmRcIiwgKCkgPT4ge1xyXG4gICAgICAgICAgICBjb25zdCBoYXNoUmVzdWx0ID0gaGFzaC5kaWdlc3QoXCJoZXhcIilcclxuXHJcbiAgICAgICAgICAgIGNhY2hlMlthdHRhY2htZW50LnVybF0gPSBoYXNoUmVzdWx0XHJcbiAgICAgICAgICAgIGhhc2hUb1VybFtoYXNoUmVzdWx0XSA9IGF0dGFjaG1lbnQudXJsXHJcblxyXG4gICAgICAgICAgICBjaGVja0hhc2goaGFzaFJlc3VsdCwgZGF0YSwgYXR0YWNobWVudC5maWxlbmFtZSwgKHJlc3VsdCkgPT4ge1xyXG4gICAgICAgICAgICAgICAgcmVuZGVyVG9FbGVtZW50cyhpZCwgcmVzdWx0LCBhdHRhY2htZW50LmZpbGVuYW1lKVxyXG4gICAgICAgICAgICB9LCAoKSA9PiB7XHJcbiAgICAgICAgICAgICAgICBsZXQgZWxlbSA9IGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKGlkKVxyXG4gICAgICAgICAgICAgICAgaWYoZWxlbSllbGVtLnJlbW92ZSgpXHJcbiAgICAgICAgICAgIH0pXHJcbiAgICAgICAgfSlcclxuICAgIH0pLmNhdGNoKCgpPT57fSlcclxufVxyXG5cclxubGV0IGZsb3dlclN0YXJNb2R1bGUgPSBCRE1vZHVsZXMuZ2V0KGUgPT4gZS5mbG93ZXJTdGFyQ29udGFpbmVyKVswXVxyXG5sZXQgY2hpbGRNb2R1bGUgPSBCRE1vZHVsZXMuZ2V0KGUgPT4gZS5jaGlsZENvbnRhaW5lcilbMF1cclxuXHJcbi8qKlxyXG4gKiBcclxuICogQHBhcmFtIHtIVE1MRGl2RWxlbWVudFtdfSBlbGVtZW50cyBcclxuICogQHBhcmFtIHt7dHlwZTogXCJUaGVtZVwifFwiUGx1Z2luXCIsIG5hbWU6IHN0cmluZywgb2ZmaWNpYWw/OiBib29sZWFufXx7c3VzcGVjdDp0cnVlLCB0eXBlOiBcIlRoZW1lXCJ8XCJQbHVnaW5cIiwgbmFtZTogc3RyaW5nLCBoYXJtOiBzdHJpbmd9fSByZXN1bHRcclxuICovXHJcbmZ1bmN0aW9uIHJlbmRlclRvRWxlbWVudHMoaWQsIHJlc3VsdCwgZmlsZW5hbWUpe1xyXG4gICAgY29uc3QgZGl2ID0gZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoaWQpXHJcbiAgICBpZighZGl2IHx8IGRpdi5jaGlsZE5vZGVzLmxlbmd0aCA+IDApcmV0dXJuIC8vIGFscmVhZHkgY2VydGlmaWVkL2RpdiBkb2VzIG5vdCBleGlzdCBhbnltb3JlLlxyXG5cclxuICAgIGlmKCFmbG93ZXJTdGFyTW9kdWxlKWZsb3dlclN0YXJNb2R1bGUgPSBCRE1vZHVsZXMuZ2V0KGUgPT4gZS5mbG93ZXJTdGFyQ29udGFpbmVyKVswXVxyXG4gICAgaWYoIWNoaWxkTW9kdWxlKWNoaWxkTW9kdWxlID0gQkRNb2R1bGVzLmdldChlID0+IGUuY2hpbGRDb250YWluZXIpWzBdXHJcbiAgICBcclxuICAgIGNvbnNvbGUubG9nKHJlc3VsdClcclxuICAgIGlmKHJlc3VsdC5zdXNwZWN0KXtcclxuICAgICAgICB0cnl7XHJcbiAgICAgICAgICAgIGRpdi5wYXJlbnROb2RlLnN0eWxlLmJvcmRlckNvbG9yID0gXCJyZ2IoMjQwLCA3MSwgNzEpXCJcclxuICAgICAgICAgICAgLyoqXHJcbiAgICAgICAgICAgICAqIFxyXG4gICAgICAgICAgICAgKiBAcGFyYW0ge0hUTUxFbGVtZW50fSBub2RlIFxyXG4gICAgICAgICAgICAgKi9cclxuICAgICAgICAgICAgbGV0IG5leHROb2RlID0gKG5vZGUpID0+IHtcclxuICAgICAgICAgICAgICAgIGZvcihsZXQgY2hpbGQgb2Ygbm9kZS5jaGlsZHJlbil7XHJcbiAgICAgICAgICAgICAgICAgICAgaWYoY2hpbGQudGFnTmFtZSA9PT0gXCJBXCIpe1xyXG4gICAgICAgICAgICAgICAgICAgICAgICBjaGlsZC5hZGRFdmVudExpc3RlbmVyKFwiY2xpY2tcIiwgKGUpID0+IHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGUucHJldmVudERlZmF1bHQoKVxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgZS5zdG9wSW1tZWRpYXRlUHJvcGFnYXRpb24oKVxyXG5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIFV0aWxzLnNob3dDb25maXJtYXRpb25Nb2RhbChcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcIkFyZSB5b3Ugc3VyZSB5b3Ugd2FudCB0byBkb3dubG9hZCB0aGlzID9cIiwgXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXCJUaGUgXCIrcmVzdWx0LnR5cGUudG9Mb3dlckNhc2UoKStcIiAqKlwiK2ZpbGVuYW1lK1wiKiogbWlnaHQgYmUgZGFuZ2Vyb3VzICoqKFwiK3Jlc3VsdC5oYXJtK1wiKSoqLiBcXG5cXG4qKldlIGRvbid0IHJlY29tbWFuZCB0byBkb3dubG9hZCBpdCoqLiBIb3dldmVyLCB5b3UgY2FuIHN0aWxsIGRvIGl0IGJlbG93LlwiLCBcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbmZpcm1UZXh0OiBcIkRvd25sb2FkIEFueXdheVwiLFxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjYW5jZWxUZXh0OiBcIkRvbid0ICFcIixcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZGFuZ2VyOiB0cnVlLFxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBvbkNhbmNlbDogKCkgPT4ge30sXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG9uQ29uZmlybTogKCkgPT4ge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZWxlY3Ryb24ucmVtb3RlLnNoZWxsLm9wZW5FeHRlcm5hbChjaGlsZC5ocmVmKVxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgKVxyXG4gICAgICAgICAgICAgICAgICAgICAgICB9KVxyXG4gICAgICAgICAgICAgICAgICAgIH1lbHNlIGlmKFtcImRpdlwiXS5pbmNsdWRlcyhjaGlsZC50YWdOYW1lLnRvTG93ZXJDYXNlKCkpKXtcclxuICAgICAgICAgICAgICAgICAgICAgICAgbmV4dE5vZGUoY2hpbGQpXHJcbiAgICAgICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIG5leHROb2RlKGRpdi5wYXJlbnROb2RlKVxyXG4gICAgICAgIH1jYXRjaChlKXtcclxuICAgICAgICAgICAgY29uc29sZS5lcnJvcihlKVxyXG4gICAgICAgIH1cclxuICAgICAgICBCRFYyLnJlYWN0RG9tLnJlbmRlcihCRFYyLnJlYWN0LmNyZWF0ZUVsZW1lbnQodG9vbHRpcFdyYXAsIHt0ZXh0OiByZXN1bHQudHlwZStcIiBcIityZXN1bHQubmFtZStcIiBpcyBwb3RlbnRpYWxseSBkYW5nZXJvdXMuXCJ9LCBcclxuICAgICAgICAgICAgQkRWMi5yZWFjdC5jcmVhdGVFbGVtZW50KFwiZGl2XCIsIHtjbGFzc05hbWU6IGZsb3dlclN0YXJNb2R1bGUuZmxvd2VyU3RhckNvbnRhaW5lciwgc3R5bGU6IHt3aWR0aDogXCIxNnB4XCIsIGhlaWdodDogXCIxNnB4XCJ9fSxcclxuICAgICAgICAgICAgICAgIEJEVjIucmVhY3QuY3JlYXRlRWxlbWVudChcInN2Z1wiLCB7Y2xhc3NOYW1lOiBCRE1vZHVsZXMuZ2V0KGUgPT4gZS5zdmcpWzBdLnN2ZywgXCJhcmlhLWhpZGRlblwiOlwiZmFsc2VcIix3aWR0aDpcIjE2cHhcIixoZWlnaHQ6XCIxNnB4XCIsdmlld0JveDpcIjAgMCA0MCAzMlwifSxcclxuICAgICAgICAgICAgICAgICAgICBCRFYyLnJlYWN0LmNyZWF0ZUVsZW1lbnQoXCJyZWN0XCIsIHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgeDpcIjBcIixcclxuICAgICAgICAgICAgICAgICAgICAgICAgeTpcIjBcIixcclxuICAgICAgICAgICAgICAgICAgICAgICAgd2lkdGg6XCIzMlwiLFxyXG4gICAgICAgICAgICAgICAgICAgICAgICBoZWlnaHQ6XCIzMlwiLFxyXG4gICAgICAgICAgICAgICAgICAgICAgICBtYXNrOlwidXJsKCNzdmctbWFzay1hdmF0YXItc3RhdHVzLXJvdW5kLTMyKVwiLFxyXG4gICAgICAgICAgICAgICAgICAgICAgICBmaWxsOlwiI2YwNDc0N1wiLFxyXG4gICAgICAgICAgICAgICAgICAgICAgICBtYXNrOlwidXJsKCNzdmctbWFzay1zdGF0dXMtZG5kKVwiLFxyXG4gICAgICAgICAgICAgICAgICAgICAgICBjbGFzc05hbWU6QkRNb2R1bGVzLmdldChlID0+IGUucG9pbnRlckV2ZW50cylbMF0ucG9pbnRlckV2ZW50c1xyXG4gICAgICAgICAgICAgICAgICAgIH0pXHJcbiAgICAgICAgICAgICAgICApXHJcbiAgICAgICAgICAgIClcclxuICAgICAgICApLCBkaXYpXHJcbiAgICB9ZWxzZSBpZighcmVzdWx0Lm9mZmljaWFsKXtcclxuICAgICAgICBkaXYucGFyZW50Tm9kZS5zdHlsZS5ib3JkZXJDb2xvciA9IFwiIzQwODdlZFwiXHJcbiAgICAgICAgQkRWMi5yZWFjdERvbS5yZW5kZXIoQkRWMi5yZWFjdC5jcmVhdGVFbGVtZW50KHRvb2x0aXBXcmFwLCB7dGV4dDogcmVzdWx0LnR5cGUrXCIgXCIrcmVzdWx0Lm5hbWUrXCIgaXMgY2VydGlmaWVkIGJ5IExpZ2h0Y29yZC5cIn0sIFxyXG4gICAgICAgICAgICBCRFYyLnJlYWN0LmNyZWF0ZUVsZW1lbnQoXCJkaXZcIiwge2NsYXNzTmFtZTogZmxvd2VyU3Rhck1vZHVsZS5mbG93ZXJTdGFyQ29udGFpbmVyLCBzdHlsZToge3dpZHRoOiBcIjE2cHhcIiwgaGVpZ2h0OiBcIjE2cHhcIn19LFxyXG4gICAgICAgICAgICAgICAgQkRWMi5yZWFjdC5jcmVhdGVFbGVtZW50KFwic3ZnXCIsIHtjbGFzc05hbWU6IGZsb3dlclN0YXJNb2R1bGUuZmxvd2VyU3RhciwgXCJhcmlhLWhpZGRlblwiOlwiZmFsc2VcIix3aWR0aDpcIjE2cHhcIixoZWlnaHQ6XCIxNnB4XCIsdmlld0JveDpcIjAgMCAxNiAxNS4yXCJ9LFxyXG4gICAgICAgICAgICAgICAgICAgIEJEVjIucmVhY3QuY3JlYXRlRWxlbWVudChcInBhdGhcIiwge2ZpbGw6XCIjNGY1NDVjXCIsIFwiZmlsbC1ydWxlXCI6XCJldmVub2RkXCIsZDpcIm0xNiA3LjZjMCAuNzktMS4yOCAxLjM4LTEuNTIgMi4wOXMuNDQgMiAwIDIuNTktMS44NC4zNS0yLjQ2LjgtLjc5IDEuODQtMS41NCAyLjA5LTEuNjctLjgtMi40Ny0uOC0xLjc1IDEtMi40Ny44LS45Mi0xLjY0LTEuNTQtMi4wOS0yLS4xOC0yLjQ2LS44LjIzLTEuODQgMC0yLjU5LTEuNTQtMS4zLTEuNTQtMi4wOSAxLjI4LTEuMzggMS41Mi0yLjA5LS40NC0yIDAtMi41OSAxLjg1LS4zNSAyLjQ4LS44Ljc4LTEuODQgMS41My0yLjEyIDEuNjcuODMgMi40Ny44MyAxLjc1LTEgMi40Ny0uOC45MSAxLjY0IDEuNTMgMi4wOSAyIC4xOCAyLjQ2LjgtLjIzIDEuODQgMCAyLjU5IDEuNTQgMS4zIDEuNTQgMi4wOXpcIn0pXHJcbiAgICAgICAgICAgICAgICApLFxyXG4gICAgICAgICAgICAgICAgQkRWMi5yZWFjdC5jcmVhdGVFbGVtZW50KFwiZGl2XCIsIHtjbGFzc05hbWU6IGNoaWxkTW9kdWxlLmNoaWxkQ29udGFpbmVyfSwgXHJcbiAgICAgICAgICAgICAgICAgICAgQkRWMi5yZWFjdC5jcmVhdGVFbGVtZW50KFwic3ZnXCIsIHtcImFyaWEtaGlkZGVuXCI6XCJmYWxzZVwiLHdpZHRoOlwiMTZweFwiLGhlaWdodDpcIjE2cHhcIix2aWV3Qm94OlwiMCAwIDE2IDE1LjJcIn0sIFxyXG4gICAgICAgICAgICAgICAgICAgICAgICBCRFYyLnJlYWN0LmNyZWF0ZUVsZW1lbnQoXCJwYXRoXCIsIHtmaWxsOlwiI2ZmZmZmZlwiLGQ6XCJNNy40LDExLjE3LDQsOC42Miw1LDcuMjZsMiwxLjUzTDEwLjY0LDRsMS4zNiwxWlwifSlcclxuICAgICAgICAgICAgICAgICAgICApXHJcbiAgICAgICAgICAgICAgICApXHJcbiAgICAgICAgICAgIClcclxuICAgICAgICApLCBkaXYpXHJcbiAgICB9ZWxzZXtcclxuICAgICAgICBkaXYucGFyZW50Tm9kZS5zdHlsZS5ib3JkZXJDb2xvciA9IFwiIzQwODdlZFwiXHJcbiAgICAgICAgQkRWMi5yZWFjdERvbS5yZW5kZXIoQkRWMi5yZWFjdC5jcmVhdGVFbGVtZW50KHRvb2x0aXBXcmFwLCB7dGV4dDogcmVzdWx0LnR5cGUrXCIgXCIrcmVzdWx0Lm5hbWUrXCIgd2FzIG1hZGUgYnkgdGhlIGRldmVsb3BlcnMgb2YgTGlnaHRjb3JkLlwiLHN0eWxlOlwiYnJhbmRcIn0sIFxyXG4gICAgICAgICAgICBCRFYyLnJlYWN0LmNyZWF0ZUVsZW1lbnQoXCJkaXZcIiwge2NsYXNzTmFtZTogZmxvd2VyU3Rhck1vZHVsZS5mbG93ZXJTdGFyQ29udGFpbmVyLCBzdHlsZToge3dpZHRoOiBcIjE2cHhcIiwgaGVpZ2h0OiBcIjE2cHhcIn19LFxyXG4gICAgICAgICAgICAgICAgQkRWMi5yZWFjdC5jcmVhdGVFbGVtZW50KFwic3ZnXCIsIHtjbGFzc05hbWU6IGZsb3dlclN0YXJNb2R1bGUuZmxvd2VyU3RhciwgXCJhcmlhLWhpZGRlblwiOlwiZmFsc2VcIix3aWR0aDpcIjE2cHhcIixoZWlnaHQ6XCIxNnB4XCIsdmlld0JveDpcIjAgMCAxNiAxNS4yXCIsc3Ryb2tlOlwiIzM2MzkzZlwiLHN0eWxlOntjb2xvcjpcIiM0MDg3ZWRcIn19LFxyXG4gICAgICAgICAgICAgICAgICAgIEJEVjIucmVhY3QuY3JlYXRlRWxlbWVudChcInBhdGhcIiwge2ZpbGw6XCJjdXJyZW50Q29sb3JcIiwgXCJmaWxsLXJ1bGVcIjpcImV2ZW5vZGRcIixkOlwibTE2IDcuNmMwIC43OS0xLjI4IDEuMzgtMS41MiAyLjA5cy40NCAyIDAgMi41OS0xLjg0LjM1LTIuNDYuOC0uNzkgMS44NC0xLjU0IDIuMDktMS42Ny0uOC0yLjQ3LS44LTEuNzUgMS0yLjQ3LjgtLjkyLTEuNjQtMS41NC0yLjA5LTItLjE4LTIuNDYtLjguMjMtMS44NCAwLTIuNTktMS41NC0xLjMtMS41NC0yLjA5IDEuMjgtMS4zOCAxLjUyLTIuMDktLjQ0LTIgMC0yLjU5IDEuODUtLjM1IDIuNDgtLjguNzgtMS44NCAxLjUzLTIuMTIgMS42Ny44MyAyLjQ3LjgzIDEuNzUtMSAyLjQ3LS44LjkxIDEuNjQgMS41MyAyLjA5IDIgLjE4IDIuNDYuOC0uMjMgMS44NCAwIDIuNTkgMS41NCAxLjMgMS41NCAyLjA5elwifSlcclxuICAgICAgICAgICAgICAgICksXHJcbiAgICAgICAgICAgICAgICBCRFYyLnJlYWN0LmNyZWF0ZUVsZW1lbnQoXCJkaXZcIiwge2NsYXNzTmFtZTogY2hpbGRNb2R1bGUuY2hpbGRDb250YWluZXJ9LCBcclxuICAgICAgICAgICAgICAgICAgICBCRFYyLnJlYWN0LmNyZWF0ZUVsZW1lbnQoXCJzdmdcIiwge1wiYXJpYS1oaWRkZW5cIjpcImZhbHNlXCIsd2lkdGg6XCIxNnB4XCIsaGVpZ2h0OlwiMTZweFwiLHZpZXdCb3g6XCIwIDAgMTYgMTUuMlwifSwgXHJcbiAgICAgICAgICAgICAgICAgICAgICAgIEJEVjIucmVhY3QuY3JlYXRlRWxlbWVudChcInBhdGhcIiwge2ZpbGw6XCIjZmZmZmZmXCIsZDpcIk0xMC43LDUuMjhhMi45LDIuOSwwLDAsMC0yLjExLjg2LjExLjExLDAsMCwwLDAsLjE2bDEuMDUuOTRhLjExLjExLDAsMCwwLC4xNSwwLDEuMjcsMS4yNywwLDAsMSwuOS0uMzNjLjY1LDAsLjY1LjczLjY1LjczYS42NC42NCwwLDAsMS0uNjUuNjUsMS43MywxLjczLDAsMCwxLTEuMTgtLjU0Yy0uMzEtLjI2LS4zNi0uMzItLjczLS42NlM3LjA2LDUuMjgsNS42NSw1LjI4QTIuMjYsMi4yNiwwLDAsMCwzLjM3LDcuNTYsMi41OSwyLjU5LDAsMCwwLDMuODIsOWEyLjE4LDIuMTgsMCwwLDAsMS44My44OSwyLjk0LDIuOTQsMCwwLDAsMi4xLS44MS4xMS4xMSwwLDAsMCwwLS4xNkw2Ljc0LDhBLjExLjExLDAsMCwwLDYuNiw4YTEuNTgsMS41OCwwLDAsMS0uOTQuMjloMEEuNzEuNzEsMCwwLDEsNSw3LjU2SDVhLjYzLjYzLDAsMCwxLC42NS0uNjRjLjcxLDAsMS40Mi43NSwxLjk0LDEuMjcuNzUuNzYsMS42NiwxLjc5LDMuMTEsMS43NEEyLjI4LDIuMjgsMCwwLDAsMTMsNy42NGEyLjU5LDIuNTksMCwwLDAtLjQ1LTEuNDdBMi4xNCwyLjE0LDAsMCwwLDEwLjcsNS4yOFpcIn0pXHJcbiAgICAgICAgICAgICAgICAgICAgKVxyXG4gICAgICAgICAgICAgICAgKVxyXG4gICAgICAgICAgICApXHJcbiAgICAgICAgKSwgZGl2KVxyXG4gICAgfVxyXG59IiwiaW1wb3J0IHtiZHBsdWdpbkVycm9ycywgcGx1Z2luQ29va2llLCBzZXR0aW5nc0Nvb2tpZSwgYmRwbHVnaW5zfSBmcm9tIFwiLi4vMGdsb2JhbHNcIjtcclxuaW1wb3J0IENvbnRlbnRNYW5hZ2VyIGZyb20gXCIuL2NvbnRlbnRNYW5hZ2VyXCI7XHJcbmltcG9ydCBEYXRhU3RvcmUgZnJvbSBcIi4vZGF0YVN0b3JlXCI7XHJcbmltcG9ydCBCREV2ZW50cyBmcm9tIFwiLi9iZEV2ZW50c1wiO1xyXG5pbXBvcnQgVXRpbHMgZnJvbSBcIi4vdXRpbHNcIjtcclxuXHJcbmNsYXNzIFBsdWdpbk1vZHVsZSB7XHJcbiAgICBnZXQgZm9sZGVyKCkge3JldHVybiBDb250ZW50TWFuYWdlci5wbHVnaW5zRm9sZGVyO31cclxufVxyXG5cclxuUGx1Z2luTW9kdWxlLnByb3RvdHlwZS5sb2FkUGx1Z2lucyA9IGFzeW5jIGZ1bmN0aW9uICgpIHtcclxuICAgIHRoaXMubG9hZFBsdWdpbkRhdGEoKTtcclxuICAgIGJkcGx1Z2luRXJyb3JzLnNwbGljZSgwLCAwLCAuLi4oYXdhaXQgQ29udGVudE1hbmFnZXIubG9hZFBsdWdpbnMoKSkpO1xyXG4gICAgY29uc3QgcGx1Z2lucyA9IE9iamVjdC5rZXlzKGJkcGx1Z2lucyk7XHJcbiAgICBmb3IgKGxldCBpID0gMDsgaSA8IHBsdWdpbnMubGVuZ3RoOyBpKyspIHtcclxuICAgICAgICBsZXQgcGx1Z2luLCBuYW1lO1xyXG5cclxuICAgICAgICB0cnkge1xyXG4gICAgICAgICAgICBwbHVnaW4gPSBiZHBsdWdpbnNbcGx1Z2luc1tpXV0ucGx1Z2luO1xyXG4gICAgICAgICAgICBuYW1lID0gcGx1Z2luLmdldE5hbWUoKTtcclxuICAgICAgICAgICAgaWYgKHBsdWdpbi5sb2FkICYmIHR5cGVvZihwbHVnaW4ubG9hZCkgPT0gXCJmdW5jdGlvblwiKSBwbHVnaW4ubG9hZCgpO1xyXG4gICAgICAgIH0gY2F0Y2ggKGVycikge1xyXG4gICAgICAgICAgICBwbHVnaW5Db29raWVbbmFtZV0gPSBmYWxzZTtcclxuICAgICAgICAgICAgVXRpbHMuZXJyKFwiUGx1Z2luc1wiLCBuYW1lICsgXCIgY291bGQgbm90IGJlIGxvYWRlZC5cIiwgZXJyKTtcclxuICAgICAgICAgICAgYmRwbHVnaW5FcnJvcnMucHVzaCh7bmFtZTogbmFtZSwgZmlsZTogYmRwbHVnaW5zW3BsdWdpbnNbaV1dLmZpbGVuYW1lLCBtZXNzYWdlOiBcImxvYWQoKSBjb3VsZCBub3QgYmUgZmlyZWQuXCIsIGVycm9yOiB7bWVzc2FnZTogZXJyLm1lc3NhZ2UsIHN0YWNrOiBlcnIuc3RhY2t9fSk7XHJcbiAgICAgICAgICAgIGNvbnRpbnVlO1xyXG4gICAgICAgIH1cclxuXHJcbiAgICAgICAgaWYgKCFwbHVnaW5Db29raWVbbmFtZV0pIHBsdWdpbkNvb2tpZVtuYW1lXSA9IGZhbHNlO1xyXG5cclxuICAgICAgICBpZiAocGx1Z2luQ29va2llW25hbWVdKSB7XHJcbiAgICAgICAgICAgIHRyeSB7XHJcbiAgICAgICAgICAgICAgICBwbHVnaW4uc3RhcnQoKTtcclxuICAgICAgICAgICAgICAgIGlmIChzZXR0aW5nc0Nvb2tpZVtcImZvcmstcHMtMlwiXSkgVXRpbHMuc2hvd1RvYXN0KGAke3BsdWdpbi5nZXROYW1lKCl9IHYke3BsdWdpbi5nZXRWZXJzaW9uKCl9IGhhcyBzdGFydGVkLmApO1xyXG4gICAgICAgICAgICB9IGNhdGNoIChlcnIpIHtcclxuICAgICAgICAgICAgICAgIHBsdWdpbkNvb2tpZVtuYW1lXSA9IGZhbHNlO1xyXG4gICAgICAgICAgICAgICAgVXRpbHMuZXJyKFwiUGx1Z2luc1wiLCBuYW1lICsgXCIgY291bGQgbm90IGJlIHN0YXJ0ZWQuXCIsIGVycik7XHJcbiAgICAgICAgICAgICAgICBiZHBsdWdpbkVycm9ycy5wdXNoKHtuYW1lOiBuYW1lLCBmaWxlOiBiZHBsdWdpbnNbcGx1Z2luc1tpXV0uZmlsZW5hbWUsIG1lc3NhZ2U6IFwic3RhcnQoKSBjb3VsZCBub3QgYmUgZmlyZWQuXCIsIGVycm9yOiB7bWVzc2FnZTogZXJyLm1lc3NhZ2UsIHN0YWNrOiBlcnIuc3RhY2t9fSk7XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICB9XHJcblxyXG4gICAgICAgIGF3YWl0IG5ldyBQcm9taXNlKChyZXNvbHZlKSA9PiBzZXRUaW1lb3V0KHJlc29sdmUsIDEwKSlcclxuICAgIH1cclxuICAgIHRoaXMuc2F2ZVBsdWdpbkRhdGEoKTtcclxuXHJcbiAgICByZXF1aXJlKFwiZWxlY3Ryb25cIikucmVtb3RlLmdldEN1cnJlbnRXZWJDb250ZW50cygpLm9uKFwiZGlkLW5hdmlnYXRlLWluLXBhZ2VcIiwgdGhpcy5jaGFubmVsU3dpdGNoLmJpbmQodGhpcykpO1xyXG4gICAgLy8gaWYgKHNldHRpbmdzQ29va2llW1wiZm9yay1wcy01XCJdKSBDb250ZW50TWFuYWdlci53YXRjaENvbnRlbnQoXCJwbHVnaW5cIik7XHJcbn07XHJcblxyXG5QbHVnaW5Nb2R1bGUucHJvdG90eXBlLnN0YXJ0UGx1Z2luID0gZnVuY3Rpb24ocGx1Z2luLCByZWxvYWQgPSBmYWxzZSkge1xyXG4gICAgdHJ5IHtcclxuICAgICAgICBiZHBsdWdpbnNbcGx1Z2luXS5wbHVnaW4uc3RhcnQoKTtcclxuICAgICAgICBpZiAoc2V0dGluZ3NDb29raWVbXCJmb3JrLXBzLTJcIl0gJiYgIXJlbG9hZCkgVXRpbHMuc2hvd1RvYXN0KGAke2JkcGx1Z2luc1twbHVnaW5dLnBsdWdpbi5nZXROYW1lKCl9IHYke2JkcGx1Z2luc1twbHVnaW5dLnBsdWdpbi5nZXRWZXJzaW9uKCl9IGhhcyBzdGFydGVkLmApO1xyXG4gICAgfVxyXG4gICAgY2F0Y2ggKGVycikge1xyXG4gICAgICAgIGlmIChzZXR0aW5nc0Nvb2tpZVtcImZvcmstcHMtMlwiXSAmJiAhcmVsb2FkKSBVdGlscy5zaG93VG9hc3QoYCR7YmRwbHVnaW5zW3BsdWdpbl0ucGx1Z2luLmdldE5hbWUoKX0gdiR7YmRwbHVnaW5zW3BsdWdpbl0ucGx1Z2luLmdldFZlcnNpb24oKX0gY291bGQgbm90IGJlIHN0YXJ0ZWQuYCwge3R5cGU6IFwiZXJyb3JcIn0pO1xyXG4gICAgICAgIHBsdWdpbkNvb2tpZVtwbHVnaW5dID0gZmFsc2U7XHJcbiAgICAgICAgdGhpcy5zYXZlUGx1Z2luRGF0YSgpO1xyXG4gICAgICAgIFV0aWxzLmVycihcIlBsdWdpbnNcIiwgcGx1Z2luICsgXCIgY291bGQgbm90IGJlIHN0YXJ0ZWQuXCIsIGVycik7XHJcbiAgICB9XHJcbn07XHJcblxyXG5QbHVnaW5Nb2R1bGUucHJvdG90eXBlLnN0b3BQbHVnaW4gPSBmdW5jdGlvbihwbHVnaW4sIHJlbG9hZCA9IGZhbHNlKSB7XHJcbiAgICB0cnkge1xyXG4gICAgICAgIGJkcGx1Z2luc1twbHVnaW5dLnBsdWdpbi5zdG9wKCk7XHJcbiAgICAgICAgaWYgKHNldHRpbmdzQ29va2llW1wiZm9yay1wcy0yXCJdICYmICFyZWxvYWQpIFV0aWxzLnNob3dUb2FzdChgJHtiZHBsdWdpbnNbcGx1Z2luXS5wbHVnaW4uZ2V0TmFtZSgpfSB2JHtiZHBsdWdpbnNbcGx1Z2luXS5wbHVnaW4uZ2V0VmVyc2lvbigpfSBoYXMgc3RvcHBlZC5gKTtcclxuICAgIH1cclxuICAgIGNhdGNoIChlcnIpIHtcclxuICAgICAgICBpZiAoc2V0dGluZ3NDb29raWVbXCJmb3JrLXBzLTJcIl0gJiYgIXJlbG9hZCkgVXRpbHMuc2hvd1RvYXN0KGAke2JkcGx1Z2luc1twbHVnaW5dLnBsdWdpbi5nZXROYW1lKCl9IHYke2JkcGx1Z2luc1twbHVnaW5dLnBsdWdpbi5nZXRWZXJzaW9uKCl9IGNvdWxkIG5vdCBiZSBzdG9wcGVkLmAsIHt0eXBlOiBcImVycm9yXCJ9KTtcclxuICAgICAgICBVdGlscy5lcnIoXCJQbHVnaW5zXCIsIGJkcGx1Z2luc1twbHVnaW5dLnBsdWdpbi5nZXROYW1lKCkgKyBcIiBjb3VsZCBub3QgYmUgc3RvcHBlZC5cIiwgZXJyKTtcclxuICAgIH1cclxufTtcclxuXHJcblBsdWdpbk1vZHVsZS5wcm90b3R5cGUuZW5hYmxlUGx1Z2luID0gZnVuY3Rpb24gKHBsdWdpbiwgcmVsb2FkID0gZmFsc2UpIHtcclxuICAgIGlmIChwbHVnaW5Db29raWVbcGx1Z2luXSkgcmV0dXJuO1xyXG4gICAgcGx1Z2luQ29va2llW3BsdWdpbl0gPSB0cnVlO1xyXG4gICAgdGhpcy5zYXZlUGx1Z2luRGF0YSgpO1xyXG4gICAgdGhpcy5zdGFydFBsdWdpbihwbHVnaW4sIHJlbG9hZCk7XHJcbn07XHJcblxyXG5QbHVnaW5Nb2R1bGUucHJvdG90eXBlLmVuYWJsZSA9IGZ1bmN0aW9uIChwbHVnaW4sIHJlbG9hZCA9IGZhbHNlKSB7XHJcbiAgICByZXR1cm4gdGhpcy5lbmFibGVQbHVnaW4ocGx1Z2luLCByZWxvYWQpO1xyXG59O1xyXG5cclxuUGx1Z2luTW9kdWxlLnByb3RvdHlwZS5kaXNhYmxlUGx1Z2luID0gZnVuY3Rpb24gKHBsdWdpbiwgcmVsb2FkID0gZmFsc2UpIHtcclxuICAgIGlmICghcGx1Z2luQ29va2llW3BsdWdpbl0pIHJldHVybjtcclxuICAgIHBsdWdpbkNvb2tpZVtwbHVnaW5dID0gZmFsc2U7XHJcbiAgICB0aGlzLnNhdmVQbHVnaW5EYXRhKCk7XHJcbiAgICB0aGlzLnN0b3BQbHVnaW4ocGx1Z2luLCByZWxvYWQpO1xyXG59O1xyXG5cclxuUGx1Z2luTW9kdWxlLnByb3RvdHlwZS5kaXNhYmxlID0gZnVuY3Rpb24gKHBsdWdpbiwgcmVsb2FkID0gZmFsc2UpIHtcclxuICAgIHJldHVybiB0aGlzLmRpc2FibGVQbHVnaW4ocGx1Z2luLCByZWxvYWQpO1xyXG59O1xyXG5cclxuUGx1Z2luTW9kdWxlLnByb3RvdHlwZS50b2dnbGVQbHVnaW4gPSBmdW5jdGlvbiAocGx1Z2luKSB7XHJcbiAgICBpZiAocGx1Z2luQ29va2llW3BsdWdpbl0pIHRoaXMuZGlzYWJsZVBsdWdpbihwbHVnaW4pO1xyXG4gICAgZWxzZSB0aGlzLmVuYWJsZVBsdWdpbihwbHVnaW4pO1xyXG59O1xyXG5cclxuUGx1Z2luTW9kdWxlLnByb3RvdHlwZS50b2dnbGUgPSBmdW5jdGlvbiAocGx1Z2luLCByZWxvYWQgPSBmYWxzZSkge1xyXG4gICAgcmV0dXJuIHRoaXMudG9nZ2xlUGx1Z2luKHBsdWdpbiwgcmVsb2FkKTtcclxufTtcclxuXHJcblBsdWdpbk1vZHVsZS5wcm90b3R5cGUubG9hZFBsdWdpbiA9IGFzeW5jIGZ1bmN0aW9uKGZpbGVuYW1lKSB7XHJcbiAgICBjb25zdCBlcnJvciA9IGF3YWl0IENvbnRlbnRNYW5hZ2VyLmxvYWRDb250ZW50KGZpbGVuYW1lLCBcInBsdWdpblwiKTtcclxuICAgIGlmIChlcnJvcikge1xyXG4gICAgICAgIGlmIChzZXR0aW5nc0Nvb2tpZVtcImZvcmstcHMtMVwiXSkgVXRpbHMuc2hvd0NvbnRlbnRFcnJvcnMoe3BsdWdpbnM6IFtlcnJvcl19KTtcclxuICAgICAgICBpZiAoc2V0dGluZ3NDb29raWVbXCJmb3JrLXBzLTJcIl0pIFV0aWxzLnNob3dUb2FzdChgJHtmaWxlbmFtZX0gY291bGQgbm90IGJlIGxvYWRlZC5gLCB7dHlwZTogXCJlcnJvclwifSk7XHJcbiAgICAgICAgcmV0dXJuIFV0aWxzLmVycihcIkNvbnRlbnRNYW5hZ2VyXCIsIGAke2ZpbGVuYW1lfSBjb3VsZCBub3QgYmUgbG9hZGVkLmAsIGVycm9yKTtcclxuICAgIH1cclxuICAgIGNvbnN0IHBsdWdpbiA9IE9iamVjdC52YWx1ZXMoYmRwbHVnaW5zKS5maW5kKHAgPT4gKGNvbnNvbGUubG9nKHAuZmlsZW5hbWUsIGZpbGVuYW1lKSkgfHwgcC5maWxlbmFtZSA9PSBmaWxlbmFtZSkucGx1Z2luO1xyXG4gICAgdHJ5IHsgaWYgKHBsdWdpbi5sb2FkICYmIHR5cGVvZihwbHVnaW4ubG9hZCkgPT0gXCJmdW5jdGlvblwiKSBwbHVnaW4ubG9hZCgpO31cclxuICAgIGNhdGNoIChlcnIpIHtpZiAoc2V0dGluZ3NDb29raWVbXCJmb3JrLXBzLTFcIl0pIFV0aWxzLnNob3dDb250ZW50RXJyb3JzKHtwbHVnaW5zOiBbZXJyXX0pO31cclxuICAgIFV0aWxzLmxvZyhcIkNvbnRlbnRNYW5hZ2VyXCIsIGAke3BsdWdpbi5nZXROYW1lKCl9IHYke3BsdWdpbi5nZXRWZXJzaW9uKCl9IHdhcyBsb2FkZWQuYCk7XHJcbiAgICBpZiAoc2V0dGluZ3NDb29raWVbXCJmb3JrLXBzLTJcIl0pIFV0aWxzLnNob3dUb2FzdChgJHtwbHVnaW4uZ2V0TmFtZSgpfSB2JHtwbHVnaW4uZ2V0VmVyc2lvbigpfSB3YXMgbG9hZGVkLmAsIHt0eXBlOiBcInN1Y2Nlc3NcIn0pO1xyXG4gICAgQkRFdmVudHMuZGlzcGF0Y2goXCJwbHVnaW4tbG9hZGVkXCIsIHBsdWdpbi5nZXROYW1lKCkpO1xyXG59O1xyXG5cclxuUGx1Z2luTW9kdWxlLnByb3RvdHlwZS51bmxvYWRQbHVnaW4gPSBmdW5jdGlvbihmaWxlbmFtZU9yTmFtZSkge1xyXG4gICAgY29uc3QgYmRwbHVnaW4gPSBPYmplY3QudmFsdWVzKGJkcGx1Z2lucykuZmluZChwID0+IHAuZmlsZW5hbWUgPT0gZmlsZW5hbWVPck5hbWUpIHx8IGJkcGx1Z2luc1tmaWxlbmFtZU9yTmFtZV07XHJcbiAgICBpZiAoIWJkcGx1Z2luKSByZXR1cm47XHJcbiAgICBjb25zdCBwbHVnaW4gPSBiZHBsdWdpbi5wbHVnaW4uZ2V0TmFtZSgpO1xyXG4gICAgaWYgKHBsdWdpbkNvb2tpZVtwbHVnaW5dKSB0aGlzLmRpc2FibGVQbHVnaW4ocGx1Z2luLCB0cnVlKTtcclxuICAgIGNvbnN0IGVycm9yID0gQ29udGVudE1hbmFnZXIudW5sb2FkQ29udGVudChiZHBsdWdpbnNbcGx1Z2luXS5maWxlbmFtZSwgXCJwbHVnaW5cIik7XHJcbiAgICBkZWxldGUgYmRwbHVnaW5zW3BsdWdpbl07XHJcbiAgICBpZiAoZXJyb3IpIHtcclxuICAgICAgICBpZiAoc2V0dGluZ3NDb29raWVbXCJmb3JrLXBzLTFcIl0pIFV0aWxzLnNob3dDb250ZW50RXJyb3JzKHtwbHVnaW5zOiBbZXJyb3JdfSk7XHJcbiAgICAgICAgaWYgKHNldHRpbmdzQ29va2llW1wiZm9yay1wcy0yXCJdKSBVdGlscy5zaG93VG9hc3QoYCR7cGx1Z2lufSBjb3VsZCBub3QgYmUgdW5sb2FkZWQuIEl0IG1heSBoYXZlIG5vdCBiZWVuIGxvYWRlZCB5ZXQuYCwge3R5cGU6IFwiZXJyb3JcIn0pO1xyXG4gICAgICAgIHJldHVybiBVdGlscy5lcnIoXCJDb250ZW50TWFuYWdlclwiLCBgJHtwbHVnaW59IGNvdWxkIG5vdCBiZSB1bmxvYWRlZC4gSXQgbWF5IGhhdmUgbm90IGJlZW4gbG9hZGVkIHlldC5gLCBlcnJvcik7XHJcbiAgICB9XHJcbiAgICBVdGlscy5sb2coXCJDb250ZW50TWFuYWdlclwiLCBgJHtwbHVnaW59IHdhcyB1bmxvYWRlZC5gKTtcclxuICAgIGlmIChzZXR0aW5nc0Nvb2tpZVtcImZvcmstcHMtMlwiXSkgVXRpbHMuc2hvd1RvYXN0KGAke3BsdWdpbn0gd2FzIHVubG9hZGVkLmAsIHt0eXBlOiBcInN1Y2Nlc3NcIn0pO1xyXG4gICAgQkRFdmVudHMuZGlzcGF0Y2goXCJwbHVnaW4tdW5sb2FkZWRcIiwgcGx1Z2luKTtcclxufTtcclxuXHJcblBsdWdpbk1vZHVsZS5wcm90b3R5cGUuZGVsZXRlID0gZnVuY3Rpb24oZmlsZW5hbWVPck5hbWUpIHtcclxuICAgIGNvbnN0IGJkcGx1Z2luID0gT2JqZWN0LnZhbHVlcyhiZHBsdWdpbnMpLmZpbmQocCA9PiBwLmZpbGVuYW1lID09IGZpbGVuYW1lT3JOYW1lKSB8fCBiZHBsdWdpbnNbZmlsZW5hbWVPck5hbWVdO1xyXG4gICAgaWYgKCFiZHBsdWdpbikgcmV0dXJuO1xyXG4gICAgdGhpcy51bmxvYWRQbHVnaW4oYmRwbHVnaW4uZmlsZW5hbWUpO1xyXG4gICAgY29uc3QgZnVsbFBhdGggPSByZXF1aXJlKFwicGF0aFwiKS5yZXNvbHZlKENvbnRlbnRNYW5hZ2VyLnBsdWdpbnNGb2xkZXIsIGJkcGx1Z2luLmZpbGVuYW1lKTtcclxuICAgIHJlcXVpcmUoXCJmc1wiKS51bmxpbmtTeW5jKGZ1bGxQYXRoKTtcclxufTtcclxuXHJcblBsdWdpbk1vZHVsZS5wcm90b3R5cGUucmVsb2FkUGx1Z2luID0gYXN5bmMgZnVuY3Rpb24oZmlsZW5hbWVPck5hbWUpIHtcclxuICAgIGNvbnN0IGJkcGx1Z2luID0gT2JqZWN0LnZhbHVlcyhiZHBsdWdpbnMpLmZpbmQocCA9PiBwLmZpbGVuYW1lID09IGZpbGVuYW1lT3JOYW1lKSB8fCBiZHBsdWdpbnNbZmlsZW5hbWVPck5hbWVdO1xyXG4gICAgaWYgKCFiZHBsdWdpbikgcmV0dXJuIHRoaXMubG9hZFBsdWdpbihmaWxlbmFtZU9yTmFtZSk7XHJcbiAgICBjb25zdCBwbHVnaW4gPSBiZHBsdWdpbi5wbHVnaW4uZ2V0TmFtZSgpO1xyXG4gICAgY29uc3QgZW5hYmxlZCA9IHBsdWdpbkNvb2tpZVtwbHVnaW5dO1xyXG4gICAgaWYgKGVuYWJsZWQpIHRoaXMuc3RvcFBsdWdpbihwbHVnaW4sIHRydWUpO1xyXG4gICAgY29uc3QgZXJyb3IgPSBhd2FpdCBDb250ZW50TWFuYWdlci5yZWxvYWRDb250ZW50KGJkcGx1Z2luc1twbHVnaW5dLmZpbGVuYW1lLCBcInBsdWdpblwiKTtcclxuICAgIGlmIChlcnJvcikge1xyXG4gICAgICAgIGlmIChzZXR0aW5nc0Nvb2tpZVtcImZvcmstcHMtMVwiXSkgVXRpbHMuc2hvd0NvbnRlbnRFcnJvcnMoe3BsdWdpbnM6IFtlcnJvcl19KTtcclxuICAgICAgICBpZiAoc2V0dGluZ3NDb29raWVbXCJmb3JrLXBzLTJcIl0pIFV0aWxzLnNob3dUb2FzdChgJHtwbHVnaW59IGNvdWxkIG5vdCBiZSByZWxvYWRlZC5gLCB7dHlwZTogXCJlcnJvclwifSk7XHJcbiAgICAgICAgcmV0dXJuIFV0aWxzLmVycihcIkNvbnRlbnRNYW5hZ2VyXCIsIGAke3BsdWdpbn0gY291bGQgbm90IGJlIHJlbG9hZGVkLmAsIGVycm9yKTtcclxuICAgIH1cclxuICAgIGlmIChiZHBsdWdpbnNbcGx1Z2luXS5wbHVnaW4ubG9hZCAmJiB0eXBlb2YoYmRwbHVnaW5zW3BsdWdpbl0ucGx1Z2luLmxvYWQpID09IFwiZnVuY3Rpb25cIikgYmRwbHVnaW5zW3BsdWdpbl0ucGx1Z2luLmxvYWQoKTtcclxuICAgIGlmIChlbmFibGVkKSB0aGlzLnN0YXJ0UGx1Z2luKHBsdWdpbiwgdHJ1ZSk7XHJcbiAgICBVdGlscy5sb2coXCJDb250ZW50TWFuYWdlclwiLCBgJHtwbHVnaW59IHYke2JkcGx1Z2luc1twbHVnaW5dLnBsdWdpbi5nZXRWZXJzaW9uKCl9IHdhcyByZWxvYWRlZC5gKTtcclxuICAgIGlmIChzZXR0aW5nc0Nvb2tpZVtcImZvcmstcHMtMlwiXSkgVXRpbHMuc2hvd1RvYXN0KGAke3BsdWdpbn0gdiR7YmRwbHVnaW5zW3BsdWdpbl0ucGx1Z2luLmdldFZlcnNpb24oKX0gd2FzIHJlbG9hZGVkLmAsIHt0eXBlOiBcInN1Y2Nlc3NcIn0pO1xyXG4gICAgQkRFdmVudHMuZGlzcGF0Y2goXCJwbHVnaW4tcmVsb2FkZWRcIiwgcGx1Z2luKTtcclxufTtcclxuXHJcblBsdWdpbk1vZHVsZS5wcm90b3R5cGUucmVsb2FkID0gZnVuY3Rpb24obmFtZSkge1xyXG4gICAgcmV0dXJuIHRoaXMucmVsb2FkUGx1Z2luKG5hbWUpO1xyXG59O1xyXG5cclxuUGx1Z2luTW9kdWxlLnByb3RvdHlwZS5lZGl0ID0gZnVuY3Rpb24oZmlsZW5hbWVPck5hbWUpIHtcclxuICAgIGNvbnNvbGUubG9nKFwiRWRpdCBcIiArIGZpbGVuYW1lT3JOYW1lKTtcclxuICAgIGNvbnN0IGJkcGx1Z2luID0gT2JqZWN0LnZhbHVlcyhiZHBsdWdpbnMpLmZpbmQocCA9PiBwLmZpbGVuYW1lID09IGZpbGVuYW1lT3JOYW1lKSB8fCBiZHBsdWdpbnNbZmlsZW5hbWVPck5hbWVdO1xyXG4gICAgaWYgKCFiZHBsdWdpbikgcmV0dXJuO1xyXG4gICAgY29uc3QgZnVsbFBhdGggPSByZXF1aXJlKFwicGF0aFwiKS5yZXNvbHZlKENvbnRlbnRNYW5hZ2VyLnBsdWdpbnNGb2xkZXIsIGJkcGx1Z2luLmZpbGVuYW1lKTtcclxuICAgIGNvbnNvbGUubG9nKFwiRWRpdCBcIiArIGZ1bGxQYXRoKTtcclxuICAgIHJlcXVpcmUoXCJlbGVjdHJvblwiKS5zaGVsbC5vcGVuSXRlbShgJHtmdWxsUGF0aH1gKTtcclxufTtcclxuXHJcblBsdWdpbk1vZHVsZS5wcm90b3R5cGUudXBkYXRlUGx1Z2luTGlzdCA9IGZ1bmN0aW9uKCkge1xyXG4gICAgY29uc3QgcmVzdWx0cyA9IENvbnRlbnRNYW5hZ2VyLmxvYWROZXdDb250ZW50KFwicGx1Z2luXCIpO1xyXG4gICAgZm9yIChjb25zdCBmaWxlbmFtZSBvZiByZXN1bHRzLmFkZGVkKSB0aGlzLmxvYWRQbHVnaW4oZmlsZW5hbWUpO1xyXG4gICAgZm9yIChjb25zdCBuYW1lIG9mIHJlc3VsdHMucmVtb3ZlZCkgdGhpcy51bmxvYWRQbHVnaW4obmFtZSk7XHJcbn07XHJcblxyXG5QbHVnaW5Nb2R1bGUucHJvdG90eXBlLmxvYWRQbHVnaW5EYXRhID0gZnVuY3Rpb24gKCkge1xyXG4gICAgY29uc3Qgc2F2ZWQgPSBEYXRhU3RvcmUuZ2V0U2V0dGluZ0dyb3VwKFwicGx1Z2luc1wiKTtcclxuICAgIGlmIChzYXZlZCkge1xyXG4gICAgICAgIE9iamVjdC5hc3NpZ24ocGx1Z2luQ29va2llLCBzYXZlZCk7XHJcbiAgICB9XHJcbn07XHJcblxyXG5QbHVnaW5Nb2R1bGUucHJvdG90eXBlLnNhdmVQbHVnaW5EYXRhID0gZnVuY3Rpb24gKCkge1xyXG4gICAgRGF0YVN0b3JlLnNldFNldHRpbmdHcm91cChcInBsdWdpbnNcIiwgcGx1Z2luQ29va2llKTtcclxufTtcclxuXHJcblBsdWdpbk1vZHVsZS5wcm90b3R5cGUubmV3TWVzc2FnZSA9IGZ1bmN0aW9uICgpIHtcclxuICAgIGNvbnN0IHBsdWdpbnMgPSBPYmplY3Qua2V5cyhiZHBsdWdpbnMpO1xyXG4gICAgZm9yIChsZXQgaSA9IDA7IGkgPCBwbHVnaW5zLmxlbmd0aDsgaSsrKSB7XHJcbiAgICAgICAgY29uc3QgcGx1Z2luID0gYmRwbHVnaW5zW3BsdWdpbnNbaV1dLnBsdWdpbjtcclxuICAgICAgICBpZiAoIXBsdWdpbkNvb2tpZVtwbHVnaW4uZ2V0TmFtZSgpXSkgY29udGludWU7XHJcbiAgICAgICAgaWYgKHR5cGVvZiBwbHVnaW4ub25NZXNzYWdlID09PSBcImZ1bmN0aW9uXCIpIHtcclxuICAgICAgICAgICAgdHJ5IHsgcGx1Z2luLm9uTWVzc2FnZSgpOyB9XHJcbiAgICAgICAgICAgIGNhdGNoIChlcnIpIHsgVXRpbHMuZXJyKFwiUGx1Z2luc1wiLCBcIlVuYWJsZSB0byBmaXJlIG9uTWVzc2FnZSBmb3IgXCIgKyBwbHVnaW4uZ2V0TmFtZSgpICsgXCIuXCIsIGVycik7IH1cclxuICAgICAgICB9XHJcbiAgICB9XHJcbn07XHJcblxyXG5QbHVnaW5Nb2R1bGUucHJvdG90eXBlLmNoYW5uZWxTd2l0Y2ggPSBmdW5jdGlvbiAoKSB7XHJcbiAgICBjb25zdCBwbHVnaW5zID0gT2JqZWN0LmtleXMoYmRwbHVnaW5zKTtcclxuICAgIGZvciAobGV0IGkgPSAwOyBpIDwgcGx1Z2lucy5sZW5ndGg7IGkrKykge1xyXG4gICAgICAgIGNvbnN0IHBsdWdpbiA9IGJkcGx1Z2luc1twbHVnaW5zW2ldXS5wbHVnaW47XHJcbiAgICAgICAgaWYgKCFwbHVnaW5Db29raWVbcGx1Z2luLmdldE5hbWUoKV0pIGNvbnRpbnVlO1xyXG4gICAgICAgIGlmICh0eXBlb2YgcGx1Z2luLm9uU3dpdGNoID09PSBcImZ1bmN0aW9uXCIpIHtcclxuICAgICAgICAgICAgdHJ5IHsgcGx1Z2luLm9uU3dpdGNoKCk7IH1cclxuICAgICAgICAgICAgY2F0Y2ggKGVycikgeyBVdGlscy5lcnIoXCJQbHVnaW5zXCIsIFwiVW5hYmxlIHRvIGZpcmUgb25Td2l0Y2ggZm9yIFwiICsgcGx1Z2luLmdldE5hbWUoKSArIFwiLlwiLCBlcnIpOyB9XHJcbiAgICAgICAgfVxyXG4gICAgfVxyXG59O1xyXG5cclxuUGx1Z2luTW9kdWxlLnByb3RvdHlwZS5yYXdPYnNlcnZlciA9IGZ1bmN0aW9uKGUpIHtcclxuICAgIGNvbnN0IHBsdWdpbnMgPSBPYmplY3Qua2V5cyhiZHBsdWdpbnMpO1xyXG4gICAgZm9yIChsZXQgaSA9IDA7IGkgPCBwbHVnaW5zLmxlbmd0aDsgaSsrKSB7XHJcbiAgICAgICAgY29uc3QgcGx1Z2luID0gYmRwbHVnaW5zW3BsdWdpbnNbaV1dLnBsdWdpbjtcclxuICAgICAgICBpZiAoIXBsdWdpbkNvb2tpZVtwbHVnaW4uZ2V0TmFtZSgpXSkgY29udGludWU7XHJcbiAgICAgICAgaWYgKHR5cGVvZiBwbHVnaW4ub2JzZXJ2ZXIgPT09IFwiZnVuY3Rpb25cIikge1xyXG4gICAgICAgICAgICB0cnkgeyBwbHVnaW4ub2JzZXJ2ZXIoZSk7IH1cclxuICAgICAgICAgICAgY2F0Y2ggKGVycikgeyBVdGlscy5lcnIoXCJQbHVnaW5zXCIsIFwiVW5hYmxlIHRvIGZpcmUgb2JzZXJ2ZXIgZm9yIFwiICsgcGx1Z2luLmdldE5hbWUoKSArIFwiLlwiLCBlcnIpOyB9XHJcbiAgICAgICAgfVxyXG4gICAgfVxyXG59O1xyXG5cclxuZXhwb3J0IGRlZmF1bHQgbmV3IFBsdWdpbk1vZHVsZSgpOyIsImltcG9ydCB7c2V0dGluZ3NDb29raWV9IGZyb20gXCIuLi8wZ2xvYmFsc1wiO1xyXG5pbXBvcnQgQkRWMiBmcm9tIFwiLi92MlwiO1xyXG5pbXBvcnQgd2VicGFja01vZHVsZXMgZnJvbSBcIi4vd2VicGFja01vZHVsZXNcIjtcclxuaW1wb3J0IFV0aWxzIGZyb20gXCIuL3V0aWxzXCI7XHJcbmltcG9ydCBET00gZnJvbSBcIi4vZG9tdG9vbHNcIjtcclxuXHJcbmltcG9ydCBWMkNfUHVibGljU2VydmVycyBmcm9tIFwiLi4vdWkvcHVibGljc2VydmVycy9wdWJsaWNTZXJ2ZXJzXCI7XHJcbmltcG9ydCBMYXllciBmcm9tIFwiLi4vdWkvcHVibGljc2VydmVycy9sYXllclwiO1xyXG5cclxuZXhwb3J0IGRlZmF1bHQgbmV3IGNsYXNzIFYyX1B1YmxpY1NlcnZlcnMge1xyXG5cclxuICAgIGNvbnN0cnVjdG9yKCkge1xyXG4gICAgICAgIHRoaXMuX2FwcGVuZEJ1dHRvbiA9IHRoaXMuX2FwcGVuZEJ1dHRvbi5iaW5kKHRoaXMpO1xyXG4gICAgfVxyXG5cclxuICAgIGdldCBjb21wb25lbnQoKSB7XHJcbiAgICAgICAgcmV0dXJuIEJEVjIucmVhY3QuY3JlYXRlRWxlbWVudChMYXllciwge3Jvb3RJZDogXCJwdWJzbGF5ZXJyb290XCIsIGlkOiBcInB1YnNsYXllclwifSwgQkRWMi5yZWFjdC5jcmVhdGVFbGVtZW50KFYyQ19QdWJsaWNTZXJ2ZXJzLCB7cm9vdElkOiBcInB1YnNsYXllcnJvb3RcIn0pKTtcclxuICAgIH1cclxuXHJcbiAgICBnZXQgcm9vdCgpIHtcclxuICAgICAgICBjb25zdCBfcm9vdCA9IGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKFwicHVic2xheWVycm9vdFwiKTtcclxuICAgICAgICBpZiAoIV9yb290KSB7XHJcbiAgICAgICAgICAgIGlmICghdGhpcy5pbmplY3RSb290KCkpIHJldHVybiBudWxsO1xyXG4gICAgICAgICAgICByZXR1cm4gdGhpcy5yb290O1xyXG4gICAgICAgIH1cclxuICAgICAgICByZXR1cm4gX3Jvb3Q7XHJcbiAgICB9XHJcblxyXG4gICAgaW5qZWN0Um9vdCgpIHtcclxuICAgICAgICBsZXQgW1xyXG4gICAgICAgICAgICBjbGFzc05hbWVMYXllcnNcclxuICAgICAgICBdID0gW1xyXG4gICAgICAgICAgICBCRE1vZHVsZXMuZ2V0KGUgPT4gZS5sYXllcnMgJiYgZS5sYXllcilbMF0ubGF5ZXJzLnNwbGl0KFwiIFwiKVswXVxyXG4gICAgICAgIF1cclxuICAgICAgICBjb25zdCBsYXllcnMgPSBET00ucXVlcnkoXCIubGF5ZXJzLCAuXCIrY2xhc3NOYW1lTGF5ZXJzKTtcclxuICAgICAgICBpZiAoIWxheWVycykgcmV0dXJuIGZhbHNlO1xyXG4gICAgICAgIGxheWVycy5hcHBlbmQoRE9NLmNyZWF0ZUVsZW1lbnQoXCI8ZGl2IGlkPSdwdWJzbGF5ZXJyb290Jz5cIikpO1xyXG4gICAgICAgIHJldHVybiB0cnVlO1xyXG4gICAgfVxyXG5cclxuICAgIHJlbmRlcigpIHtcclxuICAgICAgICBjb25zdCByb290ID0gdGhpcy5yb290O1xyXG4gICAgICAgIGlmICghcm9vdCkge1xyXG4gICAgICAgICAgICBjb25zb2xlLmxvZyhcIkZBSUxFRCBUTyBMT0NBVEUgUk9PVDogLmxheWVyc1wiKTtcclxuICAgICAgICAgICAgcmV0dXJuO1xyXG4gICAgICAgIH1cclxuICAgICAgICBCRFYyLnJlYWN0RG9tLnJlbmRlcih0aGlzLmNvbXBvbmVudCwgcm9vdCk7XHJcbiAgICB9XHJcblxyXG4gICAgZ2V0IGJ1dHRvbigpIHtcclxuICAgICAgICBjb25zdCBidG4gPSBET00uY3JlYXRlRWxlbWVudChgPGRpdiBpZD1cImJkLXB1Yi1saVwiIGNsYXNzPVwiJHtCRFYyLmd1aWxkQ2xhc3Nlcy5saXN0SXRlbX1cIj5gKTtcclxuICAgICAgICBpZiAoIXNldHRpbmdzQ29va2llW1wiYmRhLWdzLTFcIl0pIGJ0bi5zdHlsZS5kaXNwbGF5ID0gXCJub25lXCI7XHJcbiAgICAgICAgY29uc3QgbGFiZWwgPSBET00uY3JlYXRlRWxlbWVudChgPGRpdiBpZD1cImJkLXB1Yi1idXR0b25cIiBjbGFzcz1cIiR7XCJ3cmFwcGVyLTI1ZVZJbiBcIiArIEJEVjIuZ3VpbGRDbGFzc2VzLmNpcmNsZUJ1dHRvbk1hc2t9XCI+cHVibGljPC9kaXY+YCk7XHJcbiAgICAgICAgbGFiZWwuYWRkRXZlbnRMaXN0ZW5lcihcImNsaWNrXCIsICgpID0+IHt0aGlzLnJlbmRlcigpO30pO1xyXG4gICAgICAgIGJ0bi5hcHBlbmQobGFiZWwpO1xyXG4gICAgICAgIHJldHVybiBidG47XHJcbiAgICB9XHJcblxyXG4gICAgX2FwcGVuZEJ1dHRvbigpIHtcclxuICAgICAgICBsZXQgW1xyXG4gICAgICAgICAgICBjbGFzc05hbWVTY3JvbGxlclxyXG4gICAgICAgIF0gPSBbXHJcbiAgICAgICAgICAgIEJETW9kdWxlcy5nZXQoZSA9PiBlLnNjcm9sbGVyICYmIGUuc2Nyb2xsYmFyV2lkdGgpWzBdLnNjcm9sbGVyXHJcbiAgICAgICAgXVxyXG4gICAgICAgIGlmIChET00ucXVlcnkoXCIjYmQtcHViLWxpXCIpKSByZXR1cm47XHJcbiAgICAgICAgY29uc3Qgd3JhcHBlciA9IEJEVjIuZ3VpbGRDbGFzc2VzLndyYXBwZXIuc3BsaXQoXCIgXCIpWzBdO1xyXG4gICAgICAgIGNvbnN0IGd1aWxkcyA9IERPTS5xdWVyeShgLiR7d3JhcHBlcn0gLiR7Y2xhc3NOYW1lU2Nyb2xsZXJ9ID46Zmlyc3QtY2hpbGRgKTtcclxuICAgICAgICBET00uYWZ0ZXIoZ3VpbGRzLCB0aGlzLmJ1dHRvbik7XHJcbiAgICB9XHJcblxyXG4gICAgYWRkQnV0dG9uKCkge1xyXG4gICAgICAgIGlmICh0aGlzLmd1aWxkUGF0Y2gpIHJldHVybjtcclxuICAgICAgICBjb25zdCBHdWlsZExpc3QgPSB3ZWJwYWNrTW9kdWxlcy5maW5kKG0gPT4gbS5kZWZhdWx0ICYmIG0uZGVmYXVsdC5kaXNwbGF5TmFtZSA9PSBcIk5hdmlnYWJsZUd1aWxkc1wiKTtcclxuICAgICAgICBjb25zdCBHdWlsZExpc3RPbGQgPSB3ZWJwYWNrTW9kdWxlcy5maW5kQnlEaXNwbGF5TmFtZShcIkd1aWxkc1wiKTtcclxuICAgICAgICBpZiAoIUd1aWxkTGlzdCAmJiAhR3VpbGRMaXN0T2xkKSBVdGlscy53YXJuKFwiUHVibGljU2VydmVyXCIsIFwiQ2FuJ3QgZmluZCBHdWlsZExpc3QgY29tcG9uZW50XCIpO1xyXG4gICAgICAgIHRoaXMuZ3VpbGRQYXRjaCA9IFV0aWxzLm1vbmtleVBhdGNoKEd1aWxkTGlzdCA/IEd1aWxkTGlzdCA6IEd1aWxkTGlzdE9sZC5wcm90b3R5cGUsIEd1aWxkTGlzdCA/IFwiZGVmYXVsdFwiIDogXCJyZW5kZXJcIiwge2FmdGVyOiB0aGlzLl9hcHBlbmRCdXR0b259KTtcclxuICAgICAgICB0aGlzLl9hcHBlbmRCdXR0b24oKTtcclxuICAgIH1cclxuXHJcbiAgICByZW1vdmVCdXR0b24oKSB7XHJcbiAgICAgICAgdGhpcy5ndWlsZFBhdGNoKCk7XHJcbiAgICAgICAgZGVsZXRlIHRoaXMuZ3VpbGRQYXRjaDtcclxuICAgICAgICBET00ucXVlcnkoXCIjYmQtcHViLWxpXCIpLnJlbW92ZSgpO1xyXG4gICAgfVxyXG59OyIsImltcG9ydCBVdGlscyBmcm9tIFwiLi91dGlsc1wiO1xyXG5pbXBvcnQge3NldHRpbmdzfSBmcm9tIFwiLi4vMGdsb2JhbHNcIjtcclxuXHJcbmNvbnN0IGVsZWN0cm9uID0gcmVxdWlyZShcImVsZWN0cm9uXCIpO1xyXG5jb25zdCBmcyA9IHJlcXVpcmUoXCJmc1wiKTtcclxuY29uc3QgcGF0aCA9IHJlcXVpcmUoXCJwYXRoXCIpO1xyXG5cclxuY29uc3QgQnJvd3NlcldpbmRvdyA9IGVsZWN0cm9uLnJlbW90ZS5Ccm93c2VyV2luZG93O1xyXG5jb25zdCB3ZWJDb250ZW50cyA9IGVsZWN0cm9uLnJlbW90ZS5nZXRDdXJyZW50V2ViQ29udGVudHMoKTtcclxuXHJcblxyXG5leHBvcnQgZGVmYXVsdCBuZXcgY2xhc3MgcmVhY3REZXZUb29scyB7XHJcbiAgICBjb25zdHJ1Y3RvcigpIHtcclxuICAgICAgICBsZXQgZXh0ZW5zaW9uUGF0aCA9IFwiXCI7XHJcbiAgICAgICAgaWYgKHByb2Nlc3MucGxhdGZvcm0gPT09IFwid2luMzJcIikgZXh0ZW5zaW9uUGF0aCA9IHBhdGgucmVzb2x2ZShwcm9jZXNzLmVudi5MT0NBTEFQUERBVEEsIFwiR29vZ2xlL0Nocm9tZS9Vc2VyIERhdGFcIik7XHJcbiAgICAgICAgZWxzZSBpZiAocHJvY2Vzcy5wbGF0Zm9ybSA9PT0gXCJsaW51eFwiKSBleHRlbnNpb25QYXRoID0gcGF0aC5yZXNvbHZlKHByb2Nlc3MuZW52LkhPTUUsIFwiLmNvbmZpZy9nb29nbGUtY2hyb21lXCIpO1xyXG4gICAgICAgIGVsc2UgaWYgKHByb2Nlc3MucGxhdGZvcm0gPT09IFwiZGFyd2luXCIpIGV4dGVuc2lvblBhdGggPSBwYXRoLnJlc29sdmUocHJvY2Vzcy5lbnYuSE9NRSwgXCJMaWJyYXJ5L0FwcGxpY2F0aW9uIFN1cHBvcnQvR29vZ2xlL0Nocm9tZVwiKTtcclxuICAgICAgICBlbHNlIGV4dGVuc2lvblBhdGggPSBwYXRoLnJlc29sdmUocHJvY2Vzcy5lbnYuSE9NRSwgXCIuY29uZmlnL2Nocm9taXVtXCIpO1xyXG4gICAgICAgIGV4dGVuc2lvblBhdGggKz0gXCIvRGVmYXVsdC9FeHRlbnNpb25zL2Zta2FkbWFwZ29mYWRvcGxqYmpma2FwZGtvaWVuaWhpL1wiO1xyXG4gICAgICAgIGlmIChmcy5leGlzdHNTeW5jKGV4dGVuc2lvblBhdGgpKSB7XHJcbiAgICAgICAgICAgIGNvbnN0IHZlcnNpb25zID0gZnMucmVhZGRpclN5bmMoZXh0ZW5zaW9uUGF0aCk7XHJcbiAgICAgICAgICAgIGV4dGVuc2lvblBhdGggPSBwYXRoLnJlc29sdmUoZXh0ZW5zaW9uUGF0aCwgdmVyc2lvbnNbdmVyc2lvbnMubGVuZ3RoIC0gMV0pO1xyXG4gICAgICAgIH1cclxuICAgICAgICB0aGlzLmV4dGVuc2lvblBhdGggPSBleHRlbnNpb25QYXRoO1xyXG4gICAgICAgIHRoaXMuaXNFeHRlbnNpb25JbnN0YWxsZWQgPSBmcy5leGlzdHNTeW5jKGV4dGVuc2lvblBhdGgpO1xyXG4gICAgICAgIHRoaXMubGlzdGVuZXIgPSB0aGlzLmxpc3RlbmVyLmJpbmQodGhpcyk7XHJcblxyXG4gICAgICAgIHNldHRpbmdzW1wiUmVhY3QgRGV2VG9vbHNcIl0uaGlkZGVuID0gIXRoaXMuaXNFeHRlbnNpb25JbnN0YWxsZWQ7XHJcbiAgICB9XHJcblxyXG4gICAgbGlzdGVuZXIoKSB7XHJcbiAgICAgICAgaWYgKCF0aGlzLmlzRXh0ZW5zaW9uSW5zdGFsbGVkKSByZXR1cm47XHJcbiAgICAgICAgQnJvd3NlcldpbmRvdy5yZW1vdmVEZXZUb29sc0V4dGVuc2lvbihcIlJlYWN0IERldmVsb3BlciBUb29sc1wiKTtcclxuICAgICAgICBjb25zdCBkaWRJbnN0YWxsID0gQnJvd3NlcldpbmRvdy5hZGREZXZUb29sc0V4dGVuc2lvbih0aGlzLmV4dGVuc2lvblBhdGgpO1xyXG5cclxuICAgICAgICBpZiAoZGlkSW5zdGFsbCkgVXRpbHMubG9nKFwiUmVhY3QgRGV2VG9vbHNcIiwgXCJTdWNjZXNzZnVsbHkgaW5zdGFsbGVkIHJlYWN0IGRldnRvb2xzLlwiKTtcclxuICAgICAgICBlbHNlIFV0aWxzLmVycihcIlJlYWN0IERldlRvb2xzXCIsIFwiQ291bGRuJ3QgZmluZCByZWFjdCBkZXZ0b29scyBpbiBjaHJvbWUgZXh0ZW5zaW9ucyFcIik7XHJcbiAgICB9XHJcblxyXG4gICAgc3RhcnQoKSB7XHJcbiAgICAgICAgc2V0SW1tZWRpYXRlKCgpID0+IHdlYkNvbnRlbnRzLm9uKFwiZGV2dG9vbHMtb3BlbmVkXCIsIHRoaXMubGlzdGVuZXIpKTtcclxuICAgICAgICBpZiAod2ViQ29udGVudHMuaXNEZXZUb29sc09wZW5lZCgpKSB0aGlzLmxpc3RlbmVyKCk7XHJcbiAgICB9XHJcblxyXG4gICAgc3RvcCgpIHtcclxuICAgICAgICB3ZWJDb250ZW50cy5yZW1vdmVMaXN0ZW5lcihcImRldnRvb2xzLW9wZW5lZFwiLCB0aGlzLmxpc3RlbmVyKTtcclxuICAgIH1cclxufTsgICIsImltcG9ydCB7c2V0dGluZ3MsIHNldHRpbmdzQ29va2llLCBiZHBsdWdpbnMsIGJkdGhlbWVzLCBzZXR0aW5nc1JQQ30gZnJvbSBcIi4uLzBnbG9iYWxzXCI7XHJcbmltcG9ydCBEYXRhU3RvcmUgZnJvbSBcIi4vZGF0YVN0b3JlXCI7XHJcbmltcG9ydCBWMl9TZXR0aW5nc1BhbmVsX1NpZGViYXIgZnJvbSBcIi4vc2V0dGluZ3NQYW5lbFNpZGViYXJcIjtcclxuaW1wb3J0IFV0aWxzIGZyb20gXCIuL3V0aWxzXCI7XHJcbmltcG9ydCBCRFYyIGZyb20gXCIuL3YyXCI7XHJcbmltcG9ydCBDb250ZW50TWFuYWdlciBmcm9tIFwiLi9jb250ZW50TWFuYWdlclwiO1xyXG5pbXBvcnQgQkRFdmVudHMgZnJvbSBcIi4vYmRFdmVudHNcIjtcclxuaW1wb3J0IGNvbG9yZWRUZXh0IGZyb20gXCIuL2NvbG9yZWRUZXh0XCI7XHJcbmltcG9ydCB0ZkhvdXIgZnJvbSBcIi4vMjRob3VyXCI7XHJcbmltcG9ydCByZWFjdERldlRvb2xzIGZyb20gXCIuL3JlYWN0RGV2VG9vbHNcIjtcclxuaW1wb3J0IERPTSBmcm9tIFwiLi9kb210b29sc1wiO1xyXG5cclxuaW1wb3J0IHB1YmxpY1NlcnZlcnNNb2R1bGUgZnJvbSBcIi4vcHVibGljU2VydmVyc1wiO1xyXG5pbXBvcnQgdm9pY2VNb2RlIGZyb20gXCIuL3ZvaWNlTW9kZVwiO1xyXG5pbXBvcnQgQ2xhc3NOb3JtYWxpemVyIGZyb20gXCIuL2NsYXNzTm9ybWFsaXplclwiO1xyXG5pbXBvcnQgZE1vZGUgZnJvbSBcIi4vZGV2TW9kZVwiO1xyXG5cclxuaW1wb3J0IFRvb2xzIGZyb20gXCIuLi91aS90b29sc1wiO1xyXG5pbXBvcnQgU2Nyb2xsZXIgZnJvbSBcIi4uL3VpL3Njcm9sbGVyXCI7XHJcbmltcG9ydCBTZWN0aW9uZWRTZXR0aW5nc1BhbmVsIGZyb20gXCIuLi91aS9zZWN0aW9uZWRTZXR0aW5nc1BhbmVsXCI7XHJcbmltcG9ydCBTZXR0aW5nc1BhbmVsIGZyb20gXCIuLi91aS9zZXR0aW5nc1BhbmVsXCI7XHJcbmltcG9ydCBDc3NFZGl0b3IgZnJvbSBcIi4uL3VpL2Nzc0VkaXRvclwiO1xyXG5pbXBvcnQgQ2FyZExpc3QgZnJvbSBcIi4uL3VpL2FkZG9ubGlzdFwiO1xyXG5pbXBvcnQgVjJDX1ByZXNlbmNlU2V0dGluZ3MgZnJvbSBcIi4uL3VpL3ByZXNlbmNlU2V0dGluZ3NcIjtcclxuaW1wb3J0IEN1c3RvbVJpY2hQcmVzZW5jZSBmcm9tIFwiLi9DdXN0b21SaWNoUHJlc2VuY2VcIjtcclxuaW1wb3J0IFYyQ19BY2NvdW50SW5mb3MgZnJvbSBcIi4uL3VpL0FjY291bnRJbmZvc1wiO1xyXG5pbXBvcnQgeyByZW1vdGUgfSBmcm9tIFwiZWxlY3Ryb25cIjtcclxuaW1wb3J0IEFudGlBZERNIGZyb20gXCIuL0FudGlBZERNXCI7XHJcbmltcG9ydCBibHVyUHJpdmF0ZSBmcm9tIFwiLi9ibHVyUHJpdmF0ZVwiO1xyXG5pbXBvcnQgZGlzYWJsZVR5cGluZyBmcm9tIFwiLi9kaXNhYmxlVHlwaW5nXCI7XHJcbmltcG9ydCBBcGlQcmV2aWV3IGZyb20gXCIuLi91aS9BcGlQcmV2aWV3XCI7XHJcbmltcG9ydCBWMkNfU2V0dGluZ3NUaXRsZSBmcm9tIFwiLi4vdWkvc2V0dGluZ3NUaXRsZVwiO1xyXG5pbXBvcnQgU3dpdGNoIGZyb20gXCIuLi91aS9zd2l0Y2hcIjtcclxuaW1wb3J0IE1hcmdpblRvcCBmcm9tIFwiLi4vdWkvbWFyZ2ludG9wXCI7XHJcblxyXG5leHBvcnQgZGVmYXVsdCBuZXcgY2xhc3MgVjJfU2V0dGluZ3NQYW5lbCB7XHJcblxyXG4gICAgY29uc3RydWN0b3IoKSB7XHJcbiAgICAgICAgdGhpcy5vbkNoYW5nZSA9IHRoaXMub25DaGFuZ2UuYmluZCh0aGlzKTtcclxuICAgICAgICB0aGlzLnVwZGF0ZVNldHRpbmdzID0gdGhpcy51cGRhdGVTZXR0aW5ncy5iaW5kKHRoaXMpO1xyXG4gICAgICAgIHRoaXMuc2lkZWJhciA9IG5ldyBWMl9TZXR0aW5nc1BhbmVsX1NpZGViYXIoKTtcclxuXHJcbiAgICAgICAgdGhpcy5yZWdpc3RlckNvbXBvbmVudHMoKVxyXG4gICAgfVxyXG5cclxuICAgIHJlZ2lzdGVyQ29tcG9uZW50cygpe1xyXG4gICAgICAgIC8qKiBMaWdodGNvcmQgKi9cclxuICAgICAgICB0aGlzLnNpZGViYXIucmVnaXN0ZXIoXCJsaWdodGNvcmRcIiwgbWFrZUNvbXBvbmVudCh0aGlzLmxpZ2h0Y29yZENvbXBvbmVudC5iaW5kKHRoaXMpKSlcclxuICAgICAgICB0aGlzLnNpZGViYXIucmVnaXN0ZXIoXCJzdGF0dXNcIiwgbWFrZUNvbXBvbmVudCh0aGlzLlByZXNlbmNlQ29tcG9uZW50LmJpbmQodGhpcykpKVxyXG4gICAgICAgIHRoaXMuc2lkZWJhci5yZWdpc3RlcihcImFjY291bnRpbmZvXCIsIG1ha2VDb21wb25lbnQodGhpcy5BY2NvdW50SW5mb3NDb21wb25lbnQuYmluZCh0aGlzKSkpXHJcbiAgICAgICAgdGhpcy5zaWRlYmFyLnJlZ2lzdGVyKFwibGNhcGlwcmV2aWV3XCIsIG1ha2VDb21wb25lbnQodGhpcy5BcGlQcmV2aWV3Q29tcG9uZW50LmJpbmQodGhpcykpKVxyXG5cclxuICAgICAgICAvKiBCYW5kYWdlZCBCRCAqL1xyXG4gICAgICAgIHRoaXMuc2lkZWJhci5yZWdpc3RlcihcImNvcmVcIiwgbWFrZUNvbXBvbmVudCh0aGlzLmNvcmVDb21wb25lbnQuYmluZCh0aGlzKSkpXHJcbiAgICAgICAgdGhpcy5zaWRlYmFyLnJlZ2lzdGVyKFwiY3VzdG9tY3NzXCIsIG1ha2VDb21wb25lbnQodGhpcy5jdXN0b21Dc3NDb21wb25lbnQuYmluZCh0aGlzKSkpXHJcbiAgICAgICAgdGhpcy5zaWRlYmFyLnJlZ2lzdGVyKFwicGx1Z2luc1wiLCBtYWtlQ29tcG9uZW50KHRoaXMucmVuZGVyQWRkb25QYW5lKFwicGx1Z2luc1wiKSkpXHJcbiAgICAgICAgdGhpcy5zaWRlYmFyLnJlZ2lzdGVyKFwidGhlbWVzXCIsIG1ha2VDb21wb25lbnQodGhpcy5yZW5kZXJBZGRvblBhbmUoXCJ0aGVtZXNcIikpKVxyXG4gICAgfVxyXG5cclxuICAgIGdldCByb290KCkge1xyXG4gICAgICAgIGNvbnN0IF9yb290ID0gRE9NLnF1ZXJ5KFwiI2JkLXNldHRpbmdzcGFuZS1jb250YWluZXJcIik7XHJcbiAgICAgICAgaWYgKCFfcm9vdCkge1xyXG4gICAgICAgICAgICBpZiAoIXRoaXMuaW5qZWN0Um9vdCgpKSByZXR1cm4gbnVsbDtcclxuICAgICAgICAgICAgcmV0dXJuIHRoaXMucm9vdDtcclxuICAgICAgICB9XHJcbiAgICAgICAgcmV0dXJuIF9yb290O1xyXG4gICAgfVxyXG5cclxuICAgIGluamVjdFJvb3QoKSB7XHJcbiAgICAgICAgbGV0IFtcclxuICAgICAgICAgICAgY2xhc3NOYW1lTGF5ZXIsXHJcbiAgICAgICAgICAgIGNsYXNzU2lkZWJhclxyXG4gICAgICAgIF0gPSBbXHJcbiAgICAgICAgICAgIEJETW9kdWxlcy5nZXQoZSA9PiBlLmxheWVyICYmIGUuYW5pbWF0aW5nKVswXS5sYXllci5zcGxpdChcIiBcIilbMF0sXHJcbiAgICAgICAgICAgIEJETW9kdWxlcy5nZXQoZSA9PiBlLnN0YW5kYXJkU2lkZWJhclZpZXcpWzBdXHJcbiAgICAgICAgXVxyXG4gICAgICAgIGNvbnN0IHNpZGViYXIgPSBET00ucXVlcnkoXCIuXCIrY2xhc3NOYW1lTGF5ZXIrXCIgLlwiK2NsYXNzU2lkZWJhci5zdGFuZGFyZFNpZGViYXJWaWV3LnNwbGl0KFwiIFwiKVswXStcIiwgLlwiK2NsYXNzTmFtZUxheWVyK1wiIC51aS1zdGFuZGFyZC1zaWRlYmFyLXZpZXdcIik7XHJcbiAgICAgICAgaWYgKCFzaWRlYmFyKSByZXR1cm4gZmFsc2U7XHJcbiAgICAgICAgY29uc3Qgcm9vdCA9IERPTS5jcmVhdGVFbGVtZW50KGA8ZGl2IGlkPVwiYmQtc2V0dGluZ3NwYW5lLWNvbnRhaW5lclwiIGNsYXNzPVwiJHtjbGFzc1NpZGViYXIuY29udGVudFJlZ2lvbn0gY29udGVudC1yZWdpb25cIj5gKTtcclxuICAgICAgICBzaWRlYmFyLmFwcGVuZChyb290KTtcclxuXHJcbiAgICAgICAgVXRpbHMub25SZW1vdmVkKHJvb3QsICgpID0+IHtcclxuICAgICAgICAgICAgQkRWMi5yZWFjdERvbS51bm1vdW50Q29tcG9uZW50QXROb2RlKHJvb3QpO1xyXG4gICAgICAgIH0pO1xyXG4gICAgICAgIHJldHVybiB0cnVlO1xyXG4gICAgfVxyXG5cclxuICAgIGdldCBjb3JlU2V0dGluZ3MoKSB7XHJcbiAgICAgICAgY29uc3Qgc2V0dGluZ3MgPSB0aGlzLmdldFNldHRpbmdzKFwiY29yZVwiKTtcclxuICAgICAgICBjb25zdCBjYXRlZ29yaWVzID0gWy4uLm5ldyBTZXQoc2V0dGluZ3MubWFwKHMgPT4gcy5jYXRlZ29yeSkpXTtcclxuICAgICAgICBjb25zdCBzZWN0aW9ucyA9IGNhdGVnb3JpZXMubWFwKGMgPT4ge3JldHVybiB7dGl0bGU6IGMsIHNldHRpbmdzOiBzZXR0aW5ncy5maWx0ZXIocyA9PiBzLmNhdGVnb3J5ID09IGMpfTt9KTtcclxuICAgICAgICByZXR1cm4gc2VjdGlvbnM7XHJcbiAgICB9XHJcblxyXG4gICAgZ2V0IGxpZ2h0Y29yZFNldHRpbmdzKCkge1xyXG4gICAgICAgIGNvbnN0IHNldHRpbmdzID0gdGhpcy5nZXRTZXR0aW5ncyhcImxpZ2h0Y29yZFwiKTtcclxuICAgICAgICBjb25zdCBjYXRlZ29yaWVzID0gWy4uLm5ldyBTZXQoc2V0dGluZ3MubWFwKHMgPT4gcy5jYXRlZ29yeSkpXTtcclxuICAgICAgICBjb25zdCBzZWN0aW9ucyA9IGNhdGVnb3JpZXMubWFwKGMgPT4ge3JldHVybiB7dGl0bGU6IGMsIHNldHRpbmdzOiBzZXR0aW5ncy5maWx0ZXIocyA9PiBzLmNhdGVnb3J5ID09IGMpfTt9KTtcclxuICAgICAgICByZXR1cm4gc2VjdGlvbnM7XHJcbiAgICB9XHJcblxyXG4gICAgZ2V0IFByZXNlbmNlU2V0dGluZ3MoKSB7XHJcbiAgICAgICAgcmV0dXJuIHRoaXMuZ2V0U2V0dGluZ3MoXCJzdGF0dXNcIilcclxuICAgIH1cclxuXHJcbiAgICBnZXQgTXNnTG9nU2V0dGluZ3MoKSB7XHJcbiAgICAgICAgcmV0dXJuIHRoaXMuZ2V0U2V0dGluZ3MoXCJtc2dsb2dcIilcclxuICAgIH1cclxuXHJcbiAgICBnZXRTZXR0aW5ncyhjYXRlZ29yeSkge1xyXG4gICAgICAgIHJldHVybiBPYmplY3Qua2V5cyhzZXR0aW5ncykucmVkdWNlKChhcnIsIGtleSkgPT4ge1xyXG4gICAgICAgICAgICBjb25zdCBzZXR0aW5nID0gc2V0dGluZ3Nba2V5XTtcclxuICAgICAgICAgICAgaWYgKHNldHRpbmcuY2F0ID09PSBjYXRlZ29yeSAmJiBzZXR0aW5nLmltcGxlbWVudGVkICYmICFzZXR0aW5nLmhpZGRlbikge1xyXG4gICAgICAgICAgICAgICAgc2V0dGluZy50ZXh0ID0ga2V5O1xyXG4gICAgICAgICAgICAgICAgYXJyLnB1c2goc2V0dGluZyk7XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgcmV0dXJuIGFycjtcclxuICAgICAgICB9LCBbXSk7XHJcbiAgICB9XHJcblxyXG4gICAgb25DbGljaygpIHt9XHJcblxyXG4gICAgb25DaGFuZ2UoaWQsIGNoZWNrZWQpIHtcclxuICAgICAgICB0aGlzLnVwZGF0ZVNldHRpbmdzKGlkLCBjaGVja2VkKTtcclxuICAgIH1cclxuXHJcbiAgICB1cGRhdGVTZXR0aW5ncyhpZCwgZW5hYmxlZCkge1xyXG4gICAgICAgIHNldHRpbmdzQ29va2llW2lkXSA9IGVuYWJsZWQ7XHJcblxyXG4gICAgICAgIGlmIChpZCA9PSBcImJkYS1ncy0yXCIpIHtcclxuICAgICAgICAgICAgaWYgKGVuYWJsZWQpIERPTS5hZGRDbGFzcyhkb2N1bWVudC5ib2R5LCBcImJkLW1pbmltYWxcIik7XHJcbiAgICAgICAgICAgIGVsc2UgRE9NLnJlbW92ZUNsYXNzKGRvY3VtZW50LmJvZHksIFwiYmQtbWluaW1hbFwiKTtcclxuICAgICAgICB9XHJcblxyXG4gICAgICAgIGlmIChpZCA9PSBcImJkYS1ncy0zXCIpIHtcclxuICAgICAgICAgICAgaWYgKGVuYWJsZWQpIERPTS5hZGRDbGFzcyhkb2N1bWVudC5ib2R5LCBcImJkLW1pbmltYWwtY2hhblwiKTtcclxuICAgICAgICAgICAgZWxzZSBET00ucmVtb3ZlQ2xhc3MoZG9jdW1lbnQuYm9keSwgXCJiZC1taW5pbWFsLWNoYW5cIik7XHJcbiAgICAgICAgfVxyXG5cclxuICAgICAgICBpZiAoaWQgPT0gXCJiZGEtZ3MtMVwiKSB7XHJcbiAgICAgICAgICAgIGlmIChlbmFibGVkKSBwdWJsaWNTZXJ2ZXJzTW9kdWxlLmFkZEJ1dHRvbigpO1xyXG4gICAgICAgICAgICBlbHNlIHB1YmxpY1NlcnZlcnNNb2R1bGUucmVtb3ZlQnV0dG9uKCk7XHJcbiAgICAgICAgfVxyXG5cclxuICAgICAgICBpZiAoaWQgPT0gXCJiZGEtZ3MtNFwiKSB7XHJcbiAgICAgICAgICAgIGlmIChlbmFibGVkKSB2b2ljZU1vZGUuc3RhcnQoKTtcclxuICAgICAgICAgICAgZWxzZSB2b2ljZU1vZGUuc3RvcCgpO1xyXG4gICAgICAgIH1cclxuXHJcbiAgICAgICAgaWYgKGlkID09IFwiYmRhLWdzLTVcIikge1xyXG4gICAgICAgICAgICBpZiAoZW5hYmxlZCkgRE9NLmFkZENsYXNzKERPTS5xdWVyeShcIiNhcHAtbW91bnRcIiksIFwiYmRhLWRhcmtcIik7XHJcbiAgICAgICAgICAgIGVsc2UgRE9NLnJlbW92ZUNsYXNzKERPTS5xdWVyeShcIiNhcHAtbW91bnRcIiksIFwiYmRhLWRhcmtcIik7XHJcbiAgICAgICAgfVxyXG5cclxuICAgICAgICBpZiAoZW5hYmxlZCAmJiBpZCA9PSBcImJkYS1ncy02XCIpIHRmSG91ci5pbmplY3QyNEhvdXIoKTtcclxuXHJcbiAgICAgICAgaWYgKGlkID09IFwiYmRhLWdzLTdcIikge1xyXG4gICAgICAgICAgICBpZiAoZW5hYmxlZCkgY29sb3JlZFRleHQuaW5qZWN0Q29sb3JlZFRleHQoKTtcclxuICAgICAgICAgICAgZWxzZSBjb2xvcmVkVGV4dC5yZW1vdmVDb2xvcmVkVGV4dCgpO1xyXG4gICAgICAgIH1cclxuXHJcbiAgICAgICAgaWYgKGlkID09IFwiZm9yay1wcy00XCIpIHtcclxuICAgICAgICAgICAgaWYgKGVuYWJsZWQpIENsYXNzTm9ybWFsaXplci5zdGFydCgpO1xyXG4gICAgICAgICAgICBlbHNlIENsYXNzTm9ybWFsaXplci5zdG9wKCk7XHJcbiAgICAgICAgfVxyXG5cclxuICAgICAgICBpZiAoaWQgPT0gXCJmb3JrLXBzLTVcIikge1xyXG4gICAgICAgICAgICBpZiAoZW5hYmxlZCkge1xyXG4gICAgICAgICAgICAgICAgQ29udGVudE1hbmFnZXIud2F0Y2hDb250ZW50KFwicGx1Z2luXCIpO1xyXG4gICAgICAgICAgICAgICAgQ29udGVudE1hbmFnZXIud2F0Y2hDb250ZW50KFwidGhlbWVcIik7XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgZWxzZSB7XHJcbiAgICAgICAgICAgICAgICBDb250ZW50TWFuYWdlci51bndhdGNoQ29udGVudChcInBsdWdpblwiKTtcclxuICAgICAgICAgICAgICAgIENvbnRlbnRNYW5hZ2VyLnVud2F0Y2hDb250ZW50KFwidGhlbWVcIik7XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICB9XHJcblxyXG4gICAgICAgIGlmIChpZCA9PSBcImZvcmstd3AtMVwiKSB7XHJcbiAgICAgICAgICAgIFV0aWxzLnNldFdpbmRvd1ByZWZlcmVuY2UoXCJ0cmFuc3BhcmVudFwiLCBlbmFibGVkKTtcclxuICAgICAgICAgICAgaWYgKGVuYWJsZWQpIFV0aWxzLnNldFdpbmRvd1ByZWZlcmVuY2UoXCJiYWNrZ3JvdW5kQ29sb3JcIiwgbnVsbCk7XHJcbiAgICAgICAgICAgIGVsc2UgVXRpbHMuc2V0V2luZG93UHJlZmVyZW5jZShcImJhY2tncm91bmRDb2xvclwiLCBcIiMyZjMxMzZcIik7XHJcbiAgICAgICAgfVxyXG5cclxuXHJcbiAgICAgICAgaWYgKGlkID09IFwiYmRhLWdzLThcIikge1xyXG4gICAgICAgICAgICBpZiAoZW5hYmxlZCkgZE1vZGUuc3RhcnREZWJ1Z0xpc3RlbmVyKCk7XHJcbiAgICAgICAgICAgIGVsc2UgZE1vZGUuc3RvcERlYnVnTGlzdGVuZXIoKTtcclxuICAgICAgICB9XHJcblxyXG4gICAgICAgIGlmIChpZCA9PSBcImZvcmstZG0tMVwiKSB7XHJcbiAgICAgICAgICAgIGlmIChlbmFibGVkKSBkTW9kZS5zdGFydENvcHlTZWxlY3RvcigpO1xyXG4gICAgICAgICAgICBlbHNlIGRNb2RlLnN0b3BDb3B5U2VsZWN0b3IoKTtcclxuICAgICAgICB9XHJcblxyXG4gICAgICAgIGlmIChpZCA9PT0gXCJyZWFjdERldlRvb2xzXCIpIHtcclxuICAgICAgICAgICAgaWYgKGVuYWJsZWQpIHJlYWN0RGV2VG9vbHMuc3RhcnQoKTtcclxuICAgICAgICAgICAgZWxzZSByZWFjdERldlRvb2xzLnN0b3AoKTtcclxuICAgICAgICB9XHJcbiAgICAgICAgaWYgKGlkID09PSBcImxpZ2h0Y29yZC0xXCIpIHtcclxuICAgICAgICAgICAgaWYgKGVuYWJsZWQpIHdpbmRvdy5MaWdodGNvcmQuU2V0dGluZ3MuZGV2TW9kZSA9IHRydWVcclxuICAgICAgICAgICAgZWxzZSB3aW5kb3cuTGlnaHRjb3JkLlNldHRpbmdzLmRldk1vZGUgPSBmYWxzZVxyXG4gICAgICAgIH1cclxuICAgICAgICBpZiAoaWQgPT09IFwibGlnaHRjb3JkLTJcIikge1xyXG4gICAgICAgICAgICBpZiAoZW5hYmxlZCkgd2luZG93LkxpZ2h0Y29yZC5TZXR0aW5ncy5jYWxsUmluZ2luZ0JlYXQgPSB0cnVlXHJcbiAgICAgICAgICAgIGVsc2Ugd2luZG93LkxpZ2h0Y29yZC5TZXR0aW5ncy5jYWxsUmluZ2luZ0JlYXQgPSBmYWxzZVxyXG4gICAgICAgIH1cclxuICAgICAgICBpZiAoaWQgPT09IFwibGlnaHRjb3JkLXByZXNlbmNlLTFcIikge1xyXG4gICAgICAgICAgICBpZiAoZW5hYmxlZCkge1xyXG4gICAgICAgICAgICAgICAgQ3VzdG9tUmljaFByZXNlbmNlLmVuYWJsZSgpXHJcbiAgICAgICAgICAgICAgICBjb25zdCBzZXR0aW5nc1N0b3JlID0gQkRNb2R1bGVzLmdldChlID0+IGUuZGVmYXVsdCAmJiB0eXBlb2YgZS5kZWZhdWx0ID09PSBcIm9iamVjdFwiICYmIFwic2hvd0N1cnJlbnRHYW1lXCIgaW4gZS5kZWZhdWx0KVswXVxyXG4gICAgICAgICAgICAgICAgaWYoc2V0dGluZ3NTdG9yZSAmJiAhc2V0dGluZ3NTdG9yZS5kZWZhdWx0LnNob3dDdXJyZW50R2FtZSl7XHJcbiAgICAgICAgICAgICAgICAgICAgQkRNb2R1bGVzLmdldChlID0+IGUuZGVmYXVsdCAmJiBlLmRlZmF1bHQudXBkYXRlUmVtb3RlU2V0dGluZ3MpWzBdLmRlZmF1bHQudXBkYXRlUmVtb3RlU2V0dGluZ3Moe1xyXG4gICAgICAgICAgICAgICAgICAgICAgICBzaG93Q3VycmVudEdhbWU6IHRydWVcclxuICAgICAgICAgICAgICAgICAgICB9KVxyXG4gICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIGVsc2UgQ3VzdG9tUmljaFByZXNlbmNlLmRpc2FibGUoKVxyXG4gICAgICAgIH1cclxuICAgICAgICBpZiAoaWQgPT09IFwibGlnaHRjb3JkLTNcIikge1xyXG4gICAgICAgICAgICBpZiAoZW5hYmxlZCkgcmVtb3RlLmdldEN1cnJlbnRXaW5kb3coKS5zZXRBbHdheXNPblRvcCh0cnVlKVxyXG4gICAgICAgICAgICBlbHNlIHJlbW90ZS5nZXRDdXJyZW50V2luZG93KCkuc2V0QWx3YXlzT25Ub3AoZmFsc2UpXHJcbiAgICAgICAgfVxyXG4gICAgICAgIGlmIChpZCA9PT0gXCJsaWdodGNvcmQtNFwiKSB7XHJcbiAgICAgICAgICAgIGlmKGVuYWJsZWQpe1xyXG4gICAgICAgICAgICAgICAgQW50aUFkRE0uZW5hYmxlKClcclxuICAgICAgICAgICAgfWVsc2V7XHJcbiAgICAgICAgICAgICAgICBBbnRpQWRETS5kaXNhYmxlKClcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgIH1cclxuICAgICAgICBpZiAoaWQgPT09IFwibGlnaHRjb3JkLTZcIikge1xyXG4gICAgICAgICAgICBpZihlbmFibGVkKXtcclxuICAgICAgICAgICAgICAgIGJsdXJQcml2YXRlLmVuYWJsZSgpXHJcbiAgICAgICAgICAgIH1lbHNle1xyXG4gICAgICAgICAgICAgICAgYmx1clByaXZhdGUuZGlzYWJsZSgpXHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICB9XHJcbiAgICAgICAgaWYgKGlkID09PSBcImxpZ2h0Y29yZC03XCIpIHtcclxuICAgICAgICAgICAgaWYoZW5hYmxlZCl7XHJcbiAgICAgICAgICAgICAgICBkaXNhYmxlVHlwaW5nLmVuYWJsZSgpXHJcbiAgICAgICAgICAgIH1lbHNle1xyXG4gICAgICAgICAgICAgICAgZGlzYWJsZVR5cGluZy5kaXNhYmxlKClcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgIH1cclxuXHJcbiAgICAgICAgdGhpcy5zYXZlU2V0dGluZ3MoKTtcclxuICAgIH1cclxuXHJcbiAgICBhc3luYyBpbml0aWFsaXplU2V0dGluZ3MoKSB7XHJcbiAgICAgICAgaWYgKHNldHRpbmdzQ29va2llLnJlYWN0RGV2VG9vbHMpIHJlYWN0RGV2VG9vbHMuc3RhcnQoKTtcclxuICAgICAgICBpZiAoc2V0dGluZ3NDb29raWVbXCJiZGEtZ3MtMlwiXSkgRE9NLmFkZENsYXNzKGRvY3VtZW50LmJvZHksIFwiYmQtbWluaW1hbFwiKTtcclxuICAgICAgICBpZiAoc2V0dGluZ3NDb29raWVbXCJiZGEtZ3MtM1wiXSkgRE9NLmFkZENsYXNzKGRvY3VtZW50LmJvZHksIFwiYmQtbWluaW1hbC1jaGFuXCIpO1xyXG4gICAgICAgIGlmIChzZXR0aW5nc0Nvb2tpZVtcImJkYS1ncy0xXCJdKSBwdWJsaWNTZXJ2ZXJzTW9kdWxlLmFkZEJ1dHRvbigpO1xyXG4gICAgICAgIGlmIChzZXR0aW5nc0Nvb2tpZVtcImJkYS1ncy00XCJdKSB2b2ljZU1vZGUuc3RhcnQoKTtcclxuICAgICAgICBpZiAoc2V0dGluZ3NDb29raWVbXCJiZGEtZ3MtNVwiXSkgRE9NLmFkZENsYXNzKERPTS5xdWVyeShcIiNhcHAtbW91bnRcIiksIFwiYmRhLWRhcmtcIik7XHJcbiAgICAgICAgaWYgKHNldHRpbmdzQ29va2llW1wiYmRhLWdzLTZcIl0pIHRmSG91ci5pbmplY3QyNEhvdXIoKTtcclxuICAgICAgICBpZiAoc2V0dGluZ3NDb29raWVbXCJiZGEtZ3MtN1wiXSkgY29sb3JlZFRleHQuaW5qZWN0Q29sb3JlZFRleHQoKTtcclxuICAgICAgICBpZiAoc2V0dGluZ3NDb29raWVbXCJmb3JrLXBzLTRcIl0pIENsYXNzTm9ybWFsaXplci5zdGFydCgpO1xyXG4gICAgICAgIGlmIChzZXR0aW5nc0Nvb2tpZVtcImxpZ2h0Y29yZC0xXCJdKSB3aW5kb3cuTGlnaHRjb3JkLlNldHRpbmdzLmRldk1vZGUgPSB0cnVlXHJcbiAgICAgICAgaWYgKHNldHRpbmdzQ29va2llW1wibGlnaHRjb3JkLTJcIl0pIHdpbmRvdy5MaWdodGNvcmQuU2V0dGluZ3MuY2FsbFJpbmdpbmdCZWF0ID0gdHJ1ZVxyXG4gICAgICAgIGlmIChzZXR0aW5nc0Nvb2tpZVtcImxpZ2h0Y29yZC1wcmVzZW5jZS0xXCJdKSBDdXN0b21SaWNoUHJlc2VuY2UuZW5hYmxlKClcclxuICAgICAgICBpZiAoc2V0dGluZ3NDb29raWVbXCJsaWdodGNvcmQtM1wiXSkgcmVtb3RlLmdldEN1cnJlbnRXaW5kb3coKS5zZXRBbHdheXNPblRvcCh0cnVlKVxyXG4gICAgICAgIGlmIChzZXR0aW5nc0Nvb2tpZVtcImxpZ2h0Y29yZC00XCJdKSBBbnRpQWRETS5lbmFibGUoKVxyXG4gICAgICAgIGlmIChzZXR0aW5nc0Nvb2tpZVtcImxpZ2h0Y29yZC02XCJdKSBibHVyUHJpdmF0ZS5lbmFibGUoKVxyXG4gICAgICAgIGlmIChzZXR0aW5nc0Nvb2tpZVtcImxpZ2h0Y29yZC03XCJdKSBkaXNhYmxlVHlwaW5nLmVuYWJsZSgpXHJcblxyXG4gICAgICAgIGlmIChzZXR0aW5nc0Nvb2tpZVtcImZvcmstcHMtNVwiXSkge1xyXG4gICAgICAgICAgICBDb250ZW50TWFuYWdlci53YXRjaENvbnRlbnQoXCJwbHVnaW5cIik7XHJcbiAgICAgICAgICAgIENvbnRlbnRNYW5hZ2VyLndhdGNoQ29udGVudChcInRoZW1lXCIpO1xyXG4gICAgICAgIH1cclxuXHJcbiAgICAgICAgaWYgKHNldHRpbmdzQ29va2llW1wiYmRhLWdzLThcIl0pIGRNb2RlLnN0YXJ0RGVidWdMaXN0ZW5lcigpO1xyXG4gICAgICAgIGlmIChzZXR0aW5nc0Nvb2tpZVtcImZvcmstZG0tMVwiXSkgZE1vZGUuc3RhcnRDb3B5U2VsZWN0b3IoKTtcclxuXHJcbiAgICAgICAgdGhpcy5zYXZlU2V0dGluZ3MoKTtcclxuICAgIH1cclxuXHJcbiAgICBzYXZlU2V0dGluZ3MoKSB7XHJcbiAgICAgICAgRGF0YVN0b3JlLnNldFNldHRpbmdHcm91cChcInNldHRpbmdzXCIsIHNldHRpbmdzQ29va2llKTtcclxuICAgICAgICBEYXRhU3RvcmUuc2V0U2V0dGluZ0dyb3VwKFwicnBjXCIsIHNldHRpbmdzUlBDKTtcclxuICAgIH1cclxuXHJcbiAgICBsb2FkU2V0dGluZ3MoKSB7XHJcbiAgICAgICAgT2JqZWN0LmFzc2lnbihzZXR0aW5nc0Nvb2tpZSwgRGF0YVN0b3JlLmdldFNldHRpbmdHcm91cChcInNldHRpbmdzXCIpKTtcclxuICAgICAgICBPYmplY3QuYXNzaWduKHNldHRpbmdzUlBDLCBEYXRhU3RvcmUuZ2V0U2V0dGluZ0dyb3VwKFwicnBjXCIpKTtcclxuICAgIH1cclxuXHJcbiAgICByZW5kZXJTaWRlYmFyKCkge1xyXG4gICAgICAgIHJldHVybiB0aGlzLnNpZGViYXIucmVuZGVyKCk7XHJcbiAgICB9XHJcblxyXG4gICAgY29yZUNvbXBvbmVudCgpIHtcclxuICAgICAgICByZXR1cm4gQkRWMi5yZWFjdC5jcmVhdGVFbGVtZW50KFNlY3Rpb25lZFNldHRpbmdzUGFuZWwsIHtrZXk6IFwiY3NwYW5lbFwiLCBvbkNoYW5nZTogdGhpcy5vbkNoYW5nZSwgc2VjdGlvbnM6IHRoaXMuY29yZVNldHRpbmdzfSlcclxuICAgIH1cclxuXHJcbiAgICBsaWdodGNvcmRDb21wb25lbnQoKSB7XHJcbiAgICAgICAgcmV0dXJuIFtcclxuICAgICAgICAgICAgdGhpcy5saWdodGNvcmRTZXR0aW5ncy5tYXAoKHNlY3Rpb24sIGkpID0+IHtcclxuICAgICAgICAgICAgICAgIHJldHVybiBbXHJcbiAgICAgICAgICAgICAgICAgICAgKGkgPT09IDAgPyBudWxsIDogQkRWMi5yZWFjdC5jcmVhdGVFbGVtZW50KE1hcmdpblRvcCkpLFxyXG4gICAgICAgICAgICAgICAgICAgIEJEVjIucmVhY3QuY3JlYXRlRWxlbWVudChcImgyXCIsIHtjbGFzc05hbWU6IFwidWktZm9ybS10aXRsZSBoMiBtYXJnaW4tcmVzZXQgbWFyZ2luLWJvdHRvbS0yMFwifSwgc2VjdGlvbi50aXRsZSksXHJcbiAgICAgICAgICAgICAgICAgICAgc2VjdGlvbi5zZXR0aW5ncy5tYXAoc2V0dGluZyA9PiB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBCRFYyLnJlYWN0LmNyZWF0ZUVsZW1lbnQoU3dpdGNoLCB7aWQ6IHNldHRpbmcuaWQsIGtleTogc2V0dGluZy5pZCwgZGF0YTogc2V0dGluZywgY2hlY2tlZDogc2V0dGluZ3NDb29raWVbc2V0dGluZy5pZF0sIG9uQ2hhbmdlOiAoaWQsIGNoZWNrZWQpID0+IHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMub25DaGFuZ2UoaWQsIGNoZWNrZWQpO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICB9fSlcclxuICAgICAgICAgICAgICAgICAgICB9KVxyXG4gICAgICAgICAgICAgICAgXVxyXG4gICAgICAgICAgICB9KSwgXHJcbiAgICAgICAgICAgIEJEVjIucmVhY3QuY3JlYXRlRWxlbWVudCh3aW5kb3cuTGlnaHRjb3JkLkFwaS5Db21wb25lbnRzLmlucHV0cy5CdXR0b24sIHtjb2xvcjogXCJ5ZWxsb3dcIiwgb25DbGljaygpe1xyXG4gICAgICAgICAgICAgICAgY29uc29sZS5sb2coXCJTaG91bGQgcmVsYXVuY2hcIilcclxuICAgICAgICAgICAgICAgIHJlbW90ZS5hcHAucmVsYXVuY2goe1xyXG4gICAgICAgICAgICAgICAgICAgIGFyZ3M6IHJlbW90ZS5wcm9jZXNzLmFyZ3Yuc2xpY2UoMSkuY29uY2F0KFtcIi0tZGlzYWJsZS1iZXR0ZXJkaXNjb3JkXCJdKVxyXG4gICAgICAgICAgICAgICAgfSlcclxuICAgICAgICAgICAgICAgIHJlbW90ZS5hcHAucXVpdCgpXHJcbiAgICAgICAgICAgIH19LCBcIlJlbGF1bmNoIHdpdGhvdXQgQmV0dGVyRGlzY29yZFwiKVxyXG4gICAgICAgIF1cclxuICAgIH1cclxuXHJcbiAgICBQcmVzZW5jZUNvbXBvbmVudCgpIHtcclxuICAgICAgICByZXR1cm4gQkRWMi5yZWFjdC5jcmVhdGVFbGVtZW50KFYyQ19QcmVzZW5jZVNldHRpbmdzLCB7XHJcbiAgICAgICAgICAgIGtleTogXCJscHBhbm5lbFwiLFxyXG4gICAgICAgICAgICBvbkNoYW5nZTogdGhpcy5vbkNoYW5nZSwgXHJcbiAgICAgICAgICAgIHNldHRpbmdzOiB0aGlzLlByZXNlbmNlU2V0dGluZ3NcclxuICAgICAgICB9KVxyXG4gICAgfVxyXG5cclxuICAgIEFjY291bnRJbmZvc0NvbXBvbmVudCgpIHtcclxuICAgICAgICByZXR1cm4gQkRWMi5yZWFjdC5jcmVhdGVFbGVtZW50KFYyQ19BY2NvdW50SW5mb3MsIHtcclxuICAgICAgICAgICAga2V5OiBcImxhcGFubmVsXCJcclxuICAgICAgICB9KVxyXG4gICAgfVxyXG5cclxuICAgIEFwaVByZXZpZXdDb21wb25lbnQoKSB7XHJcbiAgICAgICAgcmV0dXJuIEJEVjIucmVhY3QuY3JlYXRlRWxlbWVudChBcGlQcmV2aWV3LCB7XHJcbiAgICAgICAgICAgIGtleTogXCJsYXBpcGFubmVsXCJcclxuICAgICAgICB9KVxyXG4gICAgfVxyXG5cclxuICAgIGN1c3RvbUNzc0NvbXBvbmVudCgpIHtcclxuICAgICAgICByZXR1cm4gQkRWMi5yZWFjdC5jcmVhdGVFbGVtZW50KENzc0VkaXRvciwge2tleTogXCJjc3NlZGl0b3JcIn0pXHJcbiAgICB9XHJcblxyXG4gICAgcmVuZGVyQWRkb25QYW5lKHR5cGUpIHtcclxuICAgICAgICAvLyBJIGtub3cgdGhpcyBzaG91bGRuJ3QgYmUgaGVyZSwgYnV0IHdoZW4gaXQgaXNuJ3QsXHJcbiAgICAgICAgLy8gUmVhY3QgcmVmdXNlcyB0byBjaGFuZ2UgdGhlIGJ1dHRvbiB3aGVuIGdvaW5nXHJcbiAgICAgICAgLy8gYmV0d2VlbiBwbHVnaW5zIGFuZCB0aGVtZXMgcGFnZS4uLiBzb21ldGhpbmdcclxuICAgICAgICAvLyB0byBkZWJ1ZyBsYXRlci5cclxuICAgICAgICBjbGFzcyBDb250ZW50TGlzdCBleHRlbmRzIEJEVjIucmVhY3QuQ29tcG9uZW50IHtcclxuICAgICAgICAgICAgY29uc3RydWN0b3IocHJvcHMpIHtcclxuICAgICAgICAgICAgICAgIHN1cGVyKHByb3BzKTtcclxuICAgICAgICAgICAgICAgIHRoaXMucHJlZml4ID0gdGhpcy5wcm9wcy50eXBlLnJlcGxhY2UoXCJzXCIsIFwiXCIpO1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgXHJcbiAgICAgICAgICAgIG9uQ2hhbmdlKCkge1xyXG4gICAgICAgICAgICAgICAgdGhpcy5wcm9wcy5vbkNoYW5nZSh0aGlzLnByb3BzLnR5cGUpO1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgXHJcbiAgICAgICAgICAgIHJlbmRlcigpIHtyZXR1cm4gdGhpcy5wcm9wcy5jaGlsZHJlbjt9XHJcbiAgICAgICAgfVxyXG4gICAgICAgIGNvbnN0IG9yaWdpbmFsUmVuZGVyID0gQ29udGVudExpc3QucHJvdG90eXBlLnJlbmRlcjtcclxuICAgICAgICBPYmplY3QuZGVmaW5lUHJvcGVydHkoQ29udGVudExpc3QucHJvdG90eXBlLCBcInJlbmRlclwiLCB7XHJcbiAgICAgICAgICAgIGVudW1lcmFibGU6IGZhbHNlLFxyXG4gICAgICAgICAgICBjb25maWd1cmFibGU6IGZhbHNlLFxyXG4gICAgICAgICAgICBzZXQ6IGZ1bmN0aW9uKCkge2NvbnNvbGUud2FybihcIkFkZG9uIHBvbGljeSBmb3IgcGx1Z2lucyAjNSBodHRwczovL2dpdGh1Yi5jb20vcmF1ZW56aS9CZXR0ZXJEaXNjb3JkQXBwL3dpa2kvQWRkb24tUG9saWNpZXMjcGx1Z2luc1wiKTt9LFxyXG4gICAgICAgICAgICBnZXQ6ICgpID0+IG9yaWdpbmFsUmVuZGVyXHJcbiAgICAgICAgfSk7XHJcbiAgICAgICAgcmV0dXJuIGZ1bmN0aW9uKCl7XHJcbiAgICAgICAgICAgIHJldHVybiBCRFYyLnJlYWN0LmNyZWF0ZUVsZW1lbnQoQ29udGVudExpc3QsIHt0eXBlfSwgQkRWMi5yZWFjdC5jcmVhdGVFbGVtZW50KENhcmRMaXN0LCB7dHlwZX0pKVxyXG4gICAgICAgIH1cclxuICAgIH1cclxufTtcclxuXHJcbmZ1bmN0aW9uIG1ha2VDb21wb25lbnQoY2hpbGRyZW4pe1xyXG4gICAgY2xhc3MgU2V0dGluZ0NvbXBvbmVudCBleHRlbmRzIFJlYWN0LkNvbXBvbmVudCB7XHJcbiAgICAgICAgcmVuZGVyKCl7XHJcbiAgICAgICAgICAgIHJldHVybiBjaGlsZHJlbigpXHJcbiAgICAgICAgfVxyXG4gICAgfVxyXG4gICAgcmV0dXJuIFNldHRpbmdDb21wb25lbnRcclxufSIsImltcG9ydCB7YmJkQ2hhbmdlbG9nLCBMQ0NoYW5lbG9nfSBmcm9tIFwiLi4vMGdsb2JhbHNcIjtcclxuaW1wb3J0IFV0aWxzIGZyb20gXCIuL3V0aWxzXCI7XHJcbmltcG9ydCBCRFYyIGZyb20gXCIuL3YyXCI7XHJcbmltcG9ydCBET00gZnJvbSBcIi4vZG9tdG9vbHNcIjtcclxuXHJcbmltcG9ydCBTaWRlQmFyIGZyb20gXCIuLi91aS9zaWRlYmFyXCI7XHJcbmltcG9ydCBIaXN0b3J5IGZyb20gXCIuLi91aS9pY29ucy9oaXN0b3J5XCI7XHJcbmltcG9ydCBUb29sdGlwV3JhcCBmcm9tIFwiLi4vdWkvdG9vbHRpcFdyYXBcIjtcclxuXHJcbmV4cG9ydCBkZWZhdWx0IGNsYXNzIFYyX1NldHRpbmdzUGFuZWxfU2lkZWJhciB7XHJcblxyXG4gICAgY29uc3RydWN0b3IoKSB7XHJcbiAgICAgICAgdGhpcy5wYW5lbHMgPSB7fVxyXG4gICAgfVxyXG5cclxuICAgIHJlZ2lzdGVyKHBhbmVsLCBjb21wb25lbnQpe1xyXG4gICAgICAgIHRoaXMucGFuZWxzW3BhbmVsXSA9IGNvbXBvbmVudFxyXG4gICAgfVxyXG5cclxuICAgIGdldENvbXBvbmVudChwYW5lbCl7XHJcbiAgICAgICAgcmV0dXJuIHRoaXMucGFuZWxzW3BhbmVsXVxyXG4gICAgfVxyXG5cclxuICAgIGdldCBpdGVtcygpIHtcclxuICAgICAgICByZXR1cm4gW3tcclxuICAgICAgICAgICAgdGV4dDogXCJCZXR0ZXJEaXNjb3JkIFNldHRpbmdzXCIsIFxyXG4gICAgICAgICAgICBpZDogXCJjb3JlXCJcclxuICAgICAgICB9LCB7XHJcbiAgICAgICAgICAgIHRleHQ6IFwiUGx1Z2luc1wiLCBcclxuICAgICAgICAgICAgaWQ6IFwicGx1Z2luc1wiXHJcbiAgICAgICAgfSwge1xyXG4gICAgICAgICAgICB0ZXh0OiBcIlRoZW1lc1wiLCBcclxuICAgICAgICAgICAgaWQ6IFwidGhlbWVzXCJcclxuICAgICAgICB9LCB7XHJcbiAgICAgICAgICAgIHRleHQ6IFwiQ3VzdG9tIENTU1wiLCBcclxuICAgICAgICAgICAgaWQ6IFwiY3VzdG9tY3NzXCJcclxuICAgICAgICB9XTtcclxuICAgIH1cclxuXHJcbiAgICBnZXQgTENpdGVtcygpe1xyXG4gICAgICAgIGxldCBpdGVtcyA9IFtcclxuICAgICAgICAgICAge1xyXG4gICAgICAgICAgICAgICAgdGV4dDogXCJMaWdodGNvcmQgU2V0dGluZ3NcIixcclxuICAgICAgICAgICAgICAgIGlkOiBcImxpZ2h0Y29yZFwiXHJcbiAgICAgICAgICAgIH0sIHtcclxuICAgICAgICAgICAgICAgIHRleHQ6IFwiUmljaFByZXNlbmNlXCIsIFxyXG4gICAgICAgICAgICAgICAgaWQ6IFwic3RhdHVzXCJcclxuICAgICAgICAgICAgfSwge1xyXG4gICAgICAgICAgICAgICAgdGV4dDogXCJBY2NvdW50IEluZm9cIixcclxuICAgICAgICAgICAgICAgIGlkOiBcImFjY291bnRpbmZvXCJcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgIF1cclxuICAgICAgICBpZighIXdpbmRvdy5MaWdodGNvcmQuU2V0dGluZ3MuZGV2TW9kZSlpdGVtcy5wdXNoKHtcclxuICAgICAgICAgICAgdGV4dDogXCJBcGkgQ29tcG9uZW50cyBQcmV2aWV3XCIsXHJcbiAgICAgICAgICAgIGlkOiBcImxjYXBpcHJldmlld1wiXHJcbiAgICAgICAgfSlcclxuICAgICAgICByZXR1cm4gaXRlbXNcclxuICAgIH1cclxuXHJcbiAgICByZW5kZXIoKSB7XHJcbiAgICAgICAgcmV0dXJuIFtcclxuICAgICAgICAgICAge1xyXG4gICAgICAgICAgICAgICAgc2VjdGlvbjogXCJIRUFERVJcIixcclxuICAgICAgICAgICAgICAgIGxhYmVsOiBcIkxpZ2h0Y29yZFwiXHJcbiAgICAgICAgICAgIH0sXHJcbiAgICAgICAgICAgIC4uLnRoaXMuTENpdGVtcy5tYXAoZSA9PiB7XHJcbiAgICAgICAgICAgICAgICByZXR1cm4ge1xyXG4gICAgICAgICAgICAgICAgICAgIHNlY3Rpb246IGUuaWQsXHJcbiAgICAgICAgICAgICAgICAgICAgbGFiZWw6IGUudGV4dCxcclxuICAgICAgICAgICAgICAgICAgICBlbGVtZW50OiB0aGlzLmdldENvbXBvbmVudChlLmlkKVxyXG4gICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICB9KSxcclxuICAgICAgICAgICAge1xyXG4gICAgICAgICAgICAgICAgc2VjdGlvbjogXCJESVZJREVSXCJcclxuICAgICAgICAgICAgfSxcclxuICAgICAgICAgICAge1xyXG4gICAgICAgICAgICAgICAgc2VjdGlvbjogXCJIRUFERVJcIixcclxuICAgICAgICAgICAgICAgIGxhYmVsOiBcIkJhbmRhZ2VkIEJEXCJcclxuICAgICAgICAgICAgfSxcclxuICAgICAgICAgICAgLi4udGhpcy5pdGVtcy5tYXAoZSA9PiB7XHJcbiAgICAgICAgICAgICAgICByZXR1cm4ge1xyXG4gICAgICAgICAgICAgICAgICAgIHNlY3Rpb246IGUuaWQsXHJcbiAgICAgICAgICAgICAgICAgICAgbGFiZWw6IGUudGV4dCxcclxuICAgICAgICAgICAgICAgICAgICBlbGVtZW50OiB0aGlzLmdldENvbXBvbmVudChlLmlkKVxyXG4gICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICB9KSxcclxuICAgICAgICAgICAge1xyXG4gICAgICAgICAgICAgICAgc2VjdGlvbjogXCJESVZJREVSXCJcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgIF1cclxuICAgIH1cclxufSIsImltcG9ydCB7YmR0aGVtZUVycm9ycywgdGhlbWVDb29raWUsIHNldHRpbmdzQ29va2llLCBiZHRoZW1lc30gZnJvbSBcIi4uLzBnbG9iYWxzXCI7XHJcbmltcG9ydCBDb250ZW50TWFuYWdlciBmcm9tIFwiLi9jb250ZW50TWFuYWdlclwiO1xyXG5pbXBvcnQgRGF0YVN0b3JlIGZyb20gXCIuL2RhdGFTdG9yZVwiO1xyXG5pbXBvcnQgQkRFdmVudHMgZnJvbSBcIi4vYmRFdmVudHNcIjtcclxuaW1wb3J0IFV0aWxzIGZyb20gXCIuL3V0aWxzXCI7XHJcbmltcG9ydCBET00gZnJvbSBcIi4vZG9tdG9vbHNcIjtcclxuXHJcbmNsYXNzIFRoZW1lTW9kdWxlIHtcclxuICAgIGdldCBmb2xkZXIoKSB7cmV0dXJuIENvbnRlbnRNYW5hZ2VyLnRoZW1lc0ZvbGRlcjt9XHJcbn1cclxuXHJcblRoZW1lTW9kdWxlLnByb3RvdHlwZS5sb2FkVGhlbWVzID0gYXN5bmMgZnVuY3Rpb24gKCkge1xyXG4gICAgdGhpcy5sb2FkVGhlbWVEYXRhKCk7XHJcbiAgICBiZHRoZW1lRXJyb3JzLnNwbGljZSgwLCAwLCAuLi4oYXdhaXQgQ29udGVudE1hbmFnZXIubG9hZFRoZW1lcygpKSk7XHJcbiAgICBjb25zdCB0aGVtZXMgPSBPYmplY3Qua2V5cyhiZHRoZW1lcyk7XHJcblxyXG4gICAgZm9yIChsZXQgaSA9IDA7IGkgPCB0aGVtZXMubGVuZ3RoOyBpKyspIHtcclxuICAgICAgICBjb25zdCB0aGVtZSA9IGJkdGhlbWVzW3RoZW1lc1tpXV07XHJcbiAgICAgICAgaWYgKCF0aGVtZUNvb2tpZVt0aGVtZS5uYW1lXSkgdGhlbWVDb29raWVbdGhlbWUubmFtZV0gPSBmYWxzZTtcclxuICAgICAgICBpZiAodGhlbWVDb29raWVbdGhlbWUubmFtZV0pIERPTS5hZGRTdHlsZShET00uZXNjYXBlSUQodGhlbWUuaWQpLCB1bmVzY2FwZSh0aGVtZS5jc3MpKTtcclxuXHJcbiAgICAgICAgYXdhaXQgbmV3IFByb21pc2UoKHJlc29sdmUpID0+IHNldFRpbWVvdXQocmVzb2x2ZSwgMTApKVxyXG4gICAgfVxyXG4gICAgZm9yIChjb25zdCB0aGVtZSBpbiB0aGVtZUNvb2tpZSkge1xyXG4gICAgICAgIGlmICghYmR0aGVtZXNbdGhlbWVdKSBkZWxldGUgdGhlbWVDb29raWVbdGhlbWVdO1xyXG4gICAgfVxyXG4gICAgdGhpcy5zYXZlVGhlbWVEYXRhKCk7XHJcbiAgICAvLyBpZiAoc2V0dGluZ3NDb29raWVbXCJmb3JrLXBzLTVcIl0pIENvbnRlbnRNYW5hZ2VyLndhdGNoQ29udGVudChcInRoZW1lXCIpO1xyXG59O1xyXG5cclxuVGhlbWVNb2R1bGUucHJvdG90eXBlLmVuYWJsZVRoZW1lID0gZnVuY3Rpb24obmFtZSwgcmVsb2FkID0gZmFsc2UpIHtcclxuICAgIHRoZW1lQ29va2llW25hbWVdID0gdHJ1ZTtcclxuICAgIHRoaXMuc2F2ZVRoZW1lRGF0YSgpO1xyXG4gICAgY29uc3QgdGhlbWUgPSBiZHRoZW1lc1tuYW1lXTtcclxuICAgIERPTS5hZGRTdHlsZShET00uZXNjYXBlSUQodGhlbWUuaWQpLCB1bmVzY2FwZSh0aGVtZS5jc3MpKTtcclxuICAgIGlmIChzZXR0aW5nc0Nvb2tpZVtcImZvcmstcHMtMlwiXSAmJiAhcmVsb2FkKSBVdGlscy5zaG93VG9hc3QoYCR7dGhlbWUubmFtZX0gdiR7dGhlbWUudmVyc2lvbn0gaGFzIGJlZW4gYXBwbGllZC5gKTtcclxufTtcclxuXHJcblRoZW1lTW9kdWxlLnByb3RvdHlwZS5lbmFibGUgPSBmdW5jdGlvbiAobmFtZSwgcmVsb2FkID0gZmFsc2UpIHtcclxuICAgIHJldHVybiB0aGlzLmVuYWJsZVRoZW1lKG5hbWUsIHJlbG9hZCk7XHJcbn07XHJcblxyXG5UaGVtZU1vZHVsZS5wcm90b3R5cGUuZGlzYWJsZVRoZW1lID0gZnVuY3Rpb24obmFtZSwgcmVsb2FkID0gZmFsc2UpIHtcclxuICAgIHRoZW1lQ29va2llW25hbWVdID0gZmFsc2U7XHJcbiAgICB0aGlzLnNhdmVUaGVtZURhdGEoKTtcclxuICAgIGNvbnN0IHRoZW1lID0gYmR0aGVtZXNbbmFtZV07XHJcbiAgICBET00ucmVtb3ZlU3R5bGUoRE9NLmVzY2FwZUlEKHRoZW1lLmlkKSk7XHJcbiAgICBpZiAoc2V0dGluZ3NDb29raWVbXCJmb3JrLXBzLTJcIl0gJiYgIXJlbG9hZCkgVXRpbHMuc2hvd1RvYXN0KGAke3RoZW1lLm5hbWV9IHYke3RoZW1lLnZlcnNpb259IGhhcyBiZWVuIGRpc2FibGVkLmApO1xyXG59O1xyXG5cclxuVGhlbWVNb2R1bGUucHJvdG90eXBlLmRpc2FibGUgPSBmdW5jdGlvbiAobmFtZSwgcmVsb2FkID0gZmFsc2UpIHtcclxuICAgIHJldHVybiB0aGlzLmRpc2FibGVUaGVtZShuYW1lLCByZWxvYWQpO1xyXG59O1xyXG5cclxuVGhlbWVNb2R1bGUucHJvdG90eXBlLnRvZ2dsZVRoZW1lID0gZnVuY3Rpb24odGhlbWUpIHtcclxuICAgIGlmICh0aGVtZUNvb2tpZVt0aGVtZV0pIHRoaXMuZGlzYWJsZVRoZW1lKHRoZW1lKTtcclxuICAgIGVsc2UgdGhpcy5lbmFibGVUaGVtZSh0aGVtZSk7XHJcbn07XHJcblxyXG5UaGVtZU1vZHVsZS5wcm90b3R5cGUudG9nZ2xlID0gZnVuY3Rpb24gKG5hbWUsIHJlbG9hZCA9IGZhbHNlKSB7XHJcbiAgICByZXR1cm4gdGhpcy50b2dnbGVUaGVtZShuYW1lLCByZWxvYWQpO1xyXG59O1xyXG5cclxuVGhlbWVNb2R1bGUucHJvdG90eXBlLmxvYWRUaGVtZSA9IGFzeW5jIGZ1bmN0aW9uKGZpbGVuYW1lKSB7XHJcbiAgICBjb25zdCBlcnJvciA9IGF3YWl0IENvbnRlbnRNYW5hZ2VyLmxvYWRDb250ZW50KGZpbGVuYW1lLCBcInRoZW1lXCIpO1xyXG4gICAgaWYgKGVycm9yKSB7XHJcbiAgICAgICAgaWYgKHNldHRpbmdzQ29va2llW1wiZm9yay1wcy0xXCJdKSBVdGlscy5zaG93Q29udGVudEVycm9ycyh7dGhlbWVzOiBbZXJyb3JdfSk7XHJcbiAgICAgICAgaWYgKHNldHRpbmdzQ29va2llW1wiZm9yay1wcy0yXCJdKSBVdGlscy5zaG93VG9hc3QoYCR7ZmlsZW5hbWV9IGNvdWxkIG5vdCBiZSBsb2FkZWQuIEl0IG1heSBub3QgaGF2ZSBiZWVuIGxvYWRlZC5gLCB7dHlwZTogXCJlcnJvclwifSk7XHJcbiAgICAgICAgcmV0dXJuIFV0aWxzLmVycihcIkNvbnRlbnRNYW5hZ2VyXCIsIGAke2ZpbGVuYW1lfSBjb3VsZCBub3QgYmUgbG9hZGVkLmAsIGVycm9yKTtcclxuICAgIH1cclxuICAgIGNvbnN0IHRoZW1lID0gT2JqZWN0LnZhbHVlcyhiZHRoZW1lcykuZmluZChwID0+IHAuZmlsZW5hbWUgPT0gZmlsZW5hbWUpO1xyXG4gICAgVXRpbHMubG9nKFwiQ29udGVudE1hbmFnZXJcIiwgYCR7dGhlbWUubmFtZX0gdiR7dGhlbWUudmVyc2lvbn0gd2FzIGxvYWRlZC5gKTtcclxuICAgIGlmIChzZXR0aW5nc0Nvb2tpZVtcImZvcmstcHMtMlwiXSkgVXRpbHMuc2hvd1RvYXN0KGAke3RoZW1lLm5hbWV9IHYke3RoZW1lLnZlcnNpb259IHdhcyBsb2FkZWQuYCwge3R5cGU6IFwic3VjY2Vzc1wifSk7XHJcbiAgICBCREV2ZW50cy5kaXNwYXRjaChcInRoZW1lLWxvYWRlZFwiLCB0aGVtZS5uYW1lKTtcclxufTtcclxuXHJcblRoZW1lTW9kdWxlLnByb3RvdHlwZS51bmxvYWRUaGVtZSA9IGZ1bmN0aW9uKGZpbGVuYW1lT3JOYW1lKSB7XHJcbiAgICBjb25zdCBiZHRoZW1lID0gT2JqZWN0LnZhbHVlcyhiZHRoZW1lcykuZmluZChwID0+IHAuZmlsZW5hbWUgPT0gZmlsZW5hbWVPck5hbWUpIHx8IGJkdGhlbWVzW2ZpbGVuYW1lT3JOYW1lXTtcclxuICAgIGlmICghYmR0aGVtZSkgcmV0dXJuO1xyXG4gICAgY29uc3QgdGhlbWUgPSBiZHRoZW1lLm5hbWU7XHJcbiAgICBpZiAodGhlbWVDb29raWVbdGhlbWVdKSB0aGlzLmRpc2FibGVUaGVtZSh0aGVtZSwgdHJ1ZSk7XHJcbiAgICBjb25zdCBlcnJvciA9IENvbnRlbnRNYW5hZ2VyLnVubG9hZENvbnRlbnQoYmR0aGVtZXNbdGhlbWVdLmZpbGVuYW1lLCBcInRoZW1lXCIpO1xyXG4gICAgZGVsZXRlIGJkdGhlbWVzW3RoZW1lXTtcclxuICAgIGlmIChlcnJvcikge1xyXG4gICAgICAgIGlmIChzZXR0aW5nc0Nvb2tpZVtcImZvcmstcHMtMVwiXSkgVXRpbHMuc2hvd0NvbnRlbnRFcnJvcnMoe3RoZW1lczogW2Vycm9yXX0pO1xyXG4gICAgICAgIGlmIChzZXR0aW5nc0Nvb2tpZVtcImZvcmstcHMtMlwiXSkgVXRpbHMuc2hvd1RvYXN0KGAke3RoZW1lfSBjb3VsZCBub3QgYmUgdW5sb2FkZWQuIEl0IG1heSBoYXZlIG5vdCBiZWVuIGxvYWRlZCB5ZXQuYCwge3R5cGU6IFwiZXJyb3JcIn0pO1xyXG4gICAgICAgIHJldHVybiBVdGlscy5lcnIoXCJDb250ZW50TWFuYWdlclwiLCBgJHt0aGVtZX0gY291bGQgbm90IGJlIHVubG9hZGVkLiBJdCBtYXkgaGF2ZSBub3QgYmVlbiBsb2FkZWQgeWV0LmAsIGVycm9yKTtcclxuICAgIH1cclxuICAgIFV0aWxzLmxvZyhcIkNvbnRlbnRNYW5hZ2VyXCIsIGAke3RoZW1lfSB3YXMgdW5sb2FkZWQuYCk7XHJcbiAgICBpZiAoc2V0dGluZ3NDb29raWVbXCJmb3JrLXBzLTJcIl0pIFV0aWxzLnNob3dUb2FzdChgJHt0aGVtZX0gd2FzIHVubG9hZGVkLmAsIHt0eXBlOiBcInN1Y2Nlc3NcIn0pO1xyXG4gICAgQkRFdmVudHMuZGlzcGF0Y2goXCJ0aGVtZS11bmxvYWRlZFwiLCB0aGVtZSk7XHJcbn07XHJcblxyXG5UaGVtZU1vZHVsZS5wcm90b3R5cGUuZGVsZXRlID0gZnVuY3Rpb24oZmlsZW5hbWVPck5hbWUpIHtcclxuICAgIGNvbnN0IGJkcGx1Z2luID0gT2JqZWN0LnZhbHVlcyhiZHRoZW1lcykuZmluZChwID0+IHAuZmlsZW5hbWUgPT0gZmlsZW5hbWVPck5hbWUpIHx8IGJkdGhlbWVzW2ZpbGVuYW1lT3JOYW1lXTtcclxuICAgIGlmICghYmRwbHVnaW4pIHJldHVybjtcclxuICAgIHRoaXMudW5sb2FkVGhlbWUoYmRwbHVnaW4uZmlsZW5hbWUpO1xyXG4gICAgY29uc3QgZnVsbFBhdGggPSByZXF1aXJlKFwicGF0aFwiKS5yZXNvbHZlKENvbnRlbnRNYW5hZ2VyLnBsdWdpbnNGb2xkZXIsIGJkcGx1Z2luLmZpbGVuYW1lKTtcclxuICAgIHJlcXVpcmUoXCJmc1wiKS51bmxpbmtTeW5jKGZ1bGxQYXRoKTtcclxufTtcclxuXHJcblRoZW1lTW9kdWxlLnByb3RvdHlwZS5yZWxvYWRUaGVtZSA9IGFzeW5jIGZ1bmN0aW9uKGZpbGVuYW1lT3JOYW1lKSB7XHJcbiAgICBjb25zdCBiZHRoZW1lID0gT2JqZWN0LnZhbHVlcyhiZHRoZW1lcykuZmluZChwID0+IHAuZmlsZW5hbWUgPT0gZmlsZW5hbWVPck5hbWUpIHx8IGJkdGhlbWVzW2ZpbGVuYW1lT3JOYW1lXTtcclxuICAgIGlmICghYmR0aGVtZSkgcmV0dXJuIHRoaXMubG9hZFRoZW1lKGZpbGVuYW1lT3JOYW1lKTtcclxuICAgIGNvbnN0IHRoZW1lID0gYmR0aGVtZS5uYW1lO1xyXG4gICAgY29uc3QgZXJyb3IgPSBhd2FpdCBDb250ZW50TWFuYWdlci5yZWxvYWRDb250ZW50KGJkdGhlbWVzW3RoZW1lXS5maWxlbmFtZSwgXCJ0aGVtZVwiKTtcclxuICAgIGlmICh0aGVtZUNvb2tpZVt0aGVtZV0pIHRoaXMuZGlzYWJsZVRoZW1lKHRoZW1lLCB0cnVlKSwgdGhpcy5lbmFibGVUaGVtZSh0aGVtZSwgdHJ1ZSk7XHJcbiAgICBpZiAoZXJyb3IpIHtcclxuICAgICAgICBpZiAoc2V0dGluZ3NDb29raWVbXCJmb3JrLXBzLTFcIl0pIFV0aWxzLnNob3dDb250ZW50RXJyb3JzKHt0aGVtZXM6IFtlcnJvcl19KTtcclxuICAgICAgICBpZiAoc2V0dGluZ3NDb29raWVbXCJmb3JrLXBzLTJcIl0pIFV0aWxzLnNob3dUb2FzdChgJHt0aGVtZX0gY291bGQgbm90IGJlIHJlbG9hZGVkLmAsIHt0eXBlOiBcImVycm9yXCJ9KTtcclxuICAgICAgICByZXR1cm4gVXRpbHMuZXJyKFwiQ29udGVudE1hbmFnZXJcIiwgYCR7dGhlbWV9IGNvdWxkIG5vdCBiZSByZWxvYWRlZC5gLCBlcnJvcik7XHJcbiAgICB9XHJcbiAgICBVdGlscy5sb2coXCJDb250ZW50TWFuYWdlclwiLCBgJHt0aGVtZX0gdiR7YmR0aGVtZXNbdGhlbWVdLnZlcnNpb259IHdhcyByZWxvYWRlZC5gKTtcclxuICAgIGlmIChzZXR0aW5nc0Nvb2tpZVtcImZvcmstcHMtMlwiXSkgVXRpbHMuc2hvd1RvYXN0KGAke3RoZW1lfSB2JHtiZHRoZW1lc1t0aGVtZV0udmVyc2lvbn0gd2FzIHJlbG9hZGVkLmAsIHt0eXBlOiBcInN1Y2Nlc3NcIn0pO1xyXG4gICAgQkRFdmVudHMuZGlzcGF0Y2goXCJ0aGVtZS1yZWxvYWRlZFwiLCB0aGVtZSk7XHJcbn07XHJcblxyXG5UaGVtZU1vZHVsZS5wcm90b3R5cGUucmVsb2FkID0gZnVuY3Rpb24obmFtZSkge1xyXG4gICAgcmV0dXJuIHRoaXMucmVsb2FkVGhlbWUobmFtZSk7XHJcbn07XHJcblxyXG5UaGVtZU1vZHVsZS5wcm90b3R5cGUuZWRpdCA9IGZ1bmN0aW9uKGZpbGVuYW1lT3JOYW1lKSB7XHJcbiAgICBjb25zdCBiZHBsdWdpbiA9IE9iamVjdC52YWx1ZXMoYmR0aGVtZXMpLmZpbmQocCA9PiBwLmZpbGVuYW1lID09IGZpbGVuYW1lT3JOYW1lKSB8fCBiZHRoZW1lc1tmaWxlbmFtZU9yTmFtZV07XHJcbiAgICBpZiAoIWJkcGx1Z2luKSByZXR1cm47XHJcbiAgICBjb25zdCBmdWxsUGF0aCA9IHJlcXVpcmUoXCJwYXRoXCIpLnJlc29sdmUoQ29udGVudE1hbmFnZXIudGhlbWVzRm9sZGVyLCBiZHBsdWdpbi5maWxlbmFtZSk7XHJcbiAgICByZXF1aXJlKFwiZWxlY3Ryb25cIikuc2hlbGwub3Blbkl0ZW0oYCR7ZnVsbFBhdGh9YCk7XHJcbn07XHJcblxyXG5UaGVtZU1vZHVsZS5wcm90b3R5cGUudXBkYXRlVGhlbWVMaXN0ID0gZnVuY3Rpb24oKSB7XHJcbiAgICBjb25zdCByZXN1bHRzID0gQ29udGVudE1hbmFnZXIubG9hZE5ld0NvbnRlbnQoXCJ0aGVtZVwiKTtcclxuICAgIGZvciAoY29uc3QgZmlsZW5hbWUgb2YgcmVzdWx0cy5hZGRlZCkgdGhpcy5sb2FkVGhlbWUoZmlsZW5hbWUpO1xyXG4gICAgZm9yIChjb25zdCBuYW1lIG9mIHJlc3VsdHMucmVtb3ZlZCkgdGhpcy51bmxvYWRUaGVtZShuYW1lKTtcclxufTtcclxuXHJcblRoZW1lTW9kdWxlLnByb3RvdHlwZS5sb2FkVGhlbWVEYXRhID0gZnVuY3Rpb24oKSB7XHJcbiAgICBjb25zdCBzYXZlZCA9IERhdGFTdG9yZS5nZXRTZXR0aW5nR3JvdXAoXCJ0aGVtZXNcIik7XHJcbiAgICBpZiAoc2F2ZWQpIHtcclxuICAgICAgICBPYmplY3QuYXNzaWduKHRoZW1lQ29va2llLCBzYXZlZCk7XHJcbiAgICB9XHJcbn07XHJcblxyXG5UaGVtZU1vZHVsZS5wcm90b3R5cGUuc2F2ZVRoZW1lRGF0YSA9IGZ1bmN0aW9uICgpIHtcclxuICAgIERhdGFTdG9yZS5zZXRTZXR0aW5nR3JvdXAoXCJ0aGVtZXNcIiwgdGhlbWVDb29raWUpO1xyXG59O1xyXG5cclxuZXhwb3J0IGRlZmF1bHQgbmV3IFRoZW1lTW9kdWxlKCk7IiwiaW1wb3J0IHtiYmRWZXJzaW9uLCBzZXR0aW5nc0Nvb2tpZX0gZnJvbSBcIi4uLzBnbG9iYWxzXCI7XHJcbmltcG9ydCBXZWJwYWNrTW9kdWxlcyBmcm9tIFwiLi93ZWJwYWNrTW9kdWxlc1wiO1xyXG5pbXBvcnQgQkRWMiBmcm9tIFwiLi92MlwiO1xyXG5pbXBvcnQgRE9NIGZyb20gXCIuL2RvbXRvb2xzXCI7XHJcblxyXG5leHBvcnQgZGVmYXVsdCBjbGFzcyBVdGlscyB7XHJcbiAgICAvKiogRG9jdW1lbnQvd2luZG93IHdpZHRoICovXHJcbiAgICBzdGF0aWMgZ2V0IHNjcmVlbldpZHRoKCkgeyByZXR1cm4gTWF0aC5tYXgoZG9jdW1lbnQuZG9jdW1lbnRFbGVtZW50LmNsaWVudFdpZHRoLCB3aW5kb3cuaW5uZXJXaWR0aCB8fCAwKTsgfVxyXG4gICAgLyoqIERvY3VtZW50L3dpbmRvdyBoZWlnaHQgKi9cclxuICAgIHN0YXRpYyBnZXQgc2NyZWVuSGVpZ2h0KCkgeyByZXR1cm4gTWF0aC5tYXgoZG9jdW1lbnQuZG9jdW1lbnRFbGVtZW50LmNsaWVudEhlaWdodCwgd2luZG93LmlubmVySGVpZ2h0IHx8IDApOyB9XHJcblxyXG4gICAgc3RhdGljIGdldCBXaW5kb3dDb25maWdGaWxlKCkge1xyXG4gICAgICAgIHJldHVybiB0aGlzLl93aW5kb3dDb25maWdGaWxlID0gbnVsbDtcclxuICAgIH1cclxuXHJcbiAgICBzdGF0aWMgZ2V0QWxsV2luZG93UHJlZmVyZW5jZXMoKSB7XHJcbiAgICAgICAgcmV0dXJuIHtcclxuICAgICAgICAgICAgdHJhbnNwYXJlbnQ6IHRydWUsXHJcbiAgICAgICAgICAgIGZyYW1lOiBmYWxzZVxyXG4gICAgICAgIH07XHJcbiAgICB9XHJcbiAgICBcclxuICAgIHN0YXRpYyBnZXRXaW5kb3dQcmVmZXJlbmNlKGtleSkge1xyXG4gICAgICAgIGlmIChrZXkgPT09IFwidHJhbnNwYXJlbnRcIikgcmV0dXJuIHRydWU7XHJcbiAgICAgICAgaWYgKGtleSA9PT0gXCJmcmFtZVwiKSByZXR1cm4gZmFsc2U7XHJcbiAgICAgICAgcmV0dXJuIG51bGw7XHJcbiAgICB9XHJcbiAgICBcclxuICAgIHN0YXRpYyBzZXRXaW5kb3dQcmVmZXJlbmNlKGtleSwgdmFsdWUpIHtcclxuICAgICAgICBpZiAoa2V5ID09PSBcInRyYW5zcGFyZW50XCIpIHJldHVybiB0cnVlO1xyXG4gICAgICAgIGlmIChrZXkgPT09IFwiZnJhbWVcIikgcmV0dXJuIGZhbHNlO1xyXG4gICAgICAgIHJldHVybiBudWxsO1xyXG4gICAgfVxyXG5cclxuICAgIHN0YXRpYyBzdHJpcEJPTShjb250ZW50KSB7XHJcbiAgICAgICAgaWYgKGNvbnRlbnQuY2hhckNvZGVBdCgwKSA9PT0gMHhGRUZGKSB7XHJcbiAgICAgICAgICAgIGNvbnRlbnQgPSBjb250ZW50LnNsaWNlKDEpO1xyXG4gICAgICAgIH1cclxuICAgICAgICByZXR1cm4gY29udGVudDtcclxuICAgIH1cclxuXHJcbiAgICBzdGF0aWMgZ2V0VGV4dEFyZWEoKSB7XHJcbiAgICAgICAgcmV0dXJuIERPTS5xdWVyeShcIi5cIitCRE1vZHVsZXMuZ2V0KGUgPT4gZS5jaGFubmVsVGV4dEFyZWEgJiYgZS50aXRsZVdyYXBwZXIpWzBdLmNoYW5uZWxUZXh0QXJlYS5zcGxpdChcIiBcIilbMF0rXCIgdGV4dGFyZWFcIik7XHJcbiAgICB9XHJcblxyXG4gICAgc3RhdGljIGluc2VydFRleHQodGV4dGFyZWEsIHRleHQpIHtcclxuICAgICAgICB0ZXh0YXJlYS5mb2N1cygpO1xyXG4gICAgICAgIHRleHRhcmVhLnNlbGVjdGlvblN0YXJ0ID0gMDtcclxuICAgICAgICB0ZXh0YXJlYS5zZWxlY3Rpb25FbmQgPSB0ZXh0YXJlYS52YWx1ZS5sZW5ndGg7XHJcbiAgICAgICAgZG9jdW1lbnQuZXhlY0NvbW1hbmQoXCJpbnNlcnRUZXh0XCIsIGZhbHNlLCB0ZXh0KTtcclxuICAgIH1cclxuXHJcbiAgICBzdGF0aWMgZXNjYXBlSUQoaWQpIHtcclxuICAgICAgICByZXR1cm4gaWQucmVwbGFjZSgvXlteYS16XSt8W15cXHctXSsvZ2ksIFwiLVwiKTtcclxuICAgIH1cclxuXHJcbiAgICBzdGF0aWMgbG9nKG1vZHVsZU5hbWUsIG1lc3NhZ2UpIHtcclxuICAgICAgICBjb25zb2xlLmxvZyhgJWNbQmFuZGFnZWRCRF0lYyBbJHttb2R1bGVOYW1lfV0lYyAke21lc3NhZ2V9YCwgXCJjb2xvcjogIzNhNzFjMTsgZm9udC13ZWlnaHQ6IDcwMDtcIiwgXCJjb2xvcjogIzNhNzFjMTtcIiwgXCJcIik7XHJcbiAgICB9XHJcblxyXG4gICAgc3RhdGljIHdhcm4obW9kdWxlTmFtZSwgbWVzc2FnZSkge1xyXG4gICAgICAgIGNvbnNvbGUud2FybihgJWNbQmFuZGFnZWRCRF0lYyBbJHttb2R1bGVOYW1lfV0lYyAke21lc3NhZ2V9YCwgXCJjb2xvcjogI0U4QTQwMDsgZm9udC13ZWlnaHQ6IDcwMDtcIiwgXCJjb2xvcjogI0U4QTQwMDtcIiwgXCJcIik7XHJcbiAgICB9XHJcblxyXG4gICAgc3RhdGljIGVycihtb2R1bGVOYW1lLCBtZXNzYWdlLCBlcnJvcikge1xyXG4gICAgICAgIGNvbnNvbGUubG9nKGAlY1tCYW5kYWdlZEJEXSVjIFske21vZHVsZU5hbWV9XSVjICR7bWVzc2FnZX1gLCBcImNvbG9yOiByZWQ7IGZvbnQtd2VpZ2h0OiA3MDA7XCIsIFwiY29sb3I6IHJlZDtcIiwgXCJcIik7XHJcbiAgICAgICAgaWYgKGVycm9yKSB7XHJcbiAgICAgICAgICAgIGNvbnNvbGUuZ3JvdXBDb2xsYXBzZWQoXCIlY0Vycm9yOiBcIiArIGVycm9yLm1lc3NhZ2UsIFwiY29sb3I6IHJlZDtcIik7XHJcbiAgICAgICAgICAgIGNvbnNvbGUuZXJyb3IoZXJyb3Iuc3RhY2spO1xyXG4gICAgICAgICAgICBjb25zb2xlLmdyb3VwRW5kKCk7XHJcbiAgICAgICAgfVxyXG4gICAgfVxyXG5cclxuICAgIHN0YXRpYyBlc2NhcGUocykge1xyXG4gICAgICAgIHJldHVybiBzLnJlcGxhY2UoL1stL1xcXFxeJCorPy4oKXxbXFxde31dL2csIFwiXFxcXCQmXCIpO1xyXG4gICAgfVxyXG5cclxuICAgIHN0YXRpYyB0ZXN0SlNPTihkYXRhKSB7XHJcbiAgICAgICAgdHJ5IHtcclxuICAgICAgICAgICAgcmV0dXJuIEpTT04ucGFyc2UoZGF0YSk7XHJcbiAgICAgICAgfVxyXG4gICAgICAgIGNhdGNoIChlcnIpIHtcclxuICAgICAgICAgICAgcmV0dXJuIGZhbHNlO1xyXG4gICAgICAgIH1cclxuICAgIH1cclxuXHJcbiAgICBzdGF0aWMgaXNFbXB0eShvYmopIHtcclxuICAgICAgICBpZiAob2JqID09IG51bGwgfHwgb2JqID09IHVuZGVmaW5lZCB8fCBvYmogPT0gXCJcIikgcmV0dXJuIHRydWU7XHJcbiAgICAgICAgaWYgKHR5cGVvZihvYmopICE9PSBcIm9iamVjdFwiKSByZXR1cm4gZmFsc2U7XHJcbiAgICAgICAgaWYgKEFycmF5LmlzQXJyYXkob2JqKSkgcmV0dXJuIG9iai5sZW5ndGggPT0gMDtcclxuICAgICAgICBmb3IgKGNvbnN0IGtleSBpbiBvYmopIHtcclxuICAgICAgICAgICAgaWYgKG9iai5oYXNPd25Qcm9wZXJ0eShrZXkpKSByZXR1cm4gZmFsc2U7XHJcbiAgICAgICAgfVxyXG4gICAgICAgIHJldHVybiB0cnVlO1xyXG4gICAgfVxyXG5cclxuICAgIHN0YXRpYyBzdXBwcmVzc0Vycm9ycyhtZXRob2QsIG1lc3NhZ2UpIHtcclxuICAgICAgICByZXR1cm4gKC4uLnBhcmFtcykgPT4ge1xyXG4gICAgICAgICAgICB0cnkgeyByZXR1cm4gbWV0aG9kKC4uLnBhcmFtcyk7XHR9XHJcbiAgICAgICAgICAgIGNhdGNoIChlKSB7IHRoaXMuZXJyKFwiU3VwcHJlc3NlZEVycm9yXCIsIFwiRXJyb3Igb2NjdXJyZWQgaW4gXCIgKyBtZXNzYWdlLCBlKTsgfVxyXG4gICAgICAgIH07XHJcbiAgICB9XHJcblxyXG4gICAgc3RhdGljIG1vbmtleVBhdGNoKHdoYXQsIG1ldGhvZE5hbWUsIG9wdGlvbnMpIHtcclxuICAgICAgICBjb25zdCB7YmVmb3JlLCBhZnRlciwgaW5zdGVhZCwgb25jZSA9IGZhbHNlLCBzaWxlbnQgPSBmYWxzZSwgZm9yY2UgPSBmYWxzZX0gPSBvcHRpb25zO1xyXG4gICAgICAgIGNvbnN0IGRpc3BsYXlOYW1lID0gb3B0aW9ucy5kaXNwbGF5TmFtZSB8fCB3aGF0LmRpc3BsYXlOYW1lIHx8IHdoYXRbbWV0aG9kTmFtZV0uZGlzcGxheU5hbWUgfHwgd2hhdC5uYW1lIHx8IHdoYXQuY29uc3RydWN0b3IuZGlzcGxheU5hbWUgfHwgd2hhdC5jb25zdHJ1Y3Rvci5uYW1lO1xyXG4gICAgICAgIGlmICghc2lsZW50KSBjb25zb2xlLmxvZyhcInBhdGNoXCIsIG1ldGhvZE5hbWUsIFwib2ZcIiwgZGlzcGxheU5hbWUpOyAvLyBlc2xpbnQtZGlzYWJsZS1saW5lIG5vLWNvbnNvbGVcclxuICAgICAgICBpZiAoIXdoYXRbbWV0aG9kTmFtZV0pIHtcclxuICAgICAgICAgICAgaWYgKGZvcmNlKSB3aGF0W21ldGhvZE5hbWVdID0gZnVuY3Rpb24oKSB7fTtcclxuICAgICAgICAgICAgZWxzZSByZXR1cm4gY29uc29sZS5lcnJvcihtZXRob2ROYW1lLCBcImRvZXMgbm90IGV4aXN0IGZvclwiLCBkaXNwbGF5TmFtZSk7IC8vIGVzbGludC1kaXNhYmxlLWxpbmUgbm8tY29uc29sZVxyXG4gICAgICAgIH1cclxuICAgICAgICBjb25zdCBvcmlnTWV0aG9kID0gd2hhdFttZXRob2ROYW1lXTtcclxuICAgICAgICBsZXQgY2FuY2VsZWQgPSBmYWxzZVxyXG4gICAgICAgIGNvbnN0IGNhbmNlbCA9ICgpID0+IHtcclxuICAgICAgICAgICAgaWYgKCFzaWxlbnQpIGNvbnNvbGUubG9nKFwidW5wYXRjaFwiLCBtZXRob2ROYW1lLCBcIm9mXCIsIGRpc3BsYXlOYW1lKTsgLy8gZXNsaW50LWRpc2FibGUtbGluZSBuby1jb25zb2xlXHJcbiAgICAgICAgICAgIC8vd2hhdFttZXRob2ROYW1lXSA9IG9yaWdNZXRob2Q7XHJcbiAgICAgICAgICAgIGNhbmNlbGVkID0gdHJ1ZSAvLyB0aGlzIGFsbG93IHRvIG1vbmtleXBhdGNoIG1vcmUgdGhhbiBvbmUgdGltZS5cclxuICAgICAgICB9O1xyXG4gICAgICAgIHdoYXRbbWV0aG9kTmFtZV0gPSBmdW5jdGlvbigpIHtcclxuICAgICAgICAgICAgaWYoY2FuY2VsZWQpe1xyXG4gICAgICAgICAgICAgICAgcmV0dXJuIG9yaWdNZXRob2QuY2FsbCh0aGlzLCAuLi5hcmd1bWVudHMpXHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgY29uc3QgZGF0YSA9IHtcclxuICAgICAgICAgICAgICAgIHRoaXNPYmplY3Q6IHRoaXMsXHJcbiAgICAgICAgICAgICAgICBtZXRob2RBcmd1bWVudHM6IGFyZ3VtZW50cyxcclxuICAgICAgICAgICAgICAgIGNhbmNlbFBhdGNoOiBjYW5jZWwsXHJcbiAgICAgICAgICAgICAgICBvcmlnaW5hbE1ldGhvZDogb3JpZ01ldGhvZCxcclxuICAgICAgICAgICAgICAgIGNhbGxPcmlnaW5hbE1ldGhvZDogKCkgPT4gZGF0YS5yZXR1cm5WYWx1ZSA9IGRhdGEub3JpZ2luYWxNZXRob2QuYXBwbHkoZGF0YS50aGlzT2JqZWN0LCBkYXRhLm1ldGhvZEFyZ3VtZW50cylcclxuICAgICAgICAgICAgfTtcclxuICAgICAgICAgICAgaWYgKGluc3RlYWQpIHtcclxuICAgICAgICAgICAgICAgIGNvbnN0IHRlbXBSZXQgPSBVdGlscy5zdXBwcmVzc0Vycm9ycyhpbnN0ZWFkLCBcImBpbnN0ZWFkYCBjYWxsYmFjayBvZiBcIiArIHdoYXRbbWV0aG9kTmFtZV0uZGlzcGxheU5hbWUpKGRhdGEpO1xyXG4gICAgICAgICAgICAgICAgaWYgKHRlbXBSZXQgIT09IHVuZGVmaW5lZCkgZGF0YS5yZXR1cm5WYWx1ZSA9IHRlbXBSZXQ7XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgZWxzZSB7XHJcbiAgICAgICAgICAgICAgICBpZiAoYmVmb3JlKSBVdGlscy5zdXBwcmVzc0Vycm9ycyhiZWZvcmUsIFwiYGJlZm9yZWAgY2FsbGJhY2sgb2YgXCIgKyB3aGF0W21ldGhvZE5hbWVdLmRpc3BsYXlOYW1lKShkYXRhKTtcclxuICAgICAgICAgICAgICAgIGRhdGEuY2FsbE9yaWdpbmFsTWV0aG9kKCk7XHJcbiAgICAgICAgICAgICAgICBpZiAoYWZ0ZXIpIFV0aWxzLnN1cHByZXNzRXJyb3JzKGFmdGVyLCBcImBhZnRlcmAgY2FsbGJhY2sgb2YgXCIgKyB3aGF0W21ldGhvZE5hbWVdLmRpc3BsYXlOYW1lKShkYXRhKTtcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICBpZiAob25jZSkgY2FuY2VsKCk7XHJcbiAgICAgICAgICAgIHJldHVybiBkYXRhLnJldHVyblZhbHVlO1xyXG4gICAgICAgIH07XHJcbiAgICAgICAgT2JqZWN0LmFzc2lnbih3aGF0W21ldGhvZE5hbWVdLCBvcmlnTWV0aG9kKTtcclxuICAgICAgICB3aGF0W21ldGhvZE5hbWVdLl9fbW9ua2V5UGF0Y2hlZCA9IHRydWU7XHJcbiAgICAgICAgd2hhdFttZXRob2ROYW1lXS5kaXNwbGF5TmFtZSA9IGRpc3BsYXlOYW1lO1xyXG4gICAgICAgIGlmICghd2hhdFttZXRob2ROYW1lXS5fX29yaWdpbmFsTWV0aG9kKSB7XHJcbiAgICAgICAgICAgIHdoYXRbbWV0aG9kTmFtZV0uX19vcmlnaW5hbE1ldGhvZCA9IG9yaWdNZXRob2Q7XHJcbiAgICAgICAgICAgIHdoYXRbbWV0aG9kTmFtZV0udG9TdHJpbmcgPSBmdW5jdGlvbigpIHtyZXR1cm4gb3JpZ01ldGhvZC50b1N0cmluZygpO307XHJcbiAgICAgICAgfVxyXG4gICAgICAgIHJldHVybiBjYW5jZWw7XHJcbiAgICB9XHJcblxyXG4gICAgc3RhdGljIG9uUmVtb3ZlZChub2RlLCBjYWxsYmFjaykge1xyXG4gICAgICAgIGNvbnN0IG9ic2VydmVyID0gbmV3IE11dGF0aW9uT2JzZXJ2ZXIoKG11dGF0aW9ucykgPT4ge1xyXG4gICAgICAgICAgICBmb3IgKGxldCBtID0gMDsgbSA8IG11dGF0aW9ucy5sZW5ndGg7IG0rKykge1xyXG4gICAgICAgICAgICAgICAgY29uc3QgbXV0YXRpb24gPSBtdXRhdGlvbnNbbV07XHJcbiAgICAgICAgICAgICAgICBjb25zdCBub2RlcyA9IEFycmF5LmZyb20obXV0YXRpb24ucmVtb3ZlZE5vZGVzKTtcclxuICAgICAgICAgICAgICAgIGNvbnN0IGRpcmVjdE1hdGNoID0gbm9kZXMuaW5kZXhPZihub2RlKSA+IC0xO1xyXG4gICAgICAgICAgICAgICAgY29uc3QgcGFyZW50TWF0Y2ggPSBub2Rlcy5zb21lKHBhcmVudCA9PiBwYXJlbnQuY29udGFpbnMobm9kZSkpO1xyXG4gICAgICAgICAgICAgICAgaWYgKGRpcmVjdE1hdGNoIHx8IHBhcmVudE1hdGNoKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgb2JzZXJ2ZXIuZGlzY29ubmVjdCgpO1xyXG4gICAgICAgICAgICAgICAgICAgIGNhbGxiYWNrKCk7XHJcbiAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICB9KTtcclxuXHJcbiAgICAgICAgb2JzZXJ2ZXIub2JzZXJ2ZShkb2N1bWVudC5ib2R5LCB7c3VidHJlZTogdHJ1ZSwgY2hpbGRMaXN0OiB0cnVlfSk7XHJcbiAgICB9XHJcblxyXG4gICAgc3RhdGljIGdldE5lc3RlZFByb3Aob2JqLCBwYXRoKSB7XHJcbiAgICAgICAgcmV0dXJuIHBhdGguc3BsaXQoL1xccz9cXC5cXHM/LykucmVkdWNlKGZ1bmN0aW9uKG9iaiwgcHJvcCkge1xyXG4gICAgICAgICAgICByZXR1cm4gb2JqICYmIG9ialtwcm9wXTtcclxuICAgICAgICB9LCBvYmopO1xyXG4gICAgfVxyXG5cclxuICAgIC8qKlxyXG4gICAgICogVGhpcyBzaG93cyBhIHRvYXN0IHNpbWlsYXIgdG8gYW5kcm9pZCB0b3dhcmRzIHRoZSBib3R0b20gb2YgdGhlIHNjcmVlbi5cclxuICAgICAqXHJcbiAgICAgKiBAcGFyYW0ge3N0cmluZ30gY29udGVudCBUaGUgc3RyaW5nIHRvIHNob3cgaW4gdGhlIHRvYXN0LlxyXG4gICAgICogQHBhcmFtIHtvYmplY3R9IG9wdGlvbnMgT3B0aW9ucyBvYmplY3QuIE9wdGlvbmFsIHBhcmFtZXRlci5cclxuICAgICAqIEBwYXJhbSB7c3RyaW5nfSBvcHRpb25zLnR5cGUgQ2hhbmdlcyB0aGUgdHlwZSBvZiB0aGUgdG9hc3Qgc3R5bGlzdGljYWxseSBhbmQgc2VtYW50aWNhbGx5LiBDaG9pY2VzOiBcIlwiLCBcImluZm9cIiwgXCJzdWNjZXNzXCIsIFwiZGFuZ2VyXCIvXCJlcnJvclwiLCBcIndhcm5pbmdcIi9cIndhcm5cIi4gRGVmYXVsdDogXCJcIlxyXG4gICAgICogQHBhcmFtIHtib29sZWFufSBvcHRpb25zLmljb24gRGV0ZXJtaW5lcyB3aGV0aGVyIHRoZSBpY29uIHNob3VsZCBzaG93IGNvcnJlc3BvbmRpbmcgdG8gdGhlIHR5cGUuIEEgdG9hc3Qgd2l0aG91dCB0eXBlIHdpbGwgYWx3YXlzIGhhdmUgbm8gaWNvbi4gRGVmYXVsdDogdHJ1ZVxyXG4gICAgICogQHBhcmFtIHtudW1iZXJ9IG9wdGlvbnMudGltZW91dCBBZGp1c3RzIHRoZSB0aW1lIChpbiBtcykgdGhlIHRvYXN0IHNob3VsZCBiZSBzaG93biBmb3IgYmVmb3JlIGRpc2FwcGVhcmluZyBhdXRvbWF0aWNhbGx5LiBEZWZhdWx0OiAzMDAwXHJcbiAgICAgKi9cclxuICAgIHN0YXRpYyBzaG93VG9hc3QoY29udGVudCwgb3B0aW9ucyA9IHt9KSB7XHJcbiAgICAgICAgaWYgKCFkb2N1bWVudC5xdWVyeVNlbGVjdG9yKFwiLmJkLXRvYXN0c1wiKSkge1xyXG4gICAgICAgICAgICBjb25zdCBjb250YWluZXIgPSBkb2N1bWVudC5xdWVyeVNlbGVjdG9yKFwiLlwiK0JETW9kdWxlcy5nZXQoZSA9PiBlLnNpZGViYXIgJiYgZS5oYXNOb3RpY2UpWzBdLnNpZGViYXIuc3BsaXQoXCIgXCIpWzldK1wiICsgZGl2XCIpIHx8IG51bGw7XHJcbiAgICAgICAgICAgIGNvbnN0IG1lbWJlcmxpc3QgPSBjb250YWluZXIgPyBjb250YWluZXIucXVlcnlTZWxlY3RvcihcIi5cIitCRE1vZHVsZXMuZ2V0KGUgPT4gZS5tZW1iZXJzV3JhcClbMF0ubWVtYmVyc1dyYXApIDogbnVsbDtcclxuICAgICAgICAgICAgY29uc3QgZm9ybSA9IGNvbnRhaW5lciA/IGNvbnRhaW5lci5xdWVyeVNlbGVjdG9yKFwiZm9ybVwiKSA6IG51bGw7XHJcbiAgICAgICAgICAgIGNvbnN0IGxlZnQgPSBjb250YWluZXIgPyBjb250YWluZXIuZ2V0Qm91bmRpbmdDbGllbnRSZWN0KCkubGVmdCA6IDMxMDtcclxuICAgICAgICAgICAgY29uc3QgcmlnaHQgPSBtZW1iZXJsaXN0ID8gbWVtYmVybGlzdC5nZXRCb3VuZGluZ0NsaWVudFJlY3QoKS5sZWZ0IDogMDtcclxuICAgICAgICAgICAgY29uc3Qgd2lkdGggPSByaWdodCA/IHJpZ2h0IC0gY29udGFpbmVyLmdldEJvdW5kaW5nQ2xpZW50UmVjdCgpLmxlZnQgOiBVdGlscy5zY3JlZW5XaWR0aCAtIGxlZnQgLSAyNDA7XHJcbiAgICAgICAgICAgIGNvbnN0IGJvdHRvbSA9IGZvcm0gPyBmb3JtLm9mZnNldEhlaWdodCA6IDgwO1xyXG4gICAgICAgICAgICBjb25zdCB0b2FzdFdyYXBwZXIgPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KFwiZGl2XCIpO1xyXG4gICAgICAgICAgICB0b2FzdFdyYXBwZXIuY2xhc3NMaXN0LmFkZChcImJkLXRvYXN0c1wiKTtcclxuICAgICAgICAgICAgdG9hc3RXcmFwcGVyLnN0eWxlLnNldFByb3BlcnR5KFwibGVmdFwiLCBsZWZ0ICsgXCJweFwiKTtcclxuICAgICAgICAgICAgdG9hc3RXcmFwcGVyLnN0eWxlLnNldFByb3BlcnR5KFwid2lkdGhcIiwgd2lkdGggKyBcInB4XCIpO1xyXG4gICAgICAgICAgICB0b2FzdFdyYXBwZXIuc3R5bGUuc2V0UHJvcGVydHkoXCJib3R0b21cIiwgYm90dG9tICsgXCJweFwiKTtcclxuICAgICAgICAgICAgZG9jdW1lbnQucXVlcnlTZWxlY3RvcihcIiNhcHAtbW91bnRcIikuYXBwZW5kQ2hpbGQodG9hc3RXcmFwcGVyKTtcclxuICAgICAgICB9XHJcbiAgICAgICAgY29uc3Qge3R5cGUgPSBcIlwiLCBpY29uID0gdHJ1ZSwgdGltZW91dCA9IDMwMDB9ID0gb3B0aW9ucztcclxuICAgICAgICBjb25zdCB0b2FzdEVsZW0gPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KFwiZGl2XCIpO1xyXG4gICAgICAgIHRvYXN0RWxlbS5jbGFzc0xpc3QuYWRkKFwiYmQtdG9hc3RcIik7XHJcbiAgICAgICAgaWYgKHR5cGUpIHRvYXN0RWxlbS5jbGFzc0xpc3QuYWRkKFwidG9hc3QtXCIgKyB0eXBlKTtcclxuICAgICAgICBpZiAodHlwZSAmJiBpY29uKSB0b2FzdEVsZW0uY2xhc3NMaXN0LmFkZChcImljb25cIik7XHJcbiAgICAgICAgdG9hc3RFbGVtLmlubmVyVGV4dCA9IGNvbnRlbnQ7XHJcbiAgICAgICAgZG9jdW1lbnQucXVlcnlTZWxlY3RvcihcIi5iZC10b2FzdHNcIikuYXBwZW5kQ2hpbGQodG9hc3RFbGVtKTtcclxuICAgICAgICBzZXRUaW1lb3V0KCgpID0+IHtcclxuICAgICAgICAgICAgdG9hc3RFbGVtLmNsYXNzTGlzdC5hZGQoXCJjbG9zaW5nXCIpO1xyXG4gICAgICAgICAgICBzZXRUaW1lb3V0KCgpID0+IHtcclxuICAgICAgICAgICAgICAgIHRvYXN0RWxlbS5yZW1vdmUoKTtcclxuICAgICAgICAgICAgICAgIGlmICghZG9jdW1lbnQucXVlcnlTZWxlY3RvckFsbChcIi5iZC10b2FzdHMgLmJkLXRvYXN0XCIpLmxlbmd0aCkgZG9jdW1lbnQucXVlcnlTZWxlY3RvcihcIi5iZC10b2FzdHNcIikucmVtb3ZlKCk7XHJcbiAgICAgICAgICAgIH0sIDMwMCk7XHJcbiAgICAgICAgfSwgdGltZW91dCk7XHJcbiAgICB9XHJcblxyXG4gICAgc3RhdGljIGFsZXJ0KHRpdGxlLCBjb250ZW50KSB7XHJcbiAgICAgICAgbGV0IG1vZGFsTW9kdWxlID0gQkRNb2R1bGVzLmdldChlID0+IGUubW9kYWwgJiYgZS5pbm5lciAmJiAhZS5oaWRlT25GdWxsc2NyZWVuKVswXVxyXG4gICAgICAgIGxldCBoZWFkZXJNb2R1bGUgPSBCRE1vZHVsZXMuZ2V0KGUgPT4gZS5oZWFkZXIgJiYgZS5yZXNwb25zaXZlV2lkdGhNb2JpbGUgJiYgZS5oaWRlT25GdWxsc2NyZWVuKVswXVxyXG4gICAgICAgIGxldCBmb290ZXIyTW9kdWxlID0gQkRNb2R1bGVzLmdldChlID0+IGUuaGVhZGVyICYmIGUucmVzcG9uc2l2ZVdpZHRoTW9iaWxlICYmIGUuZm9jdXNMb2NrKVswXVxyXG4gICAgICAgIGNvbnN0IG1vZGFsID0gRE9NLmNyZWF0ZUVsZW1lbnQoYDxkaXYgY2xhc3M9XCJiZC1tb2RhbC13cmFwcGVyIHRoZW1lLWRhcmtcIj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cImJkLWJhY2tkcm9wICR7QkRNb2R1bGVzLmdldChlID0+IGUuYmFja2Ryb3AgJiYgZS5iYWNrZHJvcFdpdGhMYXllcilbMF0uYmFja2Ryb3B9XCI+PC9kaXY+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJiZC1tb2RhbCAke21vZGFsTW9kdWxlLm1vZGFsfVwiPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cImJkLW1vZGFsLWlubmVyICR7bW9kYWxNb2R1bGUuaW5uZXJ9XCI+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cImhlYWRlciAke2hlYWRlck1vZHVsZS5oZWFkZXJ9XCI+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJ0aXRsZVwiPiR7dGl0bGV9PC9kaXY+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9kaXY+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cImJkLW1vZGFsLWJvZHlcIj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cInNjcm9sbGVyLXdyYXAgZmFkZVwiPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cInNjcm9sbGVyXCI+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJHtjb250ZW50fVxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9kaXY+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvZGl2PlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvZGl2PlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJmb290ZXIgJHtoZWFkZXJNb2R1bGUuZm9vdGVyfSAke2Zvb3RlcjJNb2R1bGUuZm9vdGVyfVwiPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8YnV0dG9uIHR5cGU9XCJidXR0b25cIj5Pa2F5PC9idXR0b24+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9kaXY+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L2Rpdj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgPC9kaXY+XHJcbiAgICAgICAgICAgICAgICAgICAgPC9kaXY+YCk7XHJcbiAgICAgICAgbW9kYWwucXVlcnlTZWxlY3RvcihcIi5mb290ZXIgYnV0dG9uXCIpLmFkZEV2ZW50TGlzdGVuZXIoXCJjbGlja1wiLCAoKSA9PiB7XHJcbiAgICAgICAgICAgIERPTS5hZGRDbGFzcyhtb2RhbCwgXCJjbG9zaW5nXCIpO1xyXG4gICAgICAgICAgICBzZXRUaW1lb3V0KCgpID0+IHsgXHJcbiAgICAgICAgICAgICAgICBtb2RhbC5yZW1vdmUoKTsgXHJcbiAgICAgICAgICAgICAgICBjbG9zaW5nTGlzdGVuZXJzLmZvckVhY2goKGxpc3RlbmVyKSA9PiB7XHJcbiAgICAgICAgICAgICAgICAgICAgdHJ5e1xyXG4gICAgICAgICAgICAgICAgICAgICAgICBsaXN0ZW5lcigpXHJcbiAgICAgICAgICAgICAgICAgICAgfWNhdGNoKGUpe1xyXG4gICAgICAgICAgICAgICAgICAgICAgICBjb25zb2xlLmVycm9yKGUpXHJcbiAgICAgICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgICAgfSlcclxuICAgICAgICAgICAgfSwgMzAwKTtcclxuICAgICAgICB9KTtcclxuICAgICAgICBtb2RhbC5xdWVyeVNlbGVjdG9yKFwiLmJkLWJhY2tkcm9wXCIpLmFkZEV2ZW50TGlzdGVuZXIoXCJjbGlja1wiLCAoKSA9PiB7XHJcbiAgICAgICAgICAgIERPTS5hZGRDbGFzcyhtb2RhbCwgXCJjbG9zaW5nXCIpO1xyXG4gICAgICAgICAgICBzZXRUaW1lb3V0KCgpID0+IHsgXHJcbiAgICAgICAgICAgICAgICBtb2RhbC5yZW1vdmUoKTsgXHJcbiAgICAgICAgICAgICAgICBjbG9zaW5nTGlzdGVuZXJzLmZvckVhY2goKGxpc3RlbmVyKSA9PiB7XHJcbiAgICAgICAgICAgICAgICAgICAgdHJ5e1xyXG4gICAgICAgICAgICAgICAgICAgICAgICBsaXN0ZW5lcigpXHJcbiAgICAgICAgICAgICAgICAgICAgfWNhdGNoKGUpe1xyXG4gICAgICAgICAgICAgICAgICAgICAgICBjb25zb2xlLmVycm9yKGUpXHJcbiAgICAgICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgICAgfSlcclxuICAgICAgICAgICAgfSwgMzAwKTtcclxuICAgICAgICB9KTtcclxuICAgICAgICBET00ucXVlcnkoXCIjYXBwLW1vdW50XCIpLmFwcGVuZChtb2RhbCk7XHJcbiAgICAgICAgY29uc3QgY2xvc2luZ0xpc3RlbmVycyA9IFtdXHJcbiAgICAgICAgcmV0dXJuIHtcclxuICAgICAgICAgICAgY2xvc2U6ICgpID0+IHtcclxuICAgICAgICAgICAgICAgIERPTS5hZGRDbGFzcyhtb2RhbCwgXCJjbG9zaW5nXCIpO1xyXG4gICAgICAgICAgICAgICAgc2V0VGltZW91dCgoKSA9PiB7IFxyXG4gICAgICAgICAgICAgICAgICAgIG1vZGFsLnJlbW92ZSgpOyBcclxuICAgICAgICAgICAgICAgICAgICBjbG9zaW5nTGlzdGVuZXJzLmZvckVhY2goKGxpc3RlbmVyKSA9PiB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIHRyeXtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxpc3RlbmVyKClcclxuICAgICAgICAgICAgICAgICAgICAgICAgfWNhdGNoKGUpe1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc29sZS5lcnJvcihlKVxyXG4gICAgICAgICAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgICAgICAgfSlcclxuICAgICAgICAgICAgICAgIH0sIDMwMCk7XHJcbiAgICAgICAgICAgIH0sXHJcbiAgICAgICAgICAgIG9uQ2xvc2U6IChsaXN0ZW5lcikgPT4ge1xyXG4gICAgICAgICAgICAgICAgY2xvc2luZ0xpc3RlbmVycy5wdXNoKGxpc3RlbmVyKVxyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgfVxyXG4gICAgfVxyXG5cclxuICAgIHN0YXRpYyBzaG93Q29udGVudEVycm9ycyh7cGx1Z2luczogcGx1Z2luRXJyb3JzID0gW10sIHRoZW1lczogdGhlbWVFcnJvcnMgPSBbXX0pIHtcclxuICAgICAgICBpZiAoIXBsdWdpbkVycm9ycyB8fCAhdGhlbWVFcnJvcnMpIHJldHVybjtcclxuICAgICAgICBpZiAoIXBsdWdpbkVycm9ycy5sZW5ndGggJiYgIXRoZW1lRXJyb3JzLmxlbmd0aCkgcmV0dXJuO1xyXG4gICAgICAgIGxldCBtb2RhbE1vZHVsZSA9IEJETW9kdWxlcy5nZXQoZSA9PiBlLm1vZGFsICYmIGUuaW5uZXIgJiYgIWUuaGlkZU9uRnVsbHNjcmVlbilbMF1cclxuICAgICAgICBsZXQgaGVhZGVyTW9kdWxlID0gQkRNb2R1bGVzLmdldChlID0+IGUuaGVhZGVyICYmIGUucmVzcG9uc2l2ZVdpZHRoTW9iaWxlICYmIGUuaGlkZU9uRnVsbHNjcmVlbilbMF1cclxuICAgICAgICBsZXQgZm9vdGVyMk1vZHVsZSA9IEJETW9kdWxlcy5nZXQoZSA9PiBlLmhlYWRlciAmJiBlLnJlc3BvbnNpdmVXaWR0aE1vYmlsZSAmJiBlLmZvY3VzTG9jaylbMF1cclxuICAgICAgICBjb25zdCBtb2RhbCA9IERPTS5jcmVhdGVFbGVtZW50KGA8ZGl2IGNsYXNzPVwiYmQtbW9kYWwtd3JhcHBlciB0aGVtZS1kYXJrXCI+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJiZC1iYWNrZHJvcCAke0JETW9kdWxlcy5nZXQoZSA9PiBlLmJhY2tkcm9wICYmIGUuYmFja2Ryb3BXaXRoTGF5ZXIpWzBdLmJhY2tkcm9wfVwiPjwvZGl2PlxyXG4gICAgICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwiYmQtbW9kYWwgYmQtY29udGVudC1tb2RhbCAke21vZGFsTW9kdWxlLm1vZGFsfVwiPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cImJkLW1vZGFsLWlubmVyICR7bW9kYWxNb2R1bGUuaW5uZXJ9XCI+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cImhlYWRlciAke2hlYWRlck1vZHVsZS5oZWFkZXJ9XCI+PGRpdiBjbGFzcz1cInRpdGxlXCI+Q29udGVudCBFcnJvcnM8L2Rpdj48L2Rpdj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwiYmQtbW9kYWwtYm9keVwiPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwidGFiLWJhci1jb250YWluZXJcIj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJ0YWItYmFyIFRPUFwiPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJ0YWItYmFyLWl0ZW1cIj5QbHVnaW5zPC9kaXY+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cInRhYi1iYXItaXRlbVwiPlRoZW1lczwvZGl2PlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9kaXY+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvZGl2PlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwidGFibGUtaGVhZGVyXCI+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwidGFibGUtY29sdW1uIGNvbHVtbi1uYW1lXCI+TmFtZTwvZGl2PlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cInRhYmxlLWNvbHVtbiBjb2x1bW4tbWVzc2FnZVwiPk1lc3NhZ2U8L2Rpdj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJ0YWJsZS1jb2x1bW4gY29sdW1uLWVycm9yXCI+RXJyb3I8L2Rpdj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9kaXY+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJzY3JvbGxlci13cmFwIGZhZGVcIj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJzY3JvbGxlclwiPlxyXG4gICAgXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L2Rpdj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9kaXY+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9kaXY+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cImZvb3RlciAke2hlYWRlck1vZHVsZS5mb290ZXJ9ICR7Zm9vdGVyMk1vZHVsZS5mb290ZXJ9XCI+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxidXR0b24gdHlwZT1cImJ1dHRvblwiPk9rYXk8L2J1dHRvbj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L2Rpdj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvZGl2PlxyXG4gICAgICAgICAgICAgICAgICAgICAgICA8L2Rpdj5cclxuICAgICAgICAgICAgICAgICAgICA8L2Rpdj5gKTtcclxuICAgIFxyXG4gICAgICAgIGZ1bmN0aW9uIGdlbmVyYXRlVGFiKGVycm9ycykge1xyXG4gICAgICAgICAgICBjb25zdCBjb250YWluZXIgPSBET00uY3JlYXRlRWxlbWVudChgPGRpdiBjbGFzcz1cImVycm9yc1wiPmApO1xyXG4gICAgICAgICAgICBmb3IgKGNvbnN0IGVyciBvZiBlcnJvcnMpIHtcclxuICAgICAgICAgICAgICAgIGNvbnN0IGVycm9yID0gRE9NLmNyZWF0ZUVsZW1lbnQoYDxkaXYgY2xhc3M9XCJlcnJvclwiPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwidGFibGUtY29sdW1uIGNvbHVtbi1uYW1lXCI+JHtlcnIubmFtZSA/IGVyci5uYW1lIDogZXJyLmZpbGV9PC9kaXY+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJ0YWJsZS1jb2x1bW4gY29sdW1uLW1lc3NhZ2VcIj4ke2Vyci5tZXNzYWdlfTwvZGl2PlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwidGFibGUtY29sdW1uIGNvbHVtbi1lcnJvclwiPjxhIGNsYXNzPVwiZXJyb3ItbGlua1wiIGhyZWY9XCJcIj4ke2Vyci5lcnJvciA/IGVyci5lcnJvci5tZXNzYWdlIDogXCJcIn08L2E+PC9kaXY+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9kaXY+YCk7XHJcbiAgICAgICAgICAgICAgICBjb250YWluZXIuYXBwZW5kKGVycm9yKTtcclxuICAgICAgICAgICAgICAgIGlmIChlcnIuZXJyb3IpIHtcclxuICAgICAgICAgICAgICAgICAgICBlcnJvci5xdWVyeVNlbGVjdG9yQWxsKFwiYVwiKS5mb3JFYWNoKGVsID0+IGVsLmFkZEV2ZW50TGlzdGVuZXIoXCJjbGlja1wiLCAoZSkgPT4ge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICBlLnByZXZlbnREZWZhdWx0KCk7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIFV0aWxzLmVycihcIkNvbnRlbnRNYW5hZ2VyXCIsIGBFcnJvciBkZXRhaWxzIGZvciAke2Vyci5uYW1lID8gZXJyLm5hbWUgOiBlcnIuZmlsZX0uYCwgZXJyLmVycm9yKTtcclxuICAgICAgICAgICAgICAgICAgICB9KSk7XHJcbiAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgcmV0dXJuIGNvbnRhaW5lcjtcclxuICAgICAgICB9XHJcbiAgICBcclxuICAgICAgICBjb25zdCB0YWJzID0gW2dlbmVyYXRlVGFiKHBsdWdpbkVycm9ycyksIGdlbmVyYXRlVGFiKHRoZW1lRXJyb3JzKV07XHJcbiAgICBcclxuICAgICAgICBtb2RhbC5xdWVyeVNlbGVjdG9yQWxsKFwiLnRhYi1iYXItaXRlbVwiKS5mb3JFYWNoKGVsID0+IGVsLmFkZEV2ZW50TGlzdGVuZXIoXCJjbGlja1wiLCAoZSkgPT4ge1xyXG4gICAgICAgICAgICBlLnByZXZlbnREZWZhdWx0KCk7XHJcbiAgICAgICAgICAgIGNvbnN0IHNlbGVjdGVkID0gbW9kYWwucXVlcnlTZWxlY3RvcihcIi50YWItYmFyLWl0ZW0uc2VsZWN0ZWRcIik7XHJcbiAgICAgICAgICAgIGlmIChzZWxlY3RlZCkgRE9NLnJlbW92ZUNsYXNzKHNlbGVjdGVkLCBcInNlbGVjdGVkXCIpO1xyXG4gICAgICAgICAgICBET00uYWRkQ2xhc3MoZS50YXJnZXQsIFwic2VsZWN0ZWRcIik7XHJcbiAgICAgICAgICAgIGNvbnN0IHNjcm9sbGVyID0gbW9kYWwucXVlcnlTZWxlY3RvcihcIi5zY3JvbGxlclwiKTtcclxuICAgICAgICAgICAgc2Nyb2xsZXIuaW5uZXJIVE1MID0gXCJcIjtcclxuICAgICAgICAgICAgc2Nyb2xsZXIuYXBwZW5kKHRhYnNbRE9NLmluZGV4KGUudGFyZ2V0KV0pO1xyXG4gICAgICAgIH0pKTtcclxuICAgIFxyXG4gICAgICAgIG1vZGFsLnF1ZXJ5U2VsZWN0b3IoXCIuZm9vdGVyIGJ1dHRvblwiKS5hZGRFdmVudExpc3RlbmVyKFwiY2xpY2tcIiwgKCkgPT4ge1xyXG4gICAgICAgICAgICBET00uYWRkQ2xhc3MobW9kYWwsIFwiY2xvc2luZ1wiKTtcclxuICAgICAgICAgICAgc2V0VGltZW91dCgoKSA9PiB7IG1vZGFsLnJlbW92ZSgpOyB9LCAzMDApO1xyXG4gICAgICAgIH0pO1xyXG4gICAgICAgIG1vZGFsLnF1ZXJ5U2VsZWN0b3IoXCIuYmQtYmFja2Ryb3BcIikuYWRkRXZlbnRMaXN0ZW5lcihcImNsaWNrXCIsICgpID0+IHtcclxuICAgICAgICAgICAgRE9NLmFkZENsYXNzKG1vZGFsLCBcImNsb3NpbmdcIik7XHJcbiAgICAgICAgICAgIHNldFRpbWVvdXQoKCkgPT4geyBtb2RhbC5yZW1vdmUoKTsgfSwgMzAwKTtcclxuICAgICAgICB9KTtcclxuICAgICAgICBET00ucXVlcnkoXCIjYXBwLW1vdW50XCIpLmFwcGVuZChtb2RhbCk7XHJcbiAgICAgICAgaWYgKHBsdWdpbkVycm9ycy5sZW5ndGgpIG1vZGFsLnF1ZXJ5U2VsZWN0b3IoXCIudGFiLWJhci1pdGVtXCIpLmNsaWNrKCk7XHJcbiAgICAgICAgZWxzZSBtb2RhbC5xdWVyeVNlbGVjdG9yQWxsKFwiLnRhYi1iYXItaXRlbVwiKVsxXS5jbGljaygpO1xyXG4gICAgfVxyXG5cclxuICAgIHN0YXRpYyBzaG93Q2hhbmdlbG9nTW9kYWwob3B0aW9ucyA9IHt9KSB7XHJcbiAgICAgICAgY29uc3QgTW9kYWxTdGFjayA9IFdlYnBhY2tNb2R1bGVzLmZpbmRCeVByb3BzKFwicHVzaFwiLCBcInVwZGF0ZVwiLCBcInBvcFwiLCBcInBvcFdpdGhLZXlcIik7XHJcbiAgICAgICAgY29uc3QgQ2hhbmdlbG9nQ2xhc3NlcyA9IFdlYnBhY2tNb2R1bGVzLmZpbmRCeVByb3BzKFwiZml4ZWRcIiwgXCJpbXByb3ZlZFwiKTtcclxuICAgICAgICBjb25zdCBUZXh0RWxlbWVudCA9IFdlYnBhY2tNb2R1bGVzLmZpbmRCeURpc3BsYXlOYW1lKFwiVGV4dFwiKTtcclxuICAgICAgICBjb25zdCBGbGV4Q2hpbGQgPSBXZWJwYWNrTW9kdWxlcy5maW5kQnlQcm9wcyhcIkNoaWxkXCIpO1xyXG4gICAgICAgIGNvbnN0IFRpdGxlcyA9IFdlYnBhY2tNb2R1bGVzLmZpbmRCeVByb3BzKFwiVGFnc1wiLCBcImRlZmF1bHRcIik7XHJcbiAgICAgICAgY29uc3QgQ2hhbmdlbG9nID0gV2VicGFja01vZHVsZXMuZmluZChtID0+IG0uZGVmYXVsdFByb3BzICYmIG0uZGVmYXVsdFByb3BzLnNlbGVjdGFibGUgPT0gZmFsc2UpO1xyXG4gICAgICAgIGNvbnN0IE1hcmtkb3duUGFyc2VyID0gV2VicGFja01vZHVsZXMuZmluZEJ5UHJvcHMoXCJkZWZhdWx0UnVsZXNcIiwgXCJwYXJzZVwiKTtcclxuICAgICAgICBpZiAoIUNoYW5nZWxvZyB8fCAhTW9kYWxTdGFjayB8fCAhQ2hhbmdlbG9nQ2xhc3NlcyB8fCAhVGV4dEVsZW1lbnQgfHwgIUZsZXhDaGlsZCB8fCAhVGl0bGVzIHx8ICFNYXJrZG93blBhcnNlcikgcmV0dXJuO1xyXG4gICAgXHJcbiAgICAgICAgY29uc3Qge1xyXG4gICAgICAgICAgICBpbWFnZSA9IFwiaHR0cHM6Ly9yZXBvc2l0b3J5LWltYWdlcy5naXRodWJ1c2VyY29udGVudC5jb20vMTA1NDczNTM3Lzk1N2I1NDgwLTdjMjYtMTFlOS04NDAxLTUwZmE4MjBjYmFlNVwiLCBcclxuICAgICAgICAgICAgZGVzY3JpcHRpb24gPSBcIlwiLCBcclxuICAgICAgICAgICAgY2hhbmdlcyA9IFtdLCBcclxuICAgICAgICAgICAgdGl0bGUgPSBcIkJhbmRhZ2VkQkRcIiwgXHJcbiAgICAgICAgICAgIHN1YnRpdGxlID0gYHYke2JiZFZlcnNpb259YCwgXHJcbiAgICAgICAgICAgIGZvb3RlclxyXG4gICAgICAgIH0gPSBvcHRpb25zO1xyXG4gICAgICAgIGNvbnN0IGNlID0gQkRWMi5SZWFjdC5jcmVhdGVFbGVtZW50O1xyXG4gICAgICAgIGNvbnN0IGNoYW5nZWxvZ0l0ZW1zID0gW2NlKFwiaW1nXCIsIHtzcmM6IGltYWdlfSldO1xyXG4gICAgICAgIGlmIChkZXNjcmlwdGlvbikgY2hhbmdlbG9nSXRlbXMucHVzaChjZShcInBcIiwgbnVsbCwgTWFya2Rvd25QYXJzZXIucGFyc2UoZGVzY3JpcHRpb24pKSk7XHJcbiAgICAgICAgZm9yIChsZXQgYyA9IDA7IGMgPCBjaGFuZ2VzLmxlbmd0aDsgYysrKSB7XHJcbiAgICAgICAgICAgIGNvbnN0IGVudHJ5ID0gY2hhbmdlc1tjXTtcclxuICAgICAgICAgICAgY29uc3QgdHlwZSA9IENoYW5nZWxvZ0NsYXNzZXNbZW50cnkudHlwZV0gPyBDaGFuZ2Vsb2dDbGFzc2VzW2VudHJ5LnR5cGVdIDogQ2hhbmdlbG9nQ2xhc3Nlcy5hZGRlZDtcclxuICAgICAgICAgICAgY29uc3QgbWFyZ2luID0gYyA9PSAwID8gQ2hhbmdlbG9nQ2xhc3Nlcy5tYXJnaW5Ub3AgOiBcIlwiO1xyXG4gICAgICAgICAgICBjaGFuZ2Vsb2dJdGVtcy5wdXNoKGNlKFwiaDFcIiwge2NsYXNzTmFtZTogYCR7dHlwZX0gJHttYXJnaW59YCx9LCBlbnRyeS50aXRsZSkpO1xyXG4gICAgICAgICAgICBjb25zdCBsaXN0ID0gY2UoXCJ1bFwiLCBudWxsLCBlbnRyeS5pdGVtcy5tYXAoaSA9PiBjZShcImxpXCIsIG51bGwsIE1hcmtkb3duUGFyc2VyLnBhcnNlKGkpKSkpO1xyXG4gICAgICAgICAgICBjaGFuZ2Vsb2dJdGVtcy5wdXNoKGxpc3QpO1xyXG4gICAgICAgIH1cclxuICAgICAgICBjb25zdCByZW5kZXJIZWFkZXIgPSBmdW5jdGlvbigpIHtcclxuICAgICAgICAgICAgcmV0dXJuIGNlKEZsZXhDaGlsZC5DaGlsZCwge2dyb3c6IDEsIHNocmluazogMX0sXHJcbiAgICAgICAgICAgICAgICBjZShUaXRsZXMuZGVmYXVsdCwge3RhZzogVGl0bGVzLlRhZ3MuSDR9LCB0aXRsZSksXHJcbiAgICAgICAgICAgICAgICBjZShUZXh0RWxlbWVudCx7c2l6ZTogVGV4dEVsZW1lbnQuU2l6ZXMuU01BTEwsIGNvbG9yOiBUZXh0RWxlbWVudC5Db2xvcnMuU1RBTkRBUkQsIGNsYXNzTmFtZTogQ2hhbmdlbG9nQ2xhc3Nlcy5kYXRlfSwgc3VidGl0bGUpXHJcbiAgICAgICAgICAgICk7XHJcbiAgICAgICAgfTtcclxuICAgIFxyXG4gICAgICAgIGNvbnN0IHJlbmRlckZvb3RlciA9ICgpID0+IHtcclxuICAgICAgICAgICAgY29uc3QgQW5jaG9yID0gV2VicGFja01vZHVsZXMuZmluZChtID0+IG0uZGlzcGxheU5hbWUgPT0gXCJBbmNob3JcIik7XHJcbiAgICAgICAgICAgIGNvbnN0IEFuY2hvckNsYXNzZXMgPSBXZWJwYWNrTW9kdWxlcy5maW5kQnlQcm9wcyhcImFuY2hvclVuZGVybGluZU9uSG92ZXJcIikgfHwge2FuY2hvcjogXCJhbmNob3ItM1otOEJiXCIsIGFuY2hvclVuZGVybGluZU9uSG92ZXI6IFwiYW5jaG9yVW5kZXJsaW5lT25Ib3Zlci0yRVNIUUJcIn07XHJcbiAgICAgICAgICAgIGNvbnN0IGpvaW5TdXBwb3J0U2VydmVyID0gKGNsaWNrKSA9PiB7XHJcbiAgICAgICAgICAgICAgICBjbGljay5wcmV2ZW50RGVmYXVsdCgpO1xyXG4gICAgICAgICAgICAgICAgY2xpY2suc3RvcFByb3BhZ2F0aW9uKCk7XHJcbiAgICAgICAgICAgICAgICBNb2RhbFN0YWNrLnBvcCgpO1xyXG4gICAgICAgICAgICAgICAgQkRWMi5qb2luQkQyKCk7XHJcbiAgICAgICAgICAgIH07XHJcbiAgICAgICAgICAgIGNvbnN0IHN1cHBvcnRMaW5rID0gQW5jaG9yID8gY2UoQW5jaG9yLCB7b25DbGljazogam9pblN1cHBvcnRTZXJ2ZXJ9LCBcIkpvaW4gb3VyIERpc2NvcmQgU2VydmVyLlwiKSA6IGNlKFwiYVwiLCB7Y2xhc3NOYW1lOiBgJHtBbmNob3JDbGFzc2VzLmFuY2hvcn0gJHtBbmNob3JDbGFzc2VzLmFuY2hvclVuZGVybGluZU9uSG92ZXJ9YCwgb25DbGljazogam9pblN1cHBvcnRTZXJ2ZXJ9LCBcIkpvaW4gb3VyIERpc2NvcmQgU2VydmVyLlwiKTtcclxuICAgICAgICAgICAgY29uc3QgZGVmYXVsdEZvb3RlciA9IGNlKFRleHRFbGVtZW50LHtzaXplOiBUZXh0RWxlbWVudC5TaXplcy5TTUFMTCwgY29sb3I6IFRleHRFbGVtZW50LkNvbG9ycy5TVEFOREFSRH0sIFwiTmVlZCBzdXBwb3J0PyBcIiwgc3VwcG9ydExpbmspO1xyXG4gICAgICAgICAgICByZXR1cm4gY2UoRmxleENoaWxkLkNoaWxkLCB7Z3JvdzogMSwgc2hyaW5rOiAxfSwgZm9vdGVyID8gZm9vdGVyIDogZGVmYXVsdEZvb3Rlcik7XHJcbiAgICAgICAgfTtcclxuXHJcbiAgICAgICAgcmV0dXJuIE1vZGFsU3RhY2sucHVzaChmdW5jdGlvbihwcm9wcykge1xyXG4gICAgICAgICAgICByZXR1cm4gY2UoQ2hhbmdlbG9nLCBPYmplY3QuYXNzaWduKHtcclxuICAgICAgICAgICAgICAgIGNsYXNzTmFtZTogQ2hhbmdlbG9nQ2xhc3Nlcy5jb250YWluZXIsXHJcbiAgICAgICAgICAgICAgICBzZWxlY3RhYmxlOiB0cnVlLFxyXG4gICAgICAgICAgICAgICAgb25TY3JvbGw6IF8gPT4gXyxcclxuICAgICAgICAgICAgICAgIG9uQ2xvc2U6IF8gPT4gXyxcclxuICAgICAgICAgICAgICAgIHJlbmRlckhlYWRlcjogcmVuZGVySGVhZGVyLFxyXG4gICAgICAgICAgICAgICAgcmVuZGVyRm9vdGVyOiByZW5kZXJGb290ZXIsXHJcbiAgICAgICAgICAgICAgICBjaGlsZHJlbjogY2hhbmdlbG9nSXRlbXNcclxuICAgICAgICAgICAgfSwgcHJvcHMpKTtcclxuICAgICAgICB9KTtcclxuICAgIH1cclxuXHJcbiAgICAvKipcclxuICAgICAqIFNob3dzIGEgZ2VuZXJpYyBidXQgdmVyeSBjdXN0b21pemFibGUgY29uZmlybWF0aW9uIG1vZGFsIHdpdGggb3B0aW9uYWwgY29uZmlybSBhbmQgY2FuY2VsIGNhbGxiYWNrcy5cclxuICAgICAqIEBwYXJhbSB7c3RyaW5nfSB0aXRsZSAtIHRpdGxlIG9mIHRoZSBtb2RhbFxyXG4gICAgICogQHBhcmFtIHsoc3RyaW5nfFJlYWN0RWxlbWVudHxBcnJheTxzdHJpbmd8UmVhY3RFbGVtZW50Pil9IGNoaWxkcmVuIC0gYSBzaW5nbGUgb3IgbWl4ZWQgYXJyYXkgb2YgcmVhY3QgZWxlbWVudHMgYW5kIHN0cmluZ3MuIEV2ZXJ5IHN0cmluZyBpcyB3cmFwcGVkIGluIERpc2NvcmQncyBgTWFya2Rvd25gIGNvbXBvbmVudCBzbyBzdHJpbmdzIHdpbGwgc2hvdyBhbmQgcmVuZGVyIHByb3Blcmx5LlxyXG4gICAgICogQHBhcmFtIHtvYmplY3R9IFtvcHRpb25zXSAtIG9wdGlvbnMgdG8gbW9kaWZ5IHRoZSBtb2RhbFxyXG4gICAgICogQHBhcmFtIHtib29sZWFufSBbb3B0aW9ucy5kYW5nZXI9ZmFsc2VdIC0gd2hldGhlciB0aGUgbWFpbiBidXR0b24gc2hvdWxkIGJlIHJlZCBvciBub3RcclxuICAgICAqIEBwYXJhbSB7c3RyaW5nfSBbb3B0aW9ucy5jb25maXJtVGV4dD1Pa2F5XSAtIHRleHQgZm9yIHRoZSBjb25maXJtYXRpb24vc3VibWl0IGJ1dHRvblxyXG4gICAgICogQHBhcmFtIHtzdHJpbmd9IFtvcHRpb25zLmNhbmNlbFRleHQ9Q2FuY2VsXSAtIHRleHQgZm9yIHRoZSBjYW5jZWwgYnV0dG9uXHJcbiAgICAgKiBAcGFyYW0ge2NhbGxhYmxlfSBbb3B0aW9ucy5vbkNvbmZpcm09Tk9PUF0gLSBjYWxsYmFjayB0byBvY2N1ciB3aGVuIGNsaWNraW5nIHRoZSBzdWJtaXQgYnV0dG9uXHJcbiAgICAgKiBAcGFyYW0ge2NhbGxhYmxlfSBbb3B0aW9ucy5vbkNhbmNlbD1OT09QXSAtIGNhbGxiYWNrIHRvIG9jY3VyIHdoZW4gY2xpY2tpbmcgdGhlIGNhbmNlbCBidXR0b25cclxuICAgICAqIEBwYXJhbSB7c3RyaW5nfSBbb3B0aW9ucy5rZXldIC0ga2V5IHVzZWQgdG8gaWRlbnRpZnkgdGhlIG1vZGFsLiBJZiBub3QgcHJvdmlkZWQsIG9uZSBpcyBnZW5lcmF0ZWQgYW5kIHJldHVybmVkXHJcbiAgICAgKiBAcmV0dXJucyB7c3RyaW5nfSAtIHRoZSBrZXkgdXNlZCBmb3IgdGhpcyBtb2RhbFxyXG4gICAgICovXHJcbiAgICBzdGF0aWMgc2hvd0NvbmZpcm1hdGlvbk1vZGFsKHRpdGxlLCBjb250ZW50LCBvcHRpb25zID0ge30pIHtcclxuICAgICAgICBjb25zdCBNb2RhbFN0YWNrID0gV2VicGFja01vZHVsZXMuZmluZEJ5UHJvcHMoXCJwdXNoXCIsIFwidXBkYXRlXCIsIFwicG9wXCIsIFwicG9wV2l0aEtleVwiKTtcclxuICAgICAgICBjb25zdCBNYXJrZG93biA9IFdlYnBhY2tNb2R1bGVzLmZpbmRCeURpc3BsYXlOYW1lKFwiTWFya2Rvd25cIik7XHJcbiAgICAgICAgY29uc3QgQ29uZmlybWF0aW9uTW9kYWwgPSBXZWJwYWNrTW9kdWxlcy5maW5kKG0gPT4gbS5kZWZhdWx0UHJvcHMgJiYgbS5rZXkgJiYgbS5rZXkoKSA9PSBcImNvbmZpcm0tbW9kYWxcIik7XHJcbiAgICAgICAgaWYgKCFNb2RhbFN0YWNrIHx8ICFDb25maXJtYXRpb25Nb2RhbCB8fCAhTWFya2Rvd24pIHJldHVybiBVdGlscy5hbGVydCh0aXRsZSwgY29udGVudCk7XHJcblxyXG4gICAgICAgIGNvbnN0IGVtcHR5RnVuY3Rpb24gPSAoKSA9PiB7fTtcclxuICAgICAgICBjb25zdCB7b25Db25maXJtID0gZW1wdHlGdW5jdGlvbiwgb25DYW5jZWwgPSBlbXB0eUZ1bmN0aW9uLCBjb25maXJtVGV4dCA9IFwiT2theVwiLCBjYW5jZWxUZXh0ID0gXCJDYW5jZWxcIiwgZGFuZ2VyID0gZmFsc2UsIGtleSA9IHVuZGVmaW5lZH0gPSBvcHRpb25zO1xyXG5cclxuICAgICAgICBpZiAoIUFycmF5LmlzQXJyYXkoY29udGVudCkpIGNvbnRlbnQgPSBbY29udGVudF07XHJcbiAgICAgICAgY29udGVudCA9IGNvbnRlbnQubWFwKGMgPT4gdHlwZW9mKGMpID09PSBcInN0cmluZ1wiID8gQkRWMi5SZWFjdC5jcmVhdGVFbGVtZW50KE1hcmtkb3duLCBudWxsLCBjKSA6IGMpO1xyXG4gICAgICAgIHJldHVybiBNb2RhbFN0YWNrLnB1c2goQ29uZmlybWF0aW9uTW9kYWwsIHtcclxuICAgICAgICAgICAgaGVhZGVyOiB0aXRsZSxcclxuICAgICAgICAgICAgY2hpbGRyZW46IGNvbnRlbnQsXHJcbiAgICAgICAgICAgIHJlZDogZGFuZ2VyLFxyXG4gICAgICAgICAgICBjb25maXJtVGV4dDogY29uZmlybVRleHQsXHJcbiAgICAgICAgICAgIGNhbmNlbFRleHQ6IGNhbmNlbFRleHQsXHJcbiAgICAgICAgICAgIG9uQ29uZmlybTogb25Db25maXJtLFxyXG4gICAgICAgICAgICBvbkNhbmNlbDogb25DYW5jZWxcclxuICAgICAgICB9LCBrZXkpO1xyXG4gICAgfVxyXG5cclxuICAgIHN0YXRpYyByZW1vdmVEYShjbGFzc05hbWUpe1xyXG4gICAgICAgIGlmKCFjbGFzc05hbWUpcmV0dXJuIGNsYXNzTmFtZVxyXG4gICAgICAgIHJldHVybiBjbGFzc05hbWUuc3BsaXQoXCIgXCIpLmZpbHRlcihlID0+ICFlLnN0YXJ0c1dpdGgoXCJkYS1cIikpLmpvaW4oXCIgXCIpXHJcbiAgICB9XHJcbn1cclxuXHJcblV0aWxzLnNob3dUb2FzdCA9IFV0aWxzLnN1cHByZXNzRXJyb3JzKFV0aWxzLnNob3dUb2FzdCwgXCJDb3VsZCBub3Qgc2hvdyB0b2FzdC5cIik7XHJcblxyXG53aW5kb3cuTGlnaHRjb3JkLkJldHRlckRpc2NvcmQuVXRpbHMgPSBVdGlscyIsImltcG9ydCB7c2V0dGluZ3N9IGZyb20gXCIuLi8wZ2xvYmFsc1wiO1xyXG5cclxuZXhwb3J0IGRlZmF1bHQgbmV3IGNsYXNzIFYyIHtcclxuXHJcbiAgICBjb25zdHJ1Y3RvcigpIHtcclxuICAgICAgICB0aGlzLmVkaXRvckRldGFjaGVkID0gZmFsc2U7XHJcbiAgICAgICAgdGhpcy5XZWJwYWNrTW9kdWxlcyA9ICgoKSA9PiB7XHJcbiAgICAgICAgICAgIGNvbnN0IHJlcSA9IHdlYnBhY2tKc29ucC5wdXNoKFtbXSwge19fZXh0cmFfaWRfXzogKG1vZHVsZSwgZXhwb3J0cywgcmVxKSA9PiBtb2R1bGUuZXhwb3J0cyA9IHJlcX0sIFtbXCJfX2V4dHJhX2lkX19cIl1dXSk7XHJcbiAgICAgICAgICAgIGRlbGV0ZSByZXEubS5fX2V4dHJhX2lkX187XHJcbiAgICAgICAgICAgIGRlbGV0ZSByZXEuYy5fX2V4dHJhX2lkX187XHJcblxyXG4gICAgICAgICAgICBjb25zdCBzaG91bGRQcm90ZWN0ID0gdGhlTW9kdWxlID0+IHtcclxuICAgICAgICAgICAgICAgIGlmICh0aGVNb2R1bGUucmVtb3ZlICYmIHRoZU1vZHVsZS5zZXQgJiYgdGhlTW9kdWxlLmNsZWFyICYmIHRoZU1vZHVsZS5nZXQgJiYgIXRoZU1vZHVsZS5zb3J0KSByZXR1cm4gdHJ1ZTtcclxuICAgICAgICAgICAgICAgIGlmICh0aGVNb2R1bGUuZ2V0VG9rZW4gfHwgdGhlTW9kdWxlLmdldEVtYWlsIHx8IHRoZU1vZHVsZS5zaG93VG9rZW4pIHJldHVybiB0cnVlO1xyXG4gICAgICAgICAgICAgICAgcmV0dXJuIGZhbHNlO1xyXG4gICAgICAgICAgICB9O1xyXG5cclxuICAgICAgICAgICAgY29uc3QgcHJvdGVjdCA9IHRoZU1vZHVsZSA9PiB7XHJcbiAgICAgICAgICAgICAgICBpZiAodGhlTW9kdWxlLnJlbW92ZSAmJiB0aGVNb2R1bGUuc2V0ICYmIHRoZU1vZHVsZS5jbGVhciAmJiB0aGVNb2R1bGUuZ2V0ICYmICF0aGVNb2R1bGUuc29ydCkgcmV0dXJuIG51bGw7XHJcbiAgICAgICAgICAgICAgICBpZiAoIXRoZU1vZHVsZS5nZXRUb2tlbiAmJiAhdGhlTW9kdWxlLmdldEVtYWlsICYmICF0aGVNb2R1bGUuc2hvd1Rva2VuKSByZXR1cm4gdGhlTW9kdWxlO1xyXG4gICAgICAgICAgICAgICAgY29uc3QgcHJveHkgPSBuZXcgUHJveHkodGhlTW9kdWxlLCB7XHJcbiAgICAgICAgICAgICAgICAgICAgZ2V0T3duUHJvcGVydHlEZXNjcmlwdG9yOiBmdW5jdGlvbihvYmosIHByb3ApIHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHByb3AgPT09IFwiZ2V0VG9rZW5cIiB8fCBwcm9wID09PSBcImdldEVtYWlsXCIgfHwgcHJvcCA9PT0gXCJzaG93VG9rZW5cIikgcmV0dXJuIHVuZGVmaW5lZDtcclxuICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIE9iamVjdC5nZXRPd25Qcm9wZXJ0eURlc2NyaXB0b3Iob2JqLCBwcm9wKTtcclxuICAgICAgICAgICAgICAgICAgICB9LFxyXG4gICAgICAgICAgICAgICAgICAgIGdldDogZnVuY3Rpb24ob2JqLCBmdW5jKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIGlmIChmdW5jID09IFwiZ2V0VG9rZW5cIikgcmV0dXJuICgpID0+IFwibWZhLlhDbmJLem8wQ0xJcWRKekJuTDBEOFBmRHJ1cWtKTkhqd0hYdHIzOVVVM0Y4aEh4NDNqb2pJU3lpNWpkak81MmU5X2U5TWptYWZaRkZwYy1zZU9NYVwiO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICBpZiAoZnVuYyA9PSBcImdldEVtYWlsXCIpIHJldHVybiAoKSA9PiBcInB1cHBldDExMTEyQGdtYWlsLmNvbVwiO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICBpZiAoZnVuYyA9PSBcInNob3dUb2tlblwiKSByZXR1cm4gKCkgPT4gdHJ1ZTtcclxuICAgICAgICAgICAgICAgICAgICAgICAgLy8gaWYgKGZ1bmMgPT0gXCJfX3Byb3RvX19cIikgcmV0dXJuIHByb3h5O1xyXG4gICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gb2JqW2Z1bmNdO1xyXG4gICAgICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgIH0pO1xyXG4gICAgICAgICAgICAgICAgcmV0dXJuIHByb3h5O1xyXG4gICAgICAgICAgICB9O1xyXG5cclxuICAgICAgICAgICAgY29uc3QgZmluZCA9IChmaWx0ZXIpID0+IHtcclxuICAgICAgICAgICAgICAgIGZvciAoY29uc3QgaSBpbiByZXEuYykge1xyXG4gICAgICAgICAgICAgICAgICAgIGlmIChyZXEuYy5oYXNPd25Qcm9wZXJ0eShpKSkge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBtID0gcmVxLmNbaV0uZXhwb3J0cztcclxuICAgICAgICAgICAgICAgICAgICAgICAgaWYgKG0gJiYgbS5fX2VzTW9kdWxlICYmIG0uZGVmYXVsdCAmJiBmaWx0ZXIobS5kZWZhdWx0KSkgcmV0dXJuIHByb3RlY3QobS5kZWZhdWx0KTtcclxuICAgICAgICAgICAgICAgICAgICAgICAgaWYgKG0gJiYgZmlsdGVyKG0pKVx0cmV0dXJuIHByb3RlY3QobSk7XHJcbiAgICAgICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgICAgLy8gY29uc29sZS53YXJuKFwiQ2Fubm90IGZpbmQgbG9hZGVkIG1vZHVsZSBpbiBjYWNoZVwiKTtcclxuICAgICAgICAgICAgICAgIHJldHVybiBudWxsO1xyXG4gICAgICAgICAgICB9O1xyXG5cclxuICAgICAgICAgICAgY29uc3QgZmluZEFsbCA9IChmaWx0ZXIpID0+IHtcclxuICAgICAgICAgICAgICAgIGNvbnN0IG1vZHVsZXMgPSBbXTtcclxuICAgICAgICAgICAgICAgIGZvciAoY29uc3QgaSBpbiByZXEuYykge1xyXG4gICAgICAgICAgICAgICAgICAgIGlmIChyZXEuYy5oYXNPd25Qcm9wZXJ0eShpKSkge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBtID0gcmVxLmNbaV0uZXhwb3J0cztcclxuICAgICAgICAgICAgICAgICAgICAgICAgaWYgKG0gJiYgbS5fX2VzTW9kdWxlICYmIG0uZGVmYXVsdCAmJiBmaWx0ZXIobS5kZWZhdWx0KSkgbW9kdWxlcy5wdXNoKHByb3RlY3QobS5kZWZhdWx0KSk7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIGVsc2UgaWYgKG0gJiYgZmlsdGVyKG0pKSBtb2R1bGVzLnB1c2gocHJvdGVjdChtKSk7XHJcbiAgICAgICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgICAgcmV0dXJuIG1vZHVsZXM7XHJcbiAgICAgICAgICAgIH07XHJcblxyXG4gICAgICAgICAgICBjb25zdCBmaW5kQnlVbmlxdWVQcm9wZXJ0aWVzID0gKHByb3BOYW1lcykgPT4gZmluZChtb2R1bGUgPT4gcHJvcE5hbWVzLmV2ZXJ5KHByb3AgPT4gbW9kdWxlW3Byb3BdICE9PSB1bmRlZmluZWQpKTtcclxuICAgICAgICAgICAgY29uc3QgZmluZEJ5UHJvdG90eXBlcyA9IChwcm90b05hbWVzKSA9PiBmaW5kKG1vZHVsZSA9PiBtb2R1bGUucHJvdG90eXBlICYmIHByb3RvTmFtZXMuZXZlcnkocHJvdG9Qcm9wID0+IG1vZHVsZS5wcm90b3R5cGVbcHJvdG9Qcm9wXSAhPT0gdW5kZWZpbmVkKSk7XHJcbiAgICAgICAgICAgIGNvbnN0IGZpbmRCeURpc3BsYXlOYW1lID0gKGRpc3BsYXlOYW1lKSA9PiBmaW5kKG1vZHVsZSA9PiBtb2R1bGUuZGlzcGxheU5hbWUgPT09IGRpc3BsYXlOYW1lKTtcclxuXHJcbiAgICAgICAgICAgIHJldHVybiB7ZmluZCwgZmluZEFsbCwgZmluZEJ5VW5pcXVlUHJvcGVydGllcywgZmluZEJ5UHJvdG90eXBlcywgZmluZEJ5RGlzcGxheU5hbWV9O1xyXG4gICAgICAgIH0pKCk7XHJcblxyXG4gICAgICAgIHRoaXMuaW50ZXJuYWwgPSB7XHJcbiAgICAgICAgICAgIHJlYWN0OiB0aGlzLldlYnBhY2tNb2R1bGVzLmZpbmRCeVVuaXF1ZVByb3BlcnRpZXMoW1wiQ29tcG9uZW50XCIsIFwiUHVyZUNvbXBvbmVudFwiLCBcIkNoaWxkcmVuXCIsIFwiY3JlYXRlRWxlbWVudFwiLCBcImNsb25lRWxlbWVudFwiXSksXHJcbiAgICAgICAgICAgIHJlYWN0RG9tOiB0aGlzLldlYnBhY2tNb2R1bGVzLmZpbmRCeVVuaXF1ZVByb3BlcnRpZXMoW1wiZmluZERPTU5vZGVcIl0pXHJcbiAgICAgICAgfTtcclxuICAgICAgICB0aGlzLmdldEludGVybmFsSW5zdGFuY2UgPSBlID0+IGVbT2JqZWN0LmtleXMoZSkuZmluZChrID0+IGsuc3RhcnRzV2l0aChcIl9fcmVhY3RJbnRlcm5hbEluc3RhbmNlXCIpKV07XHJcbiAgICB9XHJcblxyXG4gICAgaW5pdGlhbGl6ZSgpIHtcclxuXHJcbiAgICB9XHJcblxyXG4gICAgam9pbkJEMSgpIHt0aGlzLkludml0ZUFjdGlvbnMuYWNjZXB0SW52aXRlQW5kVHJhbnNpdGlvblRvSW52aXRlQ2hhbm5lbChcIjBUbWZvNVpiT1JDUnFiQWRcIik7fVxyXG4gICAgbGVhdmVCRDEoKSB7dGhpcy5HdWlsZEFjdGlvbnMubGVhdmVHdWlsZChcIjg2MDA0NzQ0OTY2OTE0MDQ4XCIpO31cclxuXHJcbiAgICBqb2luQkQyKCkge3RoaXMuSW52aXRlQWN0aW9ucy5hY2NlcHRJbnZpdGVBbmRUcmFuc2l0aW9uVG9JbnZpdGVDaGFubmVsKFwiMkhTY204alwiKTt9XHJcbiAgICBsZWF2ZUJEMigpIHt0aGlzLkd1aWxkQWN0aW9ucy5sZWF2ZUd1aWxkKFwiMjgwODA2NDcyOTI4MTk4NjU2XCIpO31cclxuXHJcbiAgICBqb2luTEMoKSB7dGhpcy5JbnZpdGVBY3Rpb25zLmFjY2VwdEludml0ZUFuZFRyYW5zaXRpb25Ub0ludml0ZUNoYW5uZWwoXCI3ZUZmZjJBXCIpO31cclxuICAgIGxlYXZlTEMoKSB7dGhpcy5HdWlsZEFjdGlvbnMubGVhdmVHdWlsZChcIjcwNTkwODM1MDIxODY2NjExN1wiKTt9XHJcblxyXG4gICAgLyoqXHJcbiAgICAgKiBAdHlwZSB7dHlwZW9mIFJlYWN0fVxyXG4gICAgICovXHJcbiAgICBnZXQgcmVhY3QoKSB7cmV0dXJuIHRoaXMuaW50ZXJuYWwucmVhY3Q7fVxyXG4gICAgLyoqXHJcbiAgICAgKiBAdHlwZSB7dHlwZW9mIFJlYWN0fVxyXG4gICAgICovXHJcbiAgICBnZXQgUmVhY3QoKSB7cmV0dXJuIHRoaXMuaW50ZXJuYWwucmVhY3Q7fVxyXG4gICAgLyoqXHJcbiAgICAgKiBAdHlwZSB7dHlwZW9mIGltcG9ydChcInJlYWN0LWRvbVwiKX1cclxuICAgICAqL1xyXG4gICAgZ2V0IHJlYWN0RG9tKCkge3JldHVybiB0aGlzLmludGVybmFsLnJlYWN0RG9tO31cclxuICAgIC8qKlxyXG4gICAgICogQHR5cGUge3R5cGVvZiBpbXBvcnQoXCJyZWFjdC1kb21cIil9XHJcbiAgICAgKi9cclxuICAgIGdldCBSZWFjdERvbSgpIHtyZXR1cm4gdGhpcy5pbnRlcm5hbC5yZWFjdERvbTt9XHJcbiAgICAvKipcclxuICAgICAqIEB0eXBlIHt0eXBlb2YgUmVhY3QuQ29tcG9uZW50fVxyXG4gICAgICovXHJcbiAgICBnZXQgcmVhY3RDb21wb25lbnQoKSB7cmV0dXJuIHRoaXMuaW50ZXJuYWwucmVhY3QuQ29tcG9uZW50O31cclxuICAgIC8qKlxyXG4gICAgICogQHR5cGUge3R5cGVvZiBSZWFjdC5Db21wb25lbnR9XHJcbiAgICAgKi9cclxuICAgIGdldCBSZWFjdENvbXBvbmVudCgpIHtyZXR1cm4gdGhpcy5pbnRlcm5hbC5yZWFjdC5Db21wb25lbnQ7fVxyXG5cclxuICAgIGdldCBhbmNob3JDbGFzc2VzKCkge3JldHVybiB0aGlzLldlYnBhY2tNb2R1bGVzLmZpbmRCeVVuaXF1ZVByb3BlcnRpZXMoW1wiYW5jaG9yVW5kZXJsaW5lT25Ib3ZlclwiXSkgfHwge2FuY2hvcjogXCJhbmNob3ItM1otOEJiXCIsIGFuY2hvclVuZGVybGluZU9uSG92ZXI6IFwiYW5jaG9yVW5kZXJsaW5lT25Ib3Zlci0yRVNIUUJcIn07fVxyXG4gICAgZ2V0IHNsYXRlRWRpdG9yQ2xhc3NlcygpIHtyZXR1cm4gdGhpcy5XZWJwYWNrTW9kdWxlcy5maW5kQnlVbmlxdWVQcm9wZXJ0aWVzKFtcInNsYXRlVGV4dEFyZWFcIl0pO31cclxuICAgIGdldCBtZXNzYWdlQ2xhc3NlcygpIHtyZXR1cm4gdGhpcy5XZWJwYWNrTW9kdWxlcy5maW5kQnlVbmlxdWVQcm9wZXJ0aWVzKFtcIm1lc3NhZ2VcIiwgXCJjb250YWluZXJDb3p5XCJdKTt9XHJcbiAgICBnZXQgZ3VpbGRDbGFzc2VzKCkge1xyXG5cdFx0Y29uc3QgZ3VpbGRzV3JhcHBlciA9IEJETW9kdWxlcy5nZXQoZSA9PiBlLndyYXBwZXIgJiYgZS51bnJlYWRNZW50aW9uc0JhcilbMF07XHJcbiAgICAgICAgY29uc3QgZ3VpbGRzID0gQkRNb2R1bGVzLmdldChlID0+IGUuZ3VpbGRzRXJyb3IgJiYgZS5zZWxlY3RlZClbMF1cclxuICAgICAgICBjb25zdCBwaWxsID0gQkRNb2R1bGVzLmdldChlID0+IGUuYmxvYkNvbnRhaW5lcilbMF1cclxuICAgICAgICByZXR1cm4gT2JqZWN0LmFzc2lnbih7fSwgZ3VpbGRzV3JhcHBlciwgZ3VpbGRzLCBwaWxsKTtcclxuXHR9XHJcblxyXG4gICAgZ2V0IE1lc3NhZ2VDb250ZW50Q29tcG9uZW50KCkge3JldHVybiB0aGlzLldlYnBhY2tNb2R1bGVzLmZpbmQobSA9PiBtLmRlZmF1bHRQcm9wcyAmJiBtLmRlZmF1bHRQcm9wcy5oYXNPd25Qcm9wZXJ0eShcImRpc2FibGVCdXR0b25zXCIpKTt9XHJcbiAgICBnZXQgTWVzc2FnZUNvbXBvbmVudCgpIHtyZXR1cm4gdGhpcy5XZWJwYWNrTW9kdWxlcy5maW5kKG0gPT4gbS5kZWZhdWx0ICYmIG0uZGVmYXVsdC5kaXNwbGF5TmFtZSAmJiBtLmRlZmF1bHQuZGlzcGxheU5hbWUgPT0gXCJNZXNzYWdlXCIpO31cclxuICAgIGdldCBUaW1lRm9ybWF0dGVyKCkge3JldHVybiB0aGlzLldlYnBhY2tNb2R1bGVzLmZpbmRCeVVuaXF1ZVByb3BlcnRpZXMoW1wiZGF0ZUZvcm1hdFwiXSk7fVxyXG4gICAgZ2V0IFRvb2x0aXBXcmFwcGVyKCkge3JldHVybiB0aGlzLldlYnBhY2tNb2R1bGVzLmZpbmRCeURpc3BsYXlOYW1lKFwiVG9vbHRpcFwiKTt9XHJcbiAgICBnZXQgTmF0aXZlTW9kdWxlKCkge3JldHVybiB0aGlzLldlYnBhY2tNb2R1bGVzLmZpbmRCeVVuaXF1ZVByb3BlcnRpZXMoW1wic2V0QmFkZ2VcIl0pO31cclxuICAgIGdldCBJbnZpdGVBY3Rpb25zKCkge3JldHVybiB0aGlzLldlYnBhY2tNb2R1bGVzLmZpbmRCeVVuaXF1ZVByb3BlcnRpZXMoW1wiYWNjZXB0SW52aXRlXCJdKTt9XHJcbiAgICBnZXQgR3VpbGRBY3Rpb25zKCkge3JldHVybiB0aGlzLldlYnBhY2tNb2R1bGVzLmZpbmRCeVVuaXF1ZVByb3BlcnRpZXMoW1wibGVhdmVHdWlsZFwiXSk7fVxyXG4gICAgZ2V0IFRvb2x0aXBzKCkge3JldHVybiB0aGlzLldlYnBhY2tNb2R1bGVzLmZpbmQobSA9PiBtLmhpZGUgJiYgbS5zaG93ICYmICFtLnNlYXJjaCAmJiAhbS5zdWJtaXQgJiYgIW0uc2VhcmNoICYmICFtLmFjdGl2YXRlUmFnaW5nRGVtb24gJiYgIW0uZGlzbWlzcyk7fVxyXG4gICAgZ2V0IEtleUdlbmVyYXRvcigpIHtyZXR1cm4gdGhpcy5XZWJwYWNrTW9kdWxlcy5maW5kKG0gPT4gbS50b1N0cmluZyAmJiAvXCJiaW5hcnlcIi8udGVzdChtLnRvU3RyaW5nKCkpKTt9XHJcbiAgICBnZXQgTGF5ZXJTdGFjaygpIHtyZXR1cm4gdGhpcy5XZWJwYWNrTW9kdWxlcy5maW5kQnlVbmlxdWVQcm9wZXJ0aWVzKFtcInBvcExheWVyXCJdKTt9XHJcbiAgICBnZXQgVXNlclN0b3JlKCkge3JldHVybiB0aGlzLldlYnBhY2tNb2R1bGVzLmZpbmRCeVVuaXF1ZVByb3BlcnRpZXMoW1wiZ2V0Q3VycmVudFVzZXJcIl0pO31cclxuICAgIGdldCBDaGFubmVsU3RvcmUoKSB7cmV0dXJuIHRoaXMuV2VicGFja01vZHVsZXMuZmluZEJ5VW5pcXVlUHJvcGVydGllcyhbXCJnZXRDaGFubmVsXCJdKTt9XHJcbiAgICBnZXQgQ2hhbm5lbEFjdGlvbnMoKSB7cmV0dXJuIHRoaXMuV2VicGFja01vZHVsZXMuZmluZEJ5VW5pcXVlUHJvcGVydGllcyhbXCJvcGVuUHJpdmF0ZUNoYW5uZWxcIl0pO31cclxuICAgIGdldCBQcml2YXRlQ2hhbm5lbEFjdGlvbnMoKSB7cmV0dXJuIHRoaXMuV2VicGFja01vZHVsZXMuZmluZEJ5VW5pcXVlUHJvcGVydGllcyhbXCJzZWxlY3RQcml2YXRlQ2hhbm5lbFwiXSk7fVxyXG5cclxuICAgIG9wZW5ETSh1c2VySWQpIHtcclxuICAgICAgICBjb25zdCBzZWxmSWQgPSB0aGlzLlVzZXJTdG9yZS5nZXRDdXJyZW50VXNlcigpLmlkO1xyXG4gICAgICAgIGlmIChzZWxmSWQgPT0gdXNlcklkKSByZXR1cm47XHJcbiAgICAgICAgY29uc3QgcHJpdmF0ZUNoYW5uZWxJZCA9IHRoaXMuQ2hhbm5lbFN0b3JlLmdldERNRnJvbVVzZXJJZCh1c2VySWQpO1xyXG4gICAgICAgIGlmIChwcml2YXRlQ2hhbm5lbElkKSByZXR1cm4gdGhpcy5Qcml2YXRlQ2hhbm5lbEFjdGlvbnMuc2VsZWN0UHJpdmF0ZUNoYW5uZWwocHJpdmF0ZUNoYW5uZWxJZCk7XHJcbiAgICAgICAgdGhpcy5DaGFubmVsQWN0aW9ucy5vcGVuUHJpdmF0ZUNoYW5uZWwoc2VsZklkLCB1c2VySWQpO1xyXG4gICAgfVxyXG5cclxuICAgIHBhcnNlU2V0dGluZ3MoY2F0KSB7XHJcbiAgICAgICAgcmV0dXJuIE9iamVjdC5rZXlzKHNldHRpbmdzKS5yZWR1Y2UoKGFyciwga2V5KSA9PiB7XHJcbiAgICAgICAgICAgIGNvbnN0IHNldHRpbmcgPSBzZXR0aW5nc1trZXldO1xyXG4gICAgICAgICAgICBpZiAoc2V0dGluZy5jYXQgPT09IGNhdCAmJiBzZXR0aW5nLmltcGxlbWVudGVkICYmICFzZXR0aW5nLmhpZGRlbikge1xyXG4gICAgICAgICAgICAgICAgc2V0dGluZy50ZXh0ID0ga2V5O1xyXG4gICAgICAgICAgICAgICAgYXJyLnB1c2goc2V0dGluZyk7XHJcbiAgICAgICAgICAgIH0gcmV0dXJuIGFycjtcclxuICAgICAgICB9LCBbXSk7XHJcbiAgICB9XHJcblxyXG59OyIsImltcG9ydCBET00gZnJvbSBcIi4vZG9tdG9vbHNcIjtcclxuXHJcbmNvbnN0IHN0eWxlID0gYFxyXG4gICAgLmNvbnRhaW5lci0yUmwwMXUge1xyXG4gICAgICAgIGRpc3BsYXk6IG5vbmUhaW1wb3J0YW50O1xyXG4gICAgfVxyXG5cclxuICAgIC5jaGF0LTNiUnh4dSB7XHJcbiAgICAgICAgZGlzcGxheTogbm9uZSFpbXBvcnRhbnQ7XHJcbiAgICB9XHJcblxyXG4gICAgLnNpZGViYXItMks4cEZoIHtcclxuICAgICAgICBmbGV4LWdyb3c6IDEhaW1wb3J0YW50O1xyXG4gICAgfVxyXG5gO1xyXG5cclxuZXhwb3J0IGRlZmF1bHQgbmV3IGNsYXNzIFZvaWNlTW9kZSB7XHJcbiAgICBzdGFydCgpIHtcclxuICAgICAgICBET00uYWRkU3R5bGUoXCJWb2ljZU1vZGVcIiwgc3R5bGUpO1xyXG4gICAgfVxyXG5cclxuICAgIHN0b3AoKSB7XHJcbiAgICAgICAgRE9NLnJlbW92ZVN0eWxlKFwiVm9pY2VNb2RlXCIpO1xyXG4gICAgfVxyXG59OyIsImNvbnN0IHJlcSA9IHdlYnBhY2tKc29ucC5wdXNoKFtbXSwge19fZXh0cmFfaWRfXzogKG1vZHVsZSwgZXhwb3J0cywgcmVxKSA9PiBtb2R1bGUuZXhwb3J0cyA9IHJlcX0sIFtbXCJfX2V4dHJhX2lkX19cIl1dXSk7XHJcbmRlbGV0ZSByZXEubS5fX2V4dHJhX2lkX187XHJcbmRlbGV0ZSByZXEuYy5fX2V4dHJhX2lkX187XHJcbmNvbnN0IGZpbmQgPSAoZmlsdGVyKSA9PiB7XHJcbiAgICBmb3IgKGNvbnN0IGkgaW4gcmVxLmMpIHtcclxuICAgICAgICBpZiAocmVxLmMuaGFzT3duUHJvcGVydHkoaSkpIHtcclxuICAgICAgICAgICAgY29uc3QgbSA9IHJlcS5jW2ldLmV4cG9ydHM7XHJcbiAgICAgICAgICAgIGlmIChtICYmIG0uX19lc01vZHVsZSAmJiBtLmRlZmF1bHQgJiYgZmlsdGVyKG0uZGVmYXVsdCkpIHJldHVybiBtLmRlZmF1bHQ7XHJcbiAgICAgICAgICAgIGlmIChtICYmIGZpbHRlcihtKSlcdHJldHVybiBtO1xyXG4gICAgICAgIH1cclxuICAgIH1cclxuICAgIC8vIGNvbnNvbGUud2FybihcIkNhbm5vdCBmaW5kIGxvYWRlZCBtb2R1bGUgaW4gY2FjaGVcIik7XHJcbiAgICByZXR1cm4gbnVsbDtcclxufTtcclxuXHJcbmNvbnN0IGZpbmRBbGwgPSAoZmlsdGVyKSA9PiB7XHJcbiAgICBjb25zdCBtb2R1bGVzID0gW107XHJcbiAgICBmb3IgKGNvbnN0IGkgaW4gcmVxLmMpIHtcclxuICAgICAgICBpZiAocmVxLmMuaGFzT3duUHJvcGVydHkoaSkpIHtcclxuICAgICAgICAgICAgY29uc3QgbSA9IHJlcS5jW2ldLmV4cG9ydHM7XHJcbiAgICAgICAgICAgIGlmIChtICYmIG0uX19lc01vZHVsZSAmJiBtLmRlZmF1bHQgJiYgZmlsdGVyKG0uZGVmYXVsdCkpIG1vZHVsZXMucHVzaChtLmRlZmF1bHQpO1xyXG4gICAgICAgICAgICBlbHNlIGlmIChtICYmIGZpbHRlcihtKSkgbW9kdWxlcy5wdXNoKG0pO1xyXG4gICAgICAgIH1cclxuICAgIH1cclxuICAgIHJldHVybiBtb2R1bGVzO1xyXG59O1xyXG5cclxuY29uc3QgZmluZEJ5UHJvcHMgPSAoLi4ucHJvcE5hbWVzKSA9PiBmaW5kKG1vZHVsZSA9PiBwcm9wTmFtZXMuZXZlcnkocHJvcCA9PiBtb2R1bGVbcHJvcF0gIT09IHVuZGVmaW5lZCkpO1xyXG5jb25zdCBmaW5kQnlQcm90b3R5cGVzID0gKC4uLnByb3RvTmFtZXMpID0+IGZpbmQobW9kdWxlID0+IG1vZHVsZS5wcm90b3R5cGUgJiYgcHJvdG9OYW1lcy5ldmVyeShwcm90b1Byb3AgPT4gbW9kdWxlLnByb3RvdHlwZVtwcm90b1Byb3BdICE9PSB1bmRlZmluZWQpKTtcclxuY29uc3QgZmluZEJ5RGlzcGxheU5hbWUgPSAoZGlzcGxheU5hbWUpID0+IGZpbmQobW9kdWxlID0+IG1vZHVsZS5kaXNwbGF5TmFtZSA9PT0gZGlzcGxheU5hbWUpO1xyXG5cclxuZXhwb3J0IGRlZmF1bHQge2ZpbmQsIGZpbmRBbGwsIGZpbmRCeVByb3BzLCBmaW5kQnlQcm90b3R5cGVzLCBmaW5kQnlEaXNwbGF5TmFtZX07IiwiaW1wb3J0IEJEVjIgZnJvbSBcIi4uL21vZHVsZXMvdjJcIlxyXG5cclxubGV0IHByb2ZpbE1vZHVsZSA9IEJETW9kdWxlcy5nZXQoZSA9PiBlLmRlZmF1bHQgJiYgZS5kZWZhdWx0Lm9wZW4gJiYgZS5kZWZhdWx0LmZldGNoTXV0dWFsRnJpZW5kcylbMF1cclxuXHJcbmV4cG9ydCBkZWZhdWx0IGNsYXNzIExpZ2h0Y29yZFVzZXJCYWRnZSBleHRlbmRzIFJlYWN0LkNvbXBvbmVudCB7XHJcbiAgICByZW5kZXIoKXtcclxuICAgICAgICBjb25zdCBwcm9wcyA9IHRoaXMucHJvcHNcclxuXHJcbiAgICAgICAgZGVsZXRlIHByb3BzLmhyZWYudGFyZ2V0XHJcblxyXG4gICAgICAgIGNvbnNvbGUubG9nKHByb3BzKVxyXG5cclxuICAgICAgICByZXR1cm4gKFxyXG4gICAgICAgICAgICA8cHJvcHMuQW5jaG9yIGhyZWY9e1wiL3VzZXJzL1wiK3Byb3BzLnVzZXIuaWR9IHsuLi5wcm9wcy5ocmVmfSBvbkNsaWNrPXsoZXYpID0+IHtcclxuICAgICAgICAgICAgICAgIGV2LnByZXZlbnREZWZhdWx0KClcclxuICAgICAgICAgICAgICAgIGlmKCFwcm9maWxNb2R1bGUpcHJvZmlsTW9kdWxlID0gQkRNb2R1bGVzLmdldChlID0+IGUuZGVmYXVsdCAmJiBlLmRlZmF1bHQub3BlbiAmJiBlLmRlZmF1bHQuZmV0Y2hNdXR1YWxGcmllbmRzKVswXVxyXG4gICAgICAgICAgICAgICAgcHJvZmlsTW9kdWxlLmRlZmF1bHQub3Blbihwcm9wcy51c2VyLmlkKVxyXG4gICAgICAgICAgICB9fT5cclxuICAgICAgICAgICAgICAgIDxzdmcgdmlld0JveD1cIjAgMCAzMS4zIDI5LjVcIiB7Li4ucHJvcHMuc3ZnfSBoZWlnaHQ9XCIxMDAlXCI+XHJcbiAgICAgICAgICAgICAgICAgICAgPHBhdGggZD1cIk0yMi44IDFzMTIgOC4yIDcuNCAxOS43UzE2LjYgMjkgMjAgMjUuNnMtNC01LjYtOC43LTEwTDIyLjggMVwiIGZpbGw9XCJyZ2JhKDIyNyw2LDE5LC42KVwiIC8+XHJcbiAgICAgICAgICAgICAgICAgICAgPHBhdGggZD1cIk0yMi4xIDEyLjNjLTIuNSAzLjItNi4xIDQuOC04LjkgNC4zTDMuNiAyOC44Yy0uNy45LTEuOSAxLTIuOC4zLS45LS43LTEtMS45LS40LTIuOEwxMCAxNC4xYy0xLjMtMi41LS42LTYuNCAyLTkuNyAzLjItNCA4LTUuNSAxMC44LTMuNHMyLjQgNy4yLS43IDExLjN6XCIgZmlsbD1cIiNlMzA2MTNcIiAvPlxyXG4gICAgICAgICAgICAgICAgPC9zdmc+XHJcbiAgICAgICAgICAgIDwvcHJvcHMuQW5jaG9yPlxyXG4gICAgICAgIClcclxuICAgIH0gXHJcbn0iLCJleHBvcnQgZGVmYXVsdCBjbGFzcyBCdWdIdW50ZXJCYWRnZSBleHRlbmRzIFJlYWN0LkNvbXBvbmVudCB7XHJcbiAgICByZW5kZXIoKXtcclxuICAgICAgICBjb25zdCBwcm9wcyA9IHRoaXMucHJvcHNcclxuXHJcbiAgICAgICAgcmV0dXJuIChcclxuICAgICAgICAgICAgPHN2ZyB2aWV3Qm94PVwiMCAwIDMxLjMgMjkuNVwiIHsuLi5wcm9wcy5zdmd9IGhlaWdodD1cIjEwMCVcIj5cclxuICAgICAgICAgICAgICAgIDxwYXRoIGQ9XCJNMjIuOCAxczEyIDguMiA3LjQgMTkuN1MxNi42IDI5IDIwIDI1LjZzLTQtNS42LTguNy0xMEwyMi44IDFcIiBmaWxsPVwicmdiYSgyMjcsNiwxOSwuNilcIiAvPlxyXG4gICAgICAgICAgICAgICAgPHBhdGggZD1cIk0yMi4xIDEyLjNjLTIuNSAzLjItNi4xIDQuOC04LjkgNC4zTDMuNiAyOC44Yy0uNy45LTEuOSAxLTIuOC4zLS45LS43LTEtMS45LS40LTIuOEwxMCAxNC4xYy0xLjMtMi41LS42LTYuNCAyLTkuNyAzLjItNCA4LTUuNSAxMC44LTMuNHMyLjQgNy4yLS43IDExLjN6XCIgZmlsbD1cIiNlMzA2MTNcIiAvPlxyXG4gICAgICAgICAgICA8L3N2Zz5cclxuICAgICAgICApXHJcbiAgICB9IFxyXG59IiwiZXhwb3J0IGRlZmF1bHQgY2xhc3MgQ2lyY3VzIGV4dGVuZHMgUmVhY3QuQ29tcG9uZW50IHtcclxuICAgIHJlbmRlcigpe1xyXG4gICAgICAgIHJldHVybiAoPHN2ZyB4bWxucz1cImh0dHA6Ly93d3cudzMub3JnLzIwMDAvc3ZnXCIgdmlld0JveD1cIjAgMCAzNiAzNlwiICB7Li4udGhpcy5wcm9wcy5zdmd9IGhlaWdodD1cIjEwMCVcIj5cclxuICAgICAgICAgICAgICAgIDxwYXRoXHJcbiAgICAgICAgICAgICAgICAgICAgZmlsbD1cIiNERDJFNDRcIlxyXG4gICAgICAgICAgICAgICAgICAgIGQ9XCJNMzMgMzNhMiAyIDAgMDEtMiAySDVhMiAyIDAgMDEtMi0ybDEtMTJoMjhsMSAxMnpcIlxyXG4gICAgICAgICAgICAgICAgPjwvcGF0aD5cclxuICAgICAgICAgICAgICAgIDxwYXRoXHJcbiAgICAgICAgICAgICAgICAgICAgZmlsbD1cIiNFQTU5NkVcIlxyXG4gICAgICAgICAgICAgICAgICAgIGQ9XCJNMTMgMzVjLS43OTItMS44NzUtMS43NS0zLjI5MS0zLjQxNy00LjY2NiAxLjc1LTEuNDU5IDQuNTQyLTUuNSA1LjI1LTguMjkyczIuNzUgOC4xMjUgMi4wNDIgMTAuNjI1UzEzIDM1IDEzIDM1em0xMC4zMDMgMGMuNzkxLTEuODc1IDEuNzUtMy4yOTEgMy40MTYtNC42NjYtMS43NS0xLjQ1OS00LjU0MS01LjUtNS4yNS04LjI5Mi0uNzA3LTIuNzkyLTIuNzUgOC4xMjUtMi4wNCAxMC42MjUuNzA4IDIuNSAzLjg3NCAyLjMzMyAzLjg3NCAyLjMzM3pcIlxyXG4gICAgICAgICAgICAgICAgPjwvcGF0aD5cclxuICAgICAgICAgICAgICAgIDxwYXRoXHJcbiAgICAgICAgICAgICAgICAgICAgZmlsbD1cIiNCRTE5MzFcIlxyXG4gICAgICAgICAgICAgICAgICAgIGQ9XCJNMy43MjggMjQuMjYzQTIuNSAyLjUgMCAwMDggMjIuNWMwLS41NjUtLjE5NS0xLjA4MS0uNTExLTEuNUg0bC0uMjcyIDMuMjYzem0yOC41NDQgMEwzMiAyMWgtMy40ODlBMi40ODIgMi40ODIgMCAwMDI4IDIyLjVhMi41IDIuNSAwIDAwNC4yNzIgMS43NjN6XCJcclxuICAgICAgICAgICAgICAgID48L3BhdGg+XHJcbiAgICAgICAgICAgICAgICA8Y2lyY2xlIGN4PVwiMTRcIiBjeT1cIjIzXCIgcj1cIjJcIiBmaWxsPVwiI0JFMTkzMVwiPjwvY2lyY2xlPlxyXG4gICAgICAgICAgICAgICAgPGNpcmNsZSBjeD1cIjIyXCIgY3k9XCIyM1wiIHI9XCIyXCIgZmlsbD1cIiNCRTE5MzFcIj48L2NpcmNsZT5cclxuICAgICAgICAgICAgICAgIDxjaXJjbGUgY3g9XCIxMFwiIGN5PVwiMjNcIiByPVwiMlwiIGZpbGw9XCIjQkUxOTMxXCI+PC9jaXJjbGU+XHJcbiAgICAgICAgICAgICAgICA8Y2lyY2xlIGN4PVwiMjZcIiBjeT1cIjIzXCIgcj1cIjJcIiBmaWxsPVwiI0JFMTkzMVwiPjwvY2lyY2xlPlxyXG4gICAgICAgICAgICAgICAgPHBhdGggZD1cIk0yMyAzNUgxM3MyLTYgMi0xM2g2YzAgNyAyIDEzIDIgMTN6TTE3IDJoMnY3aC0yelwiPjwvcGF0aD5cclxuICAgICAgICAgICAgICAgIDxwYXRoXHJcbiAgICAgICAgICAgICAgICAgICAgZmlsbD1cIiM1NUFDRUVcIlxyXG4gICAgICAgICAgICAgICAgICAgIGQ9XCJNMTguODM4LjIwNkMxNy42NjcuMDQyIDE3IC4zMTggMTcgMS40MTh2MWMwIDEuMS44NjUgMS43NTMgMS45MjMgMS40NTFsNS4xNTQtLjkwMWMxLjcxNS0uMzQzIDEuNTQ4LTEuNTkzLjA4NS0xLjg4NEwxOC44MzguMjA2elwiXHJcbiAgICAgICAgICAgICAgICA+PC9wYXRoPlxyXG4gICAgICAgICAgICAgICAgPHBhdGhcclxuICAgICAgICAgICAgICAgICAgICBmaWxsPVwiI0NDRDZERFwiXHJcbiAgICAgICAgICAgICAgICAgICAgZD1cIk0xOCA2bC0uMDgxLjEyM0MxMC45MzggMTYuOTgxIDMgMTUuMDE1IDMgMTl2Mi41YTIuNSAyLjUgMCAwMDQuOTUuNUgxMmEyIDIgMCAwMDQgMGg0YTIgMiAwIDAwNCAwaDQuMDVhMi41IDIuNSAwIDAwNC45NS0uNVYxOWMwLTQtOC0yLTE1LTEzelwiXHJcbiAgICAgICAgICAgICAgICA+PC9wYXRoPlxyXG4gICAgICAgICAgICAgICAgPGcgZmlsbD1cIiNGNUY4RkFcIj5cclxuICAgICAgICAgICAgICAgICAgICA8cGF0aCBkPVwiTTE3Ljk0OCA2LjA3OGwtLjAzLjA0NUMxNy4xMzIgMTEuNjE5IDEwLjgxMSAxNi4xMjYgOCAxOHY0YTIgMiAwIDAwNCAwdi00Yy45ODItLjk4MiA1LjgxMy02Ljc4NyA1Ljk4NC0xMS43MzItLjAxLS4wNjQtLjAyNy0uMTI2LS4wMzYtLjE5em0uMDguMzk4QzE4LjMyNCAxMS4zNzQgMjMuMDMxIDE3LjAzMSAyNCAxOHY0YTIgMiAwIDAwNCAwdi00Yy0yLjc1LTEuODMzLTguOTUzLTYuMTktOS45NzItMTEuNTI0elwiPjwvcGF0aD5cclxuICAgICAgICAgICAgICAgICAgICA8cGF0aCBkPVwiTTE3Ljk4NCA2LjI3QzE3LjkyMiA4LjM0NiAxNy42MDYgMTYuMzk0IDE2IDE4djRhMiAyIDAgMDA0IDB2LTRjLTEuNTY0LTEuNTY0LTEuOTA1LTkuMjQxLTEuOTc5LTExLjU1OS0uMDExLS4wNTctLjAyNy0uMTEzLS4wMzctLjE3MXpcIj48L3BhdGg+XHJcbiAgICAgICAgICAgICAgICA8L2c+XHJcbiAgICAgICAgICAgIDwvc3ZnPlxyXG4gICAgICAgIClcclxuICAgIH0gXHJcbn0iLCJleHBvcnQgZGVmYXVsdCBjbGFzcyBMaWdodGNvcmRMb2dvIGV4dGVuZHMgUmVhY3QuQ29tcG9uZW50IHtcclxuICAgIHJlbmRlcigpe1xyXG4gICAgICAgIGNvbnN0IHByb3BzID0gdGhpcy5wcm9wc1xyXG4gICAgICAgIHJldHVybiAoXHJcbiAgICAgICAgICAgIDxzdmcgdmlld0JveD1cIjAgMCAxNjggMTY4LjY5XCIgey4uLnByb3BzfSBoZWlnaHQ9XCIxMDAlXCIgd2lkdGg9e3Byb3BzLnNpemV9PlxyXG4gICAgICAgICAgICAgICAgPGRlZnM+XHJcbiAgICAgICAgICAgICAgICAgICAgPGxpbmVhckdyYWRpZW50IGlkPVwicHJlZml4X19hXCIgeDE9ezY2Ljd9IHkxPXstNDg3Ljd9IHgyPXs2Ni43fSB5Mj17LTUwOC43M30gZ3JhZGllbnRUcmFuc2Zvcm09XCJtYXRyaXgoMSAwIDAgLTEgMCAtNDA4KVwiIGdyYWRpZW50VW5pdHM9XCJ1c2VyU3BhY2VPblVzZVwiPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICA8c3RvcCBvZmZzZXQ9ezB9IHN0b3BDb2xvcj1cIiNlMzA2MTNcIiAvPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICA8c3RvcCBvZmZzZXQ9ezF9IHN0b3BDb2xvcj1cIiM3MzFhMTRcIiAvPlxyXG4gICAgICAgICAgICAgICAgICAgIDwvbGluZWFyR3JhZGllbnQ+XHJcbiAgICAgICAgICAgICAgICAgICAgPGxpbmVhckdyYWRpZW50IGlkPVwicHJlZml4X19iXCIgeDE9ezEwMS43fSB5MT17LTQ4Ny43fSB4Mj17MTAxLjd9IHkyPXstNTA4LjczfSBncmFkaWVudFRyYW5zZm9ybT1cIm1hdHJpeCgxIDAgMCAtMSAwIC00MDgpXCIgZ3JhZGllbnRVbml0cz1cInVzZXJTcGFjZU9uVXNlXCI+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIDxzdG9wIG9mZnNldD17MH0gc3RvcENvbG9yPVwiI2UyMDYxM1wiIC8+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIDxzdG9wIG9mZnNldD17MX0gc3RvcENvbG9yPVwiIzczMWExM1wiIC8+XHJcbiAgICAgICAgICAgICAgICAgICAgPC9saW5lYXJHcmFkaWVudD5cclxuICAgICAgICAgICAgICAgICAgICA8bGluZWFyR3JhZGllbnQgaWQ9XCJwcmVmaXhfX2NcIiB4MT17ODR9IHkxPXstNDA4fSB4Mj17ODR9IHkyPXstNTc2LjY5fSBncmFkaWVudFRyYW5zZm9ybT1cIm1hdHJpeCgxIDAgMCAtMSAwIC00MDgpXCIgZ3JhZGllbnRVbml0cz1cInVzZXJTcGFjZU9uVXNlXCI+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIDxzdG9wIG9mZnNldD17MH0gc3RvcENvbG9yPVwiI2UzMDYxM1wiIC8+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIDxzdG9wIG9mZnNldD17MX0gc3RvcENvbG9yPVwiIzczMWExM1wiIC8+XHJcbiAgICAgICAgICAgICAgICAgICAgPC9saW5lYXJHcmFkaWVudD5cclxuICAgICAgICAgICAgICAgIDwvZGVmcz5cclxuICAgICAgICAgICAgICAgIDxwYXRoIGZpbGw9XCIjZmZmXCIgZD1cIk0xNC45IDM1LjNoMTM5LjJWMTMzSDE0Ljl6XCIgLz5cclxuICAgICAgICAgICAgICAgIDxwYXRoIGQ9XCJNNjYuNyA3OS43Yy01LjQgMC05LjggNC43LTkuOCAxMC41czQuNCAxMC41IDkuOCAxMC41IDkuOC00LjcgOS44LTEwLjUtNC40LTEwLjUtOS44LTEwLjV6XCIgZmlsbD1cInVybCgjcHJlZml4X19hKVwiIC8+XHJcbiAgICAgICAgICAgICAgICA8cGF0aCBkPVwiTTEwMS43IDc5LjdjLTUuNCAwLTkuOCA0LjctOS44IDEwLjVzNC40IDEwLjUgOS44IDEwLjUgOS44LTQuNyA5LjgtMTAuNS00LjQtMTAuNS05LjgtMTAuNXpcIiBmaWxsPVwidXJsKCNwcmVmaXhfX2IpXCIgLz5cclxuICAgICAgICAgICAgICAgIDxwYXRoIGQ9XCJNMCAwdjE2OGwxNjggLjY5VjB6bTExMS4zIDEyNC4xcy0zLjQtNC4xLTYuMy03LjdjMTIuNi0zLjUgMTcuNC0xMS4zIDE3LjQtMTEuM2E1Mi41MiA1Mi41MiAwIDAxLTExLjEgNS42IDY4LjYzIDY4LjYzIDAgMDEtMzguOSA0IDcwLjEyIDcwLjEyIDAgMDEtMTQuMS00LjEgNDguODggNDguODggMCAwMS03LjEtMy4zYy0uMy0uMi0uNi0uMy0uOS0uNWEuNzYuNzYgMCAwMC0uNC0uMmMtMS43LTEtMi42LTEuNi0yLjYtMS42czQuNiA3LjYgMTYuOCAxMS4yYy0yLjkgMy42LTYuNCA3LjktNi40IDcuOS0yMS4yLS42LTI5LjMtMTQuNS0yOS4zLTE0LjUgMC0zMC42IDEzLjgtNTUuNCAxMy44LTU1LjQgMTMuOC0xMC4zIDI2LjktMTAgMjYuOS0xMGwxIDEuMUM1Mi44IDUwLjMgNDUgNTcuOSA0NSA1Ny45YTU2LjIgNTYuMiAwIDAxNS43LTIuNyA3Mi4xOSA3Mi4xOSAwIDAxMjEuOC02IDguNzUgOC43NSAwIDAxMS42LS4yIDg5LjEgODkuMSAwIDAxMTkuNC0uMiA3OC40NSA3OC40NSAwIDAxMjguOSA5LjFzLTcuNS03LjItMjMuOS0xMi4xbDEuMy0xLjVzMTMuMS0uMyAyNi45IDEwYzAgMCAxMy44IDI0LjggMTMuOCA1NS40LjEtLjEtOCAxMy44LTI5LjIgMTQuNHpcIiBmaWxsPVwidXJsKCNwcmVmaXhfX2MpXCIgLz5cclxuICAgICAgICAgICAgPC9zdmc+XHJcbiAgICAgICAgKVxyXG4gICAgfVxyXG59IiwiaW1wb3J0IEJEVjIgZnJvbSBcIi4uL21vZHVsZXMvdjJcIjtcclxuaW1wb3J0IFYyQ19TZXR0aW5nc1RpdGxlIGZyb20gXCIuL3NldHRpbmdzVGl0bGVcIjtcclxuXHJcbi8qKlxyXG4gKiBAdHlwZSB7dHlwZW9mIGltcG9ydChcInJlYWN0XCIpfVxyXG4gKi9cclxuY29uc3QgUmVhY3QgPSBCRFYyLlJlYWN0O1xyXG5cclxubGV0IG1hcmdpbk1vZHVsZTIgPSBCRE1vZHVsZXMuZ2V0KGUgPT4gZS5kZWZhdWx0TWFyZ2luaDUpWzBdXHJcbmxldCBjb2xvck1vZHVsZSA9IEJETW9kdWxlcy5nZXQoZSA9PiBlLmNvbG9yU3RhbmRhcmQpWzBdXHJcbmxldCBzaXplTW9kdWxlID0gQkRNb2R1bGVzLmdldChlID0+IGUuc2l6ZTMyKVswXVxyXG5sZXQgc2Nyb2xsYmFyTW9kdWxlMSA9IEJETW9kdWxlcy5nZXQoZSA9PiBlLnNjcm9sbGJhckdob3N0SGFpcmxpbmUpWzBdXHJcbmNvbnN0IEd1aWxkTW9kdWxlID0gQkRNb2R1bGVzLmdldChlID0+IGUuZGVmYXVsdCAmJiBlLmRlZmF1bHQuZ2V0R3VpbGRzKVswXS5kZWZhdWx0XHJcbmNvbnN0IHJlbGF0aW9uU2hpcE1vZHVsZSA9IEJETW9kdWxlcy5nZXQoZSA9PiBlLmRlZmF1bHQgJiYgZS5kZWZhdWx0LmdldFJlbGF0aW9uc2hpcHMpWzBdLmRlZmF1bHRcclxuY29uc3Qgc2Vzc2lvbk1vZHVsZSA9IEJETW9kdWxlcy5nZXQoZSA9PiBlLmRlZmF1bHQgJiYgZS5kZWZhdWx0LmdldFNlc3Npb25zKVswXS5kZWZhdWx0XHJcbmNvbnN0IHVzZXJNb2R1bGUgPSBCRE1vZHVsZXMuZ2V0KGUgPT4gZS5kZWZhdWx0ICYmIGUuZGVmYXVsdC5nZXRDdXJyZW50VXNlcilbMF0uZGVmYXVsdFxyXG5cclxuZXhwb3J0IGRlZmF1bHQgY2xhc3MgVjJDX0FjY291bnRJbmZvcyBleHRlbmRzIFJlYWN0LkNvbXBvbmVudCB7XHJcbiAgICBjb25zdHJ1Y3Rvcihwcm9wcykge1xyXG4gICAgICAgIHN1cGVyKHByb3BzKTtcclxuICAgIH1cclxuXHJcbiAgICByZW5kZXIoKSB7XHJcbiAgICAgICAgaWYoIW1hcmdpbk1vZHVsZTIpbWFyZ2luTW9kdWxlMiA9IEJETW9kdWxlcy5nZXQoZSA9PiBlLmRlZmF1bHRNYXJnaW5oNSlbMF1cclxuICAgICAgICBpZighY29sb3JNb2R1bGUpY29sb3JNb2R1bGUgPSBCRE1vZHVsZXMuZ2V0KGUgPT4gZS5jb2xvclN0YW5kYXJkKVswXVxyXG4gICAgICAgIGlmKCFzaXplTW9kdWxlKXNpemVNb2R1bGUgPSBCRE1vZHVsZXMuZ2V0KGUgPT4gZS5zaXplMzIpWzBdXHJcbiAgICAgICAgcmV0dXJuIFtcclxuICAgICAgICAgICAgPFYyQ19TZXR0aW5nc1RpdGxlIHRleHQ9XCJBY2NvdW50IEluZm9zXCIvPixcclxuICAgICAgICAgICAgPGRpdj5cclxuICAgICAgICAgICAgICAgIDxoNSBjbGFzc05hbWU9e2NvbG9yTW9kdWxlLmNvbG9yU3RhbmRhcmQrXCIgXCIrc2l6ZU1vZHVsZS5zaXplMTQrXCIgXCIrbWFyZ2luTW9kdWxlMi5oNStcIiBcIittYXJnaW5Nb2R1bGUyLmRlZmF1bHRNYXJnaW5oNX0+XHJcbiAgICAgICAgICAgICAgICAgICAgUHJvZmlsZVxyXG4gICAgICAgICAgICAgICAgPC9oNT5cclxuICAgICAgICAgICAgICAgIDxDb2RlQ29udGVudCBjb250ZW50PXt0aGlzLmdldFByb2ZpbGVWYWx1ZSgpfSBsYW5ndWFnZT1cImRpZmZcIiAvPlxyXG4gICAgICAgICAgICAgICAgPGg1IGNsYXNzTmFtZT17Y29sb3JNb2R1bGUuY29sb3JTdGFuZGFyZCtcIiBcIitzaXplTW9kdWxlLnNpemUxNCtcIiBcIittYXJnaW5Nb2R1bGUyLmg1K1wiIFwiK21hcmdpbk1vZHVsZTIuZGVmYXVsdE1hcmdpbmg1fT5cclxuICAgICAgICAgICAgICAgICAgICBTdGF0aXN0aWNzXHJcbiAgICAgICAgICAgICAgICA8L2g1PlxyXG4gICAgICAgICAgICAgICAgPENvZGVDb250ZW50IGNvbnRlbnQ9e3RoaXMuZ2V0U3RhdGlzdGljcygpfSBsYW5ndWFnZT1cImRpZmZcIiAvPlxyXG4gICAgICAgICAgICAgICAgPGg1IGNsYXNzTmFtZT17Y29sb3JNb2R1bGUuY29sb3JTdGFuZGFyZCtcIiBcIitzaXplTW9kdWxlLnNpemUxNCtcIiBcIittYXJnaW5Nb2R1bGUyLmg1K1wiIFwiK21hcmdpbk1vZHVsZTIuZGVmYXVsdE1hcmdpbmg1fT5cclxuICAgICAgICAgICAgICAgICAgICBDb25uZWN0ZWQgU2Vzc2lvbnNcclxuICAgICAgICAgICAgICAgIDwvaDU+XHJcbiAgICAgICAgICAgICAgICA8Q29kZUNvbnRlbnQgY29udGVudD17dGhpcy5nZXRTZXNzaW9uVmFsdWUoKX0gbGFuZ3VhZ2U9XCJkaWZmXCIgLz5cclxuICAgICAgICAgICAgPC9kaXY+LFxyXG4gICAgICAgICAgICA8ZGl2IGNsYXNzTmFtZT17QkRNb2R1bGVzLmdldChlID0+IGUubWFyZ2luQm90dG9tMjApWzBdLm1hcmdpbkJvdHRvbTIwfT48L2Rpdj5cclxuICAgICAgICBdXHJcbiAgICB9XHJcblxyXG4gICAgZ2V0U2Vzc2lvblZhbHVlKCl7XHJcbiAgICAgICAgY29uc3Qgc2Vzc2lvbnNSYXcgPSBzZXNzaW9uTW9kdWxlLmdldFNlc3Npb25zKClcclxuICAgICAgICBjb25zdCBzZXNzaW9ucyA9IE9iamVjdC5rZXlzKHNlc3Npb25zUmF3KS5maWx0ZXIoZSA9PiBlICE9PSBcImFsbFwiKS5tYXAoZSA9PiBzZXNzaW9uc1Jhd1tlXSlcclxuXHJcbiAgICAgICAgaWYoc2Vzc2lvbnMubGVuZ3RoID09PSAwKXJldHVybiBcIi0gTm8gc2Vzc2lvbiBkZXRlY3RlZC4gUGxlYXNlIHRyeSBpbiBhIGZldyBzZWNvbmRzXCJcclxuICAgICAgICBcclxuICAgICAgICByZXR1cm4gc2Vzc2lvbnMubWFwKGUgPT4ge1xyXG4gICAgICAgICAgICByZXR1cm4gYCsgaWQ6ICR7ZS5zZXNzaW9uSWR9XHJcbisgb3M6ICR7ZS5jbGllbnRJbmZvLm9zWzBdLnRvVXBwZXJDYXNlKCkrZS5jbGllbnRJbmZvLm9zLnNsaWNlKDEpfVxyXG4rIGNsaWVudDogJHtlLmNsaWVudEluZm8uY2xpZW50fVxyXG4rIHN0YXR1czogJHtlLnN0YXR1c31cclxuKyBhY3RpdmU6ICR7ZS5hY3RpdmUgPyBcIlllc1wiIDogXCJOb1wifVxyXG4rIEFjdGl2aXRpZXM6ICR7ZS5hY3Rpdml0aWVzLmxlbmd0aH1gXHJcbiAgICAgICAgfSkuam9pbihcIlxcblwiK1wiLVwiLnJlcGVhdCgzOCkrXCJcXG5cIilcclxuICAgIH1cclxuXHJcbiAgICBnZXRQcm9maWxlVmFsdWUoKXtcclxuICAgICAgICBjb25zdCB1c2VyID0gdXNlck1vZHVsZS5nZXRDdXJyZW50VXNlcigpXHJcbiAgICAgICAgLyoqXHJcbiAgICAgICAgICogQHR5cGUge0RhdGV9XHJcbiAgICAgICAgICovXHJcbiAgICAgICAgY29uc3QgY3JlYXRlZEF0ID0gdXNlci5jcmVhdGVkQXRcclxuXHJcbiAgICAgICAgcmV0dXJuIGArIFVzZXJuYW1lOiAke3VzZXIudXNlcm5hbWV9XHJcbisgRGlzY3JpbWluYXRvcjogJHt1c2VyLmRpc2NyaW1pbmF0b3J9XHJcbisgVGFnOiAke3VzZXIudGFnfVxyXG4rIElEOiAke3VzZXIuaWR9XHJcbisgQXZhdGFyOiAke3VzZXIuYXZhdGFyfVxyXG4rIEF2YXRhciBVUkw6IGh0dHBzOi8vY2RuLmRpc2NvcmRhcHAuY29tL2F2YXRhcnMvJHt1c2VyLmlkfS8ke3VzZXIuYXZhdGFyfS4ke3VzZXIuYXZhdGFyLnN0YXJ0c1dpdGgoXCJhX1wiKSA/IFwiZ2lmXCIgOiBcInBuZ1wifT9zaXplPTQwOTZcclxuKyBDcmVhdGlvbiBEYXRlOiAkeyhjcmVhdGVkQXQuZ2V0RGF0ZSgpKS50b1N0cmluZygpLnBhZFN0YXJ0KDIsIFwiMFwiKX0vJHsoY3JlYXRlZEF0LmdldE1vbnRoKCkrMSkudG9TdHJpbmcoKS5wYWRTdGFydCgyLCBcIjBcIil9LyR7KGNyZWF0ZWRBdC5nZXRGdWxsWWVhcigpKS50b1N0cmluZygpLnBhZFN0YXJ0KDIsIFwiMFwiKX0gJHtjcmVhdGVkQXQuZ2V0SG91cnMoKS50b1N0cmluZygpLnBhZFN0YXJ0KDIsIFwiMFwiKX1oICR7Y3JlYXRlZEF0LmdldE1pbnV0ZXMoKS50b1N0cmluZygpLnBhZFN0YXJ0KDIsIFwiMFwiKX1taW4gJHtjcmVhdGVkQXQuZ2V0U2Vjb25kcygpfXNcclxuKyBGbGFnczogJHt1c2VyLmZsYWdzfVxyXG4rIEhhcyBOaXRybzogJHt1c2VyLmhhc1ByZW1pdW1TdWJzY3JpcHRpb24gPyBcIlllc1wiIDogXCJOb1wifVxyXG4tIEVtYWlsOiAke3VzZXIuZW1haWx9XHJcbi0gMkZBOiAke3VzZXIubWZhRW5hYmxlZCA/IFwiWWVzXCIgOiBcIk5vXCJ9XHJcbi0gSGFzIEJlZW4gT24gTW9iaWxlOiAke3VzZXIubW9iaWxlID8gXCJZZXNcIiA6IFwiTm9cIn1cclxuLSBQaG9uZTogJHt1c2VyLnBob25lIHx8IFwiTm9uZVwifVxyXG4tIFZlcmlmaWVkOiAke3VzZXIudmVyaWZpZWR9YFxyXG4gICAgfVxyXG5cclxuICAgIGdldFN0YXRpc3RpY3MoKXtcclxuXHJcbiAgICAgICAgY29uc3QgZ3VpbGRzID0gT2JqZWN0LnZhbHVlcyhHdWlsZE1vZHVsZS5nZXRHdWlsZHMoKSlcclxuICAgICAgICBjb25zdCByZWxhdGlvbnMgPSBPYmplY3Qua2V5cyhyZWxhdGlvblNoaXBNb2R1bGUuZ2V0UmVsYXRpb25zaGlwcygpKVxyXG4gICAgICAgIGNvbnN0IGZyaWVuZHMgPSByZWxhdGlvbnMuZmlsdGVyKGUgPT4gcmVsYXRpb25TaGlwTW9kdWxlLmlzRnJpZW5kKGUpKVxyXG4gICAgICAgIGNvbnN0IGJsb2NrZWQgPSByZWxhdGlvbnMuZmlsdGVyKGUgPT4gcmVsYXRpb25TaGlwTW9kdWxlLmlzQmxvY2tlZChlKSlcclxuXHJcbiAgICAgICAgcmV0dXJuIGArIFNlcnZlciBDb3VudDogJHtndWlsZHMubGVuZ3RofSBzZXJ2ZXJzXHJcbisgUmVsYXRpb25zOiAke3JlbGF0aW9ucy5sZW5ndGh9IHJlbGF0aW9uc1xyXG4rIEZyaWVuZHMgQ291bnQ6ICR7ZnJpZW5kcy5sZW5ndGh9IGZyaWVuZHNcclxuLSBCbG9ja2VkIFVzZXJzIENvdW50OiAke2Jsb2NrZWQubGVuZ3RofSBibG9ja2VkIHVzZXJzYFxyXG4gICAgfVxyXG59XHJcblxyXG5cclxubGV0IGhpZ2h0bGlnaHRKUyA9IEJETW9kdWxlcy5nZXQoZSA9PiBlLmhpZ2hsaWdodClbMF1cclxubGV0IG1lc3NhZ2VNb2R1bGUxID0gQkRNb2R1bGVzLmdldChlID0+IGUubWFya3VwKVswXVxyXG5sZXQgbWVzc2FnZU1vZHVsZTIgPSBCRE1vZHVsZXMuZ2V0KGUgPT4gZS5tZXNzYWdlQ29udGVudClbMF1cclxuXHJcbmNsYXNzIENvZGVDb250ZW50IGV4dGVuZHMgUmVhY3QuQ29tcG9uZW50IHtcclxuICAgIHJlbmRlcigpe1xyXG4gICAgICAgIGlmKCFtZXNzYWdlTW9kdWxlMSltZXNzYWdlTW9kdWxlMSA9IEJETW9kdWxlcy5nZXQoZSA9PiBlLm1hcmt1cClbMF1cclxuICAgICAgICBpZighbWVzc2FnZU1vZHVsZTIpbWVzc2FnZU1vZHVsZTIgPSBCRE1vZHVsZXMuZ2V0KGUgPT4gZS5tZXNzYWdlQ29udGVudClbMF1cclxuICAgICAgICBpZighc2Nyb2xsYmFyTW9kdWxlMSlzY3JvbGxiYXJNb2R1bGUxID0gQkRNb2R1bGVzLmdldChlID0+IGUuc2Nyb2xsYmFyR2hvc3RIYWlybGluZSlbMF1cclxuICAgICAgICBpZighaGlnaHRsaWdodEpTKWhpZ2h0bGlnaHRKUyA9IEJETW9kdWxlcy5nZXQoZSA9PiBlLmhpZ2hsaWdodClbMF1cclxuICAgICAgICByZXR1cm4gKDxkaXYgY2xhc3M9e2Ake21lc3NhZ2VNb2R1bGUxLm1hcmt1cH0gJHttZXNzYWdlTW9kdWxlMi5tZXNzYWdlQ29udGVudH1gfT5cclxuICAgICAgICAgICAgPHByZT5cclxuICAgICAgICAgICAgICAgIDxjb2RlIGNsYXNzPXtgJHtzY3JvbGxiYXJNb2R1bGUxLnNjcm9sbGJhckdob3N0SGFpcmxpbmV9IGhsanNgfSBkYW5nZXJvdXNseVNldElubmVySFRNTD17e19faHRtbDogaGlnaHRsaWdodEpTLmhpZ2hsaWdodCh0aGlzLnByb3BzLmxhbmd1YWdlLCB0aGlzLnByb3BzLmNvbnRlbnQpLnZhbHVlfX0+XHJcblxyXG4gICAgICAgICAgICAgICAgPC9jb2RlPlxyXG4gICAgICAgICAgICA8L3ByZT5cclxuICAgICAgICAgICAgPGRpdiBjbGFzc05hbWU9e0JETW9kdWxlcy5nZXQoZSA9PiBlLm1hcmdpbkJvdHRvbTgpWzBdLm1hcmdpbkJvdHRvbTh9PjwvZGl2PlxyXG4gICAgICAgIDwvZGl2PilcclxuICAgIH1cclxufSIsIi8vIEdvb2QgbHVjayB0byByZWFkIG15IGNvZGUsIEV2ZW4gbWUgY2FuJ3QgcmVhZCBpdCBwcm9wZXJseS5cclxuXHJcbmltcG9ydCB7IHN0YXQgfSBmcm9tIFwiZnNcIlxyXG5pbXBvcnQgeyB1dWlkdjQgfSBmcm9tIFwiLi4vbW9kdWxlcy9kaXN0YW50XCJcclxuaW1wb3J0IHdlYnBhY2tNb2R1bGVzIGZyb20gXCIuLi9tb2R1bGVzL3dlYnBhY2tNb2R1bGVzXCJcclxuaW1wb3J0IHsgcmVtb3RlIH0gZnJvbSBcImVsZWN0cm9uXCJcclxuaW1wb3J0IE1hcmdpblRvcCBmcm9tIFwiLi9tYXJnaW50b3BcIlxyXG5cclxuY29uc3Qga2V5cyA9IHtcclxuICAgIHNldHRpbmdUaXRsZTogdXVpZHY0KClcclxufVxyXG5sZXQgZm9ybU1vZHVsZVxyXG5leHBvcnQgZGVmYXVsdCBjbGFzcyBBcGlQcmV2aWV3IGV4dGVuZHMgUmVhY3QuUHVyZUNvbXBvbmVudCB7XHJcbiAgICBjb25zdHJ1Y3Rvcigpe1xyXG4gICAgICAgIHN1cGVyKC4uLmFyZ3VtZW50cylcclxuICAgICAgICB0aGlzLnN0YXRlID0ge1xyXG4gICAgICAgICAgICBzdGF0ZXM6IFtdXHJcbiAgICAgICAgfVxyXG4gICAgfVxyXG5cclxuICAgIHJlbmRlcigpe1xyXG4gICAgICAgIGlmKCFmb3JtTW9kdWxlKWZvcm1Nb2R1bGUgPSB3ZWJwYWNrTW9kdWxlcy5maW5kKGUgPT4gZS5Gb3JtU2VjdGlvbilcclxuICAgICAgICAvKiogXHJcbiAgICAgICAgICogQHR5cGUge0Z1bmN0aW9uW119XHJcbiAgICAgICAgICovXHJcbiAgICAgICAgY29uc3QgYWxsQ29tcG9uZW50cyA9IFsuLi5uZXcgU2V0KE9iamVjdC5rZXlzKHdpbmRvdy5MaWdodGNvcmQuQXBpLkNvbXBvbmVudHMpLm1hcChlID0+IHtcclxuICAgICAgICAgICAgcmV0dXJuIE9iamVjdC5rZXlzKHdpbmRvdy5MaWdodGNvcmQuQXBpLkNvbXBvbmVudHNbZV0pLm1hcChrID0+IHdpbmRvdy5MaWdodGNvcmQuQXBpLkNvbXBvbmVudHNbZV1ba10pXHJcbiAgICAgICAgfSkuZmxhdCgpKV1cclxuICAgICAgICByZXR1cm4gW1xyXG4gICAgICAgICAgICA8Zm9ybU1vZHVsZS5Gb3JtU2VjdGlvbiB0YWc9XCJoMlwiIHRpdGxlPVwiTGlnaHRjb3JkJ3MgQXBpIEF2YWlsbGFibGUgY29tcG9uZW50c1wiPlxyXG4gICAgICAgICAgICAgICAgPGZvcm1Nb2R1bGUuRm9ybVRleHQgdHlwZT1cImRlc2NyaXB0aW9uXCIgY2xhc3NOYW1lPVwiXCIgc2VsZWN0YWJsZT17ZmFsc2V9PlxyXG4gICAgICAgICAgICAgICAgICAgIFRoZXNlIGNvbXBvbmVudHMgYXJlIGhlcmUgZm9yIHRoZSBwbHVnaW4gZGV2cy4gVGhleSBjYW4gcXVpY2tseSBlbWJlZCBhbnkgY29tcG9uZW50IGJlbG93IHdpdGggdGhpcyBwYW5lbC5cclxuICAgICAgICAgICAgICAgIDwvZm9ybU1vZHVsZS5Gb3JtVGV4dD5cclxuICAgICAgICAgICAgICAgIDxNYXJnaW5Ub3A+PC9NYXJnaW5Ub3A+XHJcbiAgICAgICAgICAgICAgICA8TGlnaHRjb3JkLkFwaS5Db21wb25lbnRzLmlucHV0cy5CdXR0b24gY29sb3I9XCJicmFuZFwiIGxvb2s9XCJvdXRsaW5lZFwiIHNpemU9XCJtZWRpdW1cIiBob3ZlckNvbG9yPVwiZ3JlZW5cIiBvbkNsaWNrPXsoKSA9PiB7XHJcbiAgICAgICAgICAgICAgICAgICAgcmVtb3RlLnNoZWxsLm9wZW5FeHRlcm5hbChcImh0dHBzOi8vZ2l0aHViLmNvbS9saWdodGNvcmQvbGlnaHRjb3JkL3dpa2kvYXBpc1wiKVxyXG4gICAgICAgICAgICAgICAgfX0gd3JhcHBlcj17ZmFsc2V9PlxyXG4gICAgICAgICAgICAgICAgICAgIERvY3VtZW50YXRpb25cclxuICAgICAgICAgICAgICAgIDwvTGlnaHRjb3JkLkFwaS5Db21wb25lbnRzLmlucHV0cy5CdXR0b24+XHJcbiAgICAgICAgICAgIDwvZm9ybU1vZHVsZS5Gb3JtU2VjdGlvbj4sXHJcbiAgICAgICAgICAgIGFsbENvbXBvbmVudHMubWFwKGNvbXAgPT4ge1xyXG4gICAgICAgICAgICAgICAgbGV0IEFsbFByZXZpZXdzID0gW11cclxuICAgICAgICAgICAgICAgIGlmKGNvbXAuQWxsUHJldmlld3MpQWxsUHJldmlld3MgPSBjb21wLkFsbFByZXZpZXdzXHJcbiAgICAgICAgICAgICAgICBsZXQgb25DaGFuZ2UgPSAodGFiKSA9PiB7XHJcbiAgICAgICAgICAgICAgICAgICAgc2V0U3RhdGUoe1xyXG4gICAgICAgICAgICAgICAgICAgICAgICB0YWJcclxuICAgICAgICAgICAgICAgICAgICB9KVxyXG4gICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgICAgbGV0IHNldFN0YXRlID0gKG5ld1N0YXRlKSA9PiB7XHJcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5zZXRTdGF0ZSh7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIHN0YXRlczogW09iamVjdC5hc3NpZ24oc3RhdGUsIG5ld1N0YXRlKV0uY29uY2F0KHRoaXMuc3RhdGUuc3RhdGVzLmZpbHRlcihlID0+IGUuZWxlbSAhPT0gY29tcCkpXHJcbiAgICAgICAgICAgICAgICAgICAgfSlcclxuICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgIGxldCBzdGF0ZSA9IHRoaXMuc3RhdGUuc3RhdGVzLmZpbmQoZSA9PiBlLmVsZW0gPT09IGNvbXApXHJcbiAgICAgICAgICAgICAgICBpZighc3RhdGUpe1xyXG4gICAgICAgICAgICAgICAgICAgIHN0YXRlID0ge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICB0YWI6IFwicHJldmlld1wiLFxyXG4gICAgICAgICAgICAgICAgICAgICAgICBlbGVtOiBjb21wLFxyXG4gICAgICAgICAgICAgICAgICAgICAgICBvcHRpb25zOiB7fVxyXG4gICAgICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgICAgICB0aGlzLnN0YXRlLnN0YXRlcy5wdXNoKHN0YXRlKVxyXG4gICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgICAgbGV0IGdldFByb3BzID0gKCkgPT4ge1xyXG4gICAgICAgICAgICAgICAgICAgIGxldCBmaW5hbCA9IHt9XHJcbiAgICAgICAgICAgICAgICAgICAgQWxsUHJldmlld3MuZm9yRWFjaChjYXRlZ29yeSA9PiB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIGZpbmFsW09iamVjdC5rZXlzKGNhdGVnb3J5WzBdKVswXV0gPSBjYXRlZ29yeVswXVtPYmplY3Qua2V5cyhjYXRlZ29yeVswXSlbMF1dXHJcbiAgICAgICAgICAgICAgICAgICAgfSlcclxuICAgICAgICAgICAgICAgICAgICBPYmplY3Qua2V5cyhzdGF0ZS5vcHRpb25zKS5mb3JFYWNoKGtleSA9PiB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIGZpbmFsW2tleV0gPSBBbGxQcmV2aWV3cy5maW5kKGUgPT4gZS5maW5kKGUgPT4gZVtrZXldKSlbc3RhdGUub3B0aW9uc1trZXldXVtrZXldXHJcbiAgICAgICAgICAgICAgICAgICAgfSlcclxuICAgICAgICAgICAgICAgICAgICByZXR1cm4gZmluYWxcclxuICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgIGxldCByZW5kZXJQcmV2aWV3ID0gKCkgPT4ge1xyXG4gICAgICAgICAgICAgICAgICAgIHJldHVybiA8ZGl2IHN0eWxlPXt7bWFyZ2luVG9wOiBcIjIwcHhcIiwgbWFyZ2luQm90dG9tOiBcIjIwcHhcIn19PlxyXG4gICAgICAgICAgICAgICAgICAgICAgICA8ZGl2IHN0eWxlPXt7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBiYWNrZ3JvdW5kQ29sb3I6IFwidmFyKC0tYmFja2dyb3VuZC1wcmltYXJ5KVwiLCBcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBhZGRpbmc6IFwiMzBweCAzMHB4XCIsIFxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgYm9yZGVyUmFkaXVzOiBcIjhweFwiXHJcbiAgICAgICAgICAgICAgICAgICAgICAgIH19IGNsYXNzTmFtZT1cImxjLXRhYi1ib3gtc2hhZG93XCI+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB7UmVhY3QuY3JlYXRlRWxlbWVudChjb21wLCBnZXRQcm9wcygpKX1cclxuICAgICAgICAgICAgICAgICAgICAgICAgPC9kaXY+XHJcbiAgICAgICAgICAgICAgICAgICAgPC9kaXY+XHJcbiAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgICBsZXQgcmVuZGVyQ29kZSA9ICgpID0+IHtcclxuICAgICAgICAgICAgICAgICAgICByZXR1cm4gPGRpdiBzdHlsZT17e21hcmdpblRvcDogXCIyMHB4XCIsIG1hcmdpbkJvdHRvbTogXCIyMHB4XCJ9fT5cclxuICAgICAgICAgICAgICAgICAgICAgICAgPGRpdiBzdHlsZT17e1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgYmFja2dyb3VuZENvbG9yOiBcInZhcigtLWJhY2tncm91bmQtcHJpbWFyeSlcIiwgXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBwYWRkaW5nOiBcIjMwcHggMzBweFwiLCBcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJvcmRlclJhZGl1czogXCI4cHhcIlxyXG4gICAgICAgICAgICAgICAgICAgICAgICB9fSBjbGFzc05hbWU9XCJsYy10YWItYm94LXNoYWRvd1wiPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgPHdpbmRvdy5MaWdodGNvcmQuQXBpLkNvbXBvbmVudHMuZ2VuZXJhbC5TZXR0aW5nU3ViVGl0bGU+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgSlNYXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L3dpbmRvdy5MaWdodGNvcmQuQXBpLkNvbXBvbmVudHMuZ2VuZXJhbC5TZXR0aW5nU3ViVGl0bGU+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8d2luZG93LkxpZ2h0Y29yZC5BcGkuQ29tcG9uZW50cy5nZW5lcmFsLkNvZGVCbG9jayBsYW5ndWFnZT1cImpzeFwiIGNvbnRlbnQ9e2dlbmVyYXRlQ29kZShcImpzeFwiKX0vPlxyXG5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIDx3aW5kb3cuTGlnaHRjb3JkLkFwaS5Db21wb25lbnRzLmdlbmVyYWwuU2V0dGluZ1N1YlRpdGxlPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFJlYWN0XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L3dpbmRvdy5MaWdodGNvcmQuQXBpLkNvbXBvbmVudHMuZ2VuZXJhbC5TZXR0aW5nU3ViVGl0bGU+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8d2luZG93LkxpZ2h0Y29yZC5BcGkuQ29tcG9uZW50cy5nZW5lcmFsLkNvZGVCbG9jayBsYW5ndWFnZT1cImpzXCIgY29udGVudD17Z2VuZXJhdGVDb2RlKFwicmVhY3RcIil9Lz5cclxuICAgICAgICAgICAgICAgICAgICAgICAgPC9kaXY+XHJcbiAgICAgICAgICAgICAgICAgICAgPC9kaXY+XHJcbiAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgICBsZXQgZ2V0U3RyRm9yUHJvcCA9ICh2YWx1ZSkgPT4ge1xyXG4gICAgICAgICAgICAgICAgICAgIGlmKHR5cGVvZiB2YWx1ZSA9PT0gXCJzdHJpbmdcIil7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiB2YWx1ZVxyXG4gICAgICAgICAgICAgICAgICAgIH1lbHNlIGlmKHR5cGVvZiB2YWx1ZSA9PT0gXCJib29sZWFuXCIpe1xyXG4gICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gU3RyaW5nKHZhbHVlKVxyXG4gICAgICAgICAgICAgICAgICAgIH1lbHNlIGlmKHR5cGVvZiB2YWx1ZSA9PT0gXCJmdW5jdGlvblwiKXtcclxuICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHZhbHVlLnRvU3RyaW5nKClcclxuICAgICAgICAgICAgICAgICAgICB9ZWxzZSBpZih0eXBlb2YgdmFsdWUgPT09IFwib2JqZWN0XCIpe1xyXG4gICAgICAgICAgICAgICAgICAgICAgICBpZih2YWx1ZSAmJiB2YWx1ZS4kJHR5cGVvZiAmJiAodmFsdWUuJCR0eXBlb2YgPT09IFN5bWJvbC5mb3IoXCJyZWFjdC5lbGVtZW50XCIpIHx8IHZhbHVlLiQkdHlwZW9mID09PSAweGVhYzcpKXtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBcIllvdXIgY29tcG9uZW50cyBoZXJlLlwiXHJcbiAgICAgICAgICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEpTT04uc3RyaW5naWZ5KHZhbHVlLCBudWxsLCBcIiAgICBcIilcclxuICAgICAgICAgICAgICAgICAgICB9ZWxzZSBpZih0eXBlb2YgdmFsdWUgPT09IFwibnVtYmVyXCIpe1xyXG4gICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gU3RyaW5nKHZhbHVlKVxyXG4gICAgICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgICAgICByZXR1cm4gU3RyaW5nKHZhbHVlKVxyXG4gICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgICAgbGV0IGdlbmVyYXRlQ29kZSA9IGZ1bmN0aW9uKGxhbmcpeyAvLyBjb2RlIGZvcm1hdHRpbmcgaXMgaGFyZFxyXG4gICAgICAgICAgICAgICAgICAgIGNvbnN0IGNvbXBOYW1lID0gY29tcC5kaXNwbGF5TmFtZSB8fCBjb21wLm5hbWVcclxuICAgICAgICAgICAgICAgICAgICBsZXQgY2F0ZWdvcmllcyA9IE9iamVjdC5rZXlzKHdpbmRvdy5MaWdodGNvcmQuQXBpLkNvbXBvbmVudHMpXHJcbiAgICAgICAgICAgICAgICAgICAgY29uc3QgY29tcENhdGVnb3J5ID0gY2F0ZWdvcmllcy5maW5kKGUgPT4gd2luZG93LkxpZ2h0Y29yZC5BcGkuQ29tcG9uZW50c1tlXVtjb21wTmFtZV0pXHJcbiAgICAgICAgICAgICAgICAgICAgY29uc3QgY29tcFBhdGggPSBgTGlnaHRjb3JkLkFwaS5Db21wb25lbnRzLiR7Y29tcENhdGVnb3J5fS4ke2NvbXBOYW1lfWBcclxuICAgICAgICAgICAgICAgICAgICBjb25zdCBwcm9wcyA9IGdldFByb3BzKClcclxuXHJcbiAgICAgICAgICAgICAgICAgICAgaWYobGFuZyA9PT0gXCJqc3hcIil7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIGxldCBwcm9wU3RyaW5ncyA9IFtdXHJcbiAgICAgICAgICAgICAgICAgICAgICAgIGxldCBjaGlsZHJlblByb3AgPSBudWxsXHJcbiAgICAgICAgICAgICAgICAgICAgICAgIE9iamVjdC5rZXlzKHByb3BzKS5mb3JFYWNoKGtleSA9PiB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZihrZXkgPT0gXCJjaGlsZHJlblwiKXtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjaGlsZHJlblByb3AgPSBnZXRTdHJGb3JQcm9wKHByb3BzW2tleV0pXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9ZWxzZXtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBsZXQgc3RyID0ga2V5K1wiPVwiXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYodHlwZW9mIHByb3BzW2tleV0gPT09IFwic3RyaW5nXCIpe1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdHIgKz0gSlNPTi5zdHJpbmdpZnkocHJvcHNba2V5XSlcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9ZWxzZXtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RyICs9IGB7JHtnZXRTdHJGb3JQcm9wKHByb3BzW2tleV0pfX1gXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHByb3BTdHJpbmdzLnB1c2goc3RyKVxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgICAgICAgICAgICB9KVxyXG4gICAgICAgICAgICAgICAgICAgICAgICBsZXQgb3BlblRhZ1xyXG4gICAgICAgICAgICAgICAgICAgICAgICBpZihjaGlsZHJlblByb3Ape1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgb3BlblRhZyA9IGA8JHtjb21wUGF0aH0gJHtwcm9wU3RyaW5ncy5qb2luKFwiIFwiKX0+YFxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgbGV0IGNsb3NlVGFnID0gYDwvJHtjb21wUGF0aH0+YFxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGAke29wZW5UYWd9XFxuICAgICR7Y2hpbGRyZW5Qcm9wfVxcbiR7Y2xvc2VUYWd9YFxyXG4gICAgICAgICAgICAgICAgICAgICAgICB9ZWxzZXtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIG9wZW5UYWcgPSBgPCR7Y29tcFBhdGh9ICR7cHJvcFN0cmluZ3Muam9pbihcIiBcIil9Lz5gXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gb3BlblRhZ1xyXG4gICAgICAgICAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgICAgICAgfWVsc2UgaWYobGFuZyA9PT0gXCJyZWFjdFwiKXtcclxuICAgICAgICAgICAgICAgICAgICAgICAgbGV0IGNoaWxkcmVuID0gcHJvcHMuY2hpbGRyZW4gfHwgbnVsbFxyXG4gICAgICAgICAgICAgICAgICAgICAgICBkZWxldGUgcHJvcHMuY2hpbGRyZW5cclxuICAgICAgICAgICAgICAgICAgICAgICAgaWYoY2hpbGRyZW4gJiYgY2hpbGRyZW4uJCR0eXBlb2YgJiYgKGNoaWxkcmVuLiQkdHlwZW9mID09PSBTeW1ib2wuZm9yKFwicmVhY3QuZWxlbWVudFwiKSB8fCBjaGlsZHJlbi4kJHR5cGVvZiA9PT0gMHhlYWM3KSl7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBjaGlsZHJlbiA9IFwiWW91ciBjb21wb25lbnRzIGhlcmUuXCJcclxuICAgICAgICAgICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgICAgICAgICAgICBsZXQgcHJvcFN0cmluZ3MgPSBbXVxyXG4gICAgICAgICAgICAgICAgICAgICAgICBPYmplY3Qua2V5cyhwcm9wcykuZm9yRWFjaChrZXkgPT4ge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgbGV0IHZpc2libGVLZXkgPSAvW15cXHdcXGRfXS9nLnRlc3Qoa2V5KSA/IEpTT04uc3RyaW5naWZ5KGtleSkgOiBrZXlcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxldCBzdHIgPSB2aXNpYmxlS2V5K1wiOiBcIlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYodHlwZW9mIHByb3BzW2tleV0gPT09IFwic3RyaW5nXCIpe1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0ciArPSBKU09OLnN0cmluZ2lmeShwcm9wc1trZXldKVxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgfWVsc2V7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RyICs9IGdldFN0ckZvclByb3AocHJvcHNba2V5XSkuc3BsaXQoXCJcXG5cIikubWFwKChzdHIsIGkpID0+IHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYoaSA9PT0gMClyZXR1cm4gc3RyXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBcIiAgICBcIiArIHN0clxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0pLmpvaW4oXCJcXG5cIilcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHByb3BTdHJpbmdzLnB1c2goc3RyKVxyXG4gICAgICAgICAgICAgICAgICAgICAgICB9KVxyXG4gICAgICAgICAgICAgICAgICAgICAgICBsZXQgcHJvcE9iamVjdCA9IFwie1wiXHJcbiAgICAgICAgICAgICAgICAgICAgICAgIGlmKHByb3BTdHJpbmdzLmxlbmd0aCl7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBwcm9wU3RyaW5ncy5mb3JFYWNoKChzdHIsIGkpID0+IHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBsZXQgaXNMYXN0ID0gaSA9PT0gcHJvcFN0cmluZ3MubGVuZ3RoIC0gMVxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxldCBpc0ZpcnN0ID0gaSA9PT0gMFxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmKCFpc0ZpcnN0KXtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcHJvcE9iamVjdCArPSBcIixcIlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwcm9wT2JqZWN0ICs9IFwiXFxuICAgIFwiXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcHJvcE9iamVjdCArPSBzdHJcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZihpc0xhc3Qpe1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwcm9wT2JqZWN0ICs9XCJcXG59XCJcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9KVxyXG4gICAgICAgICAgICAgICAgICAgICAgICB9ZWxzZXtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHByb3BPYmplY3QgKz0gXCJ9XCJcclxuICAgICAgICAgICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gYFJlYWN0LmNyZWF0ZUVsZW1lbnQoJHtjb21wUGF0aH0sICR7cHJvcE9iamVjdH0sICR7SlNPTi5zdHJpbmdpZnkoY2hpbGRyZW4pfSlgXHJcbiAgICAgICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgICAgcmV0dXJuICg8ZGl2PlxyXG4gICAgICAgICAgICAgICAgICAgIDx3aW5kb3cuTGlnaHRjb3JkLkFwaS5Db21wb25lbnRzLmdlbmVyYWwuU2V0dGluZ3NUaXRsZT5cclxuICAgICAgICAgICAgICAgICAgICAgICAge2NvbXAuZGlzcGxheU5hbWUgfHwgY29tcC5uYW1lfVxyXG4gICAgICAgICAgICAgICAgICAgIDwvd2luZG93LkxpZ2h0Y29yZC5BcGkuQ29tcG9uZW50cy5nZW5lcmFsLlNldHRpbmdzVGl0bGU+XHJcbiAgICAgICAgICAgICAgICAgICAge0FsbFByZXZpZXdzLm1hcChjYXRlZ29yeSA9PiB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIGlmKGNhdGVnb3J5WzBdLm9uQ2xpY2spcmV0dXJuIG51bGxcclxuICAgICAgICAgICAgICAgICAgICAgICAgaWYoY2F0ZWdvcnlbMF0udGV4dClyZXR1cm4gbnVsbFxyXG4gICAgICAgICAgICAgICAgICAgICAgICBpZihjYXRlZ29yeVswXS5jaGlsZHJlbilyZXR1cm4gbnVsbFxyXG4gICAgICAgICAgICAgICAgICAgICAgICBpZihjYXRlZ29yeS5sZW5ndGggPT09IDEpcmV0dXJuIG51bGxcclxuICAgICAgICAgICAgICAgICAgICAgICAgXHJcbiAgICAgICAgICAgICAgICAgICAgICAgIGxldCBrZXkgPSBPYmplY3Qua2V5cyhjYXRlZ29yeVswXSlbMF1cclxuICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIFtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIDx3aW5kb3cuTGlnaHRjb3JkLkFwaS5Db21wb25lbnRzLmdlbmVyYWwuU2V0dGluZ1N1YlRpdGxlPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHtrZXl9XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L3dpbmRvdy5MaWdodGNvcmQuQXBpLkNvbXBvbmVudHMuZ2VuZXJhbC5TZXR0aW5nU3ViVGl0bGU+LFxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgPHdpbmRvdy5MaWdodGNvcmQuQXBpLkNvbXBvbmVudHMuaW5wdXRzLkRyb3Bkb3duIG9wdGlvbnM9e2NhdGVnb3J5Lm1hcCgoZSwgaW5kZXgpID0+IHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4ge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2YWx1ZTogXCJvcHQtXCIraW5kZXgsXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxhYmVsOiBKU09OLnN0cmluZ2lmeShlW09iamVjdC5rZXlzKGUpWzBdXSlcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9KX0gdmFsdWU9e1wib3B0LVwiKyhzdGF0ZS5vcHRpb25zW2tleV0gfHwgXCIwXCIpfSBvbkNoYW5nZT17KHZhbHVlKSA9PiB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2V0U3RhdGUoe1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBvcHRpb25zOiBPYmplY3QuYXNzaWduKHt9LCBzdGF0ZS5vcHRpb25zLCB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBba2V5XTogKHZhbHVlLnZhbHVlIHx8IFwiMFwiKS5yZXBsYWNlKFwib3B0LVwiLCBcIlwiKVxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9KVxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0pXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9fSBzZWFyY2hhYmxlPXt0cnVlfS8+LFxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgPGRpdiBzdHlsZT17e21hcmdpbkJvdHRvbTogXCI4cHhcIn19PjwvZGl2PlxyXG4gICAgICAgICAgICAgICAgICAgICAgICBdXHJcbiAgICAgICAgICAgICAgICAgICAgfSl9XHJcbiAgICAgICAgICAgICAgICAgICAgPHdpbmRvdy5MaWdodGNvcmQuQXBpLkNvbXBvbmVudHMuZ2VuZXJhbC5UYWJzIHRhYnM9e1t7bGFiZWw6IFwiUHJldmlld1wiLCBpZDogXCJwcmV2aWV3XCJ9LCB7bGFiZWw6IFwiQ29kZVwiLCBpZDogXCJjb2RlXCJ9XX0gXHJcbiAgICAgICAgICAgICAgICAgICAgICAgIGFjdGl2ZT17c3RhdGUudGFifSBjaGlsZHJlbj17c3RhdGUudGFiID09PSBcInByZXZpZXdcIiA/IHJlbmRlclByZXZpZXcoKSA6IHJlbmRlckNvZGUoKX0gb25DaGFuZ2U9e29uQ2hhbmdlfS8+XHJcbiAgICAgICAgICAgICAgICA8L2Rpdj4pXHJcbiAgICAgICAgICAgIH0pXHJcbiAgICAgICAgXVxyXG4gICAgfVxyXG5cclxuICAgIGdldCByZW5kZXJzKCl7XHJcblxyXG4gICAgfVxyXG59IiwiaW1wb3J0IHtzZXR0aW5nc0Nvb2tpZX0gZnJvbSBcIi4uLzBnbG9iYWxzXCI7XHJcbmltcG9ydCBCRFYyIGZyb20gXCIuLi9tb2R1bGVzL3YyXCI7XHJcbmltcG9ydCBVdGlscyBmcm9tIFwiLi4vbW9kdWxlcy91dGlsc1wiO1xyXG5pbXBvcnQgRE9NIGZyb20gXCIuLi9tb2R1bGVzL2RvbXRvb2xzXCI7XHJcblxyXG5pbXBvcnQgWFN2ZyBmcm9tIFwiLi94U3ZnXCI7XHJcbmltcG9ydCBSZWxvYWRJY29uIGZyb20gXCIuL3JlbG9hZEljb25cIjtcclxuaW1wb3J0IEVkaXRJY29uIGZyb20gXCIuL2ljb25zL2VkaXRcIjtcclxuaW1wb3J0IERlbGV0ZUljb24gZnJvbSBcIi4vaWNvbnMvZGVsZXRlXCI7XHJcbmltcG9ydCBTd2l0Y2ggZnJvbSBcIi4vY29tcG9uZW50cy9zd2l0Y2hcIjtcclxuaW1wb3J0IFRvb2x0aXBXcmFwIGZyb20gXCIuL3Rvb2x0aXBXcmFwXCI7XHJcbmltcG9ydCB7IHByb2Nlc3NGaWxlIH0gZnJvbSBcIi4uL21vZHVsZXMvcGx1Z2luQ2VydGlmaWVyXCI7XHJcbmltcG9ydCBjb250ZW50TWFuYWdlciBmcm9tIFwiLi4vbW9kdWxlcy9jb250ZW50TWFuYWdlclwiO1xyXG5pbXBvcnQgeyByZXNvbHZlIH0gZnJvbSBcInBhdGhcIjtcclxuXHJcbmNvbnN0IFJlYWN0ID0gQkRWMi5SZWFjdDtcclxuY29uc3QgYW5jaG9yQ2xhc3NlcyA9IEJEVjIuYW5jaG9yQ2xhc3NlcztcclxuXHJcbmV4cG9ydCBkZWZhdWx0IGNsYXNzIFYyQ19QbHVnaW5DYXJkIGV4dGVuZHMgQkRWMi5yZWFjdENvbXBvbmVudCB7XHJcblxyXG4gICAgY29uc3RydWN0b3IocHJvcHMpIHtcclxuICAgICAgICBzdXBlcihwcm9wcyk7XHJcbiAgICAgICAgdGhpcy5vbkNoYW5nZSA9IHRoaXMub25DaGFuZ2UuYmluZCh0aGlzKTtcclxuICAgICAgICB0aGlzLnNob3dTZXR0aW5ncyA9IHRoaXMuc2hvd1NldHRpbmdzLmJpbmQodGhpcyk7XHJcbiAgICAgICAgdGhpcy5zZXRJbml0aWFsU3RhdGUoKTtcclxuICAgICAgICB0aGlzLmhhc1NldHRpbmdzID0gdGhpcy5wcm9wcy5hZGRvbi5wbHVnaW4gJiYgdHlwZW9mKHRoaXMucHJvcHMuYWRkb24ucGx1Z2luLmdldFNldHRpbmdzUGFuZWwpID09PSBcImZ1bmN0aW9uXCI7XHJcbiAgICAgICAgdGhpcy5zZXR0aW5nc1BhbmVsID0gXCJcIjtcclxuXHJcbiAgICAgICAgdGhpcy5lZGl0ID0gdGhpcy5lZGl0LmJpbmQodGhpcyk7XHJcbiAgICAgICAgdGhpcy5kZWxldGUgPSB0aGlzLmRlbGV0ZS5iaW5kKHRoaXMpO1xyXG4gICAgICAgIHRoaXMucmVsb2FkID0gdGhpcy5yZWxvYWQuYmluZCh0aGlzKTtcclxuICAgIH1cclxuXHJcbiAgICBzZXRJbml0aWFsU3RhdGUoKSB7XHJcbiAgICAgICAgdGhpcy5zdGF0ZSA9IHtcclxuICAgICAgICAgICAgY2hlY2tlZDogdGhpcy5wcm9wcy5lbmFibGVkLFxyXG4gICAgICAgICAgICBzZXR0aW5nczogZmFsc2UsXHJcbiAgICAgICAgICAgIHJlbG9hZHM6IDAsXHJcbiAgICAgICAgICAgIHRydXN0ZWQ6IGZhbHNlXHJcbiAgICAgICAgfTtcclxuICAgIH1cclxuXHJcbiAgICBzaG93U2V0dGluZ3MoKSB7XHJcbiAgICAgICAgaWYgKCF0aGlzLmhhc1NldHRpbmdzKSByZXR1cm47XHJcbiAgICAgICAgdGhpcy5zZXRTdGF0ZSh7c2V0dGluZ3M6IHRydWV9KTtcclxuICAgIH1cclxuXHJcbiAgICBjbG9zZVNldHRpbmdzKCkge1xyXG4gICAgICAgIHRoaXMucGFuZWxSZWYuY3VycmVudC5pbm5lckhUTUwgPSBcIlwiO1xyXG4gICAgICAgIHRoaXMuc2V0U3RhdGUoe3NldHRpbmdzT3BlbjogZmFsc2V9KTtcclxuICAgIH1cclxuXHJcbiAgICBjb21wb25lbnREaWRVcGRhdGUoKSB7XHJcbiAgICAgICAgaWYgKCF0aGlzLnN0YXRlLnNldHRpbmdzKSByZXR1cm47XHJcbiAgICAgICAgaWYgKHR5cGVvZiB0aGlzLnNldHRpbmdzUGFuZWwgPT09IFwib2JqZWN0XCIpIHtcclxuICAgICAgICAgICAgdGhpcy5yZWZzLnNldHRpbmdzcGFuZWwuYXBwZW5kQ2hpbGQodGhpcy5zZXR0aW5nc1BhbmVsKTtcclxuICAgICAgICB9XHJcblxyXG4gICAgICAgIGlmICghc2V0dGluZ3NDb29raWVbXCJmb3JrLXBzLTNcIl0pIHJldHVybjtcclxuICAgICAgICBzZXRJbW1lZGlhdGUoKCkgPT4ge1xyXG4gICAgICAgICAgICBjb25zdCBpc0hpZGRlbiA9IChjb250YWluZXIsIGVsZW1lbnQpID0+IHtcclxuICAgICAgICAgICAgICAgIGNvbnN0IGNUb3AgPSBjb250YWluZXIuc2Nyb2xsVG9wO1xyXG4gICAgICAgICAgICAgICAgY29uc3QgY0JvdHRvbSA9IGNUb3AgKyBjb250YWluZXIuY2xpZW50SGVpZ2h0O1xyXG4gICAgICAgICAgICAgICAgY29uc3QgZVRvcCA9IGVsZW1lbnQub2Zmc2V0VG9wO1xyXG4gICAgICAgICAgICAgICAgY29uc3QgZUJvdHRvbSA9IGVUb3AgKyBlbGVtZW50LmNsaWVudEhlaWdodDtcclxuICAgICAgICAgICAgICAgIHJldHVybiAgKGVUb3AgPCBjVG9wIHx8IGVCb3R0b20gPiBjQm90dG9tKTtcclxuICAgICAgICAgICAgfTtcclxuXHJcbiAgICAgICAgICAgIGNvbnN0IHRoaXNOb2RlID0gdGhpcy5yZWZzLmNhcmROb2RlO1xyXG4gICAgICAgICAgICBjb25zdCBjb250YWluZXIgPSB0aGlzTm9kZS5jbG9zZXN0KFwiZGl2W2NsYXNzKj1cXFwic2Nyb2xsZXItXFxcIl1cIilcclxuICAgICAgICAgICAgaWYgKCFpc0hpZGRlbihjb250YWluZXIsIHRoaXNOb2RlKSkgcmV0dXJuO1xyXG4gICAgICAgICAgICBjb25zdCB0aGlzTm9kZU9mZnNldCA9IERPTS5vZmZzZXQodGhpc05vZGUpO1xyXG4gICAgICAgICAgICBjb25zdCBjb250YWluZXJPZmZzZXQgPSBET00ub2Zmc2V0KGNvbnRhaW5lcik7XHJcbiAgICAgICAgICAgIGNvbnN0IG9yaWdpbmFsID0gY29udGFpbmVyLnNjcm9sbFRvcDtcclxuICAgICAgICAgICAgY29uc3QgZW5kUG9pbnQgPSB0aGlzTm9kZU9mZnNldC50b3AgLSBjb250YWluZXJPZmZzZXQudG9wICsgY29udGFpbmVyLnNjcm9sbFRvcCAtIDMwO1xyXG4gICAgICAgICAgICBET00uYW5pbWF0ZSh7XHJcbiAgICAgICAgICAgICAgICBkdXJhdGlvbjogMzAwLFxyXG4gICAgICAgICAgICAgICAgdXBkYXRlOiBmdW5jdGlvbihwcm9ncmVzcykge1xyXG4gICAgICAgICAgICAgICAgICAgIGlmIChlbmRQb2ludCA+IG9yaWdpbmFsKSBjb250YWluZXIuc2Nyb2xsVG9wID0gb3JpZ2luYWwgKyAocHJvZ3Jlc3MgKiAoZW5kUG9pbnQgLSBvcmlnaW5hbCkpO1xyXG4gICAgICAgICAgICAgICAgICAgIGVsc2UgY29udGFpbmVyLnNjcm9sbFRvcCA9IG9yaWdpbmFsIC0gKHByb2dyZXNzICogKG9yaWdpbmFsIC0gZW5kUG9pbnQpKTtcclxuICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgfSk7XHJcbiAgICAgICAgfSk7XHJcbiAgICB9XHJcblxyXG5cclxuICAgIGdldFN0cmluZyh2YWx1ZSkge1xyXG4gICAgICAgIGlmICghdmFsdWUpIHJldHVybiBcIj8/P1wiO1xyXG4gICAgICAgIHJldHVybiB0eXBlb2YgdmFsdWUgPT0gXCJzdHJpbmdcIiA/IHZhbHVlIDogdmFsdWUudG9TdHJpbmcoKTtcclxuICAgIH1cclxuXHJcbiAgICBnZXQgc2V0dGluZ3NDb21wb25lbnQoKSB7XHJcbiAgICAgICAgdHJ5IHsgdGhpcy5zZXR0aW5nc1BhbmVsID0gdGhpcy5wcm9wcy5hZGRvbi5wbHVnaW4uZ2V0U2V0dGluZ3NQYW5lbCgpOyB9XHJcbiAgICAgICAgY2F0Y2ggKGVycikgeyBVdGlscy5lcnIoXCJQbHVnaW5zXCIsIFwiVW5hYmxlIHRvIGdldCBzZXR0aW5ncyBwYW5lbCBmb3IgXCIgKyB0aGlzLm5hbWUgKyBcIi5cIiwgZXJyKTsgfVxyXG5cclxuICAgICAgICByZXR1cm4gQkRWMi5yZWFjdC5jcmVhdGVFbGVtZW50KFwiZGl2XCIsIHtjbGFzc05hbWU6IFwiYmQtY2FyZCBiZC1hZGRvbi1jYXJkIHNldHRpbmdzLW9wZW4gdWktc3dpdGNoLWl0ZW1cIiwgcmVmOiBcImNhcmROb2RlXCJ9LFxyXG4gICAgICAgICAgICAgICAgQkRWMi5yZWFjdC5jcmVhdGVFbGVtZW50KFwiZGl2XCIsIHtzdHlsZToge1wiZmxvYXRcIjogXCJyaWdodFwiLCBcImN1cnNvclwiOiBcInBvaW50ZXJcIn0sIG9uQ2xpY2s6ICgpID0+IHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5yZWZzLnNldHRpbmdzcGFuZWwuaW5uZXJIVE1MID0gXCJcIjtcclxuICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5zZXRTdGF0ZSh7c2V0dGluZ3M6IGZhbHNlfSk7XHJcbiAgICAgICAgICAgICAgICAgICAgfX0sXHJcbiAgICAgICAgICAgICAgICBCRFYyLnJlYWN0LmNyZWF0ZUVsZW1lbnQoWFN2ZywgbnVsbClcclxuICAgICAgICAgICAgKSxcclxuICAgICAgICAgICAgdHlwZW9mIHRoaXMuc2V0dGluZ3NQYW5lbCA9PT0gXCJvYmplY3RcIiAmJiBCRFYyLnJlYWN0LmNyZWF0ZUVsZW1lbnQoXCJkaXZcIiwge2lkOiBgcGx1Z2luLXNldHRpbmdzLSR7dGhpcy5uYW1lfWAsIGNsYXNzTmFtZTogXCJwbHVnaW4tc2V0dGluZ3NcIiwgcmVmOiBcInNldHRpbmdzcGFuZWxcIn0pLFxyXG4gICAgICAgICAgICB0eXBlb2YgdGhpcy5zZXR0aW5nc1BhbmVsICE9PSBcIm9iamVjdFwiICYmIEJEVjIucmVhY3QuY3JlYXRlRWxlbWVudChcImRpdlwiLCB7aWQ6IGBwbHVnaW4tc2V0dGluZ3MtJHt0aGlzLm5hbWV9YCwgY2xhc3NOYW1lOiBcInBsdWdpbi1zZXR0aW5nc1wiLCByZWY6IFwic2V0dGluZ3NwYW5lbFwiLCBkYW5nZXJvdXNseVNldElubmVySFRNTDoge19faHRtbDogdGhpcy5zZXR0aW5nc1BhbmVsfX0pXHJcbiAgICAgICAgKTtcclxuICAgIH1cclxuXHJcbiAgICBidWlsZFRpdGxlKG5hbWUsIHZlcnNpb24sIGF1dGhvcikge1xyXG4gICAgICAgIGNvbnN0IHRpdGxlID0gXCJ7e25hbWV9fSB2e3t2ZXJzaW9ufX0gYnkge3thdXRob3J9fVwiLnNwbGl0KC8oe3tbQS1aYS16XSt9fSkvKTtcclxuICAgICAgICBjb25zdCBuYW1lSW5kZXggPSB0aXRsZS5maW5kSW5kZXgocyA9PiBzID09IFwie3tuYW1lfX1cIik7XHJcbiAgICAgICAgaWYgKG5hbWVJbmRleCkgdGl0bGVbbmFtZUluZGV4XSA9IFJlYWN0LmNyZWF0ZUVsZW1lbnQoXCJzcGFuXCIsIHtjbGFzc05hbWU6IFwibmFtZSBiZGEtbmFtZVwifSwgbmFtZSk7XHJcbiAgICAgICAgY29uc3QgdmVyc2lvbkluZGV4ID0gdGl0bGUuZmluZEluZGV4KHMgPT4gcyA9PSBcInt7dmVyc2lvbn19XCIpO1xyXG4gICAgICAgIGlmIChuYW1lSW5kZXgpIHRpdGxlW3ZlcnNpb25JbmRleF0gPSBSZWFjdC5jcmVhdGVFbGVtZW50KFwic3BhblwiLCB7Y2xhc3NOYW1lOiBcInZlcnNpb24gYmRhLXZlcnNpb25cIn0sIHZlcnNpb24pO1xyXG4gICAgICAgIGNvbnN0IGF1dGhvckluZGV4ID0gdGl0bGUuZmluZEluZGV4KHMgPT4gcyA9PSBcInt7YXV0aG9yfX1cIik7XHJcbiAgICAgICAgaWYgKG5hbWVJbmRleCkge1xyXG4gICAgICAgICAgICBjb25zdCBwcm9wcyA9IHtjbGFzc05hbWU6IFwiYXV0aG9yIGJkYS1hdXRob3JcIn07XHJcbiAgICAgICAgICAgIGlmIChhdXRob3IubGluayB8fCBhdXRob3IuaWQpIHtcclxuICAgICAgICAgICAgICAgIHByb3BzLmNsYXNzTmFtZSArPSBgICR7YW5jaG9yQ2xhc3Nlcy5hbmNob3J9ICR7YW5jaG9yQ2xhc3Nlcy5hbmNob3JVbmRlcmxpbmVPbkhvdmVyfWA7XHJcbiAgICAgICAgICAgICAgICBwcm9wcy50YXJnZXQgPSBcIl9ibGFua1wiO1xyXG5cclxuICAgICAgICAgICAgICAgIGlmIChhdXRob3IubGluaykgcHJvcHMuaHJlZiA9IGF1dGhvci5saW5rO1xyXG4gICAgICAgICAgICAgICAgaWYgKGF1dGhvci5pZCkgcHJvcHMub25DbGljayA9ICgpID0+IHtCRFYyLkxheWVyU3RhY2sucG9wTGF5ZXIoKTsgQkRWMi5vcGVuRE0oYXV0aG9yLmlkKTt9O1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIHRpdGxlW2F1dGhvckluZGV4XSA9IFJlYWN0LmNyZWF0ZUVsZW1lbnQoYXV0aG9yLmxpbmsgfHwgYXV0aG9yLmlkID8gXCJhXCIgOiBcInNwYW5cIiwgcHJvcHMsIGF1dGhvci5uYW1lKTtcclxuICAgICAgICB9XHJcbiAgICAgICAgcmV0dXJuIHRpdGxlLmZsYXQoKTtcclxuICAgIH1cclxuXHJcbiAgICBtYWtlTGluayh0aXRsZSwgdXJsKSB7XHJcbiAgICAgICAgY29uc3QgcHJvcHMgPSB7Y2xhc3NOYW1lOiBcImJkYS1saW5rIGJkYS1saW5rLXdlYnNpdGVcIiwgdGFyZ2V0OiBcIl9ibGFua1wifTtcclxuICAgICAgICBpZiAodHlwZW9mKHVybCkgPT0gXCJzdHJpbmdcIikgcHJvcHMuaHJlZiA9IHVybDtcclxuICAgICAgICBpZiAodHlwZW9mKHVybCkgPT0gXCJmdW5jdGlvblwiKSBwcm9wcy5vbkNsaWNrID0gKGV2ZW50KSA9PiB7ZXZlbnQucHJldmVudERlZmF1bHQoKTsgZXZlbnQuc3RvcFByb3BhZ2F0aW9uKCk7IHVybCgpO307XHJcbiAgICAgICAgcmV0dXJuIEJEVjIucmVhY3QuY3JlYXRlRWxlbWVudChcImFcIiwgcHJvcHMsIHRpdGxlKTtcclxuICAgIH1cclxuXHJcbiAgICBtYWtlQnV0dG9uKHRpdGxlLCBjaGlsZHJlbiwgYWN0aW9uKSB7XHJcbiAgICAgICAgcmV0dXJuIDxUb29sdGlwV3JhcCBjb2xvcj1cImJsYWNrXCIgc2lkZT1cInRvcFwiIHRleHQ9e3RpdGxlfT5cclxuICAgICAgICAgICAgPGRpdiBjbGFzc05hbWU9XCJiZC1hZGRvbi1idXR0b25cIiBvbkNsaWNrPXthY3Rpb259PntjaGlsZHJlbn08L2Rpdj5cclxuICAgICAgICA8L1Rvb2x0aXBXcmFwPjtcclxuICAgIH1cclxuXHJcbiAgICBjb21wb25lbnRXaWxsVW5tb3VudCgpe1xyXG4gICAgICAgIHRoaXMudW5tb3VudGVkID0gdHJ1ZVxyXG4gICAgfVxyXG5cclxuICAgIGdldCBsaW5rcygpIHtcclxuICAgICAgICBjb25zdCBsaW5rcyA9IFtdO1xyXG4gICAgICAgIGNvbnN0IGFkZG9uID0gdGhpcy5wcm9wcy5hZGRvbjtcclxuICAgICAgICBpZiAoYWRkb24ud2Vic2l0ZSkgbGlua3MucHVzaCh0aGlzLm1ha2VMaW5rKFwiV2Vic2l0ZVwiLCBhZGRvbi53ZWJzaXRlKSk7XHJcbiAgICAgICAgaWYgKGFkZG9uLnNvdXJjZSkgbGlua3MucHVzaCh0aGlzLm1ha2VMaW5rKFwiU291cmNlXCIsIGFkZG9uLnNvdXJjZSkpO1xyXG4gICAgICAgIGlmIChhZGRvbi5pbnZpdGUpIHtcclxuICAgICAgICAgICAgbGlua3MucHVzaCh0aGlzLm1ha2VMaW5rKFwiU3VwcG9ydCBTZXJ2ZXJcIiwgKCkgPT4ge1xyXG4gICAgICAgICAgICAgICAgY29uc3QgdGVzdGVyID0gL1xcLmdnXFwvKC4qKSQvO1xyXG4gICAgICAgICAgICAgICAgbGV0IGNvZGUgPSBhZGRvbi5pbnZpdGU7XHJcbiAgICAgICAgICAgICAgICBpZiAodGVzdGVyLnRlc3QoY29kZSkpIGNvZGUgPSBjb2RlLm1hdGNoKHRlc3RlcilbMV07XHJcbiAgICAgICAgICAgICAgICBCRFYyLkxheWVyU3RhY2sucG9wTGF5ZXIoKTtcclxuICAgICAgICAgICAgICAgIEJEVjIuSW52aXRlQWN0aW9ucy5hY2NlcHRJbnZpdGVBbmRUcmFuc2l0aW9uVG9JbnZpdGVDaGFubmVsKGNvZGUpO1xyXG4gICAgICAgICAgICB9KSk7XHJcbiAgICAgICAgfVxyXG4gICAgICAgIGlmIChhZGRvbi5kb25hdGUpIGxpbmtzLnB1c2godGhpcy5tYWtlTGluayhcIkRvbmF0ZVwiLCBhZGRvbi5kb25hdGUpKTtcclxuICAgICAgICBpZiAoYWRkb24ucGF0cmVvbikgbGlua3MucHVzaCh0aGlzLm1ha2VMaW5rKFwiUGF0cmVvblwiLCBhZGRvbi5wYXRyZW9uKSk7XHJcbiAgICAgICAgcmV0dXJuIGxpbmtzO1xyXG4gICAgfVxyXG5cclxuICAgIGdldCBmb290ZXIoKSB7XHJcbiAgICAgICAgY29uc3QgbGlua3MgPSB0aGlzLmxpbmtzO1xyXG4gICAgICAgIHJldHVybiAobGlua3MubGVuZ3RoIHx8IHRoaXMuaGFzU2V0dGluZ3MpICYmIEJEVjIucmVhY3QuY3JlYXRlRWxlbWVudChcImRpdlwiLCB7Y2xhc3NOYW1lOiBcImJkLWNhcmQtZm9vdGVyIGJkYS1mb290ZXJcIn0sXHJcbiAgICAgICAgICAgIEJEVjIucmVhY3QuY3JlYXRlRWxlbWVudChcInNwYW5cIiwge2NsYXNzTmFtZTogXCJiZC1hZGRvbi1saW5rcyBiZGEtbGlua3NcIn0sXHJcbiAgICAgICAgICAgICAgICAuLi4obGlua3MubWFwKChlbGVtZW50LCBpbmRleCkgPT4gaW5kZXggPCBsaW5rcy5sZW5ndGggLSAxID8gW2VsZW1lbnQsIFwiIHwgXCJdIDogZWxlbWVudCkuZmxhdCgpKVxyXG4gICAgICAgICAgICApLFxyXG4gICAgICAgICAgICB0aGlzLmhhc1NldHRpbmdzICYmIEJEVjIucmVhY3QuY3JlYXRlRWxlbWVudChcImJ1dHRvblwiLCB7b25DbGljazogdGhpcy5zaG93U2V0dGluZ3MsIGNsYXNzTmFtZTogXCJiZC1idXR0b24gYmRhLXNldHRpbmdzLWJ1dHRvblwiLCBkaXNhYmxlZDogIXRoaXMuc3RhdGUuY2hlY2tlZH0sIFwiU2V0dGluZ3NcIilcclxuICAgICAgICApO1xyXG4gICAgfVxyXG5cclxuICAgIG9uQ2hhbmdlKCkge1xyXG4gICAgICAgIHRoaXMucHJvcHMudG9nZ2xlICYmIHRoaXMucHJvcHMudG9nZ2xlKHRoaXMubmFtZSk7XHJcbiAgICAgICAgdGhpcy5zZXRTdGF0ZSh7Y2hlY2tlZDogIXRoaXMuc3RhdGUuY2hlY2tlZH0pO1xyXG4gICAgfVxyXG5cclxuICAgIGVkaXQoKSB7dGhpcy5wcm9wcy5lZGl0KHRoaXMubmFtZSk7fVxyXG4gICAgZGVsZXRlKCkge3RoaXMucHJvcHMucmVtb3ZlKHRoaXMubmFtZSk7fVxyXG4gICAgcmVsb2FkKCkge3RoaXMucHJvcHMucmVsb2FkKHRoaXMubmFtZSk7fVxyXG5cclxuICAgIGdldCBuYW1lKCkge3JldHVybiB0aGlzLmdldFN0cmluZyh0aGlzLnByb3BzLmFkZG9uLnBsdWdpbiA/IHRoaXMucHJvcHMuYWRkb24ucGx1Z2luLmdldE5hbWUoKSA6IHRoaXMucHJvcHMuYWRkb24ubmFtZSk7fVxyXG4gICAgZ2V0IGF1dGhvcigpIHtyZXR1cm4gdGhpcy5nZXRTdHJpbmcodGhpcy5wcm9wcy5hZGRvbi5wbHVnaW4gPyB0aGlzLnByb3BzLmFkZG9uLnBsdWdpbi5nZXRBdXRob3IoKSA6IHRoaXMucHJvcHMuYWRkb24uYXV0aG9yKTt9XHJcbiAgICBnZXQgZGVzY3JpcHRpb24oKSB7cmV0dXJuIHRoaXMuZ2V0U3RyaW5nKHRoaXMucHJvcHMuYWRkb24ucGx1Z2luID8gdGhpcy5wcm9wcy5hZGRvbi5wbHVnaW4uZ2V0RGVzY3JpcHRpb24oKSA6IHRoaXMucHJvcHMuYWRkb24uZGVzY3JpcHRpb24pO31cclxuICAgIGdldCB2ZXJzaW9uKCkge3JldHVybiB0aGlzLmdldFN0cmluZyh0aGlzLnByb3BzLmFkZG9uLnBsdWdpbiA/IHRoaXMucHJvcHMuYWRkb24ucGx1Z2luLmdldFZlcnNpb24oKSA6IHRoaXMucHJvcHMuYWRkb24udmVyc2lvbik7fVxyXG5cclxuICAgIHJlbmRlcigpIHtcclxuICAgICAgICBpZiAodGhpcy5zdGF0ZS5zZXR0aW5ncykgcmV0dXJuIHRoaXMuc2V0dGluZ3NDb21wb25lbnQ7XHJcbiAgICAgICAgY29uc3Qge2F1dGhvcklkLCBhdXRob3JMaW5rfSA9IHRoaXMucHJvcHMuYWRkb247XHJcblxyXG4gICAgICAgIGNvbnN0IHN0eWxlID0ge31cclxuICAgICAgICBpZighdGhpcy5pc1NjYW5uaW5nKXtcclxuICAgICAgICAgICAgdGhpcy5pc1NjYW5uaW5nID0gdHJ1ZVxyXG4gICAgICAgICAgICBwcm9jZXNzRmlsZShyZXNvbHZlKHRoaXMucHJvcHMuYWRkb24uZmlsZW5hbWUuZW5kc1dpdGgoXCIucGx1Z2luLmpzXCIpID8gY29udGVudE1hbmFnZXIucGx1Z2luc0ZvbGRlciA6IGNvbnRlbnRNYW5hZ2VyLnRoZW1lc0ZvbGRlciwgdGhpcy5wcm9wcy5hZGRvbi5maWxlbmFtZSksIChyZXN1bHQpID0+IHtcclxuICAgICAgICAgICAgICAgIGlmKHRoaXMudW5tb3VudGVkKXJldHVyblxyXG4gICAgICAgICAgICAgICAgdGhpcy5zZXRTdGF0ZSh7XHJcbiAgICAgICAgICAgICAgICAgICAgaXNUcnVzdGVkOiAhcmVzdWx0LnN1c3BlY3RcclxuICAgICAgICAgICAgICAgIH0pXHJcbiAgICAgICAgICAgIH0sICgpID0+IHt9KVxyXG4gICAgICAgIH1lbHNle1xyXG4gICAgICAgICAgICBpZih0aGlzLnN0YXRlLmlzVHJ1c3RlZCl7XHJcbiAgICAgICAgICAgICAgICBzdHlsZS5ib3JkZXJDb2xvciA9IFwiIzQwODdlZFwiXHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICB9XHJcbiAgICAgICAgcmV0dXJuIEJEVjIucmVhY3QuY3JlYXRlRWxlbWVudChcImRpdlwiLCB7Y2xhc3NOYW1lOiBcImJkLWNhcmQgYmQtYWRkb24tY2FyZCBzZXR0aW5ncy1jbG9zZWQgdWktc3dpdGNoLWl0ZW1cIiwgc3R5bGV9LFxyXG4gICAgICAgICAgICBCRFYyLnJlYWN0LmNyZWF0ZUVsZW1lbnQoXCJkaXZcIiwge2NsYXNzTmFtZTogXCJiZC1hZGRvbi1oZWFkZXIgYmRhLWhlYWRlclwifSxcclxuICAgICAgICAgICAgICAgICAgICBCRFYyLnJlYWN0LmNyZWF0ZUVsZW1lbnQoXCJkaXZcIiwge2NsYXNzTmFtZTogXCJiZC1jYXJkLXRpdGxlIGJkYS1oZWFkZXItdGl0bGVcIn0sIHRoaXMuYnVpbGRUaXRsZSh0aGlzLm5hbWUsIHRoaXMudmVyc2lvbiwge25hbWU6IHRoaXMuYXV0aG9yLCBpZDogYXV0aG9ySWQsIGxpbms6IGF1dGhvckxpbmt9KSksXHJcbiAgICAgICAgICAgICAgICAgICAgQkRWMi5yZWFjdC5jcmVhdGVFbGVtZW50KFwiZGl2XCIsIHtjbGFzc05hbWU6IFwiYmQtYWRkb24tY29udHJvbHMgYmRhLWNvbnRyb2xzXCJ9LFxyXG4gICAgICAgICAgICAgICAgICAgICAgICB0aGlzLnByb3BzLmVkaXQgJiYgdGhpcy5tYWtlQnV0dG9uKFwiRWRpdFwiLCA8RWRpdEljb24gY2xhc3NOYW1lPVwiYmQtaWNvblwiIC8+LCB0aGlzLmVkaXQpLFxyXG4gICAgICAgICAgICAgICAgICAgICAgICB0aGlzLnByb3BzLnJlbW92ZSAmJiB0aGlzLm1ha2VCdXR0b24oXCJEZWxldGVcIiwgPERlbGV0ZUljb24gY2xhc3NOYW1lPVwiYmQtaWNvblwiIC8+LCB0aGlzLmRlbGV0ZSksXHJcbiAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMucHJvcHMucmVsb2FkICYmIHRoaXMubWFrZUJ1dHRvbihcIlJlbG9hZFwiLCA8UmVsb2FkSWNvbiBjbGFzc05hbWU9XCJiZC1pY29uXCIgLz4sIHRoaXMucmVsb2FkKSxcclxuICAgICAgICAgICAgICAgICAgICAgICAgUmVhY3QuY3JlYXRlRWxlbWVudChTd2l0Y2gsIHtvbkNoYW5nZTogdGhpcy5vbkNoYW5nZSwgY2hlY2tlZDogdGhpcy5zdGF0ZS5jaGVja2VkfSlcclxuICAgICAgICAgICAgICAgICAgICApXHJcbiAgICAgICAgICAgICksXHJcbiAgICAgICAgICAgIEJEVjIucmVhY3QuY3JlYXRlRWxlbWVudChcImRpdlwiLCB7Y2xhc3NOYW1lOiBcImJkLXNjcm9sbGVyLXdyYXAgYmRhLWRlc2NyaXB0aW9uLXdyYXAgc2Nyb2xsZXItd3JhcCBmYWRlXCJ9LFxyXG4gICAgICAgICAgICAgICAgQkRWMi5yZWFjdC5jcmVhdGVFbGVtZW50KFwiZGl2XCIsIHtjbGFzc05hbWU6IFwiYmQtc2Nyb2xsZXIgYmQtYWRkb24tZGVzY3JpcHRpb24gYmRhLWRlc2NyaXB0aW9uIHNjcm9sbGVyXCJ9LCB0aGlzLmRlc2NyaXB0aW9uKVxyXG4gICAgICAgICAgICApLFxyXG4gICAgICAgICAgICB0aGlzLmZvb3RlclxyXG4gICAgICAgICk7XHJcbiAgICB9XHJcbn1cclxuXHJcbmNvbnN0IG9yaWdpbmFsUmVuZGVyID0gVjJDX1BsdWdpbkNhcmQucHJvdG90eXBlLnJlbmRlcjtcclxuT2JqZWN0LmRlZmluZVByb3BlcnR5KFYyQ19QbHVnaW5DYXJkLnByb3RvdHlwZSwgXCJyZW5kZXJcIiwge1xyXG4gICAgZW51bWVyYWJsZTogZmFsc2UsXHJcbiAgICBjb25maWd1cmFibGU6IGZhbHNlLFxyXG4gICAgc2V0OiBmdW5jdGlvbigpIHtjb25zb2xlLndhcm4oXCJBZGRvbiBwb2xpY3kgZm9yIHBsdWdpbnMgIzUgaHR0cHM6Ly9naXRodWIuY29tL3JhdWVuemkvQmV0dGVyRGlzY29yZEFwcC93aWtpL0FkZG9uLVBvbGljaWVzI3BsdWdpbnNcIik7fSxcclxuICAgIGdldDogKCkgPT4gb3JpZ2luYWxSZW5kZXJcclxufSk7IiwiaW1wb3J0IEVycm9yQm91bmRhcnkgZnJvbSBcIi4vZXJyb3JCb3VuZGFyeVwiO1xyXG5pbXBvcnQgQ29udGVudENvbHVtbiBmcm9tIFwiLi9jb250ZW50Q29sdW1uXCI7XHJcbmltcG9ydCBUb29scyBmcm9tIFwiLi90b29sc1wiO1xyXG5pbXBvcnQgUmVsb2FkSWNvbiBmcm9tIFwiLi9yZWxvYWRJY29uXCI7XHJcbmltcG9ydCBBZGRvbkNhcmQgZnJvbSBcIi4vYWRkb25jYXJkXCI7XHJcbmltcG9ydCBTY3JvbGxlciBmcm9tIFwiLi9zY3JvbGxlclwiO1xyXG5pbXBvcnQgRHJvcGRvd24gZnJvbSBcIi4vY29tcG9uZW50cy9kcm9wZG93blwiO1xyXG5pbXBvcnQgU2VhcmNoIGZyb20gXCIuL2NvbXBvbmVudHMvc2VhcmNoXCI7XHJcblxyXG5pbXBvcnQge3NldHRpbmdzQ29va2llLCBwbHVnaW5Db29raWUsIHRoZW1lQ29va2llfSBmcm9tIFwiLi4vMGdsb2JhbHNcIjtcclxuaW1wb3J0IENvbnRlbnRNYW5hZ2VyIGZyb20gXCIuLi9tb2R1bGVzL2NvbnRlbnRNYW5hZ2VyXCI7XHJcbmltcG9ydCBCRFYyIGZyb20gXCIuLi9tb2R1bGVzL3YyXCI7XHJcbmltcG9ydCBwbHVnaW5Nb2R1bGUgZnJvbSBcIi4uL21vZHVsZXMvcGx1Z2luTW9kdWxlXCI7XHJcbmltcG9ydCB0aGVtZU1vZHVsZSBmcm9tIFwiLi4vbW9kdWxlcy90aGVtZU1vZHVsZVwiO1xyXG5pbXBvcnQgV2VicGFja01vZHVsZXMgZnJvbSBcIi4uL21vZHVsZXMvd2VicGFja01vZHVsZXNcIjtcclxuaW1wb3J0IEJkQXBpIGZyb20gXCIuLi9tb2R1bGVzL2JkQXBpXCI7XHJcblxyXG5jb25zdCBUb29sdGlwID0gV2VicGFja01vZHVsZXMuZmluZEJ5RGlzcGxheU5hbWUoXCJUb29sdGlwXCIpO1xyXG5cclxuY29uc3QgUmVhY3QgPSBCRFYyLnJlYWN0O1xyXG5cclxuZXhwb3J0IGRlZmF1bHQgY2xhc3MgQ2FyZExpc3QgZXh0ZW5kcyBCRFYyLnJlYWN0Q29tcG9uZW50IHtcclxuICAgIGNvbnN0cnVjdG9yKHByb3BzKSB7XHJcbiAgICAgICAgc3VwZXIocHJvcHMpO1xyXG4gICAgICAgIHRoaXMuc3RhdGUgPSB7c29ydDogXCJuYW1lXCIsIGFzY2VuZGluZzogdHJ1ZSwgcXVlcnk6IFwiXCJ9O1xyXG4gICAgICAgIHRoaXMuaXNQbHVnaW5zID0gdGhpcy5wcm9wcy50eXBlID09IFwicGx1Z2luc1wiO1xyXG4gICAgICAgIHRoaXMuY29va2llID0gdGhpcy5pc1BsdWdpbnMgPyBwbHVnaW5Db29raWUgOiB0aGVtZUNvb2tpZTtcclxuICAgICAgICB0aGlzLm1hbmFnZXIgPSB0aGlzLmlzUGx1Z2lucyA/IHBsdWdpbk1vZHVsZSA6IHRoZW1lTW9kdWxlO1xyXG5cclxuICAgICAgICB0aGlzLnNvcnQgPSB0aGlzLnNvcnQuYmluZCh0aGlzKTtcclxuICAgICAgICB0aGlzLnJldmVyc2UgPSB0aGlzLnJldmVyc2UuYmluZCh0aGlzKTtcclxuICAgICAgICB0aGlzLnNlYXJjaCA9IHRoaXMuc2VhcmNoLmJpbmQodGhpcyk7XHJcbiAgICB9XHJcblxyXG4gICAgb3BlbkZvbGRlcigpIHtcclxuICAgICAgICByZXF1aXJlKFwiZWxlY3Ryb25cIikuc2hlbGwub3Blbkl0ZW0odGhpcy5pc1BsdWdpbnMgPyBDb250ZW50TWFuYWdlci5wbHVnaW5zRm9sZGVyIDogQ29udGVudE1hbmFnZXIudGhlbWVzRm9sZGVyKTtcclxuICAgIH1cclxuXHJcbiAgICBlZGl0KG5hbWUpIHtcclxuICAgICAgICBjb25zb2xlLmxvZyhuYW1lKTtcclxuICAgICAgICB0aGlzLm1hbmFnZXIuZWRpdChuYW1lKTtcclxuICAgIH1cclxuXHJcbiAgICBhc3luYyBkZWxldGUobmFtZSkge1xyXG4gICAgICAgIGNvbnN0IHNob3VsZERlbGV0ZSA9IGF3YWl0IHRoaXMuY29uZmlybURlbGV0ZShuYW1lKTtcclxuICAgICAgICBpZiAoIXNob3VsZERlbGV0ZSkgcmV0dXJuO1xyXG4gICAgICAgIHRoaXMubWFuYWdlci5kZWxldGUobmFtZSk7XHJcbiAgICB9XHJcblxyXG4gICAgY29uZmlybURlbGV0ZShuYW1lKSB7XHJcbiAgICAgICAgcmV0dXJuIG5ldyBQcm9taXNlKHJlc29sdmUgPT4ge1xyXG4gICAgICAgICAgICBCZEFwaS5zaG93Q29uZmlybWF0aW9uTW9kYWwoXCJBcmUgWW91IFN1cmU/XCIsIGBBcmUgeW91IHN1cmUgeW91IHdhbnQgdG8gZGVsZXRlICR7bmFtZX0/YCwge1xyXG4gICAgICAgICAgICAgICAgZGFuZ2VyOiB0cnVlLFxyXG4gICAgICAgICAgICAgICAgY29uZmlybVRleHQ6IFwiRGVsZXRlXCIsXHJcbiAgICAgICAgICAgICAgICBvbkNvbmZpcm06ICgpID0+IHtyZXNvbHZlKHRydWUpO30sXHJcbiAgICAgICAgICAgICAgICBvbkNhbmNlbDogKCkgPT4ge3Jlc29sdmUoZmFsc2UpO31cclxuICAgICAgICAgICAgfSk7XHJcbiAgICAgICAgfSk7XHJcbiAgICB9XHJcblxyXG4gICAgZ2V0IHNvcnRPcHRpb25zKCkge1xyXG4gICAgICAgIHJldHVybiBbXHJcbiAgICAgICAgICAgIHtsYWJlbDogXCJOYW1lXCIsIHZhbHVlOiBcIm5hbWVcIn0sXHJcbiAgICAgICAgICAgIHtsYWJlbDogXCJBdXRob3JcIiwgdmFsdWU6IFwiYXV0aG9yXCJ9LFxyXG4gICAgICAgICAgICB7bGFiZWw6IFwiVmVyc2lvblwiLCB2YWx1ZTogXCJ2ZXJzaW9uXCJ9LFxyXG4gICAgICAgICAgICB7bGFiZWw6IFwiUmVjZW50bHkgQWRkZWRcIiwgdmFsdWU6IFwiYWRkZWRcIn0sXHJcbiAgICAgICAgICAgIHtsYWJlbDogXCJMYXN0IE1vZGlmaWVkXCIsIHZhbHVlOiBcIm1vZGlmaWVkXCJ9LFxyXG4gICAgICAgICAgICB7bGFiZWw6IFwiRmlsZSBTaXplXCIsIHZhbHVlOiBcInNpemVcIn0sXHJcbiAgICAgICAgXTtcclxuICAgIH1cclxuXHJcbiAgICBnZXQgZGlyZWN0aW9ucygpIHtcclxuICAgICAgICByZXR1cm4gW1xyXG4gICAgICAgICAgICB7bGFiZWw6IFwiQXNjZW5kaW5nXCIsIHZhbHVlOiB0cnVlfSxcclxuICAgICAgICAgICAge2xhYmVsOiBcIkRlc2NlbmRpbmdcIiwgdmFsdWU6IGZhbHNlfVxyXG4gICAgICAgIF07XHJcbiAgICB9XHJcblxyXG4gICAgcmV2ZXJzZSh2YWx1ZSkge1xyXG4gICAgICAgIHRoaXMuc2V0U3RhdGUoe2FzY2VuZGluZzogdmFsdWV9KTtcclxuICAgIH1cclxuXHJcbiAgICBzb3J0KHZhbHVlKSB7XHJcbiAgICAgICAgdGhpcy5zZXRTdGF0ZSh7c29ydDogdmFsdWV9KTtcclxuICAgIH1cclxuXHJcbiAgICBzZWFyY2goZXZlbnQpIHtcclxuICAgICAgICB0aGlzLnNldFN0YXRlKHtxdWVyeTogZXZlbnQudGFyZ2V0LnZhbHVlLnRvTG9jYWxlTG93ZXJDYXNlKCl9KTtcclxuICAgIH1cclxuXHJcbiAgICBnZXRQcm9wcyhhZGRvbikge1xyXG4gICAgICAgIHJldHVybiB7XHJcbiAgICAgICAgICAgIGtleTogdGhpcy5nZXROYW1lKGFkZG9uKSxcclxuICAgICAgICAgICAgZW5hYmxlZDogdGhpcy5jb29raWVbdGhpcy5nZXROYW1lKGFkZG9uKV0sXHJcbiAgICAgICAgICAgIHRvZ2dsZTogdGhpcy5tYW5hZ2VyLnRvZ2dsZS5iaW5kKHRoaXMubWFuYWdlciksXHJcbiAgICAgICAgICAgIC8vZWRpdDogdGhpcy5lZGl0LmJpbmQodGhpcyksXHJcbiAgICAgICAgICAgIHJlbW92ZTogdGhpcy5kZWxldGUuYmluZCh0aGlzKSxcclxuICAgICAgICAgICAgYWRkb246IGFkZG9uLFxyXG4gICAgICAgICAgICBoYXNoOiBhZGRvbi5oYXNoXHJcbiAgICAgICAgfTtcclxuICAgIH1cclxuXHJcbiAgICBnZXRTdHJpbmcodmFsdWUpIHtcclxuICAgICAgICBpZiAoIXZhbHVlKSByZXR1cm4gXCI/Pz9cIjtcclxuICAgICAgICByZXR1cm4gdHlwZW9mIHZhbHVlID09IFwic3RyaW5nXCIgPyB2YWx1ZSA6IHZhbHVlLnRvU3RyaW5nKCk7XHJcbiAgICB9XHJcblxyXG4gICAgZ2V0IGxpc3QoKXtcclxuICAgICAgICByZXR1cm4gdGhpcy5wcm9wcy50eXBlID09PSBcInBsdWdpbnNcIiA/IE9iamVjdC52YWx1ZXMoYmRwbHVnaW5zKSA6IE9iamVjdC52YWx1ZXMoYmR0aGVtZXMpO1xyXG4gICAgfVxyXG5cclxuICAgIGdldEFkZG9ucygpIHtcclxuICAgICAgICBjb25zdCBzb3J0ZWRBZGRvbnMgPSB0aGlzLmxpc3Quc29ydCgoYSwgYikgPT4ge1xyXG4gICAgICAgICAgICBjb25zdCBjYXAgPSB0aGlzLnN0YXRlLnNvcnQuY2hhckF0KDApLnRvVXBwZXJDYXNlKCkgKyB0aGlzLnN0YXRlLnNvcnQuc2xpY2UoMSk7XHJcbiAgICAgICAgICAgIGNvbnN0IGZpcnN0ID0gYS5wbHVnaW4gJiYgYS5wbHVnaW5bYGdldCR7Y2FwfWBdID8gdGhpcy5nZXRTdHJpbmcoYS5wbHVnaW5bYGdldCR7Y2FwfWBdKCkpIDogYVt0aGlzLnN0YXRlLnNvcnRdO1xyXG4gICAgICAgICAgICBjb25zdCBzZWNvbmQgPSBiLnBsdWdpbiAmJiBiLnBsdWdpbltgZ2V0JHtjYXB9YF0gPyB0aGlzLmdldFN0cmluZyhiLnBsdWdpbltgZ2V0JHtjYXB9YF0oKSkgIDogYlt0aGlzLnN0YXRlLnNvcnRdO1xyXG4gICAgICAgICAgICBpZiAodHlwZW9mKGZpcnN0KSA9PSBcInN0cmluZ1wiKSByZXR1cm4gZmlyc3QudG9Mb2NhbGVMb3dlckNhc2UoKS5sb2NhbGVDb21wYXJlKHNlY29uZC50b0xvY2FsZUxvd2VyQ2FzZSgpKTtcclxuICAgICAgICAgICAgaWYgKGZpcnN0ID4gc2Vjb25kKSByZXR1cm4gMTtcclxuICAgICAgICAgICAgaWYgKHNlY29uZCA+IGZpcnN0KSByZXR1cm4gLTE7XHJcbiAgICAgICAgICAgIHJldHVybiAwO1xyXG4gICAgICAgIH0pO1xyXG4gICAgICAgIGlmICghdGhpcy5zdGF0ZS5hc2NlbmRpbmcpIHNvcnRlZEFkZG9ucy5yZXZlcnNlKCk7XHJcbiAgICAgICAgY29uc3QgcmVuZGVyZWQgPSBbXTtcclxuICAgICAgICBmb3IgKGxldCBhID0gMDsgYSA8IHNvcnRlZEFkZG9ucy5sZW5ndGg7IGErKykge1xyXG4gICAgICAgICAgICBjb25zdCBhZGRvbiA9IHNvcnRlZEFkZG9uc1thXTtcclxuICAgICAgICAgICAgaWYgKHRoaXMuc3RhdGUucXVlcnkpIHtcclxuICAgICAgICAgICAgICAgIGxldCBtYXRjaGVzID0gbnVsbDtcclxuICAgICAgICAgICAgICAgIGNvbnN0IG5hbWUgPSB0aGlzLmdldE5hbWUoYWRkb24pO1xyXG4gICAgICAgICAgICAgICAgY29uc3QgYXV0aG9yID0gdGhpcy5nZXRBdXRob3IoYWRkb24pO1xyXG4gICAgICAgICAgICAgICAgY29uc3QgZGVzY3JpcHRpb24gPSB0aGlzLmdldERlc2NyaXB0aW9uKGFkZG9uKTtcclxuICAgICAgICAgICAgICAgIGNvbnN0IHZlcnNpb24gPSB0aGlzLmdldFZlcnNpb24oYWRkb24pO1xyXG4gICAgICAgICAgICAgICAgaWYgKG5hbWUpIG1hdGNoZXMgPSBuYW1lLnRvTG9jYWxlTG93ZXJDYXNlKCkuaW5jbHVkZXModGhpcy5zdGF0ZS5xdWVyeSk7XHJcbiAgICAgICAgICAgICAgICBpZiAoYXV0aG9yKSBtYXRjaGVzID0gbWF0Y2hlcyB8fCBhdXRob3IudG9Mb2NhbGVMb3dlckNhc2UoKS5pbmNsdWRlcyh0aGlzLnN0YXRlLnF1ZXJ5KTtcclxuICAgICAgICAgICAgICAgIGlmIChkZXNjcmlwdGlvbikgbWF0Y2hlcyA9IG1hdGNoZXMgfHwgZGVzY3JpcHRpb24udG9Mb2NhbGVMb3dlckNhc2UoKS5pbmNsdWRlcyh0aGlzLnN0YXRlLnF1ZXJ5KTtcclxuICAgICAgICAgICAgICAgIGlmICh2ZXJzaW9uKSBtYXRjaGVzID0gbWF0Y2hlcyB8fCB2ZXJzaW9uLnRvTG9jYWxlTG93ZXJDYXNlKCkuaW5jbHVkZXModGhpcy5zdGF0ZS5xdWVyeSk7XHJcbiAgICAgICAgICAgICAgICBpZiAoIW1hdGNoZXMpIGNvbnRpbnVlO1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIGNvbnN0IHByb3BzID0gdGhpcy5nZXRQcm9wcyhhZGRvbik7XHJcbiAgICAgICAgICAgIHJlbmRlcmVkLnB1c2goPEVycm9yQm91bmRhcnk+PEFkZG9uQ2FyZCB7Li4ucHJvcHN9IHJlbG9hZD17IXNldHRpbmdzQ29va2llW1wiZm9yay1wcy01XCJdICYmIHRoaXMubWFuYWdlci5yZWxvYWQuYmluZCh0aGlzLm1hbmFnZXIpfSAvPjwvRXJyb3JCb3VuZGFyeT4pO1xyXG4gICAgICAgIH1cclxuICAgICAgICByZXR1cm4gcmVuZGVyZWQ7XHJcbiAgICB9XHJcblxyXG4gICAgZ2V0TmFtZShhZGRvbikge3JldHVybiB0aGlzLmdldFN0cmluZyhhZGRvbi5wbHVnaW4gPyBhZGRvbi5wbHVnaW4uZ2V0TmFtZSgpIDogYWRkb24ubmFtZSk7fVxyXG4gICAgZ2V0QXV0aG9yKGFkZG9uKSB7cmV0dXJuIHRoaXMuZ2V0U3RyaW5nKGFkZG9uLnBsdWdpbiA/IGFkZG9uLnBsdWdpbi5nZXRBdXRob3IoKSA6IGFkZG9uLmF1dGhvcik7fVxyXG4gICAgZ2V0RGVzY3JpcHRpb24oYWRkb24pIHtyZXR1cm4gdGhpcy5nZXRTdHJpbmcoYWRkb24ucGx1Z2luID8gYWRkb24ucGx1Z2luLmdldERlc2NyaXB0aW9uKCkgOiBhZGRvbi5kZXNjcmlwdGlvbik7fVxyXG4gICAgZ2V0VmVyc2lvbihhZGRvbikge3JldHVybiB0aGlzLmdldFN0cmluZyhhZGRvbi5wbHVnaW4gPyBhZGRvbi5wbHVnaW4uZ2V0VmVyc2lvbigpIDogYWRkb24udmVyc2lvbik7fVxyXG5cclxuICAgIHJlbmRlcigpIHtcclxuICAgICAgICBjb25zdCByZWZyZXNoSWNvbiA9IDxUb29sdGlwIGNvbG9yPVwiYmxhY2tcIiBwb3NpdGlvbj1cInRvcFwiIHRleHQ9XCJSZWxvYWQgTGlzdFwiPlxyXG4gICAgICAgICAgICB7KHByb3BzKSA9PiBcclxuICAgICAgICAgICAgPFJlbG9hZEljb24gey4uLnByb3BzfSBjbGFzc05hbWU9XCJiZC1pY29uIGJkLXJlbG9hZCBiZC1yZWxvYWQtaGVhZGVyXCIgc2l6ZT1cIjE4cHhcIiBvbkNsaWNrPXthc3luYyAoKSA9PiB7XHJcbiAgICAgICAgICAgICAgICBpZiAodGhpcy5pc1BsdWdpbnMpIHBsdWdpbk1vZHVsZS51cGRhdGVQbHVnaW5MaXN0KCk7XHJcbiAgICAgICAgICAgICAgICBlbHNlIHRoZW1lTW9kdWxlLnVwZGF0ZVRoZW1lTGlzdCgpO1xyXG4gICAgICAgICAgICAgICAgdGhpcy5mb3JjZVVwZGF0ZSgpO1xyXG4gICAgICAgICAgICB9fSAvPlxyXG4gICAgICAgICAgICB9PC9Ub29sdGlwPjtcclxuICAgICAgICBjb25zdCBhZGRvbkNhcmRzID0gdGhpcy5nZXRBZGRvbnMoKTtcclxuXHJcbiAgICAgICAgcmV0dXJuIDxDb250ZW50Q29sdW1uIHRpdGxlPXtgJHt0aGlzLnByb3BzLnR5cGUudG9VcHBlckNhc2UoKX3igJQke2FkZG9uQ2FyZHMubGVuZ3RofWB9PlxyXG4gICAgICAgICAgICA8YnV0dG9uIGtleT1cImZvbGRlci1idXR0b25cIiBjbGFzc05hbWU9XCJiZC1idXR0b24gYmQtcGZidG5cIiBvbkNsaWNrPXt0aGlzLm9wZW5Gb2xkZXIuYmluZCh0aGlzKX0+T3BlbiB7dGhpcy5pc1BsdWdpbnMgPyBcIlBsdWdpblwiIDogXCJUaGVtZVwifSBGb2xkZXI8L2J1dHRvbj5cclxuICAgICAgICAgICAgeyFzZXR0aW5nc0Nvb2tpZVtcImZvcmstcHMtNVwiXSAmJiByZWZyZXNoSWNvbn1cclxuICAgICAgICAgICAgPGRpdiBjbGFzc05hbWU9XCJiZC1jb250cm9scyBiZC1hZGRvbi1jb250cm9sc1wiPlxyXG4gICAgICAgICAgICAgICAgPFNlYXJjaCBvbkNoYW5nZT17dGhpcy5zZWFyY2h9IHBsYWNlaG9sZGVyPXtgU2VhcmNoICR7dGhpcy5wcm9wcy50eXBlfS4uLmB9IC8+XHJcbiAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzTmFtZT1cImJkLWFkZG9uLWRyb3Bkb3duc1wiPlxyXG4gICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3NOYW1lPVwiYmQtc2VsZWN0LXdyYXBwZXJcIj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgPGxhYmVsIGNsYXNzTmFtZT1cImJkLWxhYmVsXCI+U29ydCBieTo8L2xhYmVsPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICA8RHJvcGRvd24gb3B0aW9ucz17dGhpcy5zb3J0T3B0aW9uc30gb25DaGFuZ2U9e3RoaXMuc29ydH0gc3R5bGU9XCJ0cmFuc3BhcmVudFwiIC8+XHJcbiAgICAgICAgICAgICAgICAgICAgPC9kaXY+XHJcbiAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzc05hbWU9XCJiZC1zZWxlY3Qtd3JhcHBlclwiPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICA8bGFiZWwgY2xhc3NOYW1lPVwiYmQtbGFiZWxcIj5PcmRlcjo8L2xhYmVsPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICA8RHJvcGRvd24gb3B0aW9ucz17dGhpcy5kaXJlY3Rpb25zfSBvbkNoYW5nZT17dGhpcy5yZXZlcnNlfSBzdHlsZT1cInRyYW5zcGFyZW50XCIgLz5cclxuICAgICAgICAgICAgICAgICAgICA8L2Rpdj5cclxuICAgICAgICAgICAgICAgICAgICBcclxuICAgICAgICAgICAgICAgIDwvZGl2PlxyXG4gICAgICAgICAgICA8L2Rpdj5cclxuICAgICAgICAgICAgPGRpdiBjbGFzc05hbWU9XCJiZGEtc2xpc3QgYmQtYWRkb24tbGlzdFwiPnthZGRvbkNhcmRzfTwvZGl2PlxyXG4gICAgICAgIDwvQ29udGVudENvbHVtbj5cclxuICAgIH1cclxufVxyXG5cclxuY29uc3Qgb3JpZ2luYWxSZW5kZXIgPSBDYXJkTGlzdC5wcm90b3R5cGUucmVuZGVyO1xyXG5PYmplY3QuZGVmaW5lUHJvcGVydHkoQ2FyZExpc3QucHJvdG90eXBlLCBcInJlbmRlclwiLCB7XHJcbiAgICBlbnVtZXJhYmxlOiBmYWxzZSxcclxuICAgIGNvbmZpZ3VyYWJsZTogZmFsc2UsXHJcbiAgICBzZXQ6IGZ1bmN0aW9uKCkge2NvbnNvbGUud2FybihcIkFkZG9uIHBvbGljeSBmb3IgcGx1Z2lucyAjNSBodHRwczovL2dpdGh1Yi5jb20vcmF1ZW56aS9CZXR0ZXJEaXNjb3JkQXBwL3dpa2kvQWRkb24tUG9saWNpZXMjcGx1Z2luc1wiKTt9LFxyXG4gICAgZ2V0OiAoKSA9PiBvcmlnaW5hbFJlbmRlclxyXG59KTsgIiwiaW1wb3J0IEJEVjIgZnJvbSBcIi4uL21vZHVsZXMvdjJcIjtcclxuXHJcbmV4cG9ydCBkZWZhdWx0IGNsYXNzIEJETG9nbyBleHRlbmRzIEJEVjIucmVhY3RDb21wb25lbnQge1xyXG4gICAgcmVuZGVyKCkge1xyXG4gICAgICAgIHJldHVybiBCRFYyLnJlYWN0LmNyZWF0ZUVsZW1lbnQoXHJcbiAgICAgICAgICAgIFwic3ZnXCIsXHJcbiAgICAgICAgICAgIHtoZWlnaHQ6IFwiMTAwJVwiLCB3aWR0aDogdGhpcy5wcm9wcy5zaXplIHx8IFwiMTZweFwiLCBjbGFzc05hbWU6IFwiYmQtbG9nbyBcIiArIHRoaXMucHJvcHMuY2xhc3NOYW1lLCBzdHlsZToge2ZpbGxSdWxlOiBcImV2ZW5vZGRcIiwgY2xpcFJ1bGU6IFwiZXZlbm9kZFwiLCBzdHJva2VMaW5lY2FwOiBcInJvdW5kXCIsIHN0cm9rZUxpbmVqb2luOiBcInJvdW5kXCJ9LCB2aWV3Qm94OiBcIjAgMCAyMDAwIDIwMDBcIn0sXHJcbiAgICAgICAgICAgIEJEVjIucmVhY3QuY3JlYXRlRWxlbWVudChcIm1ldGFkYXRhXCIsIG51bGwpLFxyXG4gICAgICAgICAgICBCRFYyLnJlYWN0LmNyZWF0ZUVsZW1lbnQoXCJkZWZzXCIsIG51bGwsXHJcbiAgICAgICAgICAgICAgICBCRFYyLnJlYWN0LmNyZWF0ZUVsZW1lbnQoXCJmaWx0ZXJcIiwge2lkOiBcInNoYWRvdzFcIn0sIEJEVjIucmVhY3QuY3JlYXRlRWxlbWVudChcImZlRHJvcFNoYWRvd1wiLCB7XCJkeFwiOiBcIjIwXCIsIFwiZHlcIjogXCIwXCIsIFwic3RkRGV2aWF0aW9uXCI6IFwiMjBcIiwgXCJmbG9vZC1jb2xvclwiOiBcInJnYmEoMCwwLDAsMC4zNSlcIn0pKSxcclxuICAgICAgICAgICAgICAgIEJEVjIucmVhY3QuY3JlYXRlRWxlbWVudChcImZpbHRlclwiLCB7aWQ6IFwic2hhZG93MlwifSwgQkRWMi5yZWFjdC5jcmVhdGVFbGVtZW50KFwiZmVEcm9wU2hhZG93XCIsIHtcImR4XCI6IFwiMTVcIiwgXCJkeVwiOiBcIjBcIiwgXCJzdGREZXZpYXRpb25cIjogXCIyMFwiLCBcImZsb29kLWNvbG9yXCI6IFwicmdiYSgyNTUsMjU1LDI1NSwwLjE1KVwifSkpLFxyXG4gICAgICAgICAgICAgICAgQkRWMi5yZWFjdC5jcmVhdGVFbGVtZW50KFwiZmlsdGVyXCIsIHtpZDogXCJzaGFkb3czXCJ9LCBCRFYyLnJlYWN0LmNyZWF0ZUVsZW1lbnQoXCJmZURyb3BTaGFkb3dcIiwge1wiZHhcIjogXCIxMFwiLCBcImR5XCI6IFwiMFwiLCBcInN0ZERldmlhdGlvblwiOiBcIjIwXCIsIFwiZmxvb2QtY29sb3JcIjogXCJyZ2JhKDAsMCwwLDAuMzUpXCJ9KSlcclxuICAgICAgICAgICAgKSxcclxuICAgICAgICAgICAgQkRWMi5yZWFjdC5jcmVhdGVFbGVtZW50KFwiZ1wiLCBudWxsLFxyXG4gICAgICAgICAgICAgICAgQkRWMi5yZWFjdC5jcmVhdGVFbGVtZW50KFwicGF0aFwiLCB7c3R5bGU6IHtmaWx0ZXI6IFwidXJsKCNzaGFkb3czKVwifSwgZDogXCJNMTE5NS40NCsxMzUuNDQyTDExOTUuNDQrMTM1LjQ0Mkw5OTcuNisxMzYuNDQyQzEwMjQuMisxNDkuNzQyKzExNzAuMzQrMTYzLjU0MisxMTkzLjY0KzE3OS43NDJDMTI2NC4zNCsyMjguODQyKzEzMTkuNzQrMjkxLjI0MisxMzU4LjI0KzM2NS4wNDJDMTM5OC4xNCs0NDEuNjQyKzE0MTkuNzQrNTMwLjY0MisxNDIyLjU0KzYyOS42NDJMMTQyMi41NCs2MzAuODQyTDE0MjIuNTQrNjMyLjA0MkMxNDIyLjU0Kzc3My4xNDIrMTQyMi41NCsxMjI4LjE0KzE0MjIuNTQrMTM2OS4xNEwxNDIyLjU0KzEzNzAuMzRMMTQyMi41NCsxMzcxLjU0QzE0MTkuODQrMTQ3MC41NCsxMzk4LjI0KzE1NTkuNTQrMTM1OC4yNCsxNjM2LjE0QzEzMTkuNzQrMTcwOS45NCsxMjY0LjQ0KzE3NzIuMzQrMTE5My42NCsxODIxLjQ0QzExNzEuMDQrMTgzNy4xNCsxMDI1LjcrMTg1MC41NCsxMDAwKzE4NjMuNTRMMTE5My41NCsxODY0LjU0QzE1MzkuNzQrMTg2Ni40NCsxODY0LjU0KzE2OTMuMzQrMTg2NC41NCsxMjk2LjY0TDE4NjQuNTQrNzE2Ljk0MkMxODY2LjQ0KzMxMi40NDIrMTU0MS42NCsxMzUuNDQyKzExOTUuNDQrMTM1LjQ0MlpcIiwgZmlsbDogXCIjMTcxNzE3XCIsIG9wYWNpdHk6IFwiMVwifSksXHJcbiAgICAgICAgICAgICAgICBCRFYyLnJlYWN0LmNyZWF0ZUVsZW1lbnQoXCJwYXRoXCIsIHtzdHlsZToge2ZpbHRlcjogXCJ1cmwoI3NoYWRvdzIpXCJ9LCBkOiBcIk0xNjk1LjU0KzYzMS40NDJDMTY4NS44NCsyNzguMDQyKzE0MDkuMzQrMTM1LjQ0MisxMDUyLjk0KzEzNS40NDJMMzYxLjc0KzEzNi40NDJMODAzLjc0KzQ5MC40NDJMMTA2MC43NCs0OTAuNDQyQzEzMzUuMjQrNDkwLjQ0MisxMzM1LjI0KzgzNS4zNDIrMTA2MC43NCs4MzUuMzQyTDEwNjAuNzQrMTE2NC44NEMxMTUwLjIyKzExNjQuODQrMTIxMC41MysxMjAxLjQ4KzEyNDEuNjgrMTI1MC44N0MxMzA2LjA3KzEzNTMrMTI0NS43NisxNTA5LjY0KzEwNjAuNzQrMTUwOS42NEwzNjEuNzQrMTg2My41NEwxMDUyLjk0KzE4NjQuNTRDMTQwOS4yNCsxODY0LjU0KzE2ODUuNzQrMTcyMS45NCsxNjk1LjU0KzEzNjguNTRDMTY5NS41NCsxMjA1Ljk0KzE2NTEuMDQrMTA4NC40NCsxNTcyLjY0Kzk5OS45NDJDMTY1MS4wNCs5MTUuNTQyKzE2OTUuNTQrNzk0LjA0MisxNjk1LjU0KzYzMS40NDJaXCIsIGZpbGw6IFwiIzNFODJFNVwiLCBvcGFjaXR5OiBcIjFcIn0pLFxyXG4gICAgICAgICAgICAgICAgQkRWMi5yZWFjdC5jcmVhdGVFbGVtZW50KFwicGF0aFwiLCB7c3R5bGU6IHtmaWx0ZXI6IFwidXJsKCNzaGFkb3cxKVwifSwgZDogXCJNMTQ2OS4yNSs2MzEuNDQyQzE0NTkuNTUrMjc4LjA0MisxMTgzLjA1KzEzNS40NDIrODI2LjY1KzEzNS40NDJMMTM1LjQ1KzEzNS40NDJMMTM1LjQ1KzEwMDRDMTM1LjQ1KzEwMDQrMTM1LjQyNysxMjU1LjIxKzM1NS42MjYrMTI1NS4yMUM1NzUuODI1KzEyNTUuMjErNTc1Ljg0OCsxMDA0KzU3NS44NDgrMTAwNEw1NzcuNDUrNDkwLjQ0Mkw4MzQuNDUrNDkwLjQ0MkMxMTA4Ljk1KzQ5MC40NDIrMTEwOC45NSs4MzUuMzQyKzgzNC40NSs4MzUuMzQyTDY2NC42NSs4MzUuMzQyTDY2NC42NSsxMTY0Ljg0TDgzNC40NSsxMTY0Ljg0QzkyMy45MzIrMTE2NC44NCs5ODQuMjQ0KzEyMDEuNDgrMTAxNS4zOSsxMjUwLjg3QzEwNzkuNzgrMTM1MysxMDE5LjQ3KzE1MDkuNjQrODM0LjQ1KzE1MDkuNjRMMTM1LjQ1KzE1MDkuNjRMMTM1LjQ1KzE4NjQuNTRMODI2LjY1KzE4NjQuNTRDMTE4Mi45NSsxODY0LjU0KzE0NTkuNDUrMTcyMS45NCsxNDY5LjI1KzEzNjguNTRDMTQ2OS4yNSsxMjA1Ljk0KzE0MjQuNzUrMTA4NC40NCsxMzQ2LjM1Kzk5OS45NDJDMTQyNC43NSs5MTUuNTQyKzE0NjkuMjUrNzk0LjA0MisxNDY5LjI1KzYzMS40NDJaXCIsIGZpbGw6IFwiI0ZGRkZGRlwiLCBvcGFjaXR5OiBcIjFcIn0pXHJcbiAgICAgICAgICAgIClcclxuICAgICAgICApO1xyXG4gICAgfVxyXG59IiwiaW1wb3J0IEJEVjIgZnJvbSBcIi4uL21vZHVsZXMvdjJcIjtcclxuXHJcbmV4cG9ydCBkZWZhdWx0IGNsYXNzIFYyQ19DaGVja2JveCBleHRlbmRzIEJEVjIucmVhY3RDb21wb25lbnQge1xyXG4gICAgY29uc3RydWN0b3IocHJvcHMpIHtcclxuICAgICAgICBzdXBlcihwcm9wcyk7XHJcbiAgICAgICAgdGhpcy5vbkNsaWNrID0gdGhpcy5vbkNsaWNrLmJpbmQodGhpcyk7XHJcbiAgICAgICAgdGhpcy5zZXRJbml0aWFsU3RhdGUoKTtcclxuICAgIH1cclxuXHJcbiAgICBzZXRJbml0aWFsU3RhdGUoKSB7XHJcbiAgICAgICAgdGhpcy5zdGF0ZSA9IHtcclxuICAgICAgICAgICAgY2hlY2tlZDogdGhpcy5wcm9wcy5jaGVja2VkIHx8IGZhbHNlXHJcbiAgICAgICAgfTtcclxuICAgIH1cclxuXHJcbiAgICByZW5kZXIoKSB7XHJcbiAgICAgICAgcmV0dXJuIEJEVjIucmVhY3QuY3JlYXRlRWxlbWVudChcclxuICAgICAgICAgICAgXCJsaVwiLFxyXG4gICAgICAgICAgICBudWxsLFxyXG4gICAgICAgICAgICBCRFYyLnJlYWN0LmNyZWF0ZUVsZW1lbnQoXHJcbiAgICAgICAgICAgICAgICBcImRpdlwiLFxyXG4gICAgICAgICAgICAgICAge2NsYXNzTmFtZTogXCJjaGVja2JveCBcIitCRE1vZHVsZXMuZ2V0KGUgPT4gZS5jaGVja2JveEVsZW1lbnQpWzBdLmNoZWNrYm94LCBvbkNsaWNrOiB0aGlzLm9uQ2xpY2t9LFxyXG4gICAgICAgICAgICAgICAgQkRWMi5yZWFjdC5jcmVhdGVFbGVtZW50KFxyXG4gICAgICAgICAgICAgICAgICAgIFwiZGl2XCIsXHJcbiAgICAgICAgICAgICAgICAgICAge2NsYXNzTmFtZTogXCJjaGVja2JveC1pbm5lciBcIitCRE1vZHVsZXMuZ2V0KGUgPT4gZS5jaGVja2JveElubmVyKVswXS5jaGVja2JveElubmVyfSxcclxuICAgICAgICAgICAgICAgICAgICBCRFYyLnJlYWN0LmNyZWF0ZUVsZW1lbnQoXCJpbnB1dFwiLCB7Y2xhc3NOYW1lOiBCRE1vZHVsZXMuZ2V0KGUgPT4gZS5jaGVja2JveEVsZW1lbnQpWzBdLmNoZWNrYm94RWxlbWVudCwgY2hlY2tlZDogdGhpcy5zdGF0ZS5jaGVja2VkLCBvbkNoYW5nZTogKCkgPT4ge30sIHR5cGU6IFwiY2hlY2tib3hcIn0pLFxyXG4gICAgICAgICAgICAgICAgICAgIEJEVjIucmVhY3QuY3JlYXRlRWxlbWVudChcInNwYW5cIiwgbnVsbClcclxuICAgICAgICAgICAgICAgICksXHJcbiAgICAgICAgICAgICAgICBCRFYyLnJlYWN0LmNyZWF0ZUVsZW1lbnQoXHJcbiAgICAgICAgICAgICAgICAgICAgXCJzcGFuXCIsXHJcbiAgICAgICAgICAgICAgICAgICAgbnVsbCxcclxuICAgICAgICAgICAgICAgICAgICB0aGlzLnByb3BzLnRleHRcclxuICAgICAgICAgICAgICAgIClcclxuICAgICAgICAgICAgKVxyXG4gICAgICAgICk7XHJcbiAgICB9XHJcblxyXG4gICAgb25DbGljaygpIHtcclxuICAgICAgICB0aGlzLnByb3BzLm9uQ2hhbmdlKHRoaXMucHJvcHMuaWQsICF0aGlzLnN0YXRlLmNoZWNrZWQpO1xyXG4gICAgICAgIHRoaXMuc2V0U3RhdGUoe1xyXG4gICAgICAgICAgICBjaGVja2VkOiAhdGhpcy5zdGF0ZS5jaGVja2VkXHJcbiAgICAgICAgfSk7XHJcbiAgICB9XHJcbn0iLCJpbXBvcnQgQkRWMiBmcm9tIFwiLi4vLi4vbW9kdWxlcy92MlwiO1xyXG5pbXBvcnQgQXJyb3cgZnJvbSBcIi4uL2ljb25zL2Rvd25hcnJvd1wiO1xyXG5cclxuY29uc3QgUmVhY3QgPSBCRFYyLlJlYWN0O1xyXG5cclxuXHJcbmV4cG9ydCBkZWZhdWx0IGNsYXNzIFNlbGVjdCBleHRlbmRzIFJlYWN0LkNvbXBvbmVudCB7XHJcbiAgICBjb25zdHJ1Y3Rvcihwcm9wcykge1xyXG4gICAgICAgIHN1cGVyKHByb3BzKTtcclxuICAgICAgICB0aGlzLnN0YXRlID0ge29wZW46IGZhbHNlLCB2YWx1ZTogdGhpcy5wcm9wcy52YWx1ZSB8fCB0aGlzLnByb3BzLm9wdGlvbnNbMF0udmFsdWV9O1xyXG4gICAgICAgIHRoaXMuZHJvcGRvd24gPSBSZWFjdC5jcmVhdGVSZWYoKTtcclxuICAgICAgICB0aGlzLm9uQ2hhbmdlID0gdGhpcy5vbkNoYW5nZS5iaW5kKHRoaXMpO1xyXG4gICAgICAgIHRoaXMuc2hvd01lbnUgPSB0aGlzLnNob3dNZW51LmJpbmQodGhpcyk7XHJcbiAgICAgICAgdGhpcy5oaWRlTWVudSA9IHRoaXMuaGlkZU1lbnUuYmluZCh0aGlzKTtcclxuICAgIH1cclxuXHJcbiAgICBzaG93TWVudShldmVudCkge1xyXG4gICAgICAgIGV2ZW50LnByZXZlbnREZWZhdWx0KCk7XHJcbiAgICAgICAgdGhpcy5zZXRTdGF0ZSh7b3BlbjogdHJ1ZX0sICgpID0+IHtcclxuICAgICAgICAgICAgZG9jdW1lbnQuYWRkRXZlbnRMaXN0ZW5lcihcImNsaWNrXCIsIHRoaXMuaGlkZU1lbnUpO1xyXG4gICAgICAgIH0pO1xyXG4gICAgfVxyXG5cclxuICAgIGhpZGVNZW51KCkge1xyXG4gICAgICAgIHRoaXMuc2V0U3RhdGUoe29wZW46IGZhbHNlfSwgKCkgPT4ge1xyXG4gICAgICAgICAgICBkb2N1bWVudC5yZW1vdmVFdmVudExpc3RlbmVyKFwiY2xpY2tcIiwgdGhpcy5oaWRlTWVudSk7XHJcbiAgICAgICAgfSk7XHJcbiAgICB9XHJcblxyXG4gICAgb25DaGFuZ2UodmFsdWUpIHtcclxuICAgICAgICB0aGlzLnNldFN0YXRlKHt2YWx1ZX0pO1xyXG4gICAgICAgIGlmICh0aGlzLnByb3BzLm9uQ2hhbmdlKSB0aGlzLnByb3BzLm9uQ2hhbmdlKHZhbHVlKTtcclxuICAgIH1cclxuXHJcbiAgICBnZXQgc2VsZWN0ZWQoKSB7cmV0dXJuIHRoaXMucHJvcHMub3B0aW9ucy5maW5kKG8gPT4gby52YWx1ZSA9PSB0aGlzLnN0YXRlLnZhbHVlKTt9XHJcblxyXG4gICAgZ2V0IG9wdGlvbnMoKSB7XHJcbiAgICAgICAgY29uc3Qgc2VsZWN0ZWQgPSB0aGlzLnNlbGVjdGVkO1xyXG4gICAgICAgIHJldHVybiA8ZGl2IGNsYXNzTmFtZT1cImJkLXNlbGVjdC1vcHRpb25zXCI+XHJcbiAgICAgICAgICAgIHt0aGlzLnByb3BzLm9wdGlvbnMubWFwKG9wdCA9PiBcclxuICAgICAgICAgICAgICAgIDxkaXYgY2xhc3NOYW1lPXtgYmQtc2VsZWN0LW9wdGlvbiR7c2VsZWN0ZWQudmFsdWUgPT0gb3B0LnZhbHVlID8gXCIgc2VsZWN0ZWRcIiA6IFwiXCJ9YH0gb25DbGljaz17dGhpcy5vbkNoYW5nZS5iaW5kKHRoaXMsIG9wdC52YWx1ZSl9PntvcHQubGFiZWx9PC9kaXY+XHJcbiAgICAgICAgICAgICl9XHJcbiAgICAgICAgPC9kaXY+O1xyXG4gICAgfVxyXG5cclxuICAgIHJlbmRlcigpIHtcclxuICAgICAgICBjb25zdCBzdHlsZSA9IHRoaXMucHJvcHMuc3R5bGUgPT0gXCJ0cmFuc3BhcmVudFwiID8gXCIgYmQtc2VsZWN0LXRyYW5zcGFyZW50XCIgOiBcIlwiO1xyXG4gICAgICAgIGNvbnN0IGlzT3BlbiA9IHRoaXMuc3RhdGUub3BlbiA/IFwiIG1lbnUtb3BlblwiIDogXCJcIjtcclxuICAgICAgICByZXR1cm4gIDxkaXYgY2xhc3NOYW1lPXtgYmQtc2VsZWN0JHtzdHlsZX0ke2lzT3Blbn1gfSBvbkNsaWNrPXt0aGlzLnNob3dNZW51fSByZWY9e3RoaXMuZHJvcGRvd259PlxyXG4gICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3NOYW1lPVwiYmQtc2VsZWN0LXZhbHVlXCI+e3RoaXMuc2VsZWN0ZWQubGFiZWx9PC9kaXY+XHJcbiAgICAgICAgICAgICAgICAgICAgPEFycm93IGNsYXNzTmFtZT1cImJkLXNlbGVjdC1hcnJvd1wiIC8+XHJcbiAgICAgICAgICAgICAgICAgICAge3RoaXMuc3RhdGUub3BlbiAmJiB0aGlzLm9wdGlvbnN9XHJcbiAgICAgICAgICAgICAgICA8L2Rpdj47XHJcbiAgICB9XHJcbn1cclxuXHJcbi8vIHJldHVybiA8ZGl2IGNsYXNzTmFtZT1cImJkLXNlbGVjdC13cmFwXCI+XHJcbi8vIDxsYWJlbCBjbGFzc05hbWU9XCJiZC1sYWJlbFwiPnt0aGlzLnByb3BzLmxhYmVsfTwvbGFiZWw+XHJcbi8vIDxkaXYgY2xhc3NOYW1lPXtgYmQtc2VsZWN0JHtzdHlsZX0ke2lzT3Blbn1gfSBvbkNsaWNrPXt0aGlzLnNob3dNZW51fSByZWY9e3RoaXMuZHJvcGRvd259PlxyXG4vLyAgICAgPGRpdiBjbGFzc05hbWU9XCJiZC1zZWxlY3QtY29udHJvbHNcIj5cclxuLy8gICAgICAgICA8ZGl2IGNsYXNzTmFtZT1cImJkLXNlbGVjdC12YWx1ZVwiPnt0aGlzLnNlbGVjdGVkLmxhYmVsfTwvZGl2PlxyXG4vLyAgICAgICAgIDxBcnJvdyBjbGFzc05hbWU9XCJiZC1zZWxlY3QtYXJyb3dcIiAvPlxyXG4vLyAgICAgPC9kaXY+XHJcbi8vIDwvZGl2PlxyXG4vLyB7dGhpcy5zdGF0ZS5vcGVuICYmIHRoaXMub3B0aW9uc31cclxuLy8gPC9kaXY+OyIsImltcG9ydCBCRFYyIGZyb20gXCIuLi8uLi9tb2R1bGVzL3YyXCI7XHJcbmltcG9ydCBTZWFyY2hJY29uIGZyb20gXCIuLi9pY29ucy9zZWFyY2hcIjtcclxuXHJcbmNvbnN0IFJlYWN0ID0gQkRWMi5SZWFjdDtcclxuXHJcbmV4cG9ydCBkZWZhdWx0IGNsYXNzIFNlYXJjaCBleHRlbmRzIFJlYWN0LkNvbXBvbmVudCB7XHJcbiAgICByZW5kZXIoKSB7XHJcbiAgICAgICAgcmV0dXJuIDxkaXYgY2xhc3NOYW1lPVwiYmQtc2VhcmNoLXdyYXBwZXJcIj5cclxuICAgICAgICAgICAgICAgICAgICA8aW5wdXQgb25DaGFuZ2U9e3RoaXMucHJvcHMub25DaGFuZ2V9IG9uS2V5RG93bj17dGhpcy5wcm9wcy5vbktleURvd259IHR5cGU9XCJ0ZXh0XCIgY2xhc3NOYW1lPVwiYmQtc2VhcmNoXCIgcGxhY2Vob2xkZXI9e3RoaXMucHJvcHMucGxhY2Vob2xkZXJ9IG1heExlbmd0aD1cIjUwXCIgLz5cclxuICAgICAgICAgICAgICAgICAgICA8U2VhcmNoSWNvbiAvPlxyXG4gICAgICAgICAgICAgICAgPC9kaXY+O1xyXG4gICAgfVxyXG59IiwiaW1wb3J0IEJEVjIgZnJvbSBcIi4uLy4uL21vZHVsZXMvdjJcIjtcclxuXHJcbmNvbnN0IFJlYWN0ID0gQkRWMi5SZWFjdDtcclxuXHJcbmV4cG9ydCBkZWZhdWx0IGNsYXNzIFN3aXRjaCBleHRlbmRzIFJlYWN0LkNvbXBvbmVudCB7XHJcbiAgICBjb25zdHJ1Y3Rvcihwcm9wcykge1xyXG4gICAgICAgIHN1cGVyKHByb3BzKTtcclxuICAgICAgICB0aGlzLnN0YXRlID0ge2NoZWNrZWQ6IHRoaXMucHJvcHMuY2hlY2tlZH07XHJcbiAgICAgICAgdGhpcy5vbkNoYW5nZSA9IHRoaXMub25DaGFuZ2UuYmluZCh0aGlzKTtcclxuICAgIH1cclxuXHJcbiAgICBvbkNoYW5nZSh2YWx1ZSkge1xyXG4gICAgICAgIGlmICh0aGlzLnByb3BzLmRpc2FibGVkKSByZXR1cm47XHJcbiAgICAgICAgdGhpcy5wcm9wcy5vbkNoYW5nZSh2YWx1ZSk7XHJcbiAgICAgICAgdGhpcy5zZXRTdGF0ZSh7Y2hlY2tlZDogdmFsdWV9KTtcclxuICAgIH1cclxuXHJcbiAgICByZW5kZXIoKSB7XHJcbiAgICAgICAgcmV0dXJuIDxMaWdodGNvcmQuQXBpLkNvbXBvbmVudHMuaW5wdXRzLlN3aXRjaCBvbkNoYW5nZT17dGhpcy5vbkNoYW5nZX0gdmFsdWU9e3RoaXMuc3RhdGUuY2hlY2tlZH0gLz5cclxuICAgIH1cclxufSIsImltcG9ydCBCRFYyIGZyb20gXCIuLi9tb2R1bGVzL3YyXCI7XHJcblxyXG5leHBvcnQgZGVmYXVsdCBjbGFzcyBWMkNfQ29udGVudENvbHVtbiBleHRlbmRzIEJEVjIucmVhY3RDb21wb25lbnQge1xyXG4gICAgY29uc3RydWN0b3IocHJvcHMpIHtcclxuICAgICAgICBzdXBlcihwcm9wcyk7XHJcbiAgICB9XHJcblxyXG4gICAgc3RhdGljIGdldCBkaXNwbGF5TmFtZSgpIHtyZXR1cm4gXCJDb250ZW50Q29sdW1uXCI7fVxyXG5cclxuICAgIHJlbmRlcigpIHtcclxuICAgICAgICAvL2xldCBjb250ZW50TW9kdWxlID0gQkRNb2R1bGVzLmdldChlID0+IGUuY29udGVudENvbHVtbilbMF1cclxuICAgICAgICBsZXQgdGl0bGUgPSB0aGlzLnByb3BzLnRpdGxlID8gQkRWMi5yZWFjdC5jcmVhdGVFbGVtZW50KFwiaDJcIiwge2NsYXNzTmFtZTogXCJ1aS1mb3JtLXRpdGxlIGgyIG1hcmdpbi1yZXNldCBtYXJnaW4tYm90dG9tLTIwXCJ9LCB0aGlzLnByb3BzLnRpdGxlKSA6IG51bGxcclxuICAgICAgICByZXR1cm4gW1xyXG4gICAgICAgICAgICB0aXRsZSxcclxuICAgICAgICAgICAgdGhpcy5wcm9wcy5jaGlsZHJlblxyXG4gICAgICAgIF1cclxuICAgICAgICByZXR1cm4gQkRWMi5yZWFjdC5jcmVhdGVFbGVtZW50KFxyXG4gICAgICAgICAgICBcImRpdlwiLFxyXG4gICAgICAgICAgICB7Y2xhc3NOYW1lOiBjb250ZW50TW9kdWxlLmNvbnRlbnRDb2x1bW4gKyBcIiBcIitjb250ZW50TW9kdWxlLmNvbnRlbnRDb2x1bW5EZWZhdWx0K1wiIGNvbnRlbnQtY29sdW1uIGRlZmF1bHRcIiwgc3R5bGU6IHtwYWRkaW5nOiBcIjYwcHggNDBweCAwcHhcIn19LFxyXG4gICAgICAgICAgICB0aXRsZSxcclxuICAgICAgICAgICAgdGhpcy5wcm9wcy5jaGlsZHJlblxyXG4gICAgICAgICk7XHJcbiAgICB9XHJcbn0iLCJpbXBvcnQge3NldHRpbmdzQ29va2llfSBmcm9tIFwiLi4vMGdsb2JhbHNcIjtcclxuaW1wb3J0IFNldHRpbmdzIGZyb20gXCIuLi9tb2R1bGVzL3NldHRpbmdzUGFuZWxcIjtcclxuaW1wb3J0IEJEVjIgZnJvbSBcIi4uL21vZHVsZXMvdjJcIjtcclxuaW1wb3J0IERhdGFTdG9yZSBmcm9tIFwiLi4vbW9kdWxlcy9kYXRhU3RvcmVcIjtcclxuaW1wb3J0IERPTSBmcm9tIFwiLi4vbW9kdWxlcy9kb210b29sc1wiO1xyXG5cclxuaW1wb3J0IFNldHRpbmdzVGl0bGUgZnJvbSBcIi4vc2V0dGluZ3NUaXRsZVwiO1xyXG5pbXBvcnQgQ2hlY2tib3ggZnJvbSBcIi4vY2hlY2tib3hcIjtcclxuaW1wb3J0IFYyQ19Dc3NFZGl0b3JEZXRhY2hlZCBmcm9tIFwiLi9jc3NFZGl0b3JEZXRhY2hlZFwiO1xyXG5cclxuZXhwb3J0IGRlZmF1bHQgY2xhc3MgVjJDX0Nzc0VkaXRvciBleHRlbmRzIEJEVjIucmVhY3RDb21wb25lbnQge1xyXG5cclxuICAgIGNvbnN0cnVjdG9yKHByb3BzKSB7XHJcbiAgICAgICAgc3VwZXIocHJvcHMpO1xyXG4gICAgICAgIGNvbnN0IHNlbGYgPSB0aGlzO1xyXG4gICAgICAgIHNlbGYucHJvcHMubGluZXMgPSAwO1xyXG4gICAgICAgIHNlbGYuc2V0SW5pdGlhbFN0YXRlKCk7XHJcbiAgICAgICAgc2VsZi5hdHRhY2ggPSBzZWxmLmF0dGFjaC5iaW5kKHNlbGYpO1xyXG4gICAgICAgIHNlbGYuZGV0YWNoZWRFZGl0b3IgPSBCRFYyLnJlYWN0LmNyZWF0ZUVsZW1lbnQoVjJDX0Nzc0VkaXRvckRldGFjaGVkLCB7YXR0YWNoOiBzZWxmLmF0dGFjaH0pO1xyXG4gICAgICAgIHNlbGYub25DbGljayA9IHNlbGYub25DbGljay5iaW5kKHNlbGYpO1xyXG4gICAgICAgIHNlbGYudXBkYXRlQ3NzID0gc2VsZi51cGRhdGVDc3MuYmluZChzZWxmKTtcclxuICAgICAgICBzZWxmLnNhdmVDc3MgPSBzZWxmLnNhdmVDc3MuYmluZChzZWxmKTtcclxuICAgICAgICBzZWxmLmRldGFjaCA9IHNlbGYuZGV0YWNoLmJpbmQoc2VsZik7XHJcbiAgICB9XHJcblxyXG4gICAgc2V0SW5pdGlhbFN0YXRlKCkge1xyXG4gICAgICAgIHRoaXMuc3RhdGUgPSB7XHJcbiAgICAgICAgICAgIGRldGFjaGVkOiB0aGlzLnByb3BzLmRldGFjaGVkIHx8IEJEVjIuZWRpdG9yRGV0YWNoZWRcclxuICAgICAgICB9O1xyXG4gICAgfVxyXG5cclxuICAgIGNvbXBvbmVudERpZE1vdW50KCkge1xyXG4gICAgICAgIC8vIHRoaXMudXBkYXRlTGluZUNvdW50KCk7XHJcbiAgICAgICAgdGhpcy5lZGl0b3IgPSBhY2UuZWRpdChcImJkLWN1c3RvbWNzcy1lZGl0b3JcIik7XHJcbiAgICAgICAgdGhpcy5lZGl0b3Iuc2V0VGhlbWUoXCJhY2UvdGhlbWUvbW9ub2thaVwiKTtcclxuICAgICAgICB0aGlzLmVkaXRvci5zZXNzaW9uLnNldE1vZGUoXCJhY2UvbW9kZS9jc3NcIik7XHJcbiAgICAgICAgdGhpcy5lZGl0b3Iuc2V0U2hvd1ByaW50TWFyZ2luKGZhbHNlKTtcclxuICAgICAgICB0aGlzLmVkaXRvci5zZXRGb250U2l6ZSgxNCk7XHJcbiAgICAgICAgdGhpcy5lZGl0b3Iub24oXCJjaGFuZ2VcIiwgKCkgPT4ge1xyXG4gICAgICAgICAgICBpZiAoIXNldHRpbmdzQ29va2llW1wiYmRhLWNzcy0wXCJdKSByZXR1cm47XHJcbiAgICAgICAgICAgIHRoaXMuc2F2ZUNzcygpO1xyXG4gICAgICAgICAgICB0aGlzLnVwZGF0ZUNzcygpO1xyXG4gICAgICAgIH0pO1xyXG4gICAgfVxyXG5cclxuICAgIGNvbXBvbmVudFdpbGxVbm1vdW50KCkge1xyXG4gICAgICAgIHRoaXMuZWRpdG9yLmRlc3Ryb3koKTtcclxuICAgIH1cclxuXHJcbiAgICBjb21wb25lbnREaWRVcGRhdGUocHJldlByb3BzLCBwcmV2U3RhdGUpIHtcclxuICAgICAgICBjb25zdCBzZWxmID0gdGhpcztcclxuICAgICAgICBpZiAocHJldlN0YXRlLmRldGFjaGVkICYmICFzZWxmLnN0YXRlLmRldGFjaGVkKSB7XHJcbiAgICAgICAgICAgIEJEVjIucmVhY3REb20udW5tb3VudENvbXBvbmVudEF0Tm9kZShzZWxmLmRldGFjaGVkUm9vdCk7XHJcbiAgICAgICAgfVxyXG4gICAgfVxyXG5cclxuICAgIGNvZGVNaXJyb3IoKSB7XHJcbiAgICB9XHJcblxyXG4gICAgZ2V0IG9wdGlvbnMoKSB7XHJcbiAgICAgICAgcmV0dXJuIHtcclxuICAgICAgICAgICAgbGluZU51bWJlcnM6IHRydWUsXHJcbiAgICAgICAgICAgIG1vZGU6IFwiY3NzXCIsXHJcbiAgICAgICAgICAgIGluZGVudFVuaXQ6IDQsXHJcbiAgICAgICAgICAgIHRoZW1lOiBcIm1hdGVyaWFsXCIsXHJcbiAgICAgICAgICAgIHNjcm9sbGJhclN0eWxlOiBcInNpbXBsZVwiXHJcbiAgICAgICAgfTtcclxuICAgIH1cclxuXHJcbiAgICBnZXQgY3NzKCkge1xyXG4gICAgICAgIGNvbnN0IF9jY3NzID0gRGF0YVN0b3JlLmdldEJERGF0YShcImJkY3VzdG9tY3NzXCIpO1xyXG4gICAgICAgIGxldCBjY3NzID0gXCJcIjtcclxuICAgICAgICBpZiAoX2Njc3MgJiYgX2Njc3MgIT09IFwiXCIpIHtcclxuICAgICAgICAgICAgY2NzcyA9IGF0b2IoX2Njc3MpO1xyXG4gICAgICAgIH1cclxuICAgICAgICByZXR1cm4gY2NzcztcclxuICAgIH1cclxuXHJcbiAgICB1cGRhdGVMaW5lQ291bnQoKSB7XHJcbiAgICAgICAgY29uc3QgbGluZUNvdW50ID0gdGhpcy5yZWZzLmVkaXRvci52YWx1ZS5zcGxpdChcIlxcblwiKS5sZW5ndGg7XHJcbiAgICAgICAgaWYgKGxpbmVDb3VudCA9PSB0aGlzLnByb3BzLmxpbmVzKSByZXR1cm47XHJcbiAgICAgICAgdGhpcy5yZWZzLmxpbmVzLnRleHRDb250ZW50ID0gQXJyYXkuZnJvbShuZXcgQXJyYXkobGluZUNvdW50KSwgKF8sIGkpID0+IGkgKyAxKS5qb2luKFwiLlxcblwiKSArIFwiLlwiO1xyXG4gICAgICAgIHRoaXMucHJvcHMubGluZXMgPSBsaW5lQ291bnQ7XHJcbiAgICB9XHJcblxyXG4gICAgcmVuZGVyKCkge1xyXG4gICAgICAgIGNvbnN0IHNlbGYgPSB0aGlzO1xyXG5cclxuICAgICAgICBjb25zdCB7ZGV0YWNoZWR9ID0gc2VsZi5zdGF0ZTtcclxuICAgICAgICByZXR1cm4gW1xyXG4gICAgICAgICAgICBkZXRhY2hlZCAmJiBCRFYyLnJlYWN0LmNyZWF0ZUVsZW1lbnQoXHJcbiAgICAgICAgICAgICAgICBcImRpdlwiLFxyXG4gICAgICAgICAgICAgICAge2lkOiBcImVkaXRvci1kZXRhY2hlZFwifSxcclxuICAgICAgICAgICAgICAgIEJEVjIucmVhY3QuY3JlYXRlRWxlbWVudChTZXR0aW5nc1RpdGxlLCB7dGV4dDogXCJDdXN0b20gQ1NTIEVkaXRvclwifSksXHJcbiAgICAgICAgICAgICAgICBCRFYyLnJlYWN0LmNyZWF0ZUVsZW1lbnQoXHJcbiAgICAgICAgICAgICAgICAgICAgXCJoM1wiLFxyXG4gICAgICAgICAgICAgICAgICAgIG51bGwsXHJcbiAgICAgICAgICAgICAgICAgICAgXCJFZGl0b3IgRGV0YWNoZWRcIlxyXG4gICAgICAgICAgICAgICAgKSxcclxuICAgICAgICAgICAgICAgIEJEVjIucmVhY3QuY3JlYXRlRWxlbWVudChcclxuICAgICAgICAgICAgICAgICAgICBcImJ1dHRvblwiLFxyXG4gICAgICAgICAgICAgICAgICAgIHtjbGFzc05hbWU6IFwiYnRuIGJ0bi1wcmltYXJ5XCIsIG9uQ2xpY2s6ICgpID0+IHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNlbGYuYXR0YWNoKCk7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIH19LFxyXG4gICAgICAgICAgICAgICAgICAgIFwiQXR0YWNoXCJcclxuICAgICAgICAgICAgICAgIClcclxuICAgICAgICAgICAgKSxcclxuICAgICAgICAgICAgIWRldGFjaGVkICYmIEJEVjIucmVhY3QuY3JlYXRlRWxlbWVudChcclxuICAgICAgICAgICAgICAgIFwiZGl2XCIsXHJcbiAgICAgICAgICAgICAgICBudWxsLFxyXG4gICAgICAgICAgICAgICAgQkRWMi5yZWFjdC5jcmVhdGVFbGVtZW50KFNldHRpbmdzVGl0bGUsIHt0ZXh0OiBcIkN1c3RvbSBDU1MgRWRpdG9yXCJ9KSxcclxuICAgICAgICAgICAgICAgIEJEVjIucmVhY3QuY3JlYXRlRWxlbWVudChcImRpdlwiLCB7Y2xhc3NOYW1lOiBcImVkaXRvci13cmFwcGVyXCJ9LFxyXG4gICAgICAgICAgICAgICAgICAgIEJEVjIucmVhY3QuY3JlYXRlRWxlbWVudChcImRpdlwiLCB7aWQ6IFwiYmQtY3VzdG9tY3NzLWVkaXRvclwiLCBjbGFzc05hbWU6IFwiZWRpdG9yXCIsIHJlZjogXCJlZGl0b3JcIn0sIHNlbGYuY3NzKVxyXG4gICAgICAgICAgICAgICAgKSxcclxuICAgICAgICAgICAgICAgIEJEVjIucmVhY3QuY3JlYXRlRWxlbWVudChcclxuICAgICAgICAgICAgICAgICAgICBcImRpdlwiLFxyXG4gICAgICAgICAgICAgICAgICAgIHtpZDogXCJiZC1jdXN0b21jc3MtYXR0YWNoLWNvbnRyb2xzXCJ9LFxyXG4gICAgICAgICAgICAgICAgICAgIEJEVjIucmVhY3QuY3JlYXRlRWxlbWVudChcclxuICAgICAgICAgICAgICAgICAgICAgICAgXCJ1bFwiLFxyXG4gICAgICAgICAgICAgICAgICAgICAgICB7Y2xhc3NOYW1lOiBcImNoZWNrYm94LWdyb3VwXCJ9LFxyXG4gICAgICAgICAgICAgICAgICAgICAgICBCRFYyLnJlYWN0LmNyZWF0ZUVsZW1lbnQoQ2hlY2tib3gsIHtpZDogXCJsaXZlLXVwZGF0ZVwiLCB0ZXh0OiBcIkxpdmUgVXBkYXRlXCIsIG9uQ2hhbmdlOiB0aGlzLm9uQ2hhbmdlLCBjaGVja2VkOiBzZXR0aW5nc0Nvb2tpZVtcImJkYS1jc3MtMFwiXX0pXHJcbiAgICAgICAgICAgICAgICAgICAgKSxcclxuICAgICAgICAgICAgICAgICAgICBCRFYyLnJlYWN0LmNyZWF0ZUVsZW1lbnQoXHJcbiAgICAgICAgICAgICAgICAgICAgICAgIFwiZGl2XCIsXHJcbiAgICAgICAgICAgICAgICAgICAgICAgIHtpZDogXCJiZC1jdXN0b21jc3MtZGV0YWNoLWNvbnRyb2xzLWJ1dHRvblwifSxcclxuICAgICAgICAgICAgICAgICAgICAgICAgQkRWMi5yZWFjdC5jcmVhdGVFbGVtZW50KFxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgXCJidXR0b25cIixcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHtzdHlsZToge2JvcmRlclJhZGl1czogXCIzcHggMCAwIDNweFwiLCBib3JkZXJSaWdodDogXCIxcHggc29saWQgIzNmNDE0NlwifSwgY2xhc3NOYW1lOiBcImJ0biBidG4tcHJpbWFyeVwiLCBvbkNsaWNrOiAoKSA9PiB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNlbGYub25DbGljayhcInVwZGF0ZVwiKTtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9fSxcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwiVXBkYXRlXCJcclxuICAgICAgICAgICAgICAgICAgICAgICAgKSxcclxuICAgICAgICAgICAgICAgICAgICAgICAgQkRWMi5yZWFjdC5jcmVhdGVFbGVtZW50KFxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgXCJidXR0b25cIixcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHtzdHlsZToge2JvcmRlclJhZGl1czogXCIwXCIsIGJvcmRlckxlZnQ6IFwiMXB4IHNvbGlkICMyZDJkMmRcIiwgYm9yZGVyUmlnaHQ6IFwiMXB4IHNvbGlkICMyZDJkMmRcIn0sIGNsYXNzTmFtZTogXCJidG4gYnRuLXByaW1hcnlcIiwgb25DbGljazogKCkgPT4ge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzZWxmLm9uQ2xpY2soXCJzYXZlXCIpO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH19LFxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgXCJTYXZlXCJcclxuICAgICAgICAgICAgICAgICAgICAgICAgKSxcclxuICAgICAgICAgICAgICAgICAgICAgICAgQkRWMi5yZWFjdC5jcmVhdGVFbGVtZW50KFxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgXCJidXR0b25cIixcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHtzdHlsZToge2JvcmRlclJhZGl1czogXCIwIDNweCAzcHggMFwiLCBib3JkZXJMZWZ0OiBcIjFweCBzb2xpZCAjM2Y0MTQ2XCJ9LCBjbGFzc05hbWU6IFwiYnRuIGJ0bi1wcmltYXJ5XCIsIG9uQ2xpY2s6ICgpID0+IHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2VsZi5vbkNsaWNrKFwiZGV0YWNoXCIpO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH19LFxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgXCJEZXRhY2hcIlxyXG4gICAgICAgICAgICAgICAgICAgICAgICApLFxyXG4gICAgICAgICAgICAgICAgICAgICAgICBCRFYyLnJlYWN0LmNyZWF0ZUVsZW1lbnQoXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBcInNwYW5cIixcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHtzdHlsZToge2ZvbnRTaXplOiBcIjEwcHhcIiwgbWFyZ2luTGVmdDogXCI1cHhcIn19LFxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgXCJVbnNhdmVkIGNoYW5nZXMgYXJlIGxvc3Qgb24gZGV0YWNoXCJcclxuICAgICAgICAgICAgICAgICAgICAgICAgKSxcclxuICAgICAgICAgICAgICAgICAgICAgICAgQkRWMi5yZWFjdC5jcmVhdGVFbGVtZW50KFwiZGl2XCIsIHtjbGFzc05hbWU6IFwiaGVscC10ZXh0XCJ9LFxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgXCJQcmVzcyBcIixcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIEJEVjIucmVhY3QuY3JlYXRlRWxlbWVudChcImNvZGVcIiwge2NsYXNzTmFtZTogXCJpbmxpbmVcIn0sIFwiY3RybFwiKSxcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwiK1wiLFxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgQkRWMi5yZWFjdC5jcmVhdGVFbGVtZW50KFwic3BhblwiLCB7Y2xhc3NOYW1lOiBcImlubGluZVwifSwgXCIsXCIpLFxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgXCIgd2l0aCB0aGUgZWRpdG9yIGZvY3VzZWQgdG8gYWNjZXNzIHRoZSBlZGl0b3IncyBzZXR0aW5ncy5cIlxyXG4gICAgICAgICAgICAgICAgICAgICAgICApXHJcbiAgICAgICAgICAgICAgICAgICAgKVxyXG4gICAgICAgICAgICAgICAgKVxyXG4gICAgICAgICAgICApXHJcbiAgICAgICAgXVxyXG4gICAgfVxyXG5cclxuICAgIG9uQ2xpY2soYXJnKSB7XHJcbiAgICAgICAgY29uc3Qgc2VsZiA9IHRoaXM7XHJcbiAgICAgICAgc3dpdGNoIChhcmcpIHtcclxuICAgICAgICAgICAgY2FzZSBcInVwZGF0ZVwiOlxyXG4gICAgICAgICAgICAgICAgc2VsZi51cGRhdGVDc3MoKTtcclxuICAgICAgICAgICAgICAgIGJyZWFrO1xyXG4gICAgICAgICAgICBjYXNlIFwic2F2ZVwiOlxyXG4gICAgICAgICAgICAgICAgc2VsZi5zYXZlQ3NzKCk7XHJcbiAgICAgICAgICAgICAgICBicmVhaztcclxuICAgICAgICAgICAgY2FzZSBcImRldGFjaFwiOlxyXG4gICAgICAgICAgICAgICAgc2VsZi5kZXRhY2goKTtcclxuICAgICAgICAgICAgICAgIGJyZWFrO1xyXG4gICAgICAgIH1cclxuICAgIH1cclxuXHJcbiAgICBvbkNoYW5nZShpZCwgY2hlY2tlZCkge1xyXG4gICAgICAgIHN3aXRjaCAoaWQpIHtcclxuICAgICAgICAgICAgY2FzZSBcImxpdmUtdXBkYXRlXCI6XHJcbiAgICAgICAgICAgICAgICBzZXR0aW5nc0Nvb2tpZVtcImJkYS1jc3MtMFwiXSA9IGNoZWNrZWQ7XHJcbiAgICAgICAgICAgICAgICBTZXR0aW5ncy5zYXZlU2V0dGluZ3MoKTtcclxuICAgICAgICAgICAgICAgIGJyZWFrO1xyXG4gICAgICAgIH1cclxuICAgIH1cclxuXHJcbiAgICB1cGRhdGVDc3MoKSB7XHJcbiAgICAgICAgRE9NLnJlbW92ZVN0eWxlKFwiY3VzdG9tY3NzXCIpO1xyXG4gICAgICAgIERPTS5hZGRTdHlsZShcImN1c3RvbWNzc1wiLCB0aGlzLmVkaXRvci5zZXNzaW9uLmdldFZhbHVlKCkpO1xyXG4gICAgfVxyXG5cclxuICAgIHNhdmVDc3MoKSB7XHJcbiAgICAgICAgRGF0YVN0b3JlLnNldEJERGF0YShcImJkY3VzdG9tY3NzXCIsIGJ0b2EodGhpcy5lZGl0b3Iuc2Vzc2lvbi5nZXRWYWx1ZSgpKSk7XHJcbiAgICB9XHJcblxyXG4gICAgZGV0YWNoKCkge1xyXG4gICAgICAgIGNvbnN0IHNlbGYgPSB0aGlzO1xyXG4gICAgICAgIHNlbGYuc2V0U3RhdGUoe1xyXG4gICAgICAgICAgICBkZXRhY2hlZDogdHJ1ZVxyXG4gICAgICAgIH0pO1xyXG4gICAgICAgIGNvbnN0IGRyb290ID0gc2VsZi5kZXRhY2hlZFJvb3Q7XHJcbiAgICAgICAgaWYgKCFkcm9vdCkge1xyXG4gICAgICAgICAgICBjb25zb2xlLmxvZyhcIkZBSUxFRCBUTyBJTkpFQ1QgUk9PVDogLmFwcFwiKTtcclxuICAgICAgICAgICAgcmV0dXJuO1xyXG4gICAgICAgIH1cclxuICAgICAgICBCRFYyLnJlYWN0RG9tLnJlbmRlcihzZWxmLmRldGFjaGVkRWRpdG9yLCBkcm9vdCk7XHJcbiAgICB9XHJcblxyXG4gICAgZ2V0IGRldGFjaGVkUm9vdCgpIHtcclxuICAgICAgICBjb25zdCBfcm9vdCA9IERPTS5xdWVyeShcIiNiZC1jdXN0b21jc3MtZGV0YWNoLWNvbnRhaW5lclwiKTtcclxuICAgICAgICBpZiAoIV9yb290KSB7XHJcbiAgICAgICAgICAgIGlmICghdGhpcy5pbmplY3REZXRhY2hlZFJvb3QoKSkgcmV0dXJuIG51bGw7XHJcbiAgICAgICAgICAgIHJldHVybiB0aGlzLmRldGFjaGVkUm9vdDtcclxuICAgICAgICB9XHJcbiAgICAgICAgcmV0dXJuIF9yb290O1xyXG4gICAgfVxyXG5cclxuICAgIGluamVjdERldGFjaGVkUm9vdCgpIHtcclxuICAgICAgICBjb25zdCBhcHAgPSBET00ucXVlcnkoXCIuYXBwLCAuXCIrQkRNb2R1bGVzLmdldChlID0+IGUuYXBwICYmIGUubGF5ZXJzKVswXS5hcHAuc3BsaXQoXCIgXCIpWzBdKTtcclxuICAgICAgICBpZiAoIWFwcCkgcmV0dXJuIGZhbHNlO1xyXG4gICAgICAgIERPTS5pbnNlcnRBZnRlcihET00uY3JlYXRlRWxlbWVudChgPGRpdiBpZD1cImJkLWN1c3RvbWNzcy1kZXRhY2gtY29udGFpbmVyXCI+YCksIGFwcCk7XHJcbiAgICAgICAgcmV0dXJuIHRydWU7XHJcbiAgICB9XHJcblxyXG4gICAgYXR0YWNoKCkge1xyXG4gICAgICAgIGNvbnN0IHNlbGYgPSB0aGlzO1xyXG4gICAgICAgIHNlbGYuc2V0U3RhdGUoe1xyXG4gICAgICAgICAgICBkZXRhY2hlZDogZmFsc2VcclxuICAgICAgICB9KTtcclxuICAgIH1cclxufSIsImltcG9ydCB7c2V0dGluZ3NDb29raWV9IGZyb20gXCIuLi8wZ2xvYmFsc1wiO1xyXG5pbXBvcnQgU2V0dGluZ3MgZnJvbSBcIi4uL21vZHVsZXMvc2V0dGluZ3NQYW5lbFwiO1xyXG5pbXBvcnQgQkRWMiBmcm9tIFwiLi4vbW9kdWxlcy92MlwiO1xyXG5pbXBvcnQgRGF0YVN0b3JlIGZyb20gXCIuLi9tb2R1bGVzL2RhdGFTdG9yZVwiO1xyXG5pbXBvcnQgRE9NIGZyb20gXCIuLi9tb2R1bGVzL2RvbXRvb2xzXCI7XHJcblxyXG5pbXBvcnQgQ2hlY2tib3ggZnJvbSBcIi4vY2hlY2tib3hcIjtcclxuXHJcbmV4cG9ydCBkZWZhdWx0IGNsYXNzIFYyQ19Dc3NFZGl0b3JEZXRhY2hlZCBleHRlbmRzIEJEVjIucmVhY3RDb21wb25lbnQge1xyXG5cclxuICAgIGNvbnN0cnVjdG9yKHByb3BzKSB7XHJcbiAgICAgICAgc3VwZXIocHJvcHMpO1xyXG4gICAgICAgIGNvbnN0IHNlbGYgPSB0aGlzO1xyXG4gICAgICAgIHNlbGYub25DbGljayA9IHNlbGYub25DbGljay5iaW5kKHNlbGYpO1xyXG4gICAgICAgIHNlbGYudXBkYXRlQ3NzID0gc2VsZi51cGRhdGVDc3MuYmluZChzZWxmKTtcclxuICAgICAgICBzZWxmLnNhdmVDc3MgPSBzZWxmLnNhdmVDc3MuYmluZChzZWxmKTtcclxuICAgICAgICBzZWxmLm9uQ2hhbmdlID0gc2VsZi5vbkNoYW5nZS5iaW5kKHNlbGYpO1xyXG4gICAgfVxyXG5cclxuICAgIGNvbXBvbmVudERpZE1vdW50KCkge1xyXG4gICAgICAgIERPTS5hZGRDbGFzcyhET00ucXVlcnkoXCIjYXBwLW1vdW50XCIpLCBcImJkLWRldGFjaGVkLWVkaXRvclwiKTtcclxuICAgICAgICBCRFYyLmVkaXRvckRldGFjaGVkID0gdHJ1ZTtcclxuICAgICAgICAvLyB0aGlzLnVwZGF0ZUxpbmVDb3VudCgpO1xyXG4gICAgICAgIHRoaXMuZWRpdG9yID0gYWNlLmVkaXQoXCJiZC1jdXN0b21jc3MtZWRpdG9yLWRldGFjaGVkXCIpO1xyXG4gICAgICAgIHRoaXMuZWRpdG9yLnNldFRoZW1lKFwiYWNlL3RoZW1lL21vbm9rYWlcIik7XHJcbiAgICAgICAgdGhpcy5lZGl0b3Iuc2Vzc2lvbi5zZXRNb2RlKFwiYWNlL21vZGUvY3NzXCIpO1xyXG4gICAgICAgIHRoaXMuZWRpdG9yLnNldFNob3dQcmludE1hcmdpbihmYWxzZSk7XHJcbiAgICAgICAgdGhpcy5lZGl0b3Iuc2V0Rm9udFNpemUoMTQpO1xyXG4gICAgICAgIHRoaXMuZWRpdG9yLm9uKFwiY2hhbmdlXCIsICgpID0+IHtcclxuICAgICAgICAgICAgaWYgKCFzZXR0aW5nc0Nvb2tpZVtcImJkYS1jc3MtMFwiXSkgcmV0dXJuO1xyXG4gICAgICAgICAgICB0aGlzLnNhdmVDc3MoKTtcclxuICAgICAgICAgICAgdGhpcy51cGRhdGVDc3MoKTtcclxuICAgICAgICB9KTtcclxuXHJcbiAgICB9XHJcblxyXG4gICAgY29tcG9uZW50V2lsbFVubW91bnQoKSB7XHJcbiAgICAgICAgRE9NLnJlbW92ZUNsYXNzKERPTS5xdWVyeShcIiNhcHAtbW91bnRcIiksIFwiYmQtZGV0YWNoZWQtZWRpdG9yXCIpO1xyXG4gICAgICAgIEJEVjIuZWRpdG9yRGV0YWNoZWQgPSBmYWxzZTtcclxuICAgICAgICB0aGlzLmVkaXRvci5kZXN0cm95KCk7XHJcbiAgICB9XHJcblxyXG4gICAgdXBkYXRlTGluZUNvdW50KCkge1xyXG4gICAgICAgIGNvbnN0IGxpbmVDb3VudCA9IHRoaXMucmVmcy5lZGl0b3IudmFsdWUuc3BsaXQoXCJcXG5cIikubGVuZ3RoO1xyXG4gICAgICAgIGlmIChsaW5lQ291bnQgPT0gdGhpcy5wcm9wcy5saW5lcykgcmV0dXJuO1xyXG4gICAgICAgIHRoaXMucmVmcy5saW5lcy50ZXh0Q29udGVudCA9IEFycmF5LmZyb20obmV3IEFycmF5KGxpbmVDb3VudCksIChfLCBpKSA9PiBpICsgMSkuam9pbihcIi5cXG5cIikgKyBcIi5cIjtcclxuICAgICAgICB0aGlzLnByb3BzLmxpbmVzID0gbGluZUNvdW50O1xyXG4gICAgfVxyXG5cclxuICAgIGdldCBvcHRpb25zKCkge1xyXG4gICAgICAgIHJldHVybiB7XHJcbiAgICAgICAgICAgIGxpbmVOdW1iZXJzOiB0cnVlLFxyXG4gICAgICAgICAgICBtb2RlOiBcImNzc1wiLFxyXG4gICAgICAgICAgICBpbmRlbnRVbml0OiA0LFxyXG4gICAgICAgICAgICB0aGVtZTogXCJtYXRlcmlhbFwiLFxyXG4gICAgICAgICAgICBzY3JvbGxiYXJTdHlsZTogXCJzaW1wbGVcIlxyXG4gICAgICAgIH07XHJcbiAgICB9XHJcblxyXG4gICAgZ2V0IGNzcygpIHtcclxuICAgICAgICBjb25zdCBfY2NzcyA9IERhdGFTdG9yZS5nZXRCRERhdGEoXCJiZGN1c3RvbWNzc1wiKTtcclxuICAgICAgICBsZXQgY2NzcyA9IFwiXCI7XHJcbiAgICAgICAgaWYgKF9jY3NzICYmIF9jY3NzICE9PSBcIlwiKSB7XHJcbiAgICAgICAgICAgIGNjc3MgPSBhdG9iKF9jY3NzKTtcclxuICAgICAgICB9XHJcbiAgICAgICAgcmV0dXJuIGNjc3M7XHJcbiAgICB9XHJcblxyXG4gICAgZ2V0IHJvb3QoKSB7XHJcbiAgICAgICAgY29uc3QgX3Jvb3QgPSBET00ucXVlcnkoXCIjYmQtY3VzdG9tY3NzLWRldGFjaC1jb250YWluZXJcIik7XHJcbiAgICAgICAgaWYgKCFfcm9vdCkge1xyXG4gICAgICAgICAgICBpZiAoIXRoaXMuaW5qZWN0Um9vdCgpKSByZXR1cm4gbnVsbDtcclxuICAgICAgICAgICAgcmV0dXJuIHRoaXMuZGV0YWNoZWRSb290O1xyXG4gICAgICAgIH1cclxuICAgICAgICByZXR1cm4gX3Jvb3Q7XHJcbiAgICB9XHJcblxyXG4gICAgaW5qZWN0Um9vdCgpIHtcclxuICAgICAgICBjb25zdCBhcHAgPSBET00ucXVlcnkoXCIuYXBwLCAuXCIrQkRNb2R1bGVzLmdldChlID0+IGUuYXBwICYmIGUubGF5ZXJzKVswXS5hcHAuc3BsaXQoXCIgXCIpWzBdKTtcclxuICAgICAgICBpZiAoIWFwcCkgcmV0dXJuIGZhbHNlO1xyXG4gICAgICAgIERPTS5pbnNlcnRBZnRlcihET00uY3JlYXRlRWxlbWVudChgPGRpdiBpZD1cImJkLWN1c3RvbWNzcy1kZXRhY2gtY29udGFpbmVyXCI+YCksIGFwcCk7XHJcbiAgICAgICAgcmV0dXJuIHRydWU7XHJcbiAgICB9XHJcblxyXG4gICAgcmVuZGVyKCkge1xyXG4gICAgICAgIGNvbnN0IHNlbGYgPSB0aGlzO1xyXG4gICAgICAgIHJldHVybiBCRFYyLnJlYWN0LmNyZWF0ZUVsZW1lbnQoXHJcbiAgICAgICAgICAgIFwiZGl2XCIsXHJcbiAgICAgICAgICAgIHtjbGFzc05hbWU6IFwiYmQtZGV0YWNoZWQtY3NzLWVkaXRvclwiLCBpZDogXCJiZC1jdXN0b21jc3MtZGV0YWNoLWVkaXRvclwifSxcclxuICAgICAgICAgICAgQkRWMi5yZWFjdC5jcmVhdGVFbGVtZW50KFxyXG4gICAgICAgICAgICAgICAgXCJkaXZcIixcclxuICAgICAgICAgICAgICAgIHtpZDogXCJiZC1jdXN0b21jc3MtaW5uZXJwYW5lXCJ9LFxyXG4gICAgICAgICAgICAgICAgQkRWMi5yZWFjdC5jcmVhdGVFbGVtZW50KFwiZGl2XCIsIHtjbGFzc05hbWU6IFwiZWRpdG9yLXdyYXBwZXJcIn0sXHJcbiAgICAgICAgICAgICAgICAgICAgQkRWMi5yZWFjdC5jcmVhdGVFbGVtZW50KFwiZGl2XCIsIHtpZDogXCJiZC1jdXN0b21jc3MtZWRpdG9yLWRldGFjaGVkXCIsIGNsYXNzTmFtZTogXCJlZGl0b3JcIiwgcmVmOiBcImVkaXRvclwifSwgc2VsZi5jc3MpXHJcbiAgICAgICAgICAgICAgICApLFxyXG4gICAgICAgICAgICAgICAgQkRWMi5yZWFjdC5jcmVhdGVFbGVtZW50KFxyXG4gICAgICAgICAgICAgICAgICAgIFwiZGl2XCIsXHJcbiAgICAgICAgICAgICAgICAgICAge2lkOiBcImJkLWN1c3RvbWNzcy1hdHRhY2gtY29udHJvbHNcIn0sXHJcbiAgICAgICAgICAgICAgICAgICAgQkRWMi5yZWFjdC5jcmVhdGVFbGVtZW50KFxyXG4gICAgICAgICAgICAgICAgICAgICAgICBcInVsXCIsXHJcbiAgICAgICAgICAgICAgICAgICAgICAgIHtjbGFzc05hbWU6IFwiY2hlY2tib3gtZ3JvdXBcIn0sXHJcbiAgICAgICAgICAgICAgICAgICAgICAgIEJEVjIucmVhY3QuY3JlYXRlRWxlbWVudChDaGVja2JveCwge2lkOiBcImxpdmUtdXBkYXRlXCIsIHRleHQ6IFwiTGl2ZSBVcGRhdGVcIiwgb25DaGFuZ2U6IHNlbGYub25DaGFuZ2UsIGNoZWNrZWQ6IHNldHRpbmdzQ29va2llW1wiYmRhLWNzcy0wXCJdfSlcclxuICAgICAgICAgICAgICAgICAgICApLFxyXG4gICAgICAgICAgICAgICAgICAgIEJEVjIucmVhY3QuY3JlYXRlRWxlbWVudChcclxuICAgICAgICAgICAgICAgICAgICAgICAgXCJkaXZcIixcclxuICAgICAgICAgICAgICAgICAgICAgICAge2lkOiBcImJkLWN1c3RvbWNzcy1kZXRhY2gtY29udHJvbHMtYnV0dG9uXCJ9LFxyXG4gICAgICAgICAgICAgICAgICAgICAgICBCRFYyLnJlYWN0LmNyZWF0ZUVsZW1lbnQoXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBcImJ1dHRvblwiLFxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAge3N0eWxlOiB7Ym9yZGVyUmFkaXVzOiBcIjNweCAwIDAgM3B4XCIsIGJvcmRlclJpZ2h0OiBcIjFweCBzb2xpZCAjM2Y0MTQ2XCJ9LCBjbGFzc05hbWU6IFwiYnRuIGJ0bi1wcmltYXJ5XCIsIG9uQ2xpY2s6ICgpID0+IHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2VsZi5vbkNsaWNrKFwidXBkYXRlXCIpO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH19LFxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgXCJVcGRhdGVcIlxyXG4gICAgICAgICAgICAgICAgICAgICAgICApLFxyXG4gICAgICAgICAgICAgICAgICAgICAgICBCRFYyLnJlYWN0LmNyZWF0ZUVsZW1lbnQoXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBcImJ1dHRvblwiLFxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAge3N0eWxlOiB7Ym9yZGVyUmFkaXVzOiBcIjBcIiwgYm9yZGVyTGVmdDogXCIxcHggc29saWQgIzJkMmQyZFwiLCBib3JkZXJSaWdodDogXCIxcHggc29saWQgIzJkMmQyZFwifSwgY2xhc3NOYW1lOiBcImJ0biBidG4tcHJpbWFyeVwiLCBvbkNsaWNrOiAoKSA9PiB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNlbGYub25DbGljayhcInNhdmVcIik7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfX0sXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBcIlNhdmVcIlxyXG4gICAgICAgICAgICAgICAgICAgICAgICApLFxyXG4gICAgICAgICAgICAgICAgICAgICAgICBCRFYyLnJlYWN0LmNyZWF0ZUVsZW1lbnQoXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBcImJ1dHRvblwiLFxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAge3N0eWxlOiB7Ym9yZGVyUmFkaXVzOiBcIjAgM3B4IDNweCAwXCIsIGJvcmRlckxlZnQ6IFwiMXB4IHNvbGlkICMzZjQxNDZcIn0sIGNsYXNzTmFtZTogXCJidG4gYnRuLXByaW1hcnlcIiwgb25DbGljazogKCkgPT4ge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzZWxmLm9uQ2xpY2soXCJhdHRhY2hcIik7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfX0sXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBcIkF0dGFjaFwiXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICksXHJcbiAgICAgICAgICAgICAgICAgICAgICAgIEJEVjIucmVhY3QuY3JlYXRlRWxlbWVudChcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwic3BhblwiLFxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAge3N0eWxlOiB7Zm9udFNpemU6IFwiMTBweFwiLCBtYXJnaW5MZWZ0OiBcIjVweFwifX0sXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBcIlVuc2F2ZWQgY2hhbmdlcyBhcmUgbG9zdCBvbiBhdHRhY2hcIlxyXG4gICAgICAgICAgICAgICAgICAgICAgICApXHJcbiAgICAgICAgICAgICAgICAgICAgKVxyXG4gICAgICAgICAgICAgICAgKVxyXG4gICAgICAgICAgICApXHJcbiAgICAgICAgKTtcclxuICAgIH1cclxuXHJcbiAgICBvbkNoYW5nZShpZCwgY2hlY2tlZCkge1xyXG4gICAgICAgIHN3aXRjaCAoaWQpIHtcclxuICAgICAgICAgICAgY2FzZSBcImxpdmUtdXBkYXRlXCI6XHJcbiAgICAgICAgICAgICAgICBzZXR0aW5nc0Nvb2tpZVtcImJkYS1jc3MtMFwiXSA9IGNoZWNrZWQ7XHJcbiAgICAgICAgICAgICAgICBTZXR0aW5ncy5zYXZlU2V0dGluZ3MoKTtcclxuICAgICAgICAgICAgICAgIGJyZWFrO1xyXG4gICAgICAgIH1cclxuICAgIH1cclxuXHJcbiAgICBvbkNsaWNrKGlkKSB7XHJcbiAgICAgICAgY29uc3Qgc2VsZiA9IHRoaXM7XHJcbiAgICAgICAgc3dpdGNoIChpZCkge1xyXG4gICAgICAgICAgICBjYXNlIFwiYXR0YWNoXCI6XHJcbiAgICAgICAgICAgICAgICBpZiAoRE9NLnF1ZXJ5KFwiI2VkaXRvci1kZXRhY2hlZFwiKSkgc2VsZi5wcm9wcy5hdHRhY2goKTtcclxuICAgICAgICAgICAgICAgIEJEVjIucmVhY3REb20udW5tb3VudENvbXBvbmVudEF0Tm9kZShzZWxmLnJvb3QpO1xyXG4gICAgICAgICAgICAgICAgc2VsZi5yb290LnJlbW92ZSgpO1xyXG4gICAgICAgICAgICAgICAgYnJlYWs7XHJcbiAgICAgICAgICAgIGNhc2UgXCJ1cGRhdGVcIjpcclxuICAgICAgICAgICAgICAgIHNlbGYudXBkYXRlQ3NzKCk7XHJcbiAgICAgICAgICAgICAgICBicmVhaztcclxuICAgICAgICAgICAgY2FzZSBcInNhdmVcIjpcclxuICAgICAgICAgICAgICAgIHNlbGYuc2F2ZUNzcygpO1xyXG4gICAgICAgICAgICAgICAgYnJlYWs7XHJcbiAgICAgICAgfVxyXG4gICAgfVxyXG5cclxuICAgIHVwZGF0ZUNzcygpIHtcclxuICAgICAgICBET00ucmVtb3ZlU3R5bGUoXCJjdXN0b21jc3NcIik7XHJcbiAgICAgICAgRE9NLmFkZFN0eWxlKFwiY3VzdG9tY3NzXCIsIHRoaXMuZWRpdG9yLnNlc3Npb24uZ2V0VmFsdWUoKSk7XHJcbiAgICB9XHJcblxyXG4gICAgc2F2ZUNzcygpIHtcclxuICAgICAgICBEYXRhU3RvcmUuc2V0QkREYXRhKFwiYmRjdXN0b21jc3NcIiwgYnRvYSh0aGlzLmVkaXRvci5zZXNzaW9uLmdldFZhbHVlKCkpKTtcclxuICAgIH1cclxufSIsImltcG9ydCBCRFYyIGZyb20gXCIuLi9tb2R1bGVzL3YyXCI7XHJcblxyXG5leHBvcnQgZGVmYXVsdCBjbGFzcyBCREVycm9yQm91bmRhcnkgZXh0ZW5kcyBCRFYyLnJlYWN0Q29tcG9uZW50IHtcclxuICAgIGNvbnN0cnVjdG9yKHByb3BzKSB7XHJcbiAgICAgIHN1cGVyKHByb3BzKTtcclxuICAgICAgdGhpcy5zdGF0ZSA9IHtoYXNFcnJvcjogZmFsc2V9O1xyXG4gICAgfVxyXG5cclxuICAgIGNvbXBvbmVudERpZENhdGNoKCkge1xyXG4gICAgICB0aGlzLnNldFN0YXRlKHtoYXNFcnJvcjogdHJ1ZX0pO1xyXG4gICAgfVxyXG5cclxuICAgIHJlbmRlcigpIHtcclxuICAgICAgaWYgKHRoaXMuc3RhdGUuaGFzRXJyb3IpIHJldHVybiBCRFYyLnJlYWN0LmNyZWF0ZUVsZW1lbnQoXCJkaXZcIiwge2NsYXNzTmFtZTogXCJyZWFjdC1lcnJvclwifSwgXCJDb21wb25lbnQgRXJyb3JcIik7ICBcclxuICAgICAgcmV0dXJuIHRoaXMucHJvcHMuY2hpbGRyZW47IFxyXG4gICAgfVxyXG59XHJcblxyXG5jb25zdCBvcmlnaW5hbFJlbmRlciA9IEJERXJyb3JCb3VuZGFyeS5wcm90b3R5cGUucmVuZGVyO1xyXG5PYmplY3QuZGVmaW5lUHJvcGVydHkoQkRFcnJvckJvdW5kYXJ5LnByb3RvdHlwZSwgXCJyZW5kZXJcIiwge1xyXG4gICAgZW51bWVyYWJsZTogZmFsc2UsXHJcbiAgICBjb25maWd1cmFibGU6IGZhbHNlLFxyXG4gICAgc2V0OiBmdW5jdGlvbigpIHtjb25zb2xlLndhcm4oXCJBZGRvbiBwb2xpY3kgZm9yIHBsdWdpbnMgIzUgaHR0cHM6Ly9naXRodWIuY29tL3JhdWVuemkvQmV0dGVyRGlzY29yZEFwcC93aWtpL0FkZG9uLVBvbGljaWVzI3BsdWdpbnNcIik7fSxcclxuICAgIGdldDogKCkgPT4gb3JpZ2luYWxSZW5kZXJcclxufSk7ICIsImltcG9ydCBCRFYyIGZyb20gXCIuLi8uLi9tb2R1bGVzL3YyXCI7XHJcblxyXG5jb25zdCBSZWFjdCA9IEJEVjIuUmVhY3Q7XHJcblxyXG5leHBvcnQgZGVmYXVsdCBjbGFzcyBEZWxldGUgZXh0ZW5kcyBSZWFjdC5Db21wb25lbnQge1xyXG4gICAgcmVuZGVyKCkge1xyXG4gICAgICAgIGNvbnN0IHNpemUgPSB0aGlzLnByb3BzLnNpemUgfHwgXCIyNHB4XCI7XHJcbiAgICAgICAgcmV0dXJuIDxzdmcgY2xhc3NOYW1lPXt0aGlzLnByb3BzLmNsYXNzTmFtZSB8fCBcIlwifSBmaWxsPVwiI0ZGRkZGRlwiIHZpZXdCb3g9XCIwIDAgMjQgMjRcIiBzdHlsZT17e3dpZHRoOiBzaXplLCBoZWlnaHQ6IHNpemV9fSBvbkNsaWNrPXt0aGlzLnByb3BzLm9uQ2xpY2t9PlxyXG4gICAgICAgICAgICAgICAgICAgIDxwYXRoIGZpbGw9XCJub25lXCIgZD1cIk0wIDBoMjR2MjRIMFYwelwiLz48cGF0aCBkPVwiTTYgMTljMCAxLjEuOSAyIDIgMmg4YzEuMSAwIDItLjkgMi0yVjdINnYxMnptMi40Ni03LjEybDEuNDEtMS40MUwxMiAxMi41OWwyLjEyLTIuMTIgMS40MSAxLjQxTDEzLjQxIDE0bDIuMTIgMi4xMi0xLjQxIDEuNDFMMTIgMTUuNDFsLTIuMTIgMi4xMi0xLjQxLTEuNDFMMTAuNTkgMTRsLTIuMTMtMi4xMnpNMTUuNSA0bC0xLTFoLTVsLTEgMUg1djJoMTRWNHpcIi8+XHJcbiAgICAgICAgICAgICAgICAgICAgPHBhdGggZmlsbD1cIm5vbmVcIiBkPVwiTTAgMGgyNHYyNEgwelwiLz5cclxuICAgICAgICAgICAgICAgIDwvc3ZnPjtcclxuICAgIH1cclxufSIsImltcG9ydCBCRFYyIGZyb20gXCIuLi8uLi9tb2R1bGVzL3YyXCI7XHJcblxyXG5jb25zdCBSZWFjdCA9IEJEVjIuUmVhY3Q7XHJcblxyXG5leHBvcnQgZGVmYXVsdCBjbGFzcyBEb3duQXJyb3cgZXh0ZW5kcyBSZWFjdC5Db21wb25lbnQge1xyXG4gICAgcmVuZGVyKCkge1xyXG4gICAgICAgIGNvbnN0IHNpemUgPSB0aGlzLnByb3BzLnNpemUgfHwgXCIxNnB4XCI7XHJcbiAgICAgICAgcmV0dXJuIDxzdmcgY2xhc3NOYW1lPXt0aGlzLnByb3BzLmNsYXNzTmFtZSB8fCBcIlwifSBmaWxsPVwiI0ZGRkZGRlwiIHZpZXdCb3g9XCIwIDAgMjQgMjRcIiBzdHlsZT17e3dpZHRoOiBzaXplLCBoZWlnaHQ6IHNpemV9fT5cclxuICAgICAgICAgICAgICAgICAgICA8cGF0aCBkPVwiTTguMTIgOS4yOUwxMiAxMy4xN2wzLjg4LTMuODhjLjM5LS4zOSAxLjAyLS4zOSAxLjQxIDAgLjM5LjM5LjM5IDEuMDIgMCAxLjQxbC00LjU5IDQuNTljLS4zOS4zOS0xLjAyLjM5LTEuNDEgMEw2LjcgMTAuN2MtLjM5LS4zOS0uMzktMS4wMiAwLTEuNDEuMzktLjM4IDEuMDMtLjM5IDEuNDIgMHpcIi8+XHJcbiAgICAgICAgICAgICAgICA8L3N2Zz47XHJcbiAgICB9XHJcbn0iLCJpbXBvcnQgQkRWMiBmcm9tIFwiLi4vLi4vbW9kdWxlcy92MlwiO1xyXG5cclxuY29uc3QgUmVhY3QgPSBCRFYyLlJlYWN0O1xyXG5cclxuZXhwb3J0IGRlZmF1bHQgY2xhc3MgRWRpdCBleHRlbmRzIFJlYWN0LkNvbXBvbmVudCB7XHJcbiAgICByZW5kZXIoKSB7XHJcbiAgICAgICAgY29uc3Qgc2l6ZSA9IHRoaXMucHJvcHMuc2l6ZSB8fCBcIjI0cHhcIjtcclxuICAgICAgICByZXR1cm4gPHN2ZyBjbGFzc05hbWU9e3RoaXMucHJvcHMuY2xhc3NOYW1lIHx8IFwiXCJ9IHZpZXdCb3g9XCIwIDAgMjQgMjRcIiBmaWxsPVwiI0ZGRkZGRlwiIHN0eWxlPXt7d2lkdGg6IHNpemUsIGhlaWdodDogc2l6ZX19IG9uQ2xpY2s9e3RoaXMucHJvcHMub25DbGlja30+XHJcbiAgICAgICAgICAgICAgICA8cGF0aCBkPVwiTTMgMTcuMjVWMjFoMy43NUwxNy44MSA5Ljk0bC0zLjc1LTMuNzVMMyAxNy4yNXpNMjAuNzEgNy4wNGMuMzktLjM5LjM5LTEuMDIgMC0xLjQxbC0yLjM0LTIuMzRjLS4zOS0uMzktMS4wMi0uMzktMS40MSAwbC0xLjgzIDEuODMgMy43NSAzLjc1IDEuODMtMS44M3pcIiAvPlxyXG4gICAgICAgICAgICAgICAgPHBhdGggZD1cIk0wIDBoMjR2MjRIMHpcIiBmaWxsPVwibm9uZVwiIC8+XHJcbiAgICAgICAgICAgICAgIDwvc3ZnPjtcclxuICAgIH1cclxufSIsInsvKiA8c3ZnIHhtbG5zPVwiaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmdcIiB2aWV3Qm94PVwiMCAwIDI0IDI0XCIgZmlsbD1cIndoaXRlXCIgd2lkdGg9XCIxOHB4XCIgaGVpZ2h0PVwiMThweFwiPlxyXG4gICAgPHBhdGggZD1cIk0wIDBoMjR2MjRIMHpcIiBmaWxsPVwibm9uZVwiLz5cclxuICAgIDxwYXRoIGQ9XCJNMTMgM2MtNC45NyAwLTkgNC4wMy05IDlIMWwzLjg5IDMuODkuMDcuMTRMOSAxMkg2YzAtMy44NyAzLjEzLTcgNy03czcgMy4xMyA3IDctMy4xMyA3LTcgN2MtMS45MyAwLTMuNjgtLjc5LTQuOTQtMi4wNmwtMS40MiAxLjQyQzguMjcgMTkuOTkgMTAuNTEgMjEgMTMgMjFjNC45NyAwIDktNC4wMyA5LTlzLTQuMDMtOS05LTl6bS0xIDV2NWw0LjI4IDIuNTQuNzItMS4yMS0zLjUtMi4wOFY4SDEyelwiLz5cclxuPC9zdmc+ICovfVxyXG5cclxuaW1wb3J0IEJEVjIgZnJvbSBcIi4uLy4uL21vZHVsZXMvdjJcIjtcclxuXHJcbmNvbnN0IFJlYWN0ID0gQkRWMi5SZWFjdDtcclxuXHJcbmV4cG9ydCBkZWZhdWx0IGNsYXNzIEhpc3RvcnkgZXh0ZW5kcyBSZWFjdC5Db21wb25lbnQge1xyXG4gICAgcmVuZGVyKCkge1xyXG4gICAgICAgIGNvbnN0IHNpemUgPSB0aGlzLnByb3BzLnNpemUgfHwgXCIxOHB4XCI7XHJcbiAgICAgICAgcmV0dXJuIDxzdmcgdmlld0JveD1cIjAgMCAyNCAyNFwiIGZpbGw9XCIjRkZGRkZGXCIgY2xhc3NOYW1lPXt0aGlzLnByb3BzLmNsYXNzTmFtZSB8fCBcIlwifSBzdHlsZT17e3dpZHRoOiBzaXplLCBoZWlnaHQ6IHNpemV9fSBvbkNsaWNrPXt0aGlzLnByb3BzLm9uQ2xpY2t9PlxyXG4gICAgICAgICAgICAgICAgPHBhdGggZD1cIk0wIDBoMjR2MjRIMHpcIiBmaWxsPVwibm9uZVwiLz5cclxuICAgICAgICAgICAgICAgIDxwYXRoIGQ9XCJNMTMgM2MtNC45NyAwLTkgNC4wMy05IDlIMWwzLjg5IDMuODkuMDcuMTRMOSAxMkg2YzAtMy44NyAzLjEzLTcgNy03czcgMy4xMyA3IDctMy4xMyA3LTcgN2MtMS45MyAwLTMuNjgtLjc5LTQuOTQtMi4wNmwtMS40MiAxLjQyQzguMjcgMTkuOTkgMTAuNTEgMjEgMTMgMjFjNC45NyAwIDktNC4wMyA5LTlzLTQuMDMtOS05LTl6bS0xIDV2NWw0LjI4IDIuNTQuNzItMS4yMS0zLjUtMi4wOFY4SDEyelwiLz5cclxuICAgICAgICAgICAgICAgPC9zdmc+O1xyXG4gICAgfVxyXG59IiwiaW1wb3J0IEJEVjIgZnJvbSBcIi4uLy4uL21vZHVsZXMvdjJcIjtcclxuXHJcbmNvbnN0IFJlYWN0ID0gQkRWMi5SZWFjdDtcclxuXHJcbmV4cG9ydCBkZWZhdWx0IGNsYXNzIFNlYXJjaCBleHRlbmRzIFJlYWN0LkNvbXBvbmVudCB7XHJcbiAgICByZW5kZXIoKSB7XHJcbiAgICAgICAgY29uc3Qgc2l6ZSA9IHRoaXMucHJvcHMuc2l6ZSB8fCBcIjE2cHhcIjtcclxuICAgICAgICByZXR1cm4gPHN2ZyBjbGFzc05hbWU9e3RoaXMucHJvcHMuY2xhc3NOYW1lIHx8IFwiXCJ9IGZpbGw9XCIjRkZGRkZGXCIgdmlld0JveD1cIjAgMCAyNCAyNFwiIHN0eWxlPXt7d2lkdGg6IHNpemUsIGhlaWdodDogc2l6ZX19PlxyXG4gICAgICAgICAgICAgICAgICAgIDxwYXRoIGZpbGw9XCJub25lXCIgZD1cIk0wIDBoMjR2MjRIMFYwelwiLz5cclxuICAgICAgICAgICAgICAgICAgICA8cGF0aCBkPVwiTTE1LjUgMTRoLS43OWwtLjI4LS4yN0MxNS40MSAxMi41OSAxNiAxMS4xMSAxNiA5LjUgMTYgNS45MSAxMy4wOSAzIDkuNSAzUzMgNS45MSAzIDkuNSA1LjkxIDE2IDkuNSAxNmMxLjYxIDAgMy4wOS0uNTkgNC4yMy0xLjU3bC4yNy4yOHYuNzlsNSA0Ljk5TDIwLjQ5IDE5bC00Ljk5LTV6bS02IDBDNy4wMSAxNCA1IDExLjk5IDUgOS41UzcuMDEgNSA5LjUgNSAxNCA3LjAxIDE0IDkuNSAxMS45OSAxNCA5LjUgMTR6XCIvPlxyXG4gICAgICAgICAgICAgICAgPC9zdmc+O1xyXG4gICAgfVxyXG59IiwibGV0IG1hcmdpbk1vZHVsZSA9IEJETW9kdWxlcy5nZXQoZSA9PiBlLm1hcmdpblRvcDYwKVswXVxyXG5cclxuZXhwb3J0IGRlZmF1bHQgY2xhc3MgTWFyZ2luVG9wIGV4dGVuZHMgUmVhY3QuQ29tcG9uZW50IHtcclxuICAgIHJlbmRlcigpe1xyXG4gICAgICAgIGlmKCFtYXJnaW5Nb2R1bGUpbWFyZ2luTW9kdWxlID0gQkRNb2R1bGVzLmdldChlID0+IGUubWFyZ2luVG9wNjApWzBdXHJcbiAgICAgICAgcmV0dXJuIDxkaXYgY2xhc3NOYW1lPXttYXJnaW5Nb2R1bGUubWFyZ2luVG9wNjB9PjwvZGl2PlxyXG4gICAgfVxyXG59IiwiLyoqXHJcbiAqIEhvdyB0aGUgZnVjayBkaWQgSSBkbyB0aGlzXHJcbiAqL1xyXG5cclxuaW1wb3J0IEJEVjIgZnJvbSBcIi4uL21vZHVsZXMvdjJcIjtcclxuaW1wb3J0IFYyQ19TZXR0aW5nc1RpdGxlIGZyb20gXCIuL3NldHRpbmdzVGl0bGVcIjtcclxuaW1wb3J0IFYyQ19TZXR0aW5nc0dyb3VwIGZyb20gXCIuL3NldHRpbmdzR3JvdXBcIjtcclxuaW1wb3J0IGRhdGFTdG9yZSBmcm9tIFwiLi4vbW9kdWxlcy9kYXRhU3RvcmVcIjtcclxuaW1wb3J0IHsgZGVmYXVsdFJQQywgc2V0dGluZ3NSUEMgfSBmcm9tIFwiLi4vMGdsb2JhbHNcIjtcclxuaW1wb3J0IEN1c3RvbVJpY2hQcmVzZW5jZSBmcm9tIFwiLi4vbW9kdWxlcy9DdXN0b21SaWNoUHJlc2VuY2VcIlxyXG5pbXBvcnQgdGltZXN0YW1wUmVuZGVyIGZyb20gXCIuL3RpbWVzdGFtcFJlbmRlclwiXHJcbmltcG9ydCB7IHJlbW90ZSB9IGZyb20gXCJlbGVjdHJvblwiO1xyXG5pbXBvcnQgTWFyZ2luVG9wIGZyb20gXCIuL21hcmdpbnRvcFwiO1xyXG5cclxuXHJcbmNvbnN0IFJlYWN0ID0gQkRWMi5SZWFjdDtcclxuXHJcbmxldCBWMkNfUHJlc2VuY2VTZXR0aW5nc01vZHVsZXNcclxuZXhwb3J0IGRlZmF1bHQgY2xhc3MgVjJDX1ByZXNlbmNlU2V0dGluZ3MgZXh0ZW5kcyBSZWFjdC5Db21wb25lbnQge1xyXG4gICAgY29uc3RydWN0b3IocHJvcHMpIHtcclxuICAgICAgICBzdXBlcihwcm9wcyk7XHJcblxyXG4gICAgICAgIHRoaXMuc3RhdGUgPSB7XHJcbiAgICAgICAgICAgIGRhdGE6IGRhdGFTdG9yZS5nZXRTZXR0aW5nR3JvdXAoXCJycGNcIikgfHwgZGVmYXVsdFJQQyxcclxuICAgICAgICAgICAgYXNzZXRzOiBbXVxyXG4gICAgICAgIH1cclxuXHJcbiAgICAgICAgdGhpcy5wcmV2aWV3ID0gbnVsbFxyXG4gICAgICAgIHRoaXMuaXNmZXRjaGluZyA9IGZhbHNlXHJcbiAgICAgICAgaWYodGhpcy5zdGF0ZS5kYXRhLmFwcGxpY2F0aW9uX2lkKXtcclxuICAgICAgICAgICAgdGhpcy5mZXRjaEFzc2V0cygpXHJcbiAgICAgICAgfVxyXG5cclxuICAgICAgICB0aGlzLmFzc2V0Q29tcG9uZW50cyA9IG5ldyBTZXQoKVxyXG4gICAgfVxyXG5cclxuICAgIHVwZGF0ZVdoZW5GZXRjaGVkKGNvbXApe1xyXG4gICAgICAgIHRoaXMuYXNzZXRDb21wb25lbnRzLmFkZChjb21wKVxyXG4gICAgfVxyXG5cclxuICAgIC8qKlxyXG4gICAgICogXHJcbiAgICAgKiBAcGFyYW0ge0lucHV0VGV4dH0gc2V0dGluZyBcclxuICAgICAqL1xyXG4gICAgb25DaGFuZ2Uoc2V0dGluZywgdmFsdWUpe1xyXG4gICAgICAgIGxldCBkZWZhdWx0U2V0dGluZyA9IFJQQ1Byb3BzLmZpbmQoZSA9PiBlLmlkID09PSBzZXR0aW5nLnByb3BzLmlkKVxyXG5cclxuICAgICAgICB0aGlzLnNldFN0YXRlKHtcclxuICAgICAgICAgICAgZGF0YTogT2JqZWN0LmFzc2lnbihzZXR0aW5nc1JQQywgdGhpcy5zdGF0ZS5kYXRhLCB7XHJcbiAgICAgICAgICAgICAgICBbZGVmYXVsdFNldHRpbmcuaWRdOiAhIXZhbHVlID8gdmFsdWUgOiBudWxsXHJcbiAgICAgICAgICAgIH0pLFxyXG4gICAgICAgICAgICBhc3NldHM6IHRoaXMuc3RhdGUuYXNzZXRzXHJcbiAgICAgICAgfSlcclxuICAgICAgICBpZihzZXR0aW5nLnByb3BzLmlkID09PSBcImFwcGxpY2F0aW9uX2lkXCIpe1xyXG4gICAgICAgICAgICB0aGlzLmZldGNoQXNzZXRzKClcclxuICAgICAgICB9XHJcblxyXG4gICAgICAgIGRhdGFTdG9yZS5zZXRTZXR0aW5nR3JvdXAoXCJycGNcIiwgc2V0dGluZ3NSUEMpO1xyXG4gICAgICAgIHRoaXMucHJldmlldy5mb3JjZVVwZGF0ZSgpXHJcbiAgICAgICAgQ3VzdG9tUmljaFByZXNlbmNlLnNldChzZXR0aW5nc1JQQylcclxuICAgIH1cclxuXHJcbiAgICBmZXRjaEFzc2V0cygpe1xyXG4gICAgICAgIGlmKHRoaXMuaXNmZXRjaGluZyA9PT0gdHJ1ZSl7XHJcbiAgICAgICAgICAgIGxldCBhcHAgPSB0aGlzLnN0YXRlLmRhdGEuYXBwbGljYXRpb25faWRcclxuICAgICAgICAgICAgc2V0VGltZW91dCgoKSA9PiB7XHJcbiAgICAgICAgICAgICAgICBpZih0aGlzLnN0YXRlLmRhdGEuYXBwbGljYXRpb25faWQgIT09IGFwcCl7XHJcbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuXHJcbiAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgICB0aGlzLmZldGNoQXNzZXRzKClcclxuICAgICAgICAgICAgfSwgNTAwMCk7XHJcbiAgICAgICAgfVxyXG4gICAgICAgIGlmKCF0aGlzLnN0YXRlLmRhdGEuYXBwbGljYXRpb25faWQpe1xyXG4gICAgICAgICAgICB0aGlzLnNldFN0YXRlKHtcclxuICAgICAgICAgICAgICAgIGRhdGE6IHRoaXMuc3RhdGUuZGF0YSxcclxuICAgICAgICAgICAgICAgIGFzc2V0czogW11cclxuICAgICAgICAgICAgfSlcclxuICAgICAgICAgICAgdGhpcy5mb3JjZVVwZGF0ZSgpXHJcbiAgICAgICAgICAgIHRoaXMuYXNzZXRDb21wb25lbnRzLmZvckVhY2goZSA9PiBlLmZvcmNlVXBkYXRlKCkpXHJcbiAgICAgICAgICAgIHJldHVyblxyXG4gICAgICAgIH1cclxuICAgICAgICB0aGlzLmlzZmV0Y2hpbmcgPSB0cnVlXHJcbiAgICAgICAgQ3VzdG9tUmljaFByZXNlbmNlLmZldGNoQXNzZXRzKHRoaXMuc3RhdGUuZGF0YS5hcHBsaWNhdGlvbl9pZClcclxuICAgICAgICAudGhlbihhc3NldHMgPT4ge1xyXG4gICAgICAgICAgICB0aGlzLmlzZmV0Y2hpbmcgPSBmYWxzZVxyXG4gICAgICAgICAgICB0aGlzLnNldFN0YXRlKHtcclxuICAgICAgICAgICAgICAgIGRhdGE6IHRoaXMuc3RhdGUuZGF0YSxcclxuICAgICAgICAgICAgICAgIGFzc2V0czogT2JqZWN0LmtleXMoYXNzZXRzKS5tYXAoayA9PiB7XHJcbiAgICAgICAgICAgICAgICAgICAgbGV0IGFzc2V0ID0gYXNzZXRzW2tdXHJcbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgaWQ6IGFzc2V0LmlkLFxyXG4gICAgICAgICAgICAgICAgICAgICAgICBuYW1lOiBhc3NldC5uYW1lLFxyXG4gICAgICAgICAgICAgICAgICAgICAgICB0eXBlOiBhc3NldC50eXBlXHJcbiAgICAgICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgICAgfSlcclxuICAgICAgICAgICAgfSlcclxuICAgICAgICAgICAgdGhpcy5mb3JjZVVwZGF0ZSgpXHJcbiAgICAgICAgICAgIHRoaXMuYXNzZXRDb21wb25lbnRzLmZvckVhY2goZSA9PiBlLmZvcmNlVXBkYXRlKCkpXHJcbiAgICAgICAgfSkuY2F0Y2goKCkgPT4ge1xyXG4gICAgICAgICAgICB0aGlzLmlzZmV0Y2hpbmcgPSBmYWxzZVxyXG4gICAgICAgICAgICB0aGlzLnNldFN0YXRlKHtcclxuICAgICAgICAgICAgICAgIGRhdGE6IHRoaXMuc3RhdGUuZGF0YSxcclxuICAgICAgICAgICAgICAgIGFzc2V0czogW11cclxuICAgICAgICAgICAgfSlcclxuICAgICAgICAgICAgdGhpcy5mb3JjZVVwZGF0ZSgpXHJcbiAgICAgICAgICAgIHRoaXMuYXNzZXRDb21wb25lbnRzLmZvckVhY2goZSA9PiBlLmZvcmNlVXBkYXRlKCkpXHJcbiAgICAgICAgfSlcclxuICAgIH1cclxuXHJcbiAgICB1cGRhdGVQcmV2aWV3KGRhdGEpe1xyXG4gICAgICAgIHRoaXMuc2V0U3RhdGUoe1xyXG4gICAgICAgICAgICBkYXRhXHJcbiAgICAgICAgfSlcclxuICAgIH1cclxuXHJcbiAgICBnZXQgbW9kdWxlcygpe1xyXG4gICAgICAgIHJldHVybiBWMkNfUHJlc2VuY2VTZXR0aW5nc01vZHVsZXMgfHwgKFYyQ19QcmVzZW5jZVNldHRpbmdzTW9kdWxlcyA9IFtcclxuICAgICAgICAgICAgQkRNb2R1bGVzLmdldChlID0+IGUubWFyZ2luQm90dG9tMjApWzBdXHJcbiAgICAgICAgXSlcclxuICAgIH1cclxuXHJcbiAgICByZW5kZXIoKSB7XHJcbiAgICAgICAgY29uc29sZS5sb2coXCJSZXJlbmRlcmluZyBycGMgbWFuYWdlclwiKVxyXG4gICAgICAgIGxldCBbXHJcbiAgICAgICAgICAgIG1hcmdpbk1vZHVsZVxyXG4gICAgICAgIF0gPSB0aGlzLm1vZHVsZXNcclxuICAgICAgICByZXR1cm4gW1xyXG4gICAgICAgICAgICA8VjJDX1NldHRpbmdzR3JvdXAgdGl0bGU9XCJSaWNoUHJlc2VuY2UgU2V0dGluZ3NcIiBzZXR0aW5ncz17dGhpcy5wcm9wcy5zZXR0aW5nc30gb25DaGFuZ2U9e3RoaXMucHJvcHMub25DaGFuZ2V9Lz4sXHJcbiAgICAgICAgICAgIDxNYXJnaW5Ub3AgLz4sXHJcbiAgICAgICAgICAgIDxWMkNfU2V0dGluZ3NUaXRsZSB0ZXh0PVwiUmljaFByZXNlbmNlXCIvPixcclxuICAgICAgICAgICAgPGRpdj5cclxuICAgICAgICAgICAgICAgIHsvKiogb3B0aW9ucyAqL31cclxuICAgICAgICAgICAgICAgIHt0aGlzLm9wdGlvbnNDb21wb25lbnRzfVxyXG4gICAgICAgICAgICA8L2Rpdj4sXHJcbiAgICAgICAgICAgIDxkaXY+XHJcbiAgICAgICAgICAgICAgICA8TWFyZ2luVG9wIC8+XHJcbiAgICAgICAgICAgICAgICA8VjJDX1NldHRpbmdzVGl0bGUgdGV4dD1cIlByZXZpZXdcIi8+XHJcbiAgICAgICAgICAgICAgICB7LyoqIHByZXZpZXcgKi99XHJcbiAgICAgICAgICAgICAgICA8UnBjUHJldmlldyBzZXR0aW5ncz17dGhpc30vPlxyXG4gICAgICAgICAgICA8L2Rpdj4sXHJcbiAgICAgICAgICAgIDxkaXYgY2xhc3NOYW1lPXttYXJnaW5Nb2R1bGUubWFyZ2luQm90dG9tMjB9PjwvZGl2PixcclxuICAgICAgICAgICAgPGJ1dHRvbiBzdHlsZT17e29wYWNpdHk6IDAuMDF9fSBvbkNsaWNrPXt3aW5kb3cub2hnb2RvaGZ1Y2t9PlxyXG4gICAgICAgICAgICAgICAgT2ggZ29kIE9oIGZ1Y2tcclxuICAgICAgICAgICAgPC9idXR0b24+LFxyXG4gICAgICAgICAgICA8YnV0dG9uIHN0eWxlPXt7b3BhY2l0eTogMC4wMX19IG9uQ2xpY2s9eygpID0+IHtcclxuICAgICAgICAgICAgICAgIHJlbW90ZS5zaGVsbC5vcGVuRXh0ZXJuYWwoXCJodHRwczovL3d3dy55b3V0dWJlLmNvbS93YXRjaD92PUxrWWE3cnBzX2c0XCIpXHJcbiAgICAgICAgICAgIH19PlxyXG4gICAgICAgICAgICAgICAgU2VlID8gSSBwdWxsZWQgYSBsaXRsZSBzbmVha3kgb24geWFcclxuICAgICAgICAgICAgPC9idXR0b24+XHJcbiAgICAgICAgXVxyXG4gICAgfVxyXG5cclxuICAgIGdldCBvcHRpb25zQ29tcG9uZW50cygpe1xyXG4gICAgICAgIHJldHVybiB0aGlzLl9vcHRpb25zQ29tcG9uZW50cyB8fCAodGhpcy5fb3B0aW9uc0NvbXBvbmVudHMgPSBSUENQcm9wcy5tYXAoZSA9PiB7XHJcbiAgICAgICAgICAgIGlmKGUudHlwZSA9PT0gXCJ0ZXh0XCIpe1xyXG4gICAgICAgICAgICAgICAgcmV0dXJuIDxJbnB1dFRleHQgc2V0dGluZz17ZX0gbWFuYWdlcj17dGhpc30gaWQ9e2UuaWR9Lz5cclxuICAgICAgICAgICAgfWVsc2UgaWYoZS50eXBlID09PSBcIm51bWJlclwiKXtcclxuICAgICAgICAgICAgICAgIGxldCBhcnJheSA9IFs8SW5wdXROdW1iZXIgc2V0dGluZz17ZX0gbWFuYWdlcj17dGhpc30gaWQ9e2UuaWR9Lz5dLypcclxuICAgICAgICAgICAgICAgIGlmKGUuaWQgPT09IFwidGltZXN0YW1wcy5zdGFydFwiKXtcclxuICAgICAgICAgICAgICAgICAgICBhcnJheS51bnNoaWZ0KDxEaXNjb3JkQnV0dG9uIHRpdGxlPVwiQ29weSBDdXJyZW50IFRpbWVzdGFtcFwiIG9uQ2xpY2s9eygpID0+IHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgRGlzY29yZE5hdGl2ZS5jbGlwYm9hcmQuY29weShEYXRlLm5vdygpK1wiXCIpXHJcbiAgICAgICAgICAgICAgICAgICAgfX0gLz4pXHJcbiAgICAgICAgICAgICAgICB9Ki9cclxuICAgICAgICAgICAgICAgIHJldHVybiBhcnJheVxyXG4gICAgICAgICAgICB9ZWxzZSBpZihlLnR5cGUgPT09IFwiY2hvaWNlXCIpe1xyXG4gICAgICAgICAgICAgICAgaWYoW1wiYXNzZXRzLnNtYWxsXCIsIFwiYXNzZXRzLmxhcmdlXCJdLmluY2x1ZGVzKGUuaWQpKXtcclxuICAgICAgICAgICAgICAgICAgICByZXR1cm4gPElucHV0Q2hvaWNlIHNldHRpbmc9e2V9IG1hbmFnZXI9e3RoaXN9IGlkPXtlLmlkfSBjaG9pY2VzPXtbe3ZhbHVlOiBcIm5vbmVcIiwgbGFiZWw6IFwiTm8gYXNzZXRzXCJ9XS5jb25jYXQodGhpcy5zdGF0ZS5hc3NldHMubWFwKGUgPT4ge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4ge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgdmFsdWU6IFwiYXNzZXQtXCIrZS5pZCxcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxhYmVsOiBlLm5hbWVcclxuICAgICAgICAgICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgICAgICAgIH0pKX0vPlxyXG4gICAgICAgICAgICAgICAgfWVsc2V7XHJcbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIFwiVW5rbm93biBjaG9pY2UuXCJcclxuICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgfVxyXG4gICAgICAgIH0pKVxyXG4gICAgfVxyXG59XHJcbmNvbnN0IFJQQ1Byb3BzID0gW1xyXG4gICAge1xyXG4gICAgICAgIHRpdGxlOiBcIkFwcGxpY2F0aW9uIElEXCIsXHJcbiAgICAgICAgaWQ6IFwiYXBwbGljYXRpb25faWRcIixcclxuICAgICAgICB0eXBlOiBcIm51bWJlclwiLFxyXG4gICAgICAgIHBsYWNlaG9sZGVyOiBcIjcxMTQxNjk1NzcxODc1NzQxOFwiXHJcbiAgICB9LFxyXG4gICAge1xyXG4gICAgICAgIHRpdGxlOiBcIk5hbWVcIixcclxuICAgICAgICBpZDogXCJuYW1lXCIsXHJcbiAgICAgICAgdHlwZTogXCJ0ZXh0XCIsXHJcbiAgICAgICAgcGxhY2Vob2xkZXI6IFwiTGlnaHRjb3JkXCJcclxuICAgIH0sXHJcbiAgICB7XHJcbiAgICAgICAgdGl0bGU6IFwiRGV0YWlsc1wiLFxyXG4gICAgICAgIGlkOiBcImRldGFpbHNcIixcclxuICAgICAgICB0eXBlOiBcInRleHRcIixcclxuICAgICAgICBwbGFjZWhvbGRlcjogXCJCcm93c2luZyBEaXNjb3JkXCJcclxuICAgIH0sXHJcbiAgICB7XHJcbiAgICAgICAgdGl0bGU6IFwiU3RhdGVcIixcclxuICAgICAgICBpZDogXCJzdGF0ZVwiLFxyXG4gICAgICAgIHR5cGU6IFwidGV4dFwiLFxyXG4gICAgICAgIHBsYWNlaG9sZGVyOiBcIkxpZ2h0Y29yZCBDbGllbnRcIlxyXG4gICAgfSxcclxuICAgIHtcclxuICAgICAgICB0aXRsZTogXCJUaW1lc3RhbXAgU3RhcnRcIixcclxuICAgICAgICBpZDogXCJ0aW1lc3RhbXBzLnN0YXJ0XCIsXHJcbiAgICAgICAgdHlwZTogXCJudW1iZXJcIixcclxuICAgICAgICBnZXQgcGxhY2Vob2xkZXIoKXtcclxuICAgICAgICAgICAgcmV0dXJuIERhdGUubm93KClcclxuICAgICAgICB9XHJcbiAgICB9LFxyXG4gICAge1xyXG4gICAgICAgIHRpdGxlOiBcIkxhcmdlQXNzZXRcIixcclxuICAgICAgICBpZDogXCJhc3NldHMubGFyZ2VcIixcclxuICAgICAgICB0eXBlOiBcImNob2ljZVwiXHJcbiAgICB9LFxyXG4gICAge1xyXG4gICAgICAgIHRpdGxlOiBcIlNtYWxsQXNzZXRcIixcclxuICAgICAgICBpZDogXCJhc3NldHMuc21hbGxcIixcclxuICAgICAgICB0eXBlOiBcImNob2ljZVwiXHJcbiAgICB9LFxyXG5dXHJcblxyXG5sZXQgaW5wdXRUZXh0TW9kdWxlc1xyXG5jbGFzcyBJbnB1dFRleHQgZXh0ZW5kcyBSZWFjdC5QdXJlQ29tcG9uZW50IHtcclxuICAgIGdldCBtb2R1bGVzKCl7XHJcbiAgICAgICAgaWYoaW5wdXRUZXh0TW9kdWxlcyAmJiBpbnB1dFRleHRNb2R1bGVzWzBdKXJldHVybiBpbnB1dFRleHRNb2R1bGVzXHJcbiAgICAgICAgcmV0dXJuIGlucHV0VGV4dE1vZHVsZXMgPSBbXHJcbiAgICAgICAgICAgIEJETW9kdWxlcy5nZXQoZSA9PiBlLnJlbW92ZUtleWJpbmQpWzBdLFxyXG4gICAgICAgICAgICBCRE1vZHVsZXMuZ2V0KGUgPT4gZS5tYXJnaW5Cb3R0b20yMClbMF0sXHJcbiAgICAgICAgICAgIEJETW9kdWxlcy5nZXQoZSA9PiBlLmRlZmF1bHRNYXJnaW5oNSlbMF0sXHJcbiAgICAgICAgICAgIEJETW9kdWxlcy5nZXQoZSA9PiBlLmNvbG9yU3RhbmRhcmQpWzBdLFxyXG4gICAgICAgICAgICBCRE1vZHVsZXMuZ2V0KGUgPT4gZS5zaXplMzIpWzBdLFxyXG4gICAgICAgICAgICBCRE1vZHVsZXMuZ2V0KGUgPT4gZS5faG9yaXpvbnRhbClbMF0sXHJcbiAgICAgICAgICAgIEJETW9kdWxlcy5nZXQoZSA9PiBlLmlucHV0TWluaSlbMF0sXHJcbiAgICAgICAgICAgIEJETW9kdWxlcy5nZXQoZSA9PiBlLnNpemUxNiAmJiBlLnNpemUyMClbMF0sXHJcbiAgICAgICAgXVxyXG4gICAgfVxyXG5cclxuICAgIGNvbnN0cnVjdG9yKHByb3BzKXtcclxuICAgICAgICBzdXBlcihwcm9wcylcclxuICAgICAgICBsZXQgc2V0dGluZyA9IHRoaXMucHJvcHMuc2V0dGluZ1xyXG4gICAgICAgIHRoaXMuc3RhdGUgPSB7XHJcbiAgICAgICAgICAgIGRhdGE6IHRoaXMucHJvcHMubWFuYWdlci5zdGF0ZS5kYXRhW3NldHRpbmcuaWRdXHJcbiAgICAgICAgfVxyXG5cclxuICAgICAgICB0aGlzLmlucHV0ID0gPHdpbmRvdy5MaWdodGNvcmQuQXBpLkNvbXBvbmVudHMuaW5wdXRzLlRleHRJbnB1dCBwbGFjZWhvbGRlcj17c2V0dGluZy5wbGFjZWhvbGRlcn0gbmFtZT17c2V0dGluZy5pZH0gdmFsdWU9e3RoaXMuc3RhdGUuZGF0YX0gb25DaGFuZ2U9eyh2YWx1ZSkgPT4ge1xyXG4gICAgICAgICAgICB0aGlzLnNldFN0YXRlKHtcclxuICAgICAgICAgICAgICAgIGRhdGE6IHZhbHVlXHJcbiAgICAgICAgICAgIH0pXHJcbiAgICAgICAgICAgIGlmKCF0aGlzLmxhc3RFZGl0ZWQgfHwgdGhpcy5sYXN0RWRpdGVkIDwgRGF0ZS5ub3coKSAtIDUwMCl7XHJcbiAgICAgICAgICAgICAgICB0aGlzLnByb3BzLm1hbmFnZXIub25DaGFuZ2UodGhpcywgdmFsdWUpXHJcbiAgICAgICAgICAgICAgICB0aGlzLmxhc3RFZGl0ZWQgPSBEYXRlLm5vdygpXHJcbiAgICAgICAgICAgIH1lbHNlIGlmKCF0aGlzLmlzVGltaW5nKXtcclxuICAgICAgICAgICAgICAgIHRoaXMuaXNUaW1pbmcgPSBzZXRUaW1lb3V0KCgpID0+IHtcclxuICAgICAgICAgICAgICAgICAgICB0aGlzLnByb3BzLm1hbmFnZXIub25DaGFuZ2UodGhpcywgdGhpcy5zdGF0ZS5kYXRhKVxyXG4gICAgICAgICAgICAgICAgICAgIHRoaXMuaXNUaW1pbmcgPSBudWxsXHJcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5sYXN0RWRpdGVkID0gRGF0ZS5ub3coKVxyXG4gICAgICAgICAgICAgICAgfSwgNTAwKTtcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgIH19IHR5cGU9XCJ0ZXh0XCIvPlxyXG4gICAgfVxyXG5cclxuICAgIHJlbmRlcigpe1xyXG4gICAgICAgIGxldCBzZXR0aW5nID0gdGhpcy5wcm9wcy5zZXR0aW5nXHJcblxyXG4gICAgICAgIGxldCBbXHJcbiAgICAgICAgICAgIHJvd01vZHVsZSxcclxuICAgICAgICAgICAgbWFyZ2luTW9kdWxlLFxyXG4gICAgICAgICAgICBtYXJnaW5Nb2R1bGUyLFxyXG4gICAgICAgICAgICBjb2xvck1vZHVsZSxcclxuICAgICAgICAgICAgc2l6ZU1vZHVsZSxcclxuICAgICAgICAgICAgZmxleE1vZHVsZSxcclxuICAgICAgICAgICAgaW5wdXRNb2R1bGUsXHJcbiAgICAgICAgICAgIHNpemVNb2R1bGUyLFxyXG4gICAgICAgIF0gPSB0aGlzLm1vZHVsZXNcclxuXHJcbiAgICAgICAgcmV0dXJuICg8ZGl2IGNsYXNzTmFtZT17cm93TW9kdWxlLnJvdytcIiBcIittYXJnaW5Nb2R1bGUubWFyZ2luQm90dG9tMjB9PlxyXG4gICAgICAgICAgICA8ZGl2IGNsYXNzTmFtZT17YCR7cm93TW9kdWxlLml0ZW19ICR7ZmxleE1vZHVsZS5mbGV4Q2hpbGR9YH0+XHJcbiAgICAgICAgICAgICAgICA8aDUgY2xhc3NOYW1lPXtjb2xvck1vZHVsZS5jb2xvclN0YW5kYXJkK1wiIFwiK3NpemVNb2R1bGUuc2l6ZTE0K1wiIFwiK21hcmdpbk1vZHVsZTIuaDUrXCIgXCIrbWFyZ2luTW9kdWxlMi5kZWZhdWx0TWFyZ2luaDV9PlxyXG4gICAgICAgICAgICAgICAgICAgIHtzZXR0aW5nLnRpdGxlfVxyXG4gICAgICAgICAgICAgICAgPC9oNT5cclxuICAgICAgICAgICAgICAgIHt0aGlzLmlucHV0fVxyXG4gICAgICAgICAgICA8L2Rpdj5cclxuICAgICAgICAgICAgPERpdmlkZXIvPlxyXG4gICAgICAgIDwvZGl2PilcclxuICAgIH1cclxufVxyXG5cclxubGV0IElucHV0TnVtYmVyTW9kdWxlc1xyXG5jbGFzcyBJbnB1dE51bWJlciBleHRlbmRzIFJlYWN0LlB1cmVDb21wb25lbnQge1xyXG4gICAgZ2V0IG1vZHVsZXMoKXtcclxuICAgICAgICByZXR1cm4gSW5wdXROdW1iZXJNb2R1bGVzIHx8IChJbnB1dE51bWJlck1vZHVsZXMgPSBbXHJcbiAgICAgICAgICAgIEJETW9kdWxlcy5nZXQoZSA9PiBlLnJlbW92ZUtleWJpbmQpWzBdLFxyXG4gICAgICAgICAgICBCRE1vZHVsZXMuZ2V0KGUgPT4gZS5tYXJnaW5Cb3R0b20yMClbMF0sXHJcbiAgICAgICAgICAgIEJETW9kdWxlcy5nZXQoZSA9PiBlLmRlZmF1bHRNYXJnaW5oNSlbMF0sXHJcbiAgICAgICAgICAgIEJETW9kdWxlcy5nZXQoZSA9PiBlLmNvbG9yU3RhbmRhcmQpWzBdLFxyXG4gICAgICAgICAgICBCRE1vZHVsZXMuZ2V0KGUgPT4gZS5zaXplMzIpWzBdLFxyXG4gICAgICAgICAgICBCRE1vZHVsZXMuZ2V0KGUgPT4gZS5faG9yaXpvbnRhbClbMF0sXHJcbiAgICAgICAgICAgIEJETW9kdWxlcy5nZXQoZSA9PiBlLmlucHV0TWluaSlbMF0sXHJcbiAgICAgICAgICAgIEJETW9kdWxlcy5nZXQoZSA9PiBlLnNpemUxNiAmJiBlLnNpemUyMClbMF0sXHJcbiAgICAgICAgICAgIEJETW9kdWxlcy5nZXQoZSA9PiBlLmNvbG9yVHJhbnNwYXJlbnQpWzBdLFxyXG4gICAgICAgIF0pXHJcbiAgICB9XHJcblxyXG4gICAgY29uc3RydWN0b3IocHJvcHMpe1xyXG4gICAgICAgIHN1cGVyKHByb3BzKVxyXG4gICAgICAgIGxldCBzZXR0aW5nID0gdGhpcy5wcm9wcy5zZXR0aW5nXHJcbiAgICAgICAgdGhpcy5zdGF0ZSA9IHtcclxuICAgICAgICAgICAgZGF0YTogdGhpcy5wcm9wcy5tYW5hZ2VyLnN0YXRlLmRhdGFbc2V0dGluZy5pZF1cclxuICAgICAgICB9XHJcblxyXG4gICAgICAgIHRoaXMuaW5wdXQgPSA8d2luZG93LkxpZ2h0Y29yZC5BcGkuQ29tcG9uZW50cy5pbnB1dHMuVGV4dElucHV0IHBsYWNlaG9sZGVyPXtzZXR0aW5nLnBsYWNlaG9sZGVyfSBuYW1lPXtzZXR0aW5nLmlkfSB2YWx1ZT17dGhpcy5zdGF0ZS5kYXRhfSB0eXBlPVwibnVtYmVyXCIgb25DaGFuZ2U9eyh2YWx1ZSwgbmFtZSwgaW5wdXQpID0+IHtcclxuICAgICAgICAgICAgdmFsdWUgPSB2YWx1ZS5yZXBsYWNlKC9bXlxcZF0rL2csIFwiXCIpXHJcbiAgICAgICAgICAgIGlmKHZhbHVlID09IHRoaXMuc3RhdGUuZGF0YSl7XHJcbiAgICAgICAgICAgICAgICBpbnB1dC5zZXRWYWx1ZSh2YWx1ZSlcclxuICAgICAgICAgICAgICAgIHJldHVyblxyXG4gICAgICAgICAgICB9XHJcblxyXG4gICAgICAgICAgICBpZighdGhpcy5sYXN0RWRpdGVkIHx8IHRoaXMubGFzdEVkaXRlZCA8IERhdGUubm93KCkgLSA1MDApe1xyXG4gICAgICAgICAgICAgICAgdGhpcy5wcm9wcy5tYW5hZ2VyLm9uQ2hhbmdlKHRoaXMsIHZhbHVlKVxyXG4gICAgICAgICAgICAgICAgdGhpcy5sYXN0RWRpdGVkID0gRGF0ZS5ub3coKVxyXG4gICAgICAgICAgICB9ZWxzZSBpZighdGhpcy5pc1RpbWluZyl7XHJcbiAgICAgICAgICAgICAgICB0aGlzLmlzVGltaW5nID0gc2V0VGltZW91dCgoKSA9PiB7XHJcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5wcm9wcy5tYW5hZ2VyLm9uQ2hhbmdlKHRoaXMsIHRoaXMuc3RhdGUuZGF0YSlcclxuICAgICAgICAgICAgICAgICAgICB0aGlzLmlzVGltaW5nID0gbnVsbFxyXG4gICAgICAgICAgICAgICAgICAgIHRoaXMubGFzdEVkaXRlZCA9IERhdGUubm93KClcclxuICAgICAgICAgICAgICAgIH0sIDUwMCk7XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgdGhpcy5zZXRTdGF0ZSh7XHJcbiAgICAgICAgICAgICAgICBkYXRhOiB2YWx1ZVxyXG4gICAgICAgICAgICB9KVxyXG4gICAgICAgIH19IHR5cGU9XCJ0ZXh0XCIvPlxyXG4gICAgfVxyXG5cclxuICAgIHJlbmRlcigpe1xyXG4gICAgICAgIGxldCBzZXR0aW5nID0gdGhpcy5wcm9wcy5zZXR0aW5nXHJcblxyXG4gICAgICAgIGxldCBbXHJcbiAgICAgICAgICAgIHJvd01vZHVsZSxcclxuICAgICAgICAgICAgbWFyZ2luTW9kdWxlLFxyXG4gICAgICAgICAgICBtYXJnaW5Nb2R1bGUyLFxyXG4gICAgICAgICAgICBjb2xvck1vZHVsZSxcclxuICAgICAgICAgICAgc2l6ZU1vZHVsZSxcclxuICAgICAgICAgICAgZmxleE1vZHVsZSxcclxuICAgICAgICBdID0gdGhpcy5tb2R1bGVzXHJcblxyXG5cclxuICAgICAgICByZXR1cm4gKDxkaXYgY2xhc3NOYW1lPXtyb3dNb2R1bGUucm93K1wiIFwiK21hcmdpbk1vZHVsZS5tYXJnaW5Cb3R0b20yMH0+XHJcbiAgICAgICAgICAgIDxkaXYgY2xhc3NOYW1lPXtgJHtyb3dNb2R1bGUuaXRlbX0gJHtmbGV4TW9kdWxlLmZsZXhDaGlsZH1gfT5cclxuICAgICAgICAgICAgICAgIDxoNSBjbGFzc05hbWU9e2NvbG9yTW9kdWxlLmNvbG9yU3RhbmRhcmQrXCIgXCIrc2l6ZU1vZHVsZS5zaXplMTQrXCIgXCIrbWFyZ2luTW9kdWxlMi5oNStcIiBcIittYXJnaW5Nb2R1bGUyLmRlZmF1bHRNYXJnaW5oNX0+XHJcbiAgICAgICAgICAgICAgICAgICAge3NldHRpbmcudGl0bGV9XHJcbiAgICAgICAgICAgICAgICA8L2g1PlxyXG4gICAgICAgICAgICAgICAge3RoaXMuaW5wdXR9XHJcbiAgICAgICAgICAgICAgICB7c2V0dGluZy5pZCA9PT0gXCJ0aW1lc3RhbXBzLnN0YXJ0XCIgPyBcclxuICAgICAgICAgICAgICAgIDxMaWdodGNvcmQuQXBpLkNvbXBvbmVudHMuaW5wdXRzLkJ1dHRvbiBvbkNsaWNrPXsoKSA9PiB7XHJcbiAgICAgICAgICAgICAgICAgICAgRGlzY29yZE5hdGl2ZS5jbGlwYm9hcmQuY29weShEYXRlLm5vdygpK1wiXCIpXHJcbiAgICAgICAgICAgICAgICB9fSBjb2xvcj1cImJyYW5kXCI+Q29weSBjdXJyZW50IHRpbWVzdGFtcDwvTGlnaHRjb3JkLkFwaS5Db21wb25lbnRzLmlucHV0cy5CdXR0b24+IDogbnVsbH1cclxuICAgICAgICAgICAgPC9kaXY+XHJcbiAgICAgICAgICAgIDxEaXZpZGVyLz5cclxuICAgICAgICA8L2Rpdj4pXHJcbiAgICB9XHJcbn1cclxuXHJcbmxldCBJbnB1dENob2ljZU1vZHVsZXNcclxuY2xhc3MgSW5wdXRDaG9pY2UgZXh0ZW5kcyBSZWFjdC5QdXJlQ29tcG9uZW50IHtcclxuICAgIGNvbnN0cnVjdG9yKHByb3BzKXtcclxuICAgICAgICBzdXBlcihwcm9wcylcclxuICAgICAgICBsZXQgc2V0dGluZyA9IHRoaXMucHJvcHMuc2V0dGluZ1xyXG4gICAgICAgIHRoaXMuc3RhdGUgPSB7XHJcbiAgICAgICAgICAgIGRhdGE6IHRoaXMucHJvcHMubWFuYWdlci5zdGF0ZS5kYXRhW3NldHRpbmcuaWRdID8gXCJhc3NldC1cIit0aGlzLnByb3BzLm1hbmFnZXIuc3RhdGUuZGF0YVtzZXR0aW5nLmlkXSA6IFwibm9uZVwiXHJcbiAgICAgICAgfVxyXG4gICAgICAgIHRoaXMucHJvcHMubWFuYWdlci51cGRhdGVXaGVuRmV0Y2hlZCh0aGlzKVxyXG4gICAgfVxyXG5cclxuICAgIG9uQ2hhbmdlKGRhdGEpe1xyXG4gICAgICAgIGxldCB2YWx1ZSA9IGRhdGEudmFsdWVcclxuXHJcbiAgICAgICAgaWYoIXRoaXMubGFzdEVkaXRlZCB8fCB0aGlzLmxhc3RFZGl0ZWQgPCBEYXRlLm5vdygpIC0gNTAwKXtcclxuICAgICAgICAgICAgdGhpcy5wcm9wcy5tYW5hZ2VyLm9uQ2hhbmdlKHRoaXMsIHZhbHVlID09PSBcIm5vbmVcIiA/IG51bGwgOiB2YWx1ZS5yZXBsYWNlKFwiYXNzZXQtXCIsIFwiXCIpKVxyXG4gICAgICAgICAgICB0aGlzLmxhc3RFZGl0ZWQgPSBEYXRlLm5vdygpXHJcbiAgICAgICAgfWVsc2UgaWYoIXRoaXMuaXNUaW1pbmcpe1xyXG4gICAgICAgICAgICB0aGlzLmlzVGltaW5nID0gc2V0VGltZW91dCgoKSA9PiB7XHJcbiAgICAgICAgICAgICAgICB0aGlzLnByb3BzLm1hbmFnZXIub25DaGFuZ2UodGhpcywgdGhpcy5zdGF0ZS5kYXRhID09PSBcIm5vbmVcIiA/IG51bGwgOiB0aGlzLnN0YXRlLmRhdGEucmVwbGFjZShcImFzc2V0LVwiLCBcIlwiKSlcclxuICAgICAgICAgICAgICAgIHRoaXMuaXNUaW1pbmcgPSBudWxsXHJcbiAgICAgICAgICAgICAgICB0aGlzLmxhc3RFZGl0ZWQgPSBEYXRlLm5vdygpXHJcbiAgICAgICAgICAgIH0sIDUwMCk7XHJcbiAgICAgICAgfVxyXG4gICAgICAgIHRoaXMuc2V0U3RhdGUoe1xyXG4gICAgICAgICAgICBkYXRhOiB2YWx1ZVxyXG4gICAgICAgIH0pXHJcbiAgICAgICAgdGhpcy5mb3JjZVVwZGF0ZSgpXHJcbiAgICB9XHJcbiAgICBcclxuICAgIGdldCBtb2R1bGVzKCl7XHJcbiAgICAgICAgcmV0dXJuIElucHV0Q2hvaWNlTW9kdWxlcyB8fCAoSW5wdXRDaG9pY2VNb2R1bGVzID0gW1xyXG4gICAgICAgICAgICBCRE1vZHVsZXMuZ2V0KGUgPT4gZS5yZW1vdmVLZXliaW5kKVswXSxcclxuICAgICAgICAgICAgQkRNb2R1bGVzLmdldChlID0+IGUubWFyZ2luQm90dG9tMjApWzBdLFxyXG4gICAgICAgICAgICBCRE1vZHVsZXMuZ2V0KGUgPT4gZS5kZWZhdWx0TWFyZ2luaDUpWzBdLFxyXG4gICAgICAgICAgICBCRE1vZHVsZXMuZ2V0KGUgPT4gZS5jb2xvclN0YW5kYXJkKVswXSxcclxuICAgICAgICAgICAgQkRNb2R1bGVzLmdldChlID0+IGUuc2l6ZTMyKVswXSxcclxuICAgICAgICAgICAgQkRNb2R1bGVzLmdldChlID0+IGUuX2hvcml6b250YWwpWzBdXHJcbiAgICAgICAgXSlcclxuICAgIH1cclxuXHJcbiAgICByZW5kZXIoKXtcclxuICAgICAgICBsZXQgc2V0dGluZyA9IHRoaXMucHJvcHMuc2V0dGluZ1xyXG5cclxuICAgICAgICBsZXQgW1xyXG4gICAgICAgICAgICByb3dNb2R1bGUsXHJcbiAgICAgICAgICAgIG1hcmdpbk1vZHVsZSxcclxuICAgICAgICAgICAgbWFyZ2luTW9kdWxlMixcclxuICAgICAgICAgICAgY29sb3JNb2R1bGUsXHJcbiAgICAgICAgICAgIHNpemVNb2R1bGUsXHJcbiAgICAgICAgICAgIGZsZXhNb2R1bGVcclxuICAgICAgICBdID0gdGhpcy5tb2R1bGVzXHJcbiAgICAgICAgXHJcbiAgICAgICAgbGV0IG9wdGlvbnMgPSB0aGlzLnByb3BzLm1hbmFnZXIuc3RhdGUuYXNzZXRzLm1hcChlID0+IHtcclxuICAgICAgICAgICAgcmV0dXJuIHtcclxuICAgICAgICAgICAgICAgIHZhbHVlOiBcImFzc2V0LVwiK2UuaWQsXHJcbiAgICAgICAgICAgICAgICBsYWJlbDogZS5uYW1lXHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICB9KVxyXG5cclxuICAgICAgICBvcHRpb25zLnVuc2hpZnQoe1xyXG4gICAgICAgICAgICB2YWx1ZTogXCJub25lXCIsXHJcbiAgICAgICAgICAgIGxhYmVsOiBcIk5vIGFzc2V0c1wiXHJcbiAgICAgICAgfSlcclxuXHJcbiAgICAgICAgcmV0dXJuICg8ZGl2IGNsYXNzTmFtZT17cm93TW9kdWxlLnJvdytcIiBcIittYXJnaW5Nb2R1bGUubWFyZ2luQm90dG9tMjB9PlxyXG4gICAgICAgICAgICA8ZGl2IGNsYXNzTmFtZT17YCR7cm93TW9kdWxlLml0ZW19ICR7ZmxleE1vZHVsZS5mbGV4Q2hpbGR9YH0+XHJcbiAgICAgICAgICAgICAgICA8aDUgY2xhc3NOYW1lPXtjb2xvck1vZHVsZS5jb2xvclN0YW5kYXJkK1wiIFwiK3NpemVNb2R1bGUuc2l6ZTE0K1wiIFwiK21hcmdpbk1vZHVsZTIuaDUrXCIgXCIrbWFyZ2luTW9kdWxlMi5kZWZhdWx0TWFyZ2luaDV9PlxyXG4gICAgICAgICAgICAgICAgICAgIHtzZXR0aW5nLnRpdGxlfVxyXG4gICAgICAgICAgICAgICAgPC9oNT5cclxuICAgICAgICAgICAgICAgIDx3aW5kb3cuTGlnaHRjb3JkLkFwaS5Db21wb25lbnRzLmlucHV0cy5Ecm9wZG93biB2YWx1ZT17dGhpcy5zdGF0ZS5kYXRhfSBvcHRpb25zPXtvcHRpb25zfSBvbkNoYW5nZT17dGhpcy5vbkNoYW5nZS5iaW5kKHRoaXMpfSAvPlxyXG4gICAgICAgICAgICAgICAgey8qPFNlbGVjdCB2YWx1ZT17dGhpcy5zdGF0ZS5kYXRhfSBvbkNoYW5nZT17dGhpcy5vbkNoYW5nZS5iaW5kKHRoaXMpfSBvcHRpb25zPXtvcHRpb25zfS8+Ki99XHJcbiAgICAgICAgICAgIDwvZGl2PlxyXG4gICAgICAgICAgICA8RGl2aWRlci8+XHJcbiAgICAgICAgPC9kaXY+KVxyXG4gICAgfVxyXG59XHJcblxyXG5sZXQgRGl2aWRlck1vZHVsZXMgPSBbXVxyXG5jbGFzcyBEaXZpZGVyIGV4dGVuZHMgUmVhY3QuUHVyZUNvbXBvbmVudCB7XHJcbiAgICBnZXQgbW9kdWxlcygpe1xyXG4gICAgICAgIHJldHVybiBEaXZpZGVyTW9kdWxlcyYmRGl2aWRlck1vZHVsZXNbMF0gPyBEaXZpZGVyTW9kdWxlcyA6IChEaXZpZGVyTW9kdWxlcyA9IFtcclxuICAgICAgICAgICAgQkRNb2R1bGVzLmdldChlID0+IGUuZGl2aWRlciAmJiBPYmplY3Qua2V5cyhlKS5sZW5ndGggPT09IDEpWzBdLFxyXG4gICAgICAgICAgICBCRE1vZHVsZXMuZ2V0KGUgPT4gZS5kaXZpZGVyRGVmYXVsdClbMF1cclxuICAgICAgICBdKVxyXG4gICAgfVxyXG5cclxuICAgIHJlbmRlcigpe1xyXG4gICAgICAgIGxldCBbXHJcbiAgICAgICAgICAgIGRpdmlkZXIsXHJcbiAgICAgICAgICAgIGRpdmlkZXJEZWZhdWx0XHJcbiAgICAgICAgXSA9IHRoaXMubW9kdWxlc1xyXG5cclxuICAgICAgICByZXR1cm4gPGRpdiBjbGFzcz17YCR7ZGl2aWRlci5kaXZpZGVyfSAke2RpdmlkZXJEZWZhdWx0LmRpdmlkZXJEZWZhdWx0fWB9PjwvZGl2PlxyXG4gICAgfVxyXG59XHJcblxyXG5jbGFzcyBEaXNjb3JkQnV0dG9uIGV4dGVuZHMgUmVhY3QuQ29tcG9uZW50IHtcclxuICAgIHJlbmRlcigpe1xyXG4gICAgICAgIGxldCByb3dNb2R1bGUgPSBCRE1vZHVsZXMuZ2V0KGUgPT4gZS5yZW1vdmVLZXliaW5kKVswXVxyXG4gICAgICAgIGxldCBtYXJnaW5Nb2R1bGUgPSBCRE1vZHVsZXMuZ2V0KGUgPT4gZS5tYXJnaW5Cb3R0b20yMClbMF1cclxuICAgICAgICBsZXQgZmxleE1vZHVsZSA9IEJETW9kdWxlcy5nZXQoZSA9PiBlLl9ob3Jpem9udGFsKVswXVxyXG5cclxuICAgICAgICByZXR1cm4gKDxkaXYgY2xhc3NOYW1lPXtyb3dNb2R1bGUucm93K1wiIFwiK21hcmdpbk1vZHVsZS5tYXJnaW5Cb3R0b20yMH0+XHJcbiAgICAgICAgICAgIDxkaXYgY2xhc3NOYW1lPXtgJHtyb3dNb2R1bGUuaXRlbX0gJHtmbGV4TW9kdWxlLmZsZXhDaGlsZH1gfT5cclxuICAgICAgICAgICAgICAgIDxMaWdodGNvcmQuQXBpLkNvbXBvbmVudHMuaW5wdXRzLkJ1dHRvbiBvbkNsaWNrPXt0aGlzLnByb3BzLm9uQ2xpY2t9IGNvbG9yPVwiYnJhbmRcIj5cclxuICAgICAgICAgICAgICAgICAgICB7dGhpcy5wcm9wcy50aXRsZX1cclxuICAgICAgICAgICAgICAgIDwvTGlnaHRjb3JkLkFwaS5Db21wb25lbnRzLmlucHV0cy5CdXR0b24+XHJcbiAgICAgICAgICAgIDwvZGl2PlxyXG4gICAgICAgIDwvZGl2PilcclxuICAgIH1cclxufVxyXG5cclxuY2xhc3MgUnBjUHJldmlldyBleHRlbmRzIFJlYWN0LkNvbXBvbmVudCB7XHJcbiAgICBjb25zdHJ1Y3Rvcihwcm9wcyA9IHt9KXtcclxuICAgICAgICBzdXBlcihwcm9wcylcclxuICAgICAgICB0aGlzLnN0YXRlID0ge1xyXG4gICAgICAgICAgICBhY3RpdmU6IFwicHJvZmlsZVwiXHJcbiAgICAgICAgfVxyXG4gICAgICAgIHRoaXMudGFicyA9IFtdXHJcblxyXG4gICAgICAgIHRoaXMucHJvcHMuc2V0dGluZ3MucHJldmlldyA9IHRoaXNcclxuICAgIH1cclxuXHJcbiAgICBjaGFuZ2VUYWIodGFiKXtcclxuICAgICAgICBsZXQgYW5jaWVudFRhYiA9IHRoaXMuc3RhdGUuYWN0aXZlXHJcbiAgICAgICAgaWYoYW5jaWVudFRhYiA9PT0gdGFiLnByb3BzLmlkKXJldHVyblxyXG5cclxuICAgICAgICB0aGlzLnRhYnMuZm9yRWFjaChlID0+IHtcclxuICAgICAgICAgICAgZS5zZXRBY3RpdmUoZmFsc2UpXHJcbiAgICAgICAgfSlcclxuICAgICAgICB0YWIuc2V0QWN0aXZlKHRydWUpXHJcbiAgICAgICAgdGhpcy5zZXRTdGF0ZSh7XHJcbiAgICAgICAgICAgIGFjdGl2ZTogdGFiLnByb3BzLmlkXHJcbiAgICAgICAgfSlcclxuICAgIH1cclxuXHJcbiAgICByZW5kZXIoKXtcclxuICAgICAgICBsZXQgcHJldmlldyA9IG5ldyB0aGlzLnByZXZpZXcoe1xyXG4gICAgICAgICAgICBwcmV2aWV3OiB0aGlzXHJcbiAgICAgICAgfSlcclxuICAgICAgICBwcmV2aWV3LnNldFN0YXRlKHRoaXMuc3RhdGUucnBjKVxyXG4gICAgICAgIHJldHVybiAoPGRpdiBjbGFzc05hbWU9XCJsYy10YWJXcmFwcGVyXCI+XHJcbiAgICAgICAgICAgIDxkaXYgY2xhc3NOYW1lPVwibGMtdGFibmF2XCIgc3R5bGU9e3tmbGV4OiBcIjAgMSBhdXRvXCJ9fT5cclxuICAgICAgICAgICAgICAgIDxUYWIgcHJldmlldz17dGhpc30gdGl0bGU9XCJGdWxsIFByb2ZpbGVcIiBpZD1cInByb2ZpbGVcIi8+XHJcbiAgICAgICAgICAgICAgICA8VGFiIHByZXZpZXc9e3RoaXN9IHRpdGxlPVwiVXNlciBQb3BvdXRcIiBpZD1cInBvcG91dFwiLz5cclxuICAgICAgICAgICAgPC9kaXY+XHJcbiAgICAgICAgICAgIHtwcmV2aWV3LnJlbmRlcigpfVxyXG4gICAgICAgIDwvZGl2PilcclxuICAgIH0gICBcclxuXHJcbiAgICBpc0FjdGl2ZSh0YWIpe1xyXG4gICAgICAgIHJldHVybiB0aGlzLnN0YXRlLmFjdGl2ZSA9PT0gdGFiXHJcbiAgICB9XHJcblxyXG4gICAgZ2V0IHByZXZpZXcoKXtcclxuICAgICAgICBpZih0aGlzLnN0YXRlLmFjdGl2ZSA9PT0gXCJwcm9maWxlXCIpcmV0dXJuIFByb2ZpbGVcclxuICAgICAgICByZXR1cm4gUG9wb3V0XHJcbiAgICB9XHJcbn1cclxuXHJcbmNsYXNzIFRhYiBleHRlbmRzIFJlYWN0LkNvbXBvbmVudCB7XHJcbiAgICBjb25zdHJ1Y3Rvcihwcm9wcyl7XHJcbiAgICAgICAgc3VwZXIocHJvcHMpXHJcblxyXG4gICAgICAgIHRoaXMuc3RhdGUgPSB7XHJcbiAgICAgICAgICAgIGFjdGl2ZTogcHJvcHMucHJldmlldy5pc0FjdGl2ZShwcm9wcy5pZClcclxuICAgICAgICB9XHJcbiAgICAgICAgcHJvcHMucHJldmlldy50YWJzLnB1c2godGhpcylcclxuICAgIH1cclxuXHJcbiAgICBzZXRBY3RpdmUoaXNBY3RpdmUpe1xyXG4gICAgICAgIHRoaXMuc2V0U3RhdGUoe1xyXG4gICAgICAgICAgICBhY3RpdmU6ICEhaXNBY3RpdmVcclxuICAgICAgICB9KVxyXG4gICAgfVxyXG5cclxuICAgIHJlbmRlcigpe1xyXG4gICAgICAgIGxldCBjbGFzc05hbWUgPSBgbGMtbmF2SXRlbWBcclxuICAgICAgICBpZih0aGlzLnN0YXRlLmFjdGl2ZSl7XHJcbiAgICAgICAgICAgIGNsYXNzTmFtZSArPSBgIGxjLW5hdkl0ZW1BY3RpdmVgXHJcbiAgICAgICAgfWVsc2V7XHJcbiAgICAgICAgICAgIGNsYXNzTmFtZSArPSBgIGxjLW5hdkl0ZW1JbmFjdGl2ZWBcclxuICAgICAgICB9XHJcbiAgICAgICAgcmV0dXJuICg8ZGl2IGNsYXNzTmFtZT17Y2xhc3NOYW1lfSBvbkNsaWNrPXsoKT0+e1xyXG4gICAgICAgICAgICB0aGlzLnByb3BzLnByZXZpZXcuY2hhbmdlVGFiKHRoaXMpXHJcbiAgICAgICAgfX0+XHJcbiAgICAgICAgICAgIHt0aGlzLnByb3BzLnRpdGxlfVxyXG4gICAgICAgIDwvZGl2PilcclxuICAgIH1cclxufVxyXG5cclxubGV0IHBvcG91dE1vZHVsZVxyXG5jbGFzcyBQb3BvdXQgZXh0ZW5kcyBSZWFjdC5Db21wb25lbnQge1xyXG4gICAgZ2V0IG1vZHVsZXMoKXtcclxuICAgICAgICByZXR1cm4gcG9wb3V0TW9kdWxlIHx8IChwb3BvdXRNb2R1bGUgPSBbXHJcbiAgICAgICAgICAgIEJETW9kdWxlcy5nZXQoZSA9PiBlLnVzZXJQb3BvdXQpWzBdLFxyXG4gICAgICAgICAgICBCRE1vZHVsZXMuZ2V0KGUgPT4gZS5faG9yaXpvbnRhbClbMF0sXHJcbiAgICAgICAgICAgIEJETW9kdWxlcy5nZXQoZSA9PiBlLnZlcnRpY2FsICYmIGUuYWxpZ25TdHJldGNoICYmICFlLnN0cmVhbWVyTW9kZUVuYWJsZWRCdG4pWzBdLFxyXG4gICAgICAgICAgICBCRE1vZHVsZXMuZ2V0KGUgPT4gZS5ib3QpWzBdLFxyXG4gICAgICAgICAgICBCRE1vZHVsZXMuZ2V0KGUgPT4gZS5hY3Rpdml0eVVzZXJQb3BvdXQpWzBdLFxyXG4gICAgICAgICAgICBCRE1vZHVsZXMuZ2V0KGUgPT4gZS5tdXRlZCAmJiBlLndyYXBwZXIgJiYgZS5iYXNlKVswXSxcclxuICAgICAgICAgICAgQkRNb2R1bGVzLmdldChlID0+IGUuc2l6ZTMyKVswXSxcclxuICAgICAgICAgICAgQkRNb2R1bGVzLmdldChlID0+IGUudGhlbWVHaG9zdEhhaXJsaW5lQ2hhbm5lbHMpWzBdLFxyXG4gICAgICAgICAgICBCRE1vZHVsZXMuZ2V0KGUgPT4gZS5ub3RlICYmIE9iamVjdC5rZXlzKGUpLmxlbmd0aCA9PT0gMSlbMF0sXHJcbiAgICAgICAgICAgIEJETW9kdWxlcy5nZXQoZSA9PiBlLnBybyAmJiBlLmlubGluZSlbMF0sXHJcbiAgICAgICAgICAgIEJETW9kdWxlcy5nZXQoZSA9PiBlLmNvbG9yU3RhbmRhcmQpWzBdLFxyXG4gICAgICAgICAgICBCRE1vZHVsZXMuZ2V0KGUgPT4gZS5kZWZhdWx0ICYmIGUuZGVmYXVsdC5NZXNzYWdlcylbMF0uZGVmYXVsdC5NZXNzYWdlcyxcclxuICAgICAgICAgICAgQkRNb2R1bGVzLmdldChlID0+IGUucG9pbnRlckV2ZW50cylbMF0sXHJcbiAgICAgICAgICAgIEJETW9kdWxlcy5nZXQoZSA9PiBlLmRlZmF1bHQgJiYgZS5kZWZhdWx0LmdldEN1cnJlbnRVc2VyKVswXS5kZWZhdWx0XHJcbiAgICAgICAgXSlcclxuICAgIH1cclxuXHJcbiAgICByZW5kZXIoKXtcclxuICAgICAgICBsZXQgW1xyXG4gICAgICAgICAgICByb290TW9kdWxlMSxcclxuICAgICAgICAgICAgZmxleE1vZHVsZTEsXHJcbiAgICAgICAgICAgIHN0eWxpbmdNb2R1bGUxLFxyXG4gICAgICAgICAgICBuYW1lVGFnTW9kdWxlMSxcclxuICAgICAgICAgICAgYWN0aXZpdHlNb2R1bGUxLFxyXG4gICAgICAgICAgICB0ZXh0TW9kdWxlMSxcclxuICAgICAgICAgICAgc2l6ZU1vZHVsZTEsXHJcbiAgICAgICAgICAgIHNjcm9sbGVyTW9kdWxlMSxcclxuICAgICAgICAgICAgbm90ZU1vZHVsZTEsXHJcbiAgICAgICAgICAgIHByb3RpcE1vZHVsZTEsXHJcbiAgICAgICAgICAgIGNvbG9yTW9kdWxlMSxcclxuICAgICAgICAgICAgTWVzc2FnZXMsXHJcbiAgICAgICAgICAgIGF2YXRhck1vZHVsZTEsXHJcbiAgICAgICAgICAgIHVzZXJNb2R1bGUxXHJcbiAgICAgICAgXSA9IHRoaXMubW9kdWxlc1xyXG4gICAgICAgIGxldCB1c2VyID0gdXNlck1vZHVsZTEuZ2V0Q3VycmVudFVzZXIoKVxyXG4gICAgICAgIGxldCBhdmF0YXJVUkwgPSB1c2VyLmdldEF2YXRhclVSTCh1c2VyLmF2YXRhci5zdGFydHNXaXRoKFwiYV9cIikgPyBcImdpZlwiIDogXCJwbmdcIilcclxuXHJcbiAgICAgICAgbGV0IGRhdGEgPSBPYmplY3QuYXNzaWduKHt9LCBkZWZhdWx0UlBDLCB0aGlzLnByb3BzLnByZXZpZXcucHJvcHMuc2V0dGluZ3Muc3RhdGUuZGF0YSlcclxuICAgICAgICB0aW1lc3RhbXBDbGFzcyA9IHRpbWVzdGFtcENsYXNzIHx8IGFjdGl2aXR5TW9kdWxlMS50aW1lc3RhbXBcclxuXHJcbiAgICAgICAgbGV0IGltYWdlcyA9ICgoKSA9PiB7XHJcbiAgICAgICAgICAgIGlmKCFkYXRhW1wiYXNzZXRzLmxhcmdlXCJdKXJldHVybiBudWxsXHJcbiAgICAgICAgICAgIGxldCBpbWFnZXMgPSBbXVxyXG4gICAgICAgICAgICBpZihkYXRhW1wiYXNzZXRzLmxhcmdlXCJdKXtcclxuICAgICAgICAgICAgICAgIGltYWdlcy5wdXNoKDxpbWcgYWx0PVwiXCIgc3JjPXtgaHR0cHM6Ly9jZG4uZGlzY29yZGFwcC5jb20vYXBwLWFzc2V0cy8ke2RhdGEuYXBwbGljYXRpb25faWR9LyR7ZGF0YVtcImFzc2V0cy5sYXJnZVwiXX0ucG5nYH0gY2xhc3M9e2Ake2FjdGl2aXR5TW9kdWxlMS5hc3NldHNMYXJnZUltYWdlVXNlclBvcG91dH0gJHtkYXRhW1wiYXNzZXRzLnNtYWxsXCJdID8gYWN0aXZpdHlNb2R1bGUxLmFzc2V0c0xhcmdlTWFza1VzZXJQb3BvdXQgOiBcIlwifWB9IC8+KVxyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIGlmKGRhdGFbXCJhc3NldHMuc21hbGxcIl0pe1xyXG4gICAgICAgICAgICAgICAgaW1hZ2VzLnB1c2goPGltZyBhbHQ9XCJcIiBzcmM9e2BodHRwczovL2Nkbi5kaXNjb3JkYXBwLmNvbS9hcHAtYXNzZXRzLyR7ZGF0YS5hcHBsaWNhdGlvbl9pZH0vJHtkYXRhW1wiYXNzZXRzLnNtYWxsXCJdfS5wbmdgfSBjbGFzcz17YWN0aXZpdHlNb2R1bGUxLmFzc2V0c1NtYWxsSW1hZ2VVc2VyUG9wb3V0fSAvPilcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICBpZighaW1hZ2VzLmxlbmd0aClyZXR1cm4gbnVsbFxyXG4gICAgICAgICAgICByZXR1cm4gPGRpdiBjbGFzcz17YWN0aXZpdHlNb2R1bGUxLmFzc2V0c30+XHJcbiAgICAgICAgICAgICAgICB7aW1hZ2VzfVxyXG4gICAgICAgICAgICA8L2Rpdj5cclxuICAgICAgICB9KSgpXHJcbiAgICAgICAgXHJcbiAgICAgICAgcmV0dXJuICg8ZGl2IGNsYXNzTmFtZT1cImxjLXVzZXJQb3BvdXQgbGMtdGFiLWJveC1zaGFkb3dcIj5cclxuICAgICAgICAgICAgPGRpdiBjbGFzcz17cm9vdE1vZHVsZTEudXNlclBvcG91dH0gcm9sZT1cImRpYWxvZ1wiIHRhYmluZGV4PVwiLTFcIj5cclxuICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9e3Jvb3RNb2R1bGUxLmhlYWRlclBsYXlpbmd9PlxyXG4gICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9e2Ake2ZsZXhNb2R1bGUxLmZsZXh9ICR7c3R5bGluZ01vZHVsZTEudmVydGljYWx9ICR7c3R5bGluZ01vZHVsZTEuanVzdGlmeUNlbnRlcn0gJHtzdHlsaW5nTW9kdWxlMS5hbGlnbkNlbnRlcn0gJHtzdHlsaW5nTW9kdWxlMS5ub1dyYXB9ICR7cm9vdE1vZHVsZTEuaGVhZGVyVG9wfWB9IHN0eWxlPXt7ZmxleDogXCIxIDEgYXV0b1wifX0+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9e3Jvb3RNb2R1bGUxLmF2YXRhcldyYXBwZXJOb3JtYWx9IHJvbGU9XCJidXR0b25cIiB0YWJpbmRleD1cIjBcIj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9e2F2YXRhck1vZHVsZTF9IHJvbGU9XCJpbWdcIiBzdHlsZT17e3dpZHRoOiBcIjgwcHhcIiwgaGVpZ2h0OiBcIjgwcHhcIn19PlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxzdmcgd2lkdGg9XCI5MlwiIGhlaWdodD1cIjgwXCIgdmlld0JveD1cIjAgMCA5MiA4MFwiIGNsYXNzPXtgJHthdmF0YXJNb2R1bGUxLm1hc2t9ICR7YXZhdGFyTW9kdWxlMS5zdmd9YH0+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxmb3JlaWduT2JqZWN0IHg9XCIwXCIgeT1cIjBcIiB3aWR0aD1cIjgwXCIgaGVpZ2h0PVwiODBcIiBtYXNrPVwidXJsKCNzdmctbWFzay1hdmF0YXItc3RhdHVzLXJvdW5kLTgwKVwiPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGltZyBzcmM9e2F2YXRhclVSTH0gYWx0PVwiIFwiIGNsYXNzPXthdmF0YXJNb2R1bGUxLmF2YXRhcn0gLz5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9mb3JlaWduT2JqZWN0PlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8U3RhdHVzIC8+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9zdmc+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L2Rpdj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxzdmcgd2lkdGg9XCI4MFwiIGhlaWdodD1cIjgwXCIgY2xhc3M9e3Jvb3RNb2R1bGUxLmF2YXRhckhpbnR9IHZpZXdCb3g9XCIwIDAgODAgODBcIj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8Zm9yZWlnbk9iamVjdCB4PVwiMFwiIHk9XCIwXCIgd2lkdGg9XCI4MFwiIGhlaWdodD1cIjgwXCIgbWFzaz1cInVybCgjc3ZnLW1hc2stYXZhdGFyLXN0YXR1cy1yb3VuZC04MClcIj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz17cm9vdE1vZHVsZTEuYXZhdGFySGludElubmVyfT57TWVzc2FnZXMuVklFV19QUk9GSUxFfTwvZGl2PlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvZm9yZWlnbk9iamVjdD5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvc3ZnPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICA8L2Rpdj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz17cm9vdE1vZHVsZTEuaGVhZGVyVGV4dH0+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPXtgJHtmbGV4TW9kdWxlMS5mbGV4fSAke3N0eWxpbmdNb2R1bGUxLmhvcml6b250YWx9ICR7c3R5bGluZ01vZHVsZTEuanVzdGlmeVN0YXJ0fSAke3N0eWxpbmdNb2R1bGUxLmFsaWduQ2VudGVyfSAke3N0eWxpbmdNb2R1bGUxLm5vV3JhcH1gfSBzdHlsZT17e2ZsZXg6IFwiMSAxIGF1dG9cIn19PlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9e2Ake3Jvb3RNb2R1bGUxLmhlYWRlclRhZ05vTmlja25hbWV9ICR7bmFtZVRhZ01vZHVsZTEubmFtZVRhZ31gfT5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHNwYW4gY2xhc3M9e2Ake25hbWVUYWdNb2R1bGUxLnVzZXJuYW1lfSAke3Jvb3RNb2R1bGUxLmhlYWRlclRhZ1VzZXJuYW1lTm9OaWNrbmFtZX1gfT57dXNlci51c2VybmFtZX08L3NwYW4+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxzcGFuPiN7dXNlci5kaXNjcmltaW5hdG9yfTwvc3Bhbj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L2Rpdj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvZGl2PlxyXG4gICAgICAgICAgICAgICAgICAgICAgICA8L2Rpdj5cclxuICAgICAgICAgICAgICAgICAgICA8L2Rpdj5cclxuICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPXtgJHthY3Rpdml0eU1vZHVsZTEuYWN0aXZpdHlVc2VyUG9wb3V0fSAke3Jvb3RNb2R1bGUxLmFjdGl2aXR5fWB9PlxyXG4gICAgICAgICAgICAgICAgICAgICAgICA8aDMgY2xhc3M9e2Ake2FjdGl2aXR5TW9kdWxlMS5oZWFkZXJUZXh0Tm9ybWFsfSAke3RleHRNb2R1bGUxLmJhc2V9ICR7c2l6ZU1vZHVsZTEuc2l6ZTEyfWB9PntNZXNzYWdlcy5VU0VSX0FDVElWSVRZX0hFQURFUl9QTEFZSU5HfTwvaDM+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9e2FjdGl2aXR5TW9kdWxlMS5ib2R5Tm9ybWFsfT5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHtpbWFnZXN9XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPXtpbWFnZXMgPyBhY3Rpdml0eU1vZHVsZTEuY29udGVudEltYWdlc1VzZXJQb3BvdXQgOiBhY3Rpdml0eU1vZHVsZTEuY29udGVudE5vSW1hZ2VzVXNlclBvcG91dH0gc3R5bGU9e3tmbGV4OiBcIjEgMSBhdXRvXCJ9fT5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB7KCgpID0+IHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYoIWRhdGEubmFtZSlyZXR1cm4gbnVsbFxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gPGgzIGNsYXNzPXtgJHthY3Rpdml0eU1vZHVsZTEubmFtZU5vcm1hbH0gJHt0ZXh0TW9kdWxlMS5iYXNlfSAke3NpemVNb2R1bGUxLnNpemUxNH1gfSB0aXRsZT17ZGF0YS5uYW1lfT5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxzcGFuIGNsYXNzPXthY3Rpdml0eU1vZHVsZTEuYWN0aXZpdHlOYW1lfT57ZGF0YS5uYW1lfTwvc3Bhbj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9oMz5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9KSgpfVxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHsoKCkgPT4ge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZighZGF0YS5kZXRhaWxzKXJldHVybiBudWxsXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiA8ZGl2IHRpdGxlPXtkYXRhLnRpdGxlfSBjbGFzcz17YWN0aXZpdHlNb2R1bGUxLmRldGFpbHN9PntkYXRhLmRldGFpbHN9PC9kaXY+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfSkoKX1cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB7KCgpID0+IHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYoIWRhdGEuc3RhdGUpcmV0dXJuIG51bGxcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIDxkaXYgY2xhc3M9e2FjdGl2aXR5TW9kdWxlMS5zdGF0ZX0+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8c3BhbiB0aXRsZT17ZGF0YS5zdGF0ZX0+e2RhdGEuc3RhdGV9PC9zcGFuPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L2Rpdj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9KSgpfVxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHsoKCkgPT4ge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZighZGF0YVtcInRpbWVzdGFtcHMuc3RhcnRcIl0pcmV0dXJuIG51bGxcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbGV0IHRpbWVDb21wb25lbnQgPSB0aW1lc3RhbXBSZW5kZXIoVGltZXN0YW1wLCBNZXNzYWdlcylcclxuXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiAoPGRpdiBjbGFzcz17YWN0aXZpdHlNb2R1bGUxLnRpbWVzdGFtcH0+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB7UmVhY3QuY3JlYXRlRWxlbWVudCh0aW1lQ29tcG9uZW50LCB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGltZXN0YW1wczoge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBlbmQ6IG51bGwsXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0YXJ0OiBkYXRhW1widGltZXN0YW1wcy5zdGFydFwiXVxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0pfVxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L2Rpdj4pXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfSkoKX1cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvZGl2PlxyXG4gICAgICAgICAgICAgICAgICAgICAgICA8L2Rpdj5cclxuICAgICAgICAgICAgICAgICAgICA8L2Rpdj5cclxuICAgICAgICAgICAgICAgIDwvZGl2PlxyXG4gICAgICAgICAgICAgICAgPGRpdiBjbGFzcz17YCR7c2Nyb2xsZXJNb2R1bGUxLnNjcm9sbGVyV3JhcH0gJHtyb290TW9kdWxlMS5ib2R5fSAke3Njcm9sbGVyTW9kdWxlMS5zY3JvbGxlclRoZW1lZH0gJHtzY3JvbGxlck1vZHVsZTEudGhlbWVHaG9zdEhhaXJsaW5lfSAke3Njcm9sbGVyTW9kdWxlMS5zY3JvbGxlckZhZGV9YH0+XHJcbiAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz17YCR7c2Nyb2xsZXJNb2R1bGUxLnNjcm9sbGVyfSAke3Jvb3RNb2R1bGUxLmJvZHlJbm5lcn1gfT5cclxuICAgICAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz17cm9vdE1vZHVsZTEuYm9keVRpdGxlfT57TWVzc2FnZXMuTk9URX08L2Rpdj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz17YCR7bm90ZU1vZHVsZTEubm90ZX0gJHtyb290TW9kdWxlMS5ub3RlfWB9PlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgPHRleHRhcmVhIHBsYWNlaG9sZGVyPXtNZXNzYWdlcy5OT1RFX1BMQUNFSE9MREVSfSBtYXhsZW5ndGg9XCIyNTZcIiBhdXRvY29ycmVjdD1cIm9mZlwiIGNsYXNzPXtCRE1vZHVsZXMuZ2V0KGUgPT4gZS5zY3JvbGxiYXJHaG9zdEhhaXJsaW5lKVswXS5zY3JvbGxiYXJHaG9zdEhhaXJsaW5lfSBzdHlsZT17e2hlaWdodDogXCIzNnB4XCJ9fSBkaXNhYmxlZD48L3RleHRhcmVhPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICA8L2Rpdj5cclxuICAgICAgICAgICAgICAgICAgICA8L2Rpdj5cclxuICAgICAgICAgICAgICAgIDwvZGl2PlxyXG4gICAgICAgICAgICAgICAgPGRpdiBjbGFzcz17cm9vdE1vZHVsZTEuZm9vdGVyfT5cclxuICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPXtgJHtyb290TW9kdWxlMS5wcm90aXB9ICR7cHJvdGlwTW9kdWxlMS5pbmxpbmV9YH0+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIDxoMyBjbGFzcz17YCR7cHJvdGlwTW9kdWxlMS5wcm99ICR7dGV4dE1vZHVsZTEuYmFzZX0gJHtzaXplTW9kdWxlMS5zaXplMTJ9YH0gc3R5bGU9e3tjb2xvcjogXCJyZ2IoNjcsIDE4MSwgMTI5KVwifX0+e01lc3NhZ2VzLlBJTk5FRF9NRVNTQUdFU19QUk9fVElQfTwvaDM+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9e2Ake2NvbG9yTW9kdWxlMS5jb2xvclN0YW5kYXJkfSAke3NpemVNb2R1bGUxLnNpemUxNH0gJHtwcm90aXBNb2R1bGUxLnRpcH1gfT57TWVzc2FnZXMuQ09OVEVYVF9NRU5VX0hJTlR9PC9kaXY+XHJcbiAgICAgICAgICAgICAgICAgICAgPC9kaXY+XHJcbiAgICAgICAgICAgICAgICA8L2Rpdj5cclxuICAgICAgICAgICAgPC9kaXY+XHJcbiAgICAgICAgPC9kaXY+KVxyXG4gICAgfVxyXG59XHJcblxyXG5sZXQgU3RhdHVzTW9kdWxlc1xyXG5jbGFzcyBTdGF0dXMgZXh0ZW5kcyBSZWFjdC5Db21wb25lbnQge1xyXG4gICAgZ2V0IG1vZHVsZXMoKXtcclxuICAgICAgICByZXR1cm4gU3RhdHVzTW9kdWxlcyB8fCAoU3RhdHVzTW9kdWxlcyA9IFtcclxuICAgICAgICAgICAgQkRNb2R1bGVzLmdldChlID0+IGUuZGVmYXVsdCAmJiBlLmRlZmF1bHQuZ2V0UHJlc2VuY2UpWzBdLFxyXG4gICAgICAgICAgICBCRE1vZHVsZXMuZ2V0KGUgPT4gZS5wb2ludGVyRXZlbnRzKVswXS5wb2ludGVyRXZlbnRzXHJcbiAgICAgICAgXSlcclxuICAgIH1cclxuXHJcbiAgICByZW5kZXIoKXtcclxuICAgICAgICBsZXQgW1xyXG4gICAgICAgICAgICBnZXRQcmVzZW5jZSxcclxuICAgICAgICAgICAgcG9pbnRlckV2ZW50c1xyXG4gICAgICAgIF0gPSB0aGlzLm1vZHVsZXNcclxuICAgICAgICBsZXQgc3RhdHVzID0gZ2V0UHJlc2VuY2UuZGVmYXVsdC5nZXRQcmVzZW5jZSgpLnN0YXR1c1xyXG4gICAgICAgIGlmKHN0YXR1cyA9PT0gXCJpbnZpc2libGVcIilzdGF0dXMgPSBcIm9mZmxpbmVcIlxyXG4gICAgICAgIHJldHVybiA8cmVjdCB3aWR0aD1cIjE2XCIgaGVpZ2h0PVwiMTZcIiB4PVwiNjBcIiB5PVwiNjBcIiBmaWxsPVwiI2ZmZmZmZlwiIG1hc2s9e2B1cmwoI3N2Zy1tYXNrLXN0YXR1cy0ke3N0YXR1c30pYH0gY2xhc3NOYW1lPXtwb2ludGVyRXZlbnRzfT48L3JlY3Q+XHJcbiAgICB9XHJcbn1cclxuXHJcbmxldCB0aW1lc3RhbXBDbGFzcyA9IFwiXCJcclxuXHJcbmxldCBQcm9maWxlTW9kdWxlc1xyXG5jbGFzcyBQcm9maWxlIGV4dGVuZHMgUmVhY3QuQ29tcG9uZW50IHtcclxuICAgIGdldCBtb2R1bGVzKCl7XHJcbiAgICAgICAgcmV0dXJuIFByb2ZpbGVNb2R1bGVzIHx8IChQcm9maWxlTW9kdWxlcyA9IFtcclxuICAgICAgICAgICAgQkRNb2R1bGVzLmdldChlID0+IGUuZmxleCAmJiBlLl9ob3Jpem9udGFsKVswXSxcclxuICAgICAgICAgICAgQkRNb2R1bGVzLmdldChlID0+IGUudmVydGljYWwgJiYgZS5hbGlnblN0cmV0Y2ggJiYgIWUuc3RyZWFtZXJNb2RlRW5hYmxlZEJ0bilbMF0sXHJcbiAgICAgICAgICAgIEJETW9kdWxlcy5nZXQoZSA9PiBlLnRvcFNlY3Rpb25TdHJlYW1pbmcpWzBdLFxyXG4gICAgICAgICAgICBCRE1vZHVsZXMuZ2V0KGUgPT4gZS5wb2ludGVyRXZlbnRzKVswXSxcclxuICAgICAgICAgICAgQkRNb2R1bGVzLmdldChlID0+IGUuYm90KVswXSxcclxuICAgICAgICAgICAgQkRNb2R1bGVzLmdldChlID0+IGUuYWN0aXZpdHlQcm9maWxlKVswXSxcclxuICAgICAgICAgICAgQkRNb2R1bGVzLmdldChlID0+IGUubXV0ZWQgJiYgZS53cmFwcGVyICYmIGUuYmFzZSlbMF0sXHJcbiAgICAgICAgICAgIEJETW9kdWxlcy5nZXQoZSA9PiBlLnNpemUzMilbMF0sXHJcbiAgICAgICAgICAgIEJETW9kdWxlcy5nZXQoZSA9PiBlLnNjcm9sbGVyRmFkZSlbMF0sXHJcbiAgICAgICAgICAgIEJETW9kdWxlcy5nZXQoZSA9PiBlLm5vdGUgJiYgT2JqZWN0LmtleXMoZSkubGVuZ3RoID09PSAxKVswXSxcclxuICAgICAgICAgICAgQkRNb2R1bGVzLmdldChlID0+IGUuZGVmYXVsdCAmJiBlLmRlZmF1bHQuTWVzc2FnZXMpWzBdLmRlZmF1bHQuTWVzc2FnZXNcclxuICAgICAgICBdKVxyXG4gICAgfVxyXG5cclxuICAgIHJlbmRlcigpe1xyXG4gICAgICAgIGxldCB1c2VyID0gQkRNb2R1bGVzLmdldChlID0+IGUuZGVmYXVsdCAmJiBlLmRlZmF1bHQuZ2V0Q3VycmVudFVzZXIpWzBdLmRlZmF1bHQuZ2V0Q3VycmVudFVzZXIoKVxyXG4gICAgICAgIGxldCBhdmF0YXJVUkwgPSB1c2VyLmdldEF2YXRhclVSTCh1c2VyLmF2YXRhci5zdGFydHNXaXRoKFwiYV9cIikgPyBcImdpZlwiIDogXCJwbmdcIilcclxuICAgICAgICBsZXQgW1xyXG4gICAgICAgICAgICBmbGV4TW9kdWxlMSxcclxuICAgICAgICAgICAgc3R5bGluZ01vZHVsZTEsXHJcbiAgICAgICAgICAgIHJvb3RNb2R1bGUxLFxyXG4gICAgICAgICAgICBhdmF0YXJNb2R1bGUxLFxyXG4gICAgICAgICAgICBuYW1lVGFnTW9kdWxlMSxcclxuICAgICAgICAgICAgYWN0aXZpdHlNb2R1bGUxLFxyXG4gICAgICAgICAgICB0ZXh0TW9kdWxlMSxcclxuICAgICAgICAgICAgc2l6ZU1vZHVsZTEsXHJcbiAgICAgICAgICAgIHNjcm9sbGVyTW9kdWxlMSxcclxuICAgICAgICAgICAgbm90ZU1vZHVsZTEsXHJcbiAgICAgICAgICAgIE1lc3NhZ2VzXHJcbiAgICAgICAgXSA9IHRoaXMubW9kdWxlc1xyXG5cclxuICAgICAgICBsZXQgZGF0YSA9IE9iamVjdC5hc3NpZ24oe30sIGRlZmF1bHRSUEMsIHRoaXMucHJvcHMucHJldmlldy5wcm9wcy5zZXR0aW5ncy5zdGF0ZS5kYXRhKVxyXG4gICAgICAgIHRpbWVzdGFtcENsYXNzID0gdGltZXN0YW1wQ2xhc3MgfHwgYWN0aXZpdHlNb2R1bGUxLnRpbWVzdGFtcFxyXG5cclxuICAgICAgICBsZXQgaW1hZ2VzID0gKCgpID0+IHtcclxuICAgICAgICAgICAgaWYoIWRhdGFbXCJhc3NldHMubGFyZ2VcIl0pcmV0dXJuIG51bGxcclxuICAgICAgICAgICAgbGV0IGltYWdlcyA9IFtdXHJcbiAgICAgICAgICAgIGlmKGRhdGFbXCJhc3NldHMubGFyZ2VcIl0pe1xyXG4gICAgICAgICAgICAgICAgaW1hZ2VzLnB1c2goPGltZyBhbHQ9XCJcIiBzcmM9e2BodHRwczovL2Nkbi5kaXNjb3JkYXBwLmNvbS9hcHAtYXNzZXRzLyR7ZGF0YS5hcHBsaWNhdGlvbl9pZH0vJHtkYXRhW1wiYXNzZXRzLmxhcmdlXCJdfS5wbmdgfSBjbGFzcz17YCR7YWN0aXZpdHlNb2R1bGUxLmFzc2V0c0xhcmdlSW1hZ2VQcm9maWxlfSAke2RhdGFbXCJhc3NldHMuc21hbGxcIl0gPyBhY3Rpdml0eU1vZHVsZTEuYXNzZXRzTGFyZ2VNYXNrUHJvZmlsZSA6IFwiXCJ9YH0gLz4pXHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgaWYoZGF0YVtcImFzc2V0cy5zbWFsbFwiXSl7XHJcbiAgICAgICAgICAgICAgICBpbWFnZXMucHVzaCg8aW1nIGFsdD1cIlwiIHNyYz17YGh0dHBzOi8vY2RuLmRpc2NvcmRhcHAuY29tL2FwcC1hc3NldHMvJHtkYXRhLmFwcGxpY2F0aW9uX2lkfS8ke2RhdGFbXCJhc3NldHMuc21hbGxcIl19LnBuZ2B9IGNsYXNzPXthY3Rpdml0eU1vZHVsZTEuYXNzZXRzU21hbGxJbWFnZVByb2ZpbGV9IC8+KVxyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIGlmKCFpbWFnZXMubGVuZ3RoKXJldHVybiBudWxsXHJcbiAgICAgICAgICAgIHJldHVybiA8ZGl2IGNsYXNzPXthY3Rpdml0eU1vZHVsZTEuYXNzZXRzfT5cclxuICAgICAgICAgICAgICAgIHtpbWFnZXN9XHJcbiAgICAgICAgICAgIDwvZGl2PlxyXG4gICAgICAgIH0pKClcclxuXHJcbiAgICAgICAgcmV0dXJuIFtcclxuICAgICAgICAgICAgPGRpdiBjbGFzc05hbWU9XCJsYy10YWIgbGMtdGFiLWJveC1zaGFkb3dcIj5cclxuICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9e2Ake2ZsZXhNb2R1bGUxLmZsZXh9ICR7c3R5bGluZ01vZHVsZTEudmVydGljYWx9ICR7c3R5bGluZ01vZHVsZTEuanVzdGlmeVN0YXJ0fSAke3N0eWxpbmdNb2R1bGUxLmFsaWduU3RyZXRjaH0gJHtzdHlsaW5nTW9kdWxlMS5ub1dyYXB9ICR7cm9vdE1vZHVsZTEucm9vdH1gfSBzdHlsZT17e2ZsZXg6IFwiMSAxIGF1dG9cIn19PlxyXG4gICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9e3Jvb3RNb2R1bGUxLnRvcFNlY3Rpb25QbGF5aW5nfT5cclxuICAgICAgICAgICAgICAgICAgICAgICAgPGhlYWRlciBjbGFzcz17cm9vdE1vZHVsZTEuaGVhZGVyfT5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9e2Ake3Jvb3RNb2R1bGUxLmF2YXRhcn0gJHthdmF0YXJNb2R1bGUxLndyYXBwZXJ9YH0gcm9sZT1cImltZ1wiIHN0eWxlPXt7d2lkdGg6IFwiODBweFwiLCBoZWlnaHQ6IFwiODBweFwifX0+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHN2ZyB3aWR0aD1cIjkyXCIgaGVpZ2h0PVwiODBcIiB2aWV3Qm94PVwiMCAwIDkyIDgwXCIgY2xhc3M9e2Ake2F2YXRhck1vZHVsZTEubWFza30gJHthdmF0YXJNb2R1bGUxLnN2Z31gfT5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGZvcmVpZ25PYmplY3QgeD1cIjBcIiB5PVwiMFwiIHdpZHRoPVwiODBcIiBoZWlnaHQ9XCI4MFwiIG1hc2s9XCJ1cmwoI3N2Zy1tYXNrLWF2YXRhci1zdGF0dXMtcm91bmQtODApXCI+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8aW1nIHNyYz17YXZhdGFyVVJMfSBhbHQ9XCIgXCIgY2xhc3M9e2F2YXRhck1vZHVsZTEuYXZhdGFyfSAvPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L2ZvcmVpZ25PYmplY3Q+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxTdGF0dXMgLz5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L3N2Zz5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvZGl2PlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz17YCR7cm9vdE1vZHVsZTEuaGVhZGVySW5mb31gfT5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPXtgJHtyb290TW9kdWxlMS5uYW1lVGFnfSAke25hbWVUYWdNb2R1bGUxLm5hbWVUYWd9YH0+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxzcGFuIGNsYXNzPXtgJHtyb290TW9kdWxlMS51c2VybmFtZX0gJHtyb290TW9kdWxlMS51c2VybmFtZX1gfT57dXNlci51c2VybmFtZX08L3NwYW4+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxzcGFuIGNsYXNzPXtyb290TW9kdWxlMS5kaXNjcmltaW5hdG9yfT4je3VzZXIuZGlzY3JpbWluYXRvcn08L3NwYW4+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9kaXY+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz17YCR7ZmxleE1vZHVsZTEuZmxleH0gJHtmbGV4TW9kdWxlMS5ob3Jpem9udGFsfSAke3N0eWxpbmdNb2R1bGUxLmp1c3RpZnlTdGFydH0gJHtzdHlsaW5nTW9kdWxlMS5hbGlnblN0cmV0Y2h9ICR7c3R5bGluZ01vZHVsZTEubm9XcmFwfSAke3Jvb3RNb2R1bGUxLnByb2ZpbGVCYWRnZXN9YH0gc3R5bGU9e3tmbGV4OiBcIjEgMSBhdXRvXCJ9fT5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPEJhZGdlcyAvPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvZGl2PlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9kaXY+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIDwvaGVhZGVyPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPXtyb290TW9kdWxlMS5oZWFkZXJGaWxsfT5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9e2Ake2FjdGl2aXR5TW9kdWxlMS5hY3Rpdml0eVByb2ZpbGV9ICR7cm9vdE1vZHVsZTEuYWN0aXZpdHl9YH0+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGgzIGNsYXNzPXtgJHthY3Rpdml0eU1vZHVsZTEuaGVhZGVyVGV4dE5vcm1hbH0gJHt0ZXh0TW9kdWxlMS5iYXNlfSAke3NpemVNb2R1bGUxLnNpemUxMn1gfT5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAge01lc3NhZ2VzLlVTRVJfQUNUSVZJVFlfSEVBREVSX1BMQVlJTkd9XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9oMz5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPXthY3Rpdml0eU1vZHVsZTEuYm9keU5vcm1hbH0+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHtpbWFnZXN9XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9e2ltYWdlcyA/IGFjdGl2aXR5TW9kdWxlMS5jb250ZW50SW1hZ2VzUHJvZmlsZSA6IGFjdGl2aXR5TW9kdWxlMS5jb250ZW50Tm9JbWFnZXNVc2VyUG9wb3V0fSBzdHlsZT17e2ZsZXg6IFwiMSAxIGF1dG9cIn19PlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgeygoKSA9PiB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYoIWRhdGEubmFtZSlyZXR1cm4gbnVsbFxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiA8aDMgY2xhc3M9e2Ake2FjdGl2aXR5TW9kdWxlMS5uYW1lTm9ybWFsfSAke3RleHRNb2R1bGUxLmJhc2V9ICR7c2l6ZU1vZHVsZTEuc2l6ZTE0fWB9IHRpdGxlPXtkYXRhLm5hbWV9PlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8c3BhbiBjbGFzcz17YWN0aXZpdHlNb2R1bGUxLmFjdGl2aXR5TmFtZX0+e2RhdGEubmFtZX08L3NwYW4+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9oMz5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0pKCl9XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB7KCgpID0+IHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZighZGF0YS5kZXRhaWxzKXJldHVybiBudWxsXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIDxkaXYgdGl0bGU9e2RhdGEudGl0bGV9IGNsYXNzPXthY3Rpdml0eU1vZHVsZTEuZGV0YWlsc30+e2RhdGEuZGV0YWlsc308L2Rpdj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0pKCl9XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB7KCgpID0+IHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZighZGF0YS5zdGF0ZSlyZXR1cm4gbnVsbFxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiA8ZGl2IGNsYXNzPXthY3Rpdml0eU1vZHVsZTEuc3RhdGV9PlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8c3BhbiB0aXRsZT17ZGF0YS5zdGF0ZX0+e2RhdGEuc3RhdGV9PC9zcGFuPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvZGl2PlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfSkoKX1cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHsoKCkgPT4ge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmKCFkYXRhW1widGltZXN0YW1wcy5zdGFydFwiXSlyZXR1cm4gbnVsbFxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxldCB0aW1lQ29tcG9uZW50ID0gdGltZXN0YW1wUmVuZGVyKFRpbWVzdGFtcCwgTWVzc2FnZXMpXHJcblxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiAoPGRpdiBjbGFzcz17YWN0aXZpdHlNb2R1bGUxLnRpbWVzdGFtcH0+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHtSZWFjdC5jcmVhdGVFbGVtZW50KHRpbWVDb21wb25lbnQsIHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRpbWVzdGFtcHM6IHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBlbmQ6IG51bGwsXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RhcnQ6IGRhdGFbXCJ0aW1lc3RhbXBzLnN0YXJ0XCJdXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0pfVxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvZGl2PilcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0pKCl9XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvZGl2PlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvZGl2PlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9kaXY+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIDwvZGl2PlxyXG4gICAgICAgICAgICAgICAgICAgIDwvZGl2PlxyXG5cdFx0XHRcdCAgICA8ZGl2IGNsYXNzPXtyb290TW9kdWxlMS5ib2R5fT5cclxuXHRcdFx0XHRcdCAgICA8ZGl2IGNsYXNzPXtgJHtzY3JvbGxlck1vZHVsZTEuc2Nyb2xsZXJXcmFwfSAke3Njcm9sbGVyTW9kdWxlMS5zY3JvbGxlckZhZGV9YH0+XHJcblx0XHRcdFx0XHRcdCAgICA8ZGl2IGNsYXNzPXtzY3JvbGxlck1vZHVsZTEuc2Nyb2xsZXJ9PlxyXG5cdFx0XHRcdFx0XHRcdCAgICA8ZGl2IGNsYXNzPXtyb290TW9kdWxlMS51c2VySW5mb1NlY3Rpb259PlxyXG5cdFx0XHRcdFx0XHRcdFx0ICAgIDxkaXYgY2xhc3M9e3Jvb3RNb2R1bGUxLnVzZXJJbmZvU2VjdGlvbkhlYWRlcn0+e01lc3NhZ2VzLk5PVEV9PC9kaXY+XHJcblx0XHRcdFx0XHRcdFx0XHQgICAgPGRpdiBjbGFzcz17YCR7cm9vdE1vZHVsZTEubm90ZX0gJHtub3RlTW9kdWxlMS5ub3RlfWB9PlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHRleHRhcmVhIHBsYWNlaG9sZGVyPXtNZXNzYWdlcy5OT1RFX1BMQUNFSE9MREVSfSBtYXhsZW5ndGg9XCIyNTZcIiBhdXRvY29ycmVjdD1cIm9mZlwiIFxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY2xhc3M9e0JETW9kdWxlcy5nZXQoZSA9PiBlLnNjcm9sbGJhckdob3N0SGFpcmxpbmUpWzBdLnNjcm9sbGJhckdob3N0SGFpcmxpbmV9IHN0eWxlPXt7aGVpZ2h0OiBcIjQwcHhcIn19IGRpc2FibGVkPlxyXG5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvdGV4dGFyZWE+XHJcblx0XHRcdFx0XHRcdFx0XHQgICAgPC9kaXY+XHJcblx0XHRcdFx0XHRcdFx0ICAgIDwvZGl2PlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxDb25uZWN0ZWRBY2NvdW50cyAvPlxyXG5cdFx0XHRcdFx0XHRcdDwvZGl2PlxyXG5cdFx0XHRcdFx0XHQ8L2Rpdj5cclxuXHRcdFx0XHRcdDwvZGl2PlxyXG5cdFx0XHRcdDwvZGl2PlxyXG4gICAgICAgICAgICA8L2Rpdj5cclxuICAgICAgICBdXHJcbiAgICB9XHJcbn1cclxuXHJcbmNsYXNzIENvbm5lY3RlZEFjY291bnRzIGV4dGVuZHMgUmVhY3QuQ29tcG9uZW50IHtcclxuICAgIHJlbmRlcigpe1xyXG4gICAgICAgIGxldCBhY2NvdW50cyA9IFtdXHJcbiAgICAgICAgbGV0IHJvb3RNb2R1bGUxID0gQkRNb2R1bGVzLmdldChlID0+IGUudG9wU2VjdGlvblN0cmVhbWluZylbMF1cclxuICAgICAgICBsZXQgQWNjb3VudE1vZHVsZTEgPSBCRE1vZHVsZXMuZ2V0KGUgPT4gZS5kZWZhdWx0ICYmIGUuZGVmYXVsdC5nZXRBY2NvdW50cylbMF0uZGVmYXVsdFxyXG5cclxuICAgICAgICBsZXQgYWNjcyA9IEFjY291bnRNb2R1bGUxLmdldEFjY291bnRzKCkuZmlsdGVyKGUgPT4gZS52aXNpYmlsaXR5ID09PSAxKVxyXG4gICAgICAgIGZvcihsZXQgYWNjIG9mIGFjY3Mpe1xyXG4gICAgICAgICAgICBhY2NvdW50cy5wdXNoKDxDb25uZWN0ZWRBY2NvdW50IGFjYz17YWNjfSAvPilcclxuICAgICAgICB9XHJcblxyXG4gICAgICAgIGlmKGFjY291bnRzLmxlbmd0aCA+IDApe1xyXG4gICAgICAgICAgICByZXR1cm4gKDxkaXYgY2xhc3M9e3Jvb3RNb2R1bGUxLnVzZXJJbmZvU2VjdGlvbn0+XHJcbiAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPXtyb290TW9kdWxlMS5jb25uZWN0ZWRBY2NvdW50c30+XHJcbiAgICAgICAgICAgICAgICAgICAge2FjY291bnRzfVxyXG4gICAgICAgICAgICAgICAgPC9kaXY+XHJcbiAgICAgICAgICAgIDwvZGl2PilcclxuICAgICAgICB9XHJcbiAgICAgICAgcmV0dXJuIG51bGxcclxuICAgIH1cclxufVxyXG5cclxuY2xhc3MgQ29ubmVjdGVkQWNjb3VudCBleHRlbmRzIFJlYWN0LkNvbXBvbmVudCB7XHJcbiAgICByZW5kZXIoKXtcclxuICAgICAgICBsZXQgW1xyXG4gICAgICAgICAgICBmbGV4TW9kdWxlMSxcclxuICAgICAgICAgICAgc3R5bGluZ01vZHVsZTEsXHJcbiAgICAgICAgICAgIHJvb3RNb2R1bGUxLFxyXG4gICAgICAgICAgICBmbG93ZXJNb2R1bGUxLFxyXG4gICAgICAgICAgICBhbmNob3JNb2R1bGUxLFxyXG4gICAgICAgICAgICBTb2NpYWxDb25zdGFudHNcclxuICAgICAgICBdID0gW1xyXG4gICAgICAgICAgICBCRE1vZHVsZXMuZ2V0KGUgPT4gZS5mbGV4ICYmIGUuX2hvcml6b250YWwpWzBdLFxyXG4gICAgICAgICAgICBCRE1vZHVsZXMuZ2V0KGUgPT4gZS52ZXJ0aWNhbCAmJiBlLmFsaWduU3RyZXRjaCAmJiAhZS5zdHJlYW1lck1vZGVFbmFibGVkQnRuKVswXSxcclxuICAgICAgICAgICAgQkRNb2R1bGVzLmdldChlID0+IGUudG9wU2VjdGlvblN0cmVhbWluZylbMF0sXHJcbiAgICAgICAgICAgIEJETW9kdWxlcy5nZXQoZSA9PiBlLmZsb3dlclN0YXJDb250YWluZXIpWzBdLFxyXG4gICAgICAgICAgICBCRE1vZHVsZXMuZ2V0KGUgPT4gZS5hbmNob3IpWzBdLFxyXG4gICAgICAgICAgICBCRE1vZHVsZXMuZ2V0KGUgPT4gZS5kZWZhdWx0ICYmIGUuZGVmYXVsdC5nZXQgJiYgZS5kZWZhdWx0Lm1hcClbMF0uZGVmYXVsdFxyXG4gICAgICAgIF1cclxuICAgICAgICBsZXQgYWNjID0gdGhpcy5wcm9wcy5hY2NcclxuICAgICAgICBsZXQgY29uc3RhbnRzU29jaWFsID0gU29jaWFsQ29uc3RhbnRzLmdldChhY2MudHlwZSlcclxuICAgICAgICByZXR1cm4gKDxkaXYgY2xhc3M9e2Ake2ZsZXhNb2R1bGUxLmZsZXh9ICR7ZmxleE1vZHVsZTEuaG9yaXpvbnRhbH0gJHtzdHlsaW5nTW9kdWxlMS5qdXN0aWZ5U3RhcnR9ICR7c3R5bGluZ01vZHVsZTEuYWxpZ25DZW50ZXJ9ICR7c3R5bGluZ01vZHVsZTEubm9XcmFwfSAke3Jvb3RNb2R1bGUxLmNvbm5lY3RlZEFjY291bnR9YH0gc3R5bGU9e3tmbGV4OiBcIjAgMSBhdXRvXCJ9fT5cclxuICAgICAgICAgICAgPGltZyBhbHQ9e2BMb2dvICR7Y29uc3RhbnRzU29jaWFsLm5hbWV9YH0gY2xhc3M9e3Jvb3RNb2R1bGUxLmNvbm5lY3RlZEFjY291bnRJY29ufSBzcmM9e2NvbnN0YW50c1NvY2lhbC5pY29uLmNvbG9yIHx8IGNvbnN0YW50c1NvY2lhbC5pY29uLndoaXRlIHx8IGNvbnN0YW50c1NvY2lhbC5pY29uLmdyZXl9IC8+XHJcbiAgICAgICAgICAgIDxkaXYgY2xhc3M9e3Jvb3RNb2R1bGUxLmNvbm5lY3RlZEFjY291bnROYW1lSW5uZXJ9PlxyXG4gICAgICAgICAgICAgICAgPGRpdiBjbGFzcz17cm9vdE1vZHVsZTEuY29ubmVjdGVkQWNjb3VudE5hbWV9PnthY2MubmFtZX08L2Rpdj5cclxuICAgICAgICAgICAgICAgIHthY2MudmVyaWZpZWQgPyAoPHNwYW4+XHJcbiAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz17YCR7Zmxvd2VyTW9kdWxlMS5mbG93ZXJTdGFyQ29udGFpbmVyfSAke3Jvb3RNb2R1bGUxLmNvbm5lY3RlZEFjY291bnRWZXJpZmllZEljb259YH0gc3R5bGU9e3t3aWR0aDogXCIxNnB4XCIsIGhlaWdodDogXCIxNnB4XCJ9fT5cclxuICAgICAgICAgICAgICAgICAgICAgICAgPHN2ZyBjbGFzcz17Zmxvd2VyTW9kdWxlMS5mbG93ZXJTdGFyfSB3aWR0aD1cIjE2XCIgaGVpZ2h0PVwiMTZcIiB2aWV3Qm94PVwiMCAwIDE2IDE1LjJcIj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxwYXRoIGZpbGw9XCIjNGY1NDVjXCIgZmlsbC1ydWxlPVwiZXZlbm9kZFwiIGQ9XCJtMTYgNy42YzAgLjc5LTEuMjggMS4zOC0xLjUyIDIuMDlzLjQ0IDIgMCAyLjU5LTEuODQuMzUtMi40Ni44LS43OSAxLjg0LTEuNTQgMi4wOS0xLjY3LS44LTIuNDctLjgtMS43NSAxLTIuNDcuOC0uOTItMS42NC0xLjU0LTIuMDktMi0uMTgtMi40Ni0uOC4yMy0xLjg0IDAtMi41OS0xLjU0LTEuMy0xLjU0LTIuMDkgMS4yOC0xLjM4IDEuNTItMi4wOS0uNDQtMiAwLTIuNTkgMS44NS0uMzUgMi40OC0uOC43OC0xLjg0IDEuNTMtMi4xMiAxLjY3LjgzIDIuNDcuODMgMS43NS0xIDIuNDctLjguOTEgMS42NCAxLjUzIDIuMDkgMiAuMTggMi40Ni44LS4yMyAxLjg0IDAgMi41OSAxLjU0IDEuMyAxLjU0IDIuMDl6XCI+PC9wYXRoPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICA8L3N2Zz5cclxuICAgICAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz17Zmxvd2VyTW9kdWxlMS5jaGlsZENvbnRhaW5lcn0+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8c3ZnIHdpZHRoPVwiMTZcIiBoZWlnaHQ9XCIxNlwiIHZpZXdCb3g9XCIwIDAgMTYgMTUuMlwiPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxwYXRoIGQ9XCJNNy40LDExLjE3LDQsOC42Miw1LDcuMjZsMiwxLjUzTDEwLjY0LDRsMS4zNiwxWlwiIGZpbGw9XCIjZmZmZmZmXCI+PC9wYXRoPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9zdmc+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIDwvZGl2PlxyXG4gICAgICAgICAgICAgICAgICAgIDwvZGl2PlxyXG4gICAgICAgICAgICAgICAgPC9zcGFuPikgOiBudWxsfVxyXG4gICAgICAgICAgICA8L2Rpdj5cclxuICAgICAgICAgICAgPGEgY2xhc3M9e2Ake2FuY2hvck1vZHVsZTEuYW5jaG9yfSAke2FuY2hvck1vZHVsZTEuYW5jaG9yVW5kZXJsaW5lT25Ib3Zlcn1gfSByZWw9XCJub3JlZmVycmVyIG5vb3BlbmVyXCIgdGFyZ2V0PVwiX2JsYW5rXCIgcm9sZT1cImJ1dHRvblwiIHRhYmluZGV4PVwiMFwiPlxyXG4gICAgICAgICAgICAgICAgPHN2ZyBjbGFzcz17cm9vdE1vZHVsZTEuY29ubmVjdGVkQWNjb3VudE9wZW5JY29ufSB3aWR0aD1cIjI0XCIgaGVpZ2h0PVwiMjRcIiB2aWV3Qm94PVwiMCAwIDI0IDI0XCI+XHJcbiAgICAgICAgICAgICAgICAgICAgPHBhdGggZmlsbD1cImN1cnJlbnRDb2xvclwiIGQ9XCJNMTAgNVYzSDUuMzc1QzQuMDY1MTkgMyAzIDQuMDY1MTkgMyA1LjM3NVYxOC42MjVDMyAxOS45MzYgNC4wNjUxOSAyMSA1LjM3NSAyMUgxOC42MjVDMTkuOTM2IDIxIDIxIDE5LjkzNiAyMSAxOC42MjVWMTRIMTlWMTlINVY1SDEwWlwiPjwvcGF0aD5cclxuICAgICAgICAgICAgICAgICAgICA8cGF0aCBmaWxsPVwiY3VycmVudENvbG9yXCIgZD1cIk0yMSAyLjk5OTAySDE0VjQuOTk5MDJIMTcuNTg2TDkuMjkyOTcgMTMuMjkyTDEwLjcwNyAxNC43MDZMMTkgNi40MTMwMlY5Ljk5OTAySDIxVjIuOTk5MDJaXCI+PC9wYXRoPlxyXG4gICAgICAgICAgICAgICAgPC9zdmc+XHJcbiAgICAgICAgICAgIDwvYT5cclxuICAgICAgICA8L2Rpdj4pXHJcbiAgICB9XHJcbn1cclxuXHJcbmNsYXNzIEJhZGdlcyBleHRlbmRzIFJlYWN0LkNvbXBvbmVudCB7XHJcbiAgICByZW5kZXIoKXtcclxuICAgICAgICBsZXQgdXNlciA9IEJETW9kdWxlcy5nZXQoZSA9PiBlLmRlZmF1bHQgJiYgZS5kZWZhdWx0LmdldEN1cnJlbnRVc2VyKVswXS5kZWZhdWx0LmdldEN1cnJlbnRVc2VyKClcclxuICAgICAgICBsZXQgcm9vdE1vZHVsZSA9IEJETW9kdWxlcy5nZXQoZSA9PiBlLnRvcFNlY3Rpb25TdHJlYW1pbmcpWzBdXHJcbiAgICAgICAgbGV0IFVzZXJGbGFncyA9IEJETW9kdWxlcy5nZXQoZSA9PiBlLlVzZXJGbGFncylbMF0uVXNlckZsYWdzXHJcbiAgICAgICAgbGV0IGJhZGdlcyA9IFtdXHJcbiAgICAgICAgbGV0IHNlcmlhbGl6ZWQgPSBbXVxyXG5cclxuICAgICAgICBmb3IobGV0IGZsYWdOYW1lIGluIFVzZXJGbGFncyl7XHJcbiAgICAgICAgICAgIGlmKHVzZXIuaGFzRmxhZyhVc2VyRmxhZ3NbZmxhZ05hbWVdKSlzZXJpYWxpemVkLnB1c2goZmxhZ05hbWUpXHJcbiAgICAgICAgfVxyXG5cclxuICAgICAgICBmb3IobGV0IGZsYWdOYW1lIG9mIHNlcmlhbGl6ZWQpe1xyXG4gICAgICAgICAgICBsZXQgc2VhcmNoYWJsZSA9IGBwcm9maWxlQmFkZ2Uke2ZsYWdOYW1lLnRvTG93ZXJDYXNlKCkucmVwbGFjZSgvXy9nLCBcIiBcIikuc3BsaXQoXCIgXCIpLm1hcChlID0+IGVbMF0udG9VcHBlckNhc2UoKStlLnNsaWNlKDEpKS5qb2luKFwiXCIpfWBcclxuICAgICAgICAgICAgc2VhcmNoYWJsZSA9IHNlYXJjaGFibGUucmVwbGFjZShcIkh5cGVzcXVhZE9ubGluZVwiLCBcIkh5cGVTcXVhZE9ubGluZVwiKVxyXG4gICAgICAgICAgICBpZighcm9vdE1vZHVsZVtzZWFyY2hhYmxlXSljb250aW51ZVxyXG4gICAgICAgICAgICBiYWRnZXMucHVzaCg8QmFkZ2UgbmFtZT17c2VhcmNoYWJsZX0vPilcclxuICAgICAgICB9XHJcblxyXG4gICAgICAgIGlmKHVzZXIuaGFzUHJlbWl1bVN1YnNjcmlwdGlvbil7XHJcbiAgICAgICAgICAgIGJhZGdlcy5wdXNoKDxCYWRnZSBuYW1lPVwicHJvZmlsZUJhZGdlUHJlbWl1bVwiIC8+KVxyXG4gICAgICAgIH1cclxuICAgICAgICBcclxuICAgICAgICByZXR1cm4gYmFkZ2VzXHJcbiAgICB9XHJcbn1cclxuXHJcbmNsYXNzIEJhZGdlIGV4dGVuZHMgUmVhY3QuQ29tcG9uZW50IHtcclxuICAgIHJlbmRlcigpe1xyXG4gICAgICAgIGxldCByb290TW9kdWxlMSA9IEJETW9kdWxlcy5nZXQoZSA9PiBlLnRvcFNlY3Rpb25TdHJlYW1pbmcpWzBdXHJcblxyXG4gICAgICAgIHJldHVybiAoPGRpdiBjbGFzcz17cm9vdE1vZHVsZTEucHJvZmlsZUJhZGdlV3JhcHBlcn0+XHJcbiAgICAgICAgICAgIDxkaXY+XHJcbiAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwiXCIgcm9sZT1cImJ1dHRvblwiIHRhYmluZGV4PVwiMFwiPlxyXG4gICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9e2Ake3Jvb3RNb2R1bGUxLnByb2ZpbGVCYWRnZX0gJHtyb290TW9kdWxlMVt0aGlzLnByb3BzLm5hbWVdfWB9PlxyXG5cclxuICAgICAgICAgICAgICAgICAgICA8L2Rpdj5cclxuICAgICAgICAgICAgICAgIDwvZGl2PlxyXG4gICAgICAgICAgICA8L2Rpdj5cclxuICAgICAgICA8L2Rpdj4pXHJcbiAgICB9XHJcbn1cclxuXHJcbmNsYXNzIFRpbWVzdGFtcCBleHRlbmRzIFJlYWN0LkNvbXBvbmVudCB7XHJcbiAgICByZW5kZXIoKXtcclxuICAgICAgICByZXR1cm4gPGRpdiBjbGFzc05hbWU9e3RpbWVzdGFtcENsYXNzfT5cclxuICAgICAgICAgICAge3RoaXMucHJvcHMubWVzc2FnZX1cclxuICAgICAgICA8L2Rpdj5cclxuICAgIH1cclxufSIsImltcG9ydCBCRFYyIGZyb20gXCIuLi8uLi9tb2R1bGVzL3YyXCI7XHJcbmltcG9ydCBET00gZnJvbSBcIi4uLy4uL21vZHVsZXMvZG9tdG9vbHNcIjtcclxuXHJcbmV4cG9ydCBkZWZhdWx0IGNsYXNzIFYyQ19MYXllciBleHRlbmRzIEJEVjIucmVhY3RDb21wb25lbnQge1xyXG5cclxuICAgIGNvbnN0cnVjdG9yKHByb3BzKSB7XHJcbiAgICAgICAgc3VwZXIocHJvcHMpO1xyXG4gICAgICAgIHRoaXMua2V5dXBMaXN0ZW5lciA9IHRoaXMua2V5dXBMaXN0ZW5lci5iaW5kKHRoaXMpO1xyXG4gICAgfVxyXG5cclxuICAgIGtleXVwTGlzdGVuZXIoZSkge1xyXG4gICAgICAgIGlmIChlLndoaWNoID09PSAyNykge1xyXG4gICAgICAgICAgICBCRFYyLnJlYWN0RG9tLnVubW91bnRDb21wb25lbnRBdE5vZGUodGhpcy5yZWZzLnJvb3QucGFyZW50Tm9kZSk7XHJcbiAgICAgICAgfVxyXG4gICAgfVxyXG5cclxuICAgIGNvbXBvbmVudERpZE1vdW50KCkge1xyXG4gICAgICAgIHdpbmRvdy5hZGRFdmVudExpc3RlbmVyKFwia2V5dXBcIiwgdGhpcy5rZXl1cExpc3RlbmVyKTtcclxuXHJcbiAgICAgICAgY29uc3QgdGhpc05vZGUgPSBET00ucXVlcnkoYCMke3RoaXMucHJvcHMuaWR9YCk7XHJcbiAgICAgICAgRE9NLmFuaW1hdGUoe1xyXG4gICAgICAgICAgICBkdXJhdGlvbjogMjAwLFxyXG4gICAgICAgICAgICB1cGRhdGU6IGZ1bmN0aW9uKHByb2dyZXNzKSB7XHJcbiAgICAgICAgICAgICAgICB0aGlzTm9kZS5zdHlsZS50cmFuc2Zvcm0gPSBgc2NhbGUoJHsxLjEgLSAwLjEgKiBwcm9ncmVzc30pIHRyYW5zbGF0ZVooMHB4KWA7XHJcbiAgICAgICAgICAgICAgICB0aGlzTm9kZS5zdHlsZS5vcGFjaXR5ID0gcHJvZ3Jlc3M7XHJcbiAgICAgICAgICAgICAgICBpZiAocHJvZ3Jlc3MgPT0gMSkge1xyXG4gICAgICAgICAgICAgICAgICAgIHNldEltbWVkaWF0ZSgoKSA9PiB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIHRoaXNOb2RlLnN0eWxlLnRyYW5zZm9ybSA9IFwiXCI7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIHRoaXNOb2RlLnN0eWxlLm9wYWNpdHkgPSBcIlwiO1xyXG4gICAgICAgICAgICAgICAgICAgIH0pO1xyXG4gICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgfSk7XHJcbiAgICB9XHJcblxyXG4gICAgY29tcG9uZW50V2lsbFVubW91bnQoKSB7XHJcbiAgICAgICAgd2luZG93LnJlbW92ZUV2ZW50TGlzdGVuZXIoXCJrZXl1cFwiLCB0aGlzLmtleXVwTGlzdGVuZXIpO1xyXG5cclxuICAgICAgICBjb25zdCB0aGlzTm9kZSA9IERPTS5xdWVyeShgIyR7dGhpcy5wcm9wcy5pZH1gKTtcclxuICAgICAgICBET00uYW5pbWF0ZSh7XHJcbiAgICAgICAgICAgIGR1cmF0aW9uOiAyMDAsXHJcbiAgICAgICAgICAgIHVwZGF0ZTogZnVuY3Rpb24ocHJvZ3Jlc3MpIHtcclxuICAgICAgICAgICAgICAgIHRoaXNOb2RlLnN0eWxlLnRyYW5zZm9ybSA9IGBzY2FsZSgkezEuMSAtIDAuMSAqICgxIC0gcHJvZ3Jlc3MpfSkgdHJhbnNsYXRlWigwcHgpYDtcclxuICAgICAgICAgICAgICAgIHRoaXNOb2RlLnN0eWxlLm9wYWNpdHkgPSAxIC0gcHJvZ3Jlc3M7XHJcbiAgICAgICAgICAgICAgICBpZiAocHJvZ3Jlc3MgPT0gMSkge1xyXG4gICAgICAgICAgICAgICAgICAgIHNldEltbWVkaWF0ZSgoKSA9PiB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIHRoaXNOb2RlLnJlbW92ZSgpO1xyXG4gICAgICAgICAgICAgICAgICAgIH0pO1xyXG4gICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgfSk7XHJcblxyXG4gICAgICAgIGNvbnN0IGxheWVyID0gRE9NLnF1ZXJ5KFwiLnB1YmxpY1NlcnZlcnNPcGVuXCIpO1xyXG4gICAgICAgIGxheWVyLmNsYXNzTGlzdC5yZW1vdmUoXCJwdWJsaWNTZXJ2ZXJzT3BlblwiKTtcclxuICAgICAgICBET00uYW5pbWF0ZSh7XHJcbiAgICAgICAgICAgIGR1cmF0aW9uOiAyMDAsXHJcbiAgICAgICAgICAgIHVwZGF0ZTogZnVuY3Rpb24ocHJvZ3Jlc3MpIHtcclxuICAgICAgICAgICAgICAgIGxheWVyLnN0eWxlLnRyYW5zZm9ybSA9IGBzY2FsZSgkezAuMDcgKiBwcm9ncmVzcyArIDAuOTN9KSB0cmFuc2xhdGVaKDBweClgO1xyXG4gICAgICAgICAgICAgICAgbGF5ZXIuc3R5bGUub3BhY2l0eSA9IHByb2dyZXNzO1xyXG4gICAgICAgICAgICAgICAgaWYgKHByb2dyZXNzID09IDEpIHtcclxuICAgICAgICAgICAgICAgICAgICBzZXRJbW1lZGlhdGUoKCkgPT4ge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICBsYXllci5zdHlsZS50cmFuc2Zvcm0gPSBcIlwiO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICBsYXllci5zdHlsZS5vcGFjaXR5ID0gXCJcIjtcclxuICAgICAgICAgICAgICAgICAgICB9KTtcclxuICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgfVxyXG4gICAgICAgIH0pO1xyXG4gICAgfVxyXG5cclxuICAgIGNvbXBvbmVudFdpbGxNb3VudCgpIHtcclxuICAgICAgICBjb25zdCBsYXllciA9IERPTS5xdWVyeShcIltjbGFzcyo9XFxcImxheWVyLVxcXCJdXCIpO1xyXG4gICAgICAgIGxheWVyLmNsYXNzTGlzdC5hZGQoXCJwdWJsaWNTZXJ2ZXJzT3BlblwiKTtcclxuICAgICAgICBET00uYW5pbWF0ZSh7XHJcbiAgICAgICAgICAgIGR1cmF0aW9uOiAyMDAsXHJcbiAgICAgICAgICAgIHVwZGF0ZTogZnVuY3Rpb24ocHJvZ3Jlc3MpIHtcclxuICAgICAgICAgICAgICAgIGxheWVyLnN0eWxlLnRyYW5zZm9ybSA9IGBzY2FsZSgkezAuMDcgKiAoMSAtIHByb2dyZXNzKSArIDAuOTN9KSB0cmFuc2xhdGVaKDBweClgO1xyXG4gICAgICAgICAgICAgICAgbGF5ZXIuc3R5bGUub3BhY2l0eSA9IDEgLSBwcm9ncmVzcztcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgIH0pO1xyXG4gICAgfVxyXG5cclxuICAgIHJlbmRlcigpIHtcclxuICAgICAgICByZXR1cm4gQkRWMi5yZWFjdC5jcmVhdGVFbGVtZW50KFxyXG4gICAgICAgICAgICBcImRpdlwiLFxyXG4gICAgICAgICAgICB7Y2xhc3NOYW1lOiBcImxheWVyIGJkLWxheWVyIFwiK0JETW9kdWxlcy5nZXQoZSA9PiBlLmxheWVyICYmIGUuYW5pbWF0aW5nKVswXS5sYXllciwgaWQ6IHRoaXMucHJvcHMuaWQsIHJlZjogXCJyb290XCIsIHN0eWxlOiB7b3BhY2l0eTogMCwgdHJhbnNmb3JtOiBcInNjYWxlKDEuMSkgdHJhbnNsYXRlWigwcHgpXCJ9fSxcclxuICAgICAgICAgICAgdGhpcy5wcm9wcy5jaGlsZHJlblxyXG4gICAgICAgICk7XHJcbiAgICB9XHJcbn0iLCJpbXBvcnQgQkRWMiBmcm9tIFwiLi4vLi4vbW9kdWxlcy92MlwiO1xyXG5cclxuaW1wb3J0IFRvb2xzIGZyb20gXCIuLi90b29sc1wiO1xyXG5pbXBvcnQgU2V0dGluZ3NUaXRsZSBmcm9tIFwiLi4vc2V0dGluZ3NUaXRsZVwiO1xyXG5pbXBvcnQgVGFiQmFyU2VwYXJhdG9yIGZyb20gXCIuLi90YWJCYXJTZXBhcmF0b3JcIjtcclxuaW1wb3J0IFRhYkJhckhlYWRlciBmcm9tIFwiLi4vdGFiQmFySGVhZGVyXCI7XHJcbmltcG9ydCBUYWJCYXJJdGVtIGZyb20gXCIuLi90YWJCYXJJdGVtXCI7XHJcblxyXG5pbXBvcnQgU2VydmVyQ2FyZCBmcm9tIFwiLi9zZXJ2ZXJDYXJkXCI7XHJcbmltcG9ydCBTaWRlYmFyVmlldyBmcm9tIFwiLi9zaWRlYmFyVmlld1wiO1xyXG5cclxuZXhwb3J0IGRlZmF1bHQgY2xhc3MgVjJDX1B1YmxpY1NlcnZlcnMgZXh0ZW5kcyBCRFYyLnJlYWN0Q29tcG9uZW50IHtcclxuXHJcbiAgICBjb25zdHJ1Y3Rvcihwcm9wcykge1xyXG4gICAgICAgIHN1cGVyKHByb3BzKTtcclxuICAgICAgICB0aGlzLnNldEluaXRpYWxTdGF0ZSgpO1xyXG4gICAgICAgIHRoaXMuY2xvc2UgPSB0aGlzLmNsb3NlLmJpbmQodGhpcyk7XHJcbiAgICAgICAgdGhpcy5jaGFuZ2VDYXRlZ29yeSA9IHRoaXMuY2hhbmdlQ2F0ZWdvcnkuYmluZCh0aGlzKTtcclxuICAgICAgICB0aGlzLnNlYXJjaCA9IHRoaXMuc2VhcmNoLmJpbmQodGhpcyk7XHJcbiAgICAgICAgdGhpcy5zZWFyY2hLZXlEb3duID0gdGhpcy5zZWFyY2hLZXlEb3duLmJpbmQodGhpcyk7XHJcbiAgICAgICAgdGhpcy5jaGVja0Nvbm5lY3Rpb24gPSB0aGlzLmNoZWNrQ29ubmVjdGlvbi5iaW5kKHRoaXMpO1xyXG4gICAgICAgIHRoaXMuam9pbiA9IHRoaXMuam9pbi5iaW5kKHRoaXMpO1xyXG4gICAgICAgIHRoaXMuY29ubmVjdCA9IHRoaXMuY29ubmVjdC5iaW5kKHRoaXMpO1xyXG5cclxuICAgICAgICB0aGlzLkd1aWxkU3RvcmUgPSBCRFYyLldlYnBhY2tNb2R1bGVzLmZpbmRCeVVuaXF1ZVByb3BlcnRpZXMoW1wiZ2V0R3VpbGRzXCJdKTtcclxuICAgICAgICB0aGlzLkF2YXRhckRlZmF1bHRzID0gQkRWMi5XZWJwYWNrTW9kdWxlcy5maW5kQnlVbmlxdWVQcm9wZXJ0aWVzKFtcImdldFVzZXJBdmF0YXJVUkxcIiwgXCJERUZBVUxUX0FWQVRBUlNcIl0pO1xyXG4gICAgICAgIHRoaXMuSW52aXRlQWN0aW9ucyA9IEJEVjIuV2VicGFja01vZHVsZXMuZmluZEJ5VW5pcXVlUHJvcGVydGllcyhbXCJhY2NlcHRJbnZpdGVcIl0pO1xyXG4gICAgICAgIHRoaXMuU29ydGVkR3VpbGRTdG9yZSA9IEJEVjIuV2VicGFja01vZHVsZXMuZmluZEJ5VW5pcXVlUHJvcGVydGllcyhbXCJnZXRTb3J0ZWRHdWlsZHNcIl0pO1xyXG4gICAgfVxyXG5cclxuICAgIGNvbXBvbmVudERpZE1vdW50KCkge1xyXG4gICAgICAgIHRoaXMuY2hlY2tDb25uZWN0aW9uKCk7XHJcbiAgICAgfVxyXG5cclxuICAgIHNldEluaXRpYWxTdGF0ZSgpIHtcclxuICAgICAgICB0aGlzLnN0YXRlID0ge1xyXG4gICAgICAgICAgICBzZWxlY3RlZENhdGVnb3J5OiAtMSxcclxuICAgICAgICAgICAgdGl0bGU6IFwiTG9hZGluZy4uLlwiLFxyXG4gICAgICAgICAgICBsb2FkaW5nOiB0cnVlLFxyXG4gICAgICAgICAgICBzZXJ2ZXJzOiBbXSxcclxuICAgICAgICAgICAgbmV4dDogbnVsbCxcclxuICAgICAgICAgICAgY29ubmVjdGlvbjoge1xyXG4gICAgICAgICAgICAgICAgc3RhdGU6IDAsXHJcbiAgICAgICAgICAgICAgICB1c2VyOiBudWxsXHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICB9O1xyXG4gICAgfVxyXG5cclxuICAgIGNsb3NlKCkge1xyXG4gICAgICAgIEJEVjIucmVhY3REb20udW5tb3VudENvbXBvbmVudEF0Tm9kZShkb2N1bWVudC5nZXRFbGVtZW50QnlJZCh0aGlzLnByb3BzLnJvb3RJZCkpO1xyXG4gICAgfVxyXG5cclxuICAgIHNlYXJjaChxdWVyeSwgY2xlYXIpIHtcclxuICAgICAgICBjb25zdCBzZWxmID0gdGhpcztcclxuICAgICAgICBmZXRjaChgJHtzZWxmLmVuZFBvaW50fSR7cXVlcnl9JHtxdWVyeSA/IFwiJnNjaGVtYT1uZXdcIiA6IFwiP3NjaGVtYT1uZXdcIn1gLCB7XHJcbiAgICAgICAgICAgIG1ldGhvZDogXCJnZXRcIlxyXG4gICAgICAgIH0pLnRoZW4oYXN5bmMgcmVzID0+IHtcclxuICAgICAgICAgICAgaWYocmVzLnN0YXR1cyAhPT0gMjAwKXRocm93IGF3YWl0IHJlcy50ZXh0KClcclxuICAgICAgICAgICAgbGV0IGRhdGEgPSBhd2FpdCByZXMuanNvbigpXHJcbiAgICAgICAgICAgIFxyXG4gICAgICAgICAgICBsZXQgc2VydmVycyA9IGRhdGEucmVzdWx0cy5yZWR1Y2UoKGFyciwgc2VydmVyKSA9PiB7XHJcbiAgICAgICAgICAgICAgICBzZXJ2ZXIuam9pbmVkID0gZmFsc2U7XHJcbiAgICAgICAgICAgICAgICBhcnIucHVzaChzZXJ2ZXIpO1xyXG4gICAgICAgICAgICAgICAgLy8gYXJyLnB1c2goPFNlcnZlckNhcmQgc2VydmVyPXtzZXJ2ZXJ9IGpvaW49e3NlbGYuam9pbn0vPik7XHJcbiAgICAgICAgICAgICAgICByZXR1cm4gYXJyO1xyXG4gICAgICAgICAgICB9LCBbXSk7XHJcblxyXG4gICAgICAgICAgICBpZiAoIWNsZWFyKSB7XHJcbiAgICAgICAgICAgICAgICBzZXJ2ZXJzID0gc2VsZi5zdGF0ZS5zZXJ2ZXJzLmNvbmNhdChzZXJ2ZXJzKTtcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICBlbHNlIHtcclxuICAgICAgICAgICAgICAgIC8vc2VydmVycy51bnNoaWZ0KHNlbGYuYmRTZXJ2ZXIpO1xyXG4gICAgICAgICAgICB9XHJcblxyXG4gICAgICAgICAgICBsZXQgZW5kID0gZGF0YS5zaXplICsgZGF0YS5mcm9tO1xyXG4gICAgICAgICAgICBkYXRhLm5leHQgPSBgP2Zyb209JHtlbmR9YDtcclxuICAgICAgICAgICAgaWYgKHNlbGYuc3RhdGUudGVybSkgZGF0YS5uZXh0ICs9IGAmdGVybT0ke3NlbGYuc3RhdGUudGVybX1gO1xyXG4gICAgICAgICAgICBpZiAoc2VsZi5zdGF0ZS5zZWxlY3RlZENhdGVnb3J5KSBkYXRhLm5leHQgKz0gYCZjYXRlZ29yeT0ke3NlbGYuY2F0ZWdvcnlCdXR0b25zW3NlbGYuc3RhdGUuc2VsZWN0ZWRDYXRlZ29yeV19YDtcclxuICAgICAgICAgICAgaWYgKGVuZCA+PSBkYXRhLnRvdGFsKSB7XHJcbiAgICAgICAgICAgICAgICBlbmQgPSBkYXRhLnRvdGFsO1xyXG4gICAgICAgICAgICAgICAgZGF0YS5uZXh0ID0gbnVsbDtcclxuICAgICAgICAgICAgfVxyXG5cclxuICAgICAgICAgICAgbGV0IHRpdGxlID0gYFNob3dpbmcgMS0ke2VuZH0gb2YgJHtkYXRhLnRvdGFsfSByZXN1bHRzIGluICR7c2VsZi5jYXRlZ29yeUJ1dHRvbnNbc2VsZi5zdGF0ZS5zZWxlY3RlZENhdGVnb3J5XX1gO1xyXG4gICAgICAgICAgICBpZiAoc2VsZi5zdGF0ZS50ZXJtKSB0aXRsZSArPSBgIGZvciAke3NlbGYuc3RhdGUudGVybX1gO1xyXG5cclxuICAgICAgICAgICAgc2VsZi5zZXRTdGF0ZSh7XHJcbiAgICAgICAgICAgICAgICBsb2FkaW5nOiBmYWxzZSxcclxuICAgICAgICAgICAgICAgIHRpdGxlOiB0aXRsZSxcclxuICAgICAgICAgICAgICAgIHNlcnZlcnM6IHNlcnZlcnMsXHJcbiAgICAgICAgICAgICAgICBuZXh0OiBkYXRhLm5leHRcclxuICAgICAgICAgICAgfSk7XHJcblxyXG4gICAgICAgICAgICBpZiAoY2xlYXIpIHtcclxuICAgICAgICAgICAgICAgIC8vY29uc29sZS5sb2coc2VsZik7XHJcbiAgICAgICAgICAgICAgICBzZWxmLnJlZnMuc2J2LnJlZnMuY29udGVudFNjcm9sbGVyLnNjcm9sbFRvcCA9IDA7XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICB9KS5jYXRjaCgoZXJyKSA9PiB7XHJcbiAgICAgICAgICAgIGNvbnNvbGUuZXJyb3IoZXJyKVxyXG4gICAgICAgICAgICByZXR1cm4gc2VsZi5zZXRTdGF0ZSh7XHJcbiAgICAgICAgICAgICAgICBsb2FkaW5nOiBmYWxzZSxcclxuICAgICAgICAgICAgICAgIHRpdGxlOiBcIkZhaWxlZCB0byBsb2FkIHNlcnZlcnMuIENoZWNrIGNvbnNvbGUgZm9yIGRldGFpbHNcIlxyXG4gICAgICAgICAgICB9KTtcclxuICAgICAgICB9KVxyXG4gICAgfVxyXG5cclxuICAgIGFzeW5jIGpvaW4oc2VydmVyQ2FyZCkge1xyXG4gICAgICAgIGlmIChzZXJ2ZXJDYXJkLnByb3BzLnBpbm5lZCkgcmV0dXJuIHRoaXMuSW52aXRlQWN0aW9ucy5hY2NlcHRJbnZpdGUoc2VydmVyQ2FyZC5wcm9wcy5pbnZpdGVfY29kZSk7XHJcblxyXG4gICAgICAgIGF3YWl0IGZldGNoKGAke3RoaXMuam9pbkVuZFBvaW50fS8ke3NlcnZlckNhcmQucHJvcHMuc2VydmVyLmlkZW50aWZpZXJ9YCx7XHJcbiAgICAgICAgICAgIG1ldGhvZDogXCJHRVRcIixcclxuICAgICAgICAgICAgY3JlZGVudGlhbHM6IFwiaW5jbHVkZVwiLFxyXG4gICAgICAgICAgICBtb2RlOiBcImNvcnNcIixcclxuICAgICAgICAgICAgaGVhZGVyczoge1xyXG4gICAgICAgICAgICAgICAgXCJBY2NlcHRcIjogXCJhcHBsaWNhdGlvbi9qc29uXCIsXHJcbiAgICAgICAgICAgICAgICBcIkNvbnRlbnQtVHlwZVwiOiBcImFwcGxpY2F0aW9uL2pzb25cIlxyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgfSk7XHJcblxyXG4gICAgICAgIHNlcnZlckNhcmQuc2V0U3RhdGUoe2pvaW5lZDogdHJ1ZX0pO1xyXG4gICAgfVxyXG5cclxuICAgIGNvbm5lY3QoKSB7XHJcbiAgICAgICAgY29uc3Qgc2VsZiA9IHRoaXM7XHJcbiAgICAgICAgY29uc3Qgb3B0aW9ucyA9IHNlbGYud2luZG93T3B0aW9ucztcclxuICAgICAgICBvcHRpb25zLnggPSBNYXRoLnJvdW5kKHdpbmRvdy5zY3JlZW5YICsgd2luZG93LmlubmVyV2lkdGggLyAyIC0gb3B0aW9ucy53aWR0aCAvIDIpO1xyXG4gICAgICAgIG9wdGlvbnMueSA9IE1hdGgucm91bmQod2luZG93LnNjcmVlblkgKyB3aW5kb3cuaW5uZXJIZWlnaHQgLyAyIC0gb3B0aW9ucy5oZWlnaHQgLyAyKTtcclxuXHJcbiAgICAgICAgc2VsZi5qb2luV2luZG93ID0gbmV3ICh3aW5kb3cucmVxdWlyZShcImVsZWN0cm9uXCIpLnJlbW90ZS5Ccm93c2VyV2luZG93KShvcHRpb25zKTtcclxuICAgICAgICBjb25zdCB1cmwgPSBcImh0dHBzOi8vYXV0aC5kaXNjb3Jkc2VydmVycy5jb20vY29ubmVjdD9zY29wZXM9Z3VpbGRzLmpvaW4mcHJldmlvdXNVcmw9aHR0cHM6Ly9hdXRoLmRpc2NvcmRzZXJ2ZXJzLmNvbS9pbmZvXCI7XHJcbiAgICAgICAgc2VsZi5qb2luV2luZG93LndlYkNvbnRlbnRzLm9uKFwiZGlkLW5hdmlnYXRlXCIsIChldmVudCwgdXJsKSA9PiB7XHJcbiAgICAgICAgICAgIGlmICh1cmwgIT0gXCJodHRwczovL2F1dGguZGlzY29yZHNlcnZlcnMuY29tL2luZm9cIikgcmV0dXJuO1xyXG4gICAgICAgICAgICBzZWxmLmpvaW5XaW5kb3cuY2xvc2UoKTtcclxuICAgICAgICAgICAgc2VsZi5jaGVja0Nvbm5lY3Rpb24oKTtcclxuICAgICAgICB9KTtcclxuICAgICAgICBzZWxmLmpvaW5XaW5kb3cubG9hZFVSTCh1cmwpO1xyXG4gICAgfVxyXG5cclxuICAgIGdldCB3aW5kb3dPcHRpb25zKCkge1xyXG4gICAgICAgIHJldHVybiB7XHJcbiAgICAgICAgICAgIHdpZHRoOiA1MDAsXHJcbiAgICAgICAgICAgIGhlaWdodDogNTUwLFxyXG4gICAgICAgICAgICBiYWNrZ3JvdW5kQ29sb3I6IFwiIzI4MmIzMFwiLFxyXG4gICAgICAgICAgICBzaG93OiB0cnVlLFxyXG4gICAgICAgICAgICByZXNpemFibGU6IGZhbHNlLFxyXG4gICAgICAgICAgICBtYXhpbWl6YWJsZTogZmFsc2UsXHJcbiAgICAgICAgICAgIG1pbmltaXphYmxlOiBmYWxzZSxcclxuICAgICAgICAgICAgYWx3YXlzT25Ub3A6IHRydWUsXHJcbiAgICAgICAgICAgIGZyYW1lOiBmYWxzZSxcclxuICAgICAgICAgICAgY2VudGVyOiBmYWxzZSxcclxuICAgICAgICAgICAgd2ViUHJlZmVyZW5jZXM6IHtcclxuICAgICAgICAgICAgICAgIG5vZGVJbnRlZ3JhdGlvbjogZmFsc2VcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgIH07XHJcbiAgICB9XHJcblxyXG4gICAgZ2V0IGJkU2VydmVyKCkge1xyXG4gICAgICAgIGNvbnN0IHNlcnZlciA9IHtcclxuICAgICAgICAgICAgbmFtZTogXCJCZXR0ZXJEaXNjb3JkXCIsXHJcbiAgICAgICAgICAgIG9ubGluZTogXCI3NTAwK1wiLFxyXG4gICAgICAgICAgICBtZW1iZXJzOiBcIjIwMDAwK1wiLFxyXG4gICAgICAgICAgICBjYXRlZ29yaWVzOiBbXCJjb21tdW5pdHlcIiwgXCJwcm9ncmFtbWluZ1wiLCBcInN1cHBvcnRcIl0sXHJcbiAgICAgICAgICAgIGRlc2NyaXB0aW9uOiBcIk9mZmljaWFsIEJldHRlckRpc2NvcmQgc2VydmVyIGZvciBzdXBwb3J0IGV0Y1wiLFxyXG4gICAgICAgICAgICBpZGVudGlmaWVyOiBcIjg2MDA0NzQ0OTY2OTE0MDQ4XCIsXHJcbiAgICAgICAgICAgIGljb25Vcmw6IFwiaHR0cHM6Ly9jZG4uZGlzY29yZGFwcC5jb20vaWNvbnMvODYwMDQ3NDQ5NjY5MTQwNDgvMjkyZTdmNmJmZmYyYjcxZGZkMTNlNTA4YTg1OWFlZGQud2VicFwiLFxyXG4gICAgICAgICAgICBuYXRpdmVqb2luOiB0cnVlLFxyXG4gICAgICAgICAgICBpbnZpdGVfY29kZTogXCIwVG1mbzVaYk9SQ1JxYkFkXCIsXHJcbiAgICAgICAgICAgIHBpbm5lZDogdHJ1ZVxyXG4gICAgICAgIH07XHJcbiAgICAgICAgY29uc3Qgc2VydmVyMiA9IHtcclxuICAgICAgICAgICAgbmFtZTogXCJMaWdodGNvcmRcIixcclxuICAgICAgICAgICAgb25saW5lOiBcIjMwK1wiLFxyXG4gICAgICAgICAgICBtZW1iZXJzOiBcIjUwK1wiLFxyXG4gICAgICAgICAgICBjYXRlZ29yaWVzOiBbXCJjb21tdW5pdHlcIiwgXCJwcm9ncmFtbWluZ1wiLCBcInN1cHBvcnRcIl0sXHJcbiAgICAgICAgICAgIGRlc2NyaXB0aW9uOiBcIk9mZmljaWFsIExpZ2h0Y29yZCBzZXJ2ZXIgZm9yIHN1cHBvcnQgZXRjXCIsXHJcbiAgICAgICAgICAgIGlkZW50aWZpZXI6IFwiODYwMDQ3NDQ5NjY5MTQwNDhcIixcclxuICAgICAgICAgICAgaWNvblVybDogXCJodHRwczovL2F2YXRhcnMzLmdpdGh1YnVzZXJjb250ZW50LmNvbS91LzY1NjkwMDU4P3M9MjAwJnY9NFwiLFxyXG4gICAgICAgICAgICBuYXRpdmVqb2luOiB0cnVlLFxyXG4gICAgICAgICAgICBpbnZpdGVfY29kZTogXCI3ZUZmZjJBXCIsXHJcbiAgICAgICAgICAgIHBpbm5lZDogdHJ1ZVxyXG4gICAgICAgIH07XHJcbiAgICAgICAgY29uc3QgZ3VpbGRMaXN0ID0gdGhpcy5Tb3J0ZWRHdWlsZFN0b3JlLmdldEZsYXR0ZW5lZEd1aWxkSWRzKCk7XHJcbiAgICAgICAgY29uc3QgZGVmYXVsdExpc3QgPSB0aGlzLkF2YXRhckRlZmF1bHRzLkRFRkFVTFRfQVZBVEFSUztcclxuICAgICAgICByZXR1cm4gW1xyXG4gICAgICAgICAgICBCRFYyLnJlYWN0LmNyZWF0ZUVsZW1lbnQoU2VydmVyQ2FyZCwge3NlcnZlcjogc2VydmVyMiwgcGlubmVkOiB0cnVlLCBqb2luOiB0aGlzLmpvaW4sIGd1aWxkTGlzdDogZ3VpbGRMaXN0LCBmYWxsYmFjazogZGVmYXVsdExpc3RbTWF0aC5mbG9vcihNYXRoLnJhbmRvbSgpICogNSldfSksXHJcbiAgICAgICAgICAgIEJEVjIucmVhY3QuY3JlYXRlRWxlbWVudChTZXJ2ZXJDYXJkLCB7c2VydmVyOiBzZXJ2ZXIsIHBpbm5lZDogdHJ1ZSwgam9pbjogdGhpcy5qb2luLCBndWlsZExpc3Q6IGd1aWxkTGlzdCwgZmFsbGJhY2s6IGRlZmF1bHRMaXN0W01hdGguZmxvb3IoTWF0aC5yYW5kb20oKSAqIDUpXX0pXHJcbiAgICAgICAgXVxyXG4gICAgfVxyXG5cclxuICAgIGdldCBlbmRQb2ludCgpIHtcclxuICAgICAgICByZXR1cm4gXCJodHRwczovL3NlYXJjaC5kaXNjb3Jkc2VydmVycy5jb21cIjtcclxuICAgIH1cclxuXHJcbiAgICBnZXQgam9pbkVuZFBvaW50KCkge1xyXG4gICAgICAgIHJldHVybiBcImh0dHBzOi8vai5kaXNjb3Jkc2VydmVycy5jb21cIjtcclxuICAgIH1cclxuXHJcbiAgICBnZXQgY29ubmVjdEVuZFBvaW50KCkge1xyXG4gICAgICAgIHJldHVybiBcImh0dHBzOi8vam9pbi5kaXNjb3Jkc2VydmVycy5jb20vY29ubmVjdFwiO1xyXG4gICAgfVxyXG5cclxuICAgIGFzeW5jIGNoZWNrQ29ubmVjdGlvbigpIHtcclxuICAgICAgICBjb25zdCBzZWxmID0gdGhpcztcclxuICAgICAgICB0cnkge1xyXG4gICAgICAgICAgICBjb25zdCByZXNwb25zZSA9IGF3YWl0IGZldGNoKGBodHRwczovL2F1dGguZGlzY29yZHNlcnZlcnMuY29tL2luZm9gLHtcclxuICAgICAgICAgICAgICAgIG1ldGhvZDogXCJHRVRcIixcclxuICAgICAgICAgICAgICAgIGNyZWRlbnRpYWxzOiBcImluY2x1ZGVcIixcclxuICAgICAgICAgICAgICAgIG1vZGU6IFwiY29yc1wiLFxyXG4gICAgICAgICAgICAgICAgaGVhZGVyczoge1xyXG4gICAgICAgICAgICAgICAgICAgIFwiQWNjZXB0XCI6IFwiYXBwbGljYXRpb24vanNvblwiLFxyXG4gICAgICAgICAgICAgICAgICAgIFwiQ29udGVudC1UeXBlXCI6IFwiYXBwbGljYXRpb24vanNvblwiXHJcbiAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIH0pO1xyXG4gICAgICAgICAgICBjb25zdCBkYXRhID0gYXdhaXQgcmVzcG9uc2UuanNvbigpO1xyXG4gICAgICAgICAgICBzZWxmLnNldFN0YXRlKHtcclxuICAgICAgICAgICAgICAgIHNlbGVjdGVkQ2F0ZWdvcnk6IDAsXHJcbiAgICAgICAgICAgICAgICBjb25uZWN0aW9uOiB7XHJcbiAgICAgICAgICAgICAgICAgICAgc3RhdGU6IDIsXHJcbiAgICAgICAgICAgICAgICAgICAgdXNlcjogZGF0YVxyXG4gICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICB9KTtcclxuICAgICAgICAgICAgc2VsZi5zZWFyY2goXCJcIiwgdHJ1ZSk7XHJcbiAgICAgICAgfVxyXG4gICAgICAgIGNhdGNoIChlcnJvcikge1xyXG4gICAgICAgICAgICBjb25zb2xlLmVycm9yKGVycm9yKVxyXG4gICAgICAgICAgICBzZWxmLnNldFN0YXRlKHtcclxuICAgICAgICAgICAgICAgIHRpdGxlOiBcIk5vdCBjb25uZWN0ZWQgdG8gZGlzY29yZHNlcnZlcnMuY29tIVwiLFxyXG4gICAgICAgICAgICAgICAgbG9hZGluZzogdHJ1ZSxcclxuICAgICAgICAgICAgICAgIHNlbGVjdGVkQ2F0ZWdvcnk6IC0xLFxyXG4gICAgICAgICAgICAgICAgY29ubmVjdGlvbjoge1xyXG4gICAgICAgICAgICAgICAgICAgIHN0YXRlOiAxLFxyXG4gICAgICAgICAgICAgICAgICAgIHVzZXI6IG51bGxcclxuICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgfSk7XHJcbiAgICAgICAgfVxyXG4gICAgfVxyXG5cclxuICAgIHJlbmRlcigpIHtcclxuICAgICAgICByZXR1cm4gQkRWMi5yZWFjdC5jcmVhdGVFbGVtZW50KFNpZGViYXJWaWV3LCB7cmVmOiBcInNidlwifSwgdGhpcy5jb21wb25lbnQpO1xyXG4gICAgfVxyXG5cclxuICAgIGdldCBjb21wb25lbnQoKSB7XHJcbiAgICAgICAgcmV0dXJuIHtcclxuICAgICAgICAgICAgc2lkZWJhcjoge1xyXG4gICAgICAgICAgICAgICAgY29tcG9uZW50OiB0aGlzLnNpZGViYXJcclxuICAgICAgICAgICAgfSxcclxuICAgICAgICAgICAgY29udGVudDoge1xyXG4gICAgICAgICAgICAgICAgY29tcG9uZW50OiB0aGlzLmNvbnRlbnRcclxuICAgICAgICAgICAgfSxcclxuICAgICAgICAgICAgdG9vbHM6IHtcclxuICAgICAgICAgICAgICAgIGNvbXBvbmVudDogQkRWMi5yZWFjdC5jcmVhdGVFbGVtZW50KFRvb2xzLCB7a2V5OiBcInB0XCIsIHJlZjogXCJ0b29sc1wiLCBvbkNsaWNrOiB0aGlzLmNsb3NlfSlcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgIH07XHJcbiAgICB9XHJcblxyXG4gICAgZ2V0IHNpZGViYXIoKSB7XHJcbiAgICAgICAgcmV0dXJuIEJEVjIucmVhY3QuY3JlYXRlRWxlbWVudChcclxuICAgICAgICAgICAgXCJkaXZcIixcclxuICAgICAgICAgICAge2NsYXNzTmFtZTogXCJzaWRlYmFyXCIsIGtleTogXCJwc1wifSxcclxuICAgICAgICAgICAgQkRWMi5yZWFjdC5jcmVhdGVFbGVtZW50KFxyXG4gICAgICAgICAgICAgICAgXCJkaXZcIixcclxuICAgICAgICAgICAgICAgIHtjbGFzc05hbWU6IFwidWktdGFiLWJhciBTSURFXCJ9LFxyXG4gICAgICAgICAgICAgICAgQkRWMi5yZWFjdC5jcmVhdGVFbGVtZW50KFxyXG4gICAgICAgICAgICAgICAgICAgIFwiZGl2XCIsXHJcbiAgICAgICAgICAgICAgICAgICAge2NsYXNzTmFtZTogXCJ1aS10YWItYmFyLWhlYWRlclwiLCBzdHlsZToge2ZvbnRTaXplOiBcIjE2cHhcIn19LFxyXG4gICAgICAgICAgICAgICAgICAgIFwiUHVibGljIFNlcnZlcnNcIlxyXG4gICAgICAgICAgICAgICAgKSxcclxuICAgICAgICAgICAgICAgIEJEVjIucmVhY3QuY3JlYXRlRWxlbWVudChUYWJCYXJTZXBhcmF0b3IsIG51bGwpLFxyXG4gICAgICAgICAgICAgICAgdGhpcy5zZWFyY2hJbnB1dCxcclxuICAgICAgICAgICAgICAgIEJEVjIucmVhY3QuY3JlYXRlRWxlbWVudChUYWJCYXJTZXBhcmF0b3IsIG51bGwpLFxyXG4gICAgICAgICAgICAgICAgQkRWMi5yZWFjdC5jcmVhdGVFbGVtZW50KFRhYkJhckhlYWRlciwge3RleHQ6IFwiQ2F0ZWdvcmllc1wifSksXHJcbiAgICAgICAgICAgICAgICB0aGlzLmNhdGVnb3J5QnV0dG9ucy5tYXAoKHZhbHVlLCBpbmRleCkgPT4ge1xyXG4gICAgICAgICAgICAgICAgICAgIHJldHVybiBCRFYyLnJlYWN0LmNyZWF0ZUVsZW1lbnQoVGFiQmFySXRlbSwge2lkOiBpbmRleCwgb25DbGljazogdGhpcy5jaGFuZ2VDYXRlZ29yeSwga2V5OiBpbmRleCwgdGV4dDogdmFsdWUsIHNlbGVjdGVkOiB0aGlzLnN0YXRlLnNlbGVjdGVkQ2F0ZWdvcnkgPT09IGluZGV4fSk7XHJcbiAgICAgICAgICAgICAgICB9KSxcclxuICAgICAgICAgICAgICAgIEJEVjIucmVhY3QuY3JlYXRlRWxlbWVudChUYWJCYXJTZXBhcmF0b3IsIG51bGwpLFxyXG4gICAgICAgICAgICAgICAgdGhpcy5mb290ZXIsXHJcbiAgICAgICAgICAgICAgICB0aGlzLmNvbm5lY3Rpb25cclxuICAgICAgICAgICAgKVxyXG4gICAgICAgICk7XHJcbiAgICB9XHJcblxyXG4gICAgZ2V0IHNlYXJjaElucHV0KCkge1xyXG4gICAgICAgIHJldHVybiBCRFYyLnJlYWN0LmNyZWF0ZUVsZW1lbnQoXHJcbiAgICAgICAgICAgIFwiZGl2XCIsXHJcbiAgICAgICAgICAgIHtjbGFzc05hbWU6IFwidWktZm9ybS1pdGVtXCJ9LFxyXG4gICAgICAgICAgICBCRFYyLnJlYWN0LmNyZWF0ZUVsZW1lbnQoXHJcbiAgICAgICAgICAgICAgICBcImRpdlwiLFxyXG4gICAgICAgICAgICAgICAge2NsYXNzTmFtZTogXCJ1aS10ZXh0LWlucHV0IGZsZXgtdmVydGljYWxcIiwgc3R5bGU6IHt3aWR0aDogXCIxNzJweFwiLCBtYXJnaW5MZWZ0OiBcIjEwcHhcIn19LFxyXG4gICAgICAgICAgICAgICAgQkRWMi5yZWFjdC5jcmVhdGVFbGVtZW50KFwiaW5wdXRcIiwge3JlZjogXCJzZWFyY2hpbnB1dFwiLCBvbktleURvd246IHRoaXMuc2VhcmNoS2V5RG93biwgb25DaGFuZ2U6ICgpID0+IHt9LCB0eXBlOiBcInRleHRcIiwgY2xhc3NOYW1lOiBcImlucHV0IGRlZmF1bHRcIiwgcGxhY2Vob2xkZXI6IFwiU2VhcmNoLi4uXCIsIG1heExlbmd0aDogXCI1MFwifSlcclxuICAgICAgICAgICAgKVxyXG4gICAgICAgICk7XHJcbiAgICB9XHJcblxyXG4gICAgc2VhcmNoS2V5RG93bihlKSB7XHJcbiAgICAgICAgY29uc3Qgc2VsZiA9IHRoaXM7XHJcbiAgICAgICAgaWYgKHNlbGYuc3RhdGUubG9hZGluZyB8fCBlLndoaWNoICE9PSAxMykgcmV0dXJuO1xyXG4gICAgICAgIHNlbGYuc2V0U3RhdGUoe1xyXG4gICAgICAgICAgICBsb2FkaW5nOiB0cnVlLFxyXG4gICAgICAgICAgICB0aXRsZTogXCJMb2FkaW5nLi4uXCIsXHJcbiAgICAgICAgICAgIHRlcm06IGUudGFyZ2V0LnZhbHVlXHJcbiAgICAgICAgfSk7XHJcbiAgICAgICAgbGV0IHF1ZXJ5ID0gYD90ZXJtPSR7ZS50YXJnZXQudmFsdWV9YDtcclxuICAgICAgICBpZiAoc2VsZi5zdGF0ZS5zZWxlY3RlZENhdGVnb3J5ICE9PSAwKSB7XHJcbiAgICAgICAgICAgIHF1ZXJ5ICs9IGAmY2F0ZWdvcnk9JHtzZWxmLmNhdGVnb3J5QnV0dG9uc1tzZWxmLnN0YXRlLnNlbGVjdGVkQ2F0ZWdvcnldfWA7XHJcbiAgICAgICAgfVxyXG4gICAgICAgIHNlbGYuc2VhcmNoKHF1ZXJ5LCB0cnVlKTtcclxuICAgIH1cclxuXHJcbiAgICBnZXQgY2F0ZWdvcnlCdXR0b25zKCkge1xyXG4gICAgICAgIHJldHVybiBbXCJBbGxcIiwgXCJGUFMgR2FtZXNcIiwgXCJNTU8gR2FtZXNcIiwgXCJTdHJhdGVneSBHYW1lc1wiLCBcIk1PQkEgR2FtZXNcIiwgXCJSUEcgR2FtZXNcIiwgXCJUYWJsZXRvcCBHYW1lc1wiLCBcIlNhbmRib3ggR2FtZXNcIiwgXCJTaW11bGF0aW9uIEdhbWVzXCIsIFwiTXVzaWNcIiwgXCJDb21tdW5pdHlcIiwgXCJMYW5ndWFnZVwiLCBcIlByb2dyYW1taW5nXCIsIFwiT3RoZXJcIl07XHJcbiAgICB9XHJcblxyXG4gICAgY2hhbmdlQ2F0ZWdvcnkoaWQpIHtcclxuICAgICAgICBjb25zdCBzZWxmID0gdGhpcztcclxuICAgICAgICBpZiAoc2VsZi5zdGF0ZS5sb2FkaW5nKSByZXR1cm47XHJcbiAgICAgICAgc2VsZi5yZWZzLnNlYXJjaGlucHV0LnZhbHVlID0gXCJcIjtcclxuICAgICAgICBzZWxmLnNldFN0YXRlKHtcclxuICAgICAgICAgICAgbG9hZGluZzogdHJ1ZSxcclxuICAgICAgICAgICAgc2VsZWN0ZWRDYXRlZ29yeTogaWQsXHJcbiAgICAgICAgICAgIHRpdGxlOiBcIkxvYWRpbmcuLi5cIixcclxuICAgICAgICAgICAgdGVybTogbnVsbFxyXG4gICAgICAgIH0pO1xyXG4gICAgICAgIGlmIChpZCA9PT0gMCkge1xyXG4gICAgICAgICAgICBzZWxmLnNlYXJjaChcIlwiLCB0cnVlKTtcclxuICAgICAgICAgICAgcmV0dXJuO1xyXG4gICAgICAgIH1cclxuICAgICAgICBzZWxmLnNlYXJjaChgP2NhdGVnb3J5PSR7c2VsZi5jYXRlZ29yeUJ1dHRvbnNbaWRdfWAsIHRydWUpO1xyXG4gICAgfVxyXG5cclxuICAgIGdldCBjb250ZW50KCkge1xyXG4gICAgICAgIGNvbnN0IHNlbGYgPSB0aGlzO1xyXG4gICAgICAgIGNvbnN0IGd1aWxkTGlzdCA9IHRoaXMuU29ydGVkR3VpbGRTdG9yZS5nZXRGbGF0dGVuZWRHdWlsZElkcygpO1xyXG4gICAgICAgIGNvbnN0IGRlZmF1bHRMaXN0ID0gdGhpcy5BdmF0YXJEZWZhdWx0cy5ERUZBVUxUX0FWQVRBUlM7XHJcbiAgICAgICAgaWYgKHNlbGYuc3RhdGUuY29ubmVjdGlvbi5zdGF0ZSA9PT0gMSkgcmV0dXJuIHNlbGYubm90Q29ubmVjdGVkO1xyXG4gICAgICAgIGxldCBjb2x1bW5Nb2R1bGUgPSBCRE1vZHVsZXMuZ2V0KGUgPT4gZS5jb250ZW50Q29sdW1uRGVmYXVsdClbMF1cclxuICAgICAgICByZXR1cm4gW0JEVjIucmVhY3QuY3JlYXRlRWxlbWVudChcclxuICAgICAgICAgICAgXCJkaXZcIixcclxuICAgICAgICAgICAge3JlZjogXCJjb250ZW50XCIsIGtleTogXCJwY1wiLCBjbGFzc05hbWU6IGNvbHVtbk1vZHVsZS5jb250ZW50Q29sdW1uK1wiIFwiK2NvbHVtbk1vZHVsZS5jb250ZW50Q29sdW1uK1wiIGNvbnRlbnQtY29sdW1uIGRlZmF1bHRcIn0sXHJcbiAgICAgICAgICAgIEJEVjIucmVhY3QuY3JlYXRlRWxlbWVudChTZXR0aW5nc1RpdGxlLCB7dGV4dDogc2VsZi5zdGF0ZS50aXRsZX0pLFxyXG4gICAgICAgICAgICBzZWxmLmJkU2VydmVyLFxyXG4gICAgICAgICAgICBzZWxmLnN0YXRlLnNlcnZlcnMubWFwKChzZXJ2ZXIpID0+IHtcclxuICAgICAgICAgICAgICAgIHJldHVybiBCRFYyLnJlYWN0LmNyZWF0ZUVsZW1lbnQoU2VydmVyQ2FyZCwge2tleTogc2VydmVyLmlkZW50aWZpZXIsIHNlcnZlcjogc2VydmVyLCBqb2luOiBzZWxmLmpvaW4sIGd1aWxkTGlzdDogZ3VpbGRMaXN0LCBmYWxsYmFjazogZGVmYXVsdExpc3RbTWF0aC5mbG9vcihNYXRoLnJhbmRvbSgpICogNSldfSk7XHJcbiAgICAgICAgICAgIH0pLFxyXG4gICAgICAgICAgICBzZWxmLnN0YXRlLm5leHQgJiYgQkRWMi5yZWFjdC5jcmVhdGVFbGVtZW50KFxyXG4gICAgICAgICAgICAgICAgXCJidXR0b25cIixcclxuICAgICAgICAgICAgICAgIHt0eXBlOiBcImJ1dHRvblwiLCBvbkNsaWNrOiAoKSA9PiB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIGlmIChzZWxmLnN0YXRlLmxvYWRpbmcpIHJldHVybjtzZWxmLnNldFN0YXRlKHtsb2FkaW5nOiB0cnVlfSk7IHNlbGYuc2VhcmNoKHNlbGYuc3RhdGUubmV4dCwgZmFsc2UpO1xyXG4gICAgICAgICAgICAgICAgICAgIH0sIGNsYXNzTmFtZTogXCJ1aS1idXR0b24gZmlsbGVkIGJyYW5kIHNtYWxsIGdyb3dcIiwgc3R5bGU6IHt3aWR0aDogXCIxMDAlXCIsIG1hcmdpblRvcDogXCIxMHB4XCIsIG1hcmdpbkJvdHRvbTogXCIxMHB4XCJ9fSxcclxuICAgICAgICAgICAgICAgIEJEVjIucmVhY3QuY3JlYXRlRWxlbWVudChcclxuICAgICAgICAgICAgICAgICAgICBcImRpdlwiLFxyXG4gICAgICAgICAgICAgICAgICAgIHtjbGFzc05hbWU6IFwidWktYnV0dG9uLWNvbnRlbnRzXCJ9LFxyXG4gICAgICAgICAgICAgICAgICAgIHNlbGYuc3RhdGUubG9hZGluZyA/IFwiTG9hZGluZ1wiIDogXCJMb2FkIE1vcmVcIlxyXG4gICAgICAgICAgICAgICAgKVxyXG4gICAgICAgICAgICApLFxyXG4gICAgICAgICAgICBzZWxmLnN0YXRlLnNlcnZlcnMubGVuZ3RoID4gMCAmJiBCRFYyLnJlYWN0LmNyZWF0ZUVsZW1lbnQoU2V0dGluZ3NUaXRsZSwge3RleHQ6IHNlbGYuc3RhdGUudGl0bGV9KVxyXG4gICAgICAgICldO1xyXG4gICAgfVxyXG5cclxuICAgIGdldCBub3RDb25uZWN0ZWQoKSB7XHJcbiAgICAgICAgY29uc3Qgc2VsZiA9IHRoaXM7XHJcbiAgICAgICAgLy9yZXR1cm4gQkRWMi5yZWFjdC5jcmVhdGVFbGVtZW50KFNldHRpbmdzVGl0bGUsIHsgdGV4dDogc2VsZi5zdGF0ZS50aXRsZSB9KTtcclxuICAgICAgICBsZXQgY29sdW1uTW9kdWxlID0gQkRNb2R1bGVzLmdldChlID0+IGUuY29udGVudENvbHVtbkRlZmF1bHQpWzBdXHJcbiAgICAgICAgcmV0dXJuIFtCRFYyLnJlYWN0LmNyZWF0ZUVsZW1lbnQoXHJcbiAgICAgICAgICAgIFwiZGl2XCIsXHJcbiAgICAgICAgICAgIHtrZXk6IFwibmNjXCIsIHJlZjogXCJjb250ZW50XCIsIGNsYXNzTmFtZTogY29sdW1uTW9kdWxlLmNvbnRlbnRDb2x1bW4rXCIgXCIrY29sdW1uTW9kdWxlLmNvbnRlbnRDb2x1bW4rXCIgY29udGVudC1jb2x1bW4gZGVmYXVsdFwifSxcclxuICAgICAgICAgICAgQkRWMi5yZWFjdC5jcmVhdGVFbGVtZW50KFxyXG4gICAgICAgICAgICAgICAgXCJoMlwiLFxyXG4gICAgICAgICAgICAgICAge2NsYXNzTmFtZTogXCJ1aS1mb3JtLXRpdGxlIGgyIG1hcmdpbi1yZXNldCBtYXJnaW4tYm90dG9tLTIwXCJ9LFxyXG4gICAgICAgICAgICAgICAgXCJOb3QgY29ubmVjdGVkIHRvIGRpc2NvcmRzZXJ2ZXJzLmNvbSFcIixcclxuICAgICAgICAgICAgICAgIEJEVjIucmVhY3QuY3JlYXRlRWxlbWVudChcclxuICAgICAgICAgICAgICAgICAgICBcImJ1dHRvblwiLFxyXG4gICAgICAgICAgICAgICAgICAgIHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgb25DbGljazogc2VsZi5jb25uZWN0LFxyXG4gICAgICAgICAgICAgICAgICAgICAgICB0eXBlOiBcImJ1dHRvblwiLFxyXG4gICAgICAgICAgICAgICAgICAgICAgICBjbGFzc05hbWU6IFwidWktYnV0dG9uIGZpbGxlZCBicmFuZCBzbWFsbCBncm93XCIsXHJcbiAgICAgICAgICAgICAgICAgICAgICAgIHN0eWxlOiB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBkaXNwbGF5OiBcImlubGluZS1ibG9ja1wiLFxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgbWluSGVpZ2h0OiBcIjE4cHhcIixcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1hcmdpbkxlZnQ6IFwiMTBweFwiLFxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgbGluZUhlaWdodDogXCIxNHB4XCJcclxuICAgICAgICAgICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgICAgICAgIH0sXHJcbiAgICAgICAgICAgICAgICAgICAgQkRWMi5yZWFjdC5jcmVhdGVFbGVtZW50KFxyXG4gICAgICAgICAgICAgICAgICAgICAgICBcImRpdlwiLFxyXG4gICAgICAgICAgICAgICAgICAgICAgICB7Y2xhc3NOYW1lOiBcInVpLWJ1dHRvbi1jb250ZW50c1wifSxcclxuICAgICAgICAgICAgICAgICAgICAgICAgXCJDb25uZWN0XCJcclxuICAgICAgICAgICAgICAgICAgICApXHJcbiAgICAgICAgICAgICAgICApXHJcbiAgICAgICAgICAgICksIHNlbGYuYmRTZXJ2ZXJcclxuICAgICAgICApXTtcclxuICAgIH1cclxuXHJcbiAgICBnZXQgZm9vdGVyKCkge1xyXG4gICAgICAgIHJldHVybiBCRFYyLnJlYWN0LmNyZWF0ZUVsZW1lbnQoXHJcbiAgICAgICAgICAgIFwiZGl2XCIsXHJcbiAgICAgICAgICAgIHtjbGFzc05hbWU6IFwidWktdGFiLWJhci1oZWFkZXJcIn0sXHJcbiAgICAgICAgICAgIEJEVjIucmVhY3QuY3JlYXRlRWxlbWVudChcclxuICAgICAgICAgICAgICAgIFwiYVwiLFxyXG4gICAgICAgICAgICAgICAge2hyZWY6IFwiaHR0cHM6Ly9kaXNjb3Jkc2VydmVycy5jb21cIiwgdGFyZ2V0OiBcIl9ibGFua1wifSxcclxuICAgICAgICAgICAgICAgIFwiRGlzY29yZHNlcnZlcnMuY29tXCJcclxuICAgICAgICAgICAgKVxyXG4gICAgICAgICk7XHJcbiAgICB9XHJcblxyXG4gICAgZ2V0IGNvbm5lY3Rpb24oKSB7XHJcbiAgICAgICAgY29uc3Qgc2VsZiA9IHRoaXM7XHJcbiAgICAgICAgY29uc3Qge2Nvbm5lY3Rpb259ID0gc2VsZi5zdGF0ZTtcclxuICAgICAgICBpZiAoY29ubmVjdGlvbi5zdGF0ZSAhPT0gMikgcmV0dXJuIEJEVjIucmVhY3QuY3JlYXRlRWxlbWVudChcInNwYW5cIiwgbnVsbCk7XHJcblxyXG4gICAgICAgIHJldHVybiBCRFYyLnJlYWN0LmNyZWF0ZUVsZW1lbnQoXHJcbiAgICAgICAgICAgIFwic3BhblwiLFxyXG4gICAgICAgICAgICBudWxsLFxyXG4gICAgICAgICAgICBCRFYyLnJlYWN0LmNyZWF0ZUVsZW1lbnQoVGFiQmFyU2VwYXJhdG9yLCBudWxsKSxcclxuICAgICAgICAgICAgQkRWMi5yZWFjdC5jcmVhdGVFbGVtZW50KFxyXG4gICAgICAgICAgICAgICAgXCJzcGFuXCIsXHJcbiAgICAgICAgICAgICAgICB7c3R5bGU6IHtjb2xvcjogXCIjYjliYmJlXCIsIGZvbnRTaXplOiBcIjEwcHhcIiwgbWFyZ2luTGVmdDogXCIxMHB4XCJ9fSxcclxuICAgICAgICAgICAgICAgIFwiQ29ubmVjdGVkIGFzOiBcIixcclxuICAgICAgICAgICAgICAgIGAke2Nvbm5lY3Rpb24udXNlci51c2VybmFtZX0jJHtjb25uZWN0aW9uLnVzZXIuZGlzY3JpbWluYXRvcn1gXHJcbiAgICAgICAgICAgICksXHJcbiAgICAgICAgICAgIEJEVjIucmVhY3QuY3JlYXRlRWxlbWVudChcclxuICAgICAgICAgICAgICAgIFwiZGl2XCIsXHJcbiAgICAgICAgICAgICAgICB7c3R5bGU6IHtwYWRkaW5nOiBcIjVweCAxMHB4IDAgMTBweFwifX0sXHJcbiAgICAgICAgICAgICAgICBCRFYyLnJlYWN0LmNyZWF0ZUVsZW1lbnQoXHJcbiAgICAgICAgICAgICAgICAgICAgXCJidXR0b25cIixcclxuICAgICAgICAgICAgICAgICAgICB7c3R5bGU6IHt3aWR0aDogXCIxMDAlXCIsIG1pbkhlaWdodDogXCIyMHB4XCJ9LCB0eXBlOiBcImJ1dHRvblwiLCBjbGFzc05hbWU6IFwidWktYnV0dG9uIGZpbGxlZCBicmFuZCBzbWFsbCBncm93XCJ9LFxyXG4gICAgICAgICAgICAgICAgICAgIEJEVjIucmVhY3QuY3JlYXRlRWxlbWVudChcclxuICAgICAgICAgICAgICAgICAgICAgICAgXCJkaXZcIixcclxuICAgICAgICAgICAgICAgICAgICAgICAge2NsYXNzTmFtZTogXCJ1aS1idXR0b24tY29udGVudHNcIiwgb25DbGljazogc2VsZi5jb25uZWN0fSxcclxuICAgICAgICAgICAgICAgICAgICAgICAgXCJSZWNvbm5lY3RcIlxyXG4gICAgICAgICAgICAgICAgICAgIClcclxuICAgICAgICAgICAgICAgIClcclxuICAgICAgICAgICAgKVxyXG4gICAgICAgICk7XHJcbn1cclxufSIsImltcG9ydCBCRFYyIGZyb20gXCIuLi8uLi9tb2R1bGVzL3YyXCI7XHJcblxyXG5leHBvcnQgZGVmYXVsdCBjbGFzcyBWMkNfU2VydmVyQ2FyZCBleHRlbmRzIEJEVjIucmVhY3RDb21wb25lbnQge1xyXG4gICAgY29uc3RydWN0b3IocHJvcHMpIHtcclxuICAgICAgICBzdXBlcihwcm9wcyk7XHJcbiAgICAgICAgaWYgKCF0aGlzLnByb3BzLnNlcnZlci5pY29uVXJsKSB0aGlzLnByb3BzLnNlcnZlci5pY29uVXJsID0gdGhpcy5wcm9wcy5mYWxsYmFjaztcclxuICAgICAgICB0aGlzLnN0YXRlID0ge1xyXG4gICAgICAgICAgICBpbWFnZUVycm9yOiBmYWxzZSxcclxuICAgICAgICAgICAgam9pbmVkOiB0aGlzLnByb3BzLmd1aWxkTGlzdC5pbmNsdWRlcyh0aGlzLnByb3BzLnNlcnZlci5pZGVudGlmaWVyKVxyXG4gICAgICAgIH07XHJcbiAgICB9XHJcblxyXG4gICAgcmVuZGVyKCkge1xyXG4gICAgICAgIGNvbnN0IHtzZXJ2ZXJ9ID0gdGhpcy5wcm9wcztcclxuICAgICAgICBsZXQgY2FyZE1vZHVsZSA9IEJETW9kdWxlcy5nZXQoZSA9PiBlLmNhcmQgJiYgZS5jYXJkUHJpbWFyeSlbMF1cclxuICAgICAgICBsZXQgZmxleE1vZHVsZSA9IEJETW9kdWxlcy5nZXQoZSA9PiBlLmZsZXhDaGlsZCAmJiBlLl9ob3Jpem9udGFsUmV2ZXJzZSlbMF1cclxuICAgICAgICBsZXQgd3JhcE1vZHVsZSA9IEJETW9kdWxlcy5nZXQoZSA9PiBlLm5vV3JhcCAmJiAhZS5zdHJlYW1lck1vZGVFbmFibGVkKVswXVxyXG4gICAgICAgIHJldHVybiBCRFYyLnJlYWN0LmNyZWF0ZUVsZW1lbnQoXHJcbiAgICAgICAgICAgIFwiZGl2XCIsIC8vIGNhcmRQcmltYXJ5LTFIdi10b1xyXG4gICAgICAgICAgICB7Y2xhc3NOYW1lOiBgJHtjYXJkTW9kdWxlLmNhcmR9ICR7Y2FyZE1vZHVsZS5jYXJkUHJpbWFyeX0gJHtCRE1vZHVsZXMuZ2V0KGUgPT4gZS5tYXJnaW5Cb3R0b204KVswXS5tYXJnaW5Cb3R0b204fSBiZC1zZXJ2ZXItY2FyZCR7c2VydmVyLnBpbm5lZCA/IFwiIGJkLXNlcnZlci1jYXJkLXBpbm5lZFwiIDogXCJcIn1gfSxcclxuICAgICAgICAgICAgLy8gQkRWMi5yZWFjdC5jcmVhdGVFbGVtZW50KFxyXG4gICAgICAgICAgICAgICAgLy8gXCJkaXZcIixcclxuICAgICAgICAgICAgICAgIC8vIHsgY2xhc3NOYW1lOiBcImZsZXgtMXhNUWc1IGZsZXgtMU8xR0tZIGhvcml6b250YWwtMWFlOWNpIGhvcml6b250YWwtMkVFRW5ZIGZsZXgtMU8xR0tZIGRpcmVjdGlvblJvdy0zdjN0ZkcganVzdGlmeVN0YXJ0LTJ5SVpvMCBhbGlnblN0cmV0Y2gtMWh3eE1hIG5vV3JhcC0zanludjZcIiB9LFxyXG4gICAgICAgICAgICAgICAgQkRWMi5yZWFjdC5jcmVhdGVFbGVtZW50KFwiaW1nXCIsIHtyZWY6IFwiaW1nXCIsIGNsYXNzTmFtZTogXCJiZC1zZXJ2ZXItaW1hZ2VcIiwgc3JjOiBzZXJ2ZXIuaWNvblVybCwgb25FcnJvcjogdGhpcy5oYW5kbGVFcnJvci5iaW5kKHRoaXMpLCBkcmFnZ2FibGU6IGZhbHNlfSksXHJcbiAgICAgICAgICAgICAgICBCRFYyLnJlYWN0LmNyZWF0ZUVsZW1lbnQoXHJcbiAgICAgICAgICAgICAgICAgICAgXCJkaXZcIixcclxuICAgICAgICAgICAgICAgICAgICB7Y2xhc3NOYW1lOiBmbGV4TW9kdWxlLmZsZXhDaGlsZCtcIiBiZC1zZXJ2ZXItY29udGVudFwifSxcclxuICAgICAgICAgICAgICAgICAgICBCRFYyLnJlYWN0LmNyZWF0ZUVsZW1lbnQoXHJcbiAgICAgICAgICAgICAgICAgICAgICAgIFwiZGl2XCIsXHJcbiAgICAgICAgICAgICAgICAgICAgICAgIHtjbGFzc05hbWU6IGZsZXhNb2R1bGUuaG9yaXpvbnRhbCtcIiBcIit3cmFwTW9kdWxlLm5vV3JhcCtcIiBiZC1zZXJ2ZXItaGVhZGVyXCJ9LFxyXG4gICAgICAgICAgICAgICAgICAgICAgICBCRFYyLnJlYWN0LmNyZWF0ZUVsZW1lbnQoXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBcImg1XCIsXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB7Y2xhc3NOYW1lOiBcImg1LTE4XzFuZCBkZWZhdWx0Q29sb3ItMV9halgwIG1hcmdpbi1yZXNldCBiZC1zZXJ2ZXItbmFtZVwifSxcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNlcnZlci5uYW1lXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICksXHJcbiAgICAgICAgICAgICAgICAgICAgICAgIEJEVjIucmVhY3QuY3JlYXRlRWxlbWVudChcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwiaDVcIixcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHtjbGFzc05hbWU6IFwiaDUtMThfMW5kIGRlZmF1bHRDb2xvci0xX2FqWDAgbWFyZ2luLXJlc2V0IGJkLXNlcnZlci1tZW1iZXItY291bnRcIn0sXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBzZXJ2ZXIubWVtYmVycyxcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwiIE1lbWJlcnNcIlxyXG4gICAgICAgICAgICAgICAgICAgICAgICApXHJcbiAgICAgICAgICAgICAgICAgICAgKSxcclxuICAgICAgICAgICAgICAgICAgICBCRFYyLnJlYWN0LmNyZWF0ZUVsZW1lbnQoXHJcbiAgICAgICAgICAgICAgICAgICAgICAgIFwiZGl2XCIsXHJcbiAgICAgICAgICAgICAgICAgICAgICAgIHtjbGFzc05hbWU6IGZsZXhNb2R1bGUuaG9yaXpvbnRhbCtcIiBcIit3cmFwTW9kdWxlLm5vV3JhcH0sXHJcbiAgICAgICAgICAgICAgICAgICAgICAgIEJEVjIucmVhY3QuY3JlYXRlRWxlbWVudChcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwiZGl2XCIsXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB7Y2xhc3NOYW1lOiBcInNjcm9sbGVyV3JhcC0ybEpFa2Qgc2Nyb2xsZXJUaGVtZWQtMm9lbnVzIHRoZW1lR2hvc3RIYWlybGluZS1EQkQtMmQgc2Nyb2xsZXJGYWRlLTFJanc1eSBiZC1zZXJ2ZXItZGVzY3JpcHRpb24tY29udGFpbmVyXCJ9LFxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgQkRWMi5yZWFjdC5jcmVhdGVFbGVtZW50KFxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwiZGl2XCIsXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAge2NsYXNzTmFtZTogXCJzY3JvbGxlci0yRktGUEcgc2Nyb2xsZXIgYmQtc2VydmVyLWRlc2NyaXB0aW9uXCJ9LFxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzZXJ2ZXIuZGVzY3JpcHRpb25cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIClcclxuICAgICAgICAgICAgICAgICAgICAgICAgKVxyXG4gICAgICAgICAgICAgICAgICAgICksXHJcbiAgICAgICAgICAgICAgICAgICAgQkRWMi5yZWFjdC5jcmVhdGVFbGVtZW50KFxyXG4gICAgICAgICAgICAgICAgICAgICAgICBcImRpdlwiLFxyXG4gICAgICAgICAgICAgICAgICAgICAgICB7Y2xhc3NOYW1lOiBcImZsZXgtMXhNUWc1IGZsZXgtMU8xR0tZIGhvcml6b250YWwtMWFlOWNpIGhvcml6b250YWwtMkVFRW5ZIGRpcmVjdGlvblJvdy0zdjN0Zkcgbm9XcmFwLTNqeW52NiBiZC1zZXJ2ZXItZm9vdGVyXCJ9LFxyXG4gICAgICAgICAgICAgICAgICAgICAgICBCRFYyLnJlYWN0LmNyZWF0ZUVsZW1lbnQoXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBcImRpdlwiLFxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAge2NsYXNzTmFtZTogXCJmbGV4Q2hpbGQtZmFvVlczIGJkLXNlcnZlci10YWdzXCIsIHN0eWxlOiB7ZmxleDogXCIxIDEgYXV0b1wifX0sXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBzZXJ2ZXIuY2F0ZWdvcmllcy5qb2luKFwiLCBcIilcclxuICAgICAgICAgICAgICAgICAgICAgICAgKSxcclxuICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5zdGF0ZS5qb2luZWQgJiYgQkRWMi5yZWFjdC5jcmVhdGVFbGVtZW50KFxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgXCJidXR0b25cIixcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHt0eXBlOiBcImJ1dHRvblwiLCBjbGFzc05hbWU6IFwiYnV0dG9uLTM4YVNjciBsb29rRmlsbGVkLTFHeDAwUCBjb2xvckJyYW5kLTNwWHI5MSBzaXplTWluLTFtSmQxeCBncm93LXE3N09OTiBjb2xvckdyZWVuLTI5aUFLWVwiLCBzdHlsZToge21pbkhlaWdodDogXCIxMnB4XCIsIG1hcmdpblRvcDogXCI0cHhcIiwgYmFja2dyb3VuZENvbG9yOiBcIiMzYWMxNWNcIn19LFxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgQkRWMi5yZWFjdC5jcmVhdGVFbGVtZW50KFxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwiZGl2XCIsXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAge2NsYXNzTmFtZTogXCJ1aS1idXR0b24tY29udGVudHNcIn0sXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXCJKb2luZWRcIlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgKVxyXG4gICAgICAgICAgICAgICAgICAgICAgICApLFxyXG4gICAgICAgICAgICAgICAgICAgICAgICBzZXJ2ZXIuZXJyb3IgJiYgQkRWMi5yZWFjdC5jcmVhdGVFbGVtZW50KFxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgXCJidXR0b25cIixcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHt0eXBlOiBcImJ1dHRvblwiLCBjbGFzc05hbWU6IFwiYnV0dG9uLTM4YVNjciBsb29rRmlsbGVkLTFHeDAwUCBjb2xvckJyYW5kLTNwWHI5MSBzaXplTWluLTFtSmQxeCBncm93LXE3N09OTiBkaXNhYmxlZC05YUYydWdcIiwgc3R5bGU6IHttaW5IZWlnaHQ6IFwiMTJweFwiLCBtYXJnaW5Ub3A6IFwiNHB4XCIsIGJhY2tncm91bmRDb2xvcjogXCIjYzEzYTNhXCJ9fSxcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIEJEVjIucmVhY3QuY3JlYXRlRWxlbWVudChcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcImRpdlwiLFxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHtjbGFzc05hbWU6IFwidWktYnV0dG9uLWNvbnRlbnRzXCJ9LFxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwiRXJyb3JcIlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgKVxyXG4gICAgICAgICAgICAgICAgICAgICAgICApLFxyXG4gICAgICAgICAgICAgICAgICAgICAgICAhc2VydmVyLmVycm9yICYmICF0aGlzLnN0YXRlLmpvaW5lZCAmJiBCRFYyLnJlYWN0LmNyZWF0ZUVsZW1lbnQoXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBcImJ1dHRvblwiLFxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAge3R5cGU6IFwiYnV0dG9uXCIsIGNsYXNzTmFtZTogXCJidXR0b24tMzhhU2NyIGxvb2tGaWxsZWQtMUd4MDBQIGNvbG9yQnJhbmQtM3BYcjkxIHNpemVNaW4tMW1KZDF4IGdyb3ctcTc3T05OXCIsIHN0eWxlOiB7bWluSGVpZ2h0OiBcIjEycHhcIiwgbWFyZ2luVG9wOiBcIjRweFwifSwgb25DbGljazogKCkgPT4ge3RoaXMuam9pbigpO319LFxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgQkRWMi5yZWFjdC5jcmVhdGVFbGVtZW50KFxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwiZGl2XCIsXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAge2NsYXNzTmFtZTogXCJ1aS1idXR0b24tY29udGVudHNcIn0sXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXCJKb2luXCJcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIClcclxuICAgICAgICAgICAgICAgICAgICAgICAgKVxyXG4gICAgICAgICAgICAgICAgICAgIClcclxuICAgICAgICAgICAgICAgIClcclxuICAgICAgICAgICAgLy8gKVxyXG4gICAgICAgICk7XHJcbiAgICB9XHJcblxyXG4gICAgaGFuZGxlRXJyb3IoKSB7XHJcbiAgICAgICAgdGhpcy5wcm9wcy5zZXJ2ZXIuaWNvblVybCA9IHRoaXMucHJvcHMuZmFsbGJhY2s7XHJcbiAgICAgICAgdGhpcy5zZXRTdGF0ZSh7aW1hZ2VFcnJvcjogdHJ1ZX0pO1xyXG4gICAgfVxyXG5cclxuICAgIGpvaW4oKSB7XHJcbiAgICAgICAgdGhpcy5wcm9wcy5qb2luKHRoaXMpO1xyXG4gICAgICAgIC8vdGhpcy5zZXRTdGF0ZSh7am9pbmVkOiB0cnVlfSk7XHJcbiAgICB9XHJcbn0iLCJpbXBvcnQgQkRWMiBmcm9tIFwiLi4vLi4vbW9kdWxlcy92MlwiO1xyXG5cclxuaW1wb3J0IFNjcm9sbGVyIGZyb20gXCIuLi9zY3JvbGxlclwiO1xyXG5cclxuZXhwb3J0IGRlZmF1bHQgY2xhc3MgVjJDX1NpZGViYXJWaWV3IGV4dGVuZHMgQkRWMi5yZWFjdENvbXBvbmVudCB7XHJcblxyXG4gICAgY29uc3RydWN0b3IocHJvcHMpIHtcclxuICAgICAgICBzdXBlcihwcm9wcyk7XHJcbiAgICB9XHJcblxyXG4gICAgcmVuZGVyKCkge1xyXG4gICAgICAgIGNvbnN0IHtzaWRlYmFyLCBjb250ZW50LCB0b29sc30gPSB0aGlzLnByb3BzLmNoaWxkcmVuO1xyXG4gICAgICAgIHJldHVybiBCRFYyLnJlYWN0LmNyZWF0ZUVsZW1lbnQoXHJcbiAgICAgICAgICAgIFwiZGl2XCIsXHJcbiAgICAgICAgICAgIHtjbGFzc05hbWU6IFwic3RhbmRhcmRTaWRlYmFyVmlldy0zRjFJN2kgdWktc3RhbmRhcmQtc2lkZWJhci12aWV3XCJ9LFxyXG4gICAgICAgICAgICBCRFYyLnJlYWN0LmNyZWF0ZUVsZW1lbnQoXHJcbiAgICAgICAgICAgICAgICBcImRpdlwiLFxyXG4gICAgICAgICAgICAgICAge2NsYXNzTmFtZTogXCJzaWRlYmFyUmVnaW9uLVZGVFVrTiBzaWRlYmFyLXJlZ2lvblwifSxcclxuICAgICAgICAgICAgICAgIEJEVjIucmVhY3QuY3JlYXRlRWxlbWVudChTY3JvbGxlciwge2tleTogXCJzaWRlYmFyU2Nyb2xsZXJcIiwgcmVmOiBcInNpZGViYXJTY3JvbGxlclwiLCBzaWRlYmFyOiB0cnVlLCBmYWRlOiBzaWRlYmFyLmZhZGUgfHwgdHJ1ZSwgZGFyazogc2lkZWJhci5kYXJrIHx8IHRydWV9LCBzaWRlYmFyLmNvbXBvbmVudClcclxuICAgICAgICAgICAgKSxcclxuICAgICAgICAgICAgQkRWMi5yZWFjdC5jcmVhdGVFbGVtZW50KFwiZGl2XCIsIHtjbGFzc05hbWU6IFwiY29udGVudFJlZ2lvbi0zbkR1WXkgY29udGVudC1yZWdpb25cIn0sXHJcbiAgICAgICAgICAgICAgICBCRFYyLnJlYWN0LmNyZWF0ZUVsZW1lbnQoXCJkaXZcIiwge2NsYXNzTmFtZTogXCJjb250ZW50VHJhbnNpdGlvbldyYXAtM2hxT0VXIGNvbnRlbnQtdHJhbnNpdGlvbi13cmFwXCJ9LFxyXG4gICAgICAgICAgICAgICAgICAgIEJEVjIucmVhY3QuY3JlYXRlRWxlbWVudChcImRpdlwiLCB7Y2xhc3NOYW1lOiBcInNjcm9sbGVyV3JhcC0ybEpFa2QgZmlyZWZveEZpeFNjcm9sbEZsZXgtY25JMml4IGNvbnRlbnRSZWdpb25TY3JvbGxlcldyYXAtM1laWGRtIGNvbnRlbnQtcmVnaW9uLXNjcm9sbGVyLXdyYXAgc2Nyb2xsZXJUaGVtZWQtMm9lbnVzIHRoZW1lR2hvc3QtMjhNU24wIHNjcm9sbGVyVHJhY2stMVpJcHN2XCJ9LFxyXG4gICAgICAgICAgICAgICAgICAgICAgICBCRFYyLnJlYWN0LmNyZWF0ZUVsZW1lbnQoXCJkaXZcIiwge2NsYXNzTmFtZTogXCJzY3JvbGxlci0yRktGUEcgZmlyZWZveEZpeFNjcm9sbEZsZXgtY25JMml4IGNvbnRlbnRSZWdpb25TY3JvbGxlci0yNm5jMWUgY29udGVudC1yZWdpb24tc2Nyb2xsZXIgc2Nyb2xsZXJcIiwgcmVmOiBcImNvbnRlbnRTY3JvbGxlclwifSxcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIEJEVjIucmVhY3QuY3JlYXRlRWxlbWVudChcImRpdlwiLCB7Y2xhc3NOYW1lOiBcImNvbnRlbnRDb2x1bW4tMmhySVlIIGNvbnRlbnRDb2x1bW5EZWZhdWx0LTFWUWtHTSBjb250ZW50LWNvbHVtbiBkZWZhdWx0XCJ9LCBjb250ZW50LmNvbXBvbmVudCksXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB0b29scy5jb21wb25lbnRcclxuICAgICAgICAgICAgICAgICAgICAgICAgKVxyXG4gICAgICAgICAgICAgICAgICAgIClcclxuICAgICAgICAgICAgICAgIClcclxuICAgICAgICAgICAgKVxyXG4gICAgICAgICk7XHJcbiAgICB9XHJcbn0iLCJpbXBvcnQgQkRWMiBmcm9tIFwiLi4vbW9kdWxlcy92MlwiO1xyXG5cclxuZXhwb3J0IGRlZmF1bHQgY2xhc3MgVjJDX1JlbG9hZEljb24gZXh0ZW5kcyBCRFYyLnJlYWN0Q29tcG9uZW50IHtcclxuICAgIGNvbnN0cnVjdG9yKHByb3BzKSB7XHJcbiAgICAgICAgc3VwZXIocHJvcHMpO1xyXG4gICAgfVxyXG5cclxuICAgIHJlbmRlcigpIHtcclxuICAgICAgICByZXR1cm4gQkRWMi5yZWFjdC5jcmVhdGVFbGVtZW50KFwic3ZnXCIsIHtcclxuICAgICAgICAgICAgICAgIHhtbG5zOiBcImh0dHA6Ly93d3cudzMub3JnLzIwMDAvc3ZnXCIsXHJcbiAgICAgICAgICAgICAgICB2aWV3Qm94OiBcIjAgMCAyNCAyNFwiLFxyXG4gICAgICAgICAgICAgICAgZmlsbDogXCIjZGNkZGRlXCIsXHJcbiAgICAgICAgICAgICAgICBjbGFzc05hbWU6IFwiYmQtcmVsb2FkIFwiICsgdGhpcy5wcm9wcy5jbGFzc05hbWUsXHJcbiAgICAgICAgICAgICAgICBvbkNsaWNrOiB0aGlzLnByb3BzLm9uQ2xpY2ssXHJcbiAgICAgICAgICAgICAgICBzdHlsZToge3dpZHRoOiB0aGlzLnByb3BzLnNpemUgfHwgXCIyNHB4XCIsIGhlaWdodDogdGhpcy5wcm9wcy5zaXplIHx8IFwiMjRweFwifVxyXG4gICAgICAgICAgICB9LFxyXG4gICAgICAgICAgICBCRFYyLnJlYWN0LmNyZWF0ZUVsZW1lbnQoXCJwYXRoXCIsIHtkOiBcIk0xNy42NSA2LjM1QzE2LjIgNC45IDE0LjIxIDQgMTIgNGMtNC40MiAwLTcuOTkgMy41OC03Ljk5IDhzMy41NyA4IDcuOTkgOGMzLjczIDAgNi44NC0yLjU1IDcuNzMtNmgtMi4wOGMtLjgyIDIuMzMtMy4wNCA0LTUuNjUgNC0zLjMxIDAtNi0yLjY5LTYtNnMyLjY5LTYgNi02YzEuNjYgMCAzLjE0LjY5IDQuMjIgMS43OEwxMyAxMWg3VjRsLTIuMzUgMi4zNXpcIn0pLFxyXG4gICAgICAgICAgICBCRFYyLnJlYWN0LmNyZWF0ZUVsZW1lbnQoXCJwYXRoXCIsIHtmaWxsOiBcIm5vbmVcIiwgZDogXCJNMCAwaDI0djI0SDB6XCJ9KVxyXG4gICAgICAgICk7XHJcbiAgICB9XHJcbn0iLCJpbXBvcnQgQkRWMiBmcm9tIFwiLi4vbW9kdWxlcy92MlwiO1xyXG5cclxuZXhwb3J0IGRlZmF1bHQgY2xhc3MgVjJDX1Njcm9sbGVyIGV4dGVuZHMgQkRWMi5yZWFjdENvbXBvbmVudCB7XHJcblxyXG4gICAgY29uc3RydWN0b3IocHJvcHMpIHtcclxuICAgICAgICBzdXBlcihwcm9wcyk7XHJcbiAgICB9XHJcblxyXG4gICAgcmVuZGVyKCkge1xyXG4gICAgICAgIC8vc2Nyb2xsZXJXcmFwLTJsSkVrZCBzY3JvbGxlclRoZW1lZC0yb2VudXMgdGhlbWVHaG9zdEhhaXJsaW5lLURCRC0yZCBzY3JvbGxlckZhZGUtMUlqdzV5XHJcbiAgICAgICAgbGV0IHNjcm9sbGVyTW9kdWxlMSA9IEJETW9kdWxlcy5nZXQoZSA9PiBlLnNjcm9sbGVySG9yaXpvbnRhbClbMF1cclxuICAgICAgICBsZXQgc2Nyb2xsZXJNb2R1bGUyID0gQkRNb2R1bGVzLmdldChlID0+IGUuc2lkZWJhclJlZ2lvblNjcm9sbGVyKVswXVxyXG4gICAgICAgIGxldCB3cmFwcGVyQ2xhc3MgPSBgJHtzY3JvbGxlck1vZHVsZTEuc2Nyb2xsZXJXcmFwfSAke3Njcm9sbGVyTW9kdWxlMS5zY3JvbGxlclRoZW1lZH0gJHtzY3JvbGxlck1vZHVsZTEudGhlbWVHaG9zdEhhaXJsaW5lfSR7dGhpcy5wcm9wcy5mYWRlID8gXCIgXCIrc2Nyb2xsZXJNb2R1bGUxLnNjcm9sbGVyRmFkZSA6IFwiXCJ9YDtcclxuICAgICAgICBsZXQgc2Nyb2xsZXJDbGFzcyA9IHNjcm9sbGVyTW9kdWxlMS5zY3JvbGxlcitcIiBzY3JvbGxlclwiOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIGZ1Y2sgKi9cclxuICAgICAgICBpZiAodGhpcy5wcm9wcy5zaWRlYmFyKSBzY3JvbGxlckNsYXNzICs9IGAgJHtzY3JvbGxlck1vZHVsZTIuc2lkZWJhclJlZ2lvblNjcm9sbGVyfSBzaWRlYmFyLXJlZ2lvbi1zY3JvbGxlcmBcclxuICAgICAgICBpZiAodGhpcy5wcm9wcy5jb250ZW50Q29sdW1uKSB7XHJcbiAgICAgICAgICAgIHNjcm9sbGVyQ2xhc3MgKz0gXCIgXCIrc2Nyb2xsZXJNb2R1bGUyLmNvbnRlbnRSZWdpb25TY3JvbGxlcitcIiBjb250ZW50LXJlZ2lvbi1zY3JvbGxlclwiOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogZnVjayAqL1xyXG4gICAgICAgICAgICB3cmFwcGVyQ2xhc3MgPSBgJHtzY3JvbGxlck1vZHVsZTEuc2Nyb2xsZXJXcmFwfSAke3Njcm9sbGVyTW9kdWxlMi5jb250ZW50UmVnaW9uU2Nyb2xsZXJXcmFwfSBjb250ZW50LXJlZ2lvbi1zY3JvbGxlci13cmFwICAke3Njcm9sbGVyTW9kdWxlMS5zY3JvbGxlclRoZW1lZH0gJHtzY3JvbGxlck1vZHVsZTEudGhlbWVHaG9zdH0gJHtzY3JvbGxlck1vZHVsZTEuc2Nyb2xsZXJUcmFja31gO1xyXG4gICAgICAgIH1cclxuICAgICAgICBjb25zdCB7Y2hpbGRyZW59ID0gdGhpcy5wcm9wcztcclxuICAgICAgICByZXR1cm4gQkRWMi5yZWFjdC5jcmVhdGVFbGVtZW50KFxyXG4gICAgICAgICAgICBcImRpdlwiLFxyXG4gICAgICAgICAgICB7a2V5OiBcInNjcm9sbGVyd3JhcFwiLCBjbGFzc05hbWU6IHdyYXBwZXJDbGFzc30sXHJcbiAgICAgICAgICAgIEJEVjIucmVhY3QuY3JlYXRlRWxlbWVudChcclxuICAgICAgICAgICAgICAgIFwiZGl2XCIsXHJcbiAgICAgICAgICAgICAgICB7a2V5OiBcInNjcm9sbGVyXCIsIHJlZjogXCJzY3JvbGxlclwiLCBjbGFzc05hbWU6IHNjcm9sbGVyQ2xhc3N9LFxyXG4gICAgICAgICAgICAgICAgY2hpbGRyZW5cclxuICAgICAgICAgICAgKVxyXG4gICAgICAgICk7XHJcbiAgICB9XHJcbn0iLCJpbXBvcnQgQkRWMiBmcm9tIFwiLi4vbW9kdWxlcy92MlwiO1xyXG5cclxuaW1wb3J0IFNldHRpbmdzR3JvdXAgZnJvbSBcIi4vc2V0dGluZ3NHcm91cFwiO1xyXG5pbXBvcnQgTWFyZ2luVG9wIGZyb20gXCIuL21hcmdpbnRvcFwiO1xyXG5cclxuZXhwb3J0IGRlZmF1bHQgY2xhc3MgVjJDX1NlY3Rpb25lZFNldHRpbmdzUGFuZWwgZXh0ZW5kcyBCRFYyLnJlYWN0Q29tcG9uZW50IHtcclxuXHJcbiAgICBjb25zdHJ1Y3Rvcihwcm9wcykge1xyXG4gICAgICAgIHN1cGVyKHByb3BzKTtcclxuICAgIH1cclxuXHJcbiAgICByZW5kZXIoKSB7XHJcbiAgICAgICAgcmV0dXJuIHRoaXMucHJvcHMuc2VjdGlvbnMubWFwKChzZWN0aW9uLCBpKSA9PiB7XHJcbiAgICAgICAgICAgIHJldHVybiBbXHJcbiAgICAgICAgICAgICAgICBpICE9PSAwID8gQkRWMi5yZWFjdC5jcmVhdGVFbGVtZW50KE1hcmdpblRvcCwge30pIDogbnVsbCxcclxuICAgICAgICAgICAgICAgIEJEVjIucmVhY3QuY3JlYXRlRWxlbWVudChTZXR0aW5nc0dyb3VwLCBPYmplY3QuYXNzaWduKHt9LCBzZWN0aW9uLCB7b25DaGFuZ2U6IHRoaXMucHJvcHMub25DaGFuZ2V9KSlcclxuICAgICAgICAgICAgXVxyXG4gICAgICAgIH0pXHJcbiAgICB9XHJcbn0iLCJpbXBvcnQge3NldHRpbmdzQ29va2llfSBmcm9tIFwiLi4vMGdsb2JhbHNcIjtcclxuaW1wb3J0IEJEVjIgZnJvbSBcIi4uL21vZHVsZXMvdjJcIjtcclxuXHJcbmltcG9ydCBTZXR0aW5nc1RpdGxlIGZyb20gXCIuL3NldHRpbmdzVGl0bGVcIjtcclxuaW1wb3J0IFN3aXRjaCBmcm9tIFwiLi9zd2l0Y2hcIjtcclxuXHJcbmV4cG9ydCBkZWZhdWx0IGNsYXNzIFYyQ19TZXR0aW5nc0dyb3VwIGV4dGVuZHMgQkRWMi5yZWFjdENvbXBvbmVudCB7XHJcblxyXG4gICAgY29uc3RydWN0b3IocHJvcHMpIHtcclxuICAgICAgICBzdXBlcihwcm9wcyk7XHJcbiAgICB9XHJcblxyXG4gICAgcmVuZGVyKCkge1xyXG4gICAgICAgIGNvbnN0IHt0aXRsZSwgc2V0dGluZ3MsIGJ1dHRvbn0gPSB0aGlzLnByb3BzO1xyXG4gICAgICAgIGNvbnN0IGJ1dHRvbkNvbXBvbmVudCA9IGJ1dHRvbiA/IEJEVjIucmVhY3QuY3JlYXRlRWxlbWVudChcImJ1dHRvblwiLCB7a2V5OiBcInRpdGxlLWJ1dHRvblwiLCBjbGFzc05hbWU6IFwiYmQtcGZidG5cIiwgb25DbGljazogYnV0dG9uLm9uQ2xpY2t9LCBidXR0b24udGl0bGUpIDogbnVsbDtcclxuICAgICAgICByZXR1cm4gW0JEVjIucmVhY3QuY3JlYXRlRWxlbWVudChTZXR0aW5nc1RpdGxlLCB7dGV4dDogdGl0bGV9KSxcclxuICAgICAgICAgICAgICAgIGJ1dHRvbkNvbXBvbmVudCxcclxuICAgICAgICAgICAgICAgIHNldHRpbmdzLm1hcChzZXR0aW5nID0+IHtcclxuICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkRWMi5yZWFjdC5jcmVhdGVFbGVtZW50KFN3aXRjaCwge2lkOiBzZXR0aW5nLmlkLCBrZXk6IHNldHRpbmcuaWQsIGRhdGE6IHNldHRpbmcsIGNoZWNrZWQ6IHNldHRpbmdzQ29va2llW3NldHRpbmcuaWRdLCBvbkNoYW5nZTogKGlkLCBjaGVja2VkKSA9PiB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMucHJvcHMub25DaGFuZ2UoaWQsIGNoZWNrZWQpO1xyXG4gICAgICAgICAgICAgICAgICAgIH19KTtcclxuICAgICAgICAgICAgICAgIH0pXTtcclxuICAgIH1cclxufSIsImltcG9ydCB7c2V0dGluZ3NDb29raWV9IGZyb20gXCIuLi8wZ2xvYmFsc1wiO1xyXG5pbXBvcnQgQkRWMiBmcm9tIFwiLi4vbW9kdWxlcy92MlwiO1xyXG5cclxuaW1wb3J0IFNldHRpbmdzVGl0bGUgZnJvbSBcIi4vc2V0dGluZ3NUaXRsZVwiO1xyXG5pbXBvcnQgU3dpdGNoIGZyb20gXCIuL3N3aXRjaFwiO1xyXG5cclxuZXhwb3J0IGRlZmF1bHQgY2xhc3MgVjJDX1NldHRpbmdzUGFuZWwgZXh0ZW5kcyBCRFYyLnJlYWN0Q29tcG9uZW50IHtcclxuXHJcbiAgICBjb25zdHJ1Y3Rvcihwcm9wcykge1xyXG4gICAgICAgIHN1cGVyKHByb3BzKTtcclxuICAgIH1cclxuXHJcbiAgICByZW5kZXIoKSB7XHJcbiAgICAgICAgY29uc3Qge3NldHRpbmdzfSA9IHRoaXMucHJvcHM7XHJcbiAgICAgICAgbGV0IGNvbHVtbk1vZHVsZSA9IEJETW9kdWxlcy5nZXQoZSA9PiBlLmNvbnRlbnRDb2x1bW5EZWZhdWx0KVswXVxyXG4gICAgICAgIHJldHVybiBCRFYyLnJlYWN0LmNyZWF0ZUVsZW1lbnQoXHJcbiAgICAgICAgICAgIFwiZGl2XCIsXHJcbiAgICAgICAgICAgIHtjbGFzc05hbWU6IGNvbHVtbk1vZHVsZS5jb250ZW50Q29sdW1uK1wiIFwiK2NvbHVtbk1vZHVsZS5jb250ZW50Q29sdW1uRGVmYXVsdCtcIiBjb250ZW50LWNvbHVtbiBkZWZhdWx0XCJ9LFxyXG4gICAgICAgICAgICBCRFYyLnJlYWN0LmNyZWF0ZUVsZW1lbnQoU2V0dGluZ3NUaXRsZSwge3RleHQ6IHRoaXMucHJvcHMudGl0bGV9KSxcclxuICAgICAgICAgICAgdGhpcy5wcm9wcy5idXR0b24gJiYgQkRWMi5yZWFjdC5jcmVhdGVFbGVtZW50KFwiYnV0dG9uXCIsIHtrZXk6IFwidGl0bGUtYnV0dG9uXCIsIGNsYXNzTmFtZTogXCJiZC1wZmJ0blwiLCBvbkNsaWNrOiB0aGlzLnByb3BzLmJ1dHRvbi5vbkNsaWNrfSwgdGhpcy5wcm9wcy5idXR0b24udGl0bGUpLFxyXG4gICAgICAgICAgICBzZXR0aW5ncy5tYXAoc2V0dGluZyA9PiB7XHJcbiAgICAgICAgICAgICAgICByZXR1cm4gQkRWMi5yZWFjdC5jcmVhdGVFbGVtZW50KFN3aXRjaCwge2lkOiBzZXR0aW5nLmlkLCBrZXk6IHNldHRpbmcuaWQsIGRhdGE6IHNldHRpbmcsIGNoZWNrZWQ6IHNldHRpbmdzQ29va2llW3NldHRpbmcuaWRdLCBvbkNoYW5nZTogKGlkLCBjaGVja2VkKSA9PiB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMucHJvcHMub25DaGFuZ2UoaWQsIGNoZWNrZWQpO1xyXG4gICAgICAgICAgICAgICAgICAgIH19KTtcclxuICAgICAgICAgICAgfSlcclxuICAgICAgICApO1xyXG4gICAgfVxyXG59IiwiaW1wb3J0IEJEVjIgZnJvbSBcIi4uL21vZHVsZXMvdjJcIjtcclxuXHJcbmV4cG9ydCBkZWZhdWx0IGNsYXNzIFYyQ19TZXR0aW5nc1RpdGxlIGV4dGVuZHMgQkRWMi5yZWFjdENvbXBvbmVudCB7XHJcbiAgICBjb25zdHJ1Y3Rvcihwcm9wcykge1xyXG4gICAgICAgIHN1cGVyKHByb3BzKTtcclxuICAgIH1cclxuLy9oMi0yZ1dFLW8gdGl0bGUtM3NaV1lRIHNpemUxNi0xNGNHejUgaGVpZ2h0MjAtbU8yZUlOIHdlaWdodFNlbWlCb2xkLU5KZXh6aSBkYS1oMiBkYS10aXRsZSBkYS1zaXplMTYgZGEtaGVpZ2h0MjAgZGEtd2VpZ2h0U2VtaUJvbGQgZGVmYXVsdENvbG9yLTFfYWpYMCBkYS1kZWZhdWx0Q29sb3IgbWFyZ2luVG9wNjAtM1BHYnRLIGRhLW1hcmdpblRvcDYwIG1hcmdpbkJvdHRvbTIwLTMycUlENyBkYS1tYXJnaW5Cb3R0b20yMFxyXG4gICAgcmVuZGVyKCkge1xyXG4gICAgICAgIHJldHVybiBCRFYyLnJlYWN0LmNyZWF0ZUVsZW1lbnQoXHJcbiAgICAgICAgICAgIFwiaDJcIixcclxuICAgICAgICAgICAge2NsYXNzTmFtZTogXCJ1aS1mb3JtLXRpdGxlIGgyIG1hcmdpbi1yZXNldCBtYXJnaW4tYm90dG9tLTIwXCJ9LFxyXG4gICAgICAgICAgICB0aGlzLnByb3BzLnRleHRcclxuICAgICAgICApO1xyXG4gICAgfVxyXG59IiwiaW1wb3J0IEJEVjIgZnJvbSBcIi4uL21vZHVsZXMvdjJcIjtcclxuXHJcbmltcG9ydCBUYWJCYXJTZXBhcmF0b3IgZnJvbSBcIi4vdGFiQmFyU2VwYXJhdG9yXCI7XHJcbmltcG9ydCBUYWJCYXJIZWFkZXIgZnJvbSBcIi4vdGFiQmFySGVhZGVyXCI7XHJcbmltcG9ydCBUYWJCYXJJdGVtIGZyb20gXCIuL3RhYkJhckl0ZW1cIjtcclxuXHJcbmV4cG9ydCBkZWZhdWx0IGNsYXNzIFYyQ19TaWRlQmFyIGV4dGVuZHMgQkRWMi5yZWFjdENvbXBvbmVudCB7XHJcblxyXG4gICAgY29uc3RydWN0b3IocHJvcHMpIHtcclxuICAgICAgICBzdXBlcihwcm9wcyk7XHJcbiAgICAgICAgY29uc3Qgc2kgPSBkb2N1bWVudC5xdWVyeVNlbGVjdG9yKFwiW2NsYXNzKj1zaWRlLV0gPiBbY2xhc3MqPXNlbGVjdGVkXVwiKTtcclxuICAgICAgICBpZiAoc2kpIHRoaXMuc2NuID0gc2kuY2xhc3NOYW1lO1xyXG4gICAgICAgIGNvbnN0IG5zID0gZG9jdW1lbnQucXVlcnlTZWxlY3RvcihcIltjbGFzcyo9c2lkZS1dID4gW2NsYXNzKj0naXRlbS0nXTpub3QoW2NsYXNzKj1zZWxlY3RlZF0pXCIpO1xyXG4gICAgICAgIGlmIChucykgdGhpcy5uc2NuID0gbnMuY2xhc3NOYW1lO1xyXG4gICAgICAgIGNvbnN0IHRhYnMgPSBkb2N1bWVudC5xdWVyeVNlbGVjdG9yQWxsKFwiW2NsYXNzKj0nc2lkZS0nXSA+IFtjbGFzcyo9J2l0ZW0tJ11cIik7XHJcbiAgICAgICAgZm9yIChjb25zdCBlbGVtZW50IG9mIHRhYnMpIHtcclxuICAgICAgICAgICAgZWxlbWVudC5hZGRFdmVudExpc3RlbmVyKFwiY2xpY2tcIiwgKCkgPT4ge1xyXG4gICAgICAgICAgICAgICAgdGhpcy5zZXRTdGF0ZSh7XHJcbiAgICAgICAgICAgICAgICAgICAgc2VsZWN0ZWQ6IG51bGxcclxuICAgICAgICAgICAgICAgIH0pO1xyXG4gICAgICAgICAgICB9KTtcclxuICAgICAgICB9XHJcbiAgICAgICAgXHJcbiAgICAgICAgdGhpcy5zZXRJbml0aWFsU3RhdGUoKTtcclxuICAgICAgICB0aGlzLm9uQ2xpY2sgPSB0aGlzLm9uQ2xpY2suYmluZCh0aGlzKTtcclxuICAgICAgICB0aGlzLnNldFNlbGVjdGVkID0gdGhpcy5zZXRTZWxlY3RlZC5iaW5kKHRoaXMpO1xyXG5cclxuICAgICAgICBzaWRlYmFycy5wdXNoKHRoaXMpXHJcbiAgICB9XHJcblxyXG4gICAgc2V0SW5pdGlhbFN0YXRlKCkge1xyXG4gICAgICAgIGNvbnN0IHNlbGYgPSB0aGlzO1xyXG4gICAgICAgIHNlbGYuc3RhdGUgPSB7XHJcbiAgICAgICAgICAgIHNlbGVjdGVkOiBudWxsLFxyXG4gICAgICAgICAgICBpdGVtczogc2VsZi5wcm9wcy5pdGVtc1xyXG4gICAgICAgIH07XHJcblxyXG4gICAgICAgIGNvbnN0IGluaXRpYWxTZWxlY3Rpb24gPSBzZWxmLnByb3BzLml0ZW1zLmZpbmQoaXRlbSA9PiB7XHJcbiAgICAgICAgICAgIHJldHVybiBpdGVtLnNlbGVjdGVkO1xyXG4gICAgICAgIH0pO1xyXG4gICAgICAgIGlmIChpbml0aWFsU2VsZWN0aW9uKSB7XHJcbiAgICAgICAgICAgIHNlbGYuc3RhdGUuc2VsZWN0ZWQgPSBpbml0aWFsU2VsZWN0aW9uLmlkO1xyXG4gICAgICAgIH1cclxuICAgIH1cclxuXHJcbiAgICByZW5kZXIoKSB7XHJcbiAgICAgICAgY29uc3Qgc2VsZiA9IHRoaXM7XHJcbiAgICAgICAgY29uc3Qge2hlYWRlclRleHR9ID0gc2VsZi5wcm9wcztcclxuICAgICAgICBjb25zdCB7aXRlbXMsIHNlbGVjdGVkfSA9IHNlbGYuc3RhdGU7XHJcbiAgICAgICAgcmV0dXJuIEJEVjIucmVhY3QuY3JlYXRlRWxlbWVudChcclxuICAgICAgICAgICAgXCJkaXZcIixcclxuICAgICAgICAgICAgbnVsbCxcclxuICAgICAgICAgICAgQkRWMi5yZWFjdC5jcmVhdGVFbGVtZW50KFRhYkJhclNlcGFyYXRvciwgbnVsbCksXHJcbiAgICAgICAgICAgIEJEVjIucmVhY3QuY3JlYXRlRWxlbWVudChUYWJCYXJIZWFkZXIsIHt0ZXh0OiBoZWFkZXJUZXh0LCBidXR0b246IHRoaXMucHJvcHMuaGVhZGVyQnV0dG9ufSksXHJcbiAgICAgICAgICAgIGl0ZW1zLm1hcChpdGVtID0+IHtcclxuICAgICAgICAgICAgICAgIGNvbnN0IHtpZCwgdGV4dH0gPSBpdGVtO1xyXG4gICAgICAgICAgICAgICAgcmV0dXJuIEJEVjIucmVhY3QuY3JlYXRlRWxlbWVudChUYWJCYXJJdGVtLCB7a2V5OiBpZCwgc2VsZWN0ZWQ6IHNlbGVjdGVkID09PSBpZCwgdGV4dDogdGV4dCwgaWQ6IGlkLCBvbkNsaWNrOiBzZWxmLm9uQ2xpY2t9KTtcclxuICAgICAgICAgICAgfSlcclxuICAgICAgICApO1xyXG4gICAgfVxyXG5cclxuICAgIHNldFNlbGVjdGVkKGUpIHtcclxuICAgICAgICBlLnRhcmdldC5jbGFzc05hbWUgPSB0aGlzLnNjbjtcclxuICAgIH1cclxuXHJcbiAgICBvbkNsaWNrKGlkKSB7XHJcbiAgICAgICAgY29uc3Qgc2kgPSBkb2N1bWVudC5xdWVyeVNlbGVjdG9yKFwiW2NsYXNzKj1zaWRlXSA+IFtjbGFzcyo9c2VsZWN0ZWRdXCIpO1xyXG4gICAgICAgIGlmIChzaSkge1xyXG4gICAgICAgICAgICBzaS5yZW1vdmVFdmVudExpc3RlbmVyKFwiY2xpY2tcIiwgdGhpcy5zZXRTZWxlY3RlZCk7XHJcbiAgICAgICAgICAgIHNpLmFkZEV2ZW50TGlzdGVuZXIoXCJjbGlja1wiLCB0aGlzLnNldFNlbGVjdGVkKTtcclxuICAgICAgICAgICAgc2kuY2xhc3NOYW1lID0gdGhpcy5uc2NuO1xyXG4gICAgICAgIH1cclxuXHJcbiAgICAgICAgc2V0VW5zZWxlY3RlZCgpXHJcbiAgICAgICAgdGhpcy5zZXRTdGF0ZSh7c2VsZWN0ZWQ6IGlkfSk7XHJcblxyXG4gICAgICAgIGlmICh0aGlzLnByb3BzLm9uQ2xpY2spIHRoaXMucHJvcHMub25DbGljayhpZCk7XHJcbiAgICB9XHJcblxyXG4gICAgY29tcG9uZW50V2lsbFVubW91bnQoKXtcclxuICAgICAgICBsZXQgc2lkZWJhckluZGV4ID0gc2lkZWJhcnMuZmluZEluZGV4KGUgPT4gZSA9PT0gdGhpcylcclxuICAgICAgICBpZihzaWRlYmFySW5kZXgpc2lkZWJhcnMuc3BsaWNlKHNpZGViYXJJbmRleCwgMSlcclxuICAgIH1cclxufVxyXG5cclxuY29uc3Qgc2lkZWJhcnMgPSBbXVxyXG5cclxuZXhwb3J0IGZ1bmN0aW9uIHNldFVuc2VsZWN0ZWQoKXtcclxuICAgIHNpZGViYXJzLmZvckVhY2goKHNpZGViYXIpID0+IHtcclxuICAgICAgICBpZighc2lkZWJhci5zdGF0ZS5zZWxlY3RlZClyZXR1cm5cclxuICAgICAgICBzaWRlYmFyLnNldFN0YXRlKHtcclxuICAgICAgICAgICAgc2VsZWN0ZWQ6IG51bGxcclxuICAgICAgICB9KVxyXG4gICAgfSlcclxufSIsImltcG9ydCBCRFYyIGZyb20gXCIuLi9tb2R1bGVzL3YyXCI7XHJcbmltcG9ydCBTd2l0Y2ggZnJvbSBcIi4vY29tcG9uZW50cy9zd2l0Y2hcIjtcclxuXHJcbmV4cG9ydCBkZWZhdWx0IGNsYXNzIFN3aXRjaEl0ZW0gZXh0ZW5kcyBCRFYyLnJlYWN0Q29tcG9uZW50IHtcclxuXHJcbiAgICBjb25zdHJ1Y3Rvcihwcm9wcykge1xyXG4gICAgICAgIHN1cGVyKHByb3BzKTtcclxuICAgICAgICB0aGlzLm9uQ2hhbmdlID0gdGhpcy5vbkNoYW5nZS5iaW5kKHRoaXMpO1xyXG4gICAgfVxyXG5cclxuICAgIG9uQ2hhbmdlKCkge1xyXG4gICAgICAgIHRoaXMucHJvcHMuY2hlY2tlZCA9ICF0aGlzLnByb3BzLmNoZWNrZWQ7XHJcbiAgICAgICAgdGhpcy5wcm9wcy5vbkNoYW5nZSh0aGlzLnByb3BzLmlkLCB0aGlzLnByb3BzLmNoZWNrZWQpO1xyXG4gICAgfVxyXG5cclxuICAgIHJlbmRlcigpIHtcclxuICAgICAgICBjb25zdCB7dGV4dCwgaW5mb30gPSB0aGlzLnByb3BzLmRhdGE7XHJcbiAgICAgICAgcmV0dXJuIEJEVjIucmVhY3QuY3JlYXRlRWxlbWVudChcImRpdlwiLCB7Y2xhc3NOYW1lOiBcInVpLWZsZXggZmxleC12ZXJ0aWNhbCBmbGV4LWp1c3RpZnktc3RhcnQgZmxleC1hbGlnbi1zdHJldGNoIGZsZXgtbm93cmFwIHVpLXN3aXRjaC1pdGVtXCJ9LFxyXG4gICAgICAgICAgICBCRFYyLnJlYWN0LmNyZWF0ZUVsZW1lbnQoXCJkaXZcIiwge2NsYXNzTmFtZTogXCJ1aS1mbGV4IGZsZXgtaG9yaXpvbnRhbCBmbGV4LWp1c3RpZnktc3RhcnQgZmxleC1hbGlnbi1zdHJldGNoIGZsZXgtbm93cmFwXCJ9LFxyXG4gICAgICAgICAgICAgICAgQkRWMi5yZWFjdC5jcmVhdGVFbGVtZW50KFwiaDNcIiwge2NsYXNzTmFtZTogXCJ1aS1mb3JtLXRpdGxlIGgzIG1hcmdpbi1yZXNldCBtYXJnaW4tcmVzZXQgdWktZmxleC1jaGlsZFwifSwgdGV4dCksXHJcbiAgICAgICAgICAgICAgICBCRFYyLnJlYWN0LmNyZWF0ZUVsZW1lbnQoU3dpdGNoLCB7b25DaGFuZ2U6IHRoaXMub25DaGFuZ2UsIGNoZWNrZWQ6IHRoaXMucHJvcHMuY2hlY2tlZH0pXHJcbiAgICAgICAgICAgICksXHJcbiAgICAgICAgICAgIEJEVjIucmVhY3QuY3JlYXRlRWxlbWVudChcImRpdlwiLCB7Y2xhc3NOYW1lOiBcInVpLWZvcm0tdGV4dCBzdHlsZS1kZXNjcmlwdGlvbiBtYXJnaW4tdG9wLTRcIiwgc3R5bGU6IHtmbGV4OiBcIjEgMSBhdXRvXCJ9fSwgaW5mbylcclxuICAgICAgICApO1xyXG4gICAgfVxyXG59IiwiaW1wb3J0IEJEVjIgZnJvbSBcIi4uL21vZHVsZXMvdjJcIjtcclxuXHJcbmV4cG9ydCBkZWZhdWx0IGNsYXNzIFYyQ19UYWJCYXJIZWFkZXIgZXh0ZW5kcyBCRFYyLnJlYWN0Q29tcG9uZW50IHtcclxuICAgIGNvbnN0cnVjdG9yKHByb3BzKSB7XHJcbiAgICAgICAgc3VwZXIocHJvcHMpO1xyXG4gICAgfVxyXG5cclxuICAgIHJlbmRlcigpIHtcclxuICAgICAgICByZXR1cm4gQkRWMi5yZWFjdC5jcmVhdGVFbGVtZW50KFwiZGl2XCIse2NsYXNzTmFtZTogXCJ1aS10YWItYmFyLWhlYWRlclwifSwgdGhpcy5wcm9wcy50ZXh0LCB0aGlzLnByb3BzLmJ1dHRvbik7XHJcbiAgICB9XHJcbn0iLCJpbXBvcnQgQkRWMiBmcm9tIFwiLi4vbW9kdWxlcy92MlwiO1xyXG5cclxuZXhwb3J0IGRlZmF1bHQgY2xhc3MgVjJDX1RhYkJhckl0ZW0gZXh0ZW5kcyBCRFYyLnJlYWN0Q29tcG9uZW50IHtcclxuXHJcbiAgICBjb25zdHJ1Y3Rvcihwcm9wcykge1xyXG4gICAgICAgIHN1cGVyKHByb3BzKTtcclxuICAgICAgICB0aGlzLnNldEluaXRpYWxTdGF0ZSgpO1xyXG4gICAgICAgIHRoaXMub25DbGljayA9IHRoaXMub25DbGljay5iaW5kKHRoaXMpO1xyXG4gICAgfVxyXG5cclxuICAgIHNldEluaXRpYWxTdGF0ZSgpIHtcclxuICAgICAgICB0aGlzLnN0YXRlID0ge1xyXG4gICAgICAgICAgICBzZWxlY3RlZDogdGhpcy5wcm9wcy5zZWxlY3RlZCB8fCBmYWxzZVxyXG4gICAgICAgIH07XHJcbiAgICB9XHJcblxyXG4gICAgcmVuZGVyKCkge1xyXG4gICAgICAgIHJldHVybiBCRFYyLnJlYWN0LmNyZWF0ZUVsZW1lbnQoXHJcbiAgICAgICAgICAgIFwiZGl2XCIsXHJcbiAgICAgICAgICAgIHtjbGFzc05hbWU6IGB1aS10YWItYmFyLWl0ZW0ke3RoaXMucHJvcHMuc2VsZWN0ZWQgPyBcIiBzZWxlY3RlZFwiIDogXCJcIn1gLCBvbkNsaWNrOiB0aGlzLm9uQ2xpY2t9LFxyXG4gICAgICAgICAgICB0aGlzLnByb3BzLnRleHRcclxuICAgICAgICApO1xyXG4gICAgfVxyXG5cclxuICAgIG9uQ2xpY2soKSB7XHJcbiAgICAgICAgaWYgKHRoaXMucHJvcHMub25DbGljaykge1xyXG4gICAgICAgICAgICB0aGlzLnByb3BzLm9uQ2xpY2sodGhpcy5wcm9wcy5pZCk7XHJcbiAgICAgICAgfVxyXG4gICAgfVxyXG59IiwiaW1wb3J0IEJEVjIgZnJvbSBcIi4uL21vZHVsZXMvdjJcIjtcclxuXHJcbmV4cG9ydCBkZWZhdWx0IGNsYXNzIFYyQ19UYWJCYXJTZXBhcmF0b3IgZXh0ZW5kcyBCRFYyLnJlYWN0Q29tcG9uZW50IHtcclxuICAgIGNvbnN0cnVjdG9yKHByb3BzKSB7XHJcbiAgICAgICAgc3VwZXIocHJvcHMpO1xyXG4gICAgfVxyXG5cclxuICAgIHJlbmRlcigpIHtcclxuICAgICAgICByZXR1cm4gQkRWMi5yZWFjdC5jcmVhdGVFbGVtZW50KFwiZGl2XCIsIHtjbGFzc05hbWU6IFwidWktdGFiLWJhci1zZXBhcmF0b3IgbWFyZ2luLXRvcC04IG1hcmdpbi1ib3R0b20tOFwifSk7XHJcbiAgICB9XHJcbn0iLCJcInVzZSBzdHJpY3RcIjtcclxuaW1wb3J0IEJEVjIgZnJvbSBcIi4uL21vZHVsZXMvdjJcIlxyXG5jb25zdCBSZWFjdCA9IEJEVjIucmVhY3RcclxuXHJcbmNvbnN0IGludGVydmFsTW9kdWxlMSA9IEJETW9kdWxlcy5nZXQoZSA9PiBlLkludGVydmFsKVswXVxyXG5cclxuXHJcbmV4cG9ydCBkZWZhdWx0IGZ1bmN0aW9uKGNvbXBvbmVudCwgTWVzc2FnZXMpIHtcclxuICAgIGNsYXNzIFRpbWVSZW5kZXIgZXh0ZW5kcyBSZWFjdC5QdXJlQ29tcG9uZW50IHtcclxuICAgICAgICBjb25zdHJ1Y3Rvcihwcm9wcyl7XHJcbiAgICAgICAgICAgIHN1cGVyKHByb3BzKVxyXG4gICAgICAgICAgICB0aGlzLl9pbnRlcnZhbCA9IG5ldyBpbnRlcnZhbE1vZHVsZTEuSW50ZXJ2YWwoKVxyXG5cclxuICAgICAgICAgICAgdGhpcy5zdGF0ZSA9IE9iamVjdC5hc3NpZ24oe30sIHRoaXMuZ2V0VXBkYXRlZFRpbWUoKSlcclxuICAgICAgICB9XHJcblxyXG4gICAgICAgIGNvbXBvbmVudERpZE1vdW50KCl7XHJcbiAgICAgICAgICAgIGxldCBzZWxmID0gdGhpcztcclxuICAgICAgICAgICAgdGhpcy5faW50ZXJ2YWwuc3RhcnQoMWUzLCAoZnVuY3Rpb24oKSB7XHJcbiAgICAgICAgICAgICAgICByZXR1cm4gc2VsZi5zZXRTdGF0ZShzZWxmLmdldFVwZGF0ZWRUaW1lKCkpXHJcbiAgICAgICAgICAgIH0pKVxyXG4gICAgICAgIH1cclxuXHJcbiAgICAgICAgY29tcG9uZW50V2lsbFVubW91bnQoKXtcclxuICAgICAgICAgICAgdGhpcy5faW50ZXJ2YWwuc3RvcCgpXHJcbiAgICAgICAgfVxyXG5cclxuICAgICAgICBjb21wb25lbnREaWRVcGRhdGUoYWN0aXZpdHkpe1xyXG4gICAgICAgICAgICBpZihhY3Rpdml0eS50aW1lc3RhbXBzLmVuZCA9PT0gdGhpcy5wcm9wcy50aW1lc3RhbXBzLmVuZCAmJiBhY3Rpdml0eS50aW1lc3RhbXBzLnN0YXJ0ID09PSB0aGlzLnByb3BzLnRpbWVzdGFtcHMuc3RhcnQpcmV0dXJuXHJcbiAgICAgICAgICAgIHRoaXMuc2V0U3RhdGUodGhpcy5nZXRVcGRhdGVkVGltZSgpKVxyXG4gICAgICAgIH1cclxuXHJcbiAgICAgICAgZ2V0VXBkYXRlZFRpbWUoKXtcclxuICAgICAgICAgICAgbGV0IHRpbWVzdGFtcHMgPSB0aGlzLnByb3BzLnRpbWVzdGFtcHNcclxuICAgICAgICAgICAgbGV0IG5vdyA9IERhdGUubm93KCkgLyAxZTM7XHJcbiAgICAgICAgICAgIGlmKG51bGwgIT0gdGltZXN0YW1wcy5lbmQpe1xyXG4gICAgICAgICAgICAgICAgcmV0dXJuIHRoaXMuZ2V0RGlmZihub3csIGNoZWNrVW5peCh0aW1lc3RhbXBzLmVuZCkgLyAxZTMpXHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgaWYobnVsbCAhPSB0aW1lc3RhbXBzLnN0YXJ0KXtcclxuICAgICAgICAgICAgICAgIHJldHVybiB0aGlzLmdldERpZmYoY2hlY2tVbml4KHRpbWVzdGFtcHMuc3RhcnQpIC8gMWUzLCBub3cpXHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgcmV0dXJuIHtcclxuICAgICAgICAgICAgICAgIGhvdXJzOiAwLFxyXG4gICAgICAgICAgICAgICAgbWludXRlczogMCxcclxuICAgICAgICAgICAgICAgIHNlY29uZHM6IDBcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgIH1cclxuXHJcbiAgICAgICAgcmVuZGVyVGltZShudW1iZXIsIHJlbW92ZVplcm8pe1xyXG4gICAgICAgICAgICBpZihyZW1vdmVaZXJvID09PSB1bmRlZmluZWQpcmVtb3ZlWmVybyA9IGZhbHNlXHJcbiAgICAgICAgICAgIGlmKHJlbW92ZVplcm8gJiYgbnVtYmVyIDw9IDApcmV0dXJuIC0xXHJcbiAgICAgICAgICAgIGlmKG51bWJlciA8IDEwKXJldHVybiBcIjBcIitudW1iZXJcclxuICAgICAgICAgICAgcmV0dXJuIG51bWJlclxyXG4gICAgICAgIH1cclxuXHJcbiAgICAgICAgZ2V0RGlmZih0aW1lc3RhbXAsIG5vdyl7XHJcbiAgICAgICAgICAgIGxldCBob3VycyA9IE1hdGgubWF4KG5vdyAtIHRpbWVzdGFtcCwgMClcclxuICAgICAgICAgICAgbGV0IHNlY29uZHMgPSBNYXRoLmZsb29yKGhvdXJzKSAlIDYwXHJcbiAgICAgICAgICAgIGxldCBtaW51dGVzID0gTWF0aC5mbG9vcihob3VycyAvIDYwKSAlIDYwXHJcbiAgICAgICAgICAgIHJldHVybiB7XHJcbiAgICAgICAgICAgICAgICBob3VyczogTWF0aC5mbG9vcihob3VycyAvIDM2MDApICUgMjQsXHJcbiAgICAgICAgICAgICAgICBtaW51dGVzLFxyXG4gICAgICAgICAgICAgICAgc2Vjb25kc1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgfVxyXG5cclxuICAgICAgICByZW5kZXIoKXtcclxuICAgICAgICAgICAgbGV0IHByb3BzID0gdGhpcy5wcm9wc1xyXG4gICAgICAgICAgICBsZXQgdGltZXN0YW1wcyA9IHByb3BzLnRpbWVzdGFtcHNcclxuXHJcbiAgICAgICAgICAgIGxldCB1c2VkUHJvcHMgPSBmdW5jdGlvbihwcm9wcywgaXRlbXMpIHtcclxuICAgICAgICAgICAgICAgIGlmIChudWxsID09IHByb3BzKSByZXR1cm4ge307XHJcblxyXG4gICAgICAgICAgICAgICAgbGV0IHRpbWVzdGFtcHMgPSB7fVxyXG4gICAgICAgICAgICAgICAgbGV0IGtleXMgPSBPYmplY3Qua2V5cyhwcm9wcyk7XHJcblxyXG4gICAgICAgICAgICAgICAgZm9yIChsZXQgaSA9IDA7IGkgPCBrZXlzLmxlbmd0aDsgaSsrKXtcclxuICAgICAgICAgICAgICAgICAgICBsZXQga2V5ID0ga2V5c1tpXVxyXG4gICAgICAgICAgICAgICAgICAgIGlmKCFpdGVtcy5pbmRleE9mKGtleSkgPj0gMCl7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIHRpbWVzdGFtcHNba2V5XSA9IHByb3BzW2tleV1cclxuICAgICAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgICB9XHJcblxyXG4gICAgICAgICAgICAgICAgcmV0dXJuIHRpbWVzdGFtcHNcclxuICAgICAgICAgICAgfShwcm9wcywgW1widGltZXN0YW1wc1wiXSlcclxuXHJcbiAgICAgICAgICAgIGxldCBzdGF0ZSA9IHRoaXMuc3RhdGVcclxuICAgICAgICAgICAgbGV0IGhvdXJzID0gc3RhdGUuaG91cnNcclxuICAgICAgICAgICAgbGV0IG1pbnV0ZXMgPSBzdGF0ZS5taW51dGVzXHJcbiAgICAgICAgICAgIGxldCBzZWNvbmRzID0gc3RhdGUuc2Vjb25kc1xyXG4gICAgICAgICAgICBsZXQgZGF0YSA9IHtcclxuICAgICAgICAgICAgICAgIGhvdXJzOiB0aGlzLnJlbmRlclRpbWUoaG91cnMsICEwKSxcclxuICAgICAgICAgICAgICAgIG1pbnV0ZXM6IHRoaXMucmVuZGVyVGltZShtaW51dGVzKSxcclxuICAgICAgICAgICAgICAgIHNlY29uZHM6IHRoaXMucmVuZGVyVGltZShzZWNvbmRzKVxyXG4gICAgICAgICAgICB9O1xyXG4gICAgICAgICAgICBpZih0aW1lc3RhbXBzLmVuZCAhPT0gbnVsbCl7XHJcbiAgICAgICAgICAgICAgICByZXR1cm4gUmVhY3QuY3JlYXRlRWxlbWVudChjb21wb25lbnQsIE9iamVjdC5hc3NpZ24oe30sIHVzZWRQcm9wcywge1xyXG4gICAgICAgICAgICAgICAgICAgIG1lc3NhZ2U6IE1lc3NhZ2VzLlVTRVJfQUNUSVZJVFlfVElNRVNUQU1QX0VORC5mb3JtYXQoZGF0YSlcclxuICAgICAgICAgICAgICAgIH0pKVxyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIGlmKHRpbWVzdGFtcHMuc3RhcnQgIT09IG51bGwpe1xyXG4gICAgICAgICAgICAgICAgcmV0dXJuIFJlYWN0LmNyZWF0ZUVsZW1lbnQoY29tcG9uZW50LCBPYmplY3QuYXNzaWduKHt9LCB1c2VkUHJvcHMsIHtcclxuICAgICAgICAgICAgICAgICAgICBtZXNzYWdlOiBNZXNzYWdlcy5VU0VSX0FDVElWSVRZX1RJTUVTVEFNUF9TVEFSVC5mb3JtYXQoZGF0YSlcclxuICAgICAgICAgICAgICAgIH0pKVxyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIHJldHVybiBudWxsXHJcbiAgICAgICAgfVxyXG4gICAgfVxyXG4gICAgcmV0dXJuIFRpbWVSZW5kZXJcclxufTtcclxuXHJcbmZ1bmN0aW9uIGNoZWNrVW5peChlKSB7XHJcbiAgICByZXR1cm4gKFwiXCIgKyBlKS5sZW5ndGggPCAxMyA/IDFlMyAqIGUgOiBlXHJcbn0iLCJpbXBvcnQgQkRWMiBmcm9tIFwiLi4vbW9kdWxlcy92MlwiO1xyXG5cclxuaW1wb3J0IFhTdmcgZnJvbSBcIi4veFN2Z1wiO1xyXG5cclxuZXhwb3J0IGRlZmF1bHQgY2xhc3MgVjJDX1Rvb2xzIGV4dGVuZHMgQkRWMi5yZWFjdENvbXBvbmVudCB7XHJcblxyXG4gICAgY29uc3RydWN0b3IocHJvcHMpIHtcclxuICAgICAgICBzdXBlcihwcm9wcyk7XHJcbiAgICAgICAgdGhpcy5vbkNsaWNrID0gdGhpcy5vbkNsaWNrLmJpbmQodGhpcyk7XHJcbiAgICB9XHJcblxyXG4gICAgcmVuZGVyKCkge1xyXG4gICAgICAgIGxldCB0b29sc01vZHVsZSA9IEJETW9kdWxlcy5nZXQoZSA9PiBlLnRvb2xzQ29udGFpbmVyKVswXVxyXG4gICAgICAgIGxldCBjb250YWluZXJNb2R1bGUgPSBCRE1vZHVsZXMuZ2V0KGUgPT4gZS5jb250YWluZXIgJiYgZS5jbG9zZUJ1dHRvbiAmJiBlLmNsb3NlQnV0dG9uQm9sZClbMF1cclxuICAgICAgICByZXR1cm4gQkRWMi5yZWFjdC5jcmVhdGVFbGVtZW50KFwiZGl2XCIsIHtjbGFzc05hbWU6IFwidG9vbHMtY29udGFpbmVyIFwiK3Rvb2xzTW9kdWxlLnRvb2xzQ29udGFpbmVyfSxcclxuICAgICAgICAgICAgQkRWMi5yZWFjdC5jcmVhdGVFbGVtZW50KFwiZGl2XCIsIHtjbGFzc05hbWU6IFwidG9vbHMgXCIrdG9vbHNNb2R1bGUudG9vbHN9LFxyXG4gICAgICAgICAgICAgICAgQkRWMi5yZWFjdC5jcmVhdGVFbGVtZW50KFwiZGl2XCIsIHtjbGFzc05hbWU6IGNvbnRhaW5lck1vZHVsZS5jb250YWluZXJ9LFxyXG4gICAgICAgICAgICAgICAgICAgIEJEVjIucmVhY3QuY3JlYXRlRWxlbWVudChcImRpdlwiLFxyXG4gICAgICAgICAgICAgICAgICAgICAgICB7Y2xhc3NOYW1lOiBcImJ0bi1jbG9zZSBcIitjb250YWluZXJNb2R1bGUuY2xvc2VCdXR0b24sIG9uQ2xpY2s6IHRoaXMub25DbGlja30sXHJcbiAgICAgICAgICAgICAgICAgICAgICAgIEJEVjIucmVhY3QuY3JlYXRlRWxlbWVudChYU3ZnLCBudWxsKVxyXG4gICAgICAgICAgICAgICAgICAgICksXHJcbiAgICAgICAgICAgICAgICAgICAgQkRWMi5yZWFjdC5jcmVhdGVFbGVtZW50KFxyXG4gICAgICAgICAgICAgICAgICAgICAgICBcImRpdlwiLFxyXG4gICAgICAgICAgICAgICAgICAgICAgICB7Y2xhc3NOYW1lOiBcImVzYy10ZXh0IFwiK2NvbnRhaW5lck1vZHVsZS5rZXliaW5kfSxcclxuICAgICAgICAgICAgICAgICAgICAgICAgXCJFU0NcIlxyXG4gICAgICAgICAgICAgICAgICAgIClcclxuICAgICAgICAgICAgICAgIClcclxuICAgICAgICAgICAgKVxyXG4gICAgICAgICk7XHJcbiAgICB9XHJcblxyXG4gICAgb25DbGljaygpIHtcclxuICAgICAgICBpZiAodGhpcy5wcm9wcy5vbkNsaWNrKSB7XHJcbiAgICAgICAgICAgIHRoaXMucHJvcHMub25DbGljaygpO1xyXG4gICAgICAgIH1cclxuICAgICAgICBjb25zdCBjbG9zZUJ1dHRvbiA9IGRvY3VtZW50LnF1ZXJ5U2VsZWN0b3IoXCIuXCIrQkRNb2R1bGVzLmdldChlID0+IGUuY2xvc2VCdXR0b24gJiYgZS5rZXliaW5kQm9sZClbMF0uY2xvc2VCdXR0b24uc3BsaXQoXCIgXCIpWzBdKTtcclxuICAgICAgICBpZiAoY2xvc2VCdXR0b24pIGNsb3NlQnV0dG9uLmNsaWNrKCk7XHJcbiAgICB9XHJcbn0iLCIvKipcclxuICogVG9vbHRpcCB0aGF0IGF1dG9tYXRpY2FsbHkgc2hvdyBhbmQgaGlkZSB0aGVtc2VsdmVzIG9uIG1vdXNlZW50ZXIgYW5kIG1vdXNlbGVhdmUgZXZlbnRzLlxyXG4gKiBXaWxsIGFsc28gcmVtb3ZlIHRoZW1zZWx2ZXMgaWYgdGhlIG5vZGUgdG8gd2F0Y2ggaXMgcmVtb3ZlZCBmcm9tIERPTSB0aHJvdWdoXHJcbiAqIGEgTXV0YXRpb25PYnNlcnZlci5cclxuICpcclxuICogTm90ZSB0aGlzIGlzIG5vdCB1c2luZyBEaXNjb3JkJ3MgaW50ZXJuYWxzIGJ1dCBub3JtYWwgRE9NIG1hbmlwdWxhdGlvbiBhbmQgZW11bGF0ZXNcclxuICogRGlzY29yZCdzIG93biB0b29sdGlwcyBhcyBjbG9zZWx5IGFzIHBvc3NpYmxlLlxyXG4gKlxyXG4gKiBAbW9kdWxlIEVtdWxhdGVkVG9vbHRpcFxyXG4gKiBAdmVyc2lvbiAwLjAuMVxyXG4gKi9cclxuXHJcbmltcG9ydCBVdGlscyBmcm9tIFwiLi4vbW9kdWxlcy91dGlsc1wiO1xyXG5pbXBvcnQgV2VicGFja01vZHVsZXMgZnJvbSBcIi4uL21vZHVsZXMvd2VicGFja01vZHVsZXNcIjtcclxuXHJcbi8vPGRpdiBjbGFzcz1cImxheWVyLXY5SHlZYyBkaXNhYmxlZFBvaW50ZXJFdmVudHMtMXB0Z1RCXCIgc3R5bGU9XCJwb3NpdGlvbjogYWJzb2x1dGU7IGxlZnQ6IDIzN3B4OyBib3R0b206IDUxcHg7XCI+XHJcbi8vXHQ8ZGl2IGNsYXNzPVwidG9vbHRpcC0yUWZMdGMgdG9vbHRpcFRvcC1YRERTeHggdG9vbHRpcEJsYWNrLVBQRzQ3eiB0b29sdGlwRGlzYWJsZVBvaW50ZXJFdmVudHMtM2VhQkdOXCIgc3R5bGU9XCJvcGFjaXR5OiAxOyB0cmFuc2Zvcm06IG5vbmU7XCI+XHJcbi8vXHRcdDxkaXYgY2xhc3M9XCJ0b29sdGlwUG9pbnRlci0zWmZpcktcIj48L2Rpdj5cclxuLy9cdFx0PGRpdiBjbGFzcz1cInRvb2x0aXBDb250ZW50LWJxVkxXS1wiPlVzZXIgU2V0dGluZ3M8L2Rpdj5cclxuLy9cdDwvZGl2PlxyXG4vLzwvZGl2PlxyXG5cclxuLy88ZGl2IGNsYXNzPVwibGF5ZXItdjlIeVljXCIgc3R5bGU9XCJ0b3A6IDg2MHB4OyBsZWZ0OiA2MzIuNXB4O1wiPlxyXG4vL1x0PGRpdiBjbGFzcz1cInRvb2x0aXAtMlFmTHRjIHRvb2x0aXBCbGFjay1QUEc0N3ogdG9vbHRpcFRvcC1YRERTeHhcIj5cclxuLy9cdFx0PGRpdiBjbGFzcz1cInRvb2x0aXBQb2ludGVyLTNaZmlyS1wiPjwvZGl2PlxyXG4vL1x0XHRDaGFuZ2Vsb2dcclxuLy9cdDwvZGl2PlxyXG4vLzwvZGl2PlxyXG5sZXQgVG9vbHRpcENsYXNzZXNcclxuZnVuY3Rpb24gZ2V0VG9vbHRpcENsYXNzZXMoKXtcclxuXHRpZihUb29sdGlwQ2xhc3NlcylyZXR1cm4gVG9vbHRpcENsYXNzZXNcclxuXHRyZXR1cm4gVG9vbHRpcENsYXNzZXMgPSBXZWJwYWNrTW9kdWxlcy5maW5kQnlQcm9wcyhcInRvb2x0aXBcIiwgXCJ0b29sdGlwQmxhY2tcIik7XHJcbn1cclxubGV0IFRvb2x0aXBMYXllcnNcclxuZnVuY3Rpb24gZ2V0VG9vbHRpcExheWVycygpe1xyXG5cdGlmKFRvb2x0aXBMYXllcnMpcmV0dXJuIFRvb2x0aXBMYXllcnNcclxuXHRyZXR1cm4gVG9vbHRpcExheWVycyA9IFdlYnBhY2tNb2R1bGVzLmZpbmRCeVByb3BzKFwibGF5ZXJcIiwgXCJsYXllckNvbnRhaW5lclwiKTtcclxufVxyXG5cclxuY29uc3QgZ2V0Q2xhc3MgPSBmdW5jdGlvbihzaWRlT3JDb2xvcikge1xyXG4gICAgY29uc3QgdXBwZXJDYXNlID0gc2lkZU9yQ29sb3JbMF0udG9VcHBlckNhc2UoKSArIHNpZGVPckNvbG9yLnNsaWNlKDEpO1xyXG4gICAgY29uc3QgdG9vbHRpcENsYXNzID0gZ2V0VG9vbHRpcENsYXNzZXMoKVtgdG9vbHRpcCR7dXBwZXJDYXNlfWBdO1xyXG4gICAgaWYgKHRvb2x0aXBDbGFzcykgcmV0dXJuIHRvb2x0aXBDbGFzcztcclxuICAgIHJldHVybiBudWxsO1xyXG59O1xyXG5cclxuY29uc3QgY2xhc3NFeGlzdHMgPSBmdW5jdGlvbihzaWRlT3JDb2xvcikge1xyXG4gICAgcmV0dXJuIGdldENsYXNzKHNpZGVPckNvbG9yKSA/IHRydWUgOiBmYWxzZTtcclxufTtcclxuXHJcbmNvbnN0IHRvUHggPSBmdW5jdGlvbih2YWx1ZSkge1xyXG4gICAgcmV0dXJuIGAke3ZhbHVlfXB4YDtcclxufTtcclxuXHJcbi8qIDxkaXYgY2xhc3M9XCJsYXllci12OUh5WWMgZGEtbGF5ZXJcIiBzdHlsZT1cImxlZnQ6IDIzNC41cHg7IGJvdHRvbTogNTFweDtcIj5cclxuICAgIDxkaXYgY2xhc3M9XCJ0b29sdGlwLTJRZkx0YyBkYS10b29sdGlwIHRvb2x0aXBUb3AtWEREU3h4IHRvb2x0aXBCbGFjay1QUEc0N3pcIj5cclxuICAgICAgICA8ZGl2IGNsYXNzPVwidG9vbHRpcFBvaW50ZXItM1pmaXJLIGRhLXRvb2x0aXBQb2ludGVyXCI+PC9kaXY+XHJcbiAgICAgICAgVXNlciBTZXR0aW5nc1xyXG4gICAgPC9kaXY+XHJcbjwvZGl2PiAqL1xyXG5cclxuZXhwb3J0IGRlZmF1bHQgY2xhc3MgRW11bGF0ZWRUb29sdGlwIHtcclxuXHQvKipcclxuXHQgKlxyXG5cdCAqIEBjb25zdHJ1Y3RvclxyXG5cdCAqIEBwYXJhbSB7KEhUTUxFbGVtZW50fGpRdWVyeSl9IG5vZGUgLSBET00gbm9kZSB0byBtb25pdG9yIGFuZCBzaG93IHRoZSB0b29sdGlwIG9uXHJcblx0ICogQHBhcmFtIHtzdHJpbmd9IHRpcCAtIHN0cmluZyB0byBzaG93IGluIHRoZSB0b29sdGlwXHJcblx0ICogQHBhcmFtIHtvYmplY3R9IG9wdGlvbnMgLSBhZGRpdGlvbmFsIG9wdGlvbnMgZm9yIHRoZSB0b29sdGlwXHJcblx0ICogQHBhcmFtIHtzdHJpbmd9IFtvcHRpb25zLnN0eWxlPWJsYWNrXSAtIGNvcnJlbGF0ZXMgdG8gdGhlIGRpc2NvcmQgc3R5bGluZy9jb2xvcnMgKGJsYWNrLCBicmFuZCwgZ3JlZW4sIGdyZXksIHJlZCwgeWVsbG93KVxyXG5cdCAqIEBwYXJhbSB7c3RyaW5nfSBbb3B0aW9ucy5zaWRlPXRvcF0gLSBjYW4gYmUgYW55IG9mIHRvcCwgcmlnaHQsIGJvdHRvbSwgbGVmdFxyXG5cdCAqIEBwYXJhbSB7Ym9vbGVhbn0gW29wdGlvbnMucHJldmVudEZsaXA9ZmFsc2VdIC0gcHJldmVudHMgbW92aW5nIHRoZSB0b29sdGlwIHRvIHRoZSBvcHBvc2l0ZSBzaWRlIGlmIGl0IGlzIHRvbyBiaWcgb3IgZ29lcyBvZmZzY3JlZW5cclxuICAgICAqIEBwYXJhbSB7Ym9vbGVhbn0gW29wdGlvbnMuZGlzYWJsZWQ9ZmFsc2VdIC0gd2hldGhlciB0aGUgdG9vbHRpcCBzaG91bGQgYmUgZGlzYWJsZWQgZnJvbSBzaG93aW5nIG9uIGhvdmVyXHJcblx0ICovXHJcblx0Y29uc3RydWN0b3Iobm9kZSwgdGV4dCwgb3B0aW9ucyA9IHt9KSB7XHJcblx0XHRjb25zdCB7c3R5bGUgPSBcImJsYWNrXCIsIHNpZGUgPSBcInRvcFwiLCBwcmV2ZW50RmxpcCA9IGZhbHNlLCBkaXNhYmxlZCA9IGZhbHNlfSA9IG9wdGlvbnM7XHJcblx0XHR0aGlzLm5vZGUgPSBub2RlIGluc3RhbmNlb2YgalF1ZXJ5ID8gbm9kZVswXSA6IG5vZGU7XHJcbiAgICAgICAgdGhpcy5sYWJlbCA9IHRleHQ7XHJcbiAgICAgICAgdGhpcy5zdHlsZSA9IHN0eWxlLnRvTG93ZXJDYXNlKCk7XHJcblx0XHR0aGlzLnNpZGUgPSBzaWRlLnRvTG93ZXJDYXNlKCk7XHJcbiAgICAgICAgdGhpcy5wcmV2ZW50RmxpcCA9IHByZXZlbnRGbGlwO1xyXG4gICAgICAgIHRoaXMuZGlzYWJsZWQgPSBkaXNhYmxlZDtcclxuXHJcbiAgICAgICAgaWYgKCFjbGFzc0V4aXN0cyh0aGlzLnNpZGUpKSByZXR1cm4gVXRpbHMuZXJyKFwiRW11bGF0ZWRUb29sdGlwXCIsIGBTaWRlICR7dGhpcy5zaWRlfSBkb2VzIG5vdCBleGlzdC5gKTtcclxuXHRcdGlmICghY2xhc3NFeGlzdHModGhpcy5zdHlsZSkpIHJldHVybiBVdGlscy5lcnIoXCJFbXVsYXRlZFRvb2x0aXBcIiwgYFN0eWxlICR7dGhpcy5zdHlsZX0gZG9lcyBub3QgZXhpc3QuYCk7XHJcblx0XHRcclxuXHRcdHRoaXMuZWxlbWVudCA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoXCJkaXZcIik7XHJcblx0XHR0aGlzLmVsZW1lbnQuY2xhc3NOYW1lID0gZ2V0VG9vbHRpcExheWVycygpLmxheWVyICsgXCIgXCIgKyBnZXRUb29sdGlwTGF5ZXJzKCkuZGlzYWJsZWRQb2ludGVyRXZlbnRzO1xyXG5cclxuXHRcdHRoaXMudG9vbHRpcEVsZW1lbnQgPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KFwiZGl2XCIpO1xyXG5cdFx0dGhpcy50b29sdGlwRWxlbWVudC5jbGFzc05hbWUgPSBgJHtnZXRUb29sdGlwQ2xhc3NlcygpLnRvb2x0aXB9ICR7Z2V0Q2xhc3ModGhpcy5zdHlsZSl9YDtcclxuXHJcblx0XHR0aGlzLmxhYmVsRWxlbWVudCA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoXCJkaXZcIik7XHJcblx0XHR0aGlzLmxhYmVsRWxlbWVudC5jbGFzc05hbWUgPSBnZXRUb29sdGlwQ2xhc3NlcygpLnRvb2x0aXBDb250ZW50XHJcblxyXG5cdFx0Y29uc3QgcG9pbnRlckVsZW1lbnQgPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KFwiZGl2XCIpO1xyXG5cdFx0cG9pbnRlckVsZW1lbnQuY2xhc3NOYW1lID0gZ2V0VG9vbHRpcENsYXNzZXMoKS50b29sdGlwUG9pbnRlcjtcclxuXHJcblx0XHR0aGlzLnRvb2x0aXBFbGVtZW50LmFwcGVuZChwb2ludGVyRWxlbWVudCk7XHJcblx0XHR0aGlzLnRvb2x0aXBFbGVtZW50LmFwcGVuZCh0aGlzLmxhYmVsRWxlbWVudCk7XHJcblx0XHR0aGlzLmVsZW1lbnQuYXBwZW5kKHRoaXMudG9vbHRpcEVsZW1lbnQpO1xyXG5cclxuXHRcdHRoaXMubm9kZS5hZGRFdmVudExpc3RlbmVyKFwibW91c2VlbnRlclwiLCAoKSA9PiB7XHJcbiAgICAgICAgICAgIGlmICh0aGlzLmRpc2FibGVkKSByZXR1cm47XHJcbiAgICAgICAgICAgIHRoaXMuc2hvdygpO1xyXG5cclxuXHRcdFx0Y29uc3Qgb2JzZXJ2ZXIgPSBuZXcgTXV0YXRpb25PYnNlcnZlcigobXV0YXRpb25zKSA9PiB7XHJcblx0XHRcdFx0bXV0YXRpb25zLmZvckVhY2goKG11dGF0aW9uKSA9PiB7XHJcblx0XHRcdFx0XHRjb25zdCBub2RlcyA9IEFycmF5LmZyb20obXV0YXRpb24ucmVtb3ZlZE5vZGVzKTtcclxuXHRcdFx0XHRcdGNvbnN0IGRpcmVjdE1hdGNoID0gbm9kZXMuaW5kZXhPZih0aGlzLm5vZGUpID4gLTE7XHJcblx0XHRcdFx0XHRjb25zdCBwYXJlbnRNYXRjaCA9IG5vZGVzLnNvbWUocGFyZW50ID0+IHBhcmVudC5jb250YWlucyh0aGlzLm5vZGUpKTtcclxuXHRcdFx0XHRcdGlmIChkaXJlY3RNYXRjaCB8fCBwYXJlbnRNYXRjaCkge1xyXG5cdFx0XHRcdFx0XHR0aGlzLmhpZGUoKTtcclxuXHRcdFx0XHRcdFx0b2JzZXJ2ZXIuZGlzY29ubmVjdCgpO1xyXG5cdFx0XHRcdFx0fVxyXG5cdFx0XHRcdH0pO1xyXG5cdFx0XHR9KTtcclxuXHJcblx0XHRcdG9ic2VydmVyLm9ic2VydmUoZG9jdW1lbnQuYm9keSwge3N1YnRyZWU6IHRydWUsIGNoaWxkTGlzdDogdHJ1ZX0pO1xyXG5cdFx0fSk7XHJcblxyXG5cdFx0dGhpcy5ub2RlLmFkZEV2ZW50TGlzdGVuZXIoXCJtb3VzZWxlYXZlXCIsICgpID0+IHtcclxuXHRcdFx0dGhpcy5oaWRlKCk7XHJcblx0XHR9KTtcclxuICAgIH1cclxuXHJcbiAgICAvKiogQ29udGFpbmVyIHdoZXJlIHRoZSB0b29sdGlwIHdpbGwgYmUgYXBwZW5kZWQuICovXHJcbiAgICBnZXQgY29udGFpbmVyKCkgeyByZXR1cm4gZG9jdW1lbnQucXVlcnlTZWxlY3RvcihcIi5cIitCRE1vZHVsZXMuZ2V0KGUgPT4gZS5wb3BvdXRzKVswXS5wb3BvdXRzLnNwbGl0KFwiIFwiKVswXStcIiB+IC5cIitCRE1vZHVsZXMuZ2V0KGUgPT4gZS5sYXllckNvbnRhaW5lcilbMF0ubGF5ZXJDb250YWluZXIuc3BsaXQoXCIgXCIpWzBdKTsgfVxyXG4gICAgLyoqIEJvb2xlYW4gcmVwcmVzZW50aW5nIGlmIHRoZSB0b29sdGlwIHdpbGwgZml0IG9uIHNjcmVlbiBhYm92ZSB0aGUgZWxlbWVudCAqL1xyXG4gICAgZ2V0IGNhblNob3dBYm92ZSgpIHsgcmV0dXJuIHRoaXMubm9kZS5nZXRCb3VuZGluZ0NsaWVudFJlY3QoKS50b3AgLSB0aGlzLmVsZW1lbnQub2Zmc2V0SGVpZ2h0ID49IDA7IH1cclxuICAgIC8qKiBCb29sZWFuIHJlcHJlc2VudGluZyBpZiB0aGUgdG9vbHRpcCB3aWxsIGZpdCBvbiBzY3JlZW4gYmVsb3cgdGhlIGVsZW1lbnQgKi9cclxuICAgIGdldCBjYW5TaG93QmVsb3coKSB7IHJldHVybiB0aGlzLm5vZGUuZ2V0Qm91bmRpbmdDbGllbnRSZWN0KCkudG9wICsgdGhpcy5ub2RlLm9mZnNldEhlaWdodCArIHRoaXMuZWxlbWVudC5vZmZzZXRIZWlnaHQgPD0gVXRpbHMuc2NyZWVuSGVpZ2h0OyB9XHJcbiAgICAvKiogQm9vbGVhbiByZXByZXNlbnRpbmcgaWYgdGhlIHRvb2x0aXAgd2lsbCBmaXQgb24gc2NyZWVuIHRvIHRoZSBsZWZ0IG9mIHRoZSBlbGVtZW50ICovXHJcbiAgICBnZXQgY2FuU2hvd0xlZnQoKSB7IHJldHVybiB0aGlzLm5vZGUuZ2V0Qm91bmRpbmdDbGllbnRSZWN0KCkubGVmdCAtIHRoaXMuZWxlbWVudC5vZmZzZXRXaWR0aCA+PSAwOyB9XHJcbiAgICAvKiogQm9vbGVhbiByZXByZXNlbnRpbmcgaWYgdGhlIHRvb2x0aXAgd2lsbCBmaXQgb24gc2NyZWVuIHRvIHRoZSByaWdodCBvZiB0aGUgZWxlbWVudCAqL1xyXG5cdGdldCBjYW5TaG93UmlnaHQoKSB7IHJldHVybiB0aGlzLm5vZGUuZ2V0Qm91bmRpbmdDbGllbnRSZWN0KCkubGVmdCArIHRoaXMubm9kZS5vZmZzZXRXaWR0aCArIHRoaXMuZWxlbWVudC5vZmZzZXRXaWR0aCA8PSBVdGlscy5zY3JlZW5XaWR0aDsgfVxyXG5cclxuICAgIC8qKiBIaWRlcyB0aGUgdG9vbHRpcC4gQXV0b21hdGljYWxseSBjYWxsZWQgb24gbW91c2VsZWF2ZS4gKi9cclxuXHRoaWRlKCkge1xyXG4gICAgICAgIHRoaXMuZWxlbWVudC5yZW1vdmUoKTtcclxuICAgICAgICB0aGlzLnRvb2x0aXBFbGVtZW50LmNsYXNzTmFtZSA9IHRoaXMuX2NsYXNzTmFtZTtcclxuXHR9XHJcblxyXG4gICAgLyoqIFNob3dzIHRoZSB0b29sdGlwLiBBdXRvbWF0aWNhbGx5IGNhbGxlZCBvbiBtb3VzZWVudGVyLiBXaWxsIGF0dGVtcHQgdG8gZmxpcCBpZiBwb3NpdGlvbiB3YXMgd3JvbmcuICovXHJcblx0c2hvdygpIHtcclxuICAgICAgICB0aGlzLnRvb2x0aXBFbGVtZW50LmNsYXNzTmFtZSA9IGAke2dldFRvb2x0aXBDbGFzc2VzKCkudG9vbHRpcH0gJHtnZXRDbGFzcyh0aGlzLnN0eWxlKX1gO1xyXG5cdFx0dGhpcy5sYWJlbEVsZW1lbnQudGV4dENvbnRlbnQgPSB0aGlzLmxhYmVsO1xyXG5cdFx0dGhpcy5jb250YWluZXIuYXBwZW5kKHRoaXMuZWxlbWVudCk7XHJcblxyXG5cdFx0aWYgKHRoaXMuc2lkZSA9PSBcInRvcFwiKSB7XHJcblx0XHRcdGlmICh0aGlzLmNhblNob3dBYm92ZSB8fCAoIXRoaXMuY2FuU2hvd0Fib3ZlICYmIHRoaXMucHJldmVudEZsaXApKSB0aGlzLnNob3dBYm92ZSgpO1xyXG5cdFx0XHRlbHNlIHRoaXMuc2hvd0JlbG93KCk7XHJcblx0XHR9XHJcblxyXG5cdFx0aWYgKHRoaXMuc2lkZSA9PSBcImJvdHRvbVwiKSB7XHJcblx0XHRcdGlmICh0aGlzLmNhblNob3dCZWxvdyB8fCAoIXRoaXMuY2FuU2hvd0JlbG93ICYmIHRoaXMucHJldmVudEZsaXApKSB0aGlzLnNob3dCZWxvdygpO1xyXG5cdFx0XHRlbHNlIHRoaXMuc2hvd0Fib3ZlKCk7XHJcblx0XHR9XHJcblxyXG5cdFx0aWYgKHRoaXMuc2lkZSA9PSBcImxlZnRcIikge1xyXG5cdFx0XHRpZiAodGhpcy5jYW5TaG93TGVmdCB8fCAoIXRoaXMuY2FuU2hvd0xlZnQgJiYgdGhpcy5wcmV2ZW50RmxpcCkpIHRoaXMuc2hvd0xlZnQoKTtcclxuXHRcdFx0ZWxzZSB0aGlzLnNob3dSaWdodCgpO1xyXG5cdFx0fVxyXG5cclxuXHRcdGlmICh0aGlzLnNpZGUgPT0gXCJyaWdodFwiKSB7XHJcblx0XHRcdGlmICh0aGlzLmNhblNob3dSaWdodCB8fCAoIXRoaXMuY2FuU2hvd1JpZ2h0ICYmIHRoaXMucHJldmVudEZsaXApKSB0aGlzLnNob3dSaWdodCgpO1xyXG5cdFx0XHRlbHNlIHRoaXMuc2hvd0xlZnQoKTtcclxuXHRcdH1cclxuXHR9XHJcblxyXG4gICAgLyoqIEZvcmNlIHNob3dpbmcgdGhlIHRvb2x0aXAgYWJvdmUgdGhlIG5vZGUuICovXHJcblx0c2hvd0Fib3ZlKCkge1xyXG5cdFx0dGhpcy50b29sdGlwRWxlbWVudC5jbGFzc0xpc3QuYWRkKGdldENsYXNzKFwidG9wXCIpKTtcclxuXHRcdHRoaXMuZWxlbWVudC5zdHlsZS5zZXRQcm9wZXJ0eShcInRvcFwiLCB0b1B4KHRoaXMubm9kZS5nZXRCb3VuZGluZ0NsaWVudFJlY3QoKS50b3AgLSB0aGlzLmVsZW1lbnQub2Zmc2V0SGVpZ2h0IC0gMTApKTtcclxuXHRcdHRoaXMuY2VudGVySG9yaXpvbnRhbGx5KCk7XHJcblx0fVxyXG5cclxuICAgIC8qKiBGb3JjZSBzaG93aW5nIHRoZSB0b29sdGlwIGJlbG93IHRoZSBub2RlLiAqL1xyXG5cdHNob3dCZWxvdygpIHtcclxuXHRcdHRoaXMudG9vbHRpcEVsZW1lbnQuY2xhc3NMaXN0LmFkZChnZXRDbGFzcyhcImJvdHRvbVwiKSk7XHJcblx0XHR0aGlzLmVsZW1lbnQuc3R5bGUuc2V0UHJvcGVydHkoXCJ0b3BcIiwgdG9QeCh0aGlzLm5vZGUuZ2V0Qm91bmRpbmdDbGllbnRSZWN0KCkudG9wICsgdGhpcy5ub2RlLm9mZnNldEhlaWdodCArIDEwKSk7XHJcblx0XHR0aGlzLmNlbnRlckhvcml6b250YWxseSgpO1xyXG5cdH1cclxuXHJcbiAgICAvKiogRm9yY2Ugc2hvd2luZyB0aGUgdG9vbHRpcCB0byB0aGUgbGVmdCBvZiB0aGUgbm9kZS4gKi9cclxuXHRzaG93TGVmdCgpIHtcclxuXHRcdHRoaXMudG9vbHRpcEVsZW1lbnQuY2xhc3NMaXN0LmFkZChnZXRDbGFzcyhcImxlZnRcIikpO1xyXG5cdFx0dGhpcy5lbGVtZW50LnN0eWxlLnNldFByb3BlcnR5KFwibGVmdFwiLCB0b1B4KHRoaXMubm9kZS5nZXRCb3VuZGluZ0NsaWVudFJlY3QoKS5sZWZ0IC0gdGhpcy5lbGVtZW50Lm9mZnNldFdpZHRoIC0gMTApKTtcclxuXHRcdHRoaXMuY2VudGVyVmVydGljYWxseSgpO1xyXG5cdH1cclxuXHJcbiAgICAvKiogRm9yY2Ugc2hvd2luZyB0aGUgdG9vbHRpcCB0byB0aGUgcmlnaHQgb2YgdGhlIG5vZGUuICovXHJcblx0c2hvd1JpZ2h0KCkge1xyXG5cdFx0dGhpcy50b29sdGlwRWxlbWVudC5jbGFzc0xpc3QuYWRkKGdldENsYXNzKFwicmlnaHRcIikpO1xyXG5cdFx0dGhpcy5lbGVtZW50LnN0eWxlLnNldFByb3BlcnR5KFwibGVmdFwiLCB0b1B4KHRoaXMubm9kZS5nZXRCb3VuZGluZ0NsaWVudFJlY3QoKS5sZWZ0ICsgdGhpcy5ub2RlLm9mZnNldFdpZHRoICsgMTApKTtcclxuXHRcdHRoaXMuY2VudGVyVmVydGljYWxseSgpO1xyXG5cdH1cclxuXHJcblx0Y2VudGVySG9yaXpvbnRhbGx5KCkge1xyXG4gICAgICAgIGNvbnN0IG5vZGVjZW50ZXIgPSB0aGlzLm5vZGUuZ2V0Qm91bmRpbmdDbGllbnRSZWN0KCkubGVmdCArICh0aGlzLm5vZGUub2Zmc2V0V2lkdGggLyAyKTtcclxuICAgICAgICB0aGlzLmVsZW1lbnQuc3R5bGUuc2V0UHJvcGVydHkoXCJsZWZ0XCIsIHRvUHgobm9kZWNlbnRlciAtICh0aGlzLmVsZW1lbnQub2Zmc2V0V2lkdGggLyAyKSkpO1xyXG5cdH1cclxuXHJcblx0Y2VudGVyVmVydGljYWxseSgpIHtcclxuXHRcdGNvbnN0IG5vZGVjZW50ZXIgPSB0aGlzLm5vZGUuZ2V0Qm91bmRpbmdDbGllbnRSZWN0KCkudG9wICsgKHRoaXMubm9kZS5vZmZzZXRIZWlnaHQgLyAyKTtcclxuXHRcdHRoaXMuZWxlbWVudC5zdHlsZS5zZXRQcm9wZXJ0eShcInRvcFwiLCB0b1B4KG5vZGVjZW50ZXIgLSAodGhpcy5lbGVtZW50Lm9mZnNldEhlaWdodCAvIDIpKSk7XHJcblx0fVxyXG59IiwiaW1wb3J0IEJEVjIgZnJvbSBcIi4uL21vZHVsZXMvdjJcIjtcclxuaW1wb3J0IFRvb2x0aXAgZnJvbSBcIi4vdG9vbHRpcFwiO1xyXG5cclxuZXhwb3J0IGRlZmF1bHQgY2xhc3MgZXh0ZW5kcyBCRFYyLnJlYWN0Q29tcG9uZW50IHtcclxuICAgIGNvbnN0cnVjdG9yKHByb3BzKSB7XHJcbiAgICAgICAgc3VwZXIocHJvcHMpO1xyXG4gICAgfVxyXG5cclxuICAgIGFzeW5jIGNvbXBvbmVudERpZE1vdW50KCkge1xyXG4gICAgICAgIGNvbnN0IHtzdHlsZSA9IFwiYmxhY2tcIiwgc2lkZSA9IFwidG9wXCIsIHRleHQgPSBcIlwifSA9IHRoaXMucHJvcHM7XHJcbiAgICAgICAgdGhpcy5ub2RlID0gQkRWMi5yZWFjdERvbS5maW5kRE9NTm9kZSh0aGlzKTtcclxuICAgICAgICB0aGlzLnRvb2x0aXAgPSBuZXcgVG9vbHRpcCh0aGlzLm5vZGUsIHRleHQsIHtzdHlsZSwgc2lkZX0pO1xyXG4gICAgfVxyXG5cclxuICAgIGNvbXBvbmVudFdpbGxVbm1vdW50KCkge1xyXG4gICAgICAgIHRoaXMudG9vbHRpcC5oaWRlKCk7XHJcbiAgICAgICAgZGVsZXRlIHRoaXMudG9vbHRpcDtcclxuICAgIH1cclxuXHJcbiAgICByZW5kZXIoKSB7XHJcbiAgICAgICAgcmV0dXJuIHRoaXMucHJvcHMuY2hpbGRyZW47XHJcbiAgICB9XHJcbn0iLCJpbXBvcnQgQkRWMiBmcm9tIFwiLi4vbW9kdWxlcy92MlwiO1xyXG5cclxuZXhwb3J0IGRlZmF1bHQgY2xhc3MgVjJDX1hTdmcgZXh0ZW5kcyBCRFYyLnJlYWN0Q29tcG9uZW50IHtcclxuICAgIGNvbnN0cnVjdG9yKHByb3BzKSB7XHJcbiAgICAgICAgc3VwZXIocHJvcHMpO1xyXG4gICAgfVxyXG5cclxuICAgIHJlbmRlcigpIHtcclxuICAgICAgICByZXR1cm4gQkRWMi5yZWFjdC5jcmVhdGVFbGVtZW50KFxyXG4gICAgICAgICAgICBcInN2Z1wiLFxyXG4gICAgICAgICAgICB7eG1sbnM6IFwiaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmdcIiwgdmlld0JveDogXCIwIDAgMTIgMTJcIiwgc3R5bGU6IHt3aWR0aDogXCIxOHB4XCIsIGhlaWdodDogXCIxOHB4XCJ9fSxcclxuICAgICAgICAgICAgQkRWMi5yZWFjdC5jcmVhdGVFbGVtZW50KFxyXG4gICAgICAgICAgICAgICAgXCJnXCIsXHJcbiAgICAgICAgICAgICAgICB7Y2xhc3NOYW1lOiBcImJhY2tncm91bmRcIiwgZmlsbDogXCJub25lXCIsIGZpbGxSdWxlOiBcImV2ZW5vZGRcIn0sXHJcbiAgICAgICAgICAgICAgICBCRFYyLnJlYWN0LmNyZWF0ZUVsZW1lbnQoXCJwYXRoXCIsIHtkOiBcIk0wIDBoMTJ2MTJIMFwifSksXHJcbiAgICAgICAgICAgICAgICBCRFYyLnJlYWN0LmNyZWF0ZUVsZW1lbnQoXCJwYXRoXCIsIHtjbGFzc05hbWU6IFwiZmlsbFwiLCBmaWxsOiBcIiNkY2RkZGVcIiwgZDogXCJNOS41IDMuMjA1TDguNzk1IDIuNSA2IDUuMjk1IDMuMjA1IDIuNWwtLjcwNS43MDVMNS4yOTUgNiAyLjUgOC43OTVsLjcwNS43MDVMNiA2LjcwNSA4Ljc5NSA5LjVsLjcwNS0uNzA1TDYuNzA1IDZcIn0pXHJcbiAgICAgICAgICAgIClcclxuICAgICAgICApO1xyXG4gICAgfVxyXG59IiwibW9kdWxlLmV4cG9ydHMgPSByZXF1aXJlKFwiY3J5cHRvXCIpOyIsIm1vZHVsZS5leHBvcnRzID0gcmVxdWlyZShcImVsZWN0cm9uXCIpOyIsIm1vZHVsZS5leHBvcnRzID0gcmVxdWlyZShcImV2ZW50c1wiKTsiLCJtb2R1bGUuZXhwb3J0cyA9IHJlcXVpcmUoXCJmc1wiKTsiLCJtb2R1bGUuZXhwb3J0cyA9IHJlcXVpcmUoXCJta2RpcnBcIik7IiwibW9kdWxlLmV4cG9ydHMgPSByZXF1aXJlKFwibW9kdWxlXCIpOyIsIm1vZHVsZS5leHBvcnRzID0gcmVxdWlyZShcIm5vZGUtZmV0Y2hcIik7IiwibW9kdWxlLmV4cG9ydHMgPSByZXF1aXJlKFwicGF0aFwiKTsiLCJtb2R1bGUuZXhwb3J0cyA9IHJlcXVpcmUoXCJyZXF1ZXN0XCIpOyIsIm1vZHVsZS5leHBvcnRzID0gcmVxdWlyZShcInJpbXJhZlwiKTsiLCJtb2R1bGUuZXhwb3J0cyA9IHJlcXVpcmUoXCJ5YXV6bFwiKTsiXSwic291cmNlUm9vdCI6IiJ9